1 // SPDX-License-Identifier: LGPL-2.1
4 * Copyright (C) International Business Machines Corp., 2002,2010
5 * Author(s): Steve French (sfrench@us.ibm.com)
9 #include <linux/stat.h>
10 #include <linux/slab.h>
11 #include <linux/pagemap.h>
12 #include <linux/freezer.h>
13 #include <linux/sched/signal.h>
14 #include <linux/wait_bit.h>
15 #include <linux/fiemap.h>
16 #include <asm/div64.h>
20 #include "cifsproto.h"
21 #include "smb2proto.h"
22 #include "cifs_debug.h"
23 #include "cifs_fs_sb.h"
24 #include "cifs_unicode.h"
26 #include "fs_context.h"
27 #include "cifs_ioctl.h"
28 #include "cached_dir.h"
30 static void cifs_set_ops(struct inode *inode)
32 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
34 switch (inode->i_mode & S_IFMT) {
36 inode->i_op = &cifs_file_inode_ops;
37 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
38 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
39 inode->i_fop = &cifs_file_direct_nobrl_ops;
41 inode->i_fop = &cifs_file_direct_ops;
42 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
43 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
44 inode->i_fop = &cifs_file_strict_nobrl_ops;
46 inode->i_fop = &cifs_file_strict_ops;
47 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
48 inode->i_fop = &cifs_file_nobrl_ops;
49 else { /* not direct, send byte range locks */
50 inode->i_fop = &cifs_file_ops;
53 /* check if server can support readahead */
54 if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read <
55 PAGE_SIZE + MAX_CIFS_HDR_SIZE)
56 inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
58 inode->i_data.a_ops = &cifs_addr_ops;
61 if (IS_AUTOMOUNT(inode)) {
62 inode->i_op = &cifs_namespace_inode_operations;
64 inode->i_op = &cifs_dir_inode_ops;
65 inode->i_fop = &cifs_dir_ops;
69 inode->i_op = &cifs_symlink_inode_ops;
72 init_special_inode(inode, inode->i_mode, inode->i_rdev);
77 /* check inode attributes against fattr. If they don't match, tag the
78 * inode for cache invalidation
81 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
83 struct cifs_fscache_inode_coherency_data cd;
84 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
86 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
87 __func__, cifs_i->uniqueid);
89 if (inode->i_state & I_NEW) {
90 cifs_dbg(FYI, "%s: inode %llu is new\n",
91 __func__, cifs_i->uniqueid);
95 /* don't bother with revalidation if we have an oplock */
96 if (CIFS_CACHE_READ(cifs_i)) {
97 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
98 __func__, cifs_i->uniqueid);
102 /* revalidate if mtime or size have changed */
103 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
104 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
105 cifs_i->server_eof == fattr->cf_eof) {
106 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
107 __func__, cifs_i->uniqueid);
111 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
112 __func__, cifs_i->uniqueid);
113 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
114 /* Invalidate fscache cookie */
115 cifs_fscache_fill_coherency(&cifs_i->netfs.inode, &cd);
116 fscache_invalidate(cifs_inode_cookie(inode), &cd, i_size_read(inode), 0);
120 * copy nlink to the inode, unless it wasn't provided. Provide
121 * sane values if we don't have an existing one and none was provided
124 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
127 * if we're in a situation where we can't trust what we
128 * got from the server (readdir, some non-unix cases)
129 * fake reasonable values
131 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
132 /* only provide fake values on a new inode */
133 if (inode->i_state & I_NEW) {
134 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
142 /* we trust the server, so update it */
143 set_nlink(inode, fattr->cf_nlink);
146 /* populate an inode with info from a cifs_fattr struct */
148 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
150 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
151 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
153 if (!(inode->i_state & I_NEW) &&
154 unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
155 CIFS_I(inode)->time = 0; /* force reval */
159 cifs_revalidate_cache(inode, fattr);
161 spin_lock(&inode->i_lock);
162 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
163 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
164 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
165 /* we do not want atime to be less than mtime, it broke some apps */
166 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
167 inode->i_atime = fattr->cf_mtime;
169 inode->i_atime = fattr->cf_atime;
170 inode->i_mtime = fattr->cf_mtime;
171 inode_set_ctime_to_ts(inode, fattr->cf_ctime);
172 inode->i_rdev = fattr->cf_rdev;
173 cifs_nlink_fattr_to_inode(inode, fattr);
174 inode->i_uid = fattr->cf_uid;
175 inode->i_gid = fattr->cf_gid;
177 /* if dynperm is set, don't clobber existing mode */
178 if (inode->i_state & I_NEW ||
179 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
180 inode->i_mode = fattr->cf_mode;
182 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
184 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
187 cifs_i->time = jiffies;
189 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
190 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
192 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
194 cifs_i->server_eof = fattr->cf_eof;
196 * Can't safely change the file size here if the client is writing to
197 * it due to potential races.
199 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
200 i_size_write(inode, fattr->cf_eof);
203 * i_blocks is not related to (i_size / i_blksize),
204 * but instead 512 byte (2**9) size is required for
205 * calculating num blocks.
207 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
210 if (S_ISLNK(fattr->cf_mode)) {
211 kfree(cifs_i->symlink_target);
212 cifs_i->symlink_target = fattr->cf_symlink_target;
213 fattr->cf_symlink_target = NULL;
215 spin_unlock(&inode->i_lock);
217 if (fattr->cf_flags & CIFS_FATTR_JUNCTION)
218 inode->i_flags |= S_AUTOMOUNT;
219 if (inode->i_state & I_NEW)
225 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
227 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
229 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
232 fattr->cf_uniqueid = iunique(sb, ROOT_I);
235 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
237 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
238 struct cifs_sb_info *cifs_sb)
240 memset(fattr, 0, sizeof(*fattr));
241 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
242 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
243 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
245 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
246 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
247 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
248 /* old POSIX extensions don't get create time */
250 fattr->cf_mode = le64_to_cpu(info->Permissions);
253 * Since we set the inode type below we need to mask off
254 * to avoid strange results if bits set above.
256 fattr->cf_mode &= ~S_IFMT;
257 switch (le32_to_cpu(info->Type)) {
259 fattr->cf_mode |= S_IFREG;
260 fattr->cf_dtype = DT_REG;
263 fattr->cf_mode |= S_IFLNK;
264 fattr->cf_dtype = DT_LNK;
267 fattr->cf_mode |= S_IFDIR;
268 fattr->cf_dtype = DT_DIR;
271 fattr->cf_mode |= S_IFCHR;
272 fattr->cf_dtype = DT_CHR;
273 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
274 le64_to_cpu(info->DevMinor) & MINORMASK);
277 fattr->cf_mode |= S_IFBLK;
278 fattr->cf_dtype = DT_BLK;
279 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
280 le64_to_cpu(info->DevMinor) & MINORMASK);
283 fattr->cf_mode |= S_IFIFO;
284 fattr->cf_dtype = DT_FIFO;
287 fattr->cf_mode |= S_IFSOCK;
288 fattr->cf_dtype = DT_SOCK;
291 /* safest to call it a file if we do not know */
292 fattr->cf_mode |= S_IFREG;
293 fattr->cf_dtype = DT_REG;
294 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
298 fattr->cf_uid = cifs_sb->ctx->linux_uid;
299 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
300 u64 id = le64_to_cpu(info->Uid);
301 if (id < ((uid_t)-1)) {
302 kuid_t uid = make_kuid(&init_user_ns, id);
308 fattr->cf_gid = cifs_sb->ctx->linux_gid;
309 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
310 u64 id = le64_to_cpu(info->Gid);
311 if (id < ((gid_t)-1)) {
312 kgid_t gid = make_kgid(&init_user_ns, id);
318 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
322 * Fill a cifs_fattr struct with fake inode info.
324 * Needed to setup cifs_fattr data for the directory which is the
325 * junction to the new submount (ie to setup the fake directory
326 * which represents a DFS referral or reparse mount point).
328 static void cifs_create_junction_fattr(struct cifs_fattr *fattr,
329 struct super_block *sb)
331 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
333 cifs_dbg(FYI, "%s: creating fake fattr\n", __func__);
335 memset(fattr, 0, sizeof(*fattr));
336 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
337 fattr->cf_uid = cifs_sb->ctx->linux_uid;
338 fattr->cf_gid = cifs_sb->ctx->linux_gid;
339 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
340 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
342 fattr->cf_flags = CIFS_FATTR_JUNCTION;
345 /* Update inode with final fattr data */
346 static int update_inode_info(struct super_block *sb,
347 struct cifs_fattr *fattr,
348 struct inode **inode)
350 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
354 *inode = cifs_iget(sb, fattr);
359 /* We already have inode, update it.
361 * If file type or uniqueid is different, return error.
363 if (unlikely((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
364 CIFS_I(*inode)->uniqueid != fattr->cf_uniqueid)) {
365 CIFS_I(*inode)->time = 0; /* force reval */
368 return cifs_fattr_to_inode(*inode, fattr);
371 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
373 cifs_get_file_info_unix(struct file *filp)
377 FILE_UNIX_BASIC_INFO find_data;
378 struct cifs_fattr fattr = {};
379 struct inode *inode = file_inode(filp);
380 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
381 struct cifsFileInfo *cfile = filp->private_data;
382 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
386 if (cfile->symlink_target) {
387 fattr.cf_symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL);
388 if (!fattr.cf_symlink_target) {
390 goto cifs_gfiunix_out;
394 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
396 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
397 } else if (rc == -EREMOTE) {
398 cifs_create_junction_fattr(&fattr, inode->i_sb);
401 goto cifs_gfiunix_out;
403 rc = cifs_fattr_to_inode(inode, &fattr);
410 static int cifs_get_unix_fattr(const unsigned char *full_path,
411 struct super_block *sb,
412 struct cifs_fattr *fattr,
413 struct inode **pinode,
414 const unsigned int xid)
416 struct TCP_Server_Info *server;
417 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
418 FILE_UNIX_BASIC_INFO find_data;
419 struct cifs_tcon *tcon;
420 struct tcon_link *tlink;
423 cifs_dbg(FYI, "Getting info on %s\n", full_path);
425 tlink = cifs_sb_tlink(cifs_sb);
427 return PTR_ERR(tlink);
428 tcon = tlink_tcon(tlink);
429 server = tcon->ses->server;
431 /* could have done a find first instead but this returns more info */
432 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
433 cifs_sb->local_nls, cifs_remap(cifs_sb));
434 cifs_dbg(FYI, "%s: query path info: rc = %d\n", __func__, rc);
435 cifs_put_tlink(tlink);
438 cifs_unix_basic_to_fattr(fattr, &find_data, cifs_sb);
439 } else if (rc == -EREMOTE) {
440 cifs_create_junction_fattr(fattr, sb);
447 cifs_fill_uniqueid(sb, fattr);
449 /* check for Minshall+French symlinks */
450 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
451 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
452 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
455 if (S_ISLNK(fattr->cf_mode) && !fattr->cf_symlink_target) {
456 if (!server->ops->query_symlink)
458 rc = server->ops->query_symlink(xid, tcon,
460 &fattr->cf_symlink_target,
462 cifs_dbg(FYI, "%s: query_symlink: %d\n", __func__, rc);
467 int cifs_get_inode_info_unix(struct inode **pinode,
468 const unsigned char *full_path,
469 struct super_block *sb, unsigned int xid)
471 struct cifs_fattr fattr = {};
474 rc = cifs_get_unix_fattr(full_path, sb, &fattr, pinode, xid);
478 rc = update_inode_info(sb, &fattr, pinode);
480 kfree(fattr.cf_symlink_target);
484 static inline int cifs_get_unix_fattr(const unsigned char *full_path,
485 struct super_block *sb,
486 struct cifs_fattr *fattr,
487 struct inode **pinode,
488 const unsigned int xid)
493 int cifs_get_inode_info_unix(struct inode **pinode,
494 const unsigned char *full_path,
495 struct super_block *sb, unsigned int xid)
499 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
502 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
503 struct cifs_sb_info *cifs_sb, unsigned int xid)
507 struct tcon_link *tlink;
508 struct cifs_tcon *tcon;
510 struct cifs_open_parms oparms;
511 struct cifs_io_parms io_parms = {0};
513 unsigned int bytes_read;
515 int buf_type = CIFS_NO_BUFFER;
519 fattr->cf_mode &= ~S_IFMT;
521 if (fattr->cf_eof == 0) {
522 fattr->cf_mode |= S_IFIFO;
523 fattr->cf_dtype = DT_FIFO;
525 } else if (fattr->cf_eof < 8) {
526 fattr->cf_mode |= S_IFREG;
527 fattr->cf_dtype = DT_REG;
528 return -EINVAL; /* EOPNOTSUPP? */
531 tlink = cifs_sb_tlink(cifs_sb);
533 return PTR_ERR(tlink);
534 tcon = tlink_tcon(tlink);
536 oparms = (struct cifs_open_parms) {
539 .desired_access = GENERIC_READ,
540 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
541 .disposition = FILE_OPEN,
546 if (tcon->ses->server->oplocks)
550 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
552 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
553 cifs_put_tlink(tlink);
558 io_parms.netfid = fid.netfid;
559 io_parms.pid = current->tgid;
560 io_parms.tcon = tcon;
562 io_parms.length = 24;
564 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
565 &bytes_read, &pbuf, &buf_type);
566 if ((rc == 0) && (bytes_read >= 8)) {
567 if (memcmp("IntxBLK", pbuf, 8) == 0) {
568 cifs_dbg(FYI, "Block device\n");
569 fattr->cf_mode |= S_IFBLK;
570 fattr->cf_dtype = DT_BLK;
571 if (bytes_read == 24) {
572 /* we have enough to decode dev num */
573 __u64 mjr; /* major */
574 __u64 mnr; /* minor */
575 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
576 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
577 fattr->cf_rdev = MKDEV(mjr, mnr);
579 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
580 cifs_dbg(FYI, "Char device\n");
581 fattr->cf_mode |= S_IFCHR;
582 fattr->cf_dtype = DT_CHR;
583 if (bytes_read == 24) {
584 /* we have enough to decode dev num */
585 __u64 mjr; /* major */
586 __u64 mnr; /* minor */
587 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
588 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
589 fattr->cf_rdev = MKDEV(mjr, mnr);
591 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
592 cifs_dbg(FYI, "Symlink\n");
593 fattr->cf_mode |= S_IFLNK;
594 fattr->cf_dtype = DT_LNK;
595 } else if (memcmp("LnxFIFO", pbuf, 8) == 0) {
596 cifs_dbg(FYI, "FIFO\n");
597 fattr->cf_mode |= S_IFIFO;
598 fattr->cf_dtype = DT_FIFO;
600 fattr->cf_mode |= S_IFREG; /* file? */
601 fattr->cf_dtype = DT_REG;
605 fattr->cf_mode |= S_IFREG; /* then it is a file */
606 fattr->cf_dtype = DT_REG;
607 rc = -EOPNOTSUPP; /* or some unknown SFU type */
610 tcon->ses->server->ops->close(xid, tcon, &fid);
611 cifs_put_tlink(tlink);
615 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
618 * Fetch mode bits as provided by SFU.
620 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
622 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
623 struct cifs_sb_info *cifs_sb, unsigned int xid)
625 #ifdef CONFIG_CIFS_XATTR
629 struct tcon_link *tlink;
630 struct cifs_tcon *tcon;
632 tlink = cifs_sb_tlink(cifs_sb);
634 return PTR_ERR(tlink);
635 tcon = tlink_tcon(tlink);
637 if (tcon->ses->server->ops->query_all_EAs == NULL) {
638 cifs_put_tlink(tlink);
642 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
643 "SETFILEBITS", ea_value, 4 /* size of buf */,
645 cifs_put_tlink(tlink);
649 mode = le32_to_cpu(*((__le32 *)ea_value));
650 fattr->cf_mode &= ~SFBITS_MASK;
651 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
652 mode, fattr->cf_mode);
653 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
654 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
663 /* Fill a cifs_fattr struct with info from POSIX info struct */
664 static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr,
665 struct cifs_open_info_data *data,
666 struct cifs_sid *owner,
667 struct cifs_sid *group,
668 struct super_block *sb)
670 struct smb311_posix_qinfo *info = &data->posix_fi;
671 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
672 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
674 memset(fattr, 0, sizeof(*fattr));
676 /* no fattr->flags to set */
677 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
678 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
680 if (info->LastAccessTime)
681 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
683 ktime_get_coarse_real_ts64(&fattr->cf_atime);
685 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
686 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
688 if (data->adjust_tz) {
689 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
690 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
693 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
694 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
695 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
697 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
698 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
699 /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
700 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
703 fattr->cf_mode |= S_IFLNK;
704 fattr->cf_dtype = DT_LNK;
705 fattr->cf_symlink_target = data->symlink_target;
706 data->symlink_target = NULL;
707 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
708 fattr->cf_mode |= S_IFDIR;
709 fattr->cf_dtype = DT_DIR;
711 fattr->cf_mode |= S_IFREG;
712 fattr->cf_dtype = DT_REG;
714 /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
716 sid_to_id(cifs_sb, owner, fattr, SIDOWNER);
717 sid_to_id(cifs_sb, group, fattr, SIDGROUP);
719 cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
720 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
723 bool cifs_reparse_point_to_fattr(struct cifs_sb_info *cifs_sb,
724 struct cifs_fattr *fattr,
728 case IO_REPARSE_TAG_LX_SYMLINK:
729 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
730 fattr->cf_dtype = DT_LNK;
732 case IO_REPARSE_TAG_LX_FIFO:
733 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
734 fattr->cf_dtype = DT_FIFO;
736 case IO_REPARSE_TAG_AF_UNIX:
737 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
738 fattr->cf_dtype = DT_SOCK;
740 case IO_REPARSE_TAG_LX_CHR:
741 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
742 fattr->cf_dtype = DT_CHR;
744 case IO_REPARSE_TAG_LX_BLK:
745 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
746 fattr->cf_dtype = DT_BLK;
748 case 0: /* SMB1 symlink */
749 case IO_REPARSE_TAG_SYMLINK:
750 case IO_REPARSE_TAG_NFS:
751 fattr->cf_mode = S_IFLNK;
752 fattr->cf_dtype = DT_LNK;
760 static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
761 struct cifs_open_info_data *data,
762 struct super_block *sb)
764 struct smb2_file_all_info *info = &data->fi;
765 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
766 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
768 memset(fattr, 0, sizeof(*fattr));
769 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
770 if (info->DeletePending)
771 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
773 if (info->LastAccessTime)
774 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
776 ktime_get_coarse_real_ts64(&fattr->cf_atime);
778 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
779 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
781 if (data->adjust_tz) {
782 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
783 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
786 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
787 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
788 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
789 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
791 if (cifs_open_data_reparse(data) &&
792 cifs_reparse_point_to_fattr(cifs_sb, fattr, data->reparse_tag))
795 if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
796 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
797 fattr->cf_dtype = DT_DIR;
799 * Server can return wrong NumberOfLinks value for directories
800 * when Unix extensions are disabled - fake it.
803 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
805 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
806 fattr->cf_dtype = DT_REG;
808 /* clear write bits if ATTR_READONLY is set */
809 if (fattr->cf_cifsattrs & ATTR_READONLY)
810 fattr->cf_mode &= ~(S_IWUGO);
813 * Don't accept zero nlink from non-unix servers unless
814 * delete is pending. Instead mark it as unknown.
816 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
817 !info->DeletePending) {
818 cifs_dbg(VFS, "bogus file nlink value %u\n",
820 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
825 if (S_ISLNK(fattr->cf_mode)) {
826 fattr->cf_symlink_target = data->symlink_target;
827 data->symlink_target = NULL;
830 fattr->cf_uid = cifs_sb->ctx->linux_uid;
831 fattr->cf_gid = cifs_sb->ctx->linux_gid;
835 cifs_get_file_info(struct file *filp)
839 struct cifs_open_info_data data = {};
840 struct cifs_fattr fattr;
841 struct inode *inode = file_inode(filp);
842 struct cifsFileInfo *cfile = filp->private_data;
843 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
844 struct TCP_Server_Info *server = tcon->ses->server;
846 if (!server->ops->query_file_info)
850 rc = server->ops->query_file_info(xid, tcon, cfile, &data);
853 /* TODO: add support to query reparse tag */
854 data.adjust_tz = false;
855 if (data.symlink_target) {
857 data.reparse_tag = IO_REPARSE_TAG_SYMLINK;
859 cifs_open_info_to_fattr(&fattr, &data, inode->i_sb);
862 cifs_create_junction_fattr(&fattr, inode->i_sb);
868 * FIXME: legacy server -- fall back to path-based call?
869 * for now, just skip revalidating and mark inode for
873 CIFS_I(inode)->time = 0;
880 * don't bother with SFU junk here -- just mark inode as needing
883 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
884 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
885 /* if filetype is different, return error */
886 rc = cifs_fattr_to_inode(inode, &fattr);
888 cifs_free_open_info(&data);
893 /* Simple function to return a 64 bit hash of string. Rarely called */
894 static __u64 simple_hashstr(const char *str)
896 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
900 hash = (hash + (__u64) *str++) * hash_mult;
905 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
907 * cifs_backup_query_path_info - SMB1 fallback code to get ino
909 * Fallback code to get file metadata when we don't have access to
910 * full_path (EACCES) and have backup creds.
912 * @xid: transaction id used to identify original request in logs
913 * @tcon: information about the server share we have mounted
914 * @sb: the superblock stores info such as disk space available
915 * @full_path: name of the file we are getting the metadata for
916 * @resp_buf: will be set to cifs resp buf and needs to be freed with
917 * cifs_buf_release() when done with @data
918 * @data: will be set to search info result buffer
921 cifs_backup_query_path_info(int xid,
922 struct cifs_tcon *tcon,
923 struct super_block *sb,
924 const char *full_path,
926 FILE_ALL_INFO **data)
928 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
929 struct cifs_search_info info = {0};
934 info.endOfSearch = false;
936 info.info_level = SMB_FIND_FILE_UNIX;
937 else if ((tcon->ses->capabilities &
938 tcon->ses->server->vals->cap_nt_find) == 0)
939 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
940 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
941 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
942 else /* no srvino useful for fallback to some netapp */
943 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
945 flags = CIFS_SEARCH_CLOSE_ALWAYS |
946 CIFS_SEARCH_CLOSE_AT_END |
947 CIFS_SEARCH_BACKUP_SEARCH;
949 rc = CIFSFindFirst(xid, tcon, full_path,
950 cifs_sb, NULL, flags, &info, false);
954 *resp_buf = (void *)info.ntwrk_buf_start;
955 *data = (FILE_ALL_INFO *)info.srch_entries_start;
958 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
960 static void cifs_set_fattr_ino(int xid, struct cifs_tcon *tcon, struct super_block *sb,
961 struct inode **inode, const char *full_path,
962 struct cifs_open_info_data *data, struct cifs_fattr *fattr)
964 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
965 struct TCP_Server_Info *server = tcon->ses->server;
968 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
970 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
972 fattr->cf_uniqueid = iunique(sb, ROOT_I);
977 * If we have an inode pass a NULL tcon to ensure we don't
978 * make a round trip to the server. This only works for SMB2+.
980 rc = server->ops->get_srv_inum(xid, *inode ? NULL : tcon, cifs_sb, full_path,
981 &fattr->cf_uniqueid, data);
984 * If that fails reuse existing ino or generate one
985 * and disable server ones
988 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
990 fattr->cf_uniqueid = iunique(sb, ROOT_I);
991 cifs_autodisable_serverino(cifs_sb);
996 /* If no errors, check for zero root inode (invalid) */
997 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
998 cifs_dbg(FYI, "Invalid (0) inodenum\n");
1001 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
1003 /* make an ino by hashing the UNC */
1004 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
1005 fattr->cf_uniqueid = simple_hashstr(tcon->tree_name);
1010 static inline bool is_inode_cache_good(struct inode *ino)
1012 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
1015 static int reparse_info_to_fattr(struct cifs_open_info_data *data,
1016 struct super_block *sb,
1017 const unsigned int xid,
1018 struct cifs_tcon *tcon,
1019 const char *full_path,
1020 struct cifs_fattr *fattr)
1022 struct TCP_Server_Info *server = tcon->ses->server;
1023 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1024 struct kvec rsp_iov, *iov = NULL;
1025 int rsp_buftype = CIFS_NO_BUFFER;
1026 u32 tag = data->reparse_tag;
1029 if (!tag && server->ops->query_reparse_point) {
1030 rc = server->ops->query_reparse_point(xid, tcon, cifs_sb,
1032 &rsp_iov, &rsp_buftype);
1036 switch ((data->reparse_tag = tag)) {
1037 case 0: /* SMB1 symlink */
1040 case IO_REPARSE_TAG_NFS:
1041 case IO_REPARSE_TAG_SYMLINK:
1042 if (!data->symlink_target && server->ops->query_symlink) {
1043 rc = server->ops->query_symlink(xid, tcon,
1045 &data->symlink_target,
1049 case IO_REPARSE_TAG_MOUNT_POINT:
1050 cifs_create_junction_fattr(fattr, sb);
1054 cifs_open_info_to_fattr(fattr, data, sb);
1056 free_rsp_buf(rsp_buftype, rsp_iov.iov_base);
1060 static int cifs_get_fattr(struct cifs_open_info_data *data,
1061 struct super_block *sb, int xid,
1062 const struct cifs_fid *fid,
1063 struct cifs_fattr *fattr,
1064 struct inode **inode,
1065 const char *full_path)
1067 struct cifs_open_info_data tmp_data = {};
1068 struct cifs_tcon *tcon;
1069 struct TCP_Server_Info *server;
1070 struct tcon_link *tlink;
1071 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1072 void *smb1_backup_rsp_buf = NULL;
1076 tlink = cifs_sb_tlink(cifs_sb);
1078 return PTR_ERR(tlink);
1079 tcon = tlink_tcon(tlink);
1080 server = tcon->ses->server;
1083 * 1. Fetch file metadata if not provided (data)
1087 rc = server->ops->query_path_info(xid, tcon, cifs_sb,
1088 full_path, &tmp_data);
1093 * 2. Convert it to internal cifs metadata (fattr)
1099 * If the file is a reparse point, it is more complicated
1100 * since we have to check if its reparse tag matches a known
1101 * special file type e.g. symlink or fifo or char etc.
1103 if (cifs_open_data_reparse(data)) {
1104 rc = reparse_info_to_fattr(data, sb, xid, tcon,
1107 cifs_open_info_to_fattr(fattr, data, sb);
1111 /* DFS link, no metadata available on this server */
1112 cifs_create_junction_fattr(fattr, sb);
1116 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1118 * perm errors, try again with backup flags if possible
1120 * For SMB2 and later the backup intent flag
1121 * is already sent if needed on open and there
1122 * is no path based FindFirst operation to use
1125 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
1126 /* for easier reading */
1128 FILE_DIRECTORY_INFO *fdi;
1129 SEARCH_ID_FULL_DIR_INFO *si;
1131 rc = cifs_backup_query_path_info(xid, tcon, sb,
1133 &smb1_backup_rsp_buf,
1138 move_cifs_info_to_smb2(&data->fi, fi);
1139 fdi = (FILE_DIRECTORY_INFO *)fi;
1140 si = (SEARCH_ID_FULL_DIR_INFO *)fi;
1142 cifs_dir_info_to_fattr(fattr, fdi, cifs_sb);
1143 fattr->cf_uniqueid = le64_to_cpu(si->UniqueId);
1144 /* uniqueid set, skip get inum step */
1145 goto handle_mnt_opt;
1147 /* nothing we can do, bail out */
1152 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1155 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1160 * 3. Get or update inode number (fattr->cf_uniqueid)
1163 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, fattr);
1166 * 4. Tweak fattr based on mount options
1168 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1170 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1171 /* query for SFU type info if supported and needed */
1172 if ((fattr->cf_cifsattrs & ATTR_SYSTEM) &&
1173 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)) {
1174 tmprc = cifs_sfu_type(fattr, full_path, cifs_sb, xid);
1176 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1179 /* fill in 0777 bits from ACL */
1180 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1181 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1182 true, full_path, fid);
1186 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1190 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1191 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1192 false, full_path, fid);
1196 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1202 /* fill in remaining high mode bits e.g. SUID, VTX */
1203 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1204 cifs_sfu_mode(fattr, full_path, cifs_sb, xid);
1206 /* check for Minshall+French symlinks */
1207 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1208 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1209 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1213 cifs_buf_release(smb1_backup_rsp_buf);
1214 cifs_put_tlink(tlink);
1215 cifs_free_open_info(&tmp_data);
1219 int cifs_get_inode_info(struct inode **inode,
1220 const char *full_path,
1221 struct cifs_open_info_data *data,
1222 struct super_block *sb, int xid,
1223 const struct cifs_fid *fid)
1225 struct cifs_fattr fattr = {};
1228 if (is_inode_cache_good(*inode)) {
1229 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1233 rc = cifs_get_fattr(data, sb, xid, fid, &fattr, inode, full_path);
1237 rc = update_inode_info(sb, &fattr, inode);
1239 kfree(fattr.cf_symlink_target);
1243 static int smb311_posix_get_fattr(struct cifs_fattr *fattr,
1244 const char *full_path,
1245 struct super_block *sb,
1246 const unsigned int xid)
1248 struct cifs_open_info_data data = {};
1249 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1250 struct cifs_tcon *tcon;
1251 struct tcon_link *tlink;
1252 struct cifs_sid owner, group;
1256 tlink = cifs_sb_tlink(cifs_sb);
1258 return PTR_ERR(tlink);
1259 tcon = tlink_tcon(tlink);
1262 * 1. Fetch file metadata
1265 rc = smb311_posix_query_path_info(xid, tcon, cifs_sb,
1270 * 2. Convert it to internal cifs metadata (fattr)
1275 smb311_posix_info_to_fattr(fattr, &data, &owner, &group, sb);
1278 /* DFS link, no metadata available on this server */
1279 cifs_create_junction_fattr(fattr, sb);
1284 * For SMB2 and later the backup intent flag
1285 * is already sent if needed on open and there
1286 * is no path based FindFirst operation to use
1287 * to retry with so nothing we can do, bail out
1291 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1296 * 3. Tweak fattr based on mount options
1298 /* check for Minshall+French symlinks */
1299 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1300 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1301 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1305 cifs_put_tlink(tlink);
1306 cifs_free_open_info(&data);
1310 int smb311_posix_get_inode_info(struct inode **inode, const char *full_path,
1311 struct super_block *sb, const unsigned int xid)
1313 struct cifs_fattr fattr = {};
1316 if (is_inode_cache_good(*inode)) {
1317 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1321 rc = smb311_posix_get_fattr(&fattr, full_path, sb, xid);
1325 rc = update_inode_info(sb, &fattr, inode);
1327 kfree(fattr.cf_symlink_target);
1331 static const struct inode_operations cifs_ipc_inode_ops = {
1332 .lookup = cifs_lookup,
1336 cifs_find_inode(struct inode *inode, void *opaque)
1338 struct cifs_fattr *fattr = opaque;
1340 /* don't match inode with different uniqueid */
1341 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1344 /* use createtime like an i_generation field */
1345 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1348 /* don't match inode of different type */
1349 if (inode_wrong_type(inode, fattr->cf_mode))
1352 /* if it's not a directory or has no dentries, then flag it */
1353 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1354 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1360 cifs_init_inode(struct inode *inode, void *opaque)
1362 struct cifs_fattr *fattr = opaque;
1364 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1365 CIFS_I(inode)->createtime = fattr->cf_createtime;
1370 * walk dentry list for an inode and report whether it has aliases that
1371 * are hashed. We use this to determine if a directory inode can actually
1375 inode_has_hashed_dentries(struct inode *inode)
1377 struct dentry *dentry;
1379 spin_lock(&inode->i_lock);
1380 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1381 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1382 spin_unlock(&inode->i_lock);
1386 spin_unlock(&inode->i_lock);
1390 /* Given fattrs, get a corresponding inode */
1392 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1395 struct inode *inode;
1398 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1400 /* hash down to 32-bits on 32-bit arch */
1401 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1403 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1405 /* was there a potentially problematic inode collision? */
1406 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1407 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1409 if (inode_has_hashed_dentries(inode)) {
1410 cifs_autodisable_serverino(CIFS_SB(sb));
1412 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1413 goto retry_iget5_locked;
1417 /* can't fail - see cifs_find_inode() */
1418 cifs_fattr_to_inode(inode, fattr);
1419 if (sb->s_flags & SB_NOATIME)
1420 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1421 if (inode->i_state & I_NEW) {
1422 inode->i_ino = hash;
1423 cifs_fscache_get_inode_cookie(inode);
1424 unlock_new_inode(inode);
1431 /* gets root inode */
1432 struct inode *cifs_root_iget(struct super_block *sb)
1434 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1435 struct cifs_fattr fattr = {};
1436 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1437 struct inode *inode = NULL;
1443 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1444 && cifs_sb->prepath) {
1445 len = strlen(cifs_sb->prepath);
1446 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1448 return ERR_PTR(-ENOMEM);
1450 memcpy(path+1, cifs_sb->prepath, len);
1452 path = kstrdup("", GFP_KERNEL);
1454 return ERR_PTR(-ENOMEM);
1458 if (tcon->unix_ext) {
1459 rc = cifs_get_unix_fattr(path, sb, &fattr, &inode, xid);
1460 /* some servers mistakenly claim POSIX support */
1461 if (rc != -EOPNOTSUPP)
1463 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1464 tcon->unix_ext = false;
1467 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1468 if (tcon->posix_extensions)
1469 rc = smb311_posix_get_fattr(&fattr, path, sb, xid);
1471 rc = cifs_get_fattr(NULL, sb, xid, NULL, &fattr, &inode, path);
1475 if (fattr.cf_flags & CIFS_FATTR_JUNCTION) {
1476 fattr.cf_flags &= ~CIFS_FATTR_JUNCTION;
1477 cifs_autodisable_serverino(cifs_sb);
1479 inode = cifs_iget(sb, &fattr);
1483 inode = ERR_PTR(rc);
1487 if (rc && tcon->pipe) {
1488 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1489 spin_lock(&inode->i_lock);
1490 inode->i_mode |= S_IFDIR;
1491 set_nlink(inode, 2);
1492 inode->i_op = &cifs_ipc_inode_ops;
1493 inode->i_fop = &simple_dir_operations;
1494 inode->i_uid = cifs_sb->ctx->linux_uid;
1495 inode->i_gid = cifs_sb->ctx->linux_gid;
1496 spin_unlock(&inode->i_lock);
1499 inode = ERR_PTR(rc);
1505 kfree(fattr.cf_symlink_target);
1510 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1511 const char *full_path, __u32 dosattr)
1513 bool set_time = false;
1514 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1515 struct TCP_Server_Info *server;
1516 FILE_BASIC_INFO info_buf;
1521 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1522 if (!server->ops->set_file_info)
1527 if (attrs->ia_valid & ATTR_ATIME) {
1529 info_buf.LastAccessTime =
1530 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1532 info_buf.LastAccessTime = 0;
1534 if (attrs->ia_valid & ATTR_MTIME) {
1536 info_buf.LastWriteTime =
1537 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1539 info_buf.LastWriteTime = 0;
1542 * Samba throws this field away, but windows may actually use it.
1543 * Do not set ctime unless other time stamps are changed explicitly
1544 * (i.e. by utimes()) since we would then have a mix of client and
1547 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1548 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1549 info_buf.ChangeTime =
1550 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1552 info_buf.ChangeTime = 0;
1554 info_buf.CreationTime = 0; /* don't change */
1555 info_buf.Attributes = cpu_to_le32(dosattr);
1557 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1560 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1562 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1563 * and rename it to a random name that hopefully won't conflict with
1567 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1568 const unsigned int xid)
1572 struct cifs_fid fid;
1573 struct cifs_open_parms oparms;
1574 struct inode *inode = d_inode(dentry);
1575 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1576 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1577 struct tcon_link *tlink;
1578 struct cifs_tcon *tcon;
1579 __u32 dosattr, origattr;
1580 FILE_BASIC_INFO *info_buf = NULL;
1582 tlink = cifs_sb_tlink(cifs_sb);
1584 return PTR_ERR(tlink);
1585 tcon = tlink_tcon(tlink);
1588 * We cannot rename the file if the server doesn't support
1589 * CAP_INFOLEVEL_PASSTHRU
1591 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1596 oparms = (struct cifs_open_parms) {
1599 .desired_access = DELETE | FILE_WRITE_ATTRIBUTES,
1600 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
1601 .disposition = FILE_OPEN,
1606 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1610 origattr = cifsInode->cifsAttrs;
1612 origattr |= ATTR_NORMAL;
1614 dosattr = origattr & ~ATTR_READONLY;
1616 dosattr |= ATTR_NORMAL;
1617 dosattr |= ATTR_HIDDEN;
1619 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1620 if (dosattr != origattr) {
1621 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1622 if (info_buf == NULL) {
1626 info_buf->Attributes = cpu_to_le32(dosattr);
1627 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1629 /* although we would like to mark the file hidden
1630 if that fails we will still try to rename it */
1632 cifsInode->cifsAttrs = dosattr;
1634 dosattr = origattr; /* since not able to change them */
1637 /* rename the file */
1638 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1640 cifs_remap(cifs_sb));
1646 /* try to set DELETE_ON_CLOSE */
1647 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1648 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1651 * some samba versions return -ENOENT when we try to set the
1652 * file disposition here. Likely a samba bug, but work around
1653 * it for now. This means that some cifsXXX files may hang
1654 * around after they shouldn't.
1656 * BB: remove this hack after more servers have the fix
1664 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1668 CIFSSMBClose(xid, tcon, fid.netfid);
1671 cifs_put_tlink(tlink);
1675 * reset everything back to the original state. Don't bother
1676 * dealing with errors here since we can't do anything about
1680 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1681 cifs_sb->local_nls, cifs_remap(cifs_sb));
1683 if (dosattr != origattr) {
1684 info_buf->Attributes = cpu_to_le32(origattr);
1685 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1687 cifsInode->cifsAttrs = origattr;
1692 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1694 /* copied from fs/nfs/dir.c with small changes */
1696 cifs_drop_nlink(struct inode *inode)
1698 spin_lock(&inode->i_lock);
1699 if (inode->i_nlink > 0)
1701 spin_unlock(&inode->i_lock);
1705 * If d_inode(dentry) is null (usually meaning the cached dentry
1706 * is a negative dentry) then we would attempt a standard SMB delete, but
1707 * if that fails we can not attempt the fall back mechanisms on EACCES
1708 * but will return the EACCES to the caller. Note that the VFS does not call
1709 * unlink on negative dentries currently.
1711 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1715 const char *full_path;
1717 struct inode *inode = d_inode(dentry);
1718 struct cifsInodeInfo *cifs_inode;
1719 struct super_block *sb = dir->i_sb;
1720 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1721 struct tcon_link *tlink;
1722 struct cifs_tcon *tcon;
1723 struct TCP_Server_Info *server;
1724 struct iattr *attrs = NULL;
1725 __u32 dosattr = 0, origattr = 0;
1727 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1729 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1732 tlink = cifs_sb_tlink(cifs_sb);
1734 return PTR_ERR(tlink);
1735 tcon = tlink_tcon(tlink);
1736 server = tcon->ses->server;
1739 page = alloc_dentry_path();
1741 if (tcon->nodelete) {
1746 /* Unlink can be called from rename so we can not take the
1747 * sb->s_vfs_rename_mutex here */
1748 full_path = build_path_from_dentry(dentry, page);
1749 if (IS_ERR(full_path)) {
1750 rc = PTR_ERR(full_path);
1754 cifs_close_deferred_file_under_dentry(tcon, full_path);
1755 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1756 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1757 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1758 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1759 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1760 cifs_remap(cifs_sb));
1761 cifs_dbg(FYI, "posix del rc %d\n", rc);
1762 if ((rc == 0) || (rc == -ENOENT))
1763 goto psx_del_no_retry;
1765 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1768 if (!server->ops->unlink) {
1770 goto psx_del_no_retry;
1773 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1778 cifs_drop_nlink(inode);
1779 } else if (rc == -ENOENT) {
1781 } else if (rc == -EBUSY) {
1782 if (server->ops->rename_pending_delete) {
1783 rc = server->ops->rename_pending_delete(full_path,
1786 cifs_drop_nlink(inode);
1788 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1789 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1790 if (attrs == NULL) {
1795 /* try to reset dos attributes */
1796 cifs_inode = CIFS_I(inode);
1797 origattr = cifs_inode->cifsAttrs;
1799 origattr |= ATTR_NORMAL;
1800 dosattr = origattr & ~ATTR_READONLY;
1802 dosattr |= ATTR_NORMAL;
1803 dosattr |= ATTR_HIDDEN;
1805 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1809 goto retry_std_delete;
1812 /* undo the setattr if we errored out and it's needed */
1813 if (rc != 0 && dosattr != 0)
1814 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1818 cifs_inode = CIFS_I(inode);
1819 cifs_inode->time = 0; /* will force revalidate to get info
1821 inode_set_ctime_current(inode);
1823 dir->i_mtime = inode_set_ctime_current(dir);
1824 cifs_inode = CIFS_I(dir);
1825 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1827 free_dentry_path(page);
1830 cifs_put_tlink(tlink);
1835 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1836 const char *full_path, struct cifs_sb_info *cifs_sb,
1837 struct cifs_tcon *tcon, const unsigned int xid)
1840 struct inode *inode = NULL;
1842 if (tcon->posix_extensions)
1843 rc = smb311_posix_get_inode_info(&inode, full_path, parent->i_sb, xid);
1844 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1845 else if (tcon->unix_ext)
1846 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1848 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1850 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1856 if (!S_ISDIR(inode->i_mode)) {
1858 * mkdir succeeded, but another client has managed to remove the
1859 * sucker and replace it with non-directory. Return success,
1860 * but don't leave the child in dcache.
1867 * setting nlink not necessary except in cases where we failed to get it
1868 * from the server or was set bogus. Also, since this is a brand new
1869 * inode, no need to grab the i_lock before setting the i_nlink.
1871 if (inode->i_nlink < 2)
1872 set_nlink(inode, 2);
1873 mode &= ~current_umask();
1874 /* must turn on setgid bit if parent dir has it */
1875 if (parent->i_mode & S_ISGID)
1878 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1879 if (tcon->unix_ext) {
1880 struct cifs_unix_set_info_args args = {
1882 .ctime = NO_CHANGE_64,
1883 .atime = NO_CHANGE_64,
1884 .mtime = NO_CHANGE_64,
1887 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1888 args.uid = current_fsuid();
1889 if (parent->i_mode & S_ISGID)
1890 args.gid = parent->i_gid;
1892 args.gid = current_fsgid();
1894 args.uid = INVALID_UID; /* no change */
1895 args.gid = INVALID_GID; /* no change */
1897 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1899 cifs_remap(cifs_sb));
1903 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1904 struct TCP_Server_Info *server = tcon->ses->server;
1905 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1906 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1907 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1909 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1910 inode->i_mode = (mode | S_IFDIR);
1912 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1913 inode->i_uid = current_fsuid();
1914 if (inode->i_mode & S_ISGID)
1915 inode->i_gid = parent->i_gid;
1917 inode->i_gid = current_fsgid();
1920 d_instantiate(dentry, inode);
1924 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1926 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1927 const char *full_path, struct cifs_sb_info *cifs_sb,
1928 struct cifs_tcon *tcon, const unsigned int xid)
1932 FILE_UNIX_BASIC_INFO *info = NULL;
1933 struct inode *newinode = NULL;
1934 struct cifs_fattr fattr;
1936 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1939 goto posix_mkdir_out;
1942 mode &= ~current_umask();
1943 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1944 NULL /* netfid */, info, &oplock, full_path,
1945 cifs_sb->local_nls, cifs_remap(cifs_sb));
1946 if (rc == -EOPNOTSUPP)
1947 goto posix_mkdir_out;
1949 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1951 goto posix_mkdir_out;
1954 if (info->Type == cpu_to_le32(-1))
1955 /* no return info, go query for it */
1956 goto posix_mkdir_get_info;
1958 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1959 * need to set uid/gid.
1962 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1963 cifs_fill_uniqueid(inode->i_sb, &fattr);
1964 newinode = cifs_iget(inode->i_sb, &fattr);
1966 goto posix_mkdir_get_info;
1968 d_instantiate(dentry, newinode);
1970 #ifdef CONFIG_CIFS_DEBUG2
1971 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1972 dentry, dentry, newinode);
1974 if (newinode->i_nlink != 2)
1975 cifs_dbg(FYI, "unexpected number of links %d\n",
1982 posix_mkdir_get_info:
1983 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1985 goto posix_mkdir_out;
1987 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1989 int cifs_mkdir(struct mnt_idmap *idmap, struct inode *inode,
1990 struct dentry *direntry, umode_t mode)
1994 struct cifs_sb_info *cifs_sb;
1995 struct tcon_link *tlink;
1996 struct cifs_tcon *tcon;
1997 struct TCP_Server_Info *server;
1998 const char *full_path;
2001 cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
2004 cifs_sb = CIFS_SB(inode->i_sb);
2005 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2007 tlink = cifs_sb_tlink(cifs_sb);
2009 return PTR_ERR(tlink);
2010 tcon = tlink_tcon(tlink);
2014 page = alloc_dentry_path();
2015 full_path = build_path_from_dentry(direntry, page);
2016 if (IS_ERR(full_path)) {
2017 rc = PTR_ERR(full_path);
2021 server = tcon->ses->server;
2023 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
2024 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
2026 d_drop(direntry); /* for time being always refresh inode info */
2030 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2031 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
2032 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
2033 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
2035 if (rc != -EOPNOTSUPP)
2038 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2040 if (!server->ops->mkdir) {
2045 /* BB add setting the equivalent of mode via CreateX w/ACLs */
2046 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
2048 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
2053 /* TODO: skip this for smb2/smb3 */
2054 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
2058 * Force revalidate to get parent dir info when needed since cached
2059 * attributes are invalid now.
2061 CIFS_I(inode)->time = 0;
2062 free_dentry_path(page);
2064 cifs_put_tlink(tlink);
2068 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
2072 struct cifs_sb_info *cifs_sb;
2073 struct tcon_link *tlink;
2074 struct cifs_tcon *tcon;
2075 struct TCP_Server_Info *server;
2076 const char *full_path;
2077 void *page = alloc_dentry_path();
2078 struct cifsInodeInfo *cifsInode;
2080 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
2084 full_path = build_path_from_dentry(direntry, page);
2085 if (IS_ERR(full_path)) {
2086 rc = PTR_ERR(full_path);
2090 cifs_sb = CIFS_SB(inode->i_sb);
2091 if (unlikely(cifs_forced_shutdown(cifs_sb))) {
2096 tlink = cifs_sb_tlink(cifs_sb);
2097 if (IS_ERR(tlink)) {
2098 rc = PTR_ERR(tlink);
2101 tcon = tlink_tcon(tlink);
2102 server = tcon->ses->server;
2104 if (!server->ops->rmdir) {
2106 cifs_put_tlink(tlink);
2110 if (tcon->nodelete) {
2112 cifs_put_tlink(tlink);
2116 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
2117 cifs_put_tlink(tlink);
2120 spin_lock(&d_inode(direntry)->i_lock);
2121 i_size_write(d_inode(direntry), 0);
2122 clear_nlink(d_inode(direntry));
2123 spin_unlock(&d_inode(direntry)->i_lock);
2126 cifsInode = CIFS_I(d_inode(direntry));
2127 /* force revalidate to go get info when needed */
2128 cifsInode->time = 0;
2130 cifsInode = CIFS_I(inode);
2132 * Force revalidate to get parent dir info when needed since cached
2133 * attributes are invalid now.
2135 cifsInode->time = 0;
2137 inode_set_ctime_current(d_inode(direntry));
2138 inode->i_mtime = inode_set_ctime_current(inode);
2141 free_dentry_path(page);
2147 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2148 const char *from_path, struct dentry *to_dentry,
2149 const char *to_path)
2151 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2152 struct tcon_link *tlink;
2153 struct cifs_tcon *tcon;
2154 struct TCP_Server_Info *server;
2155 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2156 struct cifs_fid fid;
2157 struct cifs_open_parms oparms;
2159 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2162 tlink = cifs_sb_tlink(cifs_sb);
2164 return PTR_ERR(tlink);
2165 tcon = tlink_tcon(tlink);
2166 server = tcon->ses->server;
2168 if (!server->ops->rename)
2171 /* try path-based rename first */
2172 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
2175 * Don't bother with rename by filehandle unless file is busy and
2176 * source. Note that cross directory moves do not work with
2177 * rename by filehandle to various Windows servers.
2179 if (rc == 0 || rc != -EBUSY)
2180 goto do_rename_exit;
2182 /* Don't fall back to using SMB on SMB 2+ mount */
2183 if (server->vals->protocol_id != 0)
2184 goto do_rename_exit;
2186 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2187 /* open-file renames don't work across directories */
2188 if (to_dentry->d_parent != from_dentry->d_parent)
2189 goto do_rename_exit;
2191 oparms = (struct cifs_open_parms) {
2194 /* open the file to be renamed -- we need DELETE perms */
2195 .desired_access = DELETE,
2196 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
2197 .disposition = FILE_OPEN,
2202 rc = CIFS_open(xid, &oparms, &oplock, NULL);
2204 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2205 (const char *) to_dentry->d_name.name,
2206 cifs_sb->local_nls, cifs_remap(cifs_sb));
2207 CIFSSMBClose(xid, tcon, fid.netfid);
2209 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2212 d_move(from_dentry, to_dentry);
2213 cifs_put_tlink(tlink);
2218 cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
2219 struct dentry *source_dentry, struct inode *target_dir,
2220 struct dentry *target_dentry, unsigned int flags)
2222 const char *from_name, *to_name;
2223 void *page1, *page2;
2224 struct cifs_sb_info *cifs_sb;
2225 struct tcon_link *tlink;
2226 struct cifs_tcon *tcon;
2229 int retry_count = 0;
2230 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2231 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2232 FILE_UNIX_BASIC_INFO *info_buf_target;
2233 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2235 if (flags & ~RENAME_NOREPLACE)
2238 cifs_sb = CIFS_SB(source_dir->i_sb);
2239 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2242 tlink = cifs_sb_tlink(cifs_sb);
2244 return PTR_ERR(tlink);
2245 tcon = tlink_tcon(tlink);
2247 page1 = alloc_dentry_path();
2248 page2 = alloc_dentry_path();
2251 from_name = build_path_from_dentry(source_dentry, page1);
2252 if (IS_ERR(from_name)) {
2253 rc = PTR_ERR(from_name);
2254 goto cifs_rename_exit;
2257 to_name = build_path_from_dentry(target_dentry, page2);
2258 if (IS_ERR(to_name)) {
2259 rc = PTR_ERR(to_name);
2260 goto cifs_rename_exit;
2263 cifs_close_deferred_file_under_dentry(tcon, from_name);
2264 if (d_inode(target_dentry) != NULL)
2265 cifs_close_deferred_file_under_dentry(tcon, to_name);
2267 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2270 if (rc == -EACCES) {
2271 while (retry_count < 3) {
2272 cifs_close_all_deferred_files(tcon);
2273 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2282 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2284 if (flags & RENAME_NOREPLACE)
2285 goto cifs_rename_exit;
2287 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2288 if (rc == -EEXIST && tcon->unix_ext) {
2290 * Are src and dst hardlinks of same inode? We can only tell
2291 * with unix extensions enabled.
2294 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2296 if (info_buf_source == NULL) {
2298 goto cifs_rename_exit;
2301 info_buf_target = info_buf_source + 1;
2302 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2305 cifs_remap(cifs_sb));
2309 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2312 cifs_remap(cifs_sb));
2314 if (tmprc == 0 && (info_buf_source->UniqueId ==
2315 info_buf_target->UniqueId)) {
2316 /* same file, POSIX says that this is a noop */
2318 goto cifs_rename_exit;
2322 * else ... BB we could add the same check for Windows by
2323 * checking the UniqueId via FILE_INTERNAL_INFO
2327 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2329 /* Try unlinking the target dentry if it's not negative */
2330 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2331 if (d_is_dir(target_dentry))
2332 tmprc = cifs_rmdir(target_dir, target_dentry);
2334 tmprc = cifs_unlink(target_dir, target_dentry);
2336 goto cifs_rename_exit;
2337 rc = cifs_do_rename(xid, source_dentry, from_name,
2338 target_dentry, to_name);
2341 /* force revalidate to go get info when needed */
2342 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2344 source_dir->i_mtime = target_dir->i_mtime = inode_set_ctime_to_ts(source_dir,
2345 inode_set_ctime_current(target_dir));
2348 kfree(info_buf_source);
2349 free_dentry_path(page2);
2350 free_dentry_path(page1);
2352 cifs_put_tlink(tlink);
2357 cifs_dentry_needs_reval(struct dentry *dentry)
2359 struct inode *inode = d_inode(dentry);
2360 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2361 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2362 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2363 struct cached_fid *cfid = NULL;
2365 if (cifs_i->time == 0)
2368 if (CIFS_CACHE_READ(cifs_i))
2371 if (!lookupCacheEnabled)
2374 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2375 spin_lock(&cfid->fid_lock);
2376 if (cfid->time && cifs_i->time > cfid->time) {
2377 spin_unlock(&cfid->fid_lock);
2378 close_cached_dir(cfid);
2381 spin_unlock(&cfid->fid_lock);
2382 close_cached_dir(cfid);
2385 * depending on inode type, check if attribute caching disabled for
2386 * files or directories
2388 if (S_ISDIR(inode->i_mode)) {
2389 if (!cifs_sb->ctx->acdirmax)
2391 if (!time_in_range(jiffies, cifs_i->time,
2392 cifs_i->time + cifs_sb->ctx->acdirmax))
2395 if (!cifs_sb->ctx->acregmax)
2397 if (!time_in_range(jiffies, cifs_i->time,
2398 cifs_i->time + cifs_sb->ctx->acregmax))
2402 /* hardlinked files w/ noserverino get "special" treatment */
2403 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2404 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2411 * Zap the cache. Called when invalid_mapping flag is set.
2414 cifs_invalidate_mapping(struct inode *inode)
2418 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2419 rc = invalidate_inode_pages2(inode->i_mapping);
2421 cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n",
2422 __func__, inode, rc);
2429 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2431 * @key: currently unused
2432 * @mode: the task state to sleep in
2435 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2438 if (signal_pending_state(mode, current))
2439 return -ERESTARTSYS;
2444 cifs_revalidate_mapping(struct inode *inode)
2447 unsigned long *flags = &CIFS_I(inode)->flags;
2448 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2450 /* swapfiles are not supposed to be shared */
2451 if (IS_SWAPFILE(inode))
2454 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2455 TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
2459 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2460 /* for cache=singleclient, do not invalidate */
2461 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2462 goto skip_invalidate;
2464 rc = cifs_invalidate_mapping(inode);
2466 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2470 clear_bit_unlock(CIFS_INO_LOCK, flags);
2471 smp_mb__after_atomic();
2472 wake_up_bit(flags, CIFS_INO_LOCK);
2478 cifs_zap_mapping(struct inode *inode)
2480 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2481 return cifs_revalidate_mapping(inode);
2484 int cifs_revalidate_file_attr(struct file *filp)
2487 struct dentry *dentry = file_dentry(filp);
2488 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2489 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2490 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2492 if (!cifs_dentry_needs_reval(dentry))
2495 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2496 if (tlink_tcon(cfile->tlink)->unix_ext)
2497 rc = cifs_get_file_info_unix(filp);
2499 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2500 rc = cifs_get_file_info(filp);
2505 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2509 struct inode *inode = d_inode(dentry);
2510 struct super_block *sb = dentry->d_sb;
2511 const char *full_path;
2518 if (!cifs_dentry_needs_reval(dentry))
2523 page = alloc_dentry_path();
2524 full_path = build_path_from_dentry(dentry, page);
2525 if (IS_ERR(full_path)) {
2526 rc = PTR_ERR(full_path);
2530 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2531 full_path, inode, inode->i_count.counter,
2532 dentry, cifs_get_time(dentry), jiffies);
2535 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2536 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2537 else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2538 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2540 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2542 if (rc == -EAGAIN && count++ < 10)
2545 free_dentry_path(page);
2551 int cifs_revalidate_file(struct file *filp)
2554 struct inode *inode = file_inode(filp);
2556 rc = cifs_revalidate_file_attr(filp);
2560 return cifs_revalidate_mapping(inode);
2563 /* revalidate a dentry's inode attributes */
2564 int cifs_revalidate_dentry(struct dentry *dentry)
2567 struct inode *inode = d_inode(dentry);
2569 rc = cifs_revalidate_dentry_attr(dentry);
2573 return cifs_revalidate_mapping(inode);
2576 int cifs_getattr(struct mnt_idmap *idmap, const struct path *path,
2577 struct kstat *stat, u32 request_mask, unsigned int flags)
2579 struct dentry *dentry = path->dentry;
2580 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2581 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2582 struct inode *inode = d_inode(dentry);
2585 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2589 * We need to be sure that all dirty pages are written and the server
2590 * has actual ctime, mtime and file length.
2592 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2593 !CIFS_CACHE_READ(CIFS_I(inode)) &&
2594 inode->i_mapping && inode->i_mapping->nrpages != 0) {
2595 rc = filemap_fdatawait(inode->i_mapping);
2597 mapping_set_error(inode->i_mapping, rc);
2602 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2603 CIFS_I(inode)->time = 0; /* force revalidate */
2606 * If the caller doesn't require syncing, only sync if
2607 * necessary (e.g. due to earlier truncate or setattr
2608 * invalidating the cached metadata)
2610 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2611 (CIFS_I(inode)->time == 0)) {
2612 rc = cifs_revalidate_dentry_attr(dentry);
2617 generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
2618 stat->blksize = cifs_sb->ctx->bsize;
2619 stat->ino = CIFS_I(inode)->uniqueid;
2621 /* old CIFS Unix Extensions doesn't return create time */
2622 if (CIFS_I(inode)->createtime) {
2623 stat->result_mask |= STATX_BTIME;
2625 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2628 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2629 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2630 stat->attributes |= STATX_ATTR_COMPRESSED;
2631 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2632 stat->attributes |= STATX_ATTR_ENCRYPTED;
2635 * If on a multiuser mount without unix extensions or cifsacl being
2636 * enabled, and the admin hasn't overridden them, set the ownership
2637 * to the fsuid/fsgid of the current process.
2639 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2640 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2642 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2643 stat->uid = current_fsuid();
2644 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2645 stat->gid = current_fsgid();
2650 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2653 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2654 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->netfs.inode.i_sb);
2655 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2656 struct TCP_Server_Info *server = tcon->ses->server;
2657 struct cifsFileInfo *cfile;
2660 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2664 * We need to be sure that all dirty pages are written as they
2665 * might fill holes on the server.
2667 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2668 inode->i_mapping->nrpages != 0) {
2669 rc = filemap_fdatawait(inode->i_mapping);
2671 mapping_set_error(inode->i_mapping, rc);
2676 cfile = find_readable_file(cifs_i, false);
2680 if (server->ops->fiemap) {
2681 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2682 cifsFileInfo_put(cfile);
2686 cifsFileInfo_put(cfile);
2690 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2692 pgoff_t index = from >> PAGE_SHIFT;
2693 unsigned offset = from & (PAGE_SIZE - 1);
2697 page = grab_cache_page(mapping, index);
2701 zero_user_segment(page, offset, PAGE_SIZE);
2707 void cifs_setsize(struct inode *inode, loff_t offset)
2709 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2711 spin_lock(&inode->i_lock);
2712 i_size_write(inode, offset);
2713 spin_unlock(&inode->i_lock);
2715 /* Cached inode must be refreshed on truncate */
2717 truncate_pagecache(inode, offset);
2721 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2722 unsigned int xid, const char *full_path)
2725 struct cifsFileInfo *open_file;
2726 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2727 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2728 struct tcon_link *tlink = NULL;
2729 struct cifs_tcon *tcon = NULL;
2730 struct TCP_Server_Info *server;
2733 * To avoid spurious oplock breaks from server, in the case of
2734 * inodes that we already have open, avoid doing path based
2735 * setting of file size if we can do it by handle.
2736 * This keeps our caching token (oplock) and avoids timeouts
2737 * when the local oplock break takes longer to flush
2738 * writebehind data than the SMB timeout for the SetPathInfo
2739 * request would allow
2741 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2743 tcon = tlink_tcon(open_file->tlink);
2744 server = tcon->ses->server;
2745 if (server->ops->set_file_size)
2746 rc = server->ops->set_file_size(xid, tcon, open_file,
2747 attrs->ia_size, false);
2750 cifsFileInfo_put(open_file);
2751 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2759 tlink = cifs_sb_tlink(cifs_sb);
2761 return PTR_ERR(tlink);
2762 tcon = tlink_tcon(tlink);
2763 server = tcon->ses->server;
2767 * Set file size by pathname rather than by handle either because no
2768 * valid, writeable file handle for it was found or because there was
2769 * an error setting it by handle.
2771 if (server->ops->set_path_size)
2772 rc = server->ops->set_path_size(xid, tcon, full_path,
2773 attrs->ia_size, cifs_sb, false);
2776 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2779 cifs_put_tlink(tlink);
2783 cifsInode->server_eof = attrs->ia_size;
2784 cifs_setsize(inode, attrs->ia_size);
2786 * i_blocks is not related to (i_size / i_blksize), but instead
2787 * 512 byte (2**9) size is required for calculating num blocks.
2788 * Until we can query the server for actual allocation size,
2789 * this is best estimate we have for blocks allocated for a file
2790 * Number of blocks must be rounded up so size 1 is not 0 blocks
2792 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2795 * The man page of truncate says if the size changed,
2796 * then the st_ctime and st_mtime fields for the file
2799 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2800 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2802 cifs_truncate_page(inode->i_mapping, inode->i_size);
2808 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2810 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2814 const char *full_path;
2815 void *page = alloc_dentry_path();
2816 struct inode *inode = d_inode(direntry);
2817 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2818 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2819 struct tcon_link *tlink;
2820 struct cifs_tcon *pTcon;
2821 struct cifs_unix_set_info_args *args = NULL;
2822 struct cifsFileInfo *open_file;
2824 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2825 direntry, attrs->ia_valid);
2829 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2830 attrs->ia_valid |= ATTR_FORCE;
2832 rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
2836 full_path = build_path_from_dentry(direntry, page);
2837 if (IS_ERR(full_path)) {
2838 rc = PTR_ERR(full_path);
2843 * Attempt to flush data before changing attributes. We need to do
2844 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2845 * ownership or mode then we may also need to do this. Here, we take
2846 * the safe way out and just do the flush on all setattr requests. If
2847 * the flush returns error, store it to report later and continue.
2849 * BB: This should be smarter. Why bother flushing pages that
2850 * will be truncated anyway? Also, should we error out here if
2851 * the flush returns error?
2853 rc = filemap_write_and_wait(inode->i_mapping);
2854 if (is_interrupt_error(rc)) {
2859 mapping_set_error(inode->i_mapping, rc);
2862 if (attrs->ia_valid & ATTR_SIZE) {
2863 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2868 /* skip mode change if it's just for clearing setuid/setgid */
2869 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2870 attrs->ia_valid &= ~ATTR_MODE;
2872 args = kmalloc(sizeof(*args), GFP_KERNEL);
2878 /* set up the struct */
2879 if (attrs->ia_valid & ATTR_MODE)
2880 args->mode = attrs->ia_mode;
2882 args->mode = NO_CHANGE_64;
2884 if (attrs->ia_valid & ATTR_UID)
2885 args->uid = attrs->ia_uid;
2887 args->uid = INVALID_UID; /* no change */
2889 if (attrs->ia_valid & ATTR_GID)
2890 args->gid = attrs->ia_gid;
2892 args->gid = INVALID_GID; /* no change */
2894 if (attrs->ia_valid & ATTR_ATIME)
2895 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2897 args->atime = NO_CHANGE_64;
2899 if (attrs->ia_valid & ATTR_MTIME)
2900 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2902 args->mtime = NO_CHANGE_64;
2904 if (attrs->ia_valid & ATTR_CTIME)
2905 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2907 args->ctime = NO_CHANGE_64;
2910 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2912 u16 nfid = open_file->fid.netfid;
2913 u32 npid = open_file->pid;
2914 pTcon = tlink_tcon(open_file->tlink);
2915 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2916 cifsFileInfo_put(open_file);
2918 tlink = cifs_sb_tlink(cifs_sb);
2919 if (IS_ERR(tlink)) {
2920 rc = PTR_ERR(tlink);
2923 pTcon = tlink_tcon(tlink);
2924 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2926 cifs_remap(cifs_sb));
2927 cifs_put_tlink(tlink);
2933 if ((attrs->ia_valid & ATTR_SIZE) &&
2934 attrs->ia_size != i_size_read(inode)) {
2935 truncate_setsize(inode, attrs->ia_size);
2936 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
2939 setattr_copy(&nop_mnt_idmap, inode, attrs);
2940 mark_inode_dirty(inode);
2942 /* force revalidate when any of these times are set since some
2943 of the fs types (eg ext3, fat) do not have fine enough
2944 time granularity to match protocol, and we do not have a
2945 a way (yet) to query the server fs's time granularity (and
2946 whether it rounds times down).
2948 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2949 cifsInode->time = 0;
2952 free_dentry_path(page);
2956 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2959 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2962 kuid_t uid = INVALID_UID;
2963 kgid_t gid = INVALID_GID;
2964 struct inode *inode = d_inode(direntry);
2965 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2966 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2967 struct cifsFileInfo *wfile;
2968 struct cifs_tcon *tcon;
2969 const char *full_path;
2970 void *page = alloc_dentry_path();
2973 __u64 mode = NO_CHANGE_64;
2977 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2978 direntry, attrs->ia_valid);
2980 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2981 attrs->ia_valid |= ATTR_FORCE;
2983 rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
2985 goto cifs_setattr_exit;
2987 full_path = build_path_from_dentry(direntry, page);
2988 if (IS_ERR(full_path)) {
2989 rc = PTR_ERR(full_path);
2990 goto cifs_setattr_exit;
2994 * Attempt to flush data before changing attributes. We need to do
2995 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
2996 * returns error, store it to report later and continue.
2998 * BB: This should be smarter. Why bother flushing pages that
2999 * will be truncated anyway? Also, should we error out here if
3000 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
3002 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
3003 rc = filemap_write_and_wait(inode->i_mapping);
3004 if (is_interrupt_error(rc)) {
3006 goto cifs_setattr_exit;
3008 mapping_set_error(inode->i_mapping, rc);
3013 if ((attrs->ia_valid & ATTR_MTIME) &&
3014 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
3015 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
3017 tcon = tlink_tcon(wfile->tlink);
3018 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
3019 cifsFileInfo_put(wfile);
3021 goto cifs_setattr_exit;
3022 } else if (rc != -EBADF)
3023 goto cifs_setattr_exit;
3028 if (attrs->ia_valid & ATTR_SIZE) {
3029 rc = cifs_set_file_size(inode, attrs, xid, full_path);
3031 goto cifs_setattr_exit;
3034 if (attrs->ia_valid & ATTR_UID)
3035 uid = attrs->ia_uid;
3037 if (attrs->ia_valid & ATTR_GID)
3038 gid = attrs->ia_gid;
3040 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3041 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3042 if (uid_valid(uid) || gid_valid(gid)) {
3043 mode = NO_CHANGE_64;
3044 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3047 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
3049 goto cifs_setattr_exit;
3053 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
3054 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
3056 /* skip mode change if it's just for clearing setuid/setgid */
3057 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
3058 attrs->ia_valid &= ~ATTR_MODE;
3060 if (attrs->ia_valid & ATTR_MODE) {
3061 mode = attrs->ia_mode;
3063 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3064 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3065 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3066 INVALID_UID, INVALID_GID);
3068 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
3070 goto cifs_setattr_exit;
3074 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
3075 * Pick up the actual mode bits that were set.
3077 if (mode != attrs->ia_mode)
3078 attrs->ia_mode = mode;
3080 if (((mode & S_IWUGO) == 0) &&
3081 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
3083 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
3085 /* fix up mode if we're not using dynperm */
3086 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
3087 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
3088 } else if ((mode & S_IWUGO) &&
3089 (cifsInode->cifsAttrs & ATTR_READONLY)) {
3091 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
3092 /* Attributes of 0 are ignored */
3094 dosattr |= ATTR_NORMAL;
3096 /* reset local inode permissions to normal */
3097 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3098 attrs->ia_mode &= ~(S_IALLUGO);
3099 if (S_ISDIR(inode->i_mode))
3101 cifs_sb->ctx->dir_mode;
3104 cifs_sb->ctx->file_mode;
3106 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3107 /* ignore mode change - ATTR_READONLY hasn't changed */
3108 attrs->ia_valid &= ~ATTR_MODE;
3112 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
3113 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
3114 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
3115 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
3117 /* Even if error on time set, no sense failing the call if
3118 the server would set the time to a reasonable value anyway,
3119 and this check ensures that we are not being called from
3120 sys_utimes in which case we ought to fail the call back to
3121 the user when the server rejects the call */
3122 if ((rc) && (attrs->ia_valid &
3123 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
3127 /* do not need local check to inode_check_ok since the server does
3130 goto cifs_setattr_exit;
3132 if ((attrs->ia_valid & ATTR_SIZE) &&
3133 attrs->ia_size != i_size_read(inode)) {
3134 truncate_setsize(inode, attrs->ia_size);
3135 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3138 setattr_copy(&nop_mnt_idmap, inode, attrs);
3139 mark_inode_dirty(inode);
3143 free_dentry_path(page);
3148 cifs_setattr(struct mnt_idmap *idmap, struct dentry *direntry,
3149 struct iattr *attrs)
3151 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
3152 int rc, retries = 0;
3153 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3154 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
3155 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3157 if (unlikely(cifs_forced_shutdown(cifs_sb)))
3161 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3162 if (pTcon->unix_ext)
3163 rc = cifs_setattr_unix(direntry, attrs);
3165 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3166 rc = cifs_setattr_nounix(direntry, attrs);
3168 } while (is_retryable_error(rc) && retries < 2);
3170 /* BB: add cifs_setattr_legacy for really old servers */