1 // SPDX-License-Identifier: LGPL-2.1
4 * Copyright (C) International Business Machines Corp., 2002,2010
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"
29 static void cifs_set_ops(struct inode *inode)
31 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
33 switch (inode->i_mode & S_IFMT) {
35 inode->i_op = &cifs_file_inode_ops;
36 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
37 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
38 inode->i_fop = &cifs_file_direct_nobrl_ops;
40 inode->i_fop = &cifs_file_direct_ops;
41 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
42 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
43 inode->i_fop = &cifs_file_strict_nobrl_ops;
45 inode->i_fop = &cifs_file_strict_ops;
46 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
47 inode->i_fop = &cifs_file_nobrl_ops;
48 else { /* not direct, send byte range locks */
49 inode->i_fop = &cifs_file_ops;
52 /* check if server can support readpages */
53 if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read <
54 PAGE_SIZE + MAX_CIFS_HDR_SIZE)
55 inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
57 inode->i_data.a_ops = &cifs_addr_ops;
60 #ifdef CONFIG_CIFS_DFS_UPCALL
61 if (IS_AUTOMOUNT(inode)) {
62 inode->i_op = &cifs_dfs_referral_inode_operations;
64 #else /* NO DFS support, treat as a directory */
67 inode->i_op = &cifs_dir_inode_ops;
68 inode->i_fop = &cifs_dir_ops;
72 inode->i_op = &cifs_symlink_inode_ops;
75 init_special_inode(inode, inode->i_mode, inode->i_rdev);
80 /* check inode attributes against fattr. If they don't match, tag the
81 * inode for cache invalidation
84 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
86 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
88 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
89 __func__, cifs_i->uniqueid);
91 if (inode->i_state & I_NEW) {
92 cifs_dbg(FYI, "%s: inode %llu is new\n",
93 __func__, cifs_i->uniqueid);
97 /* don't bother with revalidation if we have an oplock */
98 if (CIFS_CACHE_READ(cifs_i)) {
99 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
100 __func__, cifs_i->uniqueid);
104 /* revalidate if mtime or size have changed */
105 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
106 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
107 cifs_i->server_eof == fattr->cf_eof) {
108 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
109 __func__, cifs_i->uniqueid);
113 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
114 __func__, cifs_i->uniqueid);
115 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
119 * copy nlink to the inode, unless it wasn't provided. Provide
120 * sane values if we don't have an existing one and none was provided
123 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
126 * if we're in a situation where we can't trust what we
127 * got from the server (readdir, some non-unix cases)
128 * fake reasonable values
130 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
131 /* only provide fake values on a new inode */
132 if (inode->i_state & I_NEW) {
133 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
141 /* we trust the server, so update it */
142 set_nlink(inode, fattr->cf_nlink);
145 /* populate an inode with info from a cifs_fattr struct */
147 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
149 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
150 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
152 if (!(inode->i_state & I_NEW) &&
153 unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
154 CIFS_I(inode)->time = 0; /* force reval */
158 cifs_revalidate_cache(inode, fattr);
160 spin_lock(&inode->i_lock);
161 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
162 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
163 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
164 /* we do not want atime to be less than mtime, it broke some apps */
165 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
166 inode->i_atime = fattr->cf_mtime;
168 inode->i_atime = fattr->cf_atime;
169 inode->i_mtime = fattr->cf_mtime;
170 inode->i_ctime = fattr->cf_ctime;
171 inode->i_rdev = fattr->cf_rdev;
172 cifs_nlink_fattr_to_inode(inode, fattr);
173 inode->i_uid = fattr->cf_uid;
174 inode->i_gid = fattr->cf_gid;
176 /* if dynperm is set, don't clobber existing mode */
177 if (inode->i_state & I_NEW ||
178 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
179 inode->i_mode = fattr->cf_mode;
181 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
183 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
186 cifs_i->time = jiffies;
188 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
189 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
191 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
193 cifs_i->server_eof = fattr->cf_eof;
195 * Can't safely change the file size here if the client is writing to
196 * it due to potential races.
198 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
199 i_size_write(inode, fattr->cf_eof);
202 * i_blocks is not related to (i_size / i_blksize),
203 * but instead 512 byte (2**9) size is required for
204 * calculating num blocks.
206 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
208 spin_unlock(&inode->i_lock);
210 if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
211 inode->i_flags |= S_AUTOMOUNT;
212 if (inode->i_state & I_NEW)
218 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
220 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
222 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
225 fattr->cf_uniqueid = iunique(sb, ROOT_I);
228 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
230 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
231 struct cifs_sb_info *cifs_sb)
233 memset(fattr, 0, sizeof(*fattr));
234 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
235 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
236 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
238 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
239 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
240 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
241 /* old POSIX extensions don't get create time */
243 fattr->cf_mode = le64_to_cpu(info->Permissions);
246 * Since we set the inode type below we need to mask off
247 * to avoid strange results if bits set above.
249 fattr->cf_mode &= ~S_IFMT;
250 switch (le32_to_cpu(info->Type)) {
252 fattr->cf_mode |= S_IFREG;
253 fattr->cf_dtype = DT_REG;
256 fattr->cf_mode |= S_IFLNK;
257 fattr->cf_dtype = DT_LNK;
260 fattr->cf_mode |= S_IFDIR;
261 fattr->cf_dtype = DT_DIR;
264 fattr->cf_mode |= S_IFCHR;
265 fattr->cf_dtype = DT_CHR;
266 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
267 le64_to_cpu(info->DevMinor) & MINORMASK);
270 fattr->cf_mode |= S_IFBLK;
271 fattr->cf_dtype = DT_BLK;
272 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
273 le64_to_cpu(info->DevMinor) & MINORMASK);
276 fattr->cf_mode |= S_IFIFO;
277 fattr->cf_dtype = DT_FIFO;
280 fattr->cf_mode |= S_IFSOCK;
281 fattr->cf_dtype = DT_SOCK;
284 /* safest to call it a file if we do not know */
285 fattr->cf_mode |= S_IFREG;
286 fattr->cf_dtype = DT_REG;
287 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
291 fattr->cf_uid = cifs_sb->ctx->linux_uid;
292 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
293 u64 id = le64_to_cpu(info->Uid);
294 if (id < ((uid_t)-1)) {
295 kuid_t uid = make_kuid(&init_user_ns, id);
301 fattr->cf_gid = cifs_sb->ctx->linux_gid;
302 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
303 u64 id = le64_to_cpu(info->Gid);
304 if (id < ((gid_t)-1)) {
305 kgid_t gid = make_kgid(&init_user_ns, id);
311 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
315 * Fill a cifs_fattr struct with fake inode info.
317 * Needed to setup cifs_fattr data for the directory which is the
318 * junction to the new submount (ie to setup the fake directory
319 * which represents a DFS referral).
322 cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
324 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
326 cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
328 memset(fattr, 0, sizeof(*fattr));
329 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
330 fattr->cf_uid = cifs_sb->ctx->linux_uid;
331 fattr->cf_gid = cifs_sb->ctx->linux_gid;
332 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
333 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
335 fattr->cf_flags = CIFS_FATTR_DFS_REFERRAL;
339 cifs_get_file_info_unix(struct file *filp)
343 FILE_UNIX_BASIC_INFO find_data;
344 struct cifs_fattr fattr;
345 struct inode *inode = file_inode(filp);
346 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
347 struct cifsFileInfo *cfile = filp->private_data;
348 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
351 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
353 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
354 } else if (rc == -EREMOTE) {
355 cifs_create_dfs_fattr(&fattr, inode->i_sb);
358 goto cifs_gfiunix_out;
360 rc = cifs_fattr_to_inode(inode, &fattr);
367 int cifs_get_inode_info_unix(struct inode **pinode,
368 const unsigned char *full_path,
369 struct super_block *sb, unsigned int xid)
372 FILE_UNIX_BASIC_INFO find_data;
373 struct cifs_fattr fattr;
374 struct cifs_tcon *tcon;
375 struct tcon_link *tlink;
376 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
378 cifs_dbg(FYI, "Getting info on %s\n", full_path);
380 tlink = cifs_sb_tlink(cifs_sb);
382 return PTR_ERR(tlink);
383 tcon = tlink_tcon(tlink);
385 /* could have done a find first instead but this returns more info */
386 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
387 cifs_sb->local_nls, cifs_remap(cifs_sb));
388 cifs_put_tlink(tlink);
391 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
392 } else if (rc == -EREMOTE) {
393 cifs_create_dfs_fattr(&fattr, sb);
399 /* check for Minshall+French symlinks */
400 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
401 int tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
404 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
407 if (*pinode == NULL) {
409 cifs_fill_uniqueid(sb, &fattr);
410 *pinode = cifs_iget(sb, &fattr);
414 /* we already have inode, update it */
416 /* if uniqueid is different, return error */
417 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
418 CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
419 CIFS_I(*pinode)->time = 0; /* force reval */
424 /* if filetype is different, return error */
425 rc = cifs_fattr_to_inode(*pinode, &fattr);
433 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
434 struct cifs_sb_info *cifs_sb, unsigned int xid)
438 struct tcon_link *tlink;
439 struct cifs_tcon *tcon;
441 struct cifs_open_parms oparms;
442 struct cifs_io_parms io_parms = {0};
444 unsigned int bytes_read;
446 int buf_type = CIFS_NO_BUFFER;
450 fattr->cf_mode &= ~S_IFMT;
452 if (fattr->cf_eof == 0) {
453 fattr->cf_mode |= S_IFIFO;
454 fattr->cf_dtype = DT_FIFO;
456 } else if (fattr->cf_eof < 8) {
457 fattr->cf_mode |= S_IFREG;
458 fattr->cf_dtype = DT_REG;
459 return -EINVAL; /* EOPNOTSUPP? */
462 tlink = cifs_sb_tlink(cifs_sb);
464 return PTR_ERR(tlink);
465 tcon = tlink_tcon(tlink);
468 oparms.cifs_sb = cifs_sb;
469 oparms.desired_access = GENERIC_READ;
470 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
471 oparms.disposition = FILE_OPEN;
474 oparms.reconnect = false;
476 if (tcon->ses->server->oplocks)
480 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
482 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
483 cifs_put_tlink(tlink);
488 io_parms.netfid = fid.netfid;
489 io_parms.pid = current->tgid;
490 io_parms.tcon = tcon;
492 io_parms.length = 24;
494 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
495 &bytes_read, &pbuf, &buf_type);
496 if ((rc == 0) && (bytes_read >= 8)) {
497 if (memcmp("IntxBLK", pbuf, 8) == 0) {
498 cifs_dbg(FYI, "Block device\n");
499 fattr->cf_mode |= S_IFBLK;
500 fattr->cf_dtype = DT_BLK;
501 if (bytes_read == 24) {
502 /* we have enough to decode dev num */
503 __u64 mjr; /* major */
504 __u64 mnr; /* minor */
505 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
506 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
507 fattr->cf_rdev = MKDEV(mjr, mnr);
509 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
510 cifs_dbg(FYI, "Char device\n");
511 fattr->cf_mode |= S_IFCHR;
512 fattr->cf_dtype = DT_CHR;
513 if (bytes_read == 24) {
514 /* we have enough to decode dev num */
515 __u64 mjr; /* major */
516 __u64 mnr; /* minor */
517 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
518 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
519 fattr->cf_rdev = MKDEV(mjr, mnr);
521 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
522 cifs_dbg(FYI, "Symlink\n");
523 fattr->cf_mode |= S_IFLNK;
524 fattr->cf_dtype = DT_LNK;
526 fattr->cf_mode |= S_IFREG; /* file? */
527 fattr->cf_dtype = DT_REG;
531 fattr->cf_mode |= S_IFREG; /* then it is a file */
532 fattr->cf_dtype = DT_REG;
533 rc = -EOPNOTSUPP; /* or some unknown SFU type */
536 tcon->ses->server->ops->close(xid, tcon, &fid);
537 cifs_put_tlink(tlink);
541 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
544 * Fetch mode bits as provided by SFU.
546 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
548 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
549 struct cifs_sb_info *cifs_sb, unsigned int xid)
551 #ifdef CONFIG_CIFS_XATTR
555 struct tcon_link *tlink;
556 struct cifs_tcon *tcon;
558 tlink = cifs_sb_tlink(cifs_sb);
560 return PTR_ERR(tlink);
561 tcon = tlink_tcon(tlink);
563 if (tcon->ses->server->ops->query_all_EAs == NULL) {
564 cifs_put_tlink(tlink);
568 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
569 "SETFILEBITS", ea_value, 4 /* size of buf */,
571 cifs_put_tlink(tlink);
575 mode = le32_to_cpu(*((__le32 *)ea_value));
576 fattr->cf_mode &= ~SFBITS_MASK;
577 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
578 mode, fattr->cf_mode);
579 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
580 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
589 /* Fill a cifs_fattr struct with info from POSIX info struct */
591 smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct smb311_posix_qinfo *info,
592 struct super_block *sb, bool adjust_tz, bool symlink)
594 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
595 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
597 memset(fattr, 0, sizeof(*fattr));
599 /* no fattr->flags to set */
600 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
601 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
603 if (info->LastAccessTime)
604 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
606 ktime_get_coarse_real_ts64(&fattr->cf_atime);
608 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
609 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
612 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
613 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
616 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
617 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
618 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
620 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
621 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
622 /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
623 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
626 fattr->cf_mode |= S_IFLNK;
627 fattr->cf_dtype = DT_LNK;
628 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
629 fattr->cf_mode |= S_IFDIR;
630 fattr->cf_dtype = DT_DIR;
632 fattr->cf_mode |= S_IFREG;
633 fattr->cf_dtype = DT_REG;
635 /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
637 fattr->cf_uid = cifs_sb->ctx->linux_uid; /* TODO: map uid and gid from SID */
638 fattr->cf_gid = cifs_sb->ctx->linux_gid;
640 cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
641 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
645 /* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
647 cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
648 struct super_block *sb, bool adjust_tz,
649 bool symlink, u32 reparse_tag)
651 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
652 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
654 memset(fattr, 0, sizeof(*fattr));
655 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
656 if (info->DeletePending)
657 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
659 if (info->LastAccessTime)
660 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
662 ktime_get_coarse_real_ts64(&fattr->cf_atime);
664 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
665 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
668 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
669 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
672 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
673 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
674 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
676 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
677 if (reparse_tag == IO_REPARSE_TAG_LX_SYMLINK) {
678 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
679 fattr->cf_dtype = DT_LNK;
680 } else if (reparse_tag == IO_REPARSE_TAG_LX_FIFO) {
681 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
682 fattr->cf_dtype = DT_FIFO;
683 } else if (reparse_tag == IO_REPARSE_TAG_AF_UNIX) {
684 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
685 fattr->cf_dtype = DT_SOCK;
686 } else if (reparse_tag == IO_REPARSE_TAG_LX_CHR) {
687 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
688 fattr->cf_dtype = DT_CHR;
689 } else if (reparse_tag == IO_REPARSE_TAG_LX_BLK) {
690 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
691 fattr->cf_dtype = DT_BLK;
692 } else if (symlink) { /* TODO add more reparse tag checks */
693 fattr->cf_mode = S_IFLNK;
694 fattr->cf_dtype = DT_LNK;
695 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
696 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
697 fattr->cf_dtype = DT_DIR;
699 * Server can return wrong NumberOfLinks value for directories
700 * when Unix extensions are disabled - fake it.
703 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
705 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
706 fattr->cf_dtype = DT_REG;
708 /* clear write bits if ATTR_READONLY is set */
709 if (fattr->cf_cifsattrs & ATTR_READONLY)
710 fattr->cf_mode &= ~(S_IWUGO);
713 * Don't accept zero nlink from non-unix servers unless
714 * delete is pending. Instead mark it as unknown.
716 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
717 !info->DeletePending) {
718 cifs_dbg(VFS, "bogus file nlink value %u\n",
720 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
724 fattr->cf_uid = cifs_sb->ctx->linux_uid;
725 fattr->cf_gid = cifs_sb->ctx->linux_gid;
729 cifs_get_file_info(struct file *filp)
733 FILE_ALL_INFO find_data;
734 struct cifs_fattr fattr;
735 struct inode *inode = file_inode(filp);
736 struct cifsFileInfo *cfile = filp->private_data;
737 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
738 struct TCP_Server_Info *server = tcon->ses->server;
740 if (!server->ops->query_file_info)
744 rc = server->ops->query_file_info(xid, tcon, &cfile->fid, &find_data);
747 /* TODO: add support to query reparse tag */
748 cifs_all_info_to_fattr(&fattr, &find_data, inode->i_sb, false,
749 false, 0 /* no reparse tag */);
752 cifs_create_dfs_fattr(&fattr, inode->i_sb);
758 * FIXME: legacy server -- fall back to path-based call?
759 * for now, just skip revalidating and mark inode for
763 CIFS_I(inode)->time = 0;
770 * don't bother with SFU junk here -- just mark inode as needing
773 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
774 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
775 /* if filetype is different, return error */
776 rc = cifs_fattr_to_inode(inode, &fattr);
782 /* Simple function to return a 64 bit hash of string. Rarely called */
783 static __u64 simple_hashstr(const char *str)
785 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
789 hash = (hash + (__u64) *str++) * hash_mult;
795 * cifs_backup_query_path_info - SMB1 fallback code to get ino
797 * Fallback code to get file metadata when we don't have access to
798 * full_path (EACCES) and have backup creds.
800 * @xid: transaction id used to identify original request in logs
801 * @tcon: information about the server share we have mounted
802 * @sb: the superblock stores info such as disk space available
803 * @full_path: name of the file we are getting the metadata for
804 * @resp_buf: will be set to cifs resp buf and needs to be freed with
805 * cifs_buf_release() when done with @data
806 * @data: will be set to search info result buffer
809 cifs_backup_query_path_info(int xid,
810 struct cifs_tcon *tcon,
811 struct super_block *sb,
812 const char *full_path,
814 FILE_ALL_INFO **data)
816 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
817 struct cifs_search_info info = {0};
822 info.endOfSearch = false;
824 info.info_level = SMB_FIND_FILE_UNIX;
825 else if ((tcon->ses->capabilities &
826 tcon->ses->server->vals->cap_nt_find) == 0)
827 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
828 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
829 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
830 else /* no srvino useful for fallback to some netapp */
831 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
833 flags = CIFS_SEARCH_CLOSE_ALWAYS |
834 CIFS_SEARCH_CLOSE_AT_END |
835 CIFS_SEARCH_BACKUP_SEARCH;
837 rc = CIFSFindFirst(xid, tcon, full_path,
838 cifs_sb, NULL, flags, &info, false);
842 *resp_buf = (void *)info.ntwrk_buf_start;
843 *data = (FILE_ALL_INFO *)info.srch_entries_start;
848 cifs_set_fattr_ino(int xid,
849 struct cifs_tcon *tcon,
850 struct super_block *sb,
851 struct inode **inode,
852 const char *full_path,
854 struct cifs_fattr *fattr)
856 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
857 struct TCP_Server_Info *server = tcon->ses->server;
860 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
862 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
864 fattr->cf_uniqueid = iunique(sb, ROOT_I);
869 * If we have an inode pass a NULL tcon to ensure we don't
870 * make a round trip to the server. This only works for SMB2+.
872 rc = server->ops->get_srv_inum(xid,
873 *inode ? NULL : tcon,
879 * If that fails reuse existing ino or generate one
880 * and disable server ones
883 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
885 fattr->cf_uniqueid = iunique(sb, ROOT_I);
886 cifs_autodisable_serverino(cifs_sb);
891 /* If no errors, check for zero root inode (invalid) */
892 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
893 cifs_dbg(FYI, "Invalid (0) inodenum\n");
896 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
898 /* make an ino by hashing the UNC */
899 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
900 fattr->cf_uniqueid = simple_hashstr(tcon->treeName);
905 static inline bool is_inode_cache_good(struct inode *ino)
907 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
911 cifs_get_inode_info(struct inode **inode,
912 const char *full_path,
913 FILE_ALL_INFO *in_data,
914 struct super_block *sb, int xid,
915 const struct cifs_fid *fid)
918 struct cifs_tcon *tcon;
919 struct TCP_Server_Info *server;
920 struct tcon_link *tlink;
921 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
922 bool adjust_tz = false;
923 struct cifs_fattr fattr = {0};
924 bool is_reparse_point = false;
925 FILE_ALL_INFO *data = in_data;
926 FILE_ALL_INFO *tmp_data = NULL;
927 void *smb1_backup_rsp_buf = NULL;
930 __u32 reparse_tag = 0;
932 tlink = cifs_sb_tlink(cifs_sb);
934 return PTR_ERR(tlink);
935 tcon = tlink_tcon(tlink);
936 server = tcon->ses->server;
939 * 1. Fetch file metadata if not provided (data)
943 if (is_inode_cache_good(*inode)) {
944 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
947 tmp_data = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
952 rc = server->ops->query_path_info(xid, tcon, cifs_sb,
954 &adjust_tz, &is_reparse_point);
959 * 2. Convert it to internal cifs metadata (fattr)
965 * If the file is a reparse point, it is more complicated
966 * since we have to check if its reparse tag matches a known
967 * special file type e.g. symlink or fifo or char etc.
969 if ((le32_to_cpu(data->Attributes) & ATTR_REPARSE) &&
970 server->ops->query_reparse_tag) {
971 rc = server->ops->query_reparse_tag(xid, tcon, cifs_sb,
972 full_path, &reparse_tag);
973 cifs_dbg(FYI, "reparse tag 0x%x\n", reparse_tag);
975 cifs_all_info_to_fattr(&fattr, data, sb, adjust_tz,
976 is_reparse_point, reparse_tag);
979 /* DFS link, no metadata available on this server */
980 cifs_create_dfs_fattr(&fattr, sb);
985 * perm errors, try again with backup flags if possible
987 * For SMB2 and later the backup intent flag
988 * is already sent if needed on open and there
989 * is no path based FindFirst operation to use
992 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
993 /* for easier reading */
994 FILE_DIRECTORY_INFO *fdi;
995 SEARCH_ID_FULL_DIR_INFO *si;
997 rc = cifs_backup_query_path_info(xid, tcon, sb,
999 &smb1_backup_rsp_buf,
1004 fdi = (FILE_DIRECTORY_INFO *)data;
1005 si = (SEARCH_ID_FULL_DIR_INFO *)data;
1007 cifs_dir_info_to_fattr(&fattr, fdi, cifs_sb);
1008 fattr.cf_uniqueid = le64_to_cpu(si->UniqueId);
1009 /* uniqueid set, skip get inum step */
1010 goto handle_mnt_opt;
1012 /* nothing we can do, bail out */
1017 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1022 * 3. Get or update inode number (fattr.cf_uniqueid)
1025 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, &fattr);
1028 * 4. Tweak fattr based on mount options
1032 /* query for SFU type info if supported and needed */
1033 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
1034 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
1035 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
1037 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1040 /* fill in 0777 bits from ACL */
1041 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1042 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, true,
1047 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1051 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1052 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, false,
1057 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1063 /* fill in remaining high mode bits e.g. SUID, VTX */
1064 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1065 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
1067 /* check for Minshall+French symlinks */
1068 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1069 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1072 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1076 * 5. Update inode with final fattr data
1080 *inode = cifs_iget(sb, &fattr);
1084 /* we already have inode, update it */
1086 /* if uniqueid is different, return error */
1087 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1088 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1089 CIFS_I(*inode)->time = 0; /* force reval */
1093 /* if filetype is different, return error */
1094 rc = cifs_fattr_to_inode(*inode, &fattr);
1097 cifs_buf_release(smb1_backup_rsp_buf);
1098 cifs_put_tlink(tlink);
1104 smb311_posix_get_inode_info(struct inode **inode,
1105 const char *full_path,
1106 struct super_block *sb, unsigned int xid)
1108 struct cifs_tcon *tcon;
1109 struct tcon_link *tlink;
1110 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1111 bool adjust_tz = false;
1112 struct cifs_fattr fattr = {0};
1113 bool symlink = false;
1114 struct smb311_posix_qinfo *data = NULL;
1118 tlink = cifs_sb_tlink(cifs_sb);
1120 return PTR_ERR(tlink);
1121 tcon = tlink_tcon(tlink);
1124 * 1. Fetch file metadata
1127 if (is_inode_cache_good(*inode)) {
1128 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1131 data = kmalloc(sizeof(struct smb311_posix_qinfo), GFP_KERNEL);
1137 rc = smb311_posix_query_path_info(xid, tcon, cifs_sb,
1139 &adjust_tz, &symlink);
1142 * 2. Convert it to internal cifs metadata (fattr)
1147 smb311_posix_info_to_fattr(&fattr, data, sb, adjust_tz, symlink);
1150 /* DFS link, no metadata available on this server */
1151 cifs_create_dfs_fattr(&fattr, sb);
1156 * For SMB2 and later the backup intent flag
1157 * is already sent if needed on open and there
1158 * is no path based FindFirst operation to use
1159 * to retry with so nothing we can do, bail out
1163 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1169 * 3. Tweak fattr based on mount options
1172 /* check for Minshall+French symlinks */
1173 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1174 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1177 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1181 * 4. Update inode with final fattr data
1185 *inode = cifs_iget(sb, &fattr);
1189 /* we already have inode, update it */
1191 /* if uniqueid is different, return error */
1192 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1193 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1194 CIFS_I(*inode)->time = 0; /* force reval */
1199 /* if filetype is different, return error */
1200 rc = cifs_fattr_to_inode(*inode, &fattr);
1203 cifs_put_tlink(tlink);
1209 static const struct inode_operations cifs_ipc_inode_ops = {
1210 .lookup = cifs_lookup,
1214 cifs_find_inode(struct inode *inode, void *opaque)
1216 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1218 /* don't match inode with different uniqueid */
1219 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1222 /* use createtime like an i_generation field */
1223 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1226 /* don't match inode of different type */
1227 if (inode_wrong_type(inode, fattr->cf_mode))
1230 /* if it's not a directory or has no dentries, then flag it */
1231 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1232 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1238 cifs_init_inode(struct inode *inode, void *opaque)
1240 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1242 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1243 CIFS_I(inode)->createtime = fattr->cf_createtime;
1248 * walk dentry list for an inode and report whether it has aliases that
1249 * are hashed. We use this to determine if a directory inode can actually
1253 inode_has_hashed_dentries(struct inode *inode)
1255 struct dentry *dentry;
1257 spin_lock(&inode->i_lock);
1258 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1259 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1260 spin_unlock(&inode->i_lock);
1264 spin_unlock(&inode->i_lock);
1268 /* Given fattrs, get a corresponding inode */
1270 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1273 struct inode *inode;
1276 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1278 /* hash down to 32-bits on 32-bit arch */
1279 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1281 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1283 /* was there a potentially problematic inode collision? */
1284 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1285 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1287 if (inode_has_hashed_dentries(inode)) {
1288 cifs_autodisable_serverino(CIFS_SB(sb));
1290 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1291 goto retry_iget5_locked;
1295 /* can't fail - see cifs_find_inode() */
1296 cifs_fattr_to_inode(inode, fattr);
1297 if (sb->s_flags & SB_NOATIME)
1298 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1299 if (inode->i_state & I_NEW) {
1300 inode->i_ino = hash;
1301 #ifdef CONFIG_CIFS_FSCACHE
1302 /* initialize per-inode cache cookie pointer */
1303 CIFS_I(inode)->fscache = NULL;
1305 unlock_new_inode(inode);
1312 /* gets root inode */
1313 struct inode *cifs_root_iget(struct super_block *sb)
1316 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1317 struct inode *inode = NULL;
1319 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1323 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1324 && cifs_sb->prepath) {
1325 len = strlen(cifs_sb->prepath);
1326 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1328 return ERR_PTR(-ENOMEM);
1330 memcpy(path+1, cifs_sb->prepath, len);
1332 path = kstrdup("", GFP_KERNEL);
1334 return ERR_PTR(-ENOMEM);
1338 if (tcon->unix_ext) {
1339 rc = cifs_get_inode_info_unix(&inode, path, sb, xid);
1340 /* some servers mistakenly claim POSIX support */
1341 if (rc != -EOPNOTSUPP)
1343 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1344 tcon->unix_ext = false;
1347 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1348 if (tcon->posix_extensions)
1349 rc = smb311_posix_get_inode_info(&inode, path, sb, xid);
1351 rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL);
1355 inode = ERR_PTR(rc);
1359 #ifdef CONFIG_CIFS_FSCACHE
1360 /* populate tcon->resource_id */
1361 tcon->resource_id = CIFS_I(inode)->uniqueid;
1364 if (rc && tcon->pipe) {
1365 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1366 spin_lock(&inode->i_lock);
1367 inode->i_mode |= S_IFDIR;
1368 set_nlink(inode, 2);
1369 inode->i_op = &cifs_ipc_inode_ops;
1370 inode->i_fop = &simple_dir_operations;
1371 inode->i_uid = cifs_sb->ctx->linux_uid;
1372 inode->i_gid = cifs_sb->ctx->linux_gid;
1373 spin_unlock(&inode->i_lock);
1376 inode = ERR_PTR(rc);
1380 * The cookie is initialized from volume info returned above.
1381 * Inside cifs_fscache_get_super_cookie it checks
1382 * that we do not get super cookie twice.
1384 cifs_fscache_get_super_cookie(tcon);
1393 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1394 const char *full_path, __u32 dosattr)
1396 bool set_time = false;
1397 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1398 struct TCP_Server_Info *server;
1399 FILE_BASIC_INFO info_buf;
1404 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1405 if (!server->ops->set_file_info)
1410 if (attrs->ia_valid & ATTR_ATIME) {
1412 info_buf.LastAccessTime =
1413 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1415 info_buf.LastAccessTime = 0;
1417 if (attrs->ia_valid & ATTR_MTIME) {
1419 info_buf.LastWriteTime =
1420 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1422 info_buf.LastWriteTime = 0;
1425 * Samba throws this field away, but windows may actually use it.
1426 * Do not set ctime unless other time stamps are changed explicitly
1427 * (i.e. by utimes()) since we would then have a mix of client and
1430 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1431 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1432 info_buf.ChangeTime =
1433 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1435 info_buf.ChangeTime = 0;
1437 info_buf.CreationTime = 0; /* don't change */
1438 info_buf.Attributes = cpu_to_le32(dosattr);
1440 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1444 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1445 * and rename it to a random name that hopefully won't conflict with
1449 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1450 const unsigned int xid)
1454 struct cifs_fid fid;
1455 struct cifs_open_parms oparms;
1456 struct inode *inode = d_inode(dentry);
1457 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1458 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1459 struct tcon_link *tlink;
1460 struct cifs_tcon *tcon;
1461 __u32 dosattr, origattr;
1462 FILE_BASIC_INFO *info_buf = NULL;
1464 tlink = cifs_sb_tlink(cifs_sb);
1466 return PTR_ERR(tlink);
1467 tcon = tlink_tcon(tlink);
1470 * We cannot rename the file if the server doesn't support
1471 * CAP_INFOLEVEL_PASSTHRU
1473 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1479 oparms.cifs_sb = cifs_sb;
1480 oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
1481 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
1482 oparms.disposition = FILE_OPEN;
1483 oparms.path = full_path;
1485 oparms.reconnect = false;
1487 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1491 origattr = cifsInode->cifsAttrs;
1493 origattr |= ATTR_NORMAL;
1495 dosattr = origattr & ~ATTR_READONLY;
1497 dosattr |= ATTR_NORMAL;
1498 dosattr |= ATTR_HIDDEN;
1500 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1501 if (dosattr != origattr) {
1502 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1503 if (info_buf == NULL) {
1507 info_buf->Attributes = cpu_to_le32(dosattr);
1508 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1510 /* although we would like to mark the file hidden
1511 if that fails we will still try to rename it */
1513 cifsInode->cifsAttrs = dosattr;
1515 dosattr = origattr; /* since not able to change them */
1518 /* rename the file */
1519 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1521 cifs_remap(cifs_sb));
1527 /* try to set DELETE_ON_CLOSE */
1528 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1529 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1532 * some samba versions return -ENOENT when we try to set the
1533 * file disposition here. Likely a samba bug, but work around
1534 * it for now. This means that some cifsXXX files may hang
1535 * around after they shouldn't.
1537 * BB: remove this hack after more servers have the fix
1545 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1549 CIFSSMBClose(xid, tcon, fid.netfid);
1552 cifs_put_tlink(tlink);
1556 * reset everything back to the original state. Don't bother
1557 * dealing with errors here since we can't do anything about
1561 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1562 cifs_sb->local_nls, cifs_remap(cifs_sb));
1564 if (dosattr != origattr) {
1565 info_buf->Attributes = cpu_to_le32(origattr);
1566 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1568 cifsInode->cifsAttrs = origattr;
1574 /* copied from fs/nfs/dir.c with small changes */
1576 cifs_drop_nlink(struct inode *inode)
1578 spin_lock(&inode->i_lock);
1579 if (inode->i_nlink > 0)
1581 spin_unlock(&inode->i_lock);
1585 * If d_inode(dentry) is null (usually meaning the cached dentry
1586 * is a negative dentry) then we would attempt a standard SMB delete, but
1587 * if that fails we can not attempt the fall back mechanisms on EACCES
1588 * but will return the EACCES to the caller. Note that the VFS does not call
1589 * unlink on negative dentries currently.
1591 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1595 const char *full_path;
1597 struct inode *inode = d_inode(dentry);
1598 struct cifsInodeInfo *cifs_inode;
1599 struct super_block *sb = dir->i_sb;
1600 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1601 struct tcon_link *tlink;
1602 struct cifs_tcon *tcon;
1603 struct TCP_Server_Info *server;
1604 struct iattr *attrs = NULL;
1605 __u32 dosattr = 0, origattr = 0;
1607 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1609 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1612 tlink = cifs_sb_tlink(cifs_sb);
1614 return PTR_ERR(tlink);
1615 tcon = tlink_tcon(tlink);
1616 server = tcon->ses->server;
1619 page = alloc_dentry_path();
1621 if (tcon->nodelete) {
1626 /* Unlink can be called from rename so we can not take the
1627 * sb->s_vfs_rename_mutex here */
1628 full_path = build_path_from_dentry(dentry, page);
1629 if (IS_ERR(full_path)) {
1630 rc = PTR_ERR(full_path);
1634 cifs_close_deferred_file_under_dentry(tcon, full_path);
1635 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1636 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1637 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1638 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1639 cifs_remap(cifs_sb));
1640 cifs_dbg(FYI, "posix del rc %d\n", rc);
1641 if ((rc == 0) || (rc == -ENOENT))
1642 goto psx_del_no_retry;
1646 if (!server->ops->unlink) {
1648 goto psx_del_no_retry;
1651 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1656 cifs_drop_nlink(inode);
1657 } else if (rc == -ENOENT) {
1659 } else if (rc == -EBUSY) {
1660 if (server->ops->rename_pending_delete) {
1661 rc = server->ops->rename_pending_delete(full_path,
1664 cifs_drop_nlink(inode);
1666 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1667 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1668 if (attrs == NULL) {
1673 /* try to reset dos attributes */
1674 cifs_inode = CIFS_I(inode);
1675 origattr = cifs_inode->cifsAttrs;
1677 origattr |= ATTR_NORMAL;
1678 dosattr = origattr & ~ATTR_READONLY;
1680 dosattr |= ATTR_NORMAL;
1681 dosattr |= ATTR_HIDDEN;
1683 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1687 goto retry_std_delete;
1690 /* undo the setattr if we errored out and it's needed */
1691 if (rc != 0 && dosattr != 0)
1692 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1696 cifs_inode = CIFS_I(inode);
1697 cifs_inode->time = 0; /* will force revalidate to get info
1699 inode->i_ctime = current_time(inode);
1701 dir->i_ctime = dir->i_mtime = current_time(dir);
1702 cifs_inode = CIFS_I(dir);
1703 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1705 free_dentry_path(page);
1708 cifs_put_tlink(tlink);
1713 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1714 const char *full_path, struct cifs_sb_info *cifs_sb,
1715 struct cifs_tcon *tcon, const unsigned int xid)
1718 struct inode *inode = NULL;
1720 if (tcon->posix_extensions)
1721 rc = smb311_posix_get_inode_info(&inode, full_path, parent->i_sb, xid);
1722 else if (tcon->unix_ext)
1723 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1726 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1732 if (!S_ISDIR(inode->i_mode)) {
1734 * mkdir succeeded, but another client has managed to remove the
1735 * sucker and replace it with non-directory. Return success,
1736 * but don't leave the child in dcache.
1743 * setting nlink not necessary except in cases where we failed to get it
1744 * from the server or was set bogus. Also, since this is a brand new
1745 * inode, no need to grab the i_lock before setting the i_nlink.
1747 if (inode->i_nlink < 2)
1748 set_nlink(inode, 2);
1749 mode &= ~current_umask();
1750 /* must turn on setgid bit if parent dir has it */
1751 if (parent->i_mode & S_ISGID)
1754 if (tcon->unix_ext) {
1755 struct cifs_unix_set_info_args args = {
1757 .ctime = NO_CHANGE_64,
1758 .atime = NO_CHANGE_64,
1759 .mtime = NO_CHANGE_64,
1762 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1763 args.uid = current_fsuid();
1764 if (parent->i_mode & S_ISGID)
1765 args.gid = parent->i_gid;
1767 args.gid = current_fsgid();
1769 args.uid = INVALID_UID; /* no change */
1770 args.gid = INVALID_GID; /* no change */
1772 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1774 cifs_remap(cifs_sb));
1776 struct TCP_Server_Info *server = tcon->ses->server;
1777 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1778 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1779 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1781 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1782 inode->i_mode = (mode | S_IFDIR);
1784 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1785 inode->i_uid = current_fsuid();
1786 if (inode->i_mode & S_ISGID)
1787 inode->i_gid = parent->i_gid;
1789 inode->i_gid = current_fsgid();
1792 d_instantiate(dentry, inode);
1797 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1798 const char *full_path, struct cifs_sb_info *cifs_sb,
1799 struct cifs_tcon *tcon, const unsigned int xid)
1803 FILE_UNIX_BASIC_INFO *info = NULL;
1804 struct inode *newinode = NULL;
1805 struct cifs_fattr fattr;
1807 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1810 goto posix_mkdir_out;
1813 mode &= ~current_umask();
1814 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1815 NULL /* netfid */, info, &oplock, full_path,
1816 cifs_sb->local_nls, cifs_remap(cifs_sb));
1817 if (rc == -EOPNOTSUPP)
1818 goto posix_mkdir_out;
1820 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1822 goto posix_mkdir_out;
1825 if (info->Type == cpu_to_le32(-1))
1826 /* no return info, go query for it */
1827 goto posix_mkdir_get_info;
1829 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1830 * need to set uid/gid.
1833 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1834 cifs_fill_uniqueid(inode->i_sb, &fattr);
1835 newinode = cifs_iget(inode->i_sb, &fattr);
1837 goto posix_mkdir_get_info;
1839 d_instantiate(dentry, newinode);
1841 #ifdef CONFIG_CIFS_DEBUG2
1842 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1843 dentry, dentry, newinode);
1845 if (newinode->i_nlink != 2)
1846 cifs_dbg(FYI, "unexpected number of links %d\n",
1853 posix_mkdir_get_info:
1854 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1856 goto posix_mkdir_out;
1859 int cifs_mkdir(struct user_namespace *mnt_userns, struct inode *inode,
1860 struct dentry *direntry, umode_t mode)
1864 struct cifs_sb_info *cifs_sb;
1865 struct tcon_link *tlink;
1866 struct cifs_tcon *tcon;
1867 struct TCP_Server_Info *server;
1868 const char *full_path;
1871 cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
1874 cifs_sb = CIFS_SB(inode->i_sb);
1875 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1877 tlink = cifs_sb_tlink(cifs_sb);
1879 return PTR_ERR(tlink);
1880 tcon = tlink_tcon(tlink);
1884 page = alloc_dentry_path();
1885 full_path = build_path_from_dentry(direntry, page);
1886 if (IS_ERR(full_path)) {
1887 rc = PTR_ERR(full_path);
1891 server = tcon->ses->server;
1893 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
1894 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
1896 d_drop(direntry); /* for time being always refresh inode info */
1900 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1901 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1902 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1904 if (rc != -EOPNOTSUPP)
1908 if (!server->ops->mkdir) {
1913 /* BB add setting the equivalent of mode via CreateX w/ACLs */
1914 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
1916 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1921 /* TODO: skip this for smb2/smb3 */
1922 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1926 * Force revalidate to get parent dir info when needed since cached
1927 * attributes are invalid now.
1929 CIFS_I(inode)->time = 0;
1930 free_dentry_path(page);
1932 cifs_put_tlink(tlink);
1936 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1940 struct cifs_sb_info *cifs_sb;
1941 struct tcon_link *tlink;
1942 struct cifs_tcon *tcon;
1943 struct TCP_Server_Info *server;
1944 const char *full_path;
1945 void *page = alloc_dentry_path();
1946 struct cifsInodeInfo *cifsInode;
1948 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
1952 full_path = build_path_from_dentry(direntry, page);
1953 if (IS_ERR(full_path)) {
1954 rc = PTR_ERR(full_path);
1958 cifs_sb = CIFS_SB(inode->i_sb);
1959 if (unlikely(cifs_forced_shutdown(cifs_sb))) {
1964 tlink = cifs_sb_tlink(cifs_sb);
1965 if (IS_ERR(tlink)) {
1966 rc = PTR_ERR(tlink);
1969 tcon = tlink_tcon(tlink);
1970 server = tcon->ses->server;
1972 if (!server->ops->rmdir) {
1974 cifs_put_tlink(tlink);
1978 if (tcon->nodelete) {
1980 cifs_put_tlink(tlink);
1984 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
1985 cifs_put_tlink(tlink);
1988 spin_lock(&d_inode(direntry)->i_lock);
1989 i_size_write(d_inode(direntry), 0);
1990 clear_nlink(d_inode(direntry));
1991 spin_unlock(&d_inode(direntry)->i_lock);
1994 cifsInode = CIFS_I(d_inode(direntry));
1995 /* force revalidate to go get info when needed */
1996 cifsInode->time = 0;
1998 cifsInode = CIFS_I(inode);
2000 * Force revalidate to get parent dir info when needed since cached
2001 * attributes are invalid now.
2003 cifsInode->time = 0;
2005 d_inode(direntry)->i_ctime = inode->i_ctime = inode->i_mtime =
2006 current_time(inode);
2009 free_dentry_path(page);
2015 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2016 const char *from_path, struct dentry *to_dentry,
2017 const char *to_path)
2019 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2020 struct tcon_link *tlink;
2021 struct cifs_tcon *tcon;
2022 struct TCP_Server_Info *server;
2023 struct cifs_fid fid;
2024 struct cifs_open_parms oparms;
2027 tlink = cifs_sb_tlink(cifs_sb);
2029 return PTR_ERR(tlink);
2030 tcon = tlink_tcon(tlink);
2031 server = tcon->ses->server;
2033 if (!server->ops->rename)
2036 /* try path-based rename first */
2037 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
2040 * Don't bother with rename by filehandle unless file is busy and
2041 * source. Note that cross directory moves do not work with
2042 * rename by filehandle to various Windows servers.
2044 if (rc == 0 || rc != -EBUSY)
2045 goto do_rename_exit;
2047 /* Don't fall back to using SMB on SMB 2+ mount */
2048 if (server->vals->protocol_id != 0)
2049 goto do_rename_exit;
2051 /* open-file renames don't work across directories */
2052 if (to_dentry->d_parent != from_dentry->d_parent)
2053 goto do_rename_exit;
2056 oparms.cifs_sb = cifs_sb;
2057 /* open the file to be renamed -- we need DELETE perms */
2058 oparms.desired_access = DELETE;
2059 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
2060 oparms.disposition = FILE_OPEN;
2061 oparms.path = from_path;
2063 oparms.reconnect = false;
2065 rc = CIFS_open(xid, &oparms, &oplock, NULL);
2067 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2068 (const char *) to_dentry->d_name.name,
2069 cifs_sb->local_nls, cifs_remap(cifs_sb));
2070 CIFSSMBClose(xid, tcon, fid.netfid);
2074 d_move(from_dentry, to_dentry);
2075 cifs_put_tlink(tlink);
2080 cifs_rename2(struct user_namespace *mnt_userns, struct inode *source_dir,
2081 struct dentry *source_dentry, struct inode *target_dir,
2082 struct dentry *target_dentry, unsigned int flags)
2084 const char *from_name, *to_name;
2085 void *page1, *page2;
2086 struct cifs_sb_info *cifs_sb;
2087 struct tcon_link *tlink;
2088 struct cifs_tcon *tcon;
2089 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2090 FILE_UNIX_BASIC_INFO *info_buf_target;
2093 int retry_count = 0;
2095 if (flags & ~RENAME_NOREPLACE)
2098 cifs_sb = CIFS_SB(source_dir->i_sb);
2099 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2102 tlink = cifs_sb_tlink(cifs_sb);
2104 return PTR_ERR(tlink);
2105 tcon = tlink_tcon(tlink);
2107 page1 = alloc_dentry_path();
2108 page2 = alloc_dentry_path();
2111 from_name = build_path_from_dentry(source_dentry, page1);
2112 if (IS_ERR(from_name)) {
2113 rc = PTR_ERR(from_name);
2114 goto cifs_rename_exit;
2117 to_name = build_path_from_dentry(target_dentry, page2);
2118 if (IS_ERR(to_name)) {
2119 rc = PTR_ERR(to_name);
2120 goto cifs_rename_exit;
2123 cifs_close_deferred_file_under_dentry(tcon, from_name);
2124 if (d_inode(target_dentry) != NULL)
2125 cifs_close_deferred_file_under_dentry(tcon, to_name);
2127 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2130 if (rc == -EACCES) {
2131 while (retry_count < 3) {
2132 cifs_close_all_deferred_files(tcon);
2133 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2142 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2144 if (flags & RENAME_NOREPLACE)
2145 goto cifs_rename_exit;
2147 if (rc == -EEXIST && tcon->unix_ext) {
2149 * Are src and dst hardlinks of same inode? We can only tell
2150 * with unix extensions enabled.
2153 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2155 if (info_buf_source == NULL) {
2157 goto cifs_rename_exit;
2160 info_buf_target = info_buf_source + 1;
2161 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2164 cifs_remap(cifs_sb));
2168 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2171 cifs_remap(cifs_sb));
2173 if (tmprc == 0 && (info_buf_source->UniqueId ==
2174 info_buf_target->UniqueId)) {
2175 /* same file, POSIX says that this is a noop */
2177 goto cifs_rename_exit;
2181 * else ... BB we could add the same check for Windows by
2182 * checking the UniqueId via FILE_INTERNAL_INFO
2186 /* Try unlinking the target dentry if it's not negative */
2187 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2188 if (d_is_dir(target_dentry))
2189 tmprc = cifs_rmdir(target_dir, target_dentry);
2191 tmprc = cifs_unlink(target_dir, target_dentry);
2193 goto cifs_rename_exit;
2194 rc = cifs_do_rename(xid, source_dentry, from_name,
2195 target_dentry, to_name);
2198 /* force revalidate to go get info when needed */
2199 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2201 source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
2202 target_dir->i_mtime = current_time(source_dir);
2205 kfree(info_buf_source);
2206 free_dentry_path(page2);
2207 free_dentry_path(page1);
2209 cifs_put_tlink(tlink);
2214 cifs_dentry_needs_reval(struct dentry *dentry)
2216 struct inode *inode = d_inode(dentry);
2217 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2218 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2219 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2220 struct cached_fid *cfid = NULL;
2222 if (cifs_i->time == 0)
2225 if (CIFS_CACHE_READ(cifs_i))
2228 if (!lookupCacheEnabled)
2231 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2232 mutex_lock(&cfid->fid_mutex);
2233 if (cfid->time && cifs_i->time > cfid->time) {
2234 mutex_unlock(&cfid->fid_mutex);
2235 close_cached_dir(cfid);
2238 mutex_unlock(&cfid->fid_mutex);
2239 close_cached_dir(cfid);
2242 * depending on inode type, check if attribute caching disabled for
2243 * files or directories
2245 if (S_ISDIR(inode->i_mode)) {
2246 if (!cifs_sb->ctx->acdirmax)
2248 if (!time_in_range(jiffies, cifs_i->time,
2249 cifs_i->time + cifs_sb->ctx->acdirmax))
2252 if (!cifs_sb->ctx->acregmax)
2254 if (!time_in_range(jiffies, cifs_i->time,
2255 cifs_i->time + cifs_sb->ctx->acregmax))
2259 /* hardlinked files w/ noserverino get "special" treatment */
2260 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2261 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2268 * Zap the cache. Called when invalid_mapping flag is set.
2271 cifs_invalidate_mapping(struct inode *inode)
2275 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2276 rc = invalidate_inode_pages2(inode->i_mapping);
2278 cifs_dbg(VFS, "%s: Could not invalidate inode %p\n",
2282 cifs_fscache_reset_inode_cookie(inode);
2287 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2289 * @key: currently unused
2290 * @mode: the task state to sleep in
2293 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2295 freezable_schedule_unsafe();
2296 if (signal_pending_state(mode, current))
2297 return -ERESTARTSYS;
2302 cifs_revalidate_mapping(struct inode *inode)
2305 unsigned long *flags = &CIFS_I(inode)->flags;
2306 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2308 /* swapfiles are not supposed to be shared */
2309 if (IS_SWAPFILE(inode))
2312 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2317 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2318 /* for cache=singleclient, do not invalidate */
2319 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2320 goto skip_invalidate;
2322 rc = cifs_invalidate_mapping(inode);
2324 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2328 clear_bit_unlock(CIFS_INO_LOCK, flags);
2329 smp_mb__after_atomic();
2330 wake_up_bit(flags, CIFS_INO_LOCK);
2336 cifs_zap_mapping(struct inode *inode)
2338 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2339 return cifs_revalidate_mapping(inode);
2342 int cifs_revalidate_file_attr(struct file *filp)
2345 struct dentry *dentry = file_dentry(filp);
2346 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2348 if (!cifs_dentry_needs_reval(dentry))
2351 if (tlink_tcon(cfile->tlink)->unix_ext)
2352 rc = cifs_get_file_info_unix(filp);
2354 rc = cifs_get_file_info(filp);
2359 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2363 struct inode *inode = d_inode(dentry);
2364 struct super_block *sb = dentry->d_sb;
2365 const char *full_path;
2372 if (!cifs_dentry_needs_reval(dentry))
2377 page = alloc_dentry_path();
2378 full_path = build_path_from_dentry(dentry, page);
2379 if (IS_ERR(full_path)) {
2380 rc = PTR_ERR(full_path);
2384 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2385 full_path, inode, inode->i_count.counter,
2386 dentry, cifs_get_time(dentry), jiffies);
2389 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2390 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2391 else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2392 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2394 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2396 if (rc == -EAGAIN && count++ < 10)
2399 free_dentry_path(page);
2405 int cifs_revalidate_file(struct file *filp)
2408 struct inode *inode = file_inode(filp);
2410 rc = cifs_revalidate_file_attr(filp);
2414 return cifs_revalidate_mapping(inode);
2417 /* revalidate a dentry's inode attributes */
2418 int cifs_revalidate_dentry(struct dentry *dentry)
2421 struct inode *inode = d_inode(dentry);
2423 rc = cifs_revalidate_dentry_attr(dentry);
2427 return cifs_revalidate_mapping(inode);
2430 int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
2431 struct kstat *stat, u32 request_mask, unsigned int flags)
2433 struct dentry *dentry = path->dentry;
2434 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2435 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2436 struct inode *inode = d_inode(dentry);
2439 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2443 * We need to be sure that all dirty pages are written and the server
2444 * has actual ctime, mtime and file length.
2446 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2447 !CIFS_CACHE_READ(CIFS_I(inode)) &&
2448 inode->i_mapping && inode->i_mapping->nrpages != 0) {
2449 rc = filemap_fdatawait(inode->i_mapping);
2451 mapping_set_error(inode->i_mapping, rc);
2456 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2457 CIFS_I(inode)->time = 0; /* force revalidate */
2460 * If the caller doesn't require syncing, only sync if
2461 * necessary (e.g. due to earlier truncate or setattr
2462 * invalidating the cached metadata)
2464 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2465 (CIFS_I(inode)->time == 0)) {
2466 rc = cifs_revalidate_dentry_attr(dentry);
2471 generic_fillattr(&init_user_ns, inode, stat);
2472 stat->blksize = cifs_sb->ctx->bsize;
2473 stat->ino = CIFS_I(inode)->uniqueid;
2475 /* old CIFS Unix Extensions doesn't return create time */
2476 if (CIFS_I(inode)->createtime) {
2477 stat->result_mask |= STATX_BTIME;
2479 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2482 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2483 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2484 stat->attributes |= STATX_ATTR_COMPRESSED;
2485 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2486 stat->attributes |= STATX_ATTR_ENCRYPTED;
2489 * If on a multiuser mount without unix extensions or cifsacl being
2490 * enabled, and the admin hasn't overridden them, set the ownership
2491 * to the fsuid/fsgid of the current process.
2493 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2494 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2496 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2497 stat->uid = current_fsuid();
2498 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2499 stat->gid = current_fsgid();
2504 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2507 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2508 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->vfs_inode.i_sb);
2509 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2510 struct TCP_Server_Info *server = tcon->ses->server;
2511 struct cifsFileInfo *cfile;
2514 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2518 * We need to be sure that all dirty pages are written as they
2519 * might fill holes on the server.
2521 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2522 inode->i_mapping->nrpages != 0) {
2523 rc = filemap_fdatawait(inode->i_mapping);
2525 mapping_set_error(inode->i_mapping, rc);
2530 cfile = find_readable_file(cifs_i, false);
2534 if (server->ops->fiemap) {
2535 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2536 cifsFileInfo_put(cfile);
2540 cifsFileInfo_put(cfile);
2544 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2546 pgoff_t index = from >> PAGE_SHIFT;
2547 unsigned offset = from & (PAGE_SIZE - 1);
2551 page = grab_cache_page(mapping, index);
2555 zero_user_segment(page, offset, PAGE_SIZE);
2561 void cifs_setsize(struct inode *inode, loff_t offset)
2563 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2565 spin_lock(&inode->i_lock);
2566 i_size_write(inode, offset);
2567 spin_unlock(&inode->i_lock);
2569 /* Cached inode must be refreshed on truncate */
2571 truncate_pagecache(inode, offset);
2575 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2576 unsigned int xid, const char *full_path)
2579 struct cifsFileInfo *open_file;
2580 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2581 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2582 struct tcon_link *tlink = NULL;
2583 struct cifs_tcon *tcon = NULL;
2584 struct TCP_Server_Info *server;
2587 * To avoid spurious oplock breaks from server, in the case of
2588 * inodes that we already have open, avoid doing path based
2589 * setting of file size if we can do it by handle.
2590 * This keeps our caching token (oplock) and avoids timeouts
2591 * when the local oplock break takes longer to flush
2592 * writebehind data than the SMB timeout for the SetPathInfo
2593 * request would allow
2595 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2597 tcon = tlink_tcon(open_file->tlink);
2598 server = tcon->ses->server;
2599 if (server->ops->set_file_size)
2600 rc = server->ops->set_file_size(xid, tcon, open_file,
2601 attrs->ia_size, false);
2604 cifsFileInfo_put(open_file);
2605 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2613 tlink = cifs_sb_tlink(cifs_sb);
2615 return PTR_ERR(tlink);
2616 tcon = tlink_tcon(tlink);
2617 server = tcon->ses->server;
2621 * Set file size by pathname rather than by handle either because no
2622 * valid, writeable file handle for it was found or because there was
2623 * an error setting it by handle.
2625 if (server->ops->set_path_size)
2626 rc = server->ops->set_path_size(xid, tcon, full_path,
2627 attrs->ia_size, cifs_sb, false);
2630 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2633 cifs_put_tlink(tlink);
2637 cifsInode->server_eof = attrs->ia_size;
2638 cifs_setsize(inode, attrs->ia_size);
2640 * i_blocks is not related to (i_size / i_blksize), but instead
2641 * 512 byte (2**9) size is required for calculating num blocks.
2642 * Until we can query the server for actual allocation size,
2643 * this is best estimate we have for blocks allocated for a file
2644 * Number of blocks must be rounded up so size 1 is not 0 blocks
2646 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2649 * The man page of truncate says if the size changed,
2650 * then the st_ctime and st_mtime fields for the file
2653 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2654 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2656 cifs_truncate_page(inode->i_mapping, inode->i_size);
2663 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2667 const char *full_path;
2668 void *page = alloc_dentry_path();
2669 struct inode *inode = d_inode(direntry);
2670 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2671 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2672 struct tcon_link *tlink;
2673 struct cifs_tcon *pTcon;
2674 struct cifs_unix_set_info_args *args = NULL;
2675 struct cifsFileInfo *open_file;
2677 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2678 direntry, attrs->ia_valid);
2682 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2683 attrs->ia_valid |= ATTR_FORCE;
2685 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2689 full_path = build_path_from_dentry(direntry, page);
2690 if (IS_ERR(full_path)) {
2691 rc = PTR_ERR(full_path);
2696 * Attempt to flush data before changing attributes. We need to do
2697 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2698 * ownership or mode then we may also need to do this. Here, we take
2699 * the safe way out and just do the flush on all setattr requests. If
2700 * the flush returns error, store it to report later and continue.
2702 * BB: This should be smarter. Why bother flushing pages that
2703 * will be truncated anyway? Also, should we error out here if
2704 * the flush returns error?
2706 rc = filemap_write_and_wait(inode->i_mapping);
2707 if (is_interrupt_error(rc)) {
2712 mapping_set_error(inode->i_mapping, rc);
2715 if (attrs->ia_valid & ATTR_SIZE) {
2716 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2721 /* skip mode change if it's just for clearing setuid/setgid */
2722 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2723 attrs->ia_valid &= ~ATTR_MODE;
2725 args = kmalloc(sizeof(*args), GFP_KERNEL);
2731 /* set up the struct */
2732 if (attrs->ia_valid & ATTR_MODE)
2733 args->mode = attrs->ia_mode;
2735 args->mode = NO_CHANGE_64;
2737 if (attrs->ia_valid & ATTR_UID)
2738 args->uid = attrs->ia_uid;
2740 args->uid = INVALID_UID; /* no change */
2742 if (attrs->ia_valid & ATTR_GID)
2743 args->gid = attrs->ia_gid;
2745 args->gid = INVALID_GID; /* no change */
2747 if (attrs->ia_valid & ATTR_ATIME)
2748 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2750 args->atime = NO_CHANGE_64;
2752 if (attrs->ia_valid & ATTR_MTIME)
2753 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2755 args->mtime = NO_CHANGE_64;
2757 if (attrs->ia_valid & ATTR_CTIME)
2758 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2760 args->ctime = NO_CHANGE_64;
2763 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2765 u16 nfid = open_file->fid.netfid;
2766 u32 npid = open_file->pid;
2767 pTcon = tlink_tcon(open_file->tlink);
2768 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2769 cifsFileInfo_put(open_file);
2771 tlink = cifs_sb_tlink(cifs_sb);
2772 if (IS_ERR(tlink)) {
2773 rc = PTR_ERR(tlink);
2776 pTcon = tlink_tcon(tlink);
2777 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2779 cifs_remap(cifs_sb));
2780 cifs_put_tlink(tlink);
2786 if ((attrs->ia_valid & ATTR_SIZE) &&
2787 attrs->ia_size != i_size_read(inode))
2788 truncate_setsize(inode, attrs->ia_size);
2790 setattr_copy(&init_user_ns, inode, attrs);
2791 mark_inode_dirty(inode);
2793 /* force revalidate when any of these times are set since some
2794 of the fs types (eg ext3, fat) do not have fine enough
2795 time granularity to match protocol, and we do not have a
2796 a way (yet) to query the server fs's time granularity (and
2797 whether it rounds times down).
2799 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2800 cifsInode->time = 0;
2803 free_dentry_path(page);
2809 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2812 kuid_t uid = INVALID_UID;
2813 kgid_t gid = INVALID_GID;
2814 struct inode *inode = d_inode(direntry);
2815 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2816 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2817 struct cifsFileInfo *wfile;
2818 struct cifs_tcon *tcon;
2819 const char *full_path;
2820 void *page = alloc_dentry_path();
2823 __u64 mode = NO_CHANGE_64;
2827 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2828 direntry, attrs->ia_valid);
2830 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2831 attrs->ia_valid |= ATTR_FORCE;
2833 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2835 goto cifs_setattr_exit;
2837 full_path = build_path_from_dentry(direntry, page);
2838 if (IS_ERR(full_path)) {
2839 rc = PTR_ERR(full_path);
2840 goto cifs_setattr_exit;
2844 * Attempt to flush data before changing attributes. We need to do
2845 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
2846 * returns error, store it to report later and continue.
2848 * BB: This should be smarter. Why bother flushing pages that
2849 * will be truncated anyway? Also, should we error out here if
2850 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
2852 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
2853 rc = filemap_write_and_wait(inode->i_mapping);
2854 if (is_interrupt_error(rc)) {
2856 goto cifs_setattr_exit;
2858 mapping_set_error(inode->i_mapping, rc);
2863 if ((attrs->ia_valid & ATTR_MTIME) &&
2864 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2865 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
2867 tcon = tlink_tcon(wfile->tlink);
2868 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
2869 cifsFileInfo_put(wfile);
2871 goto cifs_setattr_exit;
2872 } else if (rc != -EBADF)
2873 goto cifs_setattr_exit;
2878 if (attrs->ia_valid & ATTR_SIZE) {
2879 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2881 goto cifs_setattr_exit;
2884 if (attrs->ia_valid & ATTR_UID)
2885 uid = attrs->ia_uid;
2887 if (attrs->ia_valid & ATTR_GID)
2888 gid = attrs->ia_gid;
2890 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2891 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2892 if (uid_valid(uid) || gid_valid(gid)) {
2893 mode = NO_CHANGE_64;
2894 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2897 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2899 goto cifs_setattr_exit;
2903 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2904 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2906 /* skip mode change if it's just for clearing setuid/setgid */
2907 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2908 attrs->ia_valid &= ~ATTR_MODE;
2910 if (attrs->ia_valid & ATTR_MODE) {
2911 mode = attrs->ia_mode;
2913 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2914 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2915 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2916 INVALID_UID, INVALID_GID);
2918 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2920 goto cifs_setattr_exit;
2924 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
2925 * Pick up the actual mode bits that were set.
2927 if (mode != attrs->ia_mode)
2928 attrs->ia_mode = mode;
2930 if (((mode & S_IWUGO) == 0) &&
2931 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
2933 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2935 /* fix up mode if we're not using dynperm */
2936 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2937 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2938 } else if ((mode & S_IWUGO) &&
2939 (cifsInode->cifsAttrs & ATTR_READONLY)) {
2941 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2942 /* Attributes of 0 are ignored */
2944 dosattr |= ATTR_NORMAL;
2946 /* reset local inode permissions to normal */
2947 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2948 attrs->ia_mode &= ~(S_IALLUGO);
2949 if (S_ISDIR(inode->i_mode))
2951 cifs_sb->ctx->dir_mode;
2954 cifs_sb->ctx->file_mode;
2956 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2957 /* ignore mode change - ATTR_READONLY hasn't changed */
2958 attrs->ia_valid &= ~ATTR_MODE;
2962 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2963 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2964 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2965 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2967 /* Even if error on time set, no sense failing the call if
2968 the server would set the time to a reasonable value anyway,
2969 and this check ensures that we are not being called from
2970 sys_utimes in which case we ought to fail the call back to
2971 the user when the server rejects the call */
2972 if ((rc) && (attrs->ia_valid &
2973 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
2977 /* do not need local check to inode_check_ok since the server does
2980 goto cifs_setattr_exit;
2982 if ((attrs->ia_valid & ATTR_SIZE) &&
2983 attrs->ia_size != i_size_read(inode))
2984 truncate_setsize(inode, attrs->ia_size);
2986 setattr_copy(&init_user_ns, inode, attrs);
2987 mark_inode_dirty(inode);
2991 free_dentry_path(page);
2996 cifs_setattr(struct user_namespace *mnt_userns, struct dentry *direntry,
2997 struct iattr *attrs)
2999 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
3000 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
3001 int rc, retries = 0;
3003 if (unlikely(cifs_forced_shutdown(cifs_sb)))
3007 if (pTcon->unix_ext)
3008 rc = cifs_setattr_unix(direntry, attrs);
3010 rc = cifs_setattr_nounix(direntry, attrs);
3012 } while (is_retryable_error(rc) && retries < 2);
3014 /* BB: add cifs_setattr_legacy for really old servers */