4 * Copyright (C) International Business Machines Corp., 2002,2010
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/stat.h>
23 #include <linux/slab.h>
24 #include <linux/pagemap.h>
25 #include <linux/freezer.h>
26 #include <linux/sched/signal.h>
27 #include <linux/wait_bit.h>
29 #include <asm/div64.h>
33 #include "cifsproto.h"
34 #include "cifs_debug.h"
35 #include "cifs_fs_sb.h"
36 #include "cifs_unicode.h"
40 static void cifs_set_ops(struct inode *inode)
42 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
44 switch (inode->i_mode & S_IFMT) {
46 inode->i_op = &cifs_file_inode_ops;
47 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
48 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
49 inode->i_fop = &cifs_file_direct_nobrl_ops;
51 inode->i_fop = &cifs_file_direct_ops;
52 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
53 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
54 inode->i_fop = &cifs_file_strict_nobrl_ops;
56 inode->i_fop = &cifs_file_strict_ops;
57 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
58 inode->i_fop = &cifs_file_nobrl_ops;
59 else { /* not direct, send byte range locks */
60 inode->i_fop = &cifs_file_ops;
63 /* check if server can support readpages */
64 if (cifs_sb_master_tcon(cifs_sb)->ses->server->maxBuf <
65 PAGE_SIZE + MAX_CIFS_HDR_SIZE)
66 inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
68 inode->i_data.a_ops = &cifs_addr_ops;
71 #ifdef CONFIG_CIFS_DFS_UPCALL
72 if (IS_AUTOMOUNT(inode)) {
73 inode->i_op = &cifs_dfs_referral_inode_operations;
75 #else /* NO DFS support, treat as a directory */
78 inode->i_op = &cifs_dir_inode_ops;
79 inode->i_fop = &cifs_dir_ops;
83 inode->i_op = &cifs_symlink_inode_ops;
86 init_special_inode(inode, inode->i_mode, inode->i_rdev);
91 /* check inode attributes against fattr. If they don't match, tag the
92 * inode for cache invalidation
95 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
97 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
99 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
100 __func__, cifs_i->uniqueid);
102 if (inode->i_state & I_NEW) {
103 cifs_dbg(FYI, "%s: inode %llu is new\n",
104 __func__, cifs_i->uniqueid);
108 /* don't bother with revalidation if we have an oplock */
109 if (CIFS_CACHE_READ(cifs_i)) {
110 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
111 __func__, cifs_i->uniqueid);
115 /* revalidate if mtime or size have changed */
116 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
117 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
118 cifs_i->server_eof == fattr->cf_eof) {
119 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
120 __func__, cifs_i->uniqueid);
124 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
125 __func__, cifs_i->uniqueid);
126 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
130 * copy nlink to the inode, unless it wasn't provided. Provide
131 * sane values if we don't have an existing one and none was provided
134 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
137 * if we're in a situation where we can't trust what we
138 * got from the server (readdir, some non-unix cases)
139 * fake reasonable values
141 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
142 /* only provide fake values on a new inode */
143 if (inode->i_state & I_NEW) {
144 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
152 /* we trust the server, so update it */
153 set_nlink(inode, fattr->cf_nlink);
156 /* populate an inode with info from a cifs_fattr struct */
158 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
160 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
161 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
163 cifs_revalidate_cache(inode, fattr);
165 spin_lock(&inode->i_lock);
166 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
167 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
168 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
169 /* we do not want atime to be less than mtime, it broke some apps */
170 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
171 inode->i_atime = fattr->cf_mtime;
173 inode->i_atime = fattr->cf_atime;
174 inode->i_mtime = fattr->cf_mtime;
175 inode->i_ctime = fattr->cf_ctime;
176 inode->i_rdev = fattr->cf_rdev;
177 cifs_nlink_fattr_to_inode(inode, fattr);
178 inode->i_uid = fattr->cf_uid;
179 inode->i_gid = fattr->cf_gid;
181 /* if dynperm is set, don't clobber existing mode */
182 if (inode->i_state & I_NEW ||
183 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
184 inode->i_mode = fattr->cf_mode;
186 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
188 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
191 cifs_i->time = jiffies;
193 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
194 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
196 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
198 cifs_i->server_eof = fattr->cf_eof;
200 * Can't safely change the file size here if the client is writing to
201 * it due to potential races.
203 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
204 i_size_write(inode, fattr->cf_eof);
207 * i_blocks is not related to (i_size / i_blksize),
208 * but instead 512 byte (2**9) size is required for
209 * calculating num blocks.
211 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
213 spin_unlock(&inode->i_lock);
215 if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
216 inode->i_flags |= S_AUTOMOUNT;
217 if (inode->i_state & I_NEW)
222 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
224 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
226 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
229 fattr->cf_uniqueid = iunique(sb, ROOT_I);
232 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
234 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
235 struct cifs_sb_info *cifs_sb)
237 memset(fattr, 0, sizeof(*fattr));
238 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
239 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
240 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
242 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
243 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
244 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
245 /* old POSIX extensions don't get create time */
247 fattr->cf_mode = le64_to_cpu(info->Permissions);
250 * Since we set the inode type below we need to mask off
251 * to avoid strange results if bits set above.
253 fattr->cf_mode &= ~S_IFMT;
254 switch (le32_to_cpu(info->Type)) {
256 fattr->cf_mode |= S_IFREG;
257 fattr->cf_dtype = DT_REG;
260 fattr->cf_mode |= S_IFLNK;
261 fattr->cf_dtype = DT_LNK;
264 fattr->cf_mode |= S_IFDIR;
265 fattr->cf_dtype = DT_DIR;
268 fattr->cf_mode |= S_IFCHR;
269 fattr->cf_dtype = DT_CHR;
270 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
271 le64_to_cpu(info->DevMinor) & MINORMASK);
274 fattr->cf_mode |= S_IFBLK;
275 fattr->cf_dtype = DT_BLK;
276 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
277 le64_to_cpu(info->DevMinor) & MINORMASK);
280 fattr->cf_mode |= S_IFIFO;
281 fattr->cf_dtype = DT_FIFO;
284 fattr->cf_mode |= S_IFSOCK;
285 fattr->cf_dtype = DT_SOCK;
288 /* safest to call it a file if we do not know */
289 fattr->cf_mode |= S_IFREG;
290 fattr->cf_dtype = DT_REG;
291 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
295 fattr->cf_uid = cifs_sb->mnt_uid;
296 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
297 u64 id = le64_to_cpu(info->Uid);
298 if (id < ((uid_t)-1)) {
299 kuid_t uid = make_kuid(&init_user_ns, id);
305 fattr->cf_gid = cifs_sb->mnt_gid;
306 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
307 u64 id = le64_to_cpu(info->Gid);
308 if (id < ((gid_t)-1)) {
309 kgid_t gid = make_kgid(&init_user_ns, id);
315 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
319 * Fill a cifs_fattr struct with fake inode info.
321 * Needed to setup cifs_fattr data for the directory which is the
322 * junction to the new submount (ie to setup the fake directory
323 * which represents a DFS referral).
326 cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
328 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
330 cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
332 memset(fattr, 0, sizeof(*fattr));
333 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
334 fattr->cf_uid = cifs_sb->mnt_uid;
335 fattr->cf_gid = cifs_sb->mnt_gid;
336 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
337 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
339 fattr->cf_flags = CIFS_FATTR_DFS_REFERRAL;
343 cifs_get_file_info_unix(struct file *filp)
347 FILE_UNIX_BASIC_INFO find_data;
348 struct cifs_fattr fattr;
349 struct inode *inode = file_inode(filp);
350 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
351 struct cifsFileInfo *cfile = filp->private_data;
352 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
355 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
357 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
358 } else if (rc == -EREMOTE) {
359 cifs_create_dfs_fattr(&fattr, inode->i_sb);
363 cifs_fattr_to_inode(inode, &fattr);
368 int cifs_get_inode_info_unix(struct inode **pinode,
369 const unsigned char *full_path,
370 struct super_block *sb, unsigned int xid)
373 FILE_UNIX_BASIC_INFO find_data;
374 struct cifs_fattr fattr;
375 struct cifs_tcon *tcon;
376 struct tcon_link *tlink;
377 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
379 cifs_dbg(FYI, "Getting info on %s\n", full_path);
381 tlink = cifs_sb_tlink(cifs_sb);
383 return PTR_ERR(tlink);
384 tcon = tlink_tcon(tlink);
386 /* could have done a find first instead but this returns more info */
387 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
388 cifs_sb->local_nls, cifs_remap(cifs_sb));
389 cifs_put_tlink(tlink);
392 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
393 } else if (rc == -EREMOTE) {
394 cifs_create_dfs_fattr(&fattr, sb);
400 /* check for Minshall+French symlinks */
401 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
402 int tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
405 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
408 if (*pinode == NULL) {
410 cifs_fill_uniqueid(sb, &fattr);
411 *pinode = cifs_iget(sb, &fattr);
415 /* we already have inode, update it */
417 /* if uniqueid is different, return error */
418 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
419 CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
420 CIFS_I(*pinode)->time = 0; /* force reval */
425 /* if filetype is different, return error */
426 if (unlikely(((*pinode)->i_mode & S_IFMT) !=
427 (fattr.cf_mode & S_IFMT))) {
428 CIFS_I(*pinode)->time = 0; /* force reval */
433 cifs_fattr_to_inode(*pinode, &fattr);
441 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
442 struct cifs_sb_info *cifs_sb, unsigned int xid)
446 struct tcon_link *tlink;
447 struct cifs_tcon *tcon;
449 struct cifs_open_parms oparms;
450 struct cifs_io_parms io_parms;
452 unsigned int bytes_read;
454 int buf_type = CIFS_NO_BUFFER;
458 fattr->cf_mode &= ~S_IFMT;
460 if (fattr->cf_eof == 0) {
461 fattr->cf_mode |= S_IFIFO;
462 fattr->cf_dtype = DT_FIFO;
464 } else if (fattr->cf_eof < 8) {
465 fattr->cf_mode |= S_IFREG;
466 fattr->cf_dtype = DT_REG;
467 return -EINVAL; /* EOPNOTSUPP? */
470 tlink = cifs_sb_tlink(cifs_sb);
472 return PTR_ERR(tlink);
473 tcon = tlink_tcon(tlink);
476 oparms.cifs_sb = cifs_sb;
477 oparms.desired_access = GENERIC_READ;
478 oparms.create_options = CREATE_NOT_DIR;
479 if (backup_cred(cifs_sb))
480 oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
481 oparms.disposition = FILE_OPEN;
484 oparms.reconnect = false;
486 if (tcon->ses->server->oplocks)
490 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
492 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
493 cifs_put_tlink(tlink);
498 io_parms.netfid = fid.netfid;
499 io_parms.pid = current->tgid;
500 io_parms.tcon = tcon;
502 io_parms.length = 24;
504 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
505 &bytes_read, &pbuf, &buf_type);
506 if ((rc == 0) && (bytes_read >= 8)) {
507 if (memcmp("IntxBLK", pbuf, 8) == 0) {
508 cifs_dbg(FYI, "Block device\n");
509 fattr->cf_mode |= S_IFBLK;
510 fattr->cf_dtype = DT_BLK;
511 if (bytes_read == 24) {
512 /* we have enough to decode dev num */
513 __u64 mjr; /* major */
514 __u64 mnr; /* minor */
515 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
516 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
517 fattr->cf_rdev = MKDEV(mjr, mnr);
519 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
520 cifs_dbg(FYI, "Char device\n");
521 fattr->cf_mode |= S_IFCHR;
522 fattr->cf_dtype = DT_CHR;
523 if (bytes_read == 24) {
524 /* we have enough to decode dev num */
525 __u64 mjr; /* major */
526 __u64 mnr; /* minor */
527 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
528 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
529 fattr->cf_rdev = MKDEV(mjr, mnr);
531 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
532 cifs_dbg(FYI, "Symlink\n");
533 fattr->cf_mode |= S_IFLNK;
534 fattr->cf_dtype = DT_LNK;
536 fattr->cf_mode |= S_IFREG; /* file? */
537 fattr->cf_dtype = DT_REG;
541 fattr->cf_mode |= S_IFREG; /* then it is a file */
542 fattr->cf_dtype = DT_REG;
543 rc = -EOPNOTSUPP; /* or some unknown SFU type */
546 tcon->ses->server->ops->close(xid, tcon, &fid);
547 cifs_put_tlink(tlink);
551 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
554 * Fetch mode bits as provided by SFU.
556 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
558 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
559 struct cifs_sb_info *cifs_sb, unsigned int xid)
561 #ifdef CONFIG_CIFS_XATTR
565 struct tcon_link *tlink;
566 struct cifs_tcon *tcon;
568 tlink = cifs_sb_tlink(cifs_sb);
570 return PTR_ERR(tlink);
571 tcon = tlink_tcon(tlink);
573 if (tcon->ses->server->ops->query_all_EAs == NULL) {
574 cifs_put_tlink(tlink);
578 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
579 "SETFILEBITS", ea_value, 4 /* size of buf */,
581 cifs_put_tlink(tlink);
585 mode = le32_to_cpu(*((__le32 *)ea_value));
586 fattr->cf_mode &= ~SFBITS_MASK;
587 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
588 mode, fattr->cf_mode);
589 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
590 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
599 /* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
601 cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
602 struct super_block *sb, bool adjust_tz,
605 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
606 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
608 memset(fattr, 0, sizeof(*fattr));
609 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
610 if (info->DeletePending)
611 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
613 if (info->LastAccessTime)
614 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
616 ktime_get_coarse_real_ts64(&fattr->cf_atime);
618 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
619 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
622 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
623 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
626 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
627 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
628 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
630 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
633 fattr->cf_mode = S_IFLNK;
634 fattr->cf_dtype = DT_LNK;
635 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
636 fattr->cf_mode = S_IFDIR | cifs_sb->mnt_dir_mode;
637 fattr->cf_dtype = DT_DIR;
639 * Server can return wrong NumberOfLinks value for directories
640 * when Unix extensions are disabled - fake it.
643 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
645 fattr->cf_mode = S_IFREG | cifs_sb->mnt_file_mode;
646 fattr->cf_dtype = DT_REG;
648 /* clear write bits if ATTR_READONLY is set */
649 if (fattr->cf_cifsattrs & ATTR_READONLY)
650 fattr->cf_mode &= ~(S_IWUGO);
653 * Don't accept zero nlink from non-unix servers unless
654 * delete is pending. Instead mark it as unknown.
656 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
657 !info->DeletePending) {
658 cifs_dbg(1, "bogus file nlink value %u\n",
660 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
664 fattr->cf_uid = cifs_sb->mnt_uid;
665 fattr->cf_gid = cifs_sb->mnt_gid;
669 cifs_get_file_info(struct file *filp)
673 FILE_ALL_INFO find_data;
674 struct cifs_fattr fattr;
675 struct inode *inode = file_inode(filp);
676 struct cifsFileInfo *cfile = filp->private_data;
677 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
678 struct TCP_Server_Info *server = tcon->ses->server;
680 if (!server->ops->query_file_info)
684 rc = server->ops->query_file_info(xid, tcon, &cfile->fid, &find_data);
687 cifs_all_info_to_fattr(&fattr, &find_data, inode->i_sb, false,
691 cifs_create_dfs_fattr(&fattr, inode->i_sb);
697 * FIXME: legacy server -- fall back to path-based call?
698 * for now, just skip revalidating and mark inode for
702 CIFS_I(inode)->time = 0;
708 * don't bother with SFU junk here -- just mark inode as needing
711 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
712 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
713 cifs_fattr_to_inode(inode, &fattr);
719 /* Simple function to return a 64 bit hash of string. Rarely called */
720 static __u64 simple_hashstr(const char *str)
722 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
726 hash = (hash + (__u64) *str++) * hash_mult;
732 * cifs_backup_query_path_info - SMB1 fallback code to get ino
734 * Fallback code to get file metadata when we don't have access to
735 * @full_path (EACCESS) and have backup creds.
737 * @data will be set to search info result buffer
738 * @resp_buf will be set to cifs resp buf and needs to be freed with
739 * cifs_buf_release() when done with @data.
742 cifs_backup_query_path_info(int xid,
743 struct cifs_tcon *tcon,
744 struct super_block *sb,
745 const char *full_path,
747 FILE_ALL_INFO **data)
749 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
750 struct cifs_search_info info = {0};
755 info.endOfSearch = false;
757 info.info_level = SMB_FIND_FILE_UNIX;
758 else if ((tcon->ses->capabilities &
759 tcon->ses->server->vals->cap_nt_find) == 0)
760 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
761 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
762 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
763 else /* no srvino useful for fallback to some netapp */
764 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
766 flags = CIFS_SEARCH_CLOSE_ALWAYS |
767 CIFS_SEARCH_CLOSE_AT_END |
768 CIFS_SEARCH_BACKUP_SEARCH;
770 rc = CIFSFindFirst(xid, tcon, full_path,
771 cifs_sb, NULL, flags, &info, false);
775 *resp_buf = (void *)info.ntwrk_buf_start;
776 *data = (FILE_ALL_INFO *)info.srch_entries_start;
781 cifs_set_fattr_ino(int xid,
782 struct cifs_tcon *tcon,
783 struct super_block *sb,
784 struct inode **inode,
785 const char *full_path,
787 struct cifs_fattr *fattr)
789 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
790 struct TCP_Server_Info *server = tcon->ses->server;
793 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
795 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
797 fattr->cf_uniqueid = iunique(sb, ROOT_I);
802 * If we have an inode pass a NULL tcon to ensure we don't
803 * make a round trip to the server. This only works for SMB2+.
805 rc = server->ops->get_srv_inum(xid,
806 *inode ? NULL : tcon,
812 * If that fails reuse existing ino or generate one
813 * and disable server ones
816 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
818 fattr->cf_uniqueid = iunique(sb, ROOT_I);
819 cifs_autodisable_serverino(cifs_sb);
824 /* If no errors, check for zero root inode (invalid) */
825 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
826 cifs_dbg(FYI, "Invalid (0) inodenum\n");
829 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
831 /* make an ino by hashing the UNC */
832 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
833 fattr->cf_uniqueid = simple_hashstr(tcon->treeName);
838 static inline bool is_inode_cache_good(struct inode *ino)
840 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
844 cifs_get_inode_info(struct inode **inode,
845 const char *full_path,
846 FILE_ALL_INFO *in_data,
847 struct super_block *sb, int xid,
848 const struct cifs_fid *fid)
851 struct cifs_tcon *tcon;
852 struct TCP_Server_Info *server;
853 struct tcon_link *tlink;
854 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
855 bool adjust_tz = false;
856 struct cifs_fattr fattr = {0};
857 bool symlink = false;
858 FILE_ALL_INFO *data = in_data;
859 FILE_ALL_INFO *tmp_data = NULL;
860 void *smb1_backup_rsp_buf = NULL;
864 tlink = cifs_sb_tlink(cifs_sb);
866 return PTR_ERR(tlink);
867 tcon = tlink_tcon(tlink);
868 server = tcon->ses->server;
871 * 1. Fetch file metadata if not provided (data)
875 if (is_inode_cache_good(*inode)) {
876 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
879 tmp_data = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
884 rc = server->ops->query_path_info(xid, tcon, cifs_sb,
886 &adjust_tz, &symlink);
891 * 2. Convert it to internal cifs metadata (fattr)
896 cifs_all_info_to_fattr(&fattr, data, sb, adjust_tz, symlink);
899 /* DFS link, no metadata available on this server */
900 cifs_create_dfs_fattr(&fattr, sb);
905 * perm errors, try again with backup flags if possible
907 * For SMB2 and later the backup intent flag
908 * is already sent if needed on open and there
909 * is no path based FindFirst operation to use
912 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
913 /* for easier reading */
914 FILE_DIRECTORY_INFO *fdi;
915 SEARCH_ID_FULL_DIR_INFO *si;
917 rc = cifs_backup_query_path_info(xid, tcon, sb,
919 &smb1_backup_rsp_buf,
924 fdi = (FILE_DIRECTORY_INFO *)data;
925 si = (SEARCH_ID_FULL_DIR_INFO *)data;
927 cifs_dir_info_to_fattr(&fattr, fdi, cifs_sb);
928 fattr.cf_uniqueid = le64_to_cpu(si->UniqueId);
929 /* uniqueid set, skip get inum step */
932 /* nothing we can do, bail out */
937 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
942 * 3. Get or update inode number (fattr.cf_uniqueid)
945 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, &fattr);
948 * 4. Tweak fattr based on mount options
952 /* query for SFU type info if supported and needed */
953 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
954 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
955 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
957 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
960 /* fill in 0777 bits from ACL */
961 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
962 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, true,
965 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
969 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
970 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, false,
973 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
979 /* fill in remaining high mode bits e.g. SUID, VTX */
980 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
981 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
983 /* check for Minshall+French symlinks */
984 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
985 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
988 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
992 * 5. Update inode with final fattr data
996 *inode = cifs_iget(sb, &fattr);
1000 /* we already have inode, update it */
1002 /* if uniqueid is different, return error */
1003 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1004 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1005 CIFS_I(*inode)->time = 0; /* force reval */
1010 /* if filetype is different, return error */
1011 if (unlikely(((*inode)->i_mode & S_IFMT) !=
1012 (fattr.cf_mode & S_IFMT))) {
1013 CIFS_I(*inode)->time = 0; /* force reval */
1018 cifs_fattr_to_inode(*inode, &fattr);
1021 cifs_buf_release(smb1_backup_rsp_buf);
1022 cifs_put_tlink(tlink);
1027 static const struct inode_operations cifs_ipc_inode_ops = {
1028 .lookup = cifs_lookup,
1032 cifs_find_inode(struct inode *inode, void *opaque)
1034 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1036 /* don't match inode with different uniqueid */
1037 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1040 /* use createtime like an i_generation field */
1041 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1044 /* don't match inode of different type */
1045 if ((inode->i_mode & S_IFMT) != (fattr->cf_mode & S_IFMT))
1048 /* if it's not a directory or has no dentries, then flag it */
1049 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1050 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1056 cifs_init_inode(struct inode *inode, void *opaque)
1058 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1060 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1061 CIFS_I(inode)->createtime = fattr->cf_createtime;
1066 * walk dentry list for an inode and report whether it has aliases that
1067 * are hashed. We use this to determine if a directory inode can actually
1071 inode_has_hashed_dentries(struct inode *inode)
1073 struct dentry *dentry;
1075 spin_lock(&inode->i_lock);
1076 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1077 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1078 spin_unlock(&inode->i_lock);
1082 spin_unlock(&inode->i_lock);
1086 /* Given fattrs, get a corresponding inode */
1088 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1091 struct inode *inode;
1094 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1096 /* hash down to 32-bits on 32-bit arch */
1097 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1099 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1101 /* was there a potentially problematic inode collision? */
1102 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1103 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1105 if (inode_has_hashed_dentries(inode)) {
1106 cifs_autodisable_serverino(CIFS_SB(sb));
1108 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1109 goto retry_iget5_locked;
1113 cifs_fattr_to_inode(inode, fattr);
1114 if (sb->s_flags & SB_NOATIME)
1115 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1116 if (inode->i_state & I_NEW) {
1117 inode->i_ino = hash;
1118 #ifdef CONFIG_CIFS_FSCACHE
1119 /* initialize per-inode cache cookie pointer */
1120 CIFS_I(inode)->fscache = NULL;
1122 unlock_new_inode(inode);
1129 /* gets root inode */
1130 struct inode *cifs_root_iget(struct super_block *sb)
1133 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1134 struct inode *inode = NULL;
1136 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1140 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1141 && cifs_sb->prepath) {
1142 len = strlen(cifs_sb->prepath);
1143 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1145 return ERR_PTR(-ENOMEM);
1147 memcpy(path+1, cifs_sb->prepath, len);
1149 path = kstrdup("", GFP_KERNEL);
1151 return ERR_PTR(-ENOMEM);
1155 if (tcon->unix_ext) {
1156 rc = cifs_get_inode_info_unix(&inode, path, sb, xid);
1157 /* some servers mistakenly claim POSIX support */
1158 if (rc != -EOPNOTSUPP)
1160 cifs_dbg(VFS, "server does not support POSIX extensions");
1161 tcon->unix_ext = false;
1164 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1165 rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL);
1169 inode = ERR_PTR(rc);
1173 #ifdef CONFIG_CIFS_FSCACHE
1174 /* populate tcon->resource_id */
1175 tcon->resource_id = CIFS_I(inode)->uniqueid;
1178 if (rc && tcon->pipe) {
1179 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1180 spin_lock(&inode->i_lock);
1181 inode->i_mode |= S_IFDIR;
1182 set_nlink(inode, 2);
1183 inode->i_op = &cifs_ipc_inode_ops;
1184 inode->i_fop = &simple_dir_operations;
1185 inode->i_uid = cifs_sb->mnt_uid;
1186 inode->i_gid = cifs_sb->mnt_gid;
1187 spin_unlock(&inode->i_lock);
1190 inode = ERR_PTR(rc);
1200 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1201 char *full_path, __u32 dosattr)
1203 bool set_time = false;
1204 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1205 struct TCP_Server_Info *server;
1206 FILE_BASIC_INFO info_buf;
1211 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1212 if (!server->ops->set_file_info)
1217 if (attrs->ia_valid & ATTR_ATIME) {
1219 info_buf.LastAccessTime =
1220 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1222 info_buf.LastAccessTime = 0;
1224 if (attrs->ia_valid & ATTR_MTIME) {
1226 info_buf.LastWriteTime =
1227 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1229 info_buf.LastWriteTime = 0;
1232 * Samba throws this field away, but windows may actually use it.
1233 * Do not set ctime unless other time stamps are changed explicitly
1234 * (i.e. by utimes()) since we would then have a mix of client and
1237 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1238 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1239 info_buf.ChangeTime =
1240 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1242 info_buf.ChangeTime = 0;
1244 info_buf.CreationTime = 0; /* don't change */
1245 info_buf.Attributes = cpu_to_le32(dosattr);
1247 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1251 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1252 * and rename it to a random name that hopefully won't conflict with
1256 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1257 const unsigned int xid)
1261 struct cifs_fid fid;
1262 struct cifs_open_parms oparms;
1263 struct inode *inode = d_inode(dentry);
1264 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1265 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1266 struct tcon_link *tlink;
1267 struct cifs_tcon *tcon;
1268 __u32 dosattr, origattr;
1269 FILE_BASIC_INFO *info_buf = NULL;
1271 tlink = cifs_sb_tlink(cifs_sb);
1273 return PTR_ERR(tlink);
1274 tcon = tlink_tcon(tlink);
1277 * We cannot rename the file if the server doesn't support
1278 * CAP_INFOLEVEL_PASSTHRU
1280 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1286 oparms.cifs_sb = cifs_sb;
1287 oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
1288 oparms.create_options = CREATE_NOT_DIR;
1289 oparms.disposition = FILE_OPEN;
1290 oparms.path = full_path;
1292 oparms.reconnect = false;
1294 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1298 origattr = cifsInode->cifsAttrs;
1300 origattr |= ATTR_NORMAL;
1302 dosattr = origattr & ~ATTR_READONLY;
1304 dosattr |= ATTR_NORMAL;
1305 dosattr |= ATTR_HIDDEN;
1307 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1308 if (dosattr != origattr) {
1309 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1310 if (info_buf == NULL) {
1314 info_buf->Attributes = cpu_to_le32(dosattr);
1315 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1317 /* although we would like to mark the file hidden
1318 if that fails we will still try to rename it */
1320 cifsInode->cifsAttrs = dosattr;
1322 dosattr = origattr; /* since not able to change them */
1325 /* rename the file */
1326 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1328 cifs_remap(cifs_sb));
1334 /* try to set DELETE_ON_CLOSE */
1335 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1336 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1339 * some samba versions return -ENOENT when we try to set the
1340 * file disposition here. Likely a samba bug, but work around
1341 * it for now. This means that some cifsXXX files may hang
1342 * around after they shouldn't.
1344 * BB: remove this hack after more servers have the fix
1352 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1356 CIFSSMBClose(xid, tcon, fid.netfid);
1359 cifs_put_tlink(tlink);
1363 * reset everything back to the original state. Don't bother
1364 * dealing with errors here since we can't do anything about
1368 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1369 cifs_sb->local_nls, cifs_remap(cifs_sb));
1371 if (dosattr != origattr) {
1372 info_buf->Attributes = cpu_to_le32(origattr);
1373 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1375 cifsInode->cifsAttrs = origattr;
1381 /* copied from fs/nfs/dir.c with small changes */
1383 cifs_drop_nlink(struct inode *inode)
1385 spin_lock(&inode->i_lock);
1386 if (inode->i_nlink > 0)
1388 spin_unlock(&inode->i_lock);
1392 * If d_inode(dentry) is null (usually meaning the cached dentry
1393 * is a negative dentry) then we would attempt a standard SMB delete, but
1394 * if that fails we can not attempt the fall back mechanisms on EACCES
1395 * but will return the EACCES to the caller. Note that the VFS does not call
1396 * unlink on negative dentries currently.
1398 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1402 char *full_path = NULL;
1403 struct inode *inode = d_inode(dentry);
1404 struct cifsInodeInfo *cifs_inode;
1405 struct super_block *sb = dir->i_sb;
1406 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1407 struct tcon_link *tlink;
1408 struct cifs_tcon *tcon;
1409 struct TCP_Server_Info *server;
1410 struct iattr *attrs = NULL;
1411 __u32 dosattr = 0, origattr = 0;
1413 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1415 tlink = cifs_sb_tlink(cifs_sb);
1417 return PTR_ERR(tlink);
1418 tcon = tlink_tcon(tlink);
1419 server = tcon->ses->server;
1423 /* Unlink can be called from rename so we can not take the
1424 * sb->s_vfs_rename_mutex here */
1425 full_path = build_path_from_dentry(dentry);
1426 if (full_path == NULL) {
1431 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1432 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1433 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1434 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1435 cifs_remap(cifs_sb));
1436 cifs_dbg(FYI, "posix del rc %d\n", rc);
1437 if ((rc == 0) || (rc == -ENOENT))
1438 goto psx_del_no_retry;
1442 if (!server->ops->unlink) {
1444 goto psx_del_no_retry;
1447 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1452 cifs_drop_nlink(inode);
1453 } else if (rc == -ENOENT) {
1455 } else if (rc == -EBUSY) {
1456 if (server->ops->rename_pending_delete) {
1457 rc = server->ops->rename_pending_delete(full_path,
1460 cifs_drop_nlink(inode);
1462 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1463 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1464 if (attrs == NULL) {
1469 /* try to reset dos attributes */
1470 cifs_inode = CIFS_I(inode);
1471 origattr = cifs_inode->cifsAttrs;
1473 origattr |= ATTR_NORMAL;
1474 dosattr = origattr & ~ATTR_READONLY;
1476 dosattr |= ATTR_NORMAL;
1477 dosattr |= ATTR_HIDDEN;
1479 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1483 goto retry_std_delete;
1486 /* undo the setattr if we errored out and it's needed */
1487 if (rc != 0 && dosattr != 0)
1488 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1492 cifs_inode = CIFS_I(inode);
1493 cifs_inode->time = 0; /* will force revalidate to get info
1495 inode->i_ctime = current_time(inode);
1497 dir->i_ctime = dir->i_mtime = current_time(dir);
1498 cifs_inode = CIFS_I(dir);
1499 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1504 cifs_put_tlink(tlink);
1509 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1510 const char *full_path, struct cifs_sb_info *cifs_sb,
1511 struct cifs_tcon *tcon, const unsigned int xid)
1514 struct inode *inode = NULL;
1517 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1520 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1527 * setting nlink not necessary except in cases where we failed to get it
1528 * from the server or was set bogus. Also, since this is a brand new
1529 * inode, no need to grab the i_lock before setting the i_nlink.
1531 if (inode->i_nlink < 2)
1532 set_nlink(inode, 2);
1533 mode &= ~current_umask();
1534 /* must turn on setgid bit if parent dir has it */
1535 if (parent->i_mode & S_ISGID)
1538 if (tcon->unix_ext) {
1539 struct cifs_unix_set_info_args args = {
1541 .ctime = NO_CHANGE_64,
1542 .atime = NO_CHANGE_64,
1543 .mtime = NO_CHANGE_64,
1546 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1547 args.uid = current_fsuid();
1548 if (parent->i_mode & S_ISGID)
1549 args.gid = parent->i_gid;
1551 args.gid = current_fsgid();
1553 args.uid = INVALID_UID; /* no change */
1554 args.gid = INVALID_GID; /* no change */
1556 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1558 cifs_remap(cifs_sb));
1560 struct TCP_Server_Info *server = tcon->ses->server;
1561 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1562 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1563 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1565 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1566 inode->i_mode = (mode | S_IFDIR);
1568 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1569 inode->i_uid = current_fsuid();
1570 if (inode->i_mode & S_ISGID)
1571 inode->i_gid = parent->i_gid;
1573 inode->i_gid = current_fsgid();
1576 d_instantiate(dentry, inode);
1581 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1582 const char *full_path, struct cifs_sb_info *cifs_sb,
1583 struct cifs_tcon *tcon, const unsigned int xid)
1587 FILE_UNIX_BASIC_INFO *info = NULL;
1588 struct inode *newinode = NULL;
1589 struct cifs_fattr fattr;
1591 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1594 goto posix_mkdir_out;
1597 mode &= ~current_umask();
1598 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1599 NULL /* netfid */, info, &oplock, full_path,
1600 cifs_sb->local_nls, cifs_remap(cifs_sb));
1601 if (rc == -EOPNOTSUPP)
1602 goto posix_mkdir_out;
1604 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1606 goto posix_mkdir_out;
1609 if (info->Type == cpu_to_le32(-1))
1610 /* no return info, go query for it */
1611 goto posix_mkdir_get_info;
1613 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1614 * need to set uid/gid.
1617 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1618 cifs_fill_uniqueid(inode->i_sb, &fattr);
1619 newinode = cifs_iget(inode->i_sb, &fattr);
1621 goto posix_mkdir_get_info;
1623 d_instantiate(dentry, newinode);
1625 #ifdef CONFIG_CIFS_DEBUG2
1626 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1627 dentry, dentry, newinode);
1629 if (newinode->i_nlink != 2)
1630 cifs_dbg(FYI, "unexpected number of links %d\n",
1637 posix_mkdir_get_info:
1638 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1640 goto posix_mkdir_out;
1643 int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode)
1647 struct cifs_sb_info *cifs_sb;
1648 struct tcon_link *tlink;
1649 struct cifs_tcon *tcon;
1650 struct TCP_Server_Info *server;
1653 cifs_dbg(FYI, "In cifs_mkdir, mode = 0x%hx inode = 0x%p\n",
1656 cifs_sb = CIFS_SB(inode->i_sb);
1657 tlink = cifs_sb_tlink(cifs_sb);
1659 return PTR_ERR(tlink);
1660 tcon = tlink_tcon(tlink);
1664 full_path = build_path_from_dentry(direntry);
1665 if (full_path == NULL) {
1670 server = tcon->ses->server;
1672 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
1673 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
1675 d_drop(direntry); /* for time being always refresh inode info */
1679 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1680 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1681 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1683 if (rc != -EOPNOTSUPP)
1687 if (!server->ops->mkdir) {
1692 /* BB add setting the equivalent of mode via CreateX w/ACLs */
1693 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
1695 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1700 /* TODO: skip this for smb2/smb3 */
1701 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1705 * Force revalidate to get parent dir info when needed since cached
1706 * attributes are invalid now.
1708 CIFS_I(inode)->time = 0;
1711 cifs_put_tlink(tlink);
1715 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1719 struct cifs_sb_info *cifs_sb;
1720 struct tcon_link *tlink;
1721 struct cifs_tcon *tcon;
1722 struct TCP_Server_Info *server;
1723 char *full_path = NULL;
1724 struct cifsInodeInfo *cifsInode;
1726 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
1730 full_path = build_path_from_dentry(direntry);
1731 if (full_path == NULL) {
1736 cifs_sb = CIFS_SB(inode->i_sb);
1737 tlink = cifs_sb_tlink(cifs_sb);
1738 if (IS_ERR(tlink)) {
1739 rc = PTR_ERR(tlink);
1742 tcon = tlink_tcon(tlink);
1743 server = tcon->ses->server;
1745 if (!server->ops->rmdir) {
1747 cifs_put_tlink(tlink);
1751 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
1752 cifs_put_tlink(tlink);
1755 spin_lock(&d_inode(direntry)->i_lock);
1756 i_size_write(d_inode(direntry), 0);
1757 clear_nlink(d_inode(direntry));
1758 spin_unlock(&d_inode(direntry)->i_lock);
1761 cifsInode = CIFS_I(d_inode(direntry));
1762 /* force revalidate to go get info when needed */
1763 cifsInode->time = 0;
1765 cifsInode = CIFS_I(inode);
1767 * Force revalidate to get parent dir info when needed since cached
1768 * attributes are invalid now.
1770 cifsInode->time = 0;
1772 d_inode(direntry)->i_ctime = inode->i_ctime = inode->i_mtime =
1773 current_time(inode);
1782 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
1783 const char *from_path, struct dentry *to_dentry,
1784 const char *to_path)
1786 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
1787 struct tcon_link *tlink;
1788 struct cifs_tcon *tcon;
1789 struct TCP_Server_Info *server;
1790 struct cifs_fid fid;
1791 struct cifs_open_parms oparms;
1794 tlink = cifs_sb_tlink(cifs_sb);
1796 return PTR_ERR(tlink);
1797 tcon = tlink_tcon(tlink);
1798 server = tcon->ses->server;
1800 if (!server->ops->rename)
1803 /* try path-based rename first */
1804 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
1807 * Don't bother with rename by filehandle unless file is busy and
1808 * source. Note that cross directory moves do not work with
1809 * rename by filehandle to various Windows servers.
1811 if (rc == 0 || rc != -EBUSY)
1812 goto do_rename_exit;
1814 /* Don't fall back to using SMB on SMB 2+ mount */
1815 if (server->vals->protocol_id != 0)
1816 goto do_rename_exit;
1818 /* open-file renames don't work across directories */
1819 if (to_dentry->d_parent != from_dentry->d_parent)
1820 goto do_rename_exit;
1823 oparms.cifs_sb = cifs_sb;
1824 /* open the file to be renamed -- we need DELETE perms */
1825 oparms.desired_access = DELETE;
1826 oparms.create_options = CREATE_NOT_DIR;
1827 oparms.disposition = FILE_OPEN;
1828 oparms.path = from_path;
1830 oparms.reconnect = false;
1832 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1834 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
1835 (const char *) to_dentry->d_name.name,
1836 cifs_sb->local_nls, cifs_remap(cifs_sb));
1837 CIFSSMBClose(xid, tcon, fid.netfid);
1840 cifs_put_tlink(tlink);
1845 cifs_rename2(struct inode *source_dir, struct dentry *source_dentry,
1846 struct inode *target_dir, struct dentry *target_dentry,
1849 char *from_name = NULL;
1850 char *to_name = NULL;
1851 struct cifs_sb_info *cifs_sb;
1852 struct tcon_link *tlink;
1853 struct cifs_tcon *tcon;
1854 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
1855 FILE_UNIX_BASIC_INFO *info_buf_target;
1859 if (flags & ~RENAME_NOREPLACE)
1862 cifs_sb = CIFS_SB(source_dir->i_sb);
1863 tlink = cifs_sb_tlink(cifs_sb);
1865 return PTR_ERR(tlink);
1866 tcon = tlink_tcon(tlink);
1871 * we already have the rename sem so we do not need to
1872 * grab it again here to protect the path integrity
1874 from_name = build_path_from_dentry(source_dentry);
1875 if (from_name == NULL) {
1877 goto cifs_rename_exit;
1880 to_name = build_path_from_dentry(target_dentry);
1881 if (to_name == NULL) {
1883 goto cifs_rename_exit;
1886 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
1890 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
1892 if (flags & RENAME_NOREPLACE)
1893 goto cifs_rename_exit;
1895 if (rc == -EEXIST && tcon->unix_ext) {
1897 * Are src and dst hardlinks of same inode? We can only tell
1898 * with unix extensions enabled.
1901 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
1903 if (info_buf_source == NULL) {
1905 goto cifs_rename_exit;
1908 info_buf_target = info_buf_source + 1;
1909 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
1912 cifs_remap(cifs_sb));
1916 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
1919 cifs_remap(cifs_sb));
1921 if (tmprc == 0 && (info_buf_source->UniqueId ==
1922 info_buf_target->UniqueId)) {
1923 /* same file, POSIX says that this is a noop */
1925 goto cifs_rename_exit;
1929 * else ... BB we could add the same check for Windows by
1930 * checking the UniqueId via FILE_INTERNAL_INFO
1934 /* Try unlinking the target dentry if it's not negative */
1935 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
1936 if (d_is_dir(target_dentry))
1937 tmprc = cifs_rmdir(target_dir, target_dentry);
1939 tmprc = cifs_unlink(target_dir, target_dentry);
1941 goto cifs_rename_exit;
1942 rc = cifs_do_rename(xid, source_dentry, from_name,
1943 target_dentry, to_name);
1946 /* force revalidate to go get info when needed */
1947 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
1949 source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
1950 target_dir->i_mtime = current_time(source_dir);
1953 kfree(info_buf_source);
1957 cifs_put_tlink(tlink);
1962 cifs_inode_needs_reval(struct inode *inode)
1964 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
1965 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1967 if (cifs_i->time == 0)
1970 if (CIFS_CACHE_READ(cifs_i))
1973 if (!lookupCacheEnabled)
1976 if (!cifs_sb->actimeo)
1979 if (!time_in_range(jiffies, cifs_i->time,
1980 cifs_i->time + cifs_sb->actimeo))
1983 /* hardlinked files w/ noserverino get "special" treatment */
1984 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
1985 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
1992 * Zap the cache. Called when invalid_mapping flag is set.
1995 cifs_invalidate_mapping(struct inode *inode)
1999 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2000 rc = invalidate_inode_pages2(inode->i_mapping);
2002 cifs_dbg(VFS, "%s: could not invalidate inode %p\n",
2006 cifs_fscache_reset_inode_cookie(inode);
2011 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2012 * @word: long word containing the bit lock
2015 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2017 freezable_schedule_unsafe();
2018 if (signal_pending_state(mode, current))
2019 return -ERESTARTSYS;
2024 cifs_revalidate_mapping(struct inode *inode)
2027 unsigned long *flags = &CIFS_I(inode)->flags;
2029 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2034 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2035 rc = cifs_invalidate_mapping(inode);
2037 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2040 clear_bit_unlock(CIFS_INO_LOCK, flags);
2041 smp_mb__after_atomic();
2042 wake_up_bit(flags, CIFS_INO_LOCK);
2048 cifs_zap_mapping(struct inode *inode)
2050 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2051 return cifs_revalidate_mapping(inode);
2054 int cifs_revalidate_file_attr(struct file *filp)
2057 struct inode *inode = file_inode(filp);
2058 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2060 if (!cifs_inode_needs_reval(inode))
2063 if (tlink_tcon(cfile->tlink)->unix_ext)
2064 rc = cifs_get_file_info_unix(filp);
2066 rc = cifs_get_file_info(filp);
2071 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2075 struct inode *inode = d_inode(dentry);
2076 struct super_block *sb = dentry->d_sb;
2077 char *full_path = NULL;
2082 if (!cifs_inode_needs_reval(inode))
2087 /* can not safely grab the rename sem here if rename calls revalidate
2088 since that would deadlock */
2089 full_path = build_path_from_dentry(dentry);
2090 if (full_path == NULL) {
2095 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2096 full_path, inode, inode->i_count.counter,
2097 dentry, cifs_get_time(dentry), jiffies);
2099 if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2100 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2102 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2111 int cifs_revalidate_file(struct file *filp)
2114 struct inode *inode = file_inode(filp);
2116 rc = cifs_revalidate_file_attr(filp);
2120 return cifs_revalidate_mapping(inode);
2123 /* revalidate a dentry's inode attributes */
2124 int cifs_revalidate_dentry(struct dentry *dentry)
2127 struct inode *inode = d_inode(dentry);
2129 rc = cifs_revalidate_dentry_attr(dentry);
2133 return cifs_revalidate_mapping(inode);
2136 int cifs_getattr(const struct path *path, struct kstat *stat,
2137 u32 request_mask, unsigned int flags)
2139 struct dentry *dentry = path->dentry;
2140 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2141 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2142 struct inode *inode = d_inode(dentry);
2146 * We need to be sure that all dirty pages are written and the server
2147 * has actual ctime, mtime and file length.
2149 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2150 inode->i_mapping->nrpages != 0) {
2151 rc = filemap_fdatawait(inode->i_mapping);
2153 mapping_set_error(inode->i_mapping, rc);
2158 rc = cifs_revalidate_dentry_attr(dentry);
2162 generic_fillattr(inode, stat);
2163 stat->blksize = cifs_sb->bsize;
2164 stat->ino = CIFS_I(inode)->uniqueid;
2166 /* old CIFS Unix Extensions doesn't return create time */
2167 if (CIFS_I(inode)->createtime) {
2168 stat->result_mask |= STATX_BTIME;
2170 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2173 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2174 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2175 stat->attributes |= STATX_ATTR_COMPRESSED;
2176 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2177 stat->attributes |= STATX_ATTR_ENCRYPTED;
2180 * If on a multiuser mount without unix extensions or cifsacl being
2181 * enabled, and the admin hasn't overridden them, set the ownership
2182 * to the fsuid/fsgid of the current process.
2184 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2185 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2187 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2188 stat->uid = current_fsuid();
2189 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2190 stat->gid = current_fsgid();
2195 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2198 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2199 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->vfs_inode.i_sb);
2200 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2201 struct TCP_Server_Info *server = tcon->ses->server;
2202 struct cifsFileInfo *cfile;
2206 * We need to be sure that all dirty pages are written as they
2207 * might fill holes on the server.
2209 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2210 inode->i_mapping->nrpages != 0) {
2211 rc = filemap_fdatawait(inode->i_mapping);
2213 mapping_set_error(inode->i_mapping, rc);
2218 cfile = find_readable_file(cifs_i, false);
2222 if (server->ops->fiemap) {
2223 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2224 cifsFileInfo_put(cfile);
2228 cifsFileInfo_put(cfile);
2232 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2234 pgoff_t index = from >> PAGE_SHIFT;
2235 unsigned offset = from & (PAGE_SIZE - 1);
2239 page = grab_cache_page(mapping, index);
2243 zero_user_segment(page, offset, PAGE_SIZE);
2249 void cifs_setsize(struct inode *inode, loff_t offset)
2251 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2253 spin_lock(&inode->i_lock);
2254 i_size_write(inode, offset);
2255 spin_unlock(&inode->i_lock);
2257 /* Cached inode must be refreshed on truncate */
2259 truncate_pagecache(inode, offset);
2263 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2264 unsigned int xid, char *full_path)
2267 struct cifsFileInfo *open_file;
2268 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2269 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2270 struct tcon_link *tlink = NULL;
2271 struct cifs_tcon *tcon = NULL;
2272 struct TCP_Server_Info *server;
2275 * To avoid spurious oplock breaks from server, in the case of
2276 * inodes that we already have open, avoid doing path based
2277 * setting of file size if we can do it by handle.
2278 * This keeps our caching token (oplock) and avoids timeouts
2279 * when the local oplock break takes longer to flush
2280 * writebehind data than the SMB timeout for the SetPathInfo
2281 * request would allow
2283 open_file = find_writable_file(cifsInode, true);
2285 tcon = tlink_tcon(open_file->tlink);
2286 server = tcon->ses->server;
2287 if (server->ops->set_file_size)
2288 rc = server->ops->set_file_size(xid, tcon, open_file,
2289 attrs->ia_size, false);
2292 cifsFileInfo_put(open_file);
2293 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2301 tlink = cifs_sb_tlink(cifs_sb);
2303 return PTR_ERR(tlink);
2304 tcon = tlink_tcon(tlink);
2305 server = tcon->ses->server;
2309 * Set file size by pathname rather than by handle either because no
2310 * valid, writeable file handle for it was found or because there was
2311 * an error setting it by handle.
2313 if (server->ops->set_path_size)
2314 rc = server->ops->set_path_size(xid, tcon, full_path,
2315 attrs->ia_size, cifs_sb, false);
2318 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2321 cifs_put_tlink(tlink);
2325 cifsInode->server_eof = attrs->ia_size;
2326 cifs_setsize(inode, attrs->ia_size);
2327 cifs_truncate_page(inode->i_mapping, inode->i_size);
2334 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2338 char *full_path = NULL;
2339 struct inode *inode = d_inode(direntry);
2340 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2341 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2342 struct tcon_link *tlink;
2343 struct cifs_tcon *pTcon;
2344 struct cifs_unix_set_info_args *args = NULL;
2345 struct cifsFileInfo *open_file;
2347 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2348 direntry, attrs->ia_valid);
2352 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2353 attrs->ia_valid |= ATTR_FORCE;
2355 rc = setattr_prepare(direntry, attrs);
2359 full_path = build_path_from_dentry(direntry);
2360 if (full_path == NULL) {
2366 * Attempt to flush data before changing attributes. We need to do
2367 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2368 * ownership or mode then we may also need to do this. Here, we take
2369 * the safe way out and just do the flush on all setattr requests. If
2370 * the flush returns error, store it to report later and continue.
2372 * BB: This should be smarter. Why bother flushing pages that
2373 * will be truncated anyway? Also, should we error out here if
2374 * the flush returns error?
2376 rc = filemap_write_and_wait(inode->i_mapping);
2377 if (is_interrupt_error(rc)) {
2382 mapping_set_error(inode->i_mapping, rc);
2385 if (attrs->ia_valid & ATTR_SIZE) {
2386 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2391 /* skip mode change if it's just for clearing setuid/setgid */
2392 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2393 attrs->ia_valid &= ~ATTR_MODE;
2395 args = kmalloc(sizeof(*args), GFP_KERNEL);
2401 /* set up the struct */
2402 if (attrs->ia_valid & ATTR_MODE)
2403 args->mode = attrs->ia_mode;
2405 args->mode = NO_CHANGE_64;
2407 if (attrs->ia_valid & ATTR_UID)
2408 args->uid = attrs->ia_uid;
2410 args->uid = INVALID_UID; /* no change */
2412 if (attrs->ia_valid & ATTR_GID)
2413 args->gid = attrs->ia_gid;
2415 args->gid = INVALID_GID; /* no change */
2417 if (attrs->ia_valid & ATTR_ATIME)
2418 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2420 args->atime = NO_CHANGE_64;
2422 if (attrs->ia_valid & ATTR_MTIME)
2423 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2425 args->mtime = NO_CHANGE_64;
2427 if (attrs->ia_valid & ATTR_CTIME)
2428 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2430 args->ctime = NO_CHANGE_64;
2433 open_file = find_writable_file(cifsInode, true);
2435 u16 nfid = open_file->fid.netfid;
2436 u32 npid = open_file->pid;
2437 pTcon = tlink_tcon(open_file->tlink);
2438 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2439 cifsFileInfo_put(open_file);
2441 tlink = cifs_sb_tlink(cifs_sb);
2442 if (IS_ERR(tlink)) {
2443 rc = PTR_ERR(tlink);
2446 pTcon = tlink_tcon(tlink);
2447 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2449 cifs_remap(cifs_sb));
2450 cifs_put_tlink(tlink);
2456 if ((attrs->ia_valid & ATTR_SIZE) &&
2457 attrs->ia_size != i_size_read(inode))
2458 truncate_setsize(inode, attrs->ia_size);
2460 setattr_copy(inode, attrs);
2461 mark_inode_dirty(inode);
2463 /* force revalidate when any of these times are set since some
2464 of the fs types (eg ext3, fat) do not have fine enough
2465 time granularity to match protocol, and we do not have a
2466 a way (yet) to query the server fs's time granularity (and
2467 whether it rounds times down).
2469 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2470 cifsInode->time = 0;
2479 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2482 kuid_t uid = INVALID_UID;
2483 kgid_t gid = INVALID_GID;
2484 struct inode *inode = d_inode(direntry);
2485 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2486 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2487 struct cifsFileInfo *wfile;
2488 struct cifs_tcon *tcon;
2489 char *full_path = NULL;
2492 __u64 mode = NO_CHANGE_64;
2496 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2497 direntry, attrs->ia_valid);
2499 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2500 attrs->ia_valid |= ATTR_FORCE;
2502 rc = setattr_prepare(direntry, attrs);
2508 full_path = build_path_from_dentry(direntry);
2509 if (full_path == NULL) {
2516 * Attempt to flush data before changing attributes. We need to do
2517 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2518 * ownership or mode then we may also need to do this. Here, we take
2519 * the safe way out and just do the flush on all setattr requests. If
2520 * the flush returns error, store it to report later and continue.
2522 * BB: This should be smarter. Why bother flushing pages that
2523 * will be truncated anyway? Also, should we error out here if
2524 * the flush returns error?
2526 rc = filemap_write_and_wait(inode->i_mapping);
2527 if (is_interrupt_error(rc)) {
2529 goto cifs_setattr_exit;
2532 mapping_set_error(inode->i_mapping, rc);
2535 if (attrs->ia_valid & ATTR_MTIME) {
2536 rc = cifs_get_writable_file(cifsInode, false, &wfile);
2538 tcon = tlink_tcon(wfile->tlink);
2539 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
2540 cifsFileInfo_put(wfile);
2542 goto cifs_setattr_exit;
2543 } else if (rc != -EBADF)
2544 goto cifs_setattr_exit;
2549 if (attrs->ia_valid & ATTR_SIZE) {
2550 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2552 goto cifs_setattr_exit;
2555 if (attrs->ia_valid & ATTR_UID)
2556 uid = attrs->ia_uid;
2558 if (attrs->ia_valid & ATTR_GID)
2559 gid = attrs->ia_gid;
2561 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2562 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2563 if (uid_valid(uid) || gid_valid(gid)) {
2564 rc = id_mode_to_cifs_acl(inode, full_path, NO_CHANGE_64,
2567 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2569 goto cifs_setattr_exit;
2573 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2574 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2576 /* skip mode change if it's just for clearing setuid/setgid */
2577 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2578 attrs->ia_valid &= ~ATTR_MODE;
2580 if (attrs->ia_valid & ATTR_MODE) {
2581 mode = attrs->ia_mode;
2583 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2584 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2585 rc = id_mode_to_cifs_acl(inode, full_path, mode,
2586 INVALID_UID, INVALID_GID);
2588 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2590 goto cifs_setattr_exit;
2593 if (((mode & S_IWUGO) == 0) &&
2594 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
2596 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2598 /* fix up mode if we're not using dynperm */
2599 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2600 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2601 } else if ((mode & S_IWUGO) &&
2602 (cifsInode->cifsAttrs & ATTR_READONLY)) {
2604 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2605 /* Attributes of 0 are ignored */
2607 dosattr |= ATTR_NORMAL;
2609 /* reset local inode permissions to normal */
2610 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2611 attrs->ia_mode &= ~(S_IALLUGO);
2612 if (S_ISDIR(inode->i_mode))
2614 cifs_sb->mnt_dir_mode;
2617 cifs_sb->mnt_file_mode;
2619 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2620 /* ignore mode change - ATTR_READONLY hasn't changed */
2621 attrs->ia_valid &= ~ATTR_MODE;
2625 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2626 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2627 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2628 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2630 /* Even if error on time set, no sense failing the call if
2631 the server would set the time to a reasonable value anyway,
2632 and this check ensures that we are not being called from
2633 sys_utimes in which case we ought to fail the call back to
2634 the user when the server rejects the call */
2635 if ((rc) && (attrs->ia_valid &
2636 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
2640 /* do not need local check to inode_check_ok since the server does
2643 goto cifs_setattr_exit;
2645 if ((attrs->ia_valid & ATTR_SIZE) &&
2646 attrs->ia_size != i_size_read(inode))
2647 truncate_setsize(inode, attrs->ia_size);
2649 setattr_copy(inode, attrs);
2650 mark_inode_dirty(inode);
2659 cifs_setattr(struct dentry *direntry, struct iattr *attrs)
2661 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
2662 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
2664 if (pTcon->unix_ext)
2665 return cifs_setattr_unix(direntry, attrs);
2667 return cifs_setattr_nounix(direntry, attrs);
2669 /* BB: add cifs_setattr_legacy for really old servers */
2673 void cifs_delete_inode(struct inode *inode)
2675 cifs_dbg(FYI, "In cifs_delete_inode, inode = 0x%p\n", inode);
2676 /* may have to add back in if and when safe distributed caching of
2677 directories added e.g. via FindNotify */