4 * Copyright (C) International Business Machines Corp., 2002,2010
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/stat.h>
23 #include <linux/slab.h>
24 #include <linux/pagemap.h>
25 #include <linux/freezer.h>
26 #include <linux/sched/signal.h>
27 #include <linux/wait_bit.h>
28 #include <linux/fiemap.h>
29 #include <asm/div64.h>
33 #include "cifsproto.h"
34 #include "smb2proto.h"
35 #include "cifs_debug.h"
36 #include "cifs_fs_sb.h"
37 #include "cifs_unicode.h"
39 #include "fs_context.h"
40 #include "cifs_ioctl.h"
42 static void cifs_set_ops(struct inode *inode)
44 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
46 switch (inode->i_mode & S_IFMT) {
48 inode->i_op = &cifs_file_inode_ops;
49 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
50 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
51 inode->i_fop = &cifs_file_direct_nobrl_ops;
53 inode->i_fop = &cifs_file_direct_ops;
54 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
55 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
56 inode->i_fop = &cifs_file_strict_nobrl_ops;
58 inode->i_fop = &cifs_file_strict_ops;
59 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
60 inode->i_fop = &cifs_file_nobrl_ops;
61 else { /* not direct, send byte range locks */
62 inode->i_fop = &cifs_file_ops;
65 /* check if server can support readpages */
66 if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read <
67 PAGE_SIZE + MAX_CIFS_HDR_SIZE)
68 inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
70 inode->i_data.a_ops = &cifs_addr_ops;
73 #ifdef CONFIG_CIFS_DFS_UPCALL
74 if (IS_AUTOMOUNT(inode)) {
75 inode->i_op = &cifs_dfs_referral_inode_operations;
77 #else /* NO DFS support, treat as a directory */
80 inode->i_op = &cifs_dir_inode_ops;
81 inode->i_fop = &cifs_dir_ops;
85 inode->i_op = &cifs_symlink_inode_ops;
88 init_special_inode(inode, inode->i_mode, inode->i_rdev);
93 /* check inode attributes against fattr. If they don't match, tag the
94 * inode for cache invalidation
97 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
99 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
101 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
102 __func__, cifs_i->uniqueid);
104 if (inode->i_state & I_NEW) {
105 cifs_dbg(FYI, "%s: inode %llu is new\n",
106 __func__, cifs_i->uniqueid);
110 /* don't bother with revalidation if we have an oplock */
111 if (CIFS_CACHE_READ(cifs_i)) {
112 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
113 __func__, cifs_i->uniqueid);
117 /* revalidate if mtime or size have changed */
118 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
119 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
120 cifs_i->server_eof == fattr->cf_eof) {
121 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
122 __func__, cifs_i->uniqueid);
126 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
127 __func__, cifs_i->uniqueid);
128 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
132 * copy nlink to the inode, unless it wasn't provided. Provide
133 * sane values if we don't have an existing one and none was provided
136 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
139 * if we're in a situation where we can't trust what we
140 * got from the server (readdir, some non-unix cases)
141 * fake reasonable values
143 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
144 /* only provide fake values on a new inode */
145 if (inode->i_state & I_NEW) {
146 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
154 /* we trust the server, so update it */
155 set_nlink(inode, fattr->cf_nlink);
158 /* populate an inode with info from a cifs_fattr struct */
160 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
162 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
163 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
165 cifs_revalidate_cache(inode, fattr);
167 spin_lock(&inode->i_lock);
168 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
169 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
170 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
171 /* we do not want atime to be less than mtime, it broke some apps */
172 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
173 inode->i_atime = fattr->cf_mtime;
175 inode->i_atime = fattr->cf_atime;
176 inode->i_mtime = fattr->cf_mtime;
177 inode->i_ctime = fattr->cf_ctime;
178 inode->i_rdev = fattr->cf_rdev;
179 cifs_nlink_fattr_to_inode(inode, fattr);
180 inode->i_uid = fattr->cf_uid;
181 inode->i_gid = fattr->cf_gid;
183 /* if dynperm is set, don't clobber existing mode */
184 if (inode->i_state & I_NEW ||
185 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
186 inode->i_mode = fattr->cf_mode;
188 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
190 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
193 cifs_i->time = jiffies;
195 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
196 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
198 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
200 cifs_i->server_eof = fattr->cf_eof;
202 * Can't safely change the file size here if the client is writing to
203 * it due to potential races.
205 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
206 i_size_write(inode, fattr->cf_eof);
209 * i_blocks is not related to (i_size / i_blksize),
210 * but instead 512 byte (2**9) size is required for
211 * calculating num blocks.
213 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
215 spin_unlock(&inode->i_lock);
217 if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
218 inode->i_flags |= S_AUTOMOUNT;
219 if (inode->i_state & I_NEW)
224 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
226 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
228 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
231 fattr->cf_uniqueid = iunique(sb, ROOT_I);
234 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
236 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
237 struct cifs_sb_info *cifs_sb)
239 memset(fattr, 0, sizeof(*fattr));
240 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
241 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
242 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
244 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
245 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
246 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
247 /* old POSIX extensions don't get create time */
249 fattr->cf_mode = le64_to_cpu(info->Permissions);
252 * Since we set the inode type below we need to mask off
253 * to avoid strange results if bits set above.
255 fattr->cf_mode &= ~S_IFMT;
256 switch (le32_to_cpu(info->Type)) {
258 fattr->cf_mode |= S_IFREG;
259 fattr->cf_dtype = DT_REG;
262 fattr->cf_mode |= S_IFLNK;
263 fattr->cf_dtype = DT_LNK;
266 fattr->cf_mode |= S_IFDIR;
267 fattr->cf_dtype = DT_DIR;
270 fattr->cf_mode |= S_IFCHR;
271 fattr->cf_dtype = DT_CHR;
272 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
273 le64_to_cpu(info->DevMinor) & MINORMASK);
276 fattr->cf_mode |= S_IFBLK;
277 fattr->cf_dtype = DT_BLK;
278 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
279 le64_to_cpu(info->DevMinor) & MINORMASK);
282 fattr->cf_mode |= S_IFIFO;
283 fattr->cf_dtype = DT_FIFO;
286 fattr->cf_mode |= S_IFSOCK;
287 fattr->cf_dtype = DT_SOCK;
290 /* safest to call it a file if we do not know */
291 fattr->cf_mode |= S_IFREG;
292 fattr->cf_dtype = DT_REG;
293 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
297 fattr->cf_uid = cifs_sb->ctx->linux_uid;
298 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
299 u64 id = le64_to_cpu(info->Uid);
300 if (id < ((uid_t)-1)) {
301 kuid_t uid = make_kuid(&init_user_ns, id);
307 fattr->cf_gid = cifs_sb->ctx->linux_gid;
308 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
309 u64 id = le64_to_cpu(info->Gid);
310 if (id < ((gid_t)-1)) {
311 kgid_t gid = make_kgid(&init_user_ns, id);
317 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
321 * Fill a cifs_fattr struct with fake inode info.
323 * Needed to setup cifs_fattr data for the directory which is the
324 * junction to the new submount (ie to setup the fake directory
325 * which represents a DFS referral).
328 cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
330 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
332 cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
334 memset(fattr, 0, sizeof(*fattr));
335 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
336 fattr->cf_uid = cifs_sb->ctx->linux_uid;
337 fattr->cf_gid = cifs_sb->ctx->linux_gid;
338 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
339 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
341 fattr->cf_flags = CIFS_FATTR_DFS_REFERRAL;
345 cifs_get_file_info_unix(struct file *filp)
349 FILE_UNIX_BASIC_INFO find_data;
350 struct cifs_fattr fattr;
351 struct inode *inode = file_inode(filp);
352 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
353 struct cifsFileInfo *cfile = filp->private_data;
354 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
357 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
359 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
360 } else if (rc == -EREMOTE) {
361 cifs_create_dfs_fattr(&fattr, inode->i_sb);
365 cifs_fattr_to_inode(inode, &fattr);
370 int cifs_get_inode_info_unix(struct inode **pinode,
371 const unsigned char *full_path,
372 struct super_block *sb, unsigned int xid)
375 FILE_UNIX_BASIC_INFO find_data;
376 struct cifs_fattr fattr;
377 struct cifs_tcon *tcon;
378 struct tcon_link *tlink;
379 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
381 cifs_dbg(FYI, "Getting info on %s\n", full_path);
383 tlink = cifs_sb_tlink(cifs_sb);
385 return PTR_ERR(tlink);
386 tcon = tlink_tcon(tlink);
388 /* could have done a find first instead but this returns more info */
389 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
390 cifs_sb->local_nls, cifs_remap(cifs_sb));
391 cifs_put_tlink(tlink);
394 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
395 } else if (rc == -EREMOTE) {
396 cifs_create_dfs_fattr(&fattr, sb);
402 /* check for Minshall+French symlinks */
403 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
404 int tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
407 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
410 if (*pinode == NULL) {
412 cifs_fill_uniqueid(sb, &fattr);
413 *pinode = cifs_iget(sb, &fattr);
417 /* we already have inode, update it */
419 /* if uniqueid is different, return error */
420 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
421 CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
422 CIFS_I(*pinode)->time = 0; /* force reval */
427 /* if filetype is different, return error */
428 if (unlikely(((*pinode)->i_mode & S_IFMT) !=
429 (fattr.cf_mode & S_IFMT))) {
430 CIFS_I(*pinode)->time = 0; /* force reval */
435 cifs_fattr_to_inode(*pinode, &fattr);
443 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
444 struct cifs_sb_info *cifs_sb, unsigned int xid)
448 struct tcon_link *tlink;
449 struct cifs_tcon *tcon;
451 struct cifs_open_parms oparms;
452 struct cifs_io_parms io_parms = {0};
454 unsigned int bytes_read;
456 int buf_type = CIFS_NO_BUFFER;
460 fattr->cf_mode &= ~S_IFMT;
462 if (fattr->cf_eof == 0) {
463 fattr->cf_mode |= S_IFIFO;
464 fattr->cf_dtype = DT_FIFO;
466 } else if (fattr->cf_eof < 8) {
467 fattr->cf_mode |= S_IFREG;
468 fattr->cf_dtype = DT_REG;
469 return -EINVAL; /* EOPNOTSUPP? */
472 tlink = cifs_sb_tlink(cifs_sb);
474 return PTR_ERR(tlink);
475 tcon = tlink_tcon(tlink);
478 oparms.cifs_sb = cifs_sb;
479 oparms.desired_access = GENERIC_READ;
480 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
481 oparms.disposition = FILE_OPEN;
484 oparms.reconnect = false;
486 if (tcon->ses->server->oplocks)
490 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
492 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
493 cifs_put_tlink(tlink);
498 io_parms.netfid = fid.netfid;
499 io_parms.pid = current->tgid;
500 io_parms.tcon = tcon;
502 io_parms.length = 24;
504 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
505 &bytes_read, &pbuf, &buf_type);
506 if ((rc == 0) && (bytes_read >= 8)) {
507 if (memcmp("IntxBLK", pbuf, 8) == 0) {
508 cifs_dbg(FYI, "Block device\n");
509 fattr->cf_mode |= S_IFBLK;
510 fattr->cf_dtype = DT_BLK;
511 if (bytes_read == 24) {
512 /* we have enough to decode dev num */
513 __u64 mjr; /* major */
514 __u64 mnr; /* minor */
515 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
516 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
517 fattr->cf_rdev = MKDEV(mjr, mnr);
519 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
520 cifs_dbg(FYI, "Char device\n");
521 fattr->cf_mode |= S_IFCHR;
522 fattr->cf_dtype = DT_CHR;
523 if (bytes_read == 24) {
524 /* we have enough to decode dev num */
525 __u64 mjr; /* major */
526 __u64 mnr; /* minor */
527 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
528 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
529 fattr->cf_rdev = MKDEV(mjr, mnr);
531 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
532 cifs_dbg(FYI, "Symlink\n");
533 fattr->cf_mode |= S_IFLNK;
534 fattr->cf_dtype = DT_LNK;
536 fattr->cf_mode |= S_IFREG; /* file? */
537 fattr->cf_dtype = DT_REG;
541 fattr->cf_mode |= S_IFREG; /* then it is a file */
542 fattr->cf_dtype = DT_REG;
543 rc = -EOPNOTSUPP; /* or some unknown SFU type */
546 tcon->ses->server->ops->close(xid, tcon, &fid);
547 cifs_put_tlink(tlink);
551 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
554 * Fetch mode bits as provided by SFU.
556 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
558 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
559 struct cifs_sb_info *cifs_sb, unsigned int xid)
561 #ifdef CONFIG_CIFS_XATTR
565 struct tcon_link *tlink;
566 struct cifs_tcon *tcon;
568 tlink = cifs_sb_tlink(cifs_sb);
570 return PTR_ERR(tlink);
571 tcon = tlink_tcon(tlink);
573 if (tcon->ses->server->ops->query_all_EAs == NULL) {
574 cifs_put_tlink(tlink);
578 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
579 "SETFILEBITS", ea_value, 4 /* size of buf */,
581 cifs_put_tlink(tlink);
585 mode = le32_to_cpu(*((__le32 *)ea_value));
586 fattr->cf_mode &= ~SFBITS_MASK;
587 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
588 mode, fattr->cf_mode);
589 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
590 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
599 /* Fill a cifs_fattr struct with info from POSIX info struct */
601 smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct smb311_posix_qinfo *info,
602 struct super_block *sb, bool adjust_tz, bool symlink)
604 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
605 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
607 memset(fattr, 0, sizeof(*fattr));
609 /* no fattr->flags to set */
610 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
611 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
613 if (info->LastAccessTime)
614 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
616 ktime_get_coarse_real_ts64(&fattr->cf_atime);
618 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
619 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
622 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
623 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
626 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
627 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
628 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
630 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
631 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
632 /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
633 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
636 fattr->cf_mode |= S_IFLNK;
637 fattr->cf_dtype = DT_LNK;
638 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
639 fattr->cf_mode |= S_IFDIR;
640 fattr->cf_dtype = DT_DIR;
642 fattr->cf_mode |= S_IFREG;
643 fattr->cf_dtype = DT_REG;
645 /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
647 fattr->cf_uid = cifs_sb->ctx->linux_uid; /* TODO: map uid and gid from SID */
648 fattr->cf_gid = cifs_sb->ctx->linux_gid;
650 cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
651 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
655 /* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
657 cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
658 struct super_block *sb, bool adjust_tz,
659 bool symlink, u32 reparse_tag)
661 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
662 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
664 memset(fattr, 0, sizeof(*fattr));
665 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
666 if (info->DeletePending)
667 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
669 if (info->LastAccessTime)
670 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
672 ktime_get_coarse_real_ts64(&fattr->cf_atime);
674 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
675 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
678 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
679 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
682 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
683 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
684 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
686 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
687 if (reparse_tag == IO_REPARSE_TAG_LX_SYMLINK) {
688 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
689 fattr->cf_dtype = DT_LNK;
690 } else if (reparse_tag == IO_REPARSE_TAG_LX_FIFO) {
691 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
692 fattr->cf_dtype = DT_FIFO;
693 } else if (reparse_tag == IO_REPARSE_TAG_AF_UNIX) {
694 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
695 fattr->cf_dtype = DT_SOCK;
696 } else if (reparse_tag == IO_REPARSE_TAG_LX_CHR) {
697 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
698 fattr->cf_dtype = DT_CHR;
699 } else if (reparse_tag == IO_REPARSE_TAG_LX_BLK) {
700 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
701 fattr->cf_dtype = DT_BLK;
702 } else if (symlink) { /* TODO add more reparse tag checks */
703 fattr->cf_mode = S_IFLNK;
704 fattr->cf_dtype = DT_LNK;
705 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
706 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
707 fattr->cf_dtype = DT_DIR;
709 * Server can return wrong NumberOfLinks value for directories
710 * when Unix extensions are disabled - fake it.
713 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
715 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
716 fattr->cf_dtype = DT_REG;
718 /* clear write bits if ATTR_READONLY is set */
719 if (fattr->cf_cifsattrs & ATTR_READONLY)
720 fattr->cf_mode &= ~(S_IWUGO);
723 * Don't accept zero nlink from non-unix servers unless
724 * delete is pending. Instead mark it as unknown.
726 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
727 !info->DeletePending) {
728 cifs_dbg(VFS, "bogus file nlink value %u\n",
730 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
734 fattr->cf_uid = cifs_sb->ctx->linux_uid;
735 fattr->cf_gid = cifs_sb->ctx->linux_gid;
739 cifs_get_file_info(struct file *filp)
743 FILE_ALL_INFO find_data;
744 struct cifs_fattr fattr;
745 struct inode *inode = file_inode(filp);
746 struct cifsFileInfo *cfile = filp->private_data;
747 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
748 struct TCP_Server_Info *server = tcon->ses->server;
750 if (!server->ops->query_file_info)
754 rc = server->ops->query_file_info(xid, tcon, &cfile->fid, &find_data);
757 /* TODO: add support to query reparse tag */
758 cifs_all_info_to_fattr(&fattr, &find_data, inode->i_sb, false,
759 false, 0 /* no reparse tag */);
762 cifs_create_dfs_fattr(&fattr, inode->i_sb);
768 * FIXME: legacy server -- fall back to path-based call?
769 * for now, just skip revalidating and mark inode for
773 CIFS_I(inode)->time = 0;
780 * don't bother with SFU junk here -- just mark inode as needing
783 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
784 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
785 cifs_fattr_to_inode(inode, &fattr);
791 /* Simple function to return a 64 bit hash of string. Rarely called */
792 static __u64 simple_hashstr(const char *str)
794 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
798 hash = (hash + (__u64) *str++) * hash_mult;
804 * cifs_backup_query_path_info - SMB1 fallback code to get ino
806 * Fallback code to get file metadata when we don't have access to
807 * full_path (EACCES) and have backup creds.
809 * @xid: transaction id used to identify original request in logs
810 * @tcon: information about the server share we have mounted
811 * @sb: the superblock stores info such as disk space available
812 * @full_path: name of the file we are getting the metadata for
813 * @resp_buf: will be set to cifs resp buf and needs to be freed with
814 * cifs_buf_release() when done with @data
815 * @data: will be set to search info result buffer
818 cifs_backup_query_path_info(int xid,
819 struct cifs_tcon *tcon,
820 struct super_block *sb,
821 const char *full_path,
823 FILE_ALL_INFO **data)
825 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
826 struct cifs_search_info info = {0};
831 info.endOfSearch = false;
833 info.info_level = SMB_FIND_FILE_UNIX;
834 else if ((tcon->ses->capabilities &
835 tcon->ses->server->vals->cap_nt_find) == 0)
836 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
837 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
838 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
839 else /* no srvino useful for fallback to some netapp */
840 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
842 flags = CIFS_SEARCH_CLOSE_ALWAYS |
843 CIFS_SEARCH_CLOSE_AT_END |
844 CIFS_SEARCH_BACKUP_SEARCH;
846 rc = CIFSFindFirst(xid, tcon, full_path,
847 cifs_sb, NULL, flags, &info, false);
851 *resp_buf = (void *)info.ntwrk_buf_start;
852 *data = (FILE_ALL_INFO *)info.srch_entries_start;
857 cifs_set_fattr_ino(int xid,
858 struct cifs_tcon *tcon,
859 struct super_block *sb,
860 struct inode **inode,
861 const char *full_path,
863 struct cifs_fattr *fattr)
865 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
866 struct TCP_Server_Info *server = tcon->ses->server;
869 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
871 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
873 fattr->cf_uniqueid = iunique(sb, ROOT_I);
878 * If we have an inode pass a NULL tcon to ensure we don't
879 * make a round trip to the server. This only works for SMB2+.
881 rc = server->ops->get_srv_inum(xid,
882 *inode ? NULL : tcon,
888 * If that fails reuse existing ino or generate one
889 * and disable server ones
892 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
894 fattr->cf_uniqueid = iunique(sb, ROOT_I);
895 cifs_autodisable_serverino(cifs_sb);
900 /* If no errors, check for zero root inode (invalid) */
901 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
902 cifs_dbg(FYI, "Invalid (0) inodenum\n");
905 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
907 /* make an ino by hashing the UNC */
908 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
909 fattr->cf_uniqueid = simple_hashstr(tcon->treeName);
914 static inline bool is_inode_cache_good(struct inode *ino)
916 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
920 cifs_get_inode_info(struct inode **inode,
921 const char *full_path,
922 FILE_ALL_INFO *in_data,
923 struct super_block *sb, int xid,
924 const struct cifs_fid *fid)
927 struct cifs_tcon *tcon;
928 struct TCP_Server_Info *server;
929 struct tcon_link *tlink;
930 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
931 bool adjust_tz = false;
932 struct cifs_fattr fattr = {0};
933 bool is_reparse_point = false;
934 FILE_ALL_INFO *data = in_data;
935 FILE_ALL_INFO *tmp_data = NULL;
936 void *smb1_backup_rsp_buf = NULL;
939 __u32 reparse_tag = 0;
941 tlink = cifs_sb_tlink(cifs_sb);
943 return PTR_ERR(tlink);
944 tcon = tlink_tcon(tlink);
945 server = tcon->ses->server;
948 * 1. Fetch file metadata if not provided (data)
952 if (is_inode_cache_good(*inode)) {
953 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
956 tmp_data = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
961 rc = server->ops->query_path_info(xid, tcon, cifs_sb,
963 &adjust_tz, &is_reparse_point);
968 * 2. Convert it to internal cifs metadata (fattr)
974 * If the file is a reparse point, it is more complicated
975 * since we have to check if its reparse tag matches a known
976 * special file type e.g. symlink or fifo or char etc.
978 if ((le32_to_cpu(data->Attributes) & ATTR_REPARSE) &&
979 server->ops->query_reparse_tag) {
980 rc = server->ops->query_reparse_tag(xid, tcon, cifs_sb,
981 full_path, &reparse_tag);
982 cifs_dbg(FYI, "reparse tag 0x%x\n", reparse_tag);
984 cifs_all_info_to_fattr(&fattr, data, sb, adjust_tz,
985 is_reparse_point, reparse_tag);
988 /* DFS link, no metadata available on this server */
989 cifs_create_dfs_fattr(&fattr, sb);
994 * perm errors, try again with backup flags if possible
996 * For SMB2 and later the backup intent flag
997 * is already sent if needed on open and there
998 * is no path based FindFirst operation to use
1001 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
1002 /* for easier reading */
1003 FILE_DIRECTORY_INFO *fdi;
1004 SEARCH_ID_FULL_DIR_INFO *si;
1006 rc = cifs_backup_query_path_info(xid, tcon, sb,
1008 &smb1_backup_rsp_buf,
1013 fdi = (FILE_DIRECTORY_INFO *)data;
1014 si = (SEARCH_ID_FULL_DIR_INFO *)data;
1016 cifs_dir_info_to_fattr(&fattr, fdi, cifs_sb);
1017 fattr.cf_uniqueid = le64_to_cpu(si->UniqueId);
1018 /* uniqueid set, skip get inum step */
1019 goto handle_mnt_opt;
1021 /* nothing we can do, bail out */
1026 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1031 * 3. Get or update inode number (fattr.cf_uniqueid)
1034 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, &fattr);
1037 * 4. Tweak fattr based on mount options
1041 /* query for SFU type info if supported and needed */
1042 if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
1043 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
1044 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
1046 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1049 /* fill in 0777 bits from ACL */
1050 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1051 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, true,
1056 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1060 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1061 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, false,
1066 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1072 /* fill in remaining high mode bits e.g. SUID, VTX */
1073 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1074 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
1076 /* check for Minshall+French symlinks */
1077 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1078 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1081 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1085 * 5. Update inode with final fattr data
1089 *inode = cifs_iget(sb, &fattr);
1093 /* we already have inode, update it */
1095 /* if uniqueid is different, return error */
1096 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1097 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1098 CIFS_I(*inode)->time = 0; /* force reval */
1103 /* if filetype is different, return error */
1104 if (unlikely(((*inode)->i_mode & S_IFMT) !=
1105 (fattr.cf_mode & S_IFMT))) {
1106 CIFS_I(*inode)->time = 0; /* force reval */
1111 cifs_fattr_to_inode(*inode, &fattr);
1114 cifs_buf_release(smb1_backup_rsp_buf);
1115 cifs_put_tlink(tlink);
1121 smb311_posix_get_inode_info(struct inode **inode,
1122 const char *full_path,
1123 struct super_block *sb, unsigned int xid)
1125 struct cifs_tcon *tcon;
1126 struct tcon_link *tlink;
1127 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1128 bool adjust_tz = false;
1129 struct cifs_fattr fattr = {0};
1130 bool symlink = false;
1131 struct smb311_posix_qinfo *data = NULL;
1135 tlink = cifs_sb_tlink(cifs_sb);
1137 return PTR_ERR(tlink);
1138 tcon = tlink_tcon(tlink);
1141 * 1. Fetch file metadata
1144 if (is_inode_cache_good(*inode)) {
1145 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1148 data = kmalloc(sizeof(struct smb311_posix_qinfo), GFP_KERNEL);
1154 rc = smb311_posix_query_path_info(xid, tcon, cifs_sb,
1156 &adjust_tz, &symlink);
1159 * 2. Convert it to internal cifs metadata (fattr)
1164 smb311_posix_info_to_fattr(&fattr, data, sb, adjust_tz, symlink);
1167 /* DFS link, no metadata available on this server */
1168 cifs_create_dfs_fattr(&fattr, sb);
1173 * For SMB2 and later the backup intent flag
1174 * is already sent if needed on open and there
1175 * is no path based FindFirst operation to use
1176 * to retry with so nothing we can do, bail out
1180 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1186 * 3. Tweak fattr based on mount options
1189 /* check for Minshall+French symlinks */
1190 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1191 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1194 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1198 * 4. Update inode with final fattr data
1202 *inode = cifs_iget(sb, &fattr);
1206 /* we already have inode, update it */
1208 /* if uniqueid is different, return error */
1209 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1210 CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1211 CIFS_I(*inode)->time = 0; /* force reval */
1216 /* if filetype is different, return error */
1217 if (unlikely(((*inode)->i_mode & S_IFMT) !=
1218 (fattr.cf_mode & S_IFMT))) {
1219 CIFS_I(*inode)->time = 0; /* force reval */
1224 cifs_fattr_to_inode(*inode, &fattr);
1227 cifs_put_tlink(tlink);
1233 static const struct inode_operations cifs_ipc_inode_ops = {
1234 .lookup = cifs_lookup,
1238 cifs_find_inode(struct inode *inode, void *opaque)
1240 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1242 /* don't match inode with different uniqueid */
1243 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1246 /* use createtime like an i_generation field */
1247 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1250 /* don't match inode of different type */
1251 if ((inode->i_mode & S_IFMT) != (fattr->cf_mode & S_IFMT))
1254 /* if it's not a directory or has no dentries, then flag it */
1255 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1256 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1262 cifs_init_inode(struct inode *inode, void *opaque)
1264 struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1266 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1267 CIFS_I(inode)->createtime = fattr->cf_createtime;
1272 * walk dentry list for an inode and report whether it has aliases that
1273 * are hashed. We use this to determine if a directory inode can actually
1277 inode_has_hashed_dentries(struct inode *inode)
1279 struct dentry *dentry;
1281 spin_lock(&inode->i_lock);
1282 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1283 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1284 spin_unlock(&inode->i_lock);
1288 spin_unlock(&inode->i_lock);
1292 /* Given fattrs, get a corresponding inode */
1294 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1297 struct inode *inode;
1300 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1302 /* hash down to 32-bits on 32-bit arch */
1303 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1305 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1307 /* was there a potentially problematic inode collision? */
1308 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1309 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1311 if (inode_has_hashed_dentries(inode)) {
1312 cifs_autodisable_serverino(CIFS_SB(sb));
1314 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1315 goto retry_iget5_locked;
1319 cifs_fattr_to_inode(inode, fattr);
1320 if (sb->s_flags & SB_NOATIME)
1321 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1322 if (inode->i_state & I_NEW) {
1323 inode->i_ino = hash;
1324 #ifdef CONFIG_CIFS_FSCACHE
1325 /* initialize per-inode cache cookie pointer */
1326 CIFS_I(inode)->fscache = NULL;
1328 unlock_new_inode(inode);
1335 /* gets root inode */
1336 struct inode *cifs_root_iget(struct super_block *sb)
1339 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1340 struct inode *inode = NULL;
1342 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1346 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1347 && cifs_sb->prepath) {
1348 len = strlen(cifs_sb->prepath);
1349 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1351 return ERR_PTR(-ENOMEM);
1353 memcpy(path+1, cifs_sb->prepath, len);
1355 path = kstrdup("", GFP_KERNEL);
1357 return ERR_PTR(-ENOMEM);
1361 if (tcon->unix_ext) {
1362 rc = cifs_get_inode_info_unix(&inode, path, sb, xid);
1363 /* some servers mistakenly claim POSIX support */
1364 if (rc != -EOPNOTSUPP)
1366 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1367 tcon->unix_ext = false;
1370 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1371 if (tcon->posix_extensions)
1372 rc = smb311_posix_get_inode_info(&inode, path, sb, xid);
1374 rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL);
1378 inode = ERR_PTR(rc);
1382 #ifdef CONFIG_CIFS_FSCACHE
1383 /* populate tcon->resource_id */
1384 tcon->resource_id = CIFS_I(inode)->uniqueid;
1387 if (rc && tcon->pipe) {
1388 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1389 spin_lock(&inode->i_lock);
1390 inode->i_mode |= S_IFDIR;
1391 set_nlink(inode, 2);
1392 inode->i_op = &cifs_ipc_inode_ops;
1393 inode->i_fop = &simple_dir_operations;
1394 inode->i_uid = cifs_sb->ctx->linux_uid;
1395 inode->i_gid = cifs_sb->ctx->linux_gid;
1396 spin_unlock(&inode->i_lock);
1399 inode = ERR_PTR(rc);
1409 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1410 const char *full_path, __u32 dosattr)
1412 bool set_time = false;
1413 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1414 struct TCP_Server_Info *server;
1415 FILE_BASIC_INFO info_buf;
1420 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1421 if (!server->ops->set_file_info)
1426 if (attrs->ia_valid & ATTR_ATIME) {
1428 info_buf.LastAccessTime =
1429 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1431 info_buf.LastAccessTime = 0;
1433 if (attrs->ia_valid & ATTR_MTIME) {
1435 info_buf.LastWriteTime =
1436 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1438 info_buf.LastWriteTime = 0;
1441 * Samba throws this field away, but windows may actually use it.
1442 * Do not set ctime unless other time stamps are changed explicitly
1443 * (i.e. by utimes()) since we would then have a mix of client and
1446 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1447 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1448 info_buf.ChangeTime =
1449 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1451 info_buf.ChangeTime = 0;
1453 info_buf.CreationTime = 0; /* don't change */
1454 info_buf.Attributes = cpu_to_le32(dosattr);
1456 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1460 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1461 * and rename it to a random name that hopefully won't conflict with
1465 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1466 const unsigned int xid)
1470 struct cifs_fid fid;
1471 struct cifs_open_parms oparms;
1472 struct inode *inode = d_inode(dentry);
1473 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1474 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1475 struct tcon_link *tlink;
1476 struct cifs_tcon *tcon;
1477 __u32 dosattr, origattr;
1478 FILE_BASIC_INFO *info_buf = NULL;
1480 tlink = cifs_sb_tlink(cifs_sb);
1482 return PTR_ERR(tlink);
1483 tcon = tlink_tcon(tlink);
1486 * We cannot rename the file if the server doesn't support
1487 * CAP_INFOLEVEL_PASSTHRU
1489 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1495 oparms.cifs_sb = cifs_sb;
1496 oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
1497 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
1498 oparms.disposition = FILE_OPEN;
1499 oparms.path = full_path;
1501 oparms.reconnect = false;
1503 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1507 origattr = cifsInode->cifsAttrs;
1509 origattr |= ATTR_NORMAL;
1511 dosattr = origattr & ~ATTR_READONLY;
1513 dosattr |= ATTR_NORMAL;
1514 dosattr |= ATTR_HIDDEN;
1516 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1517 if (dosattr != origattr) {
1518 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1519 if (info_buf == NULL) {
1523 info_buf->Attributes = cpu_to_le32(dosattr);
1524 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1526 /* although we would like to mark the file hidden
1527 if that fails we will still try to rename it */
1529 cifsInode->cifsAttrs = dosattr;
1531 dosattr = origattr; /* since not able to change them */
1534 /* rename the file */
1535 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1537 cifs_remap(cifs_sb));
1543 /* try to set DELETE_ON_CLOSE */
1544 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1545 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1548 * some samba versions return -ENOENT when we try to set the
1549 * file disposition here. Likely a samba bug, but work around
1550 * it for now. This means that some cifsXXX files may hang
1551 * around after they shouldn't.
1553 * BB: remove this hack after more servers have the fix
1561 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1565 CIFSSMBClose(xid, tcon, fid.netfid);
1568 cifs_put_tlink(tlink);
1572 * reset everything back to the original state. Don't bother
1573 * dealing with errors here since we can't do anything about
1577 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1578 cifs_sb->local_nls, cifs_remap(cifs_sb));
1580 if (dosattr != origattr) {
1581 info_buf->Attributes = cpu_to_le32(origattr);
1582 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1584 cifsInode->cifsAttrs = origattr;
1590 /* copied from fs/nfs/dir.c with small changes */
1592 cifs_drop_nlink(struct inode *inode)
1594 spin_lock(&inode->i_lock);
1595 if (inode->i_nlink > 0)
1597 spin_unlock(&inode->i_lock);
1601 * If d_inode(dentry) is null (usually meaning the cached dentry
1602 * is a negative dentry) then we would attempt a standard SMB delete, but
1603 * if that fails we can not attempt the fall back mechanisms on EACCES
1604 * but will return the EACCES to the caller. Note that the VFS does not call
1605 * unlink on negative dentries currently.
1607 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1611 const char *full_path;
1613 struct inode *inode = d_inode(dentry);
1614 struct cifsInodeInfo *cifs_inode;
1615 struct super_block *sb = dir->i_sb;
1616 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1617 struct tcon_link *tlink;
1618 struct cifs_tcon *tcon;
1619 struct TCP_Server_Info *server;
1620 struct iattr *attrs = NULL;
1621 __u32 dosattr = 0, origattr = 0;
1623 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1625 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1628 tlink = cifs_sb_tlink(cifs_sb);
1630 return PTR_ERR(tlink);
1631 tcon = tlink_tcon(tlink);
1632 server = tcon->ses->server;
1635 page = alloc_dentry_path();
1637 if (tcon->nodelete) {
1642 /* Unlink can be called from rename so we can not take the
1643 * sb->s_vfs_rename_mutex here */
1644 full_path = build_path_from_dentry(dentry, page);
1645 if (IS_ERR(full_path)) {
1646 rc = PTR_ERR(full_path);
1650 cifs_close_all_deferred_files(tcon);
1651 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1652 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1653 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1654 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1655 cifs_remap(cifs_sb));
1656 cifs_dbg(FYI, "posix del rc %d\n", rc);
1657 if ((rc == 0) || (rc == -ENOENT))
1658 goto psx_del_no_retry;
1662 if (!server->ops->unlink) {
1664 goto psx_del_no_retry;
1667 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1672 cifs_drop_nlink(inode);
1673 } else if (rc == -ENOENT) {
1675 } else if (rc == -EBUSY) {
1676 if (server->ops->rename_pending_delete) {
1677 rc = server->ops->rename_pending_delete(full_path,
1680 cifs_drop_nlink(inode);
1682 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1683 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1684 if (attrs == NULL) {
1689 /* try to reset dos attributes */
1690 cifs_inode = CIFS_I(inode);
1691 origattr = cifs_inode->cifsAttrs;
1693 origattr |= ATTR_NORMAL;
1694 dosattr = origattr & ~ATTR_READONLY;
1696 dosattr |= ATTR_NORMAL;
1697 dosattr |= ATTR_HIDDEN;
1699 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1703 goto retry_std_delete;
1706 /* undo the setattr if we errored out and it's needed */
1707 if (rc != 0 && dosattr != 0)
1708 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1712 cifs_inode = CIFS_I(inode);
1713 cifs_inode->time = 0; /* will force revalidate to get info
1715 inode->i_ctime = current_time(inode);
1717 dir->i_ctime = dir->i_mtime = current_time(dir);
1718 cifs_inode = CIFS_I(dir);
1719 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1721 free_dentry_path(page);
1724 cifs_put_tlink(tlink);
1729 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1730 const char *full_path, struct cifs_sb_info *cifs_sb,
1731 struct cifs_tcon *tcon, const unsigned int xid)
1734 struct inode *inode = NULL;
1736 if (tcon->posix_extensions)
1737 rc = smb311_posix_get_inode_info(&inode, full_path, parent->i_sb, xid);
1738 else if (tcon->unix_ext)
1739 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1742 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1749 * setting nlink not necessary except in cases where we failed to get it
1750 * from the server or was set bogus. Also, since this is a brand new
1751 * inode, no need to grab the i_lock before setting the i_nlink.
1753 if (inode->i_nlink < 2)
1754 set_nlink(inode, 2);
1755 mode &= ~current_umask();
1756 /* must turn on setgid bit if parent dir has it */
1757 if (parent->i_mode & S_ISGID)
1760 if (tcon->unix_ext) {
1761 struct cifs_unix_set_info_args args = {
1763 .ctime = NO_CHANGE_64,
1764 .atime = NO_CHANGE_64,
1765 .mtime = NO_CHANGE_64,
1768 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1769 args.uid = current_fsuid();
1770 if (parent->i_mode & S_ISGID)
1771 args.gid = parent->i_gid;
1773 args.gid = current_fsgid();
1775 args.uid = INVALID_UID; /* no change */
1776 args.gid = INVALID_GID; /* no change */
1778 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1780 cifs_remap(cifs_sb));
1782 struct TCP_Server_Info *server = tcon->ses->server;
1783 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1784 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1785 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1787 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1788 inode->i_mode = (mode | S_IFDIR);
1790 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1791 inode->i_uid = current_fsuid();
1792 if (inode->i_mode & S_ISGID)
1793 inode->i_gid = parent->i_gid;
1795 inode->i_gid = current_fsgid();
1798 d_instantiate(dentry, inode);
1803 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1804 const char *full_path, struct cifs_sb_info *cifs_sb,
1805 struct cifs_tcon *tcon, const unsigned int xid)
1809 FILE_UNIX_BASIC_INFO *info = NULL;
1810 struct inode *newinode = NULL;
1811 struct cifs_fattr fattr;
1813 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1816 goto posix_mkdir_out;
1819 mode &= ~current_umask();
1820 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1821 NULL /* netfid */, info, &oplock, full_path,
1822 cifs_sb->local_nls, cifs_remap(cifs_sb));
1823 if (rc == -EOPNOTSUPP)
1824 goto posix_mkdir_out;
1826 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1828 goto posix_mkdir_out;
1831 if (info->Type == cpu_to_le32(-1))
1832 /* no return info, go query for it */
1833 goto posix_mkdir_get_info;
1835 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1836 * need to set uid/gid.
1839 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1840 cifs_fill_uniqueid(inode->i_sb, &fattr);
1841 newinode = cifs_iget(inode->i_sb, &fattr);
1843 goto posix_mkdir_get_info;
1845 d_instantiate(dentry, newinode);
1847 #ifdef CONFIG_CIFS_DEBUG2
1848 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1849 dentry, dentry, newinode);
1851 if (newinode->i_nlink != 2)
1852 cifs_dbg(FYI, "unexpected number of links %d\n",
1859 posix_mkdir_get_info:
1860 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1862 goto posix_mkdir_out;
1865 int cifs_mkdir(struct user_namespace *mnt_userns, struct inode *inode,
1866 struct dentry *direntry, umode_t mode)
1870 struct cifs_sb_info *cifs_sb;
1871 struct tcon_link *tlink;
1872 struct cifs_tcon *tcon;
1873 struct TCP_Server_Info *server;
1874 const char *full_path;
1877 cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
1880 cifs_sb = CIFS_SB(inode->i_sb);
1881 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1883 tlink = cifs_sb_tlink(cifs_sb);
1885 return PTR_ERR(tlink);
1886 tcon = tlink_tcon(tlink);
1890 page = alloc_dentry_path();
1891 full_path = build_path_from_dentry(direntry, page);
1892 if (IS_ERR(full_path)) {
1893 rc = PTR_ERR(full_path);
1897 server = tcon->ses->server;
1899 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
1900 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
1902 d_drop(direntry); /* for time being always refresh inode info */
1906 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1907 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1908 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1910 if (rc != -EOPNOTSUPP)
1914 if (!server->ops->mkdir) {
1919 /* BB add setting the equivalent of mode via CreateX w/ACLs */
1920 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
1922 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1927 /* TODO: skip this for smb2/smb3 */
1928 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1932 * Force revalidate to get parent dir info when needed since cached
1933 * attributes are invalid now.
1935 CIFS_I(inode)->time = 0;
1936 free_dentry_path(page);
1938 cifs_put_tlink(tlink);
1942 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1946 struct cifs_sb_info *cifs_sb;
1947 struct tcon_link *tlink;
1948 struct cifs_tcon *tcon;
1949 struct TCP_Server_Info *server;
1950 const char *full_path;
1951 void *page = alloc_dentry_path();
1952 struct cifsInodeInfo *cifsInode;
1954 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
1958 full_path = build_path_from_dentry(direntry, page);
1959 if (IS_ERR(full_path)) {
1960 rc = PTR_ERR(full_path);
1964 cifs_sb = CIFS_SB(inode->i_sb);
1965 if (unlikely(cifs_forced_shutdown(cifs_sb))) {
1970 tlink = cifs_sb_tlink(cifs_sb);
1971 if (IS_ERR(tlink)) {
1972 rc = PTR_ERR(tlink);
1975 tcon = tlink_tcon(tlink);
1976 server = tcon->ses->server;
1978 if (!server->ops->rmdir) {
1980 cifs_put_tlink(tlink);
1984 if (tcon->nodelete) {
1986 cifs_put_tlink(tlink);
1990 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
1991 cifs_put_tlink(tlink);
1994 spin_lock(&d_inode(direntry)->i_lock);
1995 i_size_write(d_inode(direntry), 0);
1996 clear_nlink(d_inode(direntry));
1997 spin_unlock(&d_inode(direntry)->i_lock);
2000 cifsInode = CIFS_I(d_inode(direntry));
2001 /* force revalidate to go get info when needed */
2002 cifsInode->time = 0;
2004 cifsInode = CIFS_I(inode);
2006 * Force revalidate to get parent dir info when needed since cached
2007 * attributes are invalid now.
2009 cifsInode->time = 0;
2011 d_inode(direntry)->i_ctime = inode->i_ctime = inode->i_mtime =
2012 current_time(inode);
2015 free_dentry_path(page);
2021 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2022 const char *from_path, struct dentry *to_dentry,
2023 const char *to_path)
2025 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2026 struct tcon_link *tlink;
2027 struct cifs_tcon *tcon;
2028 struct TCP_Server_Info *server;
2029 struct cifs_fid fid;
2030 struct cifs_open_parms oparms;
2033 tlink = cifs_sb_tlink(cifs_sb);
2035 return PTR_ERR(tlink);
2036 tcon = tlink_tcon(tlink);
2037 server = tcon->ses->server;
2039 if (!server->ops->rename)
2042 /* try path-based rename first */
2043 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
2046 * Don't bother with rename by filehandle unless file is busy and
2047 * source. Note that cross directory moves do not work with
2048 * rename by filehandle to various Windows servers.
2050 if (rc == 0 || rc != -EBUSY)
2051 goto do_rename_exit;
2053 /* Don't fall back to using SMB on SMB 2+ mount */
2054 if (server->vals->protocol_id != 0)
2055 goto do_rename_exit;
2057 /* open-file renames don't work across directories */
2058 if (to_dentry->d_parent != from_dentry->d_parent)
2059 goto do_rename_exit;
2062 oparms.cifs_sb = cifs_sb;
2063 /* open the file to be renamed -- we need DELETE perms */
2064 oparms.desired_access = DELETE;
2065 oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
2066 oparms.disposition = FILE_OPEN;
2067 oparms.path = from_path;
2069 oparms.reconnect = false;
2071 rc = CIFS_open(xid, &oparms, &oplock, NULL);
2073 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2074 (const char *) to_dentry->d_name.name,
2075 cifs_sb->local_nls, cifs_remap(cifs_sb));
2076 CIFSSMBClose(xid, tcon, fid.netfid);
2080 d_move(from_dentry, to_dentry);
2081 cifs_put_tlink(tlink);
2086 cifs_rename2(struct user_namespace *mnt_userns, struct inode *source_dir,
2087 struct dentry *source_dentry, struct inode *target_dir,
2088 struct dentry *target_dentry, unsigned int flags)
2090 const char *from_name, *to_name;
2091 void *page1, *page2;
2092 struct cifs_sb_info *cifs_sb;
2093 struct tcon_link *tlink;
2094 struct cifs_tcon *tcon;
2095 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2096 FILE_UNIX_BASIC_INFO *info_buf_target;
2100 if (flags & ~RENAME_NOREPLACE)
2103 cifs_sb = CIFS_SB(source_dir->i_sb);
2104 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2107 tlink = cifs_sb_tlink(cifs_sb);
2109 return PTR_ERR(tlink);
2110 tcon = tlink_tcon(tlink);
2112 page1 = alloc_dentry_path();
2113 page2 = alloc_dentry_path();
2116 from_name = build_path_from_dentry(source_dentry, page1);
2117 if (IS_ERR(from_name)) {
2118 rc = PTR_ERR(from_name);
2119 goto cifs_rename_exit;
2122 to_name = build_path_from_dentry(target_dentry, page2);
2123 if (IS_ERR(to_name)) {
2124 rc = PTR_ERR(to_name);
2125 goto cifs_rename_exit;
2128 cifs_close_all_deferred_files(tcon);
2129 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2133 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2135 if (flags & RENAME_NOREPLACE)
2136 goto cifs_rename_exit;
2138 if (rc == -EEXIST && tcon->unix_ext) {
2140 * Are src and dst hardlinks of same inode? We can only tell
2141 * with unix extensions enabled.
2144 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2146 if (info_buf_source == NULL) {
2148 goto cifs_rename_exit;
2151 info_buf_target = info_buf_source + 1;
2152 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2155 cifs_remap(cifs_sb));
2159 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2162 cifs_remap(cifs_sb));
2164 if (tmprc == 0 && (info_buf_source->UniqueId ==
2165 info_buf_target->UniqueId)) {
2166 /* same file, POSIX says that this is a noop */
2168 goto cifs_rename_exit;
2172 * else ... BB we could add the same check for Windows by
2173 * checking the UniqueId via FILE_INTERNAL_INFO
2177 /* Try unlinking the target dentry if it's not negative */
2178 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2179 if (d_is_dir(target_dentry))
2180 tmprc = cifs_rmdir(target_dir, target_dentry);
2182 tmprc = cifs_unlink(target_dir, target_dentry);
2184 goto cifs_rename_exit;
2185 rc = cifs_do_rename(xid, source_dentry, from_name,
2186 target_dentry, to_name);
2189 /* force revalidate to go get info when needed */
2190 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2192 source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
2193 target_dir->i_mtime = current_time(source_dir);
2196 kfree(info_buf_source);
2197 free_dentry_path(page2);
2198 free_dentry_path(page1);
2200 cifs_put_tlink(tlink);
2205 cifs_dentry_needs_reval(struct dentry *dentry)
2207 struct inode *inode = d_inode(dentry);
2208 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2209 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2210 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2211 struct cached_fid *cfid = NULL;
2213 if (cifs_i->time == 0)
2216 if (CIFS_CACHE_READ(cifs_i))
2219 if (!lookupCacheEnabled)
2222 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2223 mutex_lock(&cfid->fid_mutex);
2224 if (cfid->time && cifs_i->time > cfid->time) {
2225 mutex_unlock(&cfid->fid_mutex);
2226 close_cached_dir(cfid);
2229 mutex_unlock(&cfid->fid_mutex);
2230 close_cached_dir(cfid);
2233 * depending on inode type, check if attribute caching disabled for
2234 * files or directories
2236 if (S_ISDIR(inode->i_mode)) {
2237 if (!cifs_sb->ctx->acdirmax)
2239 if (!time_in_range(jiffies, cifs_i->time,
2240 cifs_i->time + cifs_sb->ctx->acdirmax))
2243 if (!cifs_sb->ctx->acregmax)
2245 if (!time_in_range(jiffies, cifs_i->time,
2246 cifs_i->time + cifs_sb->ctx->acregmax))
2250 /* hardlinked files w/ noserverino get "special" treatment */
2251 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2252 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2259 * Zap the cache. Called when invalid_mapping flag is set.
2262 cifs_invalidate_mapping(struct inode *inode)
2266 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2267 rc = invalidate_inode_pages2(inode->i_mapping);
2269 cifs_dbg(VFS, "%s: Could not invalidate inode %p\n",
2273 cifs_fscache_reset_inode_cookie(inode);
2278 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2280 * @key: currently unused
2281 * @mode: the task state to sleep in
2284 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2286 freezable_schedule_unsafe();
2287 if (signal_pending_state(mode, current))
2288 return -ERESTARTSYS;
2293 cifs_revalidate_mapping(struct inode *inode)
2296 unsigned long *flags = &CIFS_I(inode)->flags;
2298 /* swapfiles are not supposed to be shared */
2299 if (IS_SWAPFILE(inode))
2302 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2307 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2308 rc = cifs_invalidate_mapping(inode);
2310 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2313 clear_bit_unlock(CIFS_INO_LOCK, flags);
2314 smp_mb__after_atomic();
2315 wake_up_bit(flags, CIFS_INO_LOCK);
2321 cifs_zap_mapping(struct inode *inode)
2323 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2324 return cifs_revalidate_mapping(inode);
2327 int cifs_revalidate_file_attr(struct file *filp)
2330 struct dentry *dentry = file_dentry(filp);
2331 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2333 if (!cifs_dentry_needs_reval(dentry))
2336 if (tlink_tcon(cfile->tlink)->unix_ext)
2337 rc = cifs_get_file_info_unix(filp);
2339 rc = cifs_get_file_info(filp);
2344 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2348 struct inode *inode = d_inode(dentry);
2349 struct super_block *sb = dentry->d_sb;
2350 const char *full_path;
2357 if (!cifs_dentry_needs_reval(dentry))
2362 page = alloc_dentry_path();
2363 full_path = build_path_from_dentry(dentry, page);
2364 if (IS_ERR(full_path)) {
2365 rc = PTR_ERR(full_path);
2369 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2370 full_path, inode, inode->i_count.counter,
2371 dentry, cifs_get_time(dentry), jiffies);
2374 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2375 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2376 else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2377 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2379 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2381 if (rc == -EAGAIN && count++ < 10)
2384 free_dentry_path(page);
2390 int cifs_revalidate_file(struct file *filp)
2393 struct inode *inode = file_inode(filp);
2395 rc = cifs_revalidate_file_attr(filp);
2399 return cifs_revalidate_mapping(inode);
2402 /* revalidate a dentry's inode attributes */
2403 int cifs_revalidate_dentry(struct dentry *dentry)
2406 struct inode *inode = d_inode(dentry);
2408 rc = cifs_revalidate_dentry_attr(dentry);
2412 return cifs_revalidate_mapping(inode);
2415 int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
2416 struct kstat *stat, u32 request_mask, unsigned int flags)
2418 struct dentry *dentry = path->dentry;
2419 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2420 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2421 struct inode *inode = d_inode(dentry);
2424 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2428 * We need to be sure that all dirty pages are written and the server
2429 * has actual ctime, mtime and file length.
2431 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2432 !CIFS_CACHE_READ(CIFS_I(inode)) &&
2433 inode->i_mapping && inode->i_mapping->nrpages != 0) {
2434 rc = filemap_fdatawait(inode->i_mapping);
2436 mapping_set_error(inode->i_mapping, rc);
2441 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2442 CIFS_I(inode)->time = 0; /* force revalidate */
2445 * If the caller doesn't require syncing, only sync if
2446 * necessary (e.g. due to earlier truncate or setattr
2447 * invalidating the cached metadata)
2449 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2450 (CIFS_I(inode)->time == 0)) {
2451 rc = cifs_revalidate_dentry_attr(dentry);
2456 generic_fillattr(&init_user_ns, inode, stat);
2457 stat->blksize = cifs_sb->ctx->bsize;
2458 stat->ino = CIFS_I(inode)->uniqueid;
2460 /* old CIFS Unix Extensions doesn't return create time */
2461 if (CIFS_I(inode)->createtime) {
2462 stat->result_mask |= STATX_BTIME;
2464 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2467 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2468 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2469 stat->attributes |= STATX_ATTR_COMPRESSED;
2470 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2471 stat->attributes |= STATX_ATTR_ENCRYPTED;
2474 * If on a multiuser mount without unix extensions or cifsacl being
2475 * enabled, and the admin hasn't overridden them, set the ownership
2476 * to the fsuid/fsgid of the current process.
2478 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2479 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2481 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2482 stat->uid = current_fsuid();
2483 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2484 stat->gid = current_fsgid();
2489 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2492 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2493 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->vfs_inode.i_sb);
2494 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2495 struct TCP_Server_Info *server = tcon->ses->server;
2496 struct cifsFileInfo *cfile;
2499 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2503 * We need to be sure that all dirty pages are written as they
2504 * might fill holes on the server.
2506 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2507 inode->i_mapping->nrpages != 0) {
2508 rc = filemap_fdatawait(inode->i_mapping);
2510 mapping_set_error(inode->i_mapping, rc);
2515 cfile = find_readable_file(cifs_i, false);
2519 if (server->ops->fiemap) {
2520 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2521 cifsFileInfo_put(cfile);
2525 cifsFileInfo_put(cfile);
2529 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2531 pgoff_t index = from >> PAGE_SHIFT;
2532 unsigned offset = from & (PAGE_SIZE - 1);
2536 page = grab_cache_page(mapping, index);
2540 zero_user_segment(page, offset, PAGE_SIZE);
2546 void cifs_setsize(struct inode *inode, loff_t offset)
2548 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2550 spin_lock(&inode->i_lock);
2551 i_size_write(inode, offset);
2552 spin_unlock(&inode->i_lock);
2554 /* Cached inode must be refreshed on truncate */
2556 truncate_pagecache(inode, offset);
2560 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2561 unsigned int xid, const char *full_path)
2564 struct cifsFileInfo *open_file;
2565 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2566 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2567 struct tcon_link *tlink = NULL;
2568 struct cifs_tcon *tcon = NULL;
2569 struct TCP_Server_Info *server;
2572 * To avoid spurious oplock breaks from server, in the case of
2573 * inodes that we already have open, avoid doing path based
2574 * setting of file size if we can do it by handle.
2575 * This keeps our caching token (oplock) and avoids timeouts
2576 * when the local oplock break takes longer to flush
2577 * writebehind data than the SMB timeout for the SetPathInfo
2578 * request would allow
2580 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2582 tcon = tlink_tcon(open_file->tlink);
2583 server = tcon->ses->server;
2584 if (server->ops->set_file_size)
2585 rc = server->ops->set_file_size(xid, tcon, open_file,
2586 attrs->ia_size, false);
2589 cifsFileInfo_put(open_file);
2590 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2598 tlink = cifs_sb_tlink(cifs_sb);
2600 return PTR_ERR(tlink);
2601 tcon = tlink_tcon(tlink);
2602 server = tcon->ses->server;
2606 * Set file size by pathname rather than by handle either because no
2607 * valid, writeable file handle for it was found or because there was
2608 * an error setting it by handle.
2610 if (server->ops->set_path_size)
2611 rc = server->ops->set_path_size(xid, tcon, full_path,
2612 attrs->ia_size, cifs_sb, false);
2615 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2618 cifs_put_tlink(tlink);
2622 cifsInode->server_eof = attrs->ia_size;
2623 cifs_setsize(inode, attrs->ia_size);
2625 * i_blocks is not related to (i_size / i_blksize), but instead
2626 * 512 byte (2**9) size is required for calculating num blocks.
2627 * Until we can query the server for actual allocation size,
2628 * this is best estimate we have for blocks allocated for a file
2629 * Number of blocks must be rounded up so size 1 is not 0 blocks
2631 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2634 * The man page of truncate says if the size changed,
2635 * then the st_ctime and st_mtime fields for the file
2638 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2639 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2641 cifs_truncate_page(inode->i_mapping, inode->i_size);
2648 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2652 const char *full_path;
2653 void *page = alloc_dentry_path();
2654 struct inode *inode = d_inode(direntry);
2655 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2656 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2657 struct tcon_link *tlink;
2658 struct cifs_tcon *pTcon;
2659 struct cifs_unix_set_info_args *args = NULL;
2660 struct cifsFileInfo *open_file;
2662 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2663 direntry, attrs->ia_valid);
2667 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2668 attrs->ia_valid |= ATTR_FORCE;
2670 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2674 full_path = build_path_from_dentry(direntry, page);
2675 if (IS_ERR(full_path)) {
2676 rc = PTR_ERR(full_path);
2681 * Attempt to flush data before changing attributes. We need to do
2682 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2683 * ownership or mode then we may also need to do this. Here, we take
2684 * the safe way out and just do the flush on all setattr requests. If
2685 * the flush returns error, store it to report later and continue.
2687 * BB: This should be smarter. Why bother flushing pages that
2688 * will be truncated anyway? Also, should we error out here if
2689 * the flush returns error?
2691 rc = filemap_write_and_wait(inode->i_mapping);
2692 if (is_interrupt_error(rc)) {
2697 mapping_set_error(inode->i_mapping, rc);
2700 if (attrs->ia_valid & ATTR_SIZE) {
2701 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2706 /* skip mode change if it's just for clearing setuid/setgid */
2707 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2708 attrs->ia_valid &= ~ATTR_MODE;
2710 args = kmalloc(sizeof(*args), GFP_KERNEL);
2716 /* set up the struct */
2717 if (attrs->ia_valid & ATTR_MODE)
2718 args->mode = attrs->ia_mode;
2720 args->mode = NO_CHANGE_64;
2722 if (attrs->ia_valid & ATTR_UID)
2723 args->uid = attrs->ia_uid;
2725 args->uid = INVALID_UID; /* no change */
2727 if (attrs->ia_valid & ATTR_GID)
2728 args->gid = attrs->ia_gid;
2730 args->gid = INVALID_GID; /* no change */
2732 if (attrs->ia_valid & ATTR_ATIME)
2733 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2735 args->atime = NO_CHANGE_64;
2737 if (attrs->ia_valid & ATTR_MTIME)
2738 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2740 args->mtime = NO_CHANGE_64;
2742 if (attrs->ia_valid & ATTR_CTIME)
2743 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2745 args->ctime = NO_CHANGE_64;
2748 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2750 u16 nfid = open_file->fid.netfid;
2751 u32 npid = open_file->pid;
2752 pTcon = tlink_tcon(open_file->tlink);
2753 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2754 cifsFileInfo_put(open_file);
2756 tlink = cifs_sb_tlink(cifs_sb);
2757 if (IS_ERR(tlink)) {
2758 rc = PTR_ERR(tlink);
2761 pTcon = tlink_tcon(tlink);
2762 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2764 cifs_remap(cifs_sb));
2765 cifs_put_tlink(tlink);
2771 if ((attrs->ia_valid & ATTR_SIZE) &&
2772 attrs->ia_size != i_size_read(inode))
2773 truncate_setsize(inode, attrs->ia_size);
2775 setattr_copy(&init_user_ns, inode, attrs);
2776 mark_inode_dirty(inode);
2778 /* force revalidate when any of these times are set since some
2779 of the fs types (eg ext3, fat) do not have fine enough
2780 time granularity to match protocol, and we do not have a
2781 a way (yet) to query the server fs's time granularity (and
2782 whether it rounds times down).
2784 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2785 cifsInode->time = 0;
2788 free_dentry_path(page);
2794 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2797 kuid_t uid = INVALID_UID;
2798 kgid_t gid = INVALID_GID;
2799 struct inode *inode = d_inode(direntry);
2800 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2801 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2802 struct cifsFileInfo *wfile;
2803 struct cifs_tcon *tcon;
2804 const char *full_path;
2805 void *page = alloc_dentry_path();
2808 __u64 mode = NO_CHANGE_64;
2812 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2813 direntry, attrs->ia_valid);
2815 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2816 attrs->ia_valid |= ATTR_FORCE;
2818 rc = setattr_prepare(&init_user_ns, direntry, attrs);
2820 goto cifs_setattr_exit;
2822 full_path = build_path_from_dentry(direntry, page);
2823 if (IS_ERR(full_path)) {
2824 rc = PTR_ERR(full_path);
2825 goto cifs_setattr_exit;
2829 * Attempt to flush data before changing attributes. We need to do
2830 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
2831 * returns error, store it to report later and continue.
2833 * BB: This should be smarter. Why bother flushing pages that
2834 * will be truncated anyway? Also, should we error out here if
2835 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
2837 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
2838 rc = filemap_write_and_wait(inode->i_mapping);
2839 if (is_interrupt_error(rc)) {
2841 goto cifs_setattr_exit;
2843 mapping_set_error(inode->i_mapping, rc);
2848 if ((attrs->ia_valid & ATTR_MTIME) &&
2849 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2850 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
2852 tcon = tlink_tcon(wfile->tlink);
2853 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
2854 cifsFileInfo_put(wfile);
2856 goto cifs_setattr_exit;
2857 } else if (rc != -EBADF)
2858 goto cifs_setattr_exit;
2863 if (attrs->ia_valid & ATTR_SIZE) {
2864 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2866 goto cifs_setattr_exit;
2869 if (attrs->ia_valid & ATTR_UID)
2870 uid = attrs->ia_uid;
2872 if (attrs->ia_valid & ATTR_GID)
2873 gid = attrs->ia_gid;
2875 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2876 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2877 if (uid_valid(uid) || gid_valid(gid)) {
2878 mode = NO_CHANGE_64;
2879 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2882 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2884 goto cifs_setattr_exit;
2888 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2889 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2891 /* skip mode change if it's just for clearing setuid/setgid */
2892 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2893 attrs->ia_valid &= ~ATTR_MODE;
2895 if (attrs->ia_valid & ATTR_MODE) {
2896 mode = attrs->ia_mode;
2898 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2899 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2900 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2901 INVALID_UID, INVALID_GID);
2903 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2905 goto cifs_setattr_exit;
2909 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
2910 * Pick up the actual mode bits that were set.
2912 if (mode != attrs->ia_mode)
2913 attrs->ia_mode = mode;
2915 if (((mode & S_IWUGO) == 0) &&
2916 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
2918 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2920 /* fix up mode if we're not using dynperm */
2921 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2922 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2923 } else if ((mode & S_IWUGO) &&
2924 (cifsInode->cifsAttrs & ATTR_READONLY)) {
2926 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2927 /* Attributes of 0 are ignored */
2929 dosattr |= ATTR_NORMAL;
2931 /* reset local inode permissions to normal */
2932 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2933 attrs->ia_mode &= ~(S_IALLUGO);
2934 if (S_ISDIR(inode->i_mode))
2936 cifs_sb->ctx->dir_mode;
2939 cifs_sb->ctx->file_mode;
2941 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2942 /* ignore mode change - ATTR_READONLY hasn't changed */
2943 attrs->ia_valid &= ~ATTR_MODE;
2947 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2948 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2949 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2950 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2952 /* Even if error on time set, no sense failing the call if
2953 the server would set the time to a reasonable value anyway,
2954 and this check ensures that we are not being called from
2955 sys_utimes in which case we ought to fail the call back to
2956 the user when the server rejects the call */
2957 if ((rc) && (attrs->ia_valid &
2958 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
2962 /* do not need local check to inode_check_ok since the server does
2965 goto cifs_setattr_exit;
2967 if ((attrs->ia_valid & ATTR_SIZE) &&
2968 attrs->ia_size != i_size_read(inode))
2969 truncate_setsize(inode, attrs->ia_size);
2971 setattr_copy(&init_user_ns, inode, attrs);
2972 mark_inode_dirty(inode);
2976 free_dentry_path(page);
2981 cifs_setattr(struct user_namespace *mnt_userns, struct dentry *direntry,
2982 struct iattr *attrs)
2984 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
2985 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
2986 int rc, retries = 0;
2988 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2992 if (pTcon->unix_ext)
2993 rc = cifs_setattr_unix(direntry, attrs);
2995 rc = cifs_setattr_nounix(direntry, attrs);
2997 } while (is_retryable_error(rc) && retries < 2);
2999 /* BB: add cifs_setattr_legacy for really old servers */