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 #ifdef CONFIG_CIFS_DFS_UPCALL
62 if (IS_AUTOMOUNT(inode)) {
63 inode->i_op = &cifs_dfs_referral_inode_operations;
65 #else /* NO DFS support, treat as a directory */
68 inode->i_op = &cifs_dir_inode_ops;
69 inode->i_fop = &cifs_dir_ops;
73 inode->i_op = &cifs_symlink_inode_ops;
76 init_special_inode(inode, inode->i_mode, inode->i_rdev);
81 /* check inode attributes against fattr. If they don't match, tag the
82 * inode for cache invalidation
85 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
87 struct cifs_fscache_inode_coherency_data cd;
88 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
90 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
91 __func__, cifs_i->uniqueid);
93 if (inode->i_state & I_NEW) {
94 cifs_dbg(FYI, "%s: inode %llu is new\n",
95 __func__, cifs_i->uniqueid);
99 /* don't bother with revalidation if we have an oplock */
100 if (CIFS_CACHE_READ(cifs_i)) {
101 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
102 __func__, cifs_i->uniqueid);
106 /* revalidate if mtime or size have changed */
107 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
108 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
109 cifs_i->server_eof == fattr->cf_eof) {
110 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
111 __func__, cifs_i->uniqueid);
115 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
116 __func__, cifs_i->uniqueid);
117 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
118 /* Invalidate fscache cookie */
119 cifs_fscache_fill_coherency(&cifs_i->netfs.inode, &cd);
120 fscache_invalidate(cifs_inode_cookie(inode), &cd, i_size_read(inode), 0);
124 * copy nlink to the inode, unless it wasn't provided. Provide
125 * sane values if we don't have an existing one and none was provided
128 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
131 * if we're in a situation where we can't trust what we
132 * got from the server (readdir, some non-unix cases)
133 * fake reasonable values
135 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
136 /* only provide fake values on a new inode */
137 if (inode->i_state & I_NEW) {
138 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
146 /* we trust the server, so update it */
147 set_nlink(inode, fattr->cf_nlink);
150 /* populate an inode with info from a cifs_fattr struct */
152 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
154 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
155 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
157 if (!(inode->i_state & I_NEW) &&
158 unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
159 CIFS_I(inode)->time = 0; /* force reval */
163 cifs_revalidate_cache(inode, fattr);
165 spin_lock(&inode->i_lock);
166 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
167 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
168 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
169 /* we do not want atime to be less than mtime, it broke some apps */
170 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
171 inode->i_atime = fattr->cf_mtime;
173 inode->i_atime = fattr->cf_atime;
174 inode->i_mtime = fattr->cf_mtime;
175 inode->i_ctime = fattr->cf_ctime;
176 inode->i_rdev = fattr->cf_rdev;
177 cifs_nlink_fattr_to_inode(inode, fattr);
178 inode->i_uid = fattr->cf_uid;
179 inode->i_gid = fattr->cf_gid;
181 /* if dynperm is set, don't clobber existing mode */
182 if (inode->i_state & I_NEW ||
183 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
184 inode->i_mode = fattr->cf_mode;
186 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
188 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
191 cifs_i->time = jiffies;
193 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
194 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
196 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
198 cifs_i->server_eof = fattr->cf_eof;
200 * Can't safely change the file size here if the client is writing to
201 * it due to potential races.
203 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
204 i_size_write(inode, fattr->cf_eof);
207 * i_blocks is not related to (i_size / i_blksize),
208 * but instead 512 byte (2**9) size is required for
209 * calculating num blocks.
211 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
214 if (S_ISLNK(fattr->cf_mode)) {
215 kfree(cifs_i->symlink_target);
216 cifs_i->symlink_target = fattr->cf_symlink_target;
217 fattr->cf_symlink_target = NULL;
219 spin_unlock(&inode->i_lock);
221 if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
222 inode->i_flags |= S_AUTOMOUNT;
223 if (inode->i_state & I_NEW)
229 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
231 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
233 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
236 fattr->cf_uniqueid = iunique(sb, ROOT_I);
239 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
241 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
242 struct cifs_sb_info *cifs_sb)
244 memset(fattr, 0, sizeof(*fattr));
245 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
246 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
247 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
249 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
250 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
251 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
252 /* old POSIX extensions don't get create time */
254 fattr->cf_mode = le64_to_cpu(info->Permissions);
257 * Since we set the inode type below we need to mask off
258 * to avoid strange results if bits set above.
260 fattr->cf_mode &= ~S_IFMT;
261 switch (le32_to_cpu(info->Type)) {
263 fattr->cf_mode |= S_IFREG;
264 fattr->cf_dtype = DT_REG;
267 fattr->cf_mode |= S_IFLNK;
268 fattr->cf_dtype = DT_LNK;
271 fattr->cf_mode |= S_IFDIR;
272 fattr->cf_dtype = DT_DIR;
275 fattr->cf_mode |= S_IFCHR;
276 fattr->cf_dtype = DT_CHR;
277 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
278 le64_to_cpu(info->DevMinor) & MINORMASK);
281 fattr->cf_mode |= S_IFBLK;
282 fattr->cf_dtype = DT_BLK;
283 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
284 le64_to_cpu(info->DevMinor) & MINORMASK);
287 fattr->cf_mode |= S_IFIFO;
288 fattr->cf_dtype = DT_FIFO;
291 fattr->cf_mode |= S_IFSOCK;
292 fattr->cf_dtype = DT_SOCK;
295 /* safest to call it a file if we do not know */
296 fattr->cf_mode |= S_IFREG;
297 fattr->cf_dtype = DT_REG;
298 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
302 fattr->cf_uid = cifs_sb->ctx->linux_uid;
303 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
304 u64 id = le64_to_cpu(info->Uid);
305 if (id < ((uid_t)-1)) {
306 kuid_t uid = make_kuid(&init_user_ns, id);
312 fattr->cf_gid = cifs_sb->ctx->linux_gid;
313 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
314 u64 id = le64_to_cpu(info->Gid);
315 if (id < ((gid_t)-1)) {
316 kgid_t gid = make_kgid(&init_user_ns, id);
322 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
326 * Fill a cifs_fattr struct with fake inode info.
328 * Needed to setup cifs_fattr data for the directory which is the
329 * junction to the new submount (ie to setup the fake directory
330 * which represents a DFS referral).
333 cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
335 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
337 cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
339 memset(fattr, 0, sizeof(*fattr));
340 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
341 fattr->cf_uid = cifs_sb->ctx->linux_uid;
342 fattr->cf_gid = cifs_sb->ctx->linux_gid;
343 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
344 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
346 fattr->cf_flags = CIFS_FATTR_DFS_REFERRAL;
349 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
351 cifs_get_file_info_unix(struct file *filp)
355 FILE_UNIX_BASIC_INFO find_data;
356 struct cifs_fattr fattr = {};
357 struct inode *inode = file_inode(filp);
358 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
359 struct cifsFileInfo *cfile = filp->private_data;
360 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
364 if (cfile->symlink_target) {
365 fattr.cf_symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL);
366 if (!fattr.cf_symlink_target) {
368 goto cifs_gfiunix_out;
372 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
374 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
375 } else if (rc == -EREMOTE) {
376 cifs_create_dfs_fattr(&fattr, inode->i_sb);
379 goto cifs_gfiunix_out;
381 rc = cifs_fattr_to_inode(inode, &fattr);
388 int cifs_get_inode_info_unix(struct inode **pinode,
389 const unsigned char *full_path,
390 struct super_block *sb, unsigned int xid)
393 FILE_UNIX_BASIC_INFO find_data;
394 struct cifs_fattr fattr;
395 struct cifs_tcon *tcon;
396 struct TCP_Server_Info *server;
397 struct tcon_link *tlink;
398 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
400 cifs_dbg(FYI, "Getting info on %s\n", full_path);
402 tlink = cifs_sb_tlink(cifs_sb);
404 return PTR_ERR(tlink);
405 tcon = tlink_tcon(tlink);
406 server = tcon->ses->server;
408 /* could have done a find first instead but this returns more info */
409 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
410 cifs_sb->local_nls, cifs_remap(cifs_sb));
411 cifs_dbg(FYI, "%s: query path info: rc = %d\n", __func__, rc);
412 cifs_put_tlink(tlink);
415 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
416 } else if (rc == -EREMOTE) {
417 cifs_create_dfs_fattr(&fattr, sb);
423 /* check for Minshall+French symlinks */
424 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
425 int tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
428 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
431 if (S_ISLNK(fattr.cf_mode) && !fattr.cf_symlink_target) {
432 if (!server->ops->query_symlink)
434 rc = server->ops->query_symlink(xid, tcon, cifs_sb, full_path,
435 &fattr.cf_symlink_target, false);
437 cifs_dbg(FYI, "%s: query_symlink: %d\n", __func__, rc);
442 if (*pinode == NULL) {
444 cifs_fill_uniqueid(sb, &fattr);
445 *pinode = cifs_iget(sb, &fattr);
449 /* we already have inode, update it */
451 /* if uniqueid is different, return error */
452 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
453 CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
454 CIFS_I(*pinode)->time = 0; /* force reval */
459 /* if filetype is different, return error */
460 rc = cifs_fattr_to_inode(*pinode, &fattr);
464 kfree(fattr.cf_symlink_target);
468 int cifs_get_inode_info_unix(struct inode **pinode,
469 const unsigned char *full_path,
470 struct super_block *sb, unsigned int xid)
474 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
477 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
478 struct cifs_sb_info *cifs_sb, unsigned int xid)
482 struct tcon_link *tlink;
483 struct cifs_tcon *tcon;
485 struct cifs_open_parms oparms;
486 struct cifs_io_parms io_parms = {0};
488 unsigned int bytes_read;
490 int buf_type = CIFS_NO_BUFFER;
494 fattr->cf_mode &= ~S_IFMT;
496 if (fattr->cf_eof == 0) {
497 fattr->cf_mode |= S_IFIFO;
498 fattr->cf_dtype = DT_FIFO;
500 } else if (fattr->cf_eof < 8) {
501 fattr->cf_mode |= S_IFREG;
502 fattr->cf_dtype = DT_REG;
503 return -EINVAL; /* EOPNOTSUPP? */
506 tlink = cifs_sb_tlink(cifs_sb);
508 return PTR_ERR(tlink);
509 tcon = tlink_tcon(tlink);
511 oparms = (struct cifs_open_parms) {
514 .desired_access = GENERIC_READ,
515 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
516 .disposition = FILE_OPEN,
521 if (tcon->ses->server->oplocks)
525 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
527 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
528 cifs_put_tlink(tlink);
533 io_parms.netfid = fid.netfid;
534 io_parms.pid = current->tgid;
535 io_parms.tcon = tcon;
537 io_parms.length = 24;
539 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
540 &bytes_read, &pbuf, &buf_type);
541 if ((rc == 0) && (bytes_read >= 8)) {
542 if (memcmp("IntxBLK", pbuf, 8) == 0) {
543 cifs_dbg(FYI, "Block device\n");
544 fattr->cf_mode |= S_IFBLK;
545 fattr->cf_dtype = DT_BLK;
546 if (bytes_read == 24) {
547 /* we have enough to decode dev num */
548 __u64 mjr; /* major */
549 __u64 mnr; /* minor */
550 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
551 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
552 fattr->cf_rdev = MKDEV(mjr, mnr);
554 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
555 cifs_dbg(FYI, "Char device\n");
556 fattr->cf_mode |= S_IFCHR;
557 fattr->cf_dtype = DT_CHR;
558 if (bytes_read == 24) {
559 /* we have enough to decode dev num */
560 __u64 mjr; /* major */
561 __u64 mnr; /* minor */
562 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
563 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
564 fattr->cf_rdev = MKDEV(mjr, mnr);
566 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
567 cifs_dbg(FYI, "Symlink\n");
568 fattr->cf_mode |= S_IFLNK;
569 fattr->cf_dtype = DT_LNK;
570 } else if (memcmp("LnxFIFO", pbuf, 8) == 0) {
571 cifs_dbg(FYI, "FIFO\n");
572 fattr->cf_mode |= S_IFIFO;
573 fattr->cf_dtype = DT_FIFO;
575 fattr->cf_mode |= S_IFREG; /* file? */
576 fattr->cf_dtype = DT_REG;
580 fattr->cf_mode |= S_IFREG; /* then it is a file */
581 fattr->cf_dtype = DT_REG;
582 rc = -EOPNOTSUPP; /* or some unknown SFU type */
585 tcon->ses->server->ops->close(xid, tcon, &fid);
586 cifs_put_tlink(tlink);
590 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
593 * Fetch mode bits as provided by SFU.
595 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
597 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
598 struct cifs_sb_info *cifs_sb, unsigned int xid)
600 #ifdef CONFIG_CIFS_XATTR
604 struct tcon_link *tlink;
605 struct cifs_tcon *tcon;
607 tlink = cifs_sb_tlink(cifs_sb);
609 return PTR_ERR(tlink);
610 tcon = tlink_tcon(tlink);
612 if (tcon->ses->server->ops->query_all_EAs == NULL) {
613 cifs_put_tlink(tlink);
617 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
618 "SETFILEBITS", ea_value, 4 /* size of buf */,
620 cifs_put_tlink(tlink);
624 mode = le32_to_cpu(*((__le32 *)ea_value));
625 fattr->cf_mode &= ~SFBITS_MASK;
626 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
627 mode, fattr->cf_mode);
628 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
629 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
638 /* Fill a cifs_fattr struct with info from POSIX info struct */
639 static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct cifs_open_info_data *data,
640 struct super_block *sb, bool adjust_tz, bool symlink)
642 struct smb311_posix_qinfo *info = &data->posix_fi;
643 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
644 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
646 memset(fattr, 0, sizeof(*fattr));
648 /* no fattr->flags to set */
649 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
650 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
652 if (info->LastAccessTime)
653 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
655 ktime_get_coarse_real_ts64(&fattr->cf_atime);
657 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
658 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
661 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
662 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
665 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
666 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
667 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
669 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
670 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
671 /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
672 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
675 fattr->cf_mode |= S_IFLNK;
676 fattr->cf_dtype = DT_LNK;
677 fattr->cf_symlink_target = data->symlink_target;
678 data->symlink_target = NULL;
679 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
680 fattr->cf_mode |= S_IFDIR;
681 fattr->cf_dtype = DT_DIR;
683 fattr->cf_mode |= S_IFREG;
684 fattr->cf_dtype = DT_REG;
686 /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
688 fattr->cf_uid = cifs_sb->ctx->linux_uid; /* TODO: map uid and gid from SID */
689 fattr->cf_gid = cifs_sb->ctx->linux_gid;
691 cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
692 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
695 static void cifs_open_info_to_fattr(struct cifs_fattr *fattr, struct cifs_open_info_data *data,
696 struct super_block *sb, bool adjust_tz, bool symlink,
699 struct smb2_file_all_info *info = &data->fi;
700 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
701 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
703 memset(fattr, 0, sizeof(*fattr));
704 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
705 if (info->DeletePending)
706 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
708 if (info->LastAccessTime)
709 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
711 ktime_get_coarse_real_ts64(&fattr->cf_atime);
713 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
714 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
717 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
718 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
721 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
722 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
723 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
725 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
726 if (reparse_tag == IO_REPARSE_TAG_LX_SYMLINK) {
727 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
728 fattr->cf_dtype = DT_LNK;
729 } else if (reparse_tag == IO_REPARSE_TAG_LX_FIFO) {
730 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
731 fattr->cf_dtype = DT_FIFO;
732 } else if (reparse_tag == IO_REPARSE_TAG_AF_UNIX) {
733 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
734 fattr->cf_dtype = DT_SOCK;
735 } else if (reparse_tag == IO_REPARSE_TAG_LX_CHR) {
736 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
737 fattr->cf_dtype = DT_CHR;
738 } else if (reparse_tag == IO_REPARSE_TAG_LX_BLK) {
739 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
740 fattr->cf_dtype = DT_BLK;
741 } else if (symlink || reparse_tag == IO_REPARSE_TAG_SYMLINK ||
742 reparse_tag == IO_REPARSE_TAG_NFS) {
743 fattr->cf_mode = S_IFLNK;
744 fattr->cf_dtype = DT_LNK;
745 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
746 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
747 fattr->cf_dtype = DT_DIR;
749 * Server can return wrong NumberOfLinks value for directories
750 * when Unix extensions are disabled - fake it.
753 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
755 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
756 fattr->cf_dtype = DT_REG;
758 /* clear write bits if ATTR_READONLY is set */
759 if (fattr->cf_cifsattrs & ATTR_READONLY)
760 fattr->cf_mode &= ~(S_IWUGO);
763 * Don't accept zero nlink from non-unix servers unless
764 * delete is pending. Instead mark it as unknown.
766 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
767 !info->DeletePending) {
768 cifs_dbg(VFS, "bogus file nlink value %u\n",
770 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
774 if (S_ISLNK(fattr->cf_mode)) {
775 fattr->cf_symlink_target = data->symlink_target;
776 data->symlink_target = NULL;
779 fattr->cf_uid = cifs_sb->ctx->linux_uid;
780 fattr->cf_gid = cifs_sb->ctx->linux_gid;
784 cifs_get_file_info(struct file *filp)
788 struct cifs_open_info_data data = {};
789 struct cifs_fattr fattr;
790 struct inode *inode = file_inode(filp);
791 struct cifsFileInfo *cfile = filp->private_data;
792 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
793 struct TCP_Server_Info *server = tcon->ses->server;
794 bool symlink = false;
797 if (!server->ops->query_file_info)
801 rc = server->ops->query_file_info(xid, tcon, cfile, &data);
804 /* TODO: add support to query reparse tag */
805 if (data.symlink_target) {
807 tag = IO_REPARSE_TAG_SYMLINK;
809 cifs_open_info_to_fattr(&fattr, &data, inode->i_sb, false, symlink, tag);
812 cifs_create_dfs_fattr(&fattr, inode->i_sb);
818 * FIXME: legacy server -- fall back to path-based call?
819 * for now, just skip revalidating and mark inode for
823 CIFS_I(inode)->time = 0;
830 * don't bother with SFU junk here -- just mark inode as needing
833 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
834 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
835 /* if filetype is different, return error */
836 rc = cifs_fattr_to_inode(inode, &fattr);
838 cifs_free_open_info(&data);
843 /* Simple function to return a 64 bit hash of string. Rarely called */
844 static __u64 simple_hashstr(const char *str)
846 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
850 hash = (hash + (__u64) *str++) * hash_mult;
855 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
857 * cifs_backup_query_path_info - SMB1 fallback code to get ino
859 * Fallback code to get file metadata when we don't have access to
860 * full_path (EACCES) and have backup creds.
862 * @xid: transaction id used to identify original request in logs
863 * @tcon: information about the server share we have mounted
864 * @sb: the superblock stores info such as disk space available
865 * @full_path: name of the file we are getting the metadata for
866 * @resp_buf: will be set to cifs resp buf and needs to be freed with
867 * cifs_buf_release() when done with @data
868 * @data: will be set to search info result buffer
871 cifs_backup_query_path_info(int xid,
872 struct cifs_tcon *tcon,
873 struct super_block *sb,
874 const char *full_path,
876 FILE_ALL_INFO **data)
878 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
879 struct cifs_search_info info = {0};
884 info.endOfSearch = false;
886 info.info_level = SMB_FIND_FILE_UNIX;
887 else if ((tcon->ses->capabilities &
888 tcon->ses->server->vals->cap_nt_find) == 0)
889 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
890 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
891 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
892 else /* no srvino useful for fallback to some netapp */
893 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
895 flags = CIFS_SEARCH_CLOSE_ALWAYS |
896 CIFS_SEARCH_CLOSE_AT_END |
897 CIFS_SEARCH_BACKUP_SEARCH;
899 rc = CIFSFindFirst(xid, tcon, full_path,
900 cifs_sb, NULL, flags, &info, false);
904 *resp_buf = (void *)info.ntwrk_buf_start;
905 *data = (FILE_ALL_INFO *)info.srch_entries_start;
908 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
910 static void cifs_set_fattr_ino(int xid, struct cifs_tcon *tcon, struct super_block *sb,
911 struct inode **inode, const char *full_path,
912 struct cifs_open_info_data *data, struct cifs_fattr *fattr)
914 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
915 struct TCP_Server_Info *server = tcon->ses->server;
918 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
920 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
922 fattr->cf_uniqueid = iunique(sb, ROOT_I);
927 * If we have an inode pass a NULL tcon to ensure we don't
928 * make a round trip to the server. This only works for SMB2+.
930 rc = server->ops->get_srv_inum(xid, *inode ? NULL : tcon, cifs_sb, full_path,
931 &fattr->cf_uniqueid, data);
934 * If that fails reuse existing ino or generate one
935 * and disable server ones
938 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
940 fattr->cf_uniqueid = iunique(sb, ROOT_I);
941 cifs_autodisable_serverino(cifs_sb);
946 /* If no errors, check for zero root inode (invalid) */
947 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
948 cifs_dbg(FYI, "Invalid (0) inodenum\n");
951 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
953 /* make an ino by hashing the UNC */
954 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
955 fattr->cf_uniqueid = simple_hashstr(tcon->tree_name);
960 static inline bool is_inode_cache_good(struct inode *ino)
962 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
965 int cifs_get_inode_info(struct inode **inode, const char *full_path,
966 struct cifs_open_info_data *data, struct super_block *sb, int xid,
967 const struct cifs_fid *fid)
969 struct cifs_tcon *tcon;
970 struct TCP_Server_Info *server;
971 struct tcon_link *tlink;
972 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
973 bool adjust_tz = false;
974 struct cifs_fattr fattr = {0};
975 bool is_reparse_point = false;
976 struct cifs_open_info_data tmp_data = {};
977 void *smb1_backup_rsp_buf = NULL;
980 __u32 reparse_tag = 0;
982 tlink = cifs_sb_tlink(cifs_sb);
984 return PTR_ERR(tlink);
985 tcon = tlink_tcon(tlink);
986 server = tcon->ses->server;
989 * 1. Fetch file metadata if not provided (data)
993 if (is_inode_cache_good(*inode)) {
994 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
997 rc = server->ops->query_path_info(xid, tcon, cifs_sb, full_path, &tmp_data,
998 &adjust_tz, &is_reparse_point);
1003 * 2. Convert it to internal cifs metadata (fattr)
1009 * If the file is a reparse point, it is more complicated
1010 * since we have to check if its reparse tag matches a known
1011 * special file type e.g. symlink or fifo or char etc.
1013 if (is_reparse_point && data->symlink_target) {
1014 reparse_tag = IO_REPARSE_TAG_SYMLINK;
1015 } else if ((le32_to_cpu(data->fi.Attributes) & ATTR_REPARSE) &&
1016 server->ops->query_reparse_tag) {
1017 tmprc = server->ops->query_reparse_tag(xid, tcon, cifs_sb, full_path,
1020 cifs_dbg(FYI, "%s: query_reparse_tag: rc = %d\n", __func__, tmprc);
1021 if (server->ops->query_symlink) {
1022 tmprc = server->ops->query_symlink(xid, tcon, cifs_sb, full_path,
1023 &data->symlink_target,
1026 cifs_dbg(FYI, "%s: query_symlink: rc = %d\n", __func__,
1030 cifs_open_info_to_fattr(&fattr, data, sb, adjust_tz, is_reparse_point, reparse_tag);
1033 /* DFS link, no metadata available on this server */
1034 cifs_create_dfs_fattr(&fattr, sb);
1038 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1040 * perm errors, try again with backup flags if possible
1042 * For SMB2 and later the backup intent flag
1043 * is already sent if needed on open and there
1044 * is no path based FindFirst operation to use
1047 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
1048 /* for easier reading */
1050 FILE_DIRECTORY_INFO *fdi;
1051 SEARCH_ID_FULL_DIR_INFO *si;
1053 rc = cifs_backup_query_path_info(xid, tcon, sb,
1055 &smb1_backup_rsp_buf,
1060 move_cifs_info_to_smb2(&data->fi, fi);
1061 fdi = (FILE_DIRECTORY_INFO *)fi;
1062 si = (SEARCH_ID_FULL_DIR_INFO *)fi;
1064 cifs_dir_info_to_fattr(&fattr, fdi, cifs_sb);
1065 fattr.cf_uniqueid = le64_to_cpu(si->UniqueId);
1066 /* uniqueid set, skip get inum step */
1067 goto handle_mnt_opt;
1069 /* nothing we can do, bail out */
1074 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1077 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1082 * 3. Get or update inode number (fattr.cf_uniqueid)
1085 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, &fattr);
1088 * 4. Tweak fattr based on mount options
1090 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1092 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1093 /* query for SFU type info if supported and needed */
1094 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
1095 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
1096 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
1098 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1101 /* fill in 0777 bits from ACL */
1102 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1103 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, true,
1108 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1112 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1113 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, false,
1118 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1124 /* fill in remaining high mode bits e.g. SUID, VTX */
1125 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1126 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
1128 /* check for Minshall+French symlinks */
1129 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1130 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1133 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1137 * 5. Update inode with final fattr data
1141 *inode = cifs_iget(sb, &fattr);
1145 /* we already have inode, update it */
1147 /* if uniqueid is different, return error */
1148 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1149 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1150 CIFS_I(*inode)->time = 0; /* force reval */
1154 /* if filetype is different, return error */
1155 rc = cifs_fattr_to_inode(*inode, &fattr);
1158 cifs_buf_release(smb1_backup_rsp_buf);
1159 cifs_put_tlink(tlink);
1160 cifs_free_open_info(&tmp_data);
1161 kfree(fattr.cf_symlink_target);
1166 smb311_posix_get_inode_info(struct inode **inode,
1167 const char *full_path,
1168 struct super_block *sb, unsigned int xid)
1170 struct cifs_tcon *tcon;
1171 struct tcon_link *tlink;
1172 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1173 bool adjust_tz = false;
1174 struct cifs_fattr fattr = {0};
1175 bool symlink = false;
1176 struct cifs_open_info_data data = {};
1180 tlink = cifs_sb_tlink(cifs_sb);
1182 return PTR_ERR(tlink);
1183 tcon = tlink_tcon(tlink);
1186 * 1. Fetch file metadata
1189 if (is_inode_cache_good(*inode)) {
1190 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1194 rc = smb311_posix_query_path_info(xid, tcon, cifs_sb, full_path, &data, &adjust_tz,
1198 * 2. Convert it to internal cifs metadata (fattr)
1203 smb311_posix_info_to_fattr(&fattr, &data, sb, adjust_tz, symlink);
1206 /* DFS link, no metadata available on this server */
1207 cifs_create_dfs_fattr(&fattr, sb);
1212 * For SMB2 and later the backup intent flag
1213 * is already sent if needed on open and there
1214 * is no path based FindFirst operation to use
1215 * to retry with so nothing we can do, bail out
1219 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1225 * 3. Tweak fattr based on mount options
1228 /* check for Minshall+French symlinks */
1229 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1230 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1233 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1237 * 4. Update inode with final fattr data
1241 *inode = cifs_iget(sb, &fattr);
1245 /* we already have inode, update it */
1247 /* if uniqueid is different, return error */
1248 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1249 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1250 CIFS_I(*inode)->time = 0; /* force reval */
1255 /* if filetype is different, return error */
1256 rc = cifs_fattr_to_inode(*inode, &fattr);
1259 cifs_put_tlink(tlink);
1260 cifs_free_open_info(&data);
1261 kfree(fattr.cf_symlink_target);
1266 static const struct inode_operations cifs_ipc_inode_ops = {
1267 .lookup = cifs_lookup,
1271 cifs_find_inode(struct inode *inode, void *opaque)
1273 struct cifs_fattr *fattr = opaque;
1275 /* don't match inode with different uniqueid */
1276 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1279 /* use createtime like an i_generation field */
1280 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1283 /* don't match inode of different type */
1284 if (inode_wrong_type(inode, fattr->cf_mode))
1287 /* if it's not a directory or has no dentries, then flag it */
1288 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1289 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1295 cifs_init_inode(struct inode *inode, void *opaque)
1297 struct cifs_fattr *fattr = opaque;
1299 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1300 CIFS_I(inode)->createtime = fattr->cf_createtime;
1305 * walk dentry list for an inode and report whether it has aliases that
1306 * are hashed. We use this to determine if a directory inode can actually
1310 inode_has_hashed_dentries(struct inode *inode)
1312 struct dentry *dentry;
1314 spin_lock(&inode->i_lock);
1315 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1316 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1317 spin_unlock(&inode->i_lock);
1321 spin_unlock(&inode->i_lock);
1325 /* Given fattrs, get a corresponding inode */
1327 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1330 struct inode *inode;
1333 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1335 /* hash down to 32-bits on 32-bit arch */
1336 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1338 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1340 /* was there a potentially problematic inode collision? */
1341 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1342 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1344 if (inode_has_hashed_dentries(inode)) {
1345 cifs_autodisable_serverino(CIFS_SB(sb));
1347 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1348 goto retry_iget5_locked;
1352 /* can't fail - see cifs_find_inode() */
1353 cifs_fattr_to_inode(inode, fattr);
1354 if (sb->s_flags & SB_NOATIME)
1355 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1356 if (inode->i_state & I_NEW) {
1357 inode->i_ino = hash;
1358 cifs_fscache_get_inode_cookie(inode);
1359 unlock_new_inode(inode);
1366 /* gets root inode */
1367 struct inode *cifs_root_iget(struct super_block *sb)
1370 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1371 struct inode *inode = NULL;
1373 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1377 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1378 && cifs_sb->prepath) {
1379 len = strlen(cifs_sb->prepath);
1380 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1382 return ERR_PTR(-ENOMEM);
1384 memcpy(path+1, cifs_sb->prepath, len);
1386 path = kstrdup("", GFP_KERNEL);
1388 return ERR_PTR(-ENOMEM);
1392 if (tcon->unix_ext) {
1393 rc = cifs_get_inode_info_unix(&inode, path, sb, xid);
1394 /* some servers mistakenly claim POSIX support */
1395 if (rc != -EOPNOTSUPP)
1397 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1398 tcon->unix_ext = false;
1401 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1402 if (tcon->posix_extensions)
1403 rc = smb311_posix_get_inode_info(&inode, path, sb, xid);
1405 rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL);
1409 inode = ERR_PTR(rc);
1413 if (rc && tcon->pipe) {
1414 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1415 spin_lock(&inode->i_lock);
1416 inode->i_mode |= S_IFDIR;
1417 set_nlink(inode, 2);
1418 inode->i_op = &cifs_ipc_inode_ops;
1419 inode->i_fop = &simple_dir_operations;
1420 inode->i_uid = cifs_sb->ctx->linux_uid;
1421 inode->i_gid = cifs_sb->ctx->linux_gid;
1422 spin_unlock(&inode->i_lock);
1425 inode = ERR_PTR(rc);
1435 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1436 const char *full_path, __u32 dosattr)
1438 bool set_time = false;
1439 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1440 struct TCP_Server_Info *server;
1441 FILE_BASIC_INFO info_buf;
1446 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1447 if (!server->ops->set_file_info)
1452 if (attrs->ia_valid & ATTR_ATIME) {
1454 info_buf.LastAccessTime =
1455 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1457 info_buf.LastAccessTime = 0;
1459 if (attrs->ia_valid & ATTR_MTIME) {
1461 info_buf.LastWriteTime =
1462 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1464 info_buf.LastWriteTime = 0;
1467 * Samba throws this field away, but windows may actually use it.
1468 * Do not set ctime unless other time stamps are changed explicitly
1469 * (i.e. by utimes()) since we would then have a mix of client and
1472 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1473 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1474 info_buf.ChangeTime =
1475 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1477 info_buf.ChangeTime = 0;
1479 info_buf.CreationTime = 0; /* don't change */
1480 info_buf.Attributes = cpu_to_le32(dosattr);
1482 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1485 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1487 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1488 * and rename it to a random name that hopefully won't conflict with
1492 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1493 const unsigned int xid)
1497 struct cifs_fid fid;
1498 struct cifs_open_parms oparms;
1499 struct inode *inode = d_inode(dentry);
1500 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1501 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1502 struct tcon_link *tlink;
1503 struct cifs_tcon *tcon;
1504 __u32 dosattr, origattr;
1505 FILE_BASIC_INFO *info_buf = NULL;
1507 tlink = cifs_sb_tlink(cifs_sb);
1509 return PTR_ERR(tlink);
1510 tcon = tlink_tcon(tlink);
1513 * We cannot rename the file if the server doesn't support
1514 * CAP_INFOLEVEL_PASSTHRU
1516 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1521 oparms = (struct cifs_open_parms) {
1524 .desired_access = DELETE | FILE_WRITE_ATTRIBUTES,
1525 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
1526 .disposition = FILE_OPEN,
1531 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1535 origattr = cifsInode->cifsAttrs;
1537 origattr |= ATTR_NORMAL;
1539 dosattr = origattr & ~ATTR_READONLY;
1541 dosattr |= ATTR_NORMAL;
1542 dosattr |= ATTR_HIDDEN;
1544 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1545 if (dosattr != origattr) {
1546 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1547 if (info_buf == NULL) {
1551 info_buf->Attributes = cpu_to_le32(dosattr);
1552 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1554 /* although we would like to mark the file hidden
1555 if that fails we will still try to rename it */
1557 cifsInode->cifsAttrs = dosattr;
1559 dosattr = origattr; /* since not able to change them */
1562 /* rename the file */
1563 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1565 cifs_remap(cifs_sb));
1571 /* try to set DELETE_ON_CLOSE */
1572 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1573 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1576 * some samba versions return -ENOENT when we try to set the
1577 * file disposition here. Likely a samba bug, but work around
1578 * it for now. This means that some cifsXXX files may hang
1579 * around after they shouldn't.
1581 * BB: remove this hack after more servers have the fix
1589 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1593 CIFSSMBClose(xid, tcon, fid.netfid);
1596 cifs_put_tlink(tlink);
1600 * reset everything back to the original state. Don't bother
1601 * dealing with errors here since we can't do anything about
1605 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1606 cifs_sb->local_nls, cifs_remap(cifs_sb));
1608 if (dosattr != origattr) {
1609 info_buf->Attributes = cpu_to_le32(origattr);
1610 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1612 cifsInode->cifsAttrs = origattr;
1617 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1619 /* copied from fs/nfs/dir.c with small changes */
1621 cifs_drop_nlink(struct inode *inode)
1623 spin_lock(&inode->i_lock);
1624 if (inode->i_nlink > 0)
1626 spin_unlock(&inode->i_lock);
1630 * If d_inode(dentry) is null (usually meaning the cached dentry
1631 * is a negative dentry) then we would attempt a standard SMB delete, but
1632 * if that fails we can not attempt the fall back mechanisms on EACCES
1633 * but will return the EACCES to the caller. Note that the VFS does not call
1634 * unlink on negative dentries currently.
1636 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1640 const char *full_path;
1642 struct inode *inode = d_inode(dentry);
1643 struct cifsInodeInfo *cifs_inode;
1644 struct super_block *sb = dir->i_sb;
1645 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1646 struct tcon_link *tlink;
1647 struct cifs_tcon *tcon;
1648 struct TCP_Server_Info *server;
1649 struct iattr *attrs = NULL;
1650 __u32 dosattr = 0, origattr = 0;
1652 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1654 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1657 tlink = cifs_sb_tlink(cifs_sb);
1659 return PTR_ERR(tlink);
1660 tcon = tlink_tcon(tlink);
1661 server = tcon->ses->server;
1664 page = alloc_dentry_path();
1666 if (tcon->nodelete) {
1671 /* Unlink can be called from rename so we can not take the
1672 * sb->s_vfs_rename_mutex here */
1673 full_path = build_path_from_dentry(dentry, page);
1674 if (IS_ERR(full_path)) {
1675 rc = PTR_ERR(full_path);
1679 cifs_close_deferred_file_under_dentry(tcon, full_path);
1680 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1681 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1682 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1683 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1684 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1685 cifs_remap(cifs_sb));
1686 cifs_dbg(FYI, "posix del rc %d\n", rc);
1687 if ((rc == 0) || (rc == -ENOENT))
1688 goto psx_del_no_retry;
1690 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1693 if (!server->ops->unlink) {
1695 goto psx_del_no_retry;
1698 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1703 cifs_drop_nlink(inode);
1704 } else if (rc == -ENOENT) {
1706 } else if (rc == -EBUSY) {
1707 if (server->ops->rename_pending_delete) {
1708 rc = server->ops->rename_pending_delete(full_path,
1711 cifs_drop_nlink(inode);
1713 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1714 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1715 if (attrs == NULL) {
1720 /* try to reset dos attributes */
1721 cifs_inode = CIFS_I(inode);
1722 origattr = cifs_inode->cifsAttrs;
1724 origattr |= ATTR_NORMAL;
1725 dosattr = origattr & ~ATTR_READONLY;
1727 dosattr |= ATTR_NORMAL;
1728 dosattr |= ATTR_HIDDEN;
1730 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1734 goto retry_std_delete;
1737 /* undo the setattr if we errored out and it's needed */
1738 if (rc != 0 && dosattr != 0)
1739 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1743 cifs_inode = CIFS_I(inode);
1744 cifs_inode->time = 0; /* will force revalidate to get info
1746 inode->i_ctime = current_time(inode);
1748 dir->i_ctime = dir->i_mtime = current_time(dir);
1749 cifs_inode = CIFS_I(dir);
1750 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1752 free_dentry_path(page);
1755 cifs_put_tlink(tlink);
1760 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1761 const char *full_path, struct cifs_sb_info *cifs_sb,
1762 struct cifs_tcon *tcon, const unsigned int xid)
1765 struct inode *inode = NULL;
1767 if (tcon->posix_extensions)
1768 rc = smb311_posix_get_inode_info(&inode, full_path, parent->i_sb, xid);
1769 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1770 else if (tcon->unix_ext)
1771 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1773 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1775 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1781 if (!S_ISDIR(inode->i_mode)) {
1783 * mkdir succeeded, but another client has managed to remove the
1784 * sucker and replace it with non-directory. Return success,
1785 * but don't leave the child in dcache.
1792 * setting nlink not necessary except in cases where we failed to get it
1793 * from the server or was set bogus. Also, since this is a brand new
1794 * inode, no need to grab the i_lock before setting the i_nlink.
1796 if (inode->i_nlink < 2)
1797 set_nlink(inode, 2);
1798 mode &= ~current_umask();
1799 /* must turn on setgid bit if parent dir has it */
1800 if (parent->i_mode & S_ISGID)
1803 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1804 if (tcon->unix_ext) {
1805 struct cifs_unix_set_info_args args = {
1807 .ctime = NO_CHANGE_64,
1808 .atime = NO_CHANGE_64,
1809 .mtime = NO_CHANGE_64,
1812 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1813 args.uid = current_fsuid();
1814 if (parent->i_mode & S_ISGID)
1815 args.gid = parent->i_gid;
1817 args.gid = current_fsgid();
1819 args.uid = INVALID_UID; /* no change */
1820 args.gid = INVALID_GID; /* no change */
1822 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1824 cifs_remap(cifs_sb));
1828 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1829 struct TCP_Server_Info *server = tcon->ses->server;
1830 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1831 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1832 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1834 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1835 inode->i_mode = (mode | S_IFDIR);
1837 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1838 inode->i_uid = current_fsuid();
1839 if (inode->i_mode & S_ISGID)
1840 inode->i_gid = parent->i_gid;
1842 inode->i_gid = current_fsgid();
1845 d_instantiate(dentry, inode);
1849 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1851 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1852 const char *full_path, struct cifs_sb_info *cifs_sb,
1853 struct cifs_tcon *tcon, const unsigned int xid)
1857 FILE_UNIX_BASIC_INFO *info = NULL;
1858 struct inode *newinode = NULL;
1859 struct cifs_fattr fattr;
1861 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1864 goto posix_mkdir_out;
1867 mode &= ~current_umask();
1868 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1869 NULL /* netfid */, info, &oplock, full_path,
1870 cifs_sb->local_nls, cifs_remap(cifs_sb));
1871 if (rc == -EOPNOTSUPP)
1872 goto posix_mkdir_out;
1874 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1876 goto posix_mkdir_out;
1879 if (info->Type == cpu_to_le32(-1))
1880 /* no return info, go query for it */
1881 goto posix_mkdir_get_info;
1883 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1884 * need to set uid/gid.
1887 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1888 cifs_fill_uniqueid(inode->i_sb, &fattr);
1889 newinode = cifs_iget(inode->i_sb, &fattr);
1891 goto posix_mkdir_get_info;
1893 d_instantiate(dentry, newinode);
1895 #ifdef CONFIG_CIFS_DEBUG2
1896 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1897 dentry, dentry, newinode);
1899 if (newinode->i_nlink != 2)
1900 cifs_dbg(FYI, "unexpected number of links %d\n",
1907 posix_mkdir_get_info:
1908 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1910 goto posix_mkdir_out;
1912 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1914 int cifs_mkdir(struct user_namespace *mnt_userns, struct inode *inode,
1915 struct dentry *direntry, umode_t mode)
1919 struct cifs_sb_info *cifs_sb;
1920 struct tcon_link *tlink;
1921 struct cifs_tcon *tcon;
1922 struct TCP_Server_Info *server;
1923 const char *full_path;
1926 cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
1929 cifs_sb = CIFS_SB(inode->i_sb);
1930 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1932 tlink = cifs_sb_tlink(cifs_sb);
1934 return PTR_ERR(tlink);
1935 tcon = tlink_tcon(tlink);
1939 page = alloc_dentry_path();
1940 full_path = build_path_from_dentry(direntry, page);
1941 if (IS_ERR(full_path)) {
1942 rc = PTR_ERR(full_path);
1946 server = tcon->ses->server;
1948 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
1949 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
1951 d_drop(direntry); /* for time being always refresh inode info */
1955 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1956 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1957 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1958 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1960 if (rc != -EOPNOTSUPP)
1963 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1965 if (!server->ops->mkdir) {
1970 /* BB add setting the equivalent of mode via CreateX w/ACLs */
1971 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
1973 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1978 /* TODO: skip this for smb2/smb3 */
1979 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1983 * Force revalidate to get parent dir info when needed since cached
1984 * attributes are invalid now.
1986 CIFS_I(inode)->time = 0;
1987 free_dentry_path(page);
1989 cifs_put_tlink(tlink);
1993 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1997 struct cifs_sb_info *cifs_sb;
1998 struct tcon_link *tlink;
1999 struct cifs_tcon *tcon;
2000 struct TCP_Server_Info *server;
2001 const char *full_path;
2002 void *page = alloc_dentry_path();
2003 struct cifsInodeInfo *cifsInode;
2005 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
2009 full_path = build_path_from_dentry(direntry, page);
2010 if (IS_ERR(full_path)) {
2011 rc = PTR_ERR(full_path);
2015 cifs_sb = CIFS_SB(inode->i_sb);
2016 if (unlikely(cifs_forced_shutdown(cifs_sb))) {
2021 tlink = cifs_sb_tlink(cifs_sb);
2022 if (IS_ERR(tlink)) {
2023 rc = PTR_ERR(tlink);
2026 tcon = tlink_tcon(tlink);
2027 server = tcon->ses->server;
2029 if (!server->ops->rmdir) {
2031 cifs_put_tlink(tlink);
2035 if (tcon->nodelete) {
2037 cifs_put_tlink(tlink);
2041 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
2042 cifs_put_tlink(tlink);
2045 spin_lock(&d_inode(direntry)->i_lock);
2046 i_size_write(d_inode(direntry), 0);
2047 clear_nlink(d_inode(direntry));
2048 spin_unlock(&d_inode(direntry)->i_lock);
2051 cifsInode = CIFS_I(d_inode(direntry));
2052 /* force revalidate to go get info when needed */
2053 cifsInode->time = 0;
2055 cifsInode = CIFS_I(inode);
2057 * Force revalidate to get parent dir info when needed since cached
2058 * attributes are invalid now.
2060 cifsInode->time = 0;
2062 d_inode(direntry)->i_ctime = inode->i_ctime = inode->i_mtime =
2063 current_time(inode);
2066 free_dentry_path(page);
2072 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2073 const char *from_path, struct dentry *to_dentry,
2074 const char *to_path)
2076 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2077 struct tcon_link *tlink;
2078 struct cifs_tcon *tcon;
2079 struct TCP_Server_Info *server;
2080 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2081 struct cifs_fid fid;
2082 struct cifs_open_parms oparms;
2084 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2087 tlink = cifs_sb_tlink(cifs_sb);
2089 return PTR_ERR(tlink);
2090 tcon = tlink_tcon(tlink);
2091 server = tcon->ses->server;
2093 if (!server->ops->rename)
2096 /* try path-based rename first */
2097 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
2100 * Don't bother with rename by filehandle unless file is busy and
2101 * source. Note that cross directory moves do not work with
2102 * rename by filehandle to various Windows servers.
2104 if (rc == 0 || rc != -EBUSY)
2105 goto do_rename_exit;
2107 /* Don't fall back to using SMB on SMB 2+ mount */
2108 if (server->vals->protocol_id != 0)
2109 goto do_rename_exit;
2111 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2112 /* open-file renames don't work across directories */
2113 if (to_dentry->d_parent != from_dentry->d_parent)
2114 goto do_rename_exit;
2116 oparms = (struct cifs_open_parms) {
2119 /* open the file to be renamed -- we need DELETE perms */
2120 .desired_access = DELETE,
2121 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
2122 .disposition = FILE_OPEN,
2127 rc = CIFS_open(xid, &oparms, &oplock, NULL);
2129 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2130 (const char *) to_dentry->d_name.name,
2131 cifs_sb->local_nls, cifs_remap(cifs_sb));
2132 CIFSSMBClose(xid, tcon, fid.netfid);
2134 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2137 d_move(from_dentry, to_dentry);
2138 cifs_put_tlink(tlink);
2143 cifs_rename2(struct user_namespace *mnt_userns, struct inode *source_dir,
2144 struct dentry *source_dentry, struct inode *target_dir,
2145 struct dentry *target_dentry, unsigned int flags)
2147 const char *from_name, *to_name;
2148 void *page1, *page2;
2149 struct cifs_sb_info *cifs_sb;
2150 struct tcon_link *tlink;
2151 struct cifs_tcon *tcon;
2154 int retry_count = 0;
2155 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2156 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2157 FILE_UNIX_BASIC_INFO *info_buf_target;
2158 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2160 if (flags & ~RENAME_NOREPLACE)
2163 cifs_sb = CIFS_SB(source_dir->i_sb);
2164 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2167 tlink = cifs_sb_tlink(cifs_sb);
2169 return PTR_ERR(tlink);
2170 tcon = tlink_tcon(tlink);
2172 page1 = alloc_dentry_path();
2173 page2 = alloc_dentry_path();
2176 from_name = build_path_from_dentry(source_dentry, page1);
2177 if (IS_ERR(from_name)) {
2178 rc = PTR_ERR(from_name);
2179 goto cifs_rename_exit;
2182 to_name = build_path_from_dentry(target_dentry, page2);
2183 if (IS_ERR(to_name)) {
2184 rc = PTR_ERR(to_name);
2185 goto cifs_rename_exit;
2188 cifs_close_deferred_file_under_dentry(tcon, from_name);
2189 if (d_inode(target_dentry) != NULL)
2190 cifs_close_deferred_file_under_dentry(tcon, to_name);
2192 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2195 if (rc == -EACCES) {
2196 while (retry_count < 3) {
2197 cifs_close_all_deferred_files(tcon);
2198 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2207 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2209 if (flags & RENAME_NOREPLACE)
2210 goto cifs_rename_exit;
2212 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2213 if (rc == -EEXIST && tcon->unix_ext) {
2215 * Are src and dst hardlinks of same inode? We can only tell
2216 * with unix extensions enabled.
2219 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2221 if (info_buf_source == NULL) {
2223 goto cifs_rename_exit;
2226 info_buf_target = info_buf_source + 1;
2227 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2230 cifs_remap(cifs_sb));
2234 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2237 cifs_remap(cifs_sb));
2239 if (tmprc == 0 && (info_buf_source->UniqueId ==
2240 info_buf_target->UniqueId)) {
2241 /* same file, POSIX says that this is a noop */
2243 goto cifs_rename_exit;
2247 * else ... BB we could add the same check for Windows by
2248 * checking the UniqueId via FILE_INTERNAL_INFO
2252 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2254 /* Try unlinking the target dentry if it's not negative */
2255 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2256 if (d_is_dir(target_dentry))
2257 tmprc = cifs_rmdir(target_dir, target_dentry);
2259 tmprc = cifs_unlink(target_dir, target_dentry);
2261 goto cifs_rename_exit;
2262 rc = cifs_do_rename(xid, source_dentry, from_name,
2263 target_dentry, to_name);
2266 /* force revalidate to go get info when needed */
2267 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2269 source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
2270 target_dir->i_mtime = current_time(source_dir);
2273 kfree(info_buf_source);
2274 free_dentry_path(page2);
2275 free_dentry_path(page1);
2277 cifs_put_tlink(tlink);
2282 cifs_dentry_needs_reval(struct dentry *dentry)
2284 struct inode *inode = d_inode(dentry);
2285 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2286 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2287 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2288 struct cached_fid *cfid = NULL;
2290 if (cifs_i->time == 0)
2293 if (CIFS_CACHE_READ(cifs_i))
2296 if (!lookupCacheEnabled)
2299 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2300 spin_lock(&cfid->fid_lock);
2301 if (cfid->time && cifs_i->time > cfid->time) {
2302 spin_unlock(&cfid->fid_lock);
2303 close_cached_dir(cfid);
2306 spin_unlock(&cfid->fid_lock);
2307 close_cached_dir(cfid);
2310 * depending on inode type, check if attribute caching disabled for
2311 * files or directories
2313 if (S_ISDIR(inode->i_mode)) {
2314 if (!cifs_sb->ctx->acdirmax)
2316 if (!time_in_range(jiffies, cifs_i->time,
2317 cifs_i->time + cifs_sb->ctx->acdirmax))
2320 if (!cifs_sb->ctx->acregmax)
2322 if (!time_in_range(jiffies, cifs_i->time,
2323 cifs_i->time + cifs_sb->ctx->acregmax))
2327 /* hardlinked files w/ noserverino get "special" treatment */
2328 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2329 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2336 * Zap the cache. Called when invalid_mapping flag is set.
2339 cifs_invalidate_mapping(struct inode *inode)
2343 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2344 rc = invalidate_inode_pages2(inode->i_mapping);
2346 cifs_dbg(VFS, "%s: Could not invalidate inode %p\n",
2354 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2356 * @key: currently unused
2357 * @mode: the task state to sleep in
2360 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2363 if (signal_pending_state(mode, current))
2364 return -ERESTARTSYS;
2369 cifs_revalidate_mapping(struct inode *inode)
2372 unsigned long *flags = &CIFS_I(inode)->flags;
2373 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2375 /* swapfiles are not supposed to be shared */
2376 if (IS_SWAPFILE(inode))
2379 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2380 TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
2384 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2385 /* for cache=singleclient, do not invalidate */
2386 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2387 goto skip_invalidate;
2389 rc = cifs_invalidate_mapping(inode);
2391 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2395 clear_bit_unlock(CIFS_INO_LOCK, flags);
2396 smp_mb__after_atomic();
2397 wake_up_bit(flags, CIFS_INO_LOCK);
2403 cifs_zap_mapping(struct inode *inode)
2405 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2406 return cifs_revalidate_mapping(inode);
2409 int cifs_revalidate_file_attr(struct file *filp)
2412 struct dentry *dentry = file_dentry(filp);
2413 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2414 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2415 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2417 if (!cifs_dentry_needs_reval(dentry))
2420 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2421 if (tlink_tcon(cfile->tlink)->unix_ext)
2422 rc = cifs_get_file_info_unix(filp);
2424 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2425 rc = cifs_get_file_info(filp);
2430 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2434 struct inode *inode = d_inode(dentry);
2435 struct super_block *sb = dentry->d_sb;
2436 const char *full_path;
2443 if (!cifs_dentry_needs_reval(dentry))
2448 page = alloc_dentry_path();
2449 full_path = build_path_from_dentry(dentry, page);
2450 if (IS_ERR(full_path)) {
2451 rc = PTR_ERR(full_path);
2455 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2456 full_path, inode, inode->i_count.counter,
2457 dentry, cifs_get_time(dentry), jiffies);
2460 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2461 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2462 else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2463 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2465 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2467 if (rc == -EAGAIN && count++ < 10)
2470 free_dentry_path(page);
2476 int cifs_revalidate_file(struct file *filp)
2479 struct inode *inode = file_inode(filp);
2481 rc = cifs_revalidate_file_attr(filp);
2485 return cifs_revalidate_mapping(inode);
2488 /* revalidate a dentry's inode attributes */
2489 int cifs_revalidate_dentry(struct dentry *dentry)
2492 struct inode *inode = d_inode(dentry);
2494 rc = cifs_revalidate_dentry_attr(dentry);
2498 return cifs_revalidate_mapping(inode);
2501 int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
2502 struct kstat *stat, u32 request_mask, unsigned int flags)
2504 struct dentry *dentry = path->dentry;
2505 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2506 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2507 struct inode *inode = d_inode(dentry);
2510 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2514 * We need to be sure that all dirty pages are written and the server
2515 * has actual ctime, mtime and file length.
2517 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2518 !CIFS_CACHE_READ(CIFS_I(inode)) &&
2519 inode->i_mapping && inode->i_mapping->nrpages != 0) {
2520 rc = filemap_fdatawait(inode->i_mapping);
2522 mapping_set_error(inode->i_mapping, rc);
2527 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2528 CIFS_I(inode)->time = 0; /* force revalidate */
2531 * If the caller doesn't require syncing, only sync if
2532 * necessary (e.g. due to earlier truncate or setattr
2533 * invalidating the cached metadata)
2535 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2536 (CIFS_I(inode)->time == 0)) {
2537 rc = cifs_revalidate_dentry_attr(dentry);
2542 generic_fillattr(&init_user_ns, inode, stat);
2543 stat->blksize = cifs_sb->ctx->bsize;
2544 stat->ino = CIFS_I(inode)->uniqueid;
2546 /* old CIFS Unix Extensions doesn't return create time */
2547 if (CIFS_I(inode)->createtime) {
2548 stat->result_mask |= STATX_BTIME;
2550 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2553 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2554 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2555 stat->attributes |= STATX_ATTR_COMPRESSED;
2556 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2557 stat->attributes |= STATX_ATTR_ENCRYPTED;
2560 * If on a multiuser mount without unix extensions or cifsacl being
2561 * enabled, and the admin hasn't overridden them, set the ownership
2562 * to the fsuid/fsgid of the current process.
2564 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2565 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2567 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2568 stat->uid = current_fsuid();
2569 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2570 stat->gid = current_fsgid();
2575 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2578 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2579 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->netfs.inode.i_sb);
2580 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2581 struct TCP_Server_Info *server = tcon->ses->server;
2582 struct cifsFileInfo *cfile;
2585 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2589 * We need to be sure that all dirty pages are written as they
2590 * might fill holes on the server.
2592 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2593 inode->i_mapping->nrpages != 0) {
2594 rc = filemap_fdatawait(inode->i_mapping);
2596 mapping_set_error(inode->i_mapping, rc);
2601 cfile = find_readable_file(cifs_i, false);
2605 if (server->ops->fiemap) {
2606 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2607 cifsFileInfo_put(cfile);
2611 cifsFileInfo_put(cfile);
2615 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2617 pgoff_t index = from >> PAGE_SHIFT;
2618 unsigned offset = from & (PAGE_SIZE - 1);
2622 page = grab_cache_page(mapping, index);
2626 zero_user_segment(page, offset, PAGE_SIZE);
2632 void cifs_setsize(struct inode *inode, loff_t offset)
2634 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2636 spin_lock(&inode->i_lock);
2637 i_size_write(inode, offset);
2638 spin_unlock(&inode->i_lock);
2640 /* Cached inode must be refreshed on truncate */
2642 truncate_pagecache(inode, offset);
2646 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2647 unsigned int xid, const char *full_path)
2650 struct cifsFileInfo *open_file;
2651 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2652 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2653 struct tcon_link *tlink = NULL;
2654 struct cifs_tcon *tcon = NULL;
2655 struct TCP_Server_Info *server;
2658 * To avoid spurious oplock breaks from server, in the case of
2659 * inodes that we already have open, avoid doing path based
2660 * setting of file size if we can do it by handle.
2661 * This keeps our caching token (oplock) and avoids timeouts
2662 * when the local oplock break takes longer to flush
2663 * writebehind data than the SMB timeout for the SetPathInfo
2664 * request would allow
2666 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2668 tcon = tlink_tcon(open_file->tlink);
2669 server = tcon->ses->server;
2670 if (server->ops->set_file_size)
2671 rc = server->ops->set_file_size(xid, tcon, open_file,
2672 attrs->ia_size, false);
2675 cifsFileInfo_put(open_file);
2676 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2684 tlink = cifs_sb_tlink(cifs_sb);
2686 return PTR_ERR(tlink);
2687 tcon = tlink_tcon(tlink);
2688 server = tcon->ses->server;
2692 * Set file size by pathname rather than by handle either because no
2693 * valid, writeable file handle for it was found or because there was
2694 * an error setting it by handle.
2696 if (server->ops->set_path_size)
2697 rc = server->ops->set_path_size(xid, tcon, full_path,
2698 attrs->ia_size, cifs_sb, false);
2701 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2704 cifs_put_tlink(tlink);
2708 cifsInode->server_eof = attrs->ia_size;
2709 cifs_setsize(inode, attrs->ia_size);
2711 * i_blocks is not related to (i_size / i_blksize), but instead
2712 * 512 byte (2**9) size is required for calculating num blocks.
2713 * Until we can query the server for actual allocation size,
2714 * this is best estimate we have for blocks allocated for a file
2715 * Number of blocks must be rounded up so size 1 is not 0 blocks
2717 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2720 * The man page of truncate says if the size changed,
2721 * then the st_ctime and st_mtime fields for the file
2724 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2725 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2727 cifs_truncate_page(inode->i_mapping, inode->i_size);
2733 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2735 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2739 const char *full_path;
2740 void *page = alloc_dentry_path();
2741 struct inode *inode = d_inode(direntry);
2742 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2743 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2744 struct tcon_link *tlink;
2745 struct cifs_tcon *pTcon;
2746 struct cifs_unix_set_info_args *args = NULL;
2747 struct cifsFileInfo *open_file;
2749 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2750 direntry, attrs->ia_valid);
2754 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2755 attrs->ia_valid |= ATTR_FORCE;
2757 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2761 full_path = build_path_from_dentry(direntry, page);
2762 if (IS_ERR(full_path)) {
2763 rc = PTR_ERR(full_path);
2768 * Attempt to flush data before changing attributes. We need to do
2769 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2770 * ownership or mode then we may also need to do this. Here, we take
2771 * the safe way out and just do the flush on all setattr requests. If
2772 * the flush returns error, store it to report later and continue.
2774 * BB: This should be smarter. Why bother flushing pages that
2775 * will be truncated anyway? Also, should we error out here if
2776 * the flush returns error?
2778 rc = filemap_write_and_wait(inode->i_mapping);
2779 if (is_interrupt_error(rc)) {
2784 mapping_set_error(inode->i_mapping, rc);
2787 if (attrs->ia_valid & ATTR_SIZE) {
2788 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2793 /* skip mode change if it's just for clearing setuid/setgid */
2794 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2795 attrs->ia_valid &= ~ATTR_MODE;
2797 args = kmalloc(sizeof(*args), GFP_KERNEL);
2803 /* set up the struct */
2804 if (attrs->ia_valid & ATTR_MODE)
2805 args->mode = attrs->ia_mode;
2807 args->mode = NO_CHANGE_64;
2809 if (attrs->ia_valid & ATTR_UID)
2810 args->uid = attrs->ia_uid;
2812 args->uid = INVALID_UID; /* no change */
2814 if (attrs->ia_valid & ATTR_GID)
2815 args->gid = attrs->ia_gid;
2817 args->gid = INVALID_GID; /* no change */
2819 if (attrs->ia_valid & ATTR_ATIME)
2820 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2822 args->atime = NO_CHANGE_64;
2824 if (attrs->ia_valid & ATTR_MTIME)
2825 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2827 args->mtime = NO_CHANGE_64;
2829 if (attrs->ia_valid & ATTR_CTIME)
2830 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2832 args->ctime = NO_CHANGE_64;
2835 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2837 u16 nfid = open_file->fid.netfid;
2838 u32 npid = open_file->pid;
2839 pTcon = tlink_tcon(open_file->tlink);
2840 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2841 cifsFileInfo_put(open_file);
2843 tlink = cifs_sb_tlink(cifs_sb);
2844 if (IS_ERR(tlink)) {
2845 rc = PTR_ERR(tlink);
2848 pTcon = tlink_tcon(tlink);
2849 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2851 cifs_remap(cifs_sb));
2852 cifs_put_tlink(tlink);
2858 if ((attrs->ia_valid & ATTR_SIZE) &&
2859 attrs->ia_size != i_size_read(inode)) {
2860 truncate_setsize(inode, attrs->ia_size);
2861 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
2864 setattr_copy(&init_user_ns, inode, attrs);
2865 mark_inode_dirty(inode);
2867 /* force revalidate when any of these times are set since some
2868 of the fs types (eg ext3, fat) do not have fine enough
2869 time granularity to match protocol, and we do not have a
2870 a way (yet) to query the server fs's time granularity (and
2871 whether it rounds times down).
2873 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2874 cifsInode->time = 0;
2877 free_dentry_path(page);
2881 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2884 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2887 kuid_t uid = INVALID_UID;
2888 kgid_t gid = INVALID_GID;
2889 struct inode *inode = d_inode(direntry);
2890 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2891 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2892 struct cifsFileInfo *wfile;
2893 struct cifs_tcon *tcon;
2894 const char *full_path;
2895 void *page = alloc_dentry_path();
2898 __u64 mode = NO_CHANGE_64;
2902 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2903 direntry, attrs->ia_valid);
2905 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2906 attrs->ia_valid |= ATTR_FORCE;
2908 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2910 goto cifs_setattr_exit;
2912 full_path = build_path_from_dentry(direntry, page);
2913 if (IS_ERR(full_path)) {
2914 rc = PTR_ERR(full_path);
2915 goto cifs_setattr_exit;
2919 * Attempt to flush data before changing attributes. We need to do
2920 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
2921 * returns error, store it to report later and continue.
2923 * BB: This should be smarter. Why bother flushing pages that
2924 * will be truncated anyway? Also, should we error out here if
2925 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
2927 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
2928 rc = filemap_write_and_wait(inode->i_mapping);
2929 if (is_interrupt_error(rc)) {
2931 goto cifs_setattr_exit;
2933 mapping_set_error(inode->i_mapping, rc);
2938 if ((attrs->ia_valid & ATTR_MTIME) &&
2939 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2940 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
2942 tcon = tlink_tcon(wfile->tlink);
2943 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
2944 cifsFileInfo_put(wfile);
2946 goto cifs_setattr_exit;
2947 } else if (rc != -EBADF)
2948 goto cifs_setattr_exit;
2953 if (attrs->ia_valid & ATTR_SIZE) {
2954 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2956 goto cifs_setattr_exit;
2959 if (attrs->ia_valid & ATTR_UID)
2960 uid = attrs->ia_uid;
2962 if (attrs->ia_valid & ATTR_GID)
2963 gid = attrs->ia_gid;
2965 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2966 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2967 if (uid_valid(uid) || gid_valid(gid)) {
2968 mode = NO_CHANGE_64;
2969 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2972 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2974 goto cifs_setattr_exit;
2978 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2979 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2981 /* skip mode change if it's just for clearing setuid/setgid */
2982 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2983 attrs->ia_valid &= ~ATTR_MODE;
2985 if (attrs->ia_valid & ATTR_MODE) {
2986 mode = attrs->ia_mode;
2988 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2989 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2990 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2991 INVALID_UID, INVALID_GID);
2993 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2995 goto cifs_setattr_exit;
2999 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
3000 * Pick up the actual mode bits that were set.
3002 if (mode != attrs->ia_mode)
3003 attrs->ia_mode = mode;
3005 if (((mode & S_IWUGO) == 0) &&
3006 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
3008 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
3010 /* fix up mode if we're not using dynperm */
3011 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
3012 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
3013 } else if ((mode & S_IWUGO) &&
3014 (cifsInode->cifsAttrs & ATTR_READONLY)) {
3016 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
3017 /* Attributes of 0 are ignored */
3019 dosattr |= ATTR_NORMAL;
3021 /* reset local inode permissions to normal */
3022 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3023 attrs->ia_mode &= ~(S_IALLUGO);
3024 if (S_ISDIR(inode->i_mode))
3026 cifs_sb->ctx->dir_mode;
3029 cifs_sb->ctx->file_mode;
3031 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3032 /* ignore mode change - ATTR_READONLY hasn't changed */
3033 attrs->ia_valid &= ~ATTR_MODE;
3037 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
3038 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
3039 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
3040 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
3042 /* Even if error on time set, no sense failing the call if
3043 the server would set the time to a reasonable value anyway,
3044 and this check ensures that we are not being called from
3045 sys_utimes in which case we ought to fail the call back to
3046 the user when the server rejects the call */
3047 if ((rc) && (attrs->ia_valid &
3048 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
3052 /* do not need local check to inode_check_ok since the server does
3055 goto cifs_setattr_exit;
3057 if ((attrs->ia_valid & ATTR_SIZE) &&
3058 attrs->ia_size != i_size_read(inode)) {
3059 truncate_setsize(inode, attrs->ia_size);
3060 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3063 setattr_copy(&init_user_ns, inode, attrs);
3064 mark_inode_dirty(inode);
3068 free_dentry_path(page);
3073 cifs_setattr(struct user_namespace *mnt_userns, struct dentry *direntry,
3074 struct iattr *attrs)
3076 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
3077 int rc, retries = 0;
3078 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3079 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
3080 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3082 if (unlikely(cifs_forced_shutdown(cifs_sb)))
3086 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3087 if (pTcon->unix_ext)
3088 rc = cifs_setattr_unix(direntry, attrs);
3090 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3091 rc = cifs_setattr_nounix(direntry, attrs);
3093 } while (is_retryable_error(rc) && retries < 2);
3095 /* BB: add cifs_setattr_legacy for really old servers */