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_all_deferred_files(tcon);
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;
2088 if (flags & ~RENAME_NOREPLACE)
2091 cifs_sb = CIFS_SB(source_dir->i_sb);
2092 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2095 tlink = cifs_sb_tlink(cifs_sb);
2097 return PTR_ERR(tlink);
2098 tcon = tlink_tcon(tlink);
2100 page1 = alloc_dentry_path();
2101 page2 = alloc_dentry_path();
2104 from_name = build_path_from_dentry(source_dentry, page1);
2105 if (IS_ERR(from_name)) {
2106 rc = PTR_ERR(from_name);
2107 goto cifs_rename_exit;
2110 to_name = build_path_from_dentry(target_dentry, page2);
2111 if (IS_ERR(to_name)) {
2112 rc = PTR_ERR(to_name);
2113 goto cifs_rename_exit;
2116 cifs_close_all_deferred_files(tcon);
2117 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2121 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2123 if (flags & RENAME_NOREPLACE)
2124 goto cifs_rename_exit;
2126 if (rc == -EEXIST && tcon->unix_ext) {
2128 * Are src and dst hardlinks of same inode? We can only tell
2129 * with unix extensions enabled.
2132 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2134 if (info_buf_source == NULL) {
2136 goto cifs_rename_exit;
2139 info_buf_target = info_buf_source + 1;
2140 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2143 cifs_remap(cifs_sb));
2147 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2150 cifs_remap(cifs_sb));
2152 if (tmprc == 0 && (info_buf_source->UniqueId ==
2153 info_buf_target->UniqueId)) {
2154 /* same file, POSIX says that this is a noop */
2156 goto cifs_rename_exit;
2160 * else ... BB we could add the same check for Windows by
2161 * checking the UniqueId via FILE_INTERNAL_INFO
2165 /* Try unlinking the target dentry if it's not negative */
2166 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2167 if (d_is_dir(target_dentry))
2168 tmprc = cifs_rmdir(target_dir, target_dentry);
2170 tmprc = cifs_unlink(target_dir, target_dentry);
2172 goto cifs_rename_exit;
2173 rc = cifs_do_rename(xid, source_dentry, from_name,
2174 target_dentry, to_name);
2177 /* force revalidate to go get info when needed */
2178 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2180 source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
2181 target_dir->i_mtime = current_time(source_dir);
2184 kfree(info_buf_source);
2185 free_dentry_path(page2);
2186 free_dentry_path(page1);
2188 cifs_put_tlink(tlink);
2193 cifs_dentry_needs_reval(struct dentry *dentry)
2195 struct inode *inode = d_inode(dentry);
2196 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2197 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2198 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2199 struct cached_fid *cfid = NULL;
2201 if (cifs_i->time == 0)
2204 if (CIFS_CACHE_READ(cifs_i))
2207 if (!lookupCacheEnabled)
2210 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2211 mutex_lock(&cfid->fid_mutex);
2212 if (cfid->time && cifs_i->time > cfid->time) {
2213 mutex_unlock(&cfid->fid_mutex);
2214 close_cached_dir(cfid);
2217 mutex_unlock(&cfid->fid_mutex);
2218 close_cached_dir(cfid);
2221 * depending on inode type, check if attribute caching disabled for
2222 * files or directories
2224 if (S_ISDIR(inode->i_mode)) {
2225 if (!cifs_sb->ctx->acdirmax)
2227 if (!time_in_range(jiffies, cifs_i->time,
2228 cifs_i->time + cifs_sb->ctx->acdirmax))
2231 if (!cifs_sb->ctx->acregmax)
2233 if (!time_in_range(jiffies, cifs_i->time,
2234 cifs_i->time + cifs_sb->ctx->acregmax))
2238 /* hardlinked files w/ noserverino get "special" treatment */
2239 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2240 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2247 * Zap the cache. Called when invalid_mapping flag is set.
2250 cifs_invalidate_mapping(struct inode *inode)
2254 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2255 rc = invalidate_inode_pages2(inode->i_mapping);
2257 cifs_dbg(VFS, "%s: Could not invalidate inode %p\n",
2261 cifs_fscache_reset_inode_cookie(inode);
2266 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2268 * @key: currently unused
2269 * @mode: the task state to sleep in
2272 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2274 freezable_schedule_unsafe();
2275 if (signal_pending_state(mode, current))
2276 return -ERESTARTSYS;
2281 cifs_revalidate_mapping(struct inode *inode)
2284 unsigned long *flags = &CIFS_I(inode)->flags;
2286 /* swapfiles are not supposed to be shared */
2287 if (IS_SWAPFILE(inode))
2290 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2295 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2296 rc = cifs_invalidate_mapping(inode);
2298 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2301 clear_bit_unlock(CIFS_INO_LOCK, flags);
2302 smp_mb__after_atomic();
2303 wake_up_bit(flags, CIFS_INO_LOCK);
2309 cifs_zap_mapping(struct inode *inode)
2311 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2312 return cifs_revalidate_mapping(inode);
2315 int cifs_revalidate_file_attr(struct file *filp)
2318 struct dentry *dentry = file_dentry(filp);
2319 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2321 if (!cifs_dentry_needs_reval(dentry))
2324 if (tlink_tcon(cfile->tlink)->unix_ext)
2325 rc = cifs_get_file_info_unix(filp);
2327 rc = cifs_get_file_info(filp);
2332 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2336 struct inode *inode = d_inode(dentry);
2337 struct super_block *sb = dentry->d_sb;
2338 const char *full_path;
2345 if (!cifs_dentry_needs_reval(dentry))
2350 page = alloc_dentry_path();
2351 full_path = build_path_from_dentry(dentry, page);
2352 if (IS_ERR(full_path)) {
2353 rc = PTR_ERR(full_path);
2357 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2358 full_path, inode, inode->i_count.counter,
2359 dentry, cifs_get_time(dentry), jiffies);
2362 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2363 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2364 else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2365 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2367 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2369 if (rc == -EAGAIN && count++ < 10)
2372 free_dentry_path(page);
2378 int cifs_revalidate_file(struct file *filp)
2381 struct inode *inode = file_inode(filp);
2383 rc = cifs_revalidate_file_attr(filp);
2387 return cifs_revalidate_mapping(inode);
2390 /* revalidate a dentry's inode attributes */
2391 int cifs_revalidate_dentry(struct dentry *dentry)
2394 struct inode *inode = d_inode(dentry);
2396 rc = cifs_revalidate_dentry_attr(dentry);
2400 return cifs_revalidate_mapping(inode);
2403 int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
2404 struct kstat *stat, u32 request_mask, unsigned int flags)
2406 struct dentry *dentry = path->dentry;
2407 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2408 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2409 struct inode *inode = d_inode(dentry);
2412 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2416 * We need to be sure that all dirty pages are written and the server
2417 * has actual ctime, mtime and file length.
2419 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2420 !CIFS_CACHE_READ(CIFS_I(inode)) &&
2421 inode->i_mapping && inode->i_mapping->nrpages != 0) {
2422 rc = filemap_fdatawait(inode->i_mapping);
2424 mapping_set_error(inode->i_mapping, rc);
2429 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2430 CIFS_I(inode)->time = 0; /* force revalidate */
2433 * If the caller doesn't require syncing, only sync if
2434 * necessary (e.g. due to earlier truncate or setattr
2435 * invalidating the cached metadata)
2437 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2438 (CIFS_I(inode)->time == 0)) {
2439 rc = cifs_revalidate_dentry_attr(dentry);
2444 generic_fillattr(&init_user_ns, inode, stat);
2445 stat->blksize = cifs_sb->ctx->bsize;
2446 stat->ino = CIFS_I(inode)->uniqueid;
2448 /* old CIFS Unix Extensions doesn't return create time */
2449 if (CIFS_I(inode)->createtime) {
2450 stat->result_mask |= STATX_BTIME;
2452 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2455 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2456 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2457 stat->attributes |= STATX_ATTR_COMPRESSED;
2458 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2459 stat->attributes |= STATX_ATTR_ENCRYPTED;
2462 * If on a multiuser mount without unix extensions or cifsacl being
2463 * enabled, and the admin hasn't overridden them, set the ownership
2464 * to the fsuid/fsgid of the current process.
2466 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2467 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2469 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2470 stat->uid = current_fsuid();
2471 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2472 stat->gid = current_fsgid();
2477 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2480 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2481 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->vfs_inode.i_sb);
2482 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2483 struct TCP_Server_Info *server = tcon->ses->server;
2484 struct cifsFileInfo *cfile;
2487 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2491 * We need to be sure that all dirty pages are written as they
2492 * might fill holes on the server.
2494 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2495 inode->i_mapping->nrpages != 0) {
2496 rc = filemap_fdatawait(inode->i_mapping);
2498 mapping_set_error(inode->i_mapping, rc);
2503 cfile = find_readable_file(cifs_i, false);
2507 if (server->ops->fiemap) {
2508 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2509 cifsFileInfo_put(cfile);
2513 cifsFileInfo_put(cfile);
2517 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2519 pgoff_t index = from >> PAGE_SHIFT;
2520 unsigned offset = from & (PAGE_SIZE - 1);
2524 page = grab_cache_page(mapping, index);
2528 zero_user_segment(page, offset, PAGE_SIZE);
2534 void cifs_setsize(struct inode *inode, loff_t offset)
2536 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2538 spin_lock(&inode->i_lock);
2539 i_size_write(inode, offset);
2540 spin_unlock(&inode->i_lock);
2542 /* Cached inode must be refreshed on truncate */
2544 truncate_pagecache(inode, offset);
2548 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2549 unsigned int xid, const char *full_path)
2552 struct cifsFileInfo *open_file;
2553 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2554 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2555 struct tcon_link *tlink = NULL;
2556 struct cifs_tcon *tcon = NULL;
2557 struct TCP_Server_Info *server;
2560 * To avoid spurious oplock breaks from server, in the case of
2561 * inodes that we already have open, avoid doing path based
2562 * setting of file size if we can do it by handle.
2563 * This keeps our caching token (oplock) and avoids timeouts
2564 * when the local oplock break takes longer to flush
2565 * writebehind data than the SMB timeout for the SetPathInfo
2566 * request would allow
2568 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2570 tcon = tlink_tcon(open_file->tlink);
2571 server = tcon->ses->server;
2572 if (server->ops->set_file_size)
2573 rc = server->ops->set_file_size(xid, tcon, open_file,
2574 attrs->ia_size, false);
2577 cifsFileInfo_put(open_file);
2578 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2586 tlink = cifs_sb_tlink(cifs_sb);
2588 return PTR_ERR(tlink);
2589 tcon = tlink_tcon(tlink);
2590 server = tcon->ses->server;
2594 * Set file size by pathname rather than by handle either because no
2595 * valid, writeable file handle for it was found or because there was
2596 * an error setting it by handle.
2598 if (server->ops->set_path_size)
2599 rc = server->ops->set_path_size(xid, tcon, full_path,
2600 attrs->ia_size, cifs_sb, false);
2603 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2606 cifs_put_tlink(tlink);
2610 cifsInode->server_eof = attrs->ia_size;
2611 cifs_setsize(inode, attrs->ia_size);
2613 * i_blocks is not related to (i_size / i_blksize), but instead
2614 * 512 byte (2**9) size is required for calculating num blocks.
2615 * Until we can query the server for actual allocation size,
2616 * this is best estimate we have for blocks allocated for a file
2617 * Number of blocks must be rounded up so size 1 is not 0 blocks
2619 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2622 * The man page of truncate says if the size changed,
2623 * then the st_ctime and st_mtime fields for the file
2626 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2627 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2629 cifs_truncate_page(inode->i_mapping, inode->i_size);
2636 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2640 const char *full_path;
2641 void *page = alloc_dentry_path();
2642 struct inode *inode = d_inode(direntry);
2643 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2644 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2645 struct tcon_link *tlink;
2646 struct cifs_tcon *pTcon;
2647 struct cifs_unix_set_info_args *args = NULL;
2648 struct cifsFileInfo *open_file;
2650 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2651 direntry, attrs->ia_valid);
2655 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2656 attrs->ia_valid |= ATTR_FORCE;
2658 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2662 full_path = build_path_from_dentry(direntry, page);
2663 if (IS_ERR(full_path)) {
2664 rc = PTR_ERR(full_path);
2669 * Attempt to flush data before changing attributes. We need to do
2670 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2671 * ownership or mode then we may also need to do this. Here, we take
2672 * the safe way out and just do the flush on all setattr requests. If
2673 * the flush returns error, store it to report later and continue.
2675 * BB: This should be smarter. Why bother flushing pages that
2676 * will be truncated anyway? Also, should we error out here if
2677 * the flush returns error?
2679 rc = filemap_write_and_wait(inode->i_mapping);
2680 if (is_interrupt_error(rc)) {
2685 mapping_set_error(inode->i_mapping, rc);
2688 if (attrs->ia_valid & ATTR_SIZE) {
2689 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2694 /* skip mode change if it's just for clearing setuid/setgid */
2695 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2696 attrs->ia_valid &= ~ATTR_MODE;
2698 args = kmalloc(sizeof(*args), GFP_KERNEL);
2704 /* set up the struct */
2705 if (attrs->ia_valid & ATTR_MODE)
2706 args->mode = attrs->ia_mode;
2708 args->mode = NO_CHANGE_64;
2710 if (attrs->ia_valid & ATTR_UID)
2711 args->uid = attrs->ia_uid;
2713 args->uid = INVALID_UID; /* no change */
2715 if (attrs->ia_valid & ATTR_GID)
2716 args->gid = attrs->ia_gid;
2718 args->gid = INVALID_GID; /* no change */
2720 if (attrs->ia_valid & ATTR_ATIME)
2721 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2723 args->atime = NO_CHANGE_64;
2725 if (attrs->ia_valid & ATTR_MTIME)
2726 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2728 args->mtime = NO_CHANGE_64;
2730 if (attrs->ia_valid & ATTR_CTIME)
2731 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2733 args->ctime = NO_CHANGE_64;
2736 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2738 u16 nfid = open_file->fid.netfid;
2739 u32 npid = open_file->pid;
2740 pTcon = tlink_tcon(open_file->tlink);
2741 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2742 cifsFileInfo_put(open_file);
2744 tlink = cifs_sb_tlink(cifs_sb);
2745 if (IS_ERR(tlink)) {
2746 rc = PTR_ERR(tlink);
2749 pTcon = tlink_tcon(tlink);
2750 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2752 cifs_remap(cifs_sb));
2753 cifs_put_tlink(tlink);
2759 if ((attrs->ia_valid & ATTR_SIZE) &&
2760 attrs->ia_size != i_size_read(inode))
2761 truncate_setsize(inode, attrs->ia_size);
2763 setattr_copy(&init_user_ns, inode, attrs);
2764 mark_inode_dirty(inode);
2766 /* force revalidate when any of these times are set since some
2767 of the fs types (eg ext3, fat) do not have fine enough
2768 time granularity to match protocol, and we do not have a
2769 a way (yet) to query the server fs's time granularity (and
2770 whether it rounds times down).
2772 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2773 cifsInode->time = 0;
2776 free_dentry_path(page);
2782 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2785 kuid_t uid = INVALID_UID;
2786 kgid_t gid = INVALID_GID;
2787 struct inode *inode = d_inode(direntry);
2788 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2789 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2790 struct cifsFileInfo *wfile;
2791 struct cifs_tcon *tcon;
2792 const char *full_path;
2793 void *page = alloc_dentry_path();
2796 __u64 mode = NO_CHANGE_64;
2800 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2801 direntry, attrs->ia_valid);
2803 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2804 attrs->ia_valid |= ATTR_FORCE;
2806 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2808 goto cifs_setattr_exit;
2810 full_path = build_path_from_dentry(direntry, page);
2811 if (IS_ERR(full_path)) {
2812 rc = PTR_ERR(full_path);
2813 goto cifs_setattr_exit;
2817 * Attempt to flush data before changing attributes. We need to do
2818 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
2819 * returns error, store it to report later and continue.
2821 * BB: This should be smarter. Why bother flushing pages that
2822 * will be truncated anyway? Also, should we error out here if
2823 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
2825 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
2826 rc = filemap_write_and_wait(inode->i_mapping);
2827 if (is_interrupt_error(rc)) {
2829 goto cifs_setattr_exit;
2831 mapping_set_error(inode->i_mapping, rc);
2836 if ((attrs->ia_valid & ATTR_MTIME) &&
2837 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2838 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
2840 tcon = tlink_tcon(wfile->tlink);
2841 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
2842 cifsFileInfo_put(wfile);
2844 goto cifs_setattr_exit;
2845 } else if (rc != -EBADF)
2846 goto cifs_setattr_exit;
2851 if (attrs->ia_valid & ATTR_SIZE) {
2852 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2854 goto cifs_setattr_exit;
2857 if (attrs->ia_valid & ATTR_UID)
2858 uid = attrs->ia_uid;
2860 if (attrs->ia_valid & ATTR_GID)
2861 gid = attrs->ia_gid;
2863 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2864 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2865 if (uid_valid(uid) || gid_valid(gid)) {
2866 mode = NO_CHANGE_64;
2867 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2870 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2872 goto cifs_setattr_exit;
2876 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2877 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2879 /* skip mode change if it's just for clearing setuid/setgid */
2880 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2881 attrs->ia_valid &= ~ATTR_MODE;
2883 if (attrs->ia_valid & ATTR_MODE) {
2884 mode = attrs->ia_mode;
2886 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2887 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2888 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2889 INVALID_UID, INVALID_GID);
2891 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2893 goto cifs_setattr_exit;
2897 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
2898 * Pick up the actual mode bits that were set.
2900 if (mode != attrs->ia_mode)
2901 attrs->ia_mode = mode;
2903 if (((mode & S_IWUGO) == 0) &&
2904 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
2906 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2908 /* fix up mode if we're not using dynperm */
2909 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2910 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2911 } else if ((mode & S_IWUGO) &&
2912 (cifsInode->cifsAttrs & ATTR_READONLY)) {
2914 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2915 /* Attributes of 0 are ignored */
2917 dosattr |= ATTR_NORMAL;
2919 /* reset local inode permissions to normal */
2920 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2921 attrs->ia_mode &= ~(S_IALLUGO);
2922 if (S_ISDIR(inode->i_mode))
2924 cifs_sb->ctx->dir_mode;
2927 cifs_sb->ctx->file_mode;
2929 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2930 /* ignore mode change - ATTR_READONLY hasn't changed */
2931 attrs->ia_valid &= ~ATTR_MODE;
2935 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2936 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2937 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2938 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2940 /* Even if error on time set, no sense failing the call if
2941 the server would set the time to a reasonable value anyway,
2942 and this check ensures that we are not being called from
2943 sys_utimes in which case we ought to fail the call back to
2944 the user when the server rejects the call */
2945 if ((rc) && (attrs->ia_valid &
2946 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
2950 /* do not need local check to inode_check_ok since the server does
2953 goto cifs_setattr_exit;
2955 if ((attrs->ia_valid & ATTR_SIZE) &&
2956 attrs->ia_size != i_size_read(inode))
2957 truncate_setsize(inode, attrs->ia_size);
2959 setattr_copy(&init_user_ns, inode, attrs);
2960 mark_inode_dirty(inode);
2964 free_dentry_path(page);
2969 cifs_setattr(struct user_namespace *mnt_userns, struct dentry *direntry,
2970 struct iattr *attrs)
2972 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
2973 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
2974 int rc, retries = 0;
2976 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2980 if (pTcon->unix_ext)
2981 rc = cifs_setattr_unix(direntry, attrs);
2983 rc = cifs_setattr_nounix(direntry, attrs);
2985 } while (is_retryable_error(rc) && retries < 2);
2987 /* BB: add cifs_setattr_legacy for really old servers */