1 // SPDX-License-Identifier: LGPL-2.1
5 * Copyright (C) International Business Machines Corp., 2002,2010
10 #include <linux/stat.h>
11 #include <linux/slab.h>
12 #include <linux/pagemap.h>
13 #include <linux/freezer.h>
14 #include <linux/sched/signal.h>
15 #include <linux/wait_bit.h>
16 #include <linux/fiemap.h>
17 #include <asm/div64.h>
21 #include "cifsproto.h"
22 #include "smb2proto.h"
23 #include "cifs_debug.h"
24 #include "cifs_fs_sb.h"
25 #include "cifs_unicode.h"
27 #include "fs_context.h"
28 #include "cifs_ioctl.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 readpages */
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 cifsInodeInfo *cifs_i = CIFS_I(inode);
89 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
90 __func__, cifs_i->uniqueid);
92 if (inode->i_state & I_NEW) {
93 cifs_dbg(FYI, "%s: inode %llu is new\n",
94 __func__, cifs_i->uniqueid);
98 /* don't bother with revalidation if we have an oplock */
99 if (CIFS_CACHE_READ(cifs_i)) {
100 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
101 __func__, cifs_i->uniqueid);
105 /* revalidate if mtime or size have changed */
106 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
107 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
108 cifs_i->server_eof == fattr->cf_eof) {
109 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
110 __func__, cifs_i->uniqueid);
114 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
115 __func__, cifs_i->uniqueid);
116 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
120 * copy nlink to the inode, unless it wasn't provided. Provide
121 * sane values if we don't have an existing one and none was provided
124 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
127 * if we're in a situation where we can't trust what we
128 * got from the server (readdir, some non-unix cases)
129 * fake reasonable values
131 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
132 /* only provide fake values on a new inode */
133 if (inode->i_state & I_NEW) {
134 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
142 /* we trust the server, so update it */
143 set_nlink(inode, fattr->cf_nlink);
146 /* populate an inode with info from a cifs_fattr struct */
148 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
150 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
151 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
153 if (!(inode->i_state & I_NEW) &&
154 unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
155 CIFS_I(inode)->time = 0; /* force reval */
159 cifs_revalidate_cache(inode, fattr);
161 spin_lock(&inode->i_lock);
162 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
163 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
164 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
165 /* we do not want atime to be less than mtime, it broke some apps */
166 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
167 inode->i_atime = fattr->cf_mtime;
169 inode->i_atime = fattr->cf_atime;
170 inode->i_mtime = fattr->cf_mtime;
171 inode->i_ctime = fattr->cf_ctime;
172 inode->i_rdev = fattr->cf_rdev;
173 cifs_nlink_fattr_to_inode(inode, fattr);
174 inode->i_uid = fattr->cf_uid;
175 inode->i_gid = fattr->cf_gid;
177 /* if dynperm is set, don't clobber existing mode */
178 if (inode->i_state & I_NEW ||
179 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
180 inode->i_mode = fattr->cf_mode;
182 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
184 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
187 cifs_i->time = jiffies;
189 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
190 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
192 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
194 cifs_i->server_eof = fattr->cf_eof;
196 * Can't safely change the file size here if the client is writing to
197 * it due to potential races.
199 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
200 i_size_write(inode, fattr->cf_eof);
203 * i_blocks is not related to (i_size / i_blksize),
204 * but instead 512 byte (2**9) size is required for
205 * calculating num blocks.
207 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
209 spin_unlock(&inode->i_lock);
211 if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
212 inode->i_flags |= S_AUTOMOUNT;
213 if (inode->i_state & I_NEW)
219 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
221 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
223 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
226 fattr->cf_uniqueid = iunique(sb, ROOT_I);
229 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
231 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
232 struct cifs_sb_info *cifs_sb)
234 memset(fattr, 0, sizeof(*fattr));
235 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
236 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
237 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
239 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
240 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
241 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
242 /* old POSIX extensions don't get create time */
244 fattr->cf_mode = le64_to_cpu(info->Permissions);
247 * Since we set the inode type below we need to mask off
248 * to avoid strange results if bits set above.
250 fattr->cf_mode &= ~S_IFMT;
251 switch (le32_to_cpu(info->Type)) {
253 fattr->cf_mode |= S_IFREG;
254 fattr->cf_dtype = DT_REG;
257 fattr->cf_mode |= S_IFLNK;
258 fattr->cf_dtype = DT_LNK;
261 fattr->cf_mode |= S_IFDIR;
262 fattr->cf_dtype = DT_DIR;
265 fattr->cf_mode |= S_IFCHR;
266 fattr->cf_dtype = DT_CHR;
267 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
268 le64_to_cpu(info->DevMinor) & MINORMASK);
271 fattr->cf_mode |= S_IFBLK;
272 fattr->cf_dtype = DT_BLK;
273 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
274 le64_to_cpu(info->DevMinor) & MINORMASK);
277 fattr->cf_mode |= S_IFIFO;
278 fattr->cf_dtype = DT_FIFO;
281 fattr->cf_mode |= S_IFSOCK;
282 fattr->cf_dtype = DT_SOCK;
285 /* safest to call it a file if we do not know */
286 fattr->cf_mode |= S_IFREG;
287 fattr->cf_dtype = DT_REG;
288 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
292 fattr->cf_uid = cifs_sb->ctx->linux_uid;
293 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
294 u64 id = le64_to_cpu(info->Uid);
295 if (id < ((uid_t)-1)) {
296 kuid_t uid = make_kuid(&init_user_ns, id);
302 fattr->cf_gid = cifs_sb->ctx->linux_gid;
303 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
304 u64 id = le64_to_cpu(info->Gid);
305 if (id < ((gid_t)-1)) {
306 kgid_t gid = make_kgid(&init_user_ns, id);
312 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
316 * Fill a cifs_fattr struct with fake inode info.
318 * Needed to setup cifs_fattr data for the directory which is the
319 * junction to the new submount (ie to setup the fake directory
320 * which represents a DFS referral).
323 cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
325 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
327 cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
329 memset(fattr, 0, sizeof(*fattr));
330 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
331 fattr->cf_uid = cifs_sb->ctx->linux_uid;
332 fattr->cf_gid = cifs_sb->ctx->linux_gid;
333 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
334 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
336 fattr->cf_flags = CIFS_FATTR_DFS_REFERRAL;
340 cifs_get_file_info_unix(struct file *filp)
344 FILE_UNIX_BASIC_INFO find_data;
345 struct cifs_fattr fattr;
346 struct inode *inode = file_inode(filp);
347 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
348 struct cifsFileInfo *cfile = filp->private_data;
349 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
352 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
354 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
355 } else if (rc == -EREMOTE) {
356 cifs_create_dfs_fattr(&fattr, inode->i_sb);
359 goto cifs_gfiunix_out;
361 rc = cifs_fattr_to_inode(inode, &fattr);
368 int cifs_get_inode_info_unix(struct inode **pinode,
369 const unsigned char *full_path,
370 struct super_block *sb, unsigned int xid)
373 FILE_UNIX_BASIC_INFO find_data;
374 struct cifs_fattr fattr;
375 struct cifs_tcon *tcon;
376 struct tcon_link *tlink;
377 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
379 cifs_dbg(FYI, "Getting info on %s\n", full_path);
381 tlink = cifs_sb_tlink(cifs_sb);
383 return PTR_ERR(tlink);
384 tcon = tlink_tcon(tlink);
386 /* could have done a find first instead but this returns more info */
387 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
388 cifs_sb->local_nls, cifs_remap(cifs_sb));
389 cifs_put_tlink(tlink);
392 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
393 } else if (rc == -EREMOTE) {
394 cifs_create_dfs_fattr(&fattr, sb);
400 /* check for Minshall+French symlinks */
401 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
402 int tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
405 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
408 if (*pinode == NULL) {
410 cifs_fill_uniqueid(sb, &fattr);
411 *pinode = cifs_iget(sb, &fattr);
415 /* we already have inode, update it */
417 /* if uniqueid is different, return error */
418 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
419 CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
420 CIFS_I(*pinode)->time = 0; /* force reval */
425 /* if filetype is different, return error */
426 rc = cifs_fattr_to_inode(*pinode, &fattr);
434 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
435 struct cifs_sb_info *cifs_sb, unsigned int xid)
439 struct tcon_link *tlink;
440 struct cifs_tcon *tcon;
442 struct cifs_open_parms oparms;
443 struct cifs_io_parms io_parms = {0};
445 unsigned int bytes_read;
447 int buf_type = CIFS_NO_BUFFER;
451 fattr->cf_mode &= ~S_IFMT;
453 if (fattr->cf_eof == 0) {
454 fattr->cf_mode |= S_IFIFO;
455 fattr->cf_dtype = DT_FIFO;
457 } else if (fattr->cf_eof < 8) {
458 fattr->cf_mode |= S_IFREG;
459 fattr->cf_dtype = DT_REG;
460 return -EINVAL; /* EOPNOTSUPP? */
463 tlink = cifs_sb_tlink(cifs_sb);
465 return PTR_ERR(tlink);
466 tcon = tlink_tcon(tlink);
469 oparms.cifs_sb = cifs_sb;
470 oparms.desired_access = GENERIC_READ;
471 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
472 oparms.disposition = FILE_OPEN;
475 oparms.reconnect = false;
477 if (tcon->ses->server->oplocks)
481 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
483 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
484 cifs_put_tlink(tlink);
489 io_parms.netfid = fid.netfid;
490 io_parms.pid = current->tgid;
491 io_parms.tcon = tcon;
493 io_parms.length = 24;
495 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
496 &bytes_read, &pbuf, &buf_type);
497 if ((rc == 0) && (bytes_read >= 8)) {
498 if (memcmp("IntxBLK", pbuf, 8) == 0) {
499 cifs_dbg(FYI, "Block device\n");
500 fattr->cf_mode |= S_IFBLK;
501 fattr->cf_dtype = DT_BLK;
502 if (bytes_read == 24) {
503 /* we have enough to decode dev num */
504 __u64 mjr; /* major */
505 __u64 mnr; /* minor */
506 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
507 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
508 fattr->cf_rdev = MKDEV(mjr, mnr);
510 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
511 cifs_dbg(FYI, "Char device\n");
512 fattr->cf_mode |= S_IFCHR;
513 fattr->cf_dtype = DT_CHR;
514 if (bytes_read == 24) {
515 /* we have enough to decode dev num */
516 __u64 mjr; /* major */
517 __u64 mnr; /* minor */
518 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
519 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
520 fattr->cf_rdev = MKDEV(mjr, mnr);
522 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
523 cifs_dbg(FYI, "Symlink\n");
524 fattr->cf_mode |= S_IFLNK;
525 fattr->cf_dtype = DT_LNK;
527 fattr->cf_mode |= S_IFREG; /* file? */
528 fattr->cf_dtype = DT_REG;
532 fattr->cf_mode |= S_IFREG; /* then it is a file */
533 fattr->cf_dtype = DT_REG;
534 rc = -EOPNOTSUPP; /* or some unknown SFU type */
537 tcon->ses->server->ops->close(xid, tcon, &fid);
538 cifs_put_tlink(tlink);
542 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
545 * Fetch mode bits as provided by SFU.
547 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
549 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
550 struct cifs_sb_info *cifs_sb, unsigned int xid)
552 #ifdef CONFIG_CIFS_XATTR
556 struct tcon_link *tlink;
557 struct cifs_tcon *tcon;
559 tlink = cifs_sb_tlink(cifs_sb);
561 return PTR_ERR(tlink);
562 tcon = tlink_tcon(tlink);
564 if (tcon->ses->server->ops->query_all_EAs == NULL) {
565 cifs_put_tlink(tlink);
569 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
570 "SETFILEBITS", ea_value, 4 /* size of buf */,
572 cifs_put_tlink(tlink);
576 mode = le32_to_cpu(*((__le32 *)ea_value));
577 fattr->cf_mode &= ~SFBITS_MASK;
578 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
579 mode, fattr->cf_mode);
580 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
581 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
590 /* Fill a cifs_fattr struct with info from POSIX info struct */
592 smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct smb311_posix_qinfo *info,
593 struct super_block *sb, bool adjust_tz, bool symlink)
595 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
596 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
598 memset(fattr, 0, sizeof(*fattr));
600 /* no fattr->flags to set */
601 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
602 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
604 if (info->LastAccessTime)
605 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
607 ktime_get_coarse_real_ts64(&fattr->cf_atime);
609 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
610 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
613 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
614 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
617 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
618 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
619 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
621 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
622 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
623 /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
624 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
627 fattr->cf_mode |= S_IFLNK;
628 fattr->cf_dtype = DT_LNK;
629 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
630 fattr->cf_mode |= S_IFDIR;
631 fattr->cf_dtype = DT_DIR;
633 fattr->cf_mode |= S_IFREG;
634 fattr->cf_dtype = DT_REG;
636 /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
638 fattr->cf_uid = cifs_sb->ctx->linux_uid; /* TODO: map uid and gid from SID */
639 fattr->cf_gid = cifs_sb->ctx->linux_gid;
641 cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
642 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
646 /* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
648 cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
649 struct super_block *sb, bool adjust_tz,
650 bool symlink, u32 reparse_tag)
652 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
653 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
655 memset(fattr, 0, sizeof(*fattr));
656 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
657 if (info->DeletePending)
658 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
660 if (info->LastAccessTime)
661 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
663 ktime_get_coarse_real_ts64(&fattr->cf_atime);
665 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
666 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
669 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
670 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
673 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
674 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
675 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
677 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
678 if (reparse_tag == IO_REPARSE_TAG_LX_SYMLINK) {
679 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
680 fattr->cf_dtype = DT_LNK;
681 } else if (reparse_tag == IO_REPARSE_TAG_LX_FIFO) {
682 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
683 fattr->cf_dtype = DT_FIFO;
684 } else if (reparse_tag == IO_REPARSE_TAG_AF_UNIX) {
685 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
686 fattr->cf_dtype = DT_SOCK;
687 } else if (reparse_tag == IO_REPARSE_TAG_LX_CHR) {
688 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
689 fattr->cf_dtype = DT_CHR;
690 } else if (reparse_tag == IO_REPARSE_TAG_LX_BLK) {
691 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
692 fattr->cf_dtype = DT_BLK;
693 } else if (symlink) { /* TODO add more reparse tag checks */
694 fattr->cf_mode = S_IFLNK;
695 fattr->cf_dtype = DT_LNK;
696 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
697 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
698 fattr->cf_dtype = DT_DIR;
700 * Server can return wrong NumberOfLinks value for directories
701 * when Unix extensions are disabled - fake it.
704 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
706 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
707 fattr->cf_dtype = DT_REG;
709 /* clear write bits if ATTR_READONLY is set */
710 if (fattr->cf_cifsattrs & ATTR_READONLY)
711 fattr->cf_mode &= ~(S_IWUGO);
714 * Don't accept zero nlink from non-unix servers unless
715 * delete is pending. Instead mark it as unknown.
717 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
718 !info->DeletePending) {
719 cifs_dbg(VFS, "bogus file nlink value %u\n",
721 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
725 fattr->cf_uid = cifs_sb->ctx->linux_uid;
726 fattr->cf_gid = cifs_sb->ctx->linux_gid;
730 cifs_get_file_info(struct file *filp)
734 FILE_ALL_INFO find_data;
735 struct cifs_fattr fattr;
736 struct inode *inode = file_inode(filp);
737 struct cifsFileInfo *cfile = filp->private_data;
738 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
739 struct TCP_Server_Info *server = tcon->ses->server;
741 if (!server->ops->query_file_info)
745 rc = server->ops->query_file_info(xid, tcon, &cfile->fid, &find_data);
748 /* TODO: add support to query reparse tag */
749 cifs_all_info_to_fattr(&fattr, &find_data, inode->i_sb, false,
750 false, 0 /* no reparse tag */);
753 cifs_create_dfs_fattr(&fattr, inode->i_sb);
759 * FIXME: legacy server -- fall back to path-based call?
760 * for now, just skip revalidating and mark inode for
764 CIFS_I(inode)->time = 0;
771 * don't bother with SFU junk here -- just mark inode as needing
774 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
775 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
776 /* if filetype is different, return error */
777 rc = cifs_fattr_to_inode(inode, &fattr);
783 /* Simple function to return a 64 bit hash of string. Rarely called */
784 static __u64 simple_hashstr(const char *str)
786 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
790 hash = (hash + (__u64) *str++) * hash_mult;
796 * cifs_backup_query_path_info - SMB1 fallback code to get ino
798 * Fallback code to get file metadata when we don't have access to
799 * full_path (EACCES) and have backup creds.
801 * @xid: transaction id used to identify original request in logs
802 * @tcon: information about the server share we have mounted
803 * @sb: the superblock stores info such as disk space available
804 * @full_path: name of the file we are getting the metadata for
805 * @resp_buf: will be set to cifs resp buf and needs to be freed with
806 * cifs_buf_release() when done with @data
807 * @data: will be set to search info result buffer
810 cifs_backup_query_path_info(int xid,
811 struct cifs_tcon *tcon,
812 struct super_block *sb,
813 const char *full_path,
815 FILE_ALL_INFO **data)
817 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
818 struct cifs_search_info info = {0};
823 info.endOfSearch = false;
825 info.info_level = SMB_FIND_FILE_UNIX;
826 else if ((tcon->ses->capabilities &
827 tcon->ses->server->vals->cap_nt_find) == 0)
828 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
829 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
830 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
831 else /* no srvino useful for fallback to some netapp */
832 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
834 flags = CIFS_SEARCH_CLOSE_ALWAYS |
835 CIFS_SEARCH_CLOSE_AT_END |
836 CIFS_SEARCH_BACKUP_SEARCH;
838 rc = CIFSFindFirst(xid, tcon, full_path,
839 cifs_sb, NULL, flags, &info, false);
843 *resp_buf = (void *)info.ntwrk_buf_start;
844 *data = (FILE_ALL_INFO *)info.srch_entries_start;
849 cifs_set_fattr_ino(int xid,
850 struct cifs_tcon *tcon,
851 struct super_block *sb,
852 struct inode **inode,
853 const char *full_path,
855 struct cifs_fattr *fattr)
857 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
858 struct TCP_Server_Info *server = tcon->ses->server;
861 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
863 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
865 fattr->cf_uniqueid = iunique(sb, ROOT_I);
870 * If we have an inode pass a NULL tcon to ensure we don't
871 * make a round trip to the server. This only works for SMB2+.
873 rc = server->ops->get_srv_inum(xid,
874 *inode ? NULL : tcon,
880 * If that fails reuse existing ino or generate one
881 * and disable server ones
884 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
886 fattr->cf_uniqueid = iunique(sb, ROOT_I);
887 cifs_autodisable_serverino(cifs_sb);
892 /* If no errors, check for zero root inode (invalid) */
893 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
894 cifs_dbg(FYI, "Invalid (0) inodenum\n");
897 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
899 /* make an ino by hashing the UNC */
900 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
901 fattr->cf_uniqueid = simple_hashstr(tcon->treeName);
906 static inline bool is_inode_cache_good(struct inode *ino)
908 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
912 cifs_get_inode_info(struct inode **inode,
913 const char *full_path,
914 FILE_ALL_INFO *in_data,
915 struct super_block *sb, int xid,
916 const struct cifs_fid *fid)
919 struct cifs_tcon *tcon;
920 struct TCP_Server_Info *server;
921 struct tcon_link *tlink;
922 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
923 bool adjust_tz = false;
924 struct cifs_fattr fattr = {0};
925 bool is_reparse_point = false;
926 FILE_ALL_INFO *data = in_data;
927 FILE_ALL_INFO *tmp_data = NULL;
928 void *smb1_backup_rsp_buf = NULL;
931 __u32 reparse_tag = 0;
933 tlink = cifs_sb_tlink(cifs_sb);
935 return PTR_ERR(tlink);
936 tcon = tlink_tcon(tlink);
937 server = tcon->ses->server;
940 * 1. Fetch file metadata if not provided (data)
944 if (is_inode_cache_good(*inode)) {
945 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
948 tmp_data = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
953 rc = server->ops->query_path_info(xid, tcon, cifs_sb,
955 &adjust_tz, &is_reparse_point);
960 * 2. Convert it to internal cifs metadata (fattr)
966 * If the file is a reparse point, it is more complicated
967 * since we have to check if its reparse tag matches a known
968 * special file type e.g. symlink or fifo or char etc.
970 if ((le32_to_cpu(data->Attributes) & ATTR_REPARSE) &&
971 server->ops->query_reparse_tag) {
972 rc = server->ops->query_reparse_tag(xid, tcon, cifs_sb,
973 full_path, &reparse_tag);
974 cifs_dbg(FYI, "reparse tag 0x%x\n", reparse_tag);
976 cifs_all_info_to_fattr(&fattr, data, sb, adjust_tz,
977 is_reparse_point, reparse_tag);
980 /* DFS link, no metadata available on this server */
981 cifs_create_dfs_fattr(&fattr, sb);
986 * perm errors, try again with backup flags if possible
988 * For SMB2 and later the backup intent flag
989 * is already sent if needed on open and there
990 * is no path based FindFirst operation to use
993 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
994 /* for easier reading */
995 FILE_DIRECTORY_INFO *fdi;
996 SEARCH_ID_FULL_DIR_INFO *si;
998 rc = cifs_backup_query_path_info(xid, tcon, sb,
1000 &smb1_backup_rsp_buf,
1005 fdi = (FILE_DIRECTORY_INFO *)data;
1006 si = (SEARCH_ID_FULL_DIR_INFO *)data;
1008 cifs_dir_info_to_fattr(&fattr, fdi, cifs_sb);
1009 fattr.cf_uniqueid = le64_to_cpu(si->UniqueId);
1010 /* uniqueid set, skip get inum step */
1011 goto handle_mnt_opt;
1013 /* nothing we can do, bail out */
1018 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1023 * 3. Get or update inode number (fattr.cf_uniqueid)
1026 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, &fattr);
1029 * 4. Tweak fattr based on mount options
1033 /* query for SFU type info if supported and needed */
1034 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
1035 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
1036 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
1038 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1041 /* fill in 0777 bits from ACL */
1042 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1043 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, true,
1048 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1052 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1053 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, false,
1058 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1064 /* fill in remaining high mode bits e.g. SUID, VTX */
1065 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1066 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
1068 /* check for Minshall+French symlinks */
1069 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1070 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1073 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1077 * 5. Update inode with final fattr data
1081 *inode = cifs_iget(sb, &fattr);
1085 /* we already have inode, update it */
1087 /* if uniqueid is different, return error */
1088 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1089 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1090 CIFS_I(*inode)->time = 0; /* force reval */
1094 /* if filetype is different, return error */
1095 rc = cifs_fattr_to_inode(*inode, &fattr);
1098 cifs_buf_release(smb1_backup_rsp_buf);
1099 cifs_put_tlink(tlink);
1105 smb311_posix_get_inode_info(struct inode **inode,
1106 const char *full_path,
1107 struct super_block *sb, unsigned int xid)
1109 struct cifs_tcon *tcon;
1110 struct tcon_link *tlink;
1111 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1112 bool adjust_tz = false;
1113 struct cifs_fattr fattr = {0};
1114 bool symlink = false;
1115 struct smb311_posix_qinfo *data = NULL;
1119 tlink = cifs_sb_tlink(cifs_sb);
1121 return PTR_ERR(tlink);
1122 tcon = tlink_tcon(tlink);
1125 * 1. Fetch file metadata
1128 if (is_inode_cache_good(*inode)) {
1129 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1132 data = kmalloc(sizeof(struct smb311_posix_qinfo), GFP_KERNEL);
1138 rc = smb311_posix_query_path_info(xid, tcon, cifs_sb,
1140 &adjust_tz, &symlink);
1143 * 2. Convert it to internal cifs metadata (fattr)
1148 smb311_posix_info_to_fattr(&fattr, data, sb, adjust_tz, symlink);
1151 /* DFS link, no metadata available on this server */
1152 cifs_create_dfs_fattr(&fattr, sb);
1157 * For SMB2 and later the backup intent flag
1158 * is already sent if needed on open and there
1159 * is no path based FindFirst operation to use
1160 * to retry with so nothing we can do, bail out
1164 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1170 * 3. Tweak fattr based on mount options
1173 /* check for Minshall+French symlinks */
1174 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1175 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1178 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1182 * 4. Update inode with final fattr data
1186 *inode = cifs_iget(sb, &fattr);
1190 /* we already have inode, update it */
1192 /* if uniqueid is different, return error */
1193 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1194 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1195 CIFS_I(*inode)->time = 0; /* force reval */
1200 /* if filetype is different, return error */
1201 rc = cifs_fattr_to_inode(*inode, &fattr);
1204 cifs_put_tlink(tlink);
1210 static const struct inode_operations cifs_ipc_inode_ops = {
1211 .lookup = cifs_lookup,
1215 cifs_find_inode(struct inode *inode, void *opaque)
1217 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1219 /* don't match inode with different uniqueid */
1220 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1223 /* use createtime like an i_generation field */
1224 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1227 /* don't match inode of different type */
1228 if (inode_wrong_type(inode, fattr->cf_mode))
1231 /* if it's not a directory or has no dentries, then flag it */
1232 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1233 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1239 cifs_init_inode(struct inode *inode, void *opaque)
1241 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1243 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1244 CIFS_I(inode)->createtime = fattr->cf_createtime;
1249 * walk dentry list for an inode and report whether it has aliases that
1250 * are hashed. We use this to determine if a directory inode can actually
1254 inode_has_hashed_dentries(struct inode *inode)
1256 struct dentry *dentry;
1258 spin_lock(&inode->i_lock);
1259 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1260 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1261 spin_unlock(&inode->i_lock);
1265 spin_unlock(&inode->i_lock);
1269 /* Given fattrs, get a corresponding inode */
1271 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1274 struct inode *inode;
1277 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1279 /* hash down to 32-bits on 32-bit arch */
1280 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1282 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1284 /* was there a potentially problematic inode collision? */
1285 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1286 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1288 if (inode_has_hashed_dentries(inode)) {
1289 cifs_autodisable_serverino(CIFS_SB(sb));
1291 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1292 goto retry_iget5_locked;
1296 /* can't fail - see cifs_find_inode() */
1297 cifs_fattr_to_inode(inode, fattr);
1298 if (sb->s_flags & SB_NOATIME)
1299 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1300 if (inode->i_state & I_NEW) {
1301 inode->i_ino = hash;
1302 #ifdef CONFIG_CIFS_FSCACHE
1303 /* initialize per-inode cache cookie pointer */
1304 CIFS_I(inode)->fscache = NULL;
1306 unlock_new_inode(inode);
1313 /* gets root inode */
1314 struct inode *cifs_root_iget(struct super_block *sb)
1317 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1318 struct inode *inode = NULL;
1320 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1324 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1325 && cifs_sb->prepath) {
1326 len = strlen(cifs_sb->prepath);
1327 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1329 return ERR_PTR(-ENOMEM);
1331 memcpy(path+1, cifs_sb->prepath, len);
1333 path = kstrdup("", GFP_KERNEL);
1335 return ERR_PTR(-ENOMEM);
1339 if (tcon->unix_ext) {
1340 rc = cifs_get_inode_info_unix(&inode, path, sb, xid);
1341 /* some servers mistakenly claim POSIX support */
1342 if (rc != -EOPNOTSUPP)
1344 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1345 tcon->unix_ext = false;
1348 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1349 if (tcon->posix_extensions)
1350 rc = smb311_posix_get_inode_info(&inode, path, sb, xid);
1352 rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL);
1356 inode = ERR_PTR(rc);
1360 #ifdef CONFIG_CIFS_FSCACHE
1361 /* populate tcon->resource_id */
1362 tcon->resource_id = CIFS_I(inode)->uniqueid;
1365 if (rc && tcon->pipe) {
1366 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1367 spin_lock(&inode->i_lock);
1368 inode->i_mode |= S_IFDIR;
1369 set_nlink(inode, 2);
1370 inode->i_op = &cifs_ipc_inode_ops;
1371 inode->i_fop = &simple_dir_operations;
1372 inode->i_uid = cifs_sb->ctx->linux_uid;
1373 inode->i_gid = cifs_sb->ctx->linux_gid;
1374 spin_unlock(&inode->i_lock);
1377 inode = ERR_PTR(rc);
1387 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1388 const char *full_path, __u32 dosattr)
1390 bool set_time = false;
1391 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1392 struct TCP_Server_Info *server;
1393 FILE_BASIC_INFO info_buf;
1398 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1399 if (!server->ops->set_file_info)
1404 if (attrs->ia_valid & ATTR_ATIME) {
1406 info_buf.LastAccessTime =
1407 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1409 info_buf.LastAccessTime = 0;
1411 if (attrs->ia_valid & ATTR_MTIME) {
1413 info_buf.LastWriteTime =
1414 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1416 info_buf.LastWriteTime = 0;
1419 * Samba throws this field away, but windows may actually use it.
1420 * Do not set ctime unless other time stamps are changed explicitly
1421 * (i.e. by utimes()) since we would then have a mix of client and
1424 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1425 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1426 info_buf.ChangeTime =
1427 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1429 info_buf.ChangeTime = 0;
1431 info_buf.CreationTime = 0; /* don't change */
1432 info_buf.Attributes = cpu_to_le32(dosattr);
1434 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1438 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1439 * and rename it to a random name that hopefully won't conflict with
1443 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1444 const unsigned int xid)
1448 struct cifs_fid fid;
1449 struct cifs_open_parms oparms;
1450 struct inode *inode = d_inode(dentry);
1451 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1452 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1453 struct tcon_link *tlink;
1454 struct cifs_tcon *tcon;
1455 __u32 dosattr, origattr;
1456 FILE_BASIC_INFO *info_buf = NULL;
1458 tlink = cifs_sb_tlink(cifs_sb);
1460 return PTR_ERR(tlink);
1461 tcon = tlink_tcon(tlink);
1464 * We cannot rename the file if the server doesn't support
1465 * CAP_INFOLEVEL_PASSTHRU
1467 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1473 oparms.cifs_sb = cifs_sb;
1474 oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
1475 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
1476 oparms.disposition = FILE_OPEN;
1477 oparms.path = full_path;
1479 oparms.reconnect = false;
1481 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1485 origattr = cifsInode->cifsAttrs;
1487 origattr |= ATTR_NORMAL;
1489 dosattr = origattr & ~ATTR_READONLY;
1491 dosattr |= ATTR_NORMAL;
1492 dosattr |= ATTR_HIDDEN;
1494 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1495 if (dosattr != origattr) {
1496 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1497 if (info_buf == NULL) {
1501 info_buf->Attributes = cpu_to_le32(dosattr);
1502 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1504 /* although we would like to mark the file hidden
1505 if that fails we will still try to rename it */
1507 cifsInode->cifsAttrs = dosattr;
1509 dosattr = origattr; /* since not able to change them */
1512 /* rename the file */
1513 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1515 cifs_remap(cifs_sb));
1521 /* try to set DELETE_ON_CLOSE */
1522 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1523 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1526 * some samba versions return -ENOENT when we try to set the
1527 * file disposition here. Likely a samba bug, but work around
1528 * it for now. This means that some cifsXXX files may hang
1529 * around after they shouldn't.
1531 * BB: remove this hack after more servers have the fix
1539 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1543 CIFSSMBClose(xid, tcon, fid.netfid);
1546 cifs_put_tlink(tlink);
1550 * reset everything back to the original state. Don't bother
1551 * dealing with errors here since we can't do anything about
1555 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1556 cifs_sb->local_nls, cifs_remap(cifs_sb));
1558 if (dosattr != origattr) {
1559 info_buf->Attributes = cpu_to_le32(origattr);
1560 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1562 cifsInode->cifsAttrs = origattr;
1568 /* copied from fs/nfs/dir.c with small changes */
1570 cifs_drop_nlink(struct inode *inode)
1572 spin_lock(&inode->i_lock);
1573 if (inode->i_nlink > 0)
1575 spin_unlock(&inode->i_lock);
1579 * If d_inode(dentry) is null (usually meaning the cached dentry
1580 * is a negative dentry) then we would attempt a standard SMB delete, but
1581 * if that fails we can not attempt the fall back mechanisms on EACCES
1582 * but will return the EACCES to the caller. Note that the VFS does not call
1583 * unlink on negative dentries currently.
1585 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1589 const char *full_path;
1591 struct inode *inode = d_inode(dentry);
1592 struct cifsInodeInfo *cifs_inode;
1593 struct super_block *sb = dir->i_sb;
1594 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1595 struct tcon_link *tlink;
1596 struct cifs_tcon *tcon;
1597 struct TCP_Server_Info *server;
1598 struct iattr *attrs = NULL;
1599 __u32 dosattr = 0, origattr = 0;
1601 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1603 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1606 tlink = cifs_sb_tlink(cifs_sb);
1608 return PTR_ERR(tlink);
1609 tcon = tlink_tcon(tlink);
1610 server = tcon->ses->server;
1613 page = alloc_dentry_path();
1615 if (tcon->nodelete) {
1620 /* Unlink can be called from rename so we can not take the
1621 * sb->s_vfs_rename_mutex here */
1622 full_path = build_path_from_dentry(dentry, page);
1623 if (IS_ERR(full_path)) {
1624 rc = PTR_ERR(full_path);
1628 cifs_close_deferred_file(CIFS_I(inode));
1629 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1630 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1631 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1632 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1633 cifs_remap(cifs_sb));
1634 cifs_dbg(FYI, "posix del rc %d\n", rc);
1635 if ((rc == 0) || (rc == -ENOENT))
1636 goto psx_del_no_retry;
1640 if (!server->ops->unlink) {
1642 goto psx_del_no_retry;
1645 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1650 cifs_drop_nlink(inode);
1651 } else if (rc == -ENOENT) {
1653 } else if (rc == -EBUSY) {
1654 if (server->ops->rename_pending_delete) {
1655 rc = server->ops->rename_pending_delete(full_path,
1658 cifs_drop_nlink(inode);
1660 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1661 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1662 if (attrs == NULL) {
1667 /* try to reset dos attributes */
1668 cifs_inode = CIFS_I(inode);
1669 origattr = cifs_inode->cifsAttrs;
1671 origattr |= ATTR_NORMAL;
1672 dosattr = origattr & ~ATTR_READONLY;
1674 dosattr |= ATTR_NORMAL;
1675 dosattr |= ATTR_HIDDEN;
1677 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1681 goto retry_std_delete;
1684 /* undo the setattr if we errored out and it's needed */
1685 if (rc != 0 && dosattr != 0)
1686 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1690 cifs_inode = CIFS_I(inode);
1691 cifs_inode->time = 0; /* will force revalidate to get info
1693 inode->i_ctime = current_time(inode);
1695 dir->i_ctime = dir->i_mtime = current_time(dir);
1696 cifs_inode = CIFS_I(dir);
1697 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1699 free_dentry_path(page);
1702 cifs_put_tlink(tlink);
1707 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1708 const char *full_path, struct cifs_sb_info *cifs_sb,
1709 struct cifs_tcon *tcon, const unsigned int xid)
1712 struct inode *inode = NULL;
1714 if (tcon->posix_extensions)
1715 rc = smb311_posix_get_inode_info(&inode, full_path, parent->i_sb, xid);
1716 else if (tcon->unix_ext)
1717 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1720 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1726 if (!S_ISDIR(inode->i_mode)) {
1728 * mkdir succeeded, but another client has managed to remove the
1729 * sucker and replace it with non-directory. Return success,
1730 * but don't leave the child in dcache.
1737 * setting nlink not necessary except in cases where we failed to get it
1738 * from the server or was set bogus. Also, since this is a brand new
1739 * inode, no need to grab the i_lock before setting the i_nlink.
1741 if (inode->i_nlink < 2)
1742 set_nlink(inode, 2);
1743 mode &= ~current_umask();
1744 /* must turn on setgid bit if parent dir has it */
1745 if (parent->i_mode & S_ISGID)
1748 if (tcon->unix_ext) {
1749 struct cifs_unix_set_info_args args = {
1751 .ctime = NO_CHANGE_64,
1752 .atime = NO_CHANGE_64,
1753 .mtime = NO_CHANGE_64,
1756 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1757 args.uid = current_fsuid();
1758 if (parent->i_mode & S_ISGID)
1759 args.gid = parent->i_gid;
1761 args.gid = current_fsgid();
1763 args.uid = INVALID_UID; /* no change */
1764 args.gid = INVALID_GID; /* no change */
1766 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1768 cifs_remap(cifs_sb));
1770 struct TCP_Server_Info *server = tcon->ses->server;
1771 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1772 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1773 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1775 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1776 inode->i_mode = (mode | S_IFDIR);
1778 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1779 inode->i_uid = current_fsuid();
1780 if (inode->i_mode & S_ISGID)
1781 inode->i_gid = parent->i_gid;
1783 inode->i_gid = current_fsgid();
1786 d_instantiate(dentry, inode);
1791 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1792 const char *full_path, struct cifs_sb_info *cifs_sb,
1793 struct cifs_tcon *tcon, const unsigned int xid)
1797 FILE_UNIX_BASIC_INFO *info = NULL;
1798 struct inode *newinode = NULL;
1799 struct cifs_fattr fattr;
1801 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1804 goto posix_mkdir_out;
1807 mode &= ~current_umask();
1808 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1809 NULL /* netfid */, info, &oplock, full_path,
1810 cifs_sb->local_nls, cifs_remap(cifs_sb));
1811 if (rc == -EOPNOTSUPP)
1812 goto posix_mkdir_out;
1814 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1816 goto posix_mkdir_out;
1819 if (info->Type == cpu_to_le32(-1))
1820 /* no return info, go query for it */
1821 goto posix_mkdir_get_info;
1823 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1824 * need to set uid/gid.
1827 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1828 cifs_fill_uniqueid(inode->i_sb, &fattr);
1829 newinode = cifs_iget(inode->i_sb, &fattr);
1831 goto posix_mkdir_get_info;
1833 d_instantiate(dentry, newinode);
1835 #ifdef CONFIG_CIFS_DEBUG2
1836 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1837 dentry, dentry, newinode);
1839 if (newinode->i_nlink != 2)
1840 cifs_dbg(FYI, "unexpected number of links %d\n",
1847 posix_mkdir_get_info:
1848 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1850 goto posix_mkdir_out;
1853 int cifs_mkdir(struct user_namespace *mnt_userns, struct inode *inode,
1854 struct dentry *direntry, umode_t mode)
1858 struct cifs_sb_info *cifs_sb;
1859 struct tcon_link *tlink;
1860 struct cifs_tcon *tcon;
1861 struct TCP_Server_Info *server;
1862 const char *full_path;
1865 cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
1868 cifs_sb = CIFS_SB(inode->i_sb);
1869 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1871 tlink = cifs_sb_tlink(cifs_sb);
1873 return PTR_ERR(tlink);
1874 tcon = tlink_tcon(tlink);
1878 page = alloc_dentry_path();
1879 full_path = build_path_from_dentry(direntry, page);
1880 if (IS_ERR(full_path)) {
1881 rc = PTR_ERR(full_path);
1885 server = tcon->ses->server;
1887 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
1888 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
1890 d_drop(direntry); /* for time being always refresh inode info */
1894 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1895 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1896 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1898 if (rc != -EOPNOTSUPP)
1902 if (!server->ops->mkdir) {
1907 /* BB add setting the equivalent of mode via CreateX w/ACLs */
1908 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
1910 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1915 /* TODO: skip this for smb2/smb3 */
1916 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1920 * Force revalidate to get parent dir info when needed since cached
1921 * attributes are invalid now.
1923 CIFS_I(inode)->time = 0;
1924 free_dentry_path(page);
1926 cifs_put_tlink(tlink);
1930 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1934 struct cifs_sb_info *cifs_sb;
1935 struct tcon_link *tlink;
1936 struct cifs_tcon *tcon;
1937 struct TCP_Server_Info *server;
1938 const char *full_path;
1939 void *page = alloc_dentry_path();
1940 struct cifsInodeInfo *cifsInode;
1942 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
1946 full_path = build_path_from_dentry(direntry, page);
1947 if (IS_ERR(full_path)) {
1948 rc = PTR_ERR(full_path);
1952 cifs_sb = CIFS_SB(inode->i_sb);
1953 if (unlikely(cifs_forced_shutdown(cifs_sb))) {
1958 tlink = cifs_sb_tlink(cifs_sb);
1959 if (IS_ERR(tlink)) {
1960 rc = PTR_ERR(tlink);
1963 tcon = tlink_tcon(tlink);
1964 server = tcon->ses->server;
1966 if (!server->ops->rmdir) {
1968 cifs_put_tlink(tlink);
1972 if (tcon->nodelete) {
1974 cifs_put_tlink(tlink);
1978 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
1979 cifs_put_tlink(tlink);
1982 spin_lock(&d_inode(direntry)->i_lock);
1983 i_size_write(d_inode(direntry), 0);
1984 clear_nlink(d_inode(direntry));
1985 spin_unlock(&d_inode(direntry)->i_lock);
1988 cifsInode = CIFS_I(d_inode(direntry));
1989 /* force revalidate to go get info when needed */
1990 cifsInode->time = 0;
1992 cifsInode = CIFS_I(inode);
1994 * Force revalidate to get parent dir info when needed since cached
1995 * attributes are invalid now.
1997 cifsInode->time = 0;
1999 d_inode(direntry)->i_ctime = inode->i_ctime = inode->i_mtime =
2000 current_time(inode);
2003 free_dentry_path(page);
2009 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2010 const char *from_path, struct dentry *to_dentry,
2011 const char *to_path)
2013 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2014 struct tcon_link *tlink;
2015 struct cifs_tcon *tcon;
2016 struct TCP_Server_Info *server;
2017 struct cifs_fid fid;
2018 struct cifs_open_parms oparms;
2021 tlink = cifs_sb_tlink(cifs_sb);
2023 return PTR_ERR(tlink);
2024 tcon = tlink_tcon(tlink);
2025 server = tcon->ses->server;
2027 if (!server->ops->rename)
2030 /* try path-based rename first */
2031 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
2034 * Don't bother with rename by filehandle unless file is busy and
2035 * source. Note that cross directory moves do not work with
2036 * rename by filehandle to various Windows servers.
2038 if (rc == 0 || rc != -EBUSY)
2039 goto do_rename_exit;
2041 /* Don't fall back to using SMB on SMB 2+ mount */
2042 if (server->vals->protocol_id != 0)
2043 goto do_rename_exit;
2045 /* open-file renames don't work across directories */
2046 if (to_dentry->d_parent != from_dentry->d_parent)
2047 goto do_rename_exit;
2050 oparms.cifs_sb = cifs_sb;
2051 /* open the file to be renamed -- we need DELETE perms */
2052 oparms.desired_access = DELETE;
2053 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
2054 oparms.disposition = FILE_OPEN;
2055 oparms.path = from_path;
2057 oparms.reconnect = false;
2059 rc = CIFS_open(xid, &oparms, &oplock, NULL);
2061 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2062 (const char *) to_dentry->d_name.name,
2063 cifs_sb->local_nls, cifs_remap(cifs_sb));
2064 CIFSSMBClose(xid, tcon, fid.netfid);
2068 d_move(from_dentry, to_dentry);
2069 cifs_put_tlink(tlink);
2074 cifs_rename2(struct user_namespace *mnt_userns, struct inode *source_dir,
2075 struct dentry *source_dentry, struct inode *target_dir,
2076 struct dentry *target_dentry, unsigned int flags)
2078 const char *from_name, *to_name;
2079 void *page1, *page2;
2080 struct cifs_sb_info *cifs_sb;
2081 struct tcon_link *tlink;
2082 struct cifs_tcon *tcon;
2083 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2084 FILE_UNIX_BASIC_INFO *info_buf_target;
2087 int retry_count = 0;
2089 if (flags & ~RENAME_NOREPLACE)
2092 cifs_sb = CIFS_SB(source_dir->i_sb);
2093 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2096 tlink = cifs_sb_tlink(cifs_sb);
2098 return PTR_ERR(tlink);
2099 tcon = tlink_tcon(tlink);
2101 page1 = alloc_dentry_path();
2102 page2 = alloc_dentry_path();
2105 from_name = build_path_from_dentry(source_dentry, page1);
2106 if (IS_ERR(from_name)) {
2107 rc = PTR_ERR(from_name);
2108 goto cifs_rename_exit;
2111 to_name = build_path_from_dentry(target_dentry, page2);
2112 if (IS_ERR(to_name)) {
2113 rc = PTR_ERR(to_name);
2114 goto cifs_rename_exit;
2117 cifs_close_deferred_file(CIFS_I(d_inode(source_dentry)));
2118 if (d_inode(target_dentry) != NULL)
2119 cifs_close_deferred_file(CIFS_I(d_inode(target_dentry)));
2121 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2124 if (rc == -EACCES) {
2125 while (retry_count < 3) {
2126 cifs_close_all_deferred_files(tcon);
2127 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2136 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2138 if (flags & RENAME_NOREPLACE)
2139 goto cifs_rename_exit;
2141 if (rc == -EEXIST && tcon->unix_ext) {
2143 * Are src and dst hardlinks of same inode? We can only tell
2144 * with unix extensions enabled.
2147 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2149 if (info_buf_source == NULL) {
2151 goto cifs_rename_exit;
2154 info_buf_target = info_buf_source + 1;
2155 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2158 cifs_remap(cifs_sb));
2162 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2165 cifs_remap(cifs_sb));
2167 if (tmprc == 0 && (info_buf_source->UniqueId ==
2168 info_buf_target->UniqueId)) {
2169 /* same file, POSIX says that this is a noop */
2171 goto cifs_rename_exit;
2175 * else ... BB we could add the same check for Windows by
2176 * checking the UniqueId via FILE_INTERNAL_INFO
2180 /* Try unlinking the target dentry if it's not negative */
2181 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2182 if (d_is_dir(target_dentry))
2183 tmprc = cifs_rmdir(target_dir, target_dentry);
2185 tmprc = cifs_unlink(target_dir, target_dentry);
2187 goto cifs_rename_exit;
2188 rc = cifs_do_rename(xid, source_dentry, from_name,
2189 target_dentry, to_name);
2192 /* force revalidate to go get info when needed */
2193 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2195 source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
2196 target_dir->i_mtime = current_time(source_dir);
2199 kfree(info_buf_source);
2200 free_dentry_path(page2);
2201 free_dentry_path(page1);
2203 cifs_put_tlink(tlink);
2208 cifs_dentry_needs_reval(struct dentry *dentry)
2210 struct inode *inode = d_inode(dentry);
2211 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2212 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2213 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2214 struct cached_fid *cfid = NULL;
2216 if (cifs_i->time == 0)
2219 if (CIFS_CACHE_READ(cifs_i))
2222 if (!lookupCacheEnabled)
2225 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2226 mutex_lock(&cfid->fid_mutex);
2227 if (cfid->time && cifs_i->time > cfid->time) {
2228 mutex_unlock(&cfid->fid_mutex);
2229 close_cached_dir(cfid);
2232 mutex_unlock(&cfid->fid_mutex);
2233 close_cached_dir(cfid);
2236 * depending on inode type, check if attribute caching disabled for
2237 * files or directories
2239 if (S_ISDIR(inode->i_mode)) {
2240 if (!cifs_sb->ctx->acdirmax)
2242 if (!time_in_range(jiffies, cifs_i->time,
2243 cifs_i->time + cifs_sb->ctx->acdirmax))
2246 if (!cifs_sb->ctx->acregmax)
2248 if (!time_in_range(jiffies, cifs_i->time,
2249 cifs_i->time + cifs_sb->ctx->acregmax))
2253 /* hardlinked files w/ noserverino get "special" treatment */
2254 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2255 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2262 * Zap the cache. Called when invalid_mapping flag is set.
2265 cifs_invalidate_mapping(struct inode *inode)
2269 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2270 rc = invalidate_inode_pages2(inode->i_mapping);
2272 cifs_dbg(VFS, "%s: Could not invalidate inode %p\n",
2276 cifs_fscache_reset_inode_cookie(inode);
2281 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2283 * @key: currently unused
2284 * @mode: the task state to sleep in
2287 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2289 freezable_schedule_unsafe();
2290 if (signal_pending_state(mode, current))
2291 return -ERESTARTSYS;
2296 cifs_revalidate_mapping(struct inode *inode)
2299 unsigned long *flags = &CIFS_I(inode)->flags;
2300 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2302 /* swapfiles are not supposed to be shared */
2303 if (IS_SWAPFILE(inode))
2306 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2311 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2312 /* for cache=singleclient, do not invalidate */
2313 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2314 goto skip_invalidate;
2316 rc = cifs_invalidate_mapping(inode);
2318 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2322 clear_bit_unlock(CIFS_INO_LOCK, flags);
2323 smp_mb__after_atomic();
2324 wake_up_bit(flags, CIFS_INO_LOCK);
2330 cifs_zap_mapping(struct inode *inode)
2332 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2333 return cifs_revalidate_mapping(inode);
2336 int cifs_revalidate_file_attr(struct file *filp)
2339 struct dentry *dentry = file_dentry(filp);
2340 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2342 if (!cifs_dentry_needs_reval(dentry))
2345 if (tlink_tcon(cfile->tlink)->unix_ext)
2346 rc = cifs_get_file_info_unix(filp);
2348 rc = cifs_get_file_info(filp);
2353 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2357 struct inode *inode = d_inode(dentry);
2358 struct super_block *sb = dentry->d_sb;
2359 const char *full_path;
2366 if (!cifs_dentry_needs_reval(dentry))
2371 page = alloc_dentry_path();
2372 full_path = build_path_from_dentry(dentry, page);
2373 if (IS_ERR(full_path)) {
2374 rc = PTR_ERR(full_path);
2378 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2379 full_path, inode, inode->i_count.counter,
2380 dentry, cifs_get_time(dentry), jiffies);
2383 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2384 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2385 else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2386 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2388 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2390 if (rc == -EAGAIN && count++ < 10)
2393 free_dentry_path(page);
2399 int cifs_revalidate_file(struct file *filp)
2402 struct inode *inode = file_inode(filp);
2404 rc = cifs_revalidate_file_attr(filp);
2408 return cifs_revalidate_mapping(inode);
2411 /* revalidate a dentry's inode attributes */
2412 int cifs_revalidate_dentry(struct dentry *dentry)
2415 struct inode *inode = d_inode(dentry);
2417 rc = cifs_revalidate_dentry_attr(dentry);
2421 return cifs_revalidate_mapping(inode);
2424 int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
2425 struct kstat *stat, u32 request_mask, unsigned int flags)
2427 struct dentry *dentry = path->dentry;
2428 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2429 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2430 struct inode *inode = d_inode(dentry);
2433 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2437 * We need to be sure that all dirty pages are written and the server
2438 * has actual ctime, mtime and file length.
2440 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2441 !CIFS_CACHE_READ(CIFS_I(inode)) &&
2442 inode->i_mapping && inode->i_mapping->nrpages != 0) {
2443 rc = filemap_fdatawait(inode->i_mapping);
2445 mapping_set_error(inode->i_mapping, rc);
2450 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2451 CIFS_I(inode)->time = 0; /* force revalidate */
2454 * If the caller doesn't require syncing, only sync if
2455 * necessary (e.g. due to earlier truncate or setattr
2456 * invalidating the cached metadata)
2458 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2459 (CIFS_I(inode)->time == 0)) {
2460 rc = cifs_revalidate_dentry_attr(dentry);
2465 generic_fillattr(&init_user_ns, inode, stat);
2466 stat->blksize = cifs_sb->ctx->bsize;
2467 stat->ino = CIFS_I(inode)->uniqueid;
2469 /* old CIFS Unix Extensions doesn't return create time */
2470 if (CIFS_I(inode)->createtime) {
2471 stat->result_mask |= STATX_BTIME;
2473 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2476 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2477 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2478 stat->attributes |= STATX_ATTR_COMPRESSED;
2479 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2480 stat->attributes |= STATX_ATTR_ENCRYPTED;
2483 * If on a multiuser mount without unix extensions or cifsacl being
2484 * enabled, and the admin hasn't overridden them, set the ownership
2485 * to the fsuid/fsgid of the current process.
2487 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2488 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2490 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2491 stat->uid = current_fsuid();
2492 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2493 stat->gid = current_fsgid();
2498 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2501 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2502 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->vfs_inode.i_sb);
2503 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2504 struct TCP_Server_Info *server = tcon->ses->server;
2505 struct cifsFileInfo *cfile;
2508 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2512 * We need to be sure that all dirty pages are written as they
2513 * might fill holes on the server.
2515 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2516 inode->i_mapping->nrpages != 0) {
2517 rc = filemap_fdatawait(inode->i_mapping);
2519 mapping_set_error(inode->i_mapping, rc);
2524 cfile = find_readable_file(cifs_i, false);
2528 if (server->ops->fiemap) {
2529 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2530 cifsFileInfo_put(cfile);
2534 cifsFileInfo_put(cfile);
2538 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2540 pgoff_t index = from >> PAGE_SHIFT;
2541 unsigned offset = from & (PAGE_SIZE - 1);
2545 page = grab_cache_page(mapping, index);
2549 zero_user_segment(page, offset, PAGE_SIZE);
2555 void cifs_setsize(struct inode *inode, loff_t offset)
2557 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2559 spin_lock(&inode->i_lock);
2560 i_size_write(inode, offset);
2561 spin_unlock(&inode->i_lock);
2563 /* Cached inode must be refreshed on truncate */
2565 truncate_pagecache(inode, offset);
2569 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2570 unsigned int xid, const char *full_path)
2573 struct cifsFileInfo *open_file;
2574 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2575 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2576 struct tcon_link *tlink = NULL;
2577 struct cifs_tcon *tcon = NULL;
2578 struct TCP_Server_Info *server;
2581 * To avoid spurious oplock breaks from server, in the case of
2582 * inodes that we already have open, avoid doing path based
2583 * setting of file size if we can do it by handle.
2584 * This keeps our caching token (oplock) and avoids timeouts
2585 * when the local oplock break takes longer to flush
2586 * writebehind data than the SMB timeout for the SetPathInfo
2587 * request would allow
2589 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2591 tcon = tlink_tcon(open_file->tlink);
2592 server = tcon->ses->server;
2593 if (server->ops->set_file_size)
2594 rc = server->ops->set_file_size(xid, tcon, open_file,
2595 attrs->ia_size, false);
2598 cifsFileInfo_put(open_file);
2599 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2607 tlink = cifs_sb_tlink(cifs_sb);
2609 return PTR_ERR(tlink);
2610 tcon = tlink_tcon(tlink);
2611 server = tcon->ses->server;
2615 * Set file size by pathname rather than by handle either because no
2616 * valid, writeable file handle for it was found or because there was
2617 * an error setting it by handle.
2619 if (server->ops->set_path_size)
2620 rc = server->ops->set_path_size(xid, tcon, full_path,
2621 attrs->ia_size, cifs_sb, false);
2624 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2627 cifs_put_tlink(tlink);
2631 cifsInode->server_eof = attrs->ia_size;
2632 cifs_setsize(inode, attrs->ia_size);
2634 * i_blocks is not related to (i_size / i_blksize), but instead
2635 * 512 byte (2**9) size is required for calculating num blocks.
2636 * Until we can query the server for actual allocation size,
2637 * this is best estimate we have for blocks allocated for a file
2638 * Number of blocks must be rounded up so size 1 is not 0 blocks
2640 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2643 * The man page of truncate says if the size changed,
2644 * then the st_ctime and st_mtime fields for the file
2647 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2648 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2650 cifs_truncate_page(inode->i_mapping, inode->i_size);
2657 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2661 const char *full_path;
2662 void *page = alloc_dentry_path();
2663 struct inode *inode = d_inode(direntry);
2664 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2665 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2666 struct tcon_link *tlink;
2667 struct cifs_tcon *pTcon;
2668 struct cifs_unix_set_info_args *args = NULL;
2669 struct cifsFileInfo *open_file;
2671 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2672 direntry, attrs->ia_valid);
2676 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2677 attrs->ia_valid |= ATTR_FORCE;
2679 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2683 full_path = build_path_from_dentry(direntry, page);
2684 if (IS_ERR(full_path)) {
2685 rc = PTR_ERR(full_path);
2690 * Attempt to flush data before changing attributes. We need to do
2691 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2692 * ownership or mode then we may also need to do this. Here, we take
2693 * the safe way out and just do the flush on all setattr requests. If
2694 * the flush returns error, store it to report later and continue.
2696 * BB: This should be smarter. Why bother flushing pages that
2697 * will be truncated anyway? Also, should we error out here if
2698 * the flush returns error?
2700 rc = filemap_write_and_wait(inode->i_mapping);
2701 if (is_interrupt_error(rc)) {
2706 mapping_set_error(inode->i_mapping, rc);
2709 if (attrs->ia_valid & ATTR_SIZE) {
2710 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2715 /* skip mode change if it's just for clearing setuid/setgid */
2716 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2717 attrs->ia_valid &= ~ATTR_MODE;
2719 args = kmalloc(sizeof(*args), GFP_KERNEL);
2725 /* set up the struct */
2726 if (attrs->ia_valid & ATTR_MODE)
2727 args->mode = attrs->ia_mode;
2729 args->mode = NO_CHANGE_64;
2731 if (attrs->ia_valid & ATTR_UID)
2732 args->uid = attrs->ia_uid;
2734 args->uid = INVALID_UID; /* no change */
2736 if (attrs->ia_valid & ATTR_GID)
2737 args->gid = attrs->ia_gid;
2739 args->gid = INVALID_GID; /* no change */
2741 if (attrs->ia_valid & ATTR_ATIME)
2742 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2744 args->atime = NO_CHANGE_64;
2746 if (attrs->ia_valid & ATTR_MTIME)
2747 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2749 args->mtime = NO_CHANGE_64;
2751 if (attrs->ia_valid & ATTR_CTIME)
2752 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2754 args->ctime = NO_CHANGE_64;
2757 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2759 u16 nfid = open_file->fid.netfid;
2760 u32 npid = open_file->pid;
2761 pTcon = tlink_tcon(open_file->tlink);
2762 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2763 cifsFileInfo_put(open_file);
2765 tlink = cifs_sb_tlink(cifs_sb);
2766 if (IS_ERR(tlink)) {
2767 rc = PTR_ERR(tlink);
2770 pTcon = tlink_tcon(tlink);
2771 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2773 cifs_remap(cifs_sb));
2774 cifs_put_tlink(tlink);
2780 if ((attrs->ia_valid & ATTR_SIZE) &&
2781 attrs->ia_size != i_size_read(inode))
2782 truncate_setsize(inode, attrs->ia_size);
2784 setattr_copy(&init_user_ns, inode, attrs);
2785 mark_inode_dirty(inode);
2787 /* force revalidate when any of these times are set since some
2788 of the fs types (eg ext3, fat) do not have fine enough
2789 time granularity to match protocol, and we do not have a
2790 a way (yet) to query the server fs's time granularity (and
2791 whether it rounds times down).
2793 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2794 cifsInode->time = 0;
2797 free_dentry_path(page);
2803 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2806 kuid_t uid = INVALID_UID;
2807 kgid_t gid = INVALID_GID;
2808 struct inode *inode = d_inode(direntry);
2809 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2810 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2811 struct cifsFileInfo *wfile;
2812 struct cifs_tcon *tcon;
2813 const char *full_path;
2814 void *page = alloc_dentry_path();
2817 __u64 mode = NO_CHANGE_64;
2821 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2822 direntry, attrs->ia_valid);
2824 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2825 attrs->ia_valid |= ATTR_FORCE;
2827 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2829 goto cifs_setattr_exit;
2831 full_path = build_path_from_dentry(direntry, page);
2832 if (IS_ERR(full_path)) {
2833 rc = PTR_ERR(full_path);
2834 goto cifs_setattr_exit;
2838 * Attempt to flush data before changing attributes. We need to do
2839 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
2840 * returns error, store it to report later and continue.
2842 * BB: This should be smarter. Why bother flushing pages that
2843 * will be truncated anyway? Also, should we error out here if
2844 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
2846 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
2847 rc = filemap_write_and_wait(inode->i_mapping);
2848 if (is_interrupt_error(rc)) {
2850 goto cifs_setattr_exit;
2852 mapping_set_error(inode->i_mapping, rc);
2857 if ((attrs->ia_valid & ATTR_MTIME) &&
2858 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2859 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
2861 tcon = tlink_tcon(wfile->tlink);
2862 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
2863 cifsFileInfo_put(wfile);
2865 goto cifs_setattr_exit;
2866 } else if (rc != -EBADF)
2867 goto cifs_setattr_exit;
2872 if (attrs->ia_valid & ATTR_SIZE) {
2873 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2875 goto cifs_setattr_exit;
2878 if (attrs->ia_valid & ATTR_UID)
2879 uid = attrs->ia_uid;
2881 if (attrs->ia_valid & ATTR_GID)
2882 gid = attrs->ia_gid;
2884 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2885 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2886 if (uid_valid(uid) || gid_valid(gid)) {
2887 mode = NO_CHANGE_64;
2888 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2891 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2893 goto cifs_setattr_exit;
2897 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2898 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2900 /* skip mode change if it's just for clearing setuid/setgid */
2901 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2902 attrs->ia_valid &= ~ATTR_MODE;
2904 if (attrs->ia_valid & ATTR_MODE) {
2905 mode = attrs->ia_mode;
2907 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2908 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2909 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2910 INVALID_UID, INVALID_GID);
2912 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2914 goto cifs_setattr_exit;
2918 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
2919 * Pick up the actual mode bits that were set.
2921 if (mode != attrs->ia_mode)
2922 attrs->ia_mode = mode;
2924 if (((mode & S_IWUGO) == 0) &&
2925 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
2927 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2929 /* fix up mode if we're not using dynperm */
2930 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2931 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2932 } else if ((mode & S_IWUGO) &&
2933 (cifsInode->cifsAttrs & ATTR_READONLY)) {
2935 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2936 /* Attributes of 0 are ignored */
2938 dosattr |= ATTR_NORMAL;
2940 /* reset local inode permissions to normal */
2941 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2942 attrs->ia_mode &= ~(S_IALLUGO);
2943 if (S_ISDIR(inode->i_mode))
2945 cifs_sb->ctx->dir_mode;
2948 cifs_sb->ctx->file_mode;
2950 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2951 /* ignore mode change - ATTR_READONLY hasn't changed */
2952 attrs->ia_valid &= ~ATTR_MODE;
2956 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2957 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2958 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2959 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2961 /* Even if error on time set, no sense failing the call if
2962 the server would set the time to a reasonable value anyway,
2963 and this check ensures that we are not being called from
2964 sys_utimes in which case we ought to fail the call back to
2965 the user when the server rejects the call */
2966 if ((rc) && (attrs->ia_valid &
2967 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
2971 /* do not need local check to inode_check_ok since the server does
2974 goto cifs_setattr_exit;
2976 if ((attrs->ia_valid & ATTR_SIZE) &&
2977 attrs->ia_size != i_size_read(inode))
2978 truncate_setsize(inode, attrs->ia_size);
2980 setattr_copy(&init_user_ns, inode, attrs);
2981 mark_inode_dirty(inode);
2985 free_dentry_path(page);
2990 cifs_setattr(struct user_namespace *mnt_userns, struct dentry *direntry,
2991 struct iattr *attrs)
2993 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
2994 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
2995 int rc, retries = 0;
2997 if (unlikely(cifs_forced_shutdown(cifs_sb)))
3001 if (pTcon->unix_ext)
3002 rc = cifs_setattr_unix(direntry, attrs);
3004 rc = cifs_setattr_nounix(direntry, attrs);
3006 } while (is_retryable_error(rc) && retries < 2);
3008 /* BB: add cifs_setattr_legacy for really old servers */