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;
596 fattr->cf_mode |= S_IFREG; /* file? */
597 fattr->cf_dtype = DT_REG;
601 fattr->cf_mode |= S_IFREG; /* then it is a file */
602 fattr->cf_dtype = DT_REG;
603 rc = -EOPNOTSUPP; /* or some unknown SFU type */
606 tcon->ses->server->ops->close(xid, tcon, &fid);
607 cifs_put_tlink(tlink);
611 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
614 * Fetch mode bits as provided by SFU.
616 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
618 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
619 struct cifs_sb_info *cifs_sb, unsigned int xid)
621 #ifdef CONFIG_CIFS_XATTR
625 struct tcon_link *tlink;
626 struct cifs_tcon *tcon;
628 tlink = cifs_sb_tlink(cifs_sb);
630 return PTR_ERR(tlink);
631 tcon = tlink_tcon(tlink);
633 if (tcon->ses->server->ops->query_all_EAs == NULL) {
634 cifs_put_tlink(tlink);
638 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
639 "SETFILEBITS", ea_value, 4 /* size of buf */,
641 cifs_put_tlink(tlink);
645 mode = le32_to_cpu(*((__le32 *)ea_value));
646 fattr->cf_mode &= ~SFBITS_MASK;
647 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
648 mode, fattr->cf_mode);
649 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
650 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
659 /* Fill a cifs_fattr struct with info from POSIX info struct */
660 static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr,
661 struct cifs_open_info_data *data,
662 struct cifs_sid *owner,
663 struct cifs_sid *group,
664 struct super_block *sb)
666 struct smb311_posix_qinfo *info = &data->posix_fi;
667 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
668 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
670 memset(fattr, 0, sizeof(*fattr));
672 /* no fattr->flags to set */
673 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
674 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
676 if (info->LastAccessTime)
677 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
679 ktime_get_coarse_real_ts64(&fattr->cf_atime);
681 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
682 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
684 if (data->adjust_tz) {
685 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
686 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
689 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
690 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
691 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
693 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
694 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
695 /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
696 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
699 fattr->cf_mode |= S_IFLNK;
700 fattr->cf_dtype = DT_LNK;
701 fattr->cf_symlink_target = data->symlink_target;
702 data->symlink_target = NULL;
703 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
704 fattr->cf_mode |= S_IFDIR;
705 fattr->cf_dtype = DT_DIR;
707 fattr->cf_mode |= S_IFREG;
708 fattr->cf_dtype = DT_REG;
710 /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
712 sid_to_id(cifs_sb, owner, fattr, SIDOWNER);
713 sid_to_id(cifs_sb, group, fattr, SIDGROUP);
715 cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
716 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
719 bool cifs_reparse_point_to_fattr(struct cifs_sb_info *cifs_sb,
720 struct cifs_fattr *fattr,
724 case IO_REPARSE_TAG_LX_SYMLINK:
725 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
726 fattr->cf_dtype = DT_LNK;
728 case IO_REPARSE_TAG_LX_FIFO:
729 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
730 fattr->cf_dtype = DT_FIFO;
732 case IO_REPARSE_TAG_AF_UNIX:
733 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
734 fattr->cf_dtype = DT_SOCK;
736 case IO_REPARSE_TAG_LX_CHR:
737 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
738 fattr->cf_dtype = DT_CHR;
740 case IO_REPARSE_TAG_LX_BLK:
741 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
742 fattr->cf_dtype = DT_BLK;
744 case 0: /* SMB1 symlink */
745 case IO_REPARSE_TAG_SYMLINK:
746 case IO_REPARSE_TAG_NFS:
747 fattr->cf_mode = S_IFLNK;
748 fattr->cf_dtype = DT_LNK;
756 static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
757 struct cifs_open_info_data *data,
758 struct super_block *sb)
760 struct smb2_file_all_info *info = &data->fi;
761 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
762 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
764 memset(fattr, 0, sizeof(*fattr));
765 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
766 if (info->DeletePending)
767 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
769 if (info->LastAccessTime)
770 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
772 ktime_get_coarse_real_ts64(&fattr->cf_atime);
774 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
775 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
777 if (data->adjust_tz) {
778 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
779 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
782 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
783 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
784 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
785 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
787 if (cifs_open_data_reparse(data) &&
788 cifs_reparse_point_to_fattr(cifs_sb, fattr, data->reparse_tag))
791 if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
792 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
793 fattr->cf_dtype = DT_DIR;
795 * Server can return wrong NumberOfLinks value for directories
796 * when Unix extensions are disabled - fake it.
799 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
801 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
802 fattr->cf_dtype = DT_REG;
804 /* clear write bits if ATTR_READONLY is set */
805 if (fattr->cf_cifsattrs & ATTR_READONLY)
806 fattr->cf_mode &= ~(S_IWUGO);
809 * Don't accept zero nlink from non-unix servers unless
810 * delete is pending. Instead mark it as unknown.
812 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
813 !info->DeletePending) {
814 cifs_dbg(VFS, "bogus file nlink value %u\n",
816 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
821 if (S_ISLNK(fattr->cf_mode)) {
822 fattr->cf_symlink_target = data->symlink_target;
823 data->symlink_target = NULL;
826 fattr->cf_uid = cifs_sb->ctx->linux_uid;
827 fattr->cf_gid = cifs_sb->ctx->linux_gid;
831 cifs_get_file_info(struct file *filp)
835 struct cifs_open_info_data data = {};
836 struct cifs_fattr fattr;
837 struct inode *inode = file_inode(filp);
838 struct cifsFileInfo *cfile = filp->private_data;
839 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
840 struct TCP_Server_Info *server = tcon->ses->server;
842 if (!server->ops->query_file_info)
846 rc = server->ops->query_file_info(xid, tcon, cfile, &data);
849 /* TODO: add support to query reparse tag */
850 data.adjust_tz = false;
851 if (data.symlink_target) {
853 data.reparse_tag = IO_REPARSE_TAG_SYMLINK;
855 cifs_open_info_to_fattr(&fattr, &data, inode->i_sb);
858 cifs_create_junction_fattr(&fattr, inode->i_sb);
864 * FIXME: legacy server -- fall back to path-based call?
865 * for now, just skip revalidating and mark inode for
869 CIFS_I(inode)->time = 0;
876 * don't bother with SFU junk here -- just mark inode as needing
879 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
880 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
881 /* if filetype is different, return error */
882 rc = cifs_fattr_to_inode(inode, &fattr);
884 cifs_free_open_info(&data);
889 /* Simple function to return a 64 bit hash of string. Rarely called */
890 static __u64 simple_hashstr(const char *str)
892 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
896 hash = (hash + (__u64) *str++) * hash_mult;
901 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
903 * cifs_backup_query_path_info - SMB1 fallback code to get ino
905 * Fallback code to get file metadata when we don't have access to
906 * full_path (EACCES) and have backup creds.
908 * @xid: transaction id used to identify original request in logs
909 * @tcon: information about the server share we have mounted
910 * @sb: the superblock stores info such as disk space available
911 * @full_path: name of the file we are getting the metadata for
912 * @resp_buf: will be set to cifs resp buf and needs to be freed with
913 * cifs_buf_release() when done with @data
914 * @data: will be set to search info result buffer
917 cifs_backup_query_path_info(int xid,
918 struct cifs_tcon *tcon,
919 struct super_block *sb,
920 const char *full_path,
922 FILE_ALL_INFO **data)
924 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
925 struct cifs_search_info info = {0};
930 info.endOfSearch = false;
932 info.info_level = SMB_FIND_FILE_UNIX;
933 else if ((tcon->ses->capabilities &
934 tcon->ses->server->vals->cap_nt_find) == 0)
935 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
936 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
937 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
938 else /* no srvino useful for fallback to some netapp */
939 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
941 flags = CIFS_SEARCH_CLOSE_ALWAYS |
942 CIFS_SEARCH_CLOSE_AT_END |
943 CIFS_SEARCH_BACKUP_SEARCH;
945 rc = CIFSFindFirst(xid, tcon, full_path,
946 cifs_sb, NULL, flags, &info, false);
950 *resp_buf = (void *)info.ntwrk_buf_start;
951 *data = (FILE_ALL_INFO *)info.srch_entries_start;
954 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
956 static void cifs_set_fattr_ino(int xid, struct cifs_tcon *tcon, struct super_block *sb,
957 struct inode **inode, const char *full_path,
958 struct cifs_open_info_data *data, struct cifs_fattr *fattr)
960 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
961 struct TCP_Server_Info *server = tcon->ses->server;
964 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
966 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
968 fattr->cf_uniqueid = iunique(sb, ROOT_I);
973 * If we have an inode pass a NULL tcon to ensure we don't
974 * make a round trip to the server. This only works for SMB2+.
976 rc = server->ops->get_srv_inum(xid, *inode ? NULL : tcon, cifs_sb, full_path,
977 &fattr->cf_uniqueid, data);
980 * If that fails reuse existing ino or generate one
981 * and disable server ones
984 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
986 fattr->cf_uniqueid = iunique(sb, ROOT_I);
987 cifs_autodisable_serverino(cifs_sb);
992 /* If no errors, check for zero root inode (invalid) */
993 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
994 cifs_dbg(FYI, "Invalid (0) inodenum\n");
997 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
999 /* make an ino by hashing the UNC */
1000 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
1001 fattr->cf_uniqueid = simple_hashstr(tcon->tree_name);
1006 static inline bool is_inode_cache_good(struct inode *ino)
1008 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
1011 static int reparse_info_to_fattr(struct cifs_open_info_data *data,
1012 struct super_block *sb,
1013 const unsigned int xid,
1014 struct cifs_tcon *tcon,
1015 const char *full_path,
1016 struct cifs_fattr *fattr)
1018 struct TCP_Server_Info *server = tcon->ses->server;
1019 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1020 struct kvec rsp_iov, *iov = NULL;
1021 int rsp_buftype = CIFS_NO_BUFFER;
1022 u32 tag = data->reparse_tag;
1025 if (!tag && server->ops->query_reparse_point) {
1026 rc = server->ops->query_reparse_point(xid, tcon, cifs_sb,
1028 &rsp_iov, &rsp_buftype);
1032 switch ((data->reparse_tag = tag)) {
1033 case 0: /* SMB1 symlink */
1036 case IO_REPARSE_TAG_NFS:
1037 case IO_REPARSE_TAG_SYMLINK:
1038 if (!data->symlink_target && server->ops->query_symlink) {
1039 rc = server->ops->query_symlink(xid, tcon,
1041 &data->symlink_target,
1045 case IO_REPARSE_TAG_MOUNT_POINT:
1046 cifs_create_junction_fattr(fattr, sb);
1050 cifs_open_info_to_fattr(fattr, data, sb);
1052 free_rsp_buf(rsp_buftype, rsp_iov.iov_base);
1056 static int cifs_get_fattr(struct cifs_open_info_data *data,
1057 struct super_block *sb, int xid,
1058 const struct cifs_fid *fid,
1059 struct cifs_fattr *fattr,
1060 struct inode **inode,
1061 const char *full_path)
1063 struct cifs_open_info_data tmp_data = {};
1064 struct cifs_tcon *tcon;
1065 struct TCP_Server_Info *server;
1066 struct tcon_link *tlink;
1067 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1068 void *smb1_backup_rsp_buf = NULL;
1072 tlink = cifs_sb_tlink(cifs_sb);
1074 return PTR_ERR(tlink);
1075 tcon = tlink_tcon(tlink);
1076 server = tcon->ses->server;
1079 * 1. Fetch file metadata if not provided (data)
1083 rc = server->ops->query_path_info(xid, tcon, cifs_sb,
1084 full_path, &tmp_data);
1089 * 2. Convert it to internal cifs metadata (fattr)
1095 * If the file is a reparse point, it is more complicated
1096 * since we have to check if its reparse tag matches a known
1097 * special file type e.g. symlink or fifo or char etc.
1099 if (cifs_open_data_reparse(data)) {
1100 rc = reparse_info_to_fattr(data, sb, xid, tcon,
1103 cifs_open_info_to_fattr(fattr, data, sb);
1107 /* DFS link, no metadata available on this server */
1108 cifs_create_junction_fattr(fattr, sb);
1112 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1114 * perm errors, try again with backup flags if possible
1116 * For SMB2 and later the backup intent flag
1117 * is already sent if needed on open and there
1118 * is no path based FindFirst operation to use
1121 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
1122 /* for easier reading */
1124 FILE_DIRECTORY_INFO *fdi;
1125 SEARCH_ID_FULL_DIR_INFO *si;
1127 rc = cifs_backup_query_path_info(xid, tcon, sb,
1129 &smb1_backup_rsp_buf,
1134 move_cifs_info_to_smb2(&data->fi, fi);
1135 fdi = (FILE_DIRECTORY_INFO *)fi;
1136 si = (SEARCH_ID_FULL_DIR_INFO *)fi;
1138 cifs_dir_info_to_fattr(fattr, fdi, cifs_sb);
1139 fattr->cf_uniqueid = le64_to_cpu(si->UniqueId);
1140 /* uniqueid set, skip get inum step */
1141 goto handle_mnt_opt;
1143 /* nothing we can do, bail out */
1148 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1151 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1156 * 3. Get or update inode number (fattr->cf_uniqueid)
1159 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, fattr);
1162 * 4. Tweak fattr based on mount options
1164 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1166 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1167 /* query for SFU type info if supported and needed */
1168 if ((fattr->cf_cifsattrs & ATTR_SYSTEM) &&
1169 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)) {
1170 tmprc = cifs_sfu_type(fattr, full_path, cifs_sb, xid);
1172 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1175 /* fill in 0777 bits from ACL */
1176 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1177 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1178 true, full_path, fid);
1182 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1186 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1187 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1188 false, full_path, fid);
1192 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1198 /* fill in remaining high mode bits e.g. SUID, VTX */
1199 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1200 cifs_sfu_mode(fattr, full_path, cifs_sb, xid);
1202 /* check for Minshall+French symlinks */
1203 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1204 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1205 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1209 cifs_buf_release(smb1_backup_rsp_buf);
1210 cifs_put_tlink(tlink);
1211 cifs_free_open_info(&tmp_data);
1215 int cifs_get_inode_info(struct inode **inode,
1216 const char *full_path,
1217 struct cifs_open_info_data *data,
1218 struct super_block *sb, int xid,
1219 const struct cifs_fid *fid)
1221 struct cifs_fattr fattr = {};
1224 if (is_inode_cache_good(*inode)) {
1225 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1229 rc = cifs_get_fattr(data, sb, xid, fid, &fattr, inode, full_path);
1233 rc = update_inode_info(sb, &fattr, inode);
1235 kfree(fattr.cf_symlink_target);
1239 static int smb311_posix_get_fattr(struct cifs_fattr *fattr,
1240 const char *full_path,
1241 struct super_block *sb,
1242 const unsigned int xid)
1244 struct cifs_open_info_data data = {};
1245 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1246 struct cifs_tcon *tcon;
1247 struct tcon_link *tlink;
1248 struct cifs_sid owner, group;
1252 tlink = cifs_sb_tlink(cifs_sb);
1254 return PTR_ERR(tlink);
1255 tcon = tlink_tcon(tlink);
1258 * 1. Fetch file metadata
1261 rc = smb311_posix_query_path_info(xid, tcon, cifs_sb,
1266 * 2. Convert it to internal cifs metadata (fattr)
1271 smb311_posix_info_to_fattr(fattr, &data, &owner, &group, sb);
1274 /* DFS link, no metadata available on this server */
1275 cifs_create_junction_fattr(fattr, sb);
1280 * For SMB2 and later the backup intent flag
1281 * is already sent if needed on open and there
1282 * is no path based FindFirst operation to use
1283 * to retry with so nothing we can do, bail out
1287 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1292 * 3. Tweak fattr based on mount options
1294 /* check for Minshall+French symlinks */
1295 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1296 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1297 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1301 cifs_put_tlink(tlink);
1302 cifs_free_open_info(&data);
1306 int smb311_posix_get_inode_info(struct inode **inode, const char *full_path,
1307 struct super_block *sb, const unsigned int xid)
1309 struct cifs_fattr fattr = {};
1312 if (is_inode_cache_good(*inode)) {
1313 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1317 rc = smb311_posix_get_fattr(&fattr, full_path, sb, xid);
1321 rc = update_inode_info(sb, &fattr, inode);
1323 kfree(fattr.cf_symlink_target);
1327 static const struct inode_operations cifs_ipc_inode_ops = {
1328 .lookup = cifs_lookup,
1332 cifs_find_inode(struct inode *inode, void *opaque)
1334 struct cifs_fattr *fattr = opaque;
1336 /* don't match inode with different uniqueid */
1337 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1340 /* use createtime like an i_generation field */
1341 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1344 /* don't match inode of different type */
1345 if (inode_wrong_type(inode, fattr->cf_mode))
1348 /* if it's not a directory or has no dentries, then flag it */
1349 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1350 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1356 cifs_init_inode(struct inode *inode, void *opaque)
1358 struct cifs_fattr *fattr = opaque;
1360 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1361 CIFS_I(inode)->createtime = fattr->cf_createtime;
1366 * walk dentry list for an inode and report whether it has aliases that
1367 * are hashed. We use this to determine if a directory inode can actually
1371 inode_has_hashed_dentries(struct inode *inode)
1373 struct dentry *dentry;
1375 spin_lock(&inode->i_lock);
1376 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1377 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1378 spin_unlock(&inode->i_lock);
1382 spin_unlock(&inode->i_lock);
1386 /* Given fattrs, get a corresponding inode */
1388 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1391 struct inode *inode;
1394 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1396 /* hash down to 32-bits on 32-bit arch */
1397 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1399 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1401 /* was there a potentially problematic inode collision? */
1402 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1403 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1405 if (inode_has_hashed_dentries(inode)) {
1406 cifs_autodisable_serverino(CIFS_SB(sb));
1408 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1409 goto retry_iget5_locked;
1413 /* can't fail - see cifs_find_inode() */
1414 cifs_fattr_to_inode(inode, fattr);
1415 if (sb->s_flags & SB_NOATIME)
1416 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1417 if (inode->i_state & I_NEW) {
1418 inode->i_ino = hash;
1419 cifs_fscache_get_inode_cookie(inode);
1420 unlock_new_inode(inode);
1427 /* gets root inode */
1428 struct inode *cifs_root_iget(struct super_block *sb)
1430 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1431 struct cifs_fattr fattr = {};
1432 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1433 struct inode *inode = NULL;
1439 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1440 && cifs_sb->prepath) {
1441 len = strlen(cifs_sb->prepath);
1442 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1444 return ERR_PTR(-ENOMEM);
1446 memcpy(path+1, cifs_sb->prepath, len);
1448 path = kstrdup("", GFP_KERNEL);
1450 return ERR_PTR(-ENOMEM);
1454 if (tcon->unix_ext) {
1455 rc = cifs_get_unix_fattr(path, sb, &fattr, &inode, xid);
1456 /* some servers mistakenly claim POSIX support */
1457 if (rc != -EOPNOTSUPP)
1459 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1460 tcon->unix_ext = false;
1463 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1464 if (tcon->posix_extensions)
1465 rc = smb311_posix_get_fattr(&fattr, path, sb, xid);
1467 rc = cifs_get_fattr(NULL, sb, xid, NULL, &fattr, &inode, path);
1471 if (fattr.cf_flags & CIFS_FATTR_JUNCTION) {
1472 fattr.cf_flags &= ~CIFS_FATTR_JUNCTION;
1473 cifs_autodisable_serverino(cifs_sb);
1475 inode = cifs_iget(sb, &fattr);
1479 inode = ERR_PTR(rc);
1483 if (rc && tcon->pipe) {
1484 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1485 spin_lock(&inode->i_lock);
1486 inode->i_mode |= S_IFDIR;
1487 set_nlink(inode, 2);
1488 inode->i_op = &cifs_ipc_inode_ops;
1489 inode->i_fop = &simple_dir_operations;
1490 inode->i_uid = cifs_sb->ctx->linux_uid;
1491 inode->i_gid = cifs_sb->ctx->linux_gid;
1492 spin_unlock(&inode->i_lock);
1495 inode = ERR_PTR(rc);
1501 kfree(fattr.cf_symlink_target);
1506 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1507 const char *full_path, __u32 dosattr)
1509 bool set_time = false;
1510 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1511 struct TCP_Server_Info *server;
1512 FILE_BASIC_INFO info_buf;
1517 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1518 if (!server->ops->set_file_info)
1523 if (attrs->ia_valid & ATTR_ATIME) {
1525 info_buf.LastAccessTime =
1526 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1528 info_buf.LastAccessTime = 0;
1530 if (attrs->ia_valid & ATTR_MTIME) {
1532 info_buf.LastWriteTime =
1533 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1535 info_buf.LastWriteTime = 0;
1538 * Samba throws this field away, but windows may actually use it.
1539 * Do not set ctime unless other time stamps are changed explicitly
1540 * (i.e. by utimes()) since we would then have a mix of client and
1543 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1544 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1545 info_buf.ChangeTime =
1546 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1548 info_buf.ChangeTime = 0;
1550 info_buf.CreationTime = 0; /* don't change */
1551 info_buf.Attributes = cpu_to_le32(dosattr);
1553 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1556 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1558 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1559 * and rename it to a random name that hopefully won't conflict with
1563 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1564 const unsigned int xid)
1568 struct cifs_fid fid;
1569 struct cifs_open_parms oparms;
1570 struct inode *inode = d_inode(dentry);
1571 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1572 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1573 struct tcon_link *tlink;
1574 struct cifs_tcon *tcon;
1575 __u32 dosattr, origattr;
1576 FILE_BASIC_INFO *info_buf = NULL;
1578 tlink = cifs_sb_tlink(cifs_sb);
1580 return PTR_ERR(tlink);
1581 tcon = tlink_tcon(tlink);
1584 * We cannot rename the file if the server doesn't support
1585 * CAP_INFOLEVEL_PASSTHRU
1587 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1592 oparms = (struct cifs_open_parms) {
1595 .desired_access = DELETE | FILE_WRITE_ATTRIBUTES,
1596 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
1597 .disposition = FILE_OPEN,
1602 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1606 origattr = cifsInode->cifsAttrs;
1608 origattr |= ATTR_NORMAL;
1610 dosattr = origattr & ~ATTR_READONLY;
1612 dosattr |= ATTR_NORMAL;
1613 dosattr |= ATTR_HIDDEN;
1615 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1616 if (dosattr != origattr) {
1617 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1618 if (info_buf == NULL) {
1622 info_buf->Attributes = cpu_to_le32(dosattr);
1623 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1625 /* although we would like to mark the file hidden
1626 if that fails we will still try to rename it */
1628 cifsInode->cifsAttrs = dosattr;
1630 dosattr = origattr; /* since not able to change them */
1633 /* rename the file */
1634 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1636 cifs_remap(cifs_sb));
1642 /* try to set DELETE_ON_CLOSE */
1643 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1644 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1647 * some samba versions return -ENOENT when we try to set the
1648 * file disposition here. Likely a samba bug, but work around
1649 * it for now. This means that some cifsXXX files may hang
1650 * around after they shouldn't.
1652 * BB: remove this hack after more servers have the fix
1660 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1664 CIFSSMBClose(xid, tcon, fid.netfid);
1667 cifs_put_tlink(tlink);
1671 * reset everything back to the original state. Don't bother
1672 * dealing with errors here since we can't do anything about
1676 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1677 cifs_sb->local_nls, cifs_remap(cifs_sb));
1679 if (dosattr != origattr) {
1680 info_buf->Attributes = cpu_to_le32(origattr);
1681 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1683 cifsInode->cifsAttrs = origattr;
1688 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1690 /* copied from fs/nfs/dir.c with small changes */
1692 cifs_drop_nlink(struct inode *inode)
1694 spin_lock(&inode->i_lock);
1695 if (inode->i_nlink > 0)
1697 spin_unlock(&inode->i_lock);
1701 * If d_inode(dentry) is null (usually meaning the cached dentry
1702 * is a negative dentry) then we would attempt a standard SMB delete, but
1703 * if that fails we can not attempt the fall back mechanisms on EACCES
1704 * but will return the EACCES to the caller. Note that the VFS does not call
1705 * unlink on negative dentries currently.
1707 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1711 const char *full_path;
1713 struct inode *inode = d_inode(dentry);
1714 struct cifsInodeInfo *cifs_inode;
1715 struct super_block *sb = dir->i_sb;
1716 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1717 struct tcon_link *tlink;
1718 struct cifs_tcon *tcon;
1719 struct TCP_Server_Info *server;
1720 struct iattr *attrs = NULL;
1721 __u32 dosattr = 0, origattr = 0;
1723 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1725 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1728 tlink = cifs_sb_tlink(cifs_sb);
1730 return PTR_ERR(tlink);
1731 tcon = tlink_tcon(tlink);
1732 server = tcon->ses->server;
1735 page = alloc_dentry_path();
1737 if (tcon->nodelete) {
1742 /* Unlink can be called from rename so we can not take the
1743 * sb->s_vfs_rename_mutex here */
1744 full_path = build_path_from_dentry(dentry, page);
1745 if (IS_ERR(full_path)) {
1746 rc = PTR_ERR(full_path);
1750 cifs_close_deferred_file_under_dentry(tcon, full_path);
1751 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1752 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1753 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1754 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1755 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1756 cifs_remap(cifs_sb));
1757 cifs_dbg(FYI, "posix del rc %d\n", rc);
1758 if ((rc == 0) || (rc == -ENOENT))
1759 goto psx_del_no_retry;
1761 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1764 if (!server->ops->unlink) {
1766 goto psx_del_no_retry;
1769 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1774 cifs_drop_nlink(inode);
1775 } else if (rc == -ENOENT) {
1777 } else if (rc == -EBUSY) {
1778 if (server->ops->rename_pending_delete) {
1779 rc = server->ops->rename_pending_delete(full_path,
1782 cifs_drop_nlink(inode);
1784 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1785 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1786 if (attrs == NULL) {
1791 /* try to reset dos attributes */
1792 cifs_inode = CIFS_I(inode);
1793 origattr = cifs_inode->cifsAttrs;
1795 origattr |= ATTR_NORMAL;
1796 dosattr = origattr & ~ATTR_READONLY;
1798 dosattr |= ATTR_NORMAL;
1799 dosattr |= ATTR_HIDDEN;
1801 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1805 goto retry_std_delete;
1808 /* undo the setattr if we errored out and it's needed */
1809 if (rc != 0 && dosattr != 0)
1810 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1814 cifs_inode = CIFS_I(inode);
1815 cifs_inode->time = 0; /* will force revalidate to get info
1817 inode_set_ctime_current(inode);
1819 dir->i_mtime = inode_set_ctime_current(dir);
1820 cifs_inode = CIFS_I(dir);
1821 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1823 free_dentry_path(page);
1826 cifs_put_tlink(tlink);
1831 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1832 const char *full_path, struct cifs_sb_info *cifs_sb,
1833 struct cifs_tcon *tcon, const unsigned int xid)
1836 struct inode *inode = NULL;
1838 if (tcon->posix_extensions)
1839 rc = smb311_posix_get_inode_info(&inode, full_path, parent->i_sb, xid);
1840 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1841 else if (tcon->unix_ext)
1842 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1844 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1846 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1852 if (!S_ISDIR(inode->i_mode)) {
1854 * mkdir succeeded, but another client has managed to remove the
1855 * sucker and replace it with non-directory. Return success,
1856 * but don't leave the child in dcache.
1863 * setting nlink not necessary except in cases where we failed to get it
1864 * from the server or was set bogus. Also, since this is a brand new
1865 * inode, no need to grab the i_lock before setting the i_nlink.
1867 if (inode->i_nlink < 2)
1868 set_nlink(inode, 2);
1869 mode &= ~current_umask();
1870 /* must turn on setgid bit if parent dir has it */
1871 if (parent->i_mode & S_ISGID)
1874 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1875 if (tcon->unix_ext) {
1876 struct cifs_unix_set_info_args args = {
1878 .ctime = NO_CHANGE_64,
1879 .atime = NO_CHANGE_64,
1880 .mtime = NO_CHANGE_64,
1883 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1884 args.uid = current_fsuid();
1885 if (parent->i_mode & S_ISGID)
1886 args.gid = parent->i_gid;
1888 args.gid = current_fsgid();
1890 args.uid = INVALID_UID; /* no change */
1891 args.gid = INVALID_GID; /* no change */
1893 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1895 cifs_remap(cifs_sb));
1899 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1900 struct TCP_Server_Info *server = tcon->ses->server;
1901 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1902 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1903 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1905 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1906 inode->i_mode = (mode | S_IFDIR);
1908 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1909 inode->i_uid = current_fsuid();
1910 if (inode->i_mode & S_ISGID)
1911 inode->i_gid = parent->i_gid;
1913 inode->i_gid = current_fsgid();
1916 d_instantiate(dentry, inode);
1920 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1922 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1923 const char *full_path, struct cifs_sb_info *cifs_sb,
1924 struct cifs_tcon *tcon, const unsigned int xid)
1928 FILE_UNIX_BASIC_INFO *info = NULL;
1929 struct inode *newinode = NULL;
1930 struct cifs_fattr fattr;
1932 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1935 goto posix_mkdir_out;
1938 mode &= ~current_umask();
1939 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1940 NULL /* netfid */, info, &oplock, full_path,
1941 cifs_sb->local_nls, cifs_remap(cifs_sb));
1942 if (rc == -EOPNOTSUPP)
1943 goto posix_mkdir_out;
1945 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1947 goto posix_mkdir_out;
1950 if (info->Type == cpu_to_le32(-1))
1951 /* no return info, go query for it */
1952 goto posix_mkdir_get_info;
1954 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1955 * need to set uid/gid.
1958 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1959 cifs_fill_uniqueid(inode->i_sb, &fattr);
1960 newinode = cifs_iget(inode->i_sb, &fattr);
1962 goto posix_mkdir_get_info;
1964 d_instantiate(dentry, newinode);
1966 #ifdef CONFIG_CIFS_DEBUG2
1967 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1968 dentry, dentry, newinode);
1970 if (newinode->i_nlink != 2)
1971 cifs_dbg(FYI, "unexpected number of links %d\n",
1978 posix_mkdir_get_info:
1979 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1981 goto posix_mkdir_out;
1983 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1985 int cifs_mkdir(struct mnt_idmap *idmap, struct inode *inode,
1986 struct dentry *direntry, umode_t mode)
1990 struct cifs_sb_info *cifs_sb;
1991 struct tcon_link *tlink;
1992 struct cifs_tcon *tcon;
1993 struct TCP_Server_Info *server;
1994 const char *full_path;
1997 cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
2000 cifs_sb = CIFS_SB(inode->i_sb);
2001 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2003 tlink = cifs_sb_tlink(cifs_sb);
2005 return PTR_ERR(tlink);
2006 tcon = tlink_tcon(tlink);
2010 page = alloc_dentry_path();
2011 full_path = build_path_from_dentry(direntry, page);
2012 if (IS_ERR(full_path)) {
2013 rc = PTR_ERR(full_path);
2017 server = tcon->ses->server;
2019 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
2020 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
2022 d_drop(direntry); /* for time being always refresh inode info */
2026 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2027 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
2028 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
2029 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
2031 if (rc != -EOPNOTSUPP)
2034 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2036 if (!server->ops->mkdir) {
2041 /* BB add setting the equivalent of mode via CreateX w/ACLs */
2042 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
2044 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
2049 /* TODO: skip this for smb2/smb3 */
2050 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
2054 * Force revalidate to get parent dir info when needed since cached
2055 * attributes are invalid now.
2057 CIFS_I(inode)->time = 0;
2058 free_dentry_path(page);
2060 cifs_put_tlink(tlink);
2064 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
2068 struct cifs_sb_info *cifs_sb;
2069 struct tcon_link *tlink;
2070 struct cifs_tcon *tcon;
2071 struct TCP_Server_Info *server;
2072 const char *full_path;
2073 void *page = alloc_dentry_path();
2074 struct cifsInodeInfo *cifsInode;
2076 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
2080 full_path = build_path_from_dentry(direntry, page);
2081 if (IS_ERR(full_path)) {
2082 rc = PTR_ERR(full_path);
2086 cifs_sb = CIFS_SB(inode->i_sb);
2087 if (unlikely(cifs_forced_shutdown(cifs_sb))) {
2092 tlink = cifs_sb_tlink(cifs_sb);
2093 if (IS_ERR(tlink)) {
2094 rc = PTR_ERR(tlink);
2097 tcon = tlink_tcon(tlink);
2098 server = tcon->ses->server;
2100 if (!server->ops->rmdir) {
2102 cifs_put_tlink(tlink);
2106 if (tcon->nodelete) {
2108 cifs_put_tlink(tlink);
2112 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
2113 cifs_put_tlink(tlink);
2116 spin_lock(&d_inode(direntry)->i_lock);
2117 i_size_write(d_inode(direntry), 0);
2118 clear_nlink(d_inode(direntry));
2119 spin_unlock(&d_inode(direntry)->i_lock);
2122 cifsInode = CIFS_I(d_inode(direntry));
2123 /* force revalidate to go get info when needed */
2124 cifsInode->time = 0;
2126 cifsInode = CIFS_I(inode);
2128 * Force revalidate to get parent dir info when needed since cached
2129 * attributes are invalid now.
2131 cifsInode->time = 0;
2133 inode_set_ctime_current(d_inode(direntry));
2134 inode->i_mtime = inode_set_ctime_current(inode);
2137 free_dentry_path(page);
2143 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2144 const char *from_path, struct dentry *to_dentry,
2145 const char *to_path)
2147 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2148 struct tcon_link *tlink;
2149 struct cifs_tcon *tcon;
2150 struct TCP_Server_Info *server;
2151 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2152 struct cifs_fid fid;
2153 struct cifs_open_parms oparms;
2155 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2158 tlink = cifs_sb_tlink(cifs_sb);
2160 return PTR_ERR(tlink);
2161 tcon = tlink_tcon(tlink);
2162 server = tcon->ses->server;
2164 if (!server->ops->rename)
2167 /* try path-based rename first */
2168 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
2171 * Don't bother with rename by filehandle unless file is busy and
2172 * source. Note that cross directory moves do not work with
2173 * rename by filehandle to various Windows servers.
2175 if (rc == 0 || rc != -EBUSY)
2176 goto do_rename_exit;
2178 /* Don't fall back to using SMB on SMB 2+ mount */
2179 if (server->vals->protocol_id != 0)
2180 goto do_rename_exit;
2182 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2183 /* open-file renames don't work across directories */
2184 if (to_dentry->d_parent != from_dentry->d_parent)
2185 goto do_rename_exit;
2187 oparms = (struct cifs_open_parms) {
2190 /* open the file to be renamed -- we need DELETE perms */
2191 .desired_access = DELETE,
2192 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
2193 .disposition = FILE_OPEN,
2198 rc = CIFS_open(xid, &oparms, &oplock, NULL);
2200 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2201 (const char *) to_dentry->d_name.name,
2202 cifs_sb->local_nls, cifs_remap(cifs_sb));
2203 CIFSSMBClose(xid, tcon, fid.netfid);
2205 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2208 d_move(from_dentry, to_dentry);
2209 cifs_put_tlink(tlink);
2214 cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
2215 struct dentry *source_dentry, struct inode *target_dir,
2216 struct dentry *target_dentry, unsigned int flags)
2218 const char *from_name, *to_name;
2219 void *page1, *page2;
2220 struct cifs_sb_info *cifs_sb;
2221 struct tcon_link *tlink;
2222 struct cifs_tcon *tcon;
2225 int retry_count = 0;
2226 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2227 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2228 FILE_UNIX_BASIC_INFO *info_buf_target;
2229 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2231 if (flags & ~RENAME_NOREPLACE)
2234 cifs_sb = CIFS_SB(source_dir->i_sb);
2235 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2238 tlink = cifs_sb_tlink(cifs_sb);
2240 return PTR_ERR(tlink);
2241 tcon = tlink_tcon(tlink);
2243 page1 = alloc_dentry_path();
2244 page2 = alloc_dentry_path();
2247 from_name = build_path_from_dentry(source_dentry, page1);
2248 if (IS_ERR(from_name)) {
2249 rc = PTR_ERR(from_name);
2250 goto cifs_rename_exit;
2253 to_name = build_path_from_dentry(target_dentry, page2);
2254 if (IS_ERR(to_name)) {
2255 rc = PTR_ERR(to_name);
2256 goto cifs_rename_exit;
2259 cifs_close_deferred_file_under_dentry(tcon, from_name);
2260 if (d_inode(target_dentry) != NULL)
2261 cifs_close_deferred_file_under_dentry(tcon, to_name);
2263 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2266 if (rc == -EACCES) {
2267 while (retry_count < 3) {
2268 cifs_close_all_deferred_files(tcon);
2269 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2278 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2280 if (flags & RENAME_NOREPLACE)
2281 goto cifs_rename_exit;
2283 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2284 if (rc == -EEXIST && tcon->unix_ext) {
2286 * Are src and dst hardlinks of same inode? We can only tell
2287 * with unix extensions enabled.
2290 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2292 if (info_buf_source == NULL) {
2294 goto cifs_rename_exit;
2297 info_buf_target = info_buf_source + 1;
2298 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2301 cifs_remap(cifs_sb));
2305 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2308 cifs_remap(cifs_sb));
2310 if (tmprc == 0 && (info_buf_source->UniqueId ==
2311 info_buf_target->UniqueId)) {
2312 /* same file, POSIX says that this is a noop */
2314 goto cifs_rename_exit;
2318 * else ... BB we could add the same check for Windows by
2319 * checking the UniqueId via FILE_INTERNAL_INFO
2323 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2325 /* Try unlinking the target dentry if it's not negative */
2326 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2327 if (d_is_dir(target_dentry))
2328 tmprc = cifs_rmdir(target_dir, target_dentry);
2330 tmprc = cifs_unlink(target_dir, target_dentry);
2332 goto cifs_rename_exit;
2333 rc = cifs_do_rename(xid, source_dentry, from_name,
2334 target_dentry, to_name);
2337 /* force revalidate to go get info when needed */
2338 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2340 source_dir->i_mtime = target_dir->i_mtime = inode_set_ctime_to_ts(source_dir,
2341 inode_set_ctime_current(target_dir));
2344 kfree(info_buf_source);
2345 free_dentry_path(page2);
2346 free_dentry_path(page1);
2348 cifs_put_tlink(tlink);
2353 cifs_dentry_needs_reval(struct dentry *dentry)
2355 struct inode *inode = d_inode(dentry);
2356 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2357 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2358 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2359 struct cached_fid *cfid = NULL;
2361 if (cifs_i->time == 0)
2364 if (CIFS_CACHE_READ(cifs_i))
2367 if (!lookupCacheEnabled)
2370 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2371 spin_lock(&cfid->fid_lock);
2372 if (cfid->time && cifs_i->time > cfid->time) {
2373 spin_unlock(&cfid->fid_lock);
2374 close_cached_dir(cfid);
2377 spin_unlock(&cfid->fid_lock);
2378 close_cached_dir(cfid);
2381 * depending on inode type, check if attribute caching disabled for
2382 * files or directories
2384 if (S_ISDIR(inode->i_mode)) {
2385 if (!cifs_sb->ctx->acdirmax)
2387 if (!time_in_range(jiffies, cifs_i->time,
2388 cifs_i->time + cifs_sb->ctx->acdirmax))
2391 if (!cifs_sb->ctx->acregmax)
2393 if (!time_in_range(jiffies, cifs_i->time,
2394 cifs_i->time + cifs_sb->ctx->acregmax))
2398 /* hardlinked files w/ noserverino get "special" treatment */
2399 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2400 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2407 * Zap the cache. Called when invalid_mapping flag is set.
2410 cifs_invalidate_mapping(struct inode *inode)
2414 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2415 rc = invalidate_inode_pages2(inode->i_mapping);
2417 cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n",
2418 __func__, inode, rc);
2425 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2427 * @key: currently unused
2428 * @mode: the task state to sleep in
2431 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2434 if (signal_pending_state(mode, current))
2435 return -ERESTARTSYS;
2440 cifs_revalidate_mapping(struct inode *inode)
2443 unsigned long *flags = &CIFS_I(inode)->flags;
2444 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2446 /* swapfiles are not supposed to be shared */
2447 if (IS_SWAPFILE(inode))
2450 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2451 TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
2455 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2456 /* for cache=singleclient, do not invalidate */
2457 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2458 goto skip_invalidate;
2460 rc = cifs_invalidate_mapping(inode);
2462 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2466 clear_bit_unlock(CIFS_INO_LOCK, flags);
2467 smp_mb__after_atomic();
2468 wake_up_bit(flags, CIFS_INO_LOCK);
2474 cifs_zap_mapping(struct inode *inode)
2476 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2477 return cifs_revalidate_mapping(inode);
2480 int cifs_revalidate_file_attr(struct file *filp)
2483 struct dentry *dentry = file_dentry(filp);
2484 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2485 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2486 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2488 if (!cifs_dentry_needs_reval(dentry))
2491 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2492 if (tlink_tcon(cfile->tlink)->unix_ext)
2493 rc = cifs_get_file_info_unix(filp);
2495 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2496 rc = cifs_get_file_info(filp);
2501 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2505 struct inode *inode = d_inode(dentry);
2506 struct super_block *sb = dentry->d_sb;
2507 const char *full_path;
2514 if (!cifs_dentry_needs_reval(dentry))
2519 page = alloc_dentry_path();
2520 full_path = build_path_from_dentry(dentry, page);
2521 if (IS_ERR(full_path)) {
2522 rc = PTR_ERR(full_path);
2526 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2527 full_path, inode, inode->i_count.counter,
2528 dentry, cifs_get_time(dentry), jiffies);
2531 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2532 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2533 else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2534 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2536 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2538 if (rc == -EAGAIN && count++ < 10)
2541 free_dentry_path(page);
2547 int cifs_revalidate_file(struct file *filp)
2550 struct inode *inode = file_inode(filp);
2552 rc = cifs_revalidate_file_attr(filp);
2556 return cifs_revalidate_mapping(inode);
2559 /* revalidate a dentry's inode attributes */
2560 int cifs_revalidate_dentry(struct dentry *dentry)
2563 struct inode *inode = d_inode(dentry);
2565 rc = cifs_revalidate_dentry_attr(dentry);
2569 return cifs_revalidate_mapping(inode);
2572 int cifs_getattr(struct mnt_idmap *idmap, const struct path *path,
2573 struct kstat *stat, u32 request_mask, unsigned int flags)
2575 struct dentry *dentry = path->dentry;
2576 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2577 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2578 struct inode *inode = d_inode(dentry);
2581 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2585 * We need to be sure that all dirty pages are written and the server
2586 * has actual ctime, mtime and file length.
2588 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2589 !CIFS_CACHE_READ(CIFS_I(inode)) &&
2590 inode->i_mapping && inode->i_mapping->nrpages != 0) {
2591 rc = filemap_fdatawait(inode->i_mapping);
2593 mapping_set_error(inode->i_mapping, rc);
2598 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2599 CIFS_I(inode)->time = 0; /* force revalidate */
2602 * If the caller doesn't require syncing, only sync if
2603 * necessary (e.g. due to earlier truncate or setattr
2604 * invalidating the cached metadata)
2606 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2607 (CIFS_I(inode)->time == 0)) {
2608 rc = cifs_revalidate_dentry_attr(dentry);
2613 generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
2614 stat->blksize = cifs_sb->ctx->bsize;
2615 stat->ino = CIFS_I(inode)->uniqueid;
2617 /* old CIFS Unix Extensions doesn't return create time */
2618 if (CIFS_I(inode)->createtime) {
2619 stat->result_mask |= STATX_BTIME;
2621 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2624 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2625 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2626 stat->attributes |= STATX_ATTR_COMPRESSED;
2627 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2628 stat->attributes |= STATX_ATTR_ENCRYPTED;
2631 * If on a multiuser mount without unix extensions or cifsacl being
2632 * enabled, and the admin hasn't overridden them, set the ownership
2633 * to the fsuid/fsgid of the current process.
2635 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2636 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2638 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2639 stat->uid = current_fsuid();
2640 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2641 stat->gid = current_fsgid();
2646 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2649 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2650 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->netfs.inode.i_sb);
2651 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2652 struct TCP_Server_Info *server = tcon->ses->server;
2653 struct cifsFileInfo *cfile;
2656 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2660 * We need to be sure that all dirty pages are written as they
2661 * might fill holes on the server.
2663 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2664 inode->i_mapping->nrpages != 0) {
2665 rc = filemap_fdatawait(inode->i_mapping);
2667 mapping_set_error(inode->i_mapping, rc);
2672 cfile = find_readable_file(cifs_i, false);
2676 if (server->ops->fiemap) {
2677 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2678 cifsFileInfo_put(cfile);
2682 cifsFileInfo_put(cfile);
2686 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2688 pgoff_t index = from >> PAGE_SHIFT;
2689 unsigned offset = from & (PAGE_SIZE - 1);
2693 page = grab_cache_page(mapping, index);
2697 zero_user_segment(page, offset, PAGE_SIZE);
2703 void cifs_setsize(struct inode *inode, loff_t offset)
2705 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2707 spin_lock(&inode->i_lock);
2708 i_size_write(inode, offset);
2709 spin_unlock(&inode->i_lock);
2711 /* Cached inode must be refreshed on truncate */
2713 truncate_pagecache(inode, offset);
2717 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2718 unsigned int xid, const char *full_path)
2721 struct cifsFileInfo *open_file;
2722 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2723 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2724 struct tcon_link *tlink = NULL;
2725 struct cifs_tcon *tcon = NULL;
2726 struct TCP_Server_Info *server;
2729 * To avoid spurious oplock breaks from server, in the case of
2730 * inodes that we already have open, avoid doing path based
2731 * setting of file size if we can do it by handle.
2732 * This keeps our caching token (oplock) and avoids timeouts
2733 * when the local oplock break takes longer to flush
2734 * writebehind data than the SMB timeout for the SetPathInfo
2735 * request would allow
2737 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2739 tcon = tlink_tcon(open_file->tlink);
2740 server = tcon->ses->server;
2741 if (server->ops->set_file_size)
2742 rc = server->ops->set_file_size(xid, tcon, open_file,
2743 attrs->ia_size, false);
2746 cifsFileInfo_put(open_file);
2747 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2755 tlink = cifs_sb_tlink(cifs_sb);
2757 return PTR_ERR(tlink);
2758 tcon = tlink_tcon(tlink);
2759 server = tcon->ses->server;
2763 * Set file size by pathname rather than by handle either because no
2764 * valid, writeable file handle for it was found or because there was
2765 * an error setting it by handle.
2767 if (server->ops->set_path_size)
2768 rc = server->ops->set_path_size(xid, tcon, full_path,
2769 attrs->ia_size, cifs_sb, false);
2772 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2775 cifs_put_tlink(tlink);
2779 cifsInode->server_eof = attrs->ia_size;
2780 cifs_setsize(inode, attrs->ia_size);
2782 * i_blocks is not related to (i_size / i_blksize), but instead
2783 * 512 byte (2**9) size is required for calculating num blocks.
2784 * Until we can query the server for actual allocation size,
2785 * this is best estimate we have for blocks allocated for a file
2786 * Number of blocks must be rounded up so size 1 is not 0 blocks
2788 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2791 * The man page of truncate says if the size changed,
2792 * then the st_ctime and st_mtime fields for the file
2795 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2796 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2798 cifs_truncate_page(inode->i_mapping, inode->i_size);
2804 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2806 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2810 const char *full_path;
2811 void *page = alloc_dentry_path();
2812 struct inode *inode = d_inode(direntry);
2813 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2814 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2815 struct tcon_link *tlink;
2816 struct cifs_tcon *pTcon;
2817 struct cifs_unix_set_info_args *args = NULL;
2818 struct cifsFileInfo *open_file;
2820 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2821 direntry, attrs->ia_valid);
2825 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2826 attrs->ia_valid |= ATTR_FORCE;
2828 rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
2832 full_path = build_path_from_dentry(direntry, page);
2833 if (IS_ERR(full_path)) {
2834 rc = PTR_ERR(full_path);
2839 * Attempt to flush data before changing attributes. We need to do
2840 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2841 * ownership or mode then we may also need to do this. Here, we take
2842 * the safe way out and just do the flush on all setattr requests. If
2843 * the flush returns error, store it to report later and continue.
2845 * BB: This should be smarter. Why bother flushing pages that
2846 * will be truncated anyway? Also, should we error out here if
2847 * the flush returns error?
2849 rc = filemap_write_and_wait(inode->i_mapping);
2850 if (is_interrupt_error(rc)) {
2855 mapping_set_error(inode->i_mapping, rc);
2858 if (attrs->ia_valid & ATTR_SIZE) {
2859 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2864 /* skip mode change if it's just for clearing setuid/setgid */
2865 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2866 attrs->ia_valid &= ~ATTR_MODE;
2868 args = kmalloc(sizeof(*args), GFP_KERNEL);
2874 /* set up the struct */
2875 if (attrs->ia_valid & ATTR_MODE)
2876 args->mode = attrs->ia_mode;
2878 args->mode = NO_CHANGE_64;
2880 if (attrs->ia_valid & ATTR_UID)
2881 args->uid = attrs->ia_uid;
2883 args->uid = INVALID_UID; /* no change */
2885 if (attrs->ia_valid & ATTR_GID)
2886 args->gid = attrs->ia_gid;
2888 args->gid = INVALID_GID; /* no change */
2890 if (attrs->ia_valid & ATTR_ATIME)
2891 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2893 args->atime = NO_CHANGE_64;
2895 if (attrs->ia_valid & ATTR_MTIME)
2896 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2898 args->mtime = NO_CHANGE_64;
2900 if (attrs->ia_valid & ATTR_CTIME)
2901 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2903 args->ctime = NO_CHANGE_64;
2906 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2908 u16 nfid = open_file->fid.netfid;
2909 u32 npid = open_file->pid;
2910 pTcon = tlink_tcon(open_file->tlink);
2911 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2912 cifsFileInfo_put(open_file);
2914 tlink = cifs_sb_tlink(cifs_sb);
2915 if (IS_ERR(tlink)) {
2916 rc = PTR_ERR(tlink);
2919 pTcon = tlink_tcon(tlink);
2920 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2922 cifs_remap(cifs_sb));
2923 cifs_put_tlink(tlink);
2929 if ((attrs->ia_valid & ATTR_SIZE) &&
2930 attrs->ia_size != i_size_read(inode)) {
2931 truncate_setsize(inode, attrs->ia_size);
2932 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
2935 setattr_copy(&nop_mnt_idmap, inode, attrs);
2936 mark_inode_dirty(inode);
2938 /* force revalidate when any of these times are set since some
2939 of the fs types (eg ext3, fat) do not have fine enough
2940 time granularity to match protocol, and we do not have a
2941 a way (yet) to query the server fs's time granularity (and
2942 whether it rounds times down).
2944 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2945 cifsInode->time = 0;
2948 free_dentry_path(page);
2952 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2955 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2958 kuid_t uid = INVALID_UID;
2959 kgid_t gid = INVALID_GID;
2960 struct inode *inode = d_inode(direntry);
2961 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2962 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2963 struct cifsFileInfo *wfile;
2964 struct cifs_tcon *tcon;
2965 const char *full_path;
2966 void *page = alloc_dentry_path();
2969 __u64 mode = NO_CHANGE_64;
2973 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2974 direntry, attrs->ia_valid);
2976 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2977 attrs->ia_valid |= ATTR_FORCE;
2979 rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
2981 goto cifs_setattr_exit;
2983 full_path = build_path_from_dentry(direntry, page);
2984 if (IS_ERR(full_path)) {
2985 rc = PTR_ERR(full_path);
2986 goto cifs_setattr_exit;
2990 * Attempt to flush data before changing attributes. We need to do
2991 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
2992 * returns error, store it to report later and continue.
2994 * BB: This should be smarter. Why bother flushing pages that
2995 * will be truncated anyway? Also, should we error out here if
2996 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
2998 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
2999 rc = filemap_write_and_wait(inode->i_mapping);
3000 if (is_interrupt_error(rc)) {
3002 goto cifs_setattr_exit;
3004 mapping_set_error(inode->i_mapping, rc);
3009 if ((attrs->ia_valid & ATTR_MTIME) &&
3010 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
3011 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
3013 tcon = tlink_tcon(wfile->tlink);
3014 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
3015 cifsFileInfo_put(wfile);
3017 goto cifs_setattr_exit;
3018 } else if (rc != -EBADF)
3019 goto cifs_setattr_exit;
3024 if (attrs->ia_valid & ATTR_SIZE) {
3025 rc = cifs_set_file_size(inode, attrs, xid, full_path);
3027 goto cifs_setattr_exit;
3030 if (attrs->ia_valid & ATTR_UID)
3031 uid = attrs->ia_uid;
3033 if (attrs->ia_valid & ATTR_GID)
3034 gid = attrs->ia_gid;
3036 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3037 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3038 if (uid_valid(uid) || gid_valid(gid)) {
3039 mode = NO_CHANGE_64;
3040 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3043 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
3045 goto cifs_setattr_exit;
3049 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
3050 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
3052 /* skip mode change if it's just for clearing setuid/setgid */
3053 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
3054 attrs->ia_valid &= ~ATTR_MODE;
3056 if (attrs->ia_valid & ATTR_MODE) {
3057 mode = attrs->ia_mode;
3059 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3060 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3061 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3062 INVALID_UID, INVALID_GID);
3064 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
3066 goto cifs_setattr_exit;
3070 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
3071 * Pick up the actual mode bits that were set.
3073 if (mode != attrs->ia_mode)
3074 attrs->ia_mode = mode;
3076 if (((mode & S_IWUGO) == 0) &&
3077 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
3079 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
3081 /* fix up mode if we're not using dynperm */
3082 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
3083 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
3084 } else if ((mode & S_IWUGO) &&
3085 (cifsInode->cifsAttrs & ATTR_READONLY)) {
3087 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
3088 /* Attributes of 0 are ignored */
3090 dosattr |= ATTR_NORMAL;
3092 /* reset local inode permissions to normal */
3093 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3094 attrs->ia_mode &= ~(S_IALLUGO);
3095 if (S_ISDIR(inode->i_mode))
3097 cifs_sb->ctx->dir_mode;
3100 cifs_sb->ctx->file_mode;
3102 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3103 /* ignore mode change - ATTR_READONLY hasn't changed */
3104 attrs->ia_valid &= ~ATTR_MODE;
3108 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
3109 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
3110 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
3111 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
3113 /* Even if error on time set, no sense failing the call if
3114 the server would set the time to a reasonable value anyway,
3115 and this check ensures that we are not being called from
3116 sys_utimes in which case we ought to fail the call back to
3117 the user when the server rejects the call */
3118 if ((rc) && (attrs->ia_valid &
3119 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
3123 /* do not need local check to inode_check_ok since the server does
3126 goto cifs_setattr_exit;
3128 if ((attrs->ia_valid & ATTR_SIZE) &&
3129 attrs->ia_size != i_size_read(inode)) {
3130 truncate_setsize(inode, attrs->ia_size);
3131 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3134 setattr_copy(&nop_mnt_idmap, inode, attrs);
3135 mark_inode_dirty(inode);
3139 free_dentry_path(page);
3144 cifs_setattr(struct mnt_idmap *idmap, struct dentry *direntry,
3145 struct iattr *attrs)
3147 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
3148 int rc, retries = 0;
3149 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3150 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
3151 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3153 if (unlikely(cifs_forced_shutdown(cifs_sb)))
3157 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3158 if (pTcon->unix_ext)
3159 rc = cifs_setattr_unix(direntry, attrs);
3161 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3162 rc = cifs_setattr_nounix(direntry, attrs);
3164 } while (is_retryable_error(rc) && retries < 2);
3166 /* BB: add cifs_setattr_legacy for really old servers */