GNU Linux-libre 5.15.137-gnu
[releases.git] / fs / cifs / inode.c
1 // SPDX-License-Identifier: LGPL-2.1
2 /*
3  *
4  *   Copyright (C) International Business Machines  Corp., 2002,2010
5  *   Author(s): Steve French (sfrench@us.ibm.com)
6  *
7  */
8 #include <linux/fs.h>
9 #include <linux/stat.h>
10 #include <linux/slab.h>
11 #include <linux/pagemap.h>
12 #include <linux/freezer.h>
13 #include <linux/sched/signal.h>
14 #include <linux/wait_bit.h>
15 #include <linux/fiemap.h>
16 #include <asm/div64.h>
17 #include "cifsfs.h"
18 #include "cifspdu.h"
19 #include "cifsglob.h"
20 #include "cifsproto.h"
21 #include "smb2proto.h"
22 #include "cifs_debug.h"
23 #include "cifs_fs_sb.h"
24 #include "cifs_unicode.h"
25 #include "fscache.h"
26 #include "fs_context.h"
27 #include "cifs_ioctl.h"
28
29 static void cifs_set_ops(struct inode *inode)
30 {
31         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
32
33         switch (inode->i_mode & S_IFMT) {
34         case S_IFREG:
35                 inode->i_op = &cifs_file_inode_ops;
36                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
37                         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
38                                 inode->i_fop = &cifs_file_direct_nobrl_ops;
39                         else
40                                 inode->i_fop = &cifs_file_direct_ops;
41                 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
42                         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
43                                 inode->i_fop = &cifs_file_strict_nobrl_ops;
44                         else
45                                 inode->i_fop = &cifs_file_strict_ops;
46                 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
47                         inode->i_fop = &cifs_file_nobrl_ops;
48                 else { /* not direct, send byte range locks */
49                         inode->i_fop = &cifs_file_ops;
50                 }
51
52                 /* check if server can support readpages */
53                 if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read <
54                                 PAGE_SIZE + MAX_CIFS_HDR_SIZE)
55                         inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
56                 else
57                         inode->i_data.a_ops = &cifs_addr_ops;
58                 break;
59         case S_IFDIR:
60 #ifdef CONFIG_CIFS_DFS_UPCALL
61                 if (IS_AUTOMOUNT(inode)) {
62                         inode->i_op = &cifs_dfs_referral_inode_operations;
63                 } else {
64 #else /* NO DFS support, treat as a directory */
65                 {
66 #endif
67                         inode->i_op = &cifs_dir_inode_ops;
68                         inode->i_fop = &cifs_dir_ops;
69                 }
70                 break;
71         case S_IFLNK:
72                 inode->i_op = &cifs_symlink_inode_ops;
73                 break;
74         default:
75                 init_special_inode(inode, inode->i_mode, inode->i_rdev);
76                 break;
77         }
78 }
79
80 /* check inode attributes against fattr. If they don't match, tag the
81  * inode for cache invalidation
82  */
83 static void
84 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
85 {
86         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
87
88         cifs_dbg(FYI, "%s: revalidating inode %llu\n",
89                  __func__, cifs_i->uniqueid);
90
91         if (inode->i_state & I_NEW) {
92                 cifs_dbg(FYI, "%s: inode %llu is new\n",
93                          __func__, cifs_i->uniqueid);
94                 return;
95         }
96
97         /* don't bother with revalidation if we have an oplock */
98         if (CIFS_CACHE_READ(cifs_i)) {
99                 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
100                          __func__, cifs_i->uniqueid);
101                 return;
102         }
103
104          /* revalidate if mtime or size have changed */
105         fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
106         if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
107             cifs_i->server_eof == fattr->cf_eof) {
108                 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
109                          __func__, cifs_i->uniqueid);
110                 return;
111         }
112
113         cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
114                  __func__, cifs_i->uniqueid);
115         set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
116 }
117
118 /*
119  * copy nlink to the inode, unless it wasn't provided.  Provide
120  * sane values if we don't have an existing one and none was provided
121  */
122 static void
123 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
124 {
125         /*
126          * if we're in a situation where we can't trust what we
127          * got from the server (readdir, some non-unix cases)
128          * fake reasonable values
129          */
130         if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
131                 /* only provide fake values on a new inode */
132                 if (inode->i_state & I_NEW) {
133                         if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
134                                 set_nlink(inode, 2);
135                         else
136                                 set_nlink(inode, 1);
137                 }
138                 return;
139         }
140
141         /* we trust the server, so update it */
142         set_nlink(inode, fattr->cf_nlink);
143 }
144
145 /* populate an inode with info from a cifs_fattr struct */
146 int
147 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
148 {
149         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
150         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
151
152         if (!(inode->i_state & I_NEW) &&
153             unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
154                 CIFS_I(inode)->time = 0; /* force reval */
155                 return -ESTALE;
156         }
157
158         cifs_revalidate_cache(inode, fattr);
159
160         spin_lock(&inode->i_lock);
161         fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
162         fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
163         fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
164         /* we do not want atime to be less than mtime, it broke some apps */
165         if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
166                 inode->i_atime = fattr->cf_mtime;
167         else
168                 inode->i_atime = fattr->cf_atime;
169         inode->i_mtime = fattr->cf_mtime;
170         inode->i_ctime = fattr->cf_ctime;
171         inode->i_rdev = fattr->cf_rdev;
172         cifs_nlink_fattr_to_inode(inode, fattr);
173         inode->i_uid = fattr->cf_uid;
174         inode->i_gid = fattr->cf_gid;
175
176         /* if dynperm is set, don't clobber existing mode */
177         if (inode->i_state & I_NEW ||
178             !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
179                 inode->i_mode = fattr->cf_mode;
180
181         cifs_i->cifsAttrs = fattr->cf_cifsattrs;
182
183         if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
184                 cifs_i->time = 0;
185         else
186                 cifs_i->time = jiffies;
187
188         if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
189                 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
190         else
191                 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
192
193         cifs_i->server_eof = fattr->cf_eof;
194         /*
195          * Can't safely change the file size here if the client is writing to
196          * it due to potential races.
197          */
198         if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
199                 i_size_write(inode, fattr->cf_eof);
200
201                 /*
202                  * i_blocks is not related to (i_size / i_blksize),
203                  * but instead 512 byte (2**9) size is required for
204                  * calculating num blocks.
205                  */
206                 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
207         }
208         spin_unlock(&inode->i_lock);
209
210         if (fattr->cf_flags & CIFS_FATTR_DFS_REFERRAL)
211                 inode->i_flags |= S_AUTOMOUNT;
212         if (inode->i_state & I_NEW)
213                 cifs_set_ops(inode);
214         return 0;
215 }
216
217 void
218 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
219 {
220         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
221
222         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
223                 return;
224
225         fattr->cf_uniqueid = iunique(sb, ROOT_I);
226 }
227
228 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
229 void
230 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
231                          struct cifs_sb_info *cifs_sb)
232 {
233         memset(fattr, 0, sizeof(*fattr));
234         fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
235         fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
236         fattr->cf_eof = le64_to_cpu(info->EndOfFile);
237
238         fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
239         fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
240         fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
241         /* old POSIX extensions don't get create time */
242
243         fattr->cf_mode = le64_to_cpu(info->Permissions);
244
245         /*
246          * Since we set the inode type below we need to mask off
247          * to avoid strange results if bits set above.
248          */
249         fattr->cf_mode &= ~S_IFMT;
250         switch (le32_to_cpu(info->Type)) {
251         case UNIX_FILE:
252                 fattr->cf_mode |= S_IFREG;
253                 fattr->cf_dtype = DT_REG;
254                 break;
255         case UNIX_SYMLINK:
256                 fattr->cf_mode |= S_IFLNK;
257                 fattr->cf_dtype = DT_LNK;
258                 break;
259         case UNIX_DIR:
260                 fattr->cf_mode |= S_IFDIR;
261                 fattr->cf_dtype = DT_DIR;
262                 break;
263         case UNIX_CHARDEV:
264                 fattr->cf_mode |= S_IFCHR;
265                 fattr->cf_dtype = DT_CHR;
266                 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
267                                        le64_to_cpu(info->DevMinor) & MINORMASK);
268                 break;
269         case UNIX_BLOCKDEV:
270                 fattr->cf_mode |= S_IFBLK;
271                 fattr->cf_dtype = DT_BLK;
272                 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
273                                        le64_to_cpu(info->DevMinor) & MINORMASK);
274                 break;
275         case UNIX_FIFO:
276                 fattr->cf_mode |= S_IFIFO;
277                 fattr->cf_dtype = DT_FIFO;
278                 break;
279         case UNIX_SOCKET:
280                 fattr->cf_mode |= S_IFSOCK;
281                 fattr->cf_dtype = DT_SOCK;
282                 break;
283         default:
284                 /* safest to call it a file if we do not know */
285                 fattr->cf_mode |= S_IFREG;
286                 fattr->cf_dtype = DT_REG;
287                 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
288                 break;
289         }
290
291         fattr->cf_uid = cifs_sb->ctx->linux_uid;
292         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
293                 u64 id = le64_to_cpu(info->Uid);
294                 if (id < ((uid_t)-1)) {
295                         kuid_t uid = make_kuid(&init_user_ns, id);
296                         if (uid_valid(uid))
297                                 fattr->cf_uid = uid;
298                 }
299         }
300         
301         fattr->cf_gid = cifs_sb->ctx->linux_gid;
302         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
303                 u64 id = le64_to_cpu(info->Gid);
304                 if (id < ((gid_t)-1)) {
305                         kgid_t gid = make_kgid(&init_user_ns, id);
306                         if (gid_valid(gid))
307                                 fattr->cf_gid = gid;
308                 }
309         }
310
311         fattr->cf_nlink = le64_to_cpu(info->Nlinks);
312 }
313
314 /*
315  * Fill a cifs_fattr struct with fake inode info.
316  *
317  * Needed to setup cifs_fattr data for the directory which is the
318  * junction to the new submount (ie to setup the fake directory
319  * which represents a DFS referral).
320  */
321 static void
322 cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
323 {
324         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
325
326         cifs_dbg(FYI, "creating fake fattr for DFS referral\n");
327
328         memset(fattr, 0, sizeof(*fattr));
329         fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
330         fattr->cf_uid = cifs_sb->ctx->linux_uid;
331         fattr->cf_gid = cifs_sb->ctx->linux_gid;
332         ktime_get_coarse_real_ts64(&fattr->cf_mtime);
333         fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
334         fattr->cf_nlink = 2;
335         fattr->cf_flags = CIFS_FATTR_DFS_REFERRAL;
336 }
337
338 static int
339 cifs_get_file_info_unix(struct file *filp)
340 {
341         int rc;
342         unsigned int xid;
343         FILE_UNIX_BASIC_INFO find_data;
344         struct cifs_fattr fattr;
345         struct inode *inode = file_inode(filp);
346         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
347         struct cifsFileInfo *cfile = filp->private_data;
348         struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
349
350         xid = get_xid();
351         rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
352         if (!rc) {
353                 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
354         } else if (rc == -EREMOTE) {
355                 cifs_create_dfs_fattr(&fattr, inode->i_sb);
356                 rc = 0;
357         } else
358                 goto cifs_gfiunix_out;
359
360         rc = cifs_fattr_to_inode(inode, &fattr);
361
362 cifs_gfiunix_out:
363         free_xid(xid);
364         return rc;
365 }
366
367 int cifs_get_inode_info_unix(struct inode **pinode,
368                              const unsigned char *full_path,
369                              struct super_block *sb, unsigned int xid)
370 {
371         int rc;
372         FILE_UNIX_BASIC_INFO find_data;
373         struct cifs_fattr fattr;
374         struct cifs_tcon *tcon;
375         struct tcon_link *tlink;
376         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
377
378         cifs_dbg(FYI, "Getting info on %s\n", full_path);
379
380         tlink = cifs_sb_tlink(cifs_sb);
381         if (IS_ERR(tlink))
382                 return PTR_ERR(tlink);
383         tcon = tlink_tcon(tlink);
384
385         /* could have done a find first instead but this returns more info */
386         rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
387                                   cifs_sb->local_nls, cifs_remap(cifs_sb));
388         cifs_put_tlink(tlink);
389
390         if (!rc) {
391                 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
392         } else if (rc == -EREMOTE) {
393                 cifs_create_dfs_fattr(&fattr, sb);
394                 rc = 0;
395         } else {
396                 return rc;
397         }
398
399         /* check for Minshall+French symlinks */
400         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
401                 int tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
402                                              full_path);
403                 if (tmprc)
404                         cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
405         }
406
407         if (*pinode == NULL) {
408                 /* get new inode */
409                 cifs_fill_uniqueid(sb, &fattr);
410                 *pinode = cifs_iget(sb, &fattr);
411                 if (!*pinode)
412                         rc = -ENOMEM;
413         } else {
414                 /* we already have inode, update it */
415
416                 /* if uniqueid is different, return error */
417                 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
418                     CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
419                         CIFS_I(*pinode)->time = 0; /* force reval */
420                         rc = -ESTALE;
421                         goto cgiiu_exit;
422                 }
423
424                 /* if filetype is different, return error */
425                 rc = cifs_fattr_to_inode(*pinode, &fattr);
426         }
427
428 cgiiu_exit:
429         return rc;
430 }
431
432 static int
433 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
434               struct cifs_sb_info *cifs_sb, unsigned int xid)
435 {
436         int rc;
437         __u32 oplock;
438         struct tcon_link *tlink;
439         struct cifs_tcon *tcon;
440         struct cifs_fid fid;
441         struct cifs_open_parms oparms;
442         struct cifs_io_parms io_parms = {0};
443         char buf[24];
444         unsigned int bytes_read;
445         char *pbuf;
446         int buf_type = CIFS_NO_BUFFER;
447
448         pbuf = buf;
449
450         fattr->cf_mode &= ~S_IFMT;
451
452         if (fattr->cf_eof == 0) {
453                 fattr->cf_mode |= S_IFIFO;
454                 fattr->cf_dtype = DT_FIFO;
455                 return 0;
456         } else if (fattr->cf_eof < 8) {
457                 fattr->cf_mode |= S_IFREG;
458                 fattr->cf_dtype = DT_REG;
459                 return -EINVAL;  /* EOPNOTSUPP? */
460         }
461
462         tlink = cifs_sb_tlink(cifs_sb);
463         if (IS_ERR(tlink))
464                 return PTR_ERR(tlink);
465         tcon = tlink_tcon(tlink);
466
467         oparms.tcon = tcon;
468         oparms.cifs_sb = cifs_sb;
469         oparms.desired_access = GENERIC_READ;
470         oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
471         oparms.disposition = FILE_OPEN;
472         oparms.path = path;
473         oparms.fid = &fid;
474         oparms.reconnect = false;
475
476         if (tcon->ses->server->oplocks)
477                 oplock = REQ_OPLOCK;
478         else
479                 oplock = 0;
480         rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
481         if (rc) {
482                 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
483                 cifs_put_tlink(tlink);
484                 return rc;
485         }
486
487         /* Read header */
488         io_parms.netfid = fid.netfid;
489         io_parms.pid = current->tgid;
490         io_parms.tcon = tcon;
491         io_parms.offset = 0;
492         io_parms.length = 24;
493
494         rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
495                                         &bytes_read, &pbuf, &buf_type);
496         if ((rc == 0) && (bytes_read >= 8)) {
497                 if (memcmp("IntxBLK", pbuf, 8) == 0) {
498                         cifs_dbg(FYI, "Block device\n");
499                         fattr->cf_mode |= S_IFBLK;
500                         fattr->cf_dtype = DT_BLK;
501                         if (bytes_read == 24) {
502                                 /* we have enough to decode dev num */
503                                 __u64 mjr; /* major */
504                                 __u64 mnr; /* minor */
505                                 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
506                                 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
507                                 fattr->cf_rdev = MKDEV(mjr, mnr);
508                         }
509                 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
510                         cifs_dbg(FYI, "Char device\n");
511                         fattr->cf_mode |= S_IFCHR;
512                         fattr->cf_dtype = DT_CHR;
513                         if (bytes_read == 24) {
514                                 /* we have enough to decode dev num */
515                                 __u64 mjr; /* major */
516                                 __u64 mnr; /* minor */
517                                 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
518                                 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
519                                 fattr->cf_rdev = MKDEV(mjr, mnr);
520                         }
521                 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
522                         cifs_dbg(FYI, "Symlink\n");
523                         fattr->cf_mode |= S_IFLNK;
524                         fattr->cf_dtype = DT_LNK;
525                 } else {
526                         fattr->cf_mode |= S_IFREG; /* file? */
527                         fattr->cf_dtype = DT_REG;
528                         rc = -EOPNOTSUPP;
529                 }
530         } else {
531                 fattr->cf_mode |= S_IFREG; /* then it is a file */
532                 fattr->cf_dtype = DT_REG;
533                 rc = -EOPNOTSUPP; /* or some unknown SFU type */
534         }
535
536         tcon->ses->server->ops->close(xid, tcon, &fid);
537         cifs_put_tlink(tlink);
538         return rc;
539 }
540
541 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID)  /* SETFILEBITS valid bits */
542
543 /*
544  * Fetch mode bits as provided by SFU.
545  *
546  * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
547  */
548 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
549                          struct cifs_sb_info *cifs_sb, unsigned int xid)
550 {
551 #ifdef CONFIG_CIFS_XATTR
552         ssize_t rc;
553         char ea_value[4];
554         __u32 mode;
555         struct tcon_link *tlink;
556         struct cifs_tcon *tcon;
557
558         tlink = cifs_sb_tlink(cifs_sb);
559         if (IS_ERR(tlink))
560                 return PTR_ERR(tlink);
561         tcon = tlink_tcon(tlink);
562
563         if (tcon->ses->server->ops->query_all_EAs == NULL) {
564                 cifs_put_tlink(tlink);
565                 return -EOPNOTSUPP;
566         }
567
568         rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
569                         "SETFILEBITS", ea_value, 4 /* size of buf */,
570                         cifs_sb);
571         cifs_put_tlink(tlink);
572         if (rc < 0)
573                 return (int)rc;
574         else if (rc > 3) {
575                 mode = le32_to_cpu(*((__le32 *)ea_value));
576                 fattr->cf_mode &= ~SFBITS_MASK;
577                 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
578                          mode, fattr->cf_mode);
579                 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
580                 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
581         }
582
583         return 0;
584 #else
585         return -EOPNOTSUPP;
586 #endif
587 }
588
589 /* Fill a cifs_fattr struct with info from POSIX info struct */
590 static void
591 smb311_posix_info_to_fattr(struct cifs_fattr *fattr, struct smb311_posix_qinfo *info,
592                            struct super_block *sb, bool adjust_tz, bool symlink)
593 {
594         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
595         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
596
597         memset(fattr, 0, sizeof(*fattr));
598
599         /* no fattr->flags to set */
600         fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
601         fattr->cf_uniqueid = le64_to_cpu(info->Inode);
602
603         if (info->LastAccessTime)
604                 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
605         else
606                 ktime_get_coarse_real_ts64(&fattr->cf_atime);
607
608         fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
609         fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
610
611         if (adjust_tz) {
612                 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
613                 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
614         }
615
616         fattr->cf_eof = le64_to_cpu(info->EndOfFile);
617         fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
618         fattr->cf_createtime = le64_to_cpu(info->CreationTime);
619
620         fattr->cf_nlink = le32_to_cpu(info->HardLinks);
621         fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
622         /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
623         /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
624
625         if (symlink) {
626                 fattr->cf_mode |= S_IFLNK;
627                 fattr->cf_dtype = DT_LNK;
628         } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
629                 fattr->cf_mode |= S_IFDIR;
630                 fattr->cf_dtype = DT_DIR;
631         } else { /* file */
632                 fattr->cf_mode |= S_IFREG;
633                 fattr->cf_dtype = DT_REG;
634         }
635         /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
636
637         fattr->cf_uid = cifs_sb->ctx->linux_uid; /* TODO: map uid and gid from SID */
638         fattr->cf_gid = cifs_sb->ctx->linux_gid;
639
640         cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
641                 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
642 }
643
644
645 /* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
646 static void
647 cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
648                        struct super_block *sb, bool adjust_tz,
649                        bool symlink, u32 reparse_tag)
650 {
651         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
652         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
653
654         memset(fattr, 0, sizeof(*fattr));
655         fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
656         if (info->DeletePending)
657                 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
658
659         if (info->LastAccessTime)
660                 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
661         else
662                 ktime_get_coarse_real_ts64(&fattr->cf_atime);
663
664         fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
665         fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
666
667         if (adjust_tz) {
668                 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
669                 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
670         }
671
672         fattr->cf_eof = le64_to_cpu(info->EndOfFile);
673         fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
674         fattr->cf_createtime = le64_to_cpu(info->CreationTime);
675
676         fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
677         if (reparse_tag == IO_REPARSE_TAG_LX_SYMLINK) {
678                 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
679                 fattr->cf_dtype = DT_LNK;
680         } else if (reparse_tag == IO_REPARSE_TAG_LX_FIFO) {
681                 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
682                 fattr->cf_dtype = DT_FIFO;
683         } else if (reparse_tag == IO_REPARSE_TAG_AF_UNIX) {
684                 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
685                 fattr->cf_dtype = DT_SOCK;
686         } else if (reparse_tag == IO_REPARSE_TAG_LX_CHR) {
687                 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
688                 fattr->cf_dtype = DT_CHR;
689         } else if (reparse_tag == IO_REPARSE_TAG_LX_BLK) {
690                 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
691                 fattr->cf_dtype = DT_BLK;
692         } else if (symlink) { /* TODO add more reparse tag checks */
693                 fattr->cf_mode = S_IFLNK;
694                 fattr->cf_dtype = DT_LNK;
695         } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
696                 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
697                 fattr->cf_dtype = DT_DIR;
698                 /*
699                  * Server can return wrong NumberOfLinks value for directories
700                  * when Unix extensions are disabled - fake it.
701                  */
702                 if (!tcon->unix_ext)
703                         fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
704         } else {
705                 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
706                 fattr->cf_dtype = DT_REG;
707
708                 /* clear write bits if ATTR_READONLY is set */
709                 if (fattr->cf_cifsattrs & ATTR_READONLY)
710                         fattr->cf_mode &= ~(S_IWUGO);
711
712                 /*
713                  * Don't accept zero nlink from non-unix servers unless
714                  * delete is pending.  Instead mark it as unknown.
715                  */
716                 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
717                     !info->DeletePending) {
718                         cifs_dbg(VFS, "bogus file nlink value %u\n",
719                                  fattr->cf_nlink);
720                         fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
721                 }
722         }
723
724         fattr->cf_uid = cifs_sb->ctx->linux_uid;
725         fattr->cf_gid = cifs_sb->ctx->linux_gid;
726 }
727
728 static int
729 cifs_get_file_info(struct file *filp)
730 {
731         int rc;
732         unsigned int xid;
733         FILE_ALL_INFO find_data;
734         struct cifs_fattr fattr;
735         struct inode *inode = file_inode(filp);
736         struct cifsFileInfo *cfile = filp->private_data;
737         struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
738         struct TCP_Server_Info *server = tcon->ses->server;
739
740         if (!server->ops->query_file_info)
741                 return -ENOSYS;
742
743         xid = get_xid();
744         rc = server->ops->query_file_info(xid, tcon, &cfile->fid, &find_data);
745         switch (rc) {
746         case 0:
747                 /* TODO: add support to query reparse tag */
748                 cifs_all_info_to_fattr(&fattr, &find_data, inode->i_sb, false,
749                                        false, 0 /* no reparse tag */);
750                 break;
751         case -EREMOTE:
752                 cifs_create_dfs_fattr(&fattr, inode->i_sb);
753                 rc = 0;
754                 break;
755         case -EOPNOTSUPP:
756         case -EINVAL:
757                 /*
758                  * FIXME: legacy server -- fall back to path-based call?
759                  * for now, just skip revalidating and mark inode for
760                  * immediate reval.
761                  */
762                 rc = 0;
763                 CIFS_I(inode)->time = 0;
764                 goto cgfi_exit;
765         default:
766                 goto cgfi_exit;
767         }
768
769         /*
770          * don't bother with SFU junk here -- just mark inode as needing
771          * revalidation.
772          */
773         fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
774         fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
775         /* if filetype is different, return error */
776         rc = cifs_fattr_to_inode(inode, &fattr);
777 cgfi_exit:
778         free_xid(xid);
779         return rc;
780 }
781
782 /* Simple function to return a 64 bit hash of string.  Rarely called */
783 static __u64 simple_hashstr(const char *str)
784 {
785         const __u64 hash_mult =  1125899906842597ULL; /* a big enough prime */
786         __u64 hash = 0;
787
788         while (*str)
789                 hash = (hash + (__u64) *str++) * hash_mult;
790
791         return hash;
792 }
793
794 /**
795  * cifs_backup_query_path_info - SMB1 fallback code to get ino
796  *
797  * Fallback code to get file metadata when we don't have access to
798  * full_path (EACCES) and have backup creds.
799  *
800  * @xid:        transaction id used to identify original request in logs
801  * @tcon:       information about the server share we have mounted
802  * @sb: the superblock stores info such as disk space available
803  * @full_path:  name of the file we are getting the metadata for
804  * @resp_buf:   will be set to cifs resp buf and needs to be freed with
805  *              cifs_buf_release() when done with @data
806  * @data:       will be set to search info result buffer
807  */
808 static int
809 cifs_backup_query_path_info(int xid,
810                             struct cifs_tcon *tcon,
811                             struct super_block *sb,
812                             const char *full_path,
813                             void **resp_buf,
814                             FILE_ALL_INFO **data)
815 {
816         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
817         struct cifs_search_info info = {0};
818         u16 flags;
819         int rc;
820
821         *resp_buf = NULL;
822         info.endOfSearch = false;
823         if (tcon->unix_ext)
824                 info.info_level = SMB_FIND_FILE_UNIX;
825         else if ((tcon->ses->capabilities &
826                   tcon->ses->server->vals->cap_nt_find) == 0)
827                 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
828         else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
829                 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
830         else /* no srvino useful for fallback to some netapp */
831                 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
832
833         flags = CIFS_SEARCH_CLOSE_ALWAYS |
834                 CIFS_SEARCH_CLOSE_AT_END |
835                 CIFS_SEARCH_BACKUP_SEARCH;
836
837         rc = CIFSFindFirst(xid, tcon, full_path,
838                            cifs_sb, NULL, flags, &info, false);
839         if (rc)
840                 return rc;
841
842         *resp_buf = (void *)info.ntwrk_buf_start;
843         *data = (FILE_ALL_INFO *)info.srch_entries_start;
844         return 0;
845 }
846
847 static void
848 cifs_set_fattr_ino(int xid,
849                    struct cifs_tcon *tcon,
850                    struct super_block *sb,
851                    struct inode **inode,
852                    const char *full_path,
853                    FILE_ALL_INFO *data,
854                    struct cifs_fattr *fattr)
855 {
856         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
857         struct TCP_Server_Info *server = tcon->ses->server;
858         int rc;
859
860         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
861                 if (*inode)
862                         fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
863                 else
864                         fattr->cf_uniqueid = iunique(sb, ROOT_I);
865                 return;
866         }
867
868         /*
869          * If we have an inode pass a NULL tcon to ensure we don't
870          * make a round trip to the server. This only works for SMB2+.
871          */
872         rc = server->ops->get_srv_inum(xid,
873                                        *inode ? NULL : tcon,
874                                        cifs_sb, full_path,
875                                        &fattr->cf_uniqueid,
876                                        data);
877         if (rc) {
878                 /*
879                  * If that fails reuse existing ino or generate one
880                  * and disable server ones
881                  */
882                 if (*inode)
883                         fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
884                 else {
885                         fattr->cf_uniqueid = iunique(sb, ROOT_I);
886                         cifs_autodisable_serverino(cifs_sb);
887                 }
888                 return;
889         }
890
891         /* If no errors, check for zero root inode (invalid) */
892         if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
893                 cifs_dbg(FYI, "Invalid (0) inodenum\n");
894                 if (*inode) {
895                         /* reuse */
896                         fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
897                 } else {
898                         /* make an ino by hashing the UNC */
899                         fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
900                         fattr->cf_uniqueid = simple_hashstr(tcon->treeName);
901                 }
902         }
903 }
904
905 static inline bool is_inode_cache_good(struct inode *ino)
906 {
907         return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
908 }
909
910 int
911 cifs_get_inode_info(struct inode **inode,
912                     const char *full_path,
913                     FILE_ALL_INFO *in_data,
914                     struct super_block *sb, int xid,
915                     const struct cifs_fid *fid)
916 {
917
918         struct cifs_tcon *tcon;
919         struct TCP_Server_Info *server;
920         struct tcon_link *tlink;
921         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
922         bool adjust_tz = false;
923         struct cifs_fattr fattr = {0};
924         bool is_reparse_point = false;
925         FILE_ALL_INFO *data = in_data;
926         FILE_ALL_INFO *tmp_data = NULL;
927         void *smb1_backup_rsp_buf = NULL;
928         int rc = 0;
929         int tmprc = 0;
930         __u32 reparse_tag = 0;
931
932         tlink = cifs_sb_tlink(cifs_sb);
933         if (IS_ERR(tlink))
934                 return PTR_ERR(tlink);
935         tcon = tlink_tcon(tlink);
936         server = tcon->ses->server;
937
938         /*
939          * 1. Fetch file metadata if not provided (data)
940          */
941
942         if (!data) {
943                 if (is_inode_cache_good(*inode)) {
944                         cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
945                         goto out;
946                 }
947                 tmp_data = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
948                 if (!tmp_data) {
949                         rc = -ENOMEM;
950                         goto out;
951                 }
952                 rc = server->ops->query_path_info(xid, tcon, cifs_sb,
953                                                  full_path, tmp_data,
954                                                  &adjust_tz, &is_reparse_point);
955                 data = tmp_data;
956         }
957
958         /*
959          * 2. Convert it to internal cifs metadata (fattr)
960          */
961
962         switch (rc) {
963         case 0:
964                 /*
965                  * If the file is a reparse point, it is more complicated
966                  * since we have to check if its reparse tag matches a known
967                  * special file type e.g. symlink or fifo or char etc.
968                  */
969                 if ((le32_to_cpu(data->Attributes) & ATTR_REPARSE) &&
970                     server->ops->query_reparse_tag) {
971                         rc = server->ops->query_reparse_tag(xid, tcon, cifs_sb,
972                                                 full_path, &reparse_tag);
973                         cifs_dbg(FYI, "reparse tag 0x%x\n", reparse_tag);
974                 }
975                 cifs_all_info_to_fattr(&fattr, data, sb, adjust_tz,
976                                        is_reparse_point, reparse_tag);
977                 break;
978         case -EREMOTE:
979                 /* DFS link, no metadata available on this server */
980                 cifs_create_dfs_fattr(&fattr, sb);
981                 rc = 0;
982                 break;
983         case -EACCES:
984                 /*
985                  * perm errors, try again with backup flags if possible
986                  *
987                  * For SMB2 and later the backup intent flag
988                  * is already sent if needed on open and there
989                  * is no path based FindFirst operation to use
990                  * to retry with
991                  */
992                 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
993                         /* for easier reading */
994                         FILE_DIRECTORY_INFO *fdi;
995                         SEARCH_ID_FULL_DIR_INFO *si;
996
997                         rc = cifs_backup_query_path_info(xid, tcon, sb,
998                                                          full_path,
999                                                          &smb1_backup_rsp_buf,
1000                                                          &data);
1001                         if (rc)
1002                                 goto out;
1003
1004                         fdi = (FILE_DIRECTORY_INFO *)data;
1005                         si = (SEARCH_ID_FULL_DIR_INFO *)data;
1006
1007                         cifs_dir_info_to_fattr(&fattr, fdi, cifs_sb);
1008                         fattr.cf_uniqueid = le64_to_cpu(si->UniqueId);
1009                         /* uniqueid set, skip get inum step */
1010                         goto handle_mnt_opt;
1011                 } else {
1012                         /* nothing we can do, bail out */
1013                         goto out;
1014                 }
1015                 break;
1016         default:
1017                 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1018                 goto out;
1019         }
1020
1021         /*
1022          * 3. Get or update inode number (fattr.cf_uniqueid)
1023          */
1024
1025         cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, &fattr);
1026
1027         /*
1028          * 4. Tweak fattr based on mount options
1029          */
1030
1031 handle_mnt_opt:
1032         /* query for SFU type info if supported and needed */
1033         if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
1034             cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
1035                 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
1036                 if (tmprc)
1037                         cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1038         }
1039
1040         /* fill in 0777 bits from ACL */
1041         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1042                 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, true,
1043                                        full_path, fid);
1044                 if (rc == -EREMOTE)
1045                         rc = 0;
1046                 if (rc) {
1047                         cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1048                                  __func__, rc);
1049                         goto out;
1050                 }
1051         } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1052                 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, false,
1053                                        full_path, fid);
1054                 if (rc == -EREMOTE)
1055                         rc = 0;
1056                 if (rc) {
1057                         cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1058                                  __func__, rc);
1059                         goto out;
1060                 }
1061         }
1062
1063         /* fill in remaining high mode bits e.g. SUID, VTX */
1064         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1065                 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
1066
1067         /* check for Minshall+French symlinks */
1068         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1069                 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1070                                          full_path);
1071                 if (tmprc)
1072                         cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1073         }
1074
1075         /*
1076          * 5. Update inode with final fattr data
1077          */
1078
1079         if (!*inode) {
1080                 *inode = cifs_iget(sb, &fattr);
1081                 if (!*inode)
1082                         rc = -ENOMEM;
1083         } else {
1084                 /* we already have inode, update it */
1085
1086                 /* if uniqueid is different, return error */
1087                 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1088                     CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1089                         CIFS_I(*inode)->time = 0; /* force reval */
1090                         rc = -ESTALE;
1091                         goto out;
1092                 }
1093                 /* if filetype is different, return error */
1094                 rc = cifs_fattr_to_inode(*inode, &fattr);
1095         }
1096 out:
1097         cifs_buf_release(smb1_backup_rsp_buf);
1098         cifs_put_tlink(tlink);
1099         kfree(tmp_data);
1100         return rc;
1101 }
1102
1103 int
1104 smb311_posix_get_inode_info(struct inode **inode,
1105                     const char *full_path,
1106                     struct super_block *sb, unsigned int xid)
1107 {
1108         struct cifs_tcon *tcon;
1109         struct tcon_link *tlink;
1110         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1111         bool adjust_tz = false;
1112         struct cifs_fattr fattr = {0};
1113         bool symlink = false;
1114         struct smb311_posix_qinfo *data = NULL;
1115         int rc = 0;
1116         int tmprc = 0;
1117
1118         tlink = cifs_sb_tlink(cifs_sb);
1119         if (IS_ERR(tlink))
1120                 return PTR_ERR(tlink);
1121         tcon = tlink_tcon(tlink);
1122
1123         /*
1124          * 1. Fetch file metadata
1125          */
1126
1127         if (is_inode_cache_good(*inode)) {
1128                 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1129                 goto out;
1130         }
1131         data = kmalloc(sizeof(struct smb311_posix_qinfo), GFP_KERNEL);
1132         if (!data) {
1133                 rc = -ENOMEM;
1134                 goto out;
1135         }
1136
1137         rc = smb311_posix_query_path_info(xid, tcon, cifs_sb,
1138                                                   full_path, data,
1139                                                   &adjust_tz, &symlink);
1140
1141         /*
1142          * 2. Convert it to internal cifs metadata (fattr)
1143          */
1144
1145         switch (rc) {
1146         case 0:
1147                 smb311_posix_info_to_fattr(&fattr, data, sb, adjust_tz, symlink);
1148                 break;
1149         case -EREMOTE:
1150                 /* DFS link, no metadata available on this server */
1151                 cifs_create_dfs_fattr(&fattr, sb);
1152                 rc = 0;
1153                 break;
1154         case -EACCES:
1155                 /*
1156                  * For SMB2 and later the backup intent flag
1157                  * is already sent if needed on open and there
1158                  * is no path based FindFirst operation to use
1159                  * to retry with so nothing we can do, bail out
1160                  */
1161                 goto out;
1162         default:
1163                 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1164                 goto out;
1165         }
1166
1167
1168         /*
1169          * 3. Tweak fattr based on mount options
1170          */
1171
1172         /* check for Minshall+French symlinks */
1173         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1174                 tmprc = check_mf_symlink(xid, tcon, cifs_sb, &fattr,
1175                                          full_path);
1176                 if (tmprc)
1177                         cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1178         }
1179
1180         /*
1181          * 4. Update inode with final fattr data
1182          */
1183
1184         if (!*inode) {
1185                 *inode = cifs_iget(sb, &fattr);
1186                 if (!*inode)
1187                         rc = -ENOMEM;
1188         } else {
1189                 /* we already have inode, update it */
1190
1191                 /* if uniqueid is different, return error */
1192                 if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
1193                     CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
1194                         CIFS_I(*inode)->time = 0; /* force reval */
1195                         rc = -ESTALE;
1196                         goto out;
1197                 }
1198
1199                 /* if filetype is different, return error */
1200                 rc = cifs_fattr_to_inode(*inode, &fattr);
1201         }
1202 out:
1203         cifs_put_tlink(tlink);
1204         kfree(data);
1205         return rc;
1206 }
1207
1208
1209 static const struct inode_operations cifs_ipc_inode_ops = {
1210         .lookup = cifs_lookup,
1211 };
1212
1213 static int
1214 cifs_find_inode(struct inode *inode, void *opaque)
1215 {
1216         struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1217
1218         /* don't match inode with different uniqueid */
1219         if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1220                 return 0;
1221
1222         /* use createtime like an i_generation field */
1223         if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1224                 return 0;
1225
1226         /* don't match inode of different type */
1227         if (inode_wrong_type(inode, fattr->cf_mode))
1228                 return 0;
1229
1230         /* if it's not a directory or has no dentries, then flag it */
1231         if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1232                 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1233
1234         return 1;
1235 }
1236
1237 static int
1238 cifs_init_inode(struct inode *inode, void *opaque)
1239 {
1240         struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
1241
1242         CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1243         CIFS_I(inode)->createtime = fattr->cf_createtime;
1244         return 0;
1245 }
1246
1247 /*
1248  * walk dentry list for an inode and report whether it has aliases that
1249  * are hashed. We use this to determine if a directory inode can actually
1250  * be used.
1251  */
1252 static bool
1253 inode_has_hashed_dentries(struct inode *inode)
1254 {
1255         struct dentry *dentry;
1256
1257         spin_lock(&inode->i_lock);
1258         hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1259                 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1260                         spin_unlock(&inode->i_lock);
1261                         return true;
1262                 }
1263         }
1264         spin_unlock(&inode->i_lock);
1265         return false;
1266 }
1267
1268 /* Given fattrs, get a corresponding inode */
1269 struct inode *
1270 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1271 {
1272         unsigned long hash;
1273         struct inode *inode;
1274
1275 retry_iget5_locked:
1276         cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1277
1278         /* hash down to 32-bits on 32-bit arch */
1279         hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1280
1281         inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1282         if (inode) {
1283                 /* was there a potentially problematic inode collision? */
1284                 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1285                         fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1286
1287                         if (inode_has_hashed_dentries(inode)) {
1288                                 cifs_autodisable_serverino(CIFS_SB(sb));
1289                                 iput(inode);
1290                                 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1291                                 goto retry_iget5_locked;
1292                         }
1293                 }
1294
1295                 /* can't fail - see cifs_find_inode() */
1296                 cifs_fattr_to_inode(inode, fattr);
1297                 if (sb->s_flags & SB_NOATIME)
1298                         inode->i_flags |= S_NOATIME | S_NOCMTIME;
1299                 if (inode->i_state & I_NEW) {
1300                         inode->i_ino = hash;
1301 #ifdef CONFIG_CIFS_FSCACHE
1302                         /* initialize per-inode cache cookie pointer */
1303                         CIFS_I(inode)->fscache = NULL;
1304 #endif
1305                         unlock_new_inode(inode);
1306                 }
1307         }
1308
1309         return inode;
1310 }
1311
1312 /* gets root inode */
1313 struct inode *cifs_root_iget(struct super_block *sb)
1314 {
1315         unsigned int xid;
1316         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1317         struct inode *inode = NULL;
1318         long rc;
1319         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1320         char *path = NULL;
1321         int len;
1322
1323         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1324             && cifs_sb->prepath) {
1325                 len = strlen(cifs_sb->prepath);
1326                 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1327                 if (path == NULL)
1328                         return ERR_PTR(-ENOMEM);
1329                 path[0] = '/';
1330                 memcpy(path+1, cifs_sb->prepath, len);
1331         } else {
1332                 path = kstrdup("", GFP_KERNEL);
1333                 if (path == NULL)
1334                         return ERR_PTR(-ENOMEM);
1335         }
1336
1337         xid = get_xid();
1338         if (tcon->unix_ext) {
1339                 rc = cifs_get_inode_info_unix(&inode, path, sb, xid);
1340                 /* some servers mistakenly claim POSIX support */
1341                 if (rc != -EOPNOTSUPP)
1342                         goto iget_no_retry;
1343                 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1344                 tcon->unix_ext = false;
1345         }
1346
1347         convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1348         if (tcon->posix_extensions)
1349                 rc = smb311_posix_get_inode_info(&inode, path, sb, xid);
1350         else
1351                 rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL);
1352
1353 iget_no_retry:
1354         if (!inode) {
1355                 inode = ERR_PTR(rc);
1356                 goto out;
1357         }
1358
1359 #ifdef CONFIG_CIFS_FSCACHE
1360         /* populate tcon->resource_id */
1361         tcon->resource_id = CIFS_I(inode)->uniqueid;
1362 #endif
1363
1364         if (rc && tcon->pipe) {
1365                 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1366                 spin_lock(&inode->i_lock);
1367                 inode->i_mode |= S_IFDIR;
1368                 set_nlink(inode, 2);
1369                 inode->i_op = &cifs_ipc_inode_ops;
1370                 inode->i_fop = &simple_dir_operations;
1371                 inode->i_uid = cifs_sb->ctx->linux_uid;
1372                 inode->i_gid = cifs_sb->ctx->linux_gid;
1373                 spin_unlock(&inode->i_lock);
1374         } else if (rc) {
1375                 iget_failed(inode);
1376                 inode = ERR_PTR(rc);
1377         }
1378
1379 out:
1380         kfree(path);
1381         free_xid(xid);
1382         return inode;
1383 }
1384
1385 int
1386 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1387                    const char *full_path, __u32 dosattr)
1388 {
1389         bool set_time = false;
1390         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1391         struct TCP_Server_Info *server;
1392         FILE_BASIC_INFO info_buf;
1393
1394         if (attrs == NULL)
1395                 return -EINVAL;
1396
1397         server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1398         if (!server->ops->set_file_info)
1399                 return -ENOSYS;
1400
1401         info_buf.Pad = 0;
1402
1403         if (attrs->ia_valid & ATTR_ATIME) {
1404                 set_time = true;
1405                 info_buf.LastAccessTime =
1406                         cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1407         } else
1408                 info_buf.LastAccessTime = 0;
1409
1410         if (attrs->ia_valid & ATTR_MTIME) {
1411                 set_time = true;
1412                 info_buf.LastWriteTime =
1413                     cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1414         } else
1415                 info_buf.LastWriteTime = 0;
1416
1417         /*
1418          * Samba throws this field away, but windows may actually use it.
1419          * Do not set ctime unless other time stamps are changed explicitly
1420          * (i.e. by utimes()) since we would then have a mix of client and
1421          * server times.
1422          */
1423         if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1424                 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1425                 info_buf.ChangeTime =
1426                     cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1427         } else
1428                 info_buf.ChangeTime = 0;
1429
1430         info_buf.CreationTime = 0;      /* don't change */
1431         info_buf.Attributes = cpu_to_le32(dosattr);
1432
1433         return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1434 }
1435
1436 /*
1437  * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1438  * and rename it to a random name that hopefully won't conflict with
1439  * anything else.
1440  */
1441 int
1442 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1443                            const unsigned int xid)
1444 {
1445         int oplock = 0;
1446         int rc;
1447         struct cifs_fid fid;
1448         struct cifs_open_parms oparms;
1449         struct inode *inode = d_inode(dentry);
1450         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1451         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1452         struct tcon_link *tlink;
1453         struct cifs_tcon *tcon;
1454         __u32 dosattr, origattr;
1455         FILE_BASIC_INFO *info_buf = NULL;
1456
1457         tlink = cifs_sb_tlink(cifs_sb);
1458         if (IS_ERR(tlink))
1459                 return PTR_ERR(tlink);
1460         tcon = tlink_tcon(tlink);
1461
1462         /*
1463          * We cannot rename the file if the server doesn't support
1464          * CAP_INFOLEVEL_PASSTHRU
1465          */
1466         if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1467                 rc = -EBUSY;
1468                 goto out;
1469         }
1470
1471         oparms.tcon = tcon;
1472         oparms.cifs_sb = cifs_sb;
1473         oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
1474         oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
1475         oparms.disposition = FILE_OPEN;
1476         oparms.path = full_path;
1477         oparms.fid = &fid;
1478         oparms.reconnect = false;
1479
1480         rc = CIFS_open(xid, &oparms, &oplock, NULL);
1481         if (rc != 0)
1482                 goto out;
1483
1484         origattr = cifsInode->cifsAttrs;
1485         if (origattr == 0)
1486                 origattr |= ATTR_NORMAL;
1487
1488         dosattr = origattr & ~ATTR_READONLY;
1489         if (dosattr == 0)
1490                 dosattr |= ATTR_NORMAL;
1491         dosattr |= ATTR_HIDDEN;
1492
1493         /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1494         if (dosattr != origattr) {
1495                 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1496                 if (info_buf == NULL) {
1497                         rc = -ENOMEM;
1498                         goto out_close;
1499                 }
1500                 info_buf->Attributes = cpu_to_le32(dosattr);
1501                 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1502                                         current->tgid);
1503                 /* although we would like to mark the file hidden
1504                    if that fails we will still try to rename it */
1505                 if (!rc)
1506                         cifsInode->cifsAttrs = dosattr;
1507                 else
1508                         dosattr = origattr; /* since not able to change them */
1509         }
1510
1511         /* rename the file */
1512         rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1513                                    cifs_sb->local_nls,
1514                                    cifs_remap(cifs_sb));
1515         if (rc != 0) {
1516                 rc = -EBUSY;
1517                 goto undo_setattr;
1518         }
1519
1520         /* try to set DELETE_ON_CLOSE */
1521         if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1522                 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1523                                                current->tgid);
1524                 /*
1525                  * some samba versions return -ENOENT when we try to set the
1526                  * file disposition here. Likely a samba bug, but work around
1527                  * it for now. This means that some cifsXXX files may hang
1528                  * around after they shouldn't.
1529                  *
1530                  * BB: remove this hack after more servers have the fix
1531                  */
1532                 if (rc == -ENOENT)
1533                         rc = 0;
1534                 else if (rc != 0) {
1535                         rc = -EBUSY;
1536                         goto undo_rename;
1537                 }
1538                 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1539         }
1540
1541 out_close:
1542         CIFSSMBClose(xid, tcon, fid.netfid);
1543 out:
1544         kfree(info_buf);
1545         cifs_put_tlink(tlink);
1546         return rc;
1547
1548         /*
1549          * reset everything back to the original state. Don't bother
1550          * dealing with errors here since we can't do anything about
1551          * them anyway.
1552          */
1553 undo_rename:
1554         CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1555                                 cifs_sb->local_nls, cifs_remap(cifs_sb));
1556 undo_setattr:
1557         if (dosattr != origattr) {
1558                 info_buf->Attributes = cpu_to_le32(origattr);
1559                 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1560                                         current->tgid))
1561                         cifsInode->cifsAttrs = origattr;
1562         }
1563
1564         goto out_close;
1565 }
1566
1567 /* copied from fs/nfs/dir.c with small changes */
1568 static void
1569 cifs_drop_nlink(struct inode *inode)
1570 {
1571         spin_lock(&inode->i_lock);
1572         if (inode->i_nlink > 0)
1573                 drop_nlink(inode);
1574         spin_unlock(&inode->i_lock);
1575 }
1576
1577 /*
1578  * If d_inode(dentry) is null (usually meaning the cached dentry
1579  * is a negative dentry) then we would attempt a standard SMB delete, but
1580  * if that fails we can not attempt the fall back mechanisms on EACCES
1581  * but will return the EACCES to the caller. Note that the VFS does not call
1582  * unlink on negative dentries currently.
1583  */
1584 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1585 {
1586         int rc = 0;
1587         unsigned int xid;
1588         const char *full_path;
1589         void *page;
1590         struct inode *inode = d_inode(dentry);
1591         struct cifsInodeInfo *cifs_inode;
1592         struct super_block *sb = dir->i_sb;
1593         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1594         struct tcon_link *tlink;
1595         struct cifs_tcon *tcon;
1596         struct TCP_Server_Info *server;
1597         struct iattr *attrs = NULL;
1598         __u32 dosattr = 0, origattr = 0;
1599
1600         cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1601
1602         if (unlikely(cifs_forced_shutdown(cifs_sb)))
1603                 return -EIO;
1604
1605         tlink = cifs_sb_tlink(cifs_sb);
1606         if (IS_ERR(tlink))
1607                 return PTR_ERR(tlink);
1608         tcon = tlink_tcon(tlink);
1609         server = tcon->ses->server;
1610
1611         xid = get_xid();
1612         page = alloc_dentry_path();
1613
1614         if (tcon->nodelete) {
1615                 rc = -EACCES;
1616                 goto unlink_out;
1617         }
1618
1619         /* Unlink can be called from rename so we can not take the
1620          * sb->s_vfs_rename_mutex here */
1621         full_path = build_path_from_dentry(dentry, page);
1622         if (IS_ERR(full_path)) {
1623                 rc = PTR_ERR(full_path);
1624                 goto unlink_out;
1625         }
1626
1627         cifs_close_deferred_file_under_dentry(tcon, full_path);
1628         if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1629                                 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1630                 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1631                         SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1632                         cifs_remap(cifs_sb));
1633                 cifs_dbg(FYI, "posix del rc %d\n", rc);
1634                 if ((rc == 0) || (rc == -ENOENT))
1635                         goto psx_del_no_retry;
1636         }
1637
1638 retry_std_delete:
1639         if (!server->ops->unlink) {
1640                 rc = -ENOSYS;
1641                 goto psx_del_no_retry;
1642         }
1643
1644         rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1645
1646 psx_del_no_retry:
1647         if (!rc) {
1648                 if (inode)
1649                         cifs_drop_nlink(inode);
1650         } else if (rc == -ENOENT) {
1651                 d_drop(dentry);
1652         } else if (rc == -EBUSY) {
1653                 if (server->ops->rename_pending_delete) {
1654                         rc = server->ops->rename_pending_delete(full_path,
1655                                                                 dentry, xid);
1656                         if (rc == 0)
1657                                 cifs_drop_nlink(inode);
1658                 }
1659         } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1660                 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1661                 if (attrs == NULL) {
1662                         rc = -ENOMEM;
1663                         goto out_reval;
1664                 }
1665
1666                 /* try to reset dos attributes */
1667                 cifs_inode = CIFS_I(inode);
1668                 origattr = cifs_inode->cifsAttrs;
1669                 if (origattr == 0)
1670                         origattr |= ATTR_NORMAL;
1671                 dosattr = origattr & ~ATTR_READONLY;
1672                 if (dosattr == 0)
1673                         dosattr |= ATTR_NORMAL;
1674                 dosattr |= ATTR_HIDDEN;
1675
1676                 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1677                 if (rc != 0)
1678                         goto out_reval;
1679
1680                 goto retry_std_delete;
1681         }
1682
1683         /* undo the setattr if we errored out and it's needed */
1684         if (rc != 0 && dosattr != 0)
1685                 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1686
1687 out_reval:
1688         if (inode) {
1689                 cifs_inode = CIFS_I(inode);
1690                 cifs_inode->time = 0;   /* will force revalidate to get info
1691                                            when needed */
1692                 inode->i_ctime = current_time(inode);
1693         }
1694         dir->i_ctime = dir->i_mtime = current_time(dir);
1695         cifs_inode = CIFS_I(dir);
1696         CIFS_I(dir)->time = 0;  /* force revalidate of dir as well */
1697 unlink_out:
1698         free_dentry_path(page);
1699         kfree(attrs);
1700         free_xid(xid);
1701         cifs_put_tlink(tlink);
1702         return rc;
1703 }
1704
1705 static int
1706 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1707                  const char *full_path, struct cifs_sb_info *cifs_sb,
1708                  struct cifs_tcon *tcon, const unsigned int xid)
1709 {
1710         int rc = 0;
1711         struct inode *inode = NULL;
1712
1713         if (tcon->posix_extensions)
1714                 rc = smb311_posix_get_inode_info(&inode, full_path, parent->i_sb, xid);
1715         else if (tcon->unix_ext)
1716                 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1717                                               xid);
1718         else
1719                 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1720                                          xid, NULL);
1721
1722         if (rc)
1723                 return rc;
1724
1725         if (!S_ISDIR(inode->i_mode)) {
1726                 /*
1727                  * mkdir succeeded, but another client has managed to remove the
1728                  * sucker and replace it with non-directory.  Return success,
1729                  * but don't leave the child in dcache.
1730                  */
1731                  iput(inode);
1732                  d_drop(dentry);
1733                  return 0;
1734         }
1735         /*
1736          * setting nlink not necessary except in cases where we failed to get it
1737          * from the server or was set bogus. Also, since this is a brand new
1738          * inode, no need to grab the i_lock before setting the i_nlink.
1739          */
1740         if (inode->i_nlink < 2)
1741                 set_nlink(inode, 2);
1742         mode &= ~current_umask();
1743         /* must turn on setgid bit if parent dir has it */
1744         if (parent->i_mode & S_ISGID)
1745                 mode |= S_ISGID;
1746
1747         if (tcon->unix_ext) {
1748                 struct cifs_unix_set_info_args args = {
1749                         .mode   = mode,
1750                         .ctime  = NO_CHANGE_64,
1751                         .atime  = NO_CHANGE_64,
1752                         .mtime  = NO_CHANGE_64,
1753                         .device = 0,
1754                 };
1755                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1756                         args.uid = current_fsuid();
1757                         if (parent->i_mode & S_ISGID)
1758                                 args.gid = parent->i_gid;
1759                         else
1760                                 args.gid = current_fsgid();
1761                 } else {
1762                         args.uid = INVALID_UID; /* no change */
1763                         args.gid = INVALID_GID; /* no change */
1764                 }
1765                 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1766                                        cifs_sb->local_nls,
1767                                        cifs_remap(cifs_sb));
1768         } else {
1769                 struct TCP_Server_Info *server = tcon->ses->server;
1770                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1771                     (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1772                         server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1773                                                    tcon, xid);
1774                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1775                         inode->i_mode = (mode | S_IFDIR);
1776
1777                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1778                         inode->i_uid = current_fsuid();
1779                         if (inode->i_mode & S_ISGID)
1780                                 inode->i_gid = parent->i_gid;
1781                         else
1782                                 inode->i_gid = current_fsgid();
1783                 }
1784         }
1785         d_instantiate(dentry, inode);
1786         return 0;
1787 }
1788
1789 static int
1790 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1791                  const char *full_path, struct cifs_sb_info *cifs_sb,
1792                  struct cifs_tcon *tcon, const unsigned int xid)
1793 {
1794         int rc = 0;
1795         u32 oplock = 0;
1796         FILE_UNIX_BASIC_INFO *info = NULL;
1797         struct inode *newinode = NULL;
1798         struct cifs_fattr fattr;
1799
1800         info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1801         if (info == NULL) {
1802                 rc = -ENOMEM;
1803                 goto posix_mkdir_out;
1804         }
1805
1806         mode &= ~current_umask();
1807         rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1808                              NULL /* netfid */, info, &oplock, full_path,
1809                              cifs_sb->local_nls, cifs_remap(cifs_sb));
1810         if (rc == -EOPNOTSUPP)
1811                 goto posix_mkdir_out;
1812         else if (rc) {
1813                 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1814                 d_drop(dentry);
1815                 goto posix_mkdir_out;
1816         }
1817
1818         if (info->Type == cpu_to_le32(-1))
1819                 /* no return info, go query for it */
1820                 goto posix_mkdir_get_info;
1821         /*
1822          * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1823          * need to set uid/gid.
1824          */
1825
1826         cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1827         cifs_fill_uniqueid(inode->i_sb, &fattr);
1828         newinode = cifs_iget(inode->i_sb, &fattr);
1829         if (!newinode)
1830                 goto posix_mkdir_get_info;
1831
1832         d_instantiate(dentry, newinode);
1833
1834 #ifdef CONFIG_CIFS_DEBUG2
1835         cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1836                  dentry, dentry, newinode);
1837
1838         if (newinode->i_nlink != 2)
1839                 cifs_dbg(FYI, "unexpected number of links %d\n",
1840                          newinode->i_nlink);
1841 #endif
1842
1843 posix_mkdir_out:
1844         kfree(info);
1845         return rc;
1846 posix_mkdir_get_info:
1847         rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1848                               xid);
1849         goto posix_mkdir_out;
1850 }
1851
1852 int cifs_mkdir(struct user_namespace *mnt_userns, struct inode *inode,
1853                struct dentry *direntry, umode_t mode)
1854 {
1855         int rc = 0;
1856         unsigned int xid;
1857         struct cifs_sb_info *cifs_sb;
1858         struct tcon_link *tlink;
1859         struct cifs_tcon *tcon;
1860         struct TCP_Server_Info *server;
1861         const char *full_path;
1862         void *page;
1863
1864         cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
1865                  mode, inode);
1866
1867         cifs_sb = CIFS_SB(inode->i_sb);
1868         if (unlikely(cifs_forced_shutdown(cifs_sb)))
1869                 return -EIO;
1870         tlink = cifs_sb_tlink(cifs_sb);
1871         if (IS_ERR(tlink))
1872                 return PTR_ERR(tlink);
1873         tcon = tlink_tcon(tlink);
1874
1875         xid = get_xid();
1876
1877         page = alloc_dentry_path();
1878         full_path = build_path_from_dentry(direntry, page);
1879         if (IS_ERR(full_path)) {
1880                 rc = PTR_ERR(full_path);
1881                 goto mkdir_out;
1882         }
1883
1884         server = tcon->ses->server;
1885
1886         if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
1887                 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
1888                                               cifs_sb);
1889                 d_drop(direntry); /* for time being always refresh inode info */
1890                 goto mkdir_out;
1891         }
1892
1893         if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1894                                 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1895                 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1896                                       tcon, xid);
1897                 if (rc != -EOPNOTSUPP)
1898                         goto mkdir_out;
1899         }
1900
1901         if (!server->ops->mkdir) {
1902                 rc = -ENOSYS;
1903                 goto mkdir_out;
1904         }
1905
1906         /* BB add setting the equivalent of mode via CreateX w/ACLs */
1907         rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
1908         if (rc) {
1909                 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1910                 d_drop(direntry);
1911                 goto mkdir_out;
1912         }
1913
1914         /* TODO: skip this for smb2/smb3 */
1915         rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1916                               xid);
1917 mkdir_out:
1918         /*
1919          * Force revalidate to get parent dir info when needed since cached
1920          * attributes are invalid now.
1921          */
1922         CIFS_I(inode)->time = 0;
1923         free_dentry_path(page);
1924         free_xid(xid);
1925         cifs_put_tlink(tlink);
1926         return rc;
1927 }
1928
1929 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1930 {
1931         int rc = 0;
1932         unsigned int xid;
1933         struct cifs_sb_info *cifs_sb;
1934         struct tcon_link *tlink;
1935         struct cifs_tcon *tcon;
1936         struct TCP_Server_Info *server;
1937         const char *full_path;
1938         void *page = alloc_dentry_path();
1939         struct cifsInodeInfo *cifsInode;
1940
1941         cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
1942
1943         xid = get_xid();
1944
1945         full_path = build_path_from_dentry(direntry, page);
1946         if (IS_ERR(full_path)) {
1947                 rc = PTR_ERR(full_path);
1948                 goto rmdir_exit;
1949         }
1950
1951         cifs_sb = CIFS_SB(inode->i_sb);
1952         if (unlikely(cifs_forced_shutdown(cifs_sb))) {
1953                 rc = -EIO;
1954                 goto rmdir_exit;
1955         }
1956
1957         tlink = cifs_sb_tlink(cifs_sb);
1958         if (IS_ERR(tlink)) {
1959                 rc = PTR_ERR(tlink);
1960                 goto rmdir_exit;
1961         }
1962         tcon = tlink_tcon(tlink);
1963         server = tcon->ses->server;
1964
1965         if (!server->ops->rmdir) {
1966                 rc = -ENOSYS;
1967                 cifs_put_tlink(tlink);
1968                 goto rmdir_exit;
1969         }
1970
1971         if (tcon->nodelete) {
1972                 rc = -EACCES;
1973                 cifs_put_tlink(tlink);
1974                 goto rmdir_exit;
1975         }
1976
1977         rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
1978         cifs_put_tlink(tlink);
1979
1980         if (!rc) {
1981                 spin_lock(&d_inode(direntry)->i_lock);
1982                 i_size_write(d_inode(direntry), 0);
1983                 clear_nlink(d_inode(direntry));
1984                 spin_unlock(&d_inode(direntry)->i_lock);
1985         }
1986
1987         cifsInode = CIFS_I(d_inode(direntry));
1988         /* force revalidate to go get info when needed */
1989         cifsInode->time = 0;
1990
1991         cifsInode = CIFS_I(inode);
1992         /*
1993          * Force revalidate to get parent dir info when needed since cached
1994          * attributes are invalid now.
1995          */
1996         cifsInode->time = 0;
1997
1998         d_inode(direntry)->i_ctime = inode->i_ctime = inode->i_mtime =
1999                 current_time(inode);
2000
2001 rmdir_exit:
2002         free_dentry_path(page);
2003         free_xid(xid);
2004         return rc;
2005 }
2006
2007 static int
2008 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2009                const char *from_path, struct dentry *to_dentry,
2010                const char *to_path)
2011 {
2012         struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2013         struct tcon_link *tlink;
2014         struct cifs_tcon *tcon;
2015         struct TCP_Server_Info *server;
2016         struct cifs_fid fid;
2017         struct cifs_open_parms oparms;
2018         int oplock, rc;
2019
2020         tlink = cifs_sb_tlink(cifs_sb);
2021         if (IS_ERR(tlink))
2022                 return PTR_ERR(tlink);
2023         tcon = tlink_tcon(tlink);
2024         server = tcon->ses->server;
2025
2026         if (!server->ops->rename)
2027                 return -ENOSYS;
2028
2029         /* try path-based rename first */
2030         rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
2031
2032         /*
2033          * Don't bother with rename by filehandle unless file is busy and
2034          * source. Note that cross directory moves do not work with
2035          * rename by filehandle to various Windows servers.
2036          */
2037         if (rc == 0 || rc != -EBUSY)
2038                 goto do_rename_exit;
2039
2040         /* Don't fall back to using SMB on SMB 2+ mount */
2041         if (server->vals->protocol_id != 0)
2042                 goto do_rename_exit;
2043
2044         /* open-file renames don't work across directories */
2045         if (to_dentry->d_parent != from_dentry->d_parent)
2046                 goto do_rename_exit;
2047
2048         oparms.tcon = tcon;
2049         oparms.cifs_sb = cifs_sb;
2050         /* open the file to be renamed -- we need DELETE perms */
2051         oparms.desired_access = DELETE;
2052         oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
2053         oparms.disposition = FILE_OPEN;
2054         oparms.path = from_path;
2055         oparms.fid = &fid;
2056         oparms.reconnect = false;
2057
2058         rc = CIFS_open(xid, &oparms, &oplock, NULL);
2059         if (rc == 0) {
2060                 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2061                                 (const char *) to_dentry->d_name.name,
2062                                 cifs_sb->local_nls, cifs_remap(cifs_sb));
2063                 CIFSSMBClose(xid, tcon, fid.netfid);
2064         }
2065 do_rename_exit:
2066         if (rc == 0)
2067                 d_move(from_dentry, to_dentry);
2068         cifs_put_tlink(tlink);
2069         return rc;
2070 }
2071
2072 int
2073 cifs_rename2(struct user_namespace *mnt_userns, struct inode *source_dir,
2074              struct dentry *source_dentry, struct inode *target_dir,
2075              struct dentry *target_dentry, unsigned int flags)
2076 {
2077         const char *from_name, *to_name;
2078         void *page1, *page2;
2079         struct cifs_sb_info *cifs_sb;
2080         struct tcon_link *tlink;
2081         struct cifs_tcon *tcon;
2082         FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2083         FILE_UNIX_BASIC_INFO *info_buf_target;
2084         unsigned int xid;
2085         int rc, tmprc;
2086         int retry_count = 0;
2087
2088         if (flags & ~RENAME_NOREPLACE)
2089                 return -EINVAL;
2090
2091         cifs_sb = CIFS_SB(source_dir->i_sb);
2092         if (unlikely(cifs_forced_shutdown(cifs_sb)))
2093                 return -EIO;
2094
2095         tlink = cifs_sb_tlink(cifs_sb);
2096         if (IS_ERR(tlink))
2097                 return PTR_ERR(tlink);
2098         tcon = tlink_tcon(tlink);
2099
2100         page1 = alloc_dentry_path();
2101         page2 = alloc_dentry_path();
2102         xid = get_xid();
2103
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;
2108         }
2109
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;
2114         }
2115
2116         cifs_close_deferred_file_under_dentry(tcon, from_name);
2117         if (d_inode(target_dentry) != NULL)
2118                 cifs_close_deferred_file_under_dentry(tcon, to_name);
2119
2120         rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2121                             to_name);
2122
2123         if (rc == -EACCES) {
2124                 while (retry_count < 3) {
2125                         cifs_close_all_deferred_files(tcon);
2126                         rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2127                                             to_name);
2128                         if (rc != -EACCES)
2129                                 break;
2130                         retry_count++;
2131                 }
2132         }
2133
2134         /*
2135          * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2136          */
2137         if (flags & RENAME_NOREPLACE)
2138                 goto cifs_rename_exit;
2139
2140         if (rc == -EEXIST && tcon->unix_ext) {
2141                 /*
2142                  * Are src and dst hardlinks of same inode? We can only tell
2143                  * with unix extensions enabled.
2144                  */
2145                 info_buf_source =
2146                         kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2147                                         GFP_KERNEL);
2148                 if (info_buf_source == NULL) {
2149                         rc = -ENOMEM;
2150                         goto cifs_rename_exit;
2151                 }
2152
2153                 info_buf_target = info_buf_source + 1;
2154                 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2155                                              info_buf_source,
2156                                              cifs_sb->local_nls,
2157                                              cifs_remap(cifs_sb));
2158                 if (tmprc != 0)
2159                         goto unlink_target;
2160
2161                 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2162                                              info_buf_target,
2163                                              cifs_sb->local_nls,
2164                                              cifs_remap(cifs_sb));
2165
2166                 if (tmprc == 0 && (info_buf_source->UniqueId ==
2167                                    info_buf_target->UniqueId)) {
2168                         /* same file, POSIX says that this is a noop */
2169                         rc = 0;
2170                         goto cifs_rename_exit;
2171                 }
2172         }
2173         /*
2174          * else ... BB we could add the same check for Windows by
2175          * checking the UniqueId via FILE_INTERNAL_INFO
2176          */
2177
2178 unlink_target:
2179         /* Try unlinking the target dentry if it's not negative */
2180         if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2181                 if (d_is_dir(target_dentry))
2182                         tmprc = cifs_rmdir(target_dir, target_dentry);
2183                 else
2184                         tmprc = cifs_unlink(target_dir, target_dentry);
2185                 if (tmprc)
2186                         goto cifs_rename_exit;
2187                 rc = cifs_do_rename(xid, source_dentry, from_name,
2188                                     target_dentry, to_name);
2189         }
2190
2191         /* force revalidate to go get info when needed */
2192         CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2193
2194         source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
2195                 target_dir->i_mtime = current_time(source_dir);
2196
2197 cifs_rename_exit:
2198         kfree(info_buf_source);
2199         free_dentry_path(page2);
2200         free_dentry_path(page1);
2201         free_xid(xid);
2202         cifs_put_tlink(tlink);
2203         return rc;
2204 }
2205
2206 static bool
2207 cifs_dentry_needs_reval(struct dentry *dentry)
2208 {
2209         struct inode *inode = d_inode(dentry);
2210         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2211         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2212         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2213         struct cached_fid *cfid = NULL;
2214
2215         if (cifs_i->time == 0)
2216                 return true;
2217
2218         if (CIFS_CACHE_READ(cifs_i))
2219                 return false;
2220
2221         if (!lookupCacheEnabled)
2222                 return true;
2223
2224         if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2225                 mutex_lock(&cfid->fid_mutex);
2226                 if (cfid->time && cifs_i->time > cfid->time) {
2227                         mutex_unlock(&cfid->fid_mutex);
2228                         close_cached_dir(cfid);
2229                         return false;
2230                 }
2231                 mutex_unlock(&cfid->fid_mutex);
2232                 close_cached_dir(cfid);
2233         }
2234         /*
2235          * depending on inode type, check if attribute caching disabled for
2236          * files or directories
2237          */
2238         if (S_ISDIR(inode->i_mode)) {
2239                 if (!cifs_sb->ctx->acdirmax)
2240                         return true;
2241                 if (!time_in_range(jiffies, cifs_i->time,
2242                                    cifs_i->time + cifs_sb->ctx->acdirmax))
2243                         return true;
2244         } else { /* file */
2245                 if (!cifs_sb->ctx->acregmax)
2246                         return true;
2247                 if (!time_in_range(jiffies, cifs_i->time,
2248                                    cifs_i->time + cifs_sb->ctx->acregmax))
2249                         return true;
2250         }
2251
2252         /* hardlinked files w/ noserverino get "special" treatment */
2253         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2254             S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2255                 return true;
2256
2257         return false;
2258 }
2259
2260 /*
2261  * Zap the cache. Called when invalid_mapping flag is set.
2262  */
2263 int
2264 cifs_invalidate_mapping(struct inode *inode)
2265 {
2266         int rc = 0;
2267
2268         if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2269                 rc = invalidate_inode_pages2(inode->i_mapping);
2270                 if (rc)
2271                         cifs_dbg(VFS, "%s: Could not invalidate inode %p\n",
2272                                  __func__, inode);
2273         }
2274
2275         cifs_fscache_reset_inode_cookie(inode);
2276         return rc;
2277 }
2278
2279 /**
2280  * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2281  *
2282  * @key:        currently unused
2283  * @mode:       the task state to sleep in
2284  */
2285 static int
2286 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2287 {
2288         freezable_schedule_unsafe();
2289         if (signal_pending_state(mode, current))
2290                 return -ERESTARTSYS;
2291         return 0;
2292 }
2293
2294 int
2295 cifs_revalidate_mapping(struct inode *inode)
2296 {
2297         int rc;
2298         unsigned long *flags = &CIFS_I(inode)->flags;
2299         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2300
2301         /* swapfiles are not supposed to be shared */
2302         if (IS_SWAPFILE(inode))
2303                 return 0;
2304
2305         rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2306                                      TASK_KILLABLE);
2307         if (rc)
2308                 return rc;
2309
2310         if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2311                 /* for cache=singleclient, do not invalidate */
2312                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2313                         goto skip_invalidate;
2314
2315                 rc = cifs_invalidate_mapping(inode);
2316                 if (rc)
2317                         set_bit(CIFS_INO_INVALID_MAPPING, flags);
2318         }
2319
2320 skip_invalidate:
2321         clear_bit_unlock(CIFS_INO_LOCK, flags);
2322         smp_mb__after_atomic();
2323         wake_up_bit(flags, CIFS_INO_LOCK);
2324
2325         return rc;
2326 }
2327
2328 int
2329 cifs_zap_mapping(struct inode *inode)
2330 {
2331         set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2332         return cifs_revalidate_mapping(inode);
2333 }
2334
2335 int cifs_revalidate_file_attr(struct file *filp)
2336 {
2337         int rc = 0;
2338         struct dentry *dentry = file_dentry(filp);
2339         struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2340
2341         if (!cifs_dentry_needs_reval(dentry))
2342                 return rc;
2343
2344         if (tlink_tcon(cfile->tlink)->unix_ext)
2345                 rc = cifs_get_file_info_unix(filp);
2346         else
2347                 rc = cifs_get_file_info(filp);
2348
2349         return rc;
2350 }
2351
2352 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2353 {
2354         unsigned int xid;
2355         int rc = 0;
2356         struct inode *inode = d_inode(dentry);
2357         struct super_block *sb = dentry->d_sb;
2358         const char *full_path;
2359         void *page;
2360         int count = 0;
2361
2362         if (inode == NULL)
2363                 return -ENOENT;
2364
2365         if (!cifs_dentry_needs_reval(dentry))
2366                 return rc;
2367
2368         xid = get_xid();
2369
2370         page = alloc_dentry_path();
2371         full_path = build_path_from_dentry(dentry, page);
2372         if (IS_ERR(full_path)) {
2373                 rc = PTR_ERR(full_path);
2374                 goto out;
2375         }
2376
2377         cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2378                  full_path, inode, inode->i_count.counter,
2379                  dentry, cifs_get_time(dentry), jiffies);
2380
2381 again:
2382         if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2383                 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2384         else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2385                 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2386         else
2387                 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2388                                          xid, NULL);
2389         if (rc == -EAGAIN && count++ < 10)
2390                 goto again;
2391 out:
2392         free_dentry_path(page);
2393         free_xid(xid);
2394
2395         return rc;
2396 }
2397
2398 int cifs_revalidate_file(struct file *filp)
2399 {
2400         int rc;
2401         struct inode *inode = file_inode(filp);
2402
2403         rc = cifs_revalidate_file_attr(filp);
2404         if (rc)
2405                 return rc;
2406
2407         return cifs_revalidate_mapping(inode);
2408 }
2409
2410 /* revalidate a dentry's inode attributes */
2411 int cifs_revalidate_dentry(struct dentry *dentry)
2412 {
2413         int rc;
2414         struct inode *inode = d_inode(dentry);
2415
2416         rc = cifs_revalidate_dentry_attr(dentry);
2417         if (rc)
2418                 return rc;
2419
2420         return cifs_revalidate_mapping(inode);
2421 }
2422
2423 int cifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
2424                  struct kstat *stat, u32 request_mask, unsigned int flags)
2425 {
2426         struct dentry *dentry = path->dentry;
2427         struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2428         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2429         struct inode *inode = d_inode(dentry);
2430         int rc;
2431
2432         if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2433                 return -EIO;
2434
2435         /*
2436          * We need to be sure that all dirty pages are written and the server
2437          * has actual ctime, mtime and file length.
2438          */
2439         if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2440             !CIFS_CACHE_READ(CIFS_I(inode)) &&
2441             inode->i_mapping && inode->i_mapping->nrpages != 0) {
2442                 rc = filemap_fdatawait(inode->i_mapping);
2443                 if (rc) {
2444                         mapping_set_error(inode->i_mapping, rc);
2445                         return rc;
2446                 }
2447         }
2448
2449         if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2450                 CIFS_I(inode)->time = 0; /* force revalidate */
2451
2452         /*
2453          * If the caller doesn't require syncing, only sync if
2454          * necessary (e.g. due to earlier truncate or setattr
2455          * invalidating the cached metadata)
2456          */
2457         if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2458             (CIFS_I(inode)->time == 0)) {
2459                 rc = cifs_revalidate_dentry_attr(dentry);
2460                 if (rc)
2461                         return rc;
2462         }
2463
2464         generic_fillattr(&init_user_ns, inode, stat);
2465         stat->blksize = cifs_sb->ctx->bsize;
2466         stat->ino = CIFS_I(inode)->uniqueid;
2467
2468         /* old CIFS Unix Extensions doesn't return create time */
2469         if (CIFS_I(inode)->createtime) {
2470                 stat->result_mask |= STATX_BTIME;
2471                 stat->btime =
2472                       cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2473         }
2474
2475         stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2476         if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2477                 stat->attributes |= STATX_ATTR_COMPRESSED;
2478         if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2479                 stat->attributes |= STATX_ATTR_ENCRYPTED;
2480
2481         /*
2482          * If on a multiuser mount without unix extensions or cifsacl being
2483          * enabled, and the admin hasn't overridden them, set the ownership
2484          * to the fsuid/fsgid of the current process.
2485          */
2486         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2487             !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2488             !tcon->unix_ext) {
2489                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2490                         stat->uid = current_fsuid();
2491                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2492                         stat->gid = current_fsgid();
2493         }
2494         return 0;
2495 }
2496
2497 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2498                 u64 len)
2499 {
2500         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2501         struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->vfs_inode.i_sb);
2502         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2503         struct TCP_Server_Info *server = tcon->ses->server;
2504         struct cifsFileInfo *cfile;
2505         int rc;
2506
2507         if (unlikely(cifs_forced_shutdown(cifs_sb)))
2508                 return -EIO;
2509
2510         /*
2511          * We need to be sure that all dirty pages are written as they
2512          * might fill holes on the server.
2513          */
2514         if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2515             inode->i_mapping->nrpages != 0) {
2516                 rc = filemap_fdatawait(inode->i_mapping);
2517                 if (rc) {
2518                         mapping_set_error(inode->i_mapping, rc);
2519                         return rc;
2520                 }
2521         }
2522
2523         cfile = find_readable_file(cifs_i, false);
2524         if (cfile == NULL)
2525                 return -EINVAL;
2526
2527         if (server->ops->fiemap) {
2528                 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2529                 cifsFileInfo_put(cfile);
2530                 return rc;
2531         }
2532
2533         cifsFileInfo_put(cfile);
2534         return -EOPNOTSUPP;
2535 }
2536
2537 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2538 {
2539         pgoff_t index = from >> PAGE_SHIFT;
2540         unsigned offset = from & (PAGE_SIZE - 1);
2541         struct page *page;
2542         int rc = 0;
2543
2544         page = grab_cache_page(mapping, index);
2545         if (!page)
2546                 return -ENOMEM;
2547
2548         zero_user_segment(page, offset, PAGE_SIZE);
2549         unlock_page(page);
2550         put_page(page);
2551         return rc;
2552 }
2553
2554 void cifs_setsize(struct inode *inode, loff_t offset)
2555 {
2556         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2557
2558         spin_lock(&inode->i_lock);
2559         i_size_write(inode, offset);
2560         spin_unlock(&inode->i_lock);
2561
2562         /* Cached inode must be refreshed on truncate */
2563         cifs_i->time = 0;
2564         truncate_pagecache(inode, offset);
2565 }
2566
2567 static int
2568 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2569                    unsigned int xid, const char *full_path)
2570 {
2571         int rc;
2572         struct cifsFileInfo *open_file;
2573         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2574         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2575         struct tcon_link *tlink = NULL;
2576         struct cifs_tcon *tcon = NULL;
2577         struct TCP_Server_Info *server;
2578
2579         /*
2580          * To avoid spurious oplock breaks from server, in the case of
2581          * inodes that we already have open, avoid doing path based
2582          * setting of file size if we can do it by handle.
2583          * This keeps our caching token (oplock) and avoids timeouts
2584          * when the local oplock break takes longer to flush
2585          * writebehind data than the SMB timeout for the SetPathInfo
2586          * request would allow
2587          */
2588         open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2589         if (open_file) {
2590                 tcon = tlink_tcon(open_file->tlink);
2591                 server = tcon->ses->server;
2592                 if (server->ops->set_file_size)
2593                         rc = server->ops->set_file_size(xid, tcon, open_file,
2594                                                         attrs->ia_size, false);
2595                 else
2596                         rc = -ENOSYS;
2597                 cifsFileInfo_put(open_file);
2598                 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2599         } else
2600                 rc = -EINVAL;
2601
2602         if (!rc)
2603                 goto set_size_out;
2604
2605         if (tcon == NULL) {
2606                 tlink = cifs_sb_tlink(cifs_sb);
2607                 if (IS_ERR(tlink))
2608                         return PTR_ERR(tlink);
2609                 tcon = tlink_tcon(tlink);
2610                 server = tcon->ses->server;
2611         }
2612
2613         /*
2614          * Set file size by pathname rather than by handle either because no
2615          * valid, writeable file handle for it was found or because there was
2616          * an error setting it by handle.
2617          */
2618         if (server->ops->set_path_size)
2619                 rc = server->ops->set_path_size(xid, tcon, full_path,
2620                                                 attrs->ia_size, cifs_sb, false);
2621         else
2622                 rc = -ENOSYS;
2623         cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2624
2625         if (tlink)
2626                 cifs_put_tlink(tlink);
2627
2628 set_size_out:
2629         if (rc == 0) {
2630                 cifsInode->server_eof = attrs->ia_size;
2631                 cifs_setsize(inode, attrs->ia_size);
2632                 /*
2633                  * i_blocks is not related to (i_size / i_blksize), but instead
2634                  * 512 byte (2**9) size is required for calculating num blocks.
2635                  * Until we can query the server for actual allocation size,
2636                  * this is best estimate we have for blocks allocated for a file
2637                  * Number of blocks must be rounded up so size 1 is not 0 blocks
2638                  */
2639                 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2640
2641                 /*
2642                  * The man page of truncate says if the size changed,
2643                  * then the st_ctime and st_mtime fields for the file
2644                  * are updated.
2645                  */
2646                 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2647                 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2648
2649                 cifs_truncate_page(inode->i_mapping, inode->i_size);
2650         }
2651
2652         return rc;
2653 }
2654
2655 static int
2656 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2657 {
2658         int rc;
2659         unsigned int xid;
2660         const char *full_path;
2661         void *page = alloc_dentry_path();
2662         struct inode *inode = d_inode(direntry);
2663         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2664         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2665         struct tcon_link *tlink;
2666         struct cifs_tcon *pTcon;
2667         struct cifs_unix_set_info_args *args = NULL;
2668         struct cifsFileInfo *open_file;
2669
2670         cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2671                  direntry, attrs->ia_valid);
2672
2673         xid = get_xid();
2674
2675         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2676                 attrs->ia_valid |= ATTR_FORCE;
2677
2678         rc = setattr_prepare(&init_user_ns, direntry, attrs);
2679         if (rc < 0)
2680                 goto out;
2681
2682         full_path = build_path_from_dentry(direntry, page);
2683         if (IS_ERR(full_path)) {
2684                 rc = PTR_ERR(full_path);
2685                 goto out;
2686         }
2687
2688         /*
2689          * Attempt to flush data before changing attributes. We need to do
2690          * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2691          * ownership or mode then we may also need to do this. Here, we take
2692          * the safe way out and just do the flush on all setattr requests. If
2693          * the flush returns error, store it to report later and continue.
2694          *
2695          * BB: This should be smarter. Why bother flushing pages that
2696          * will be truncated anyway? Also, should we error out here if
2697          * the flush returns error?
2698          */
2699         rc = filemap_write_and_wait(inode->i_mapping);
2700         if (is_interrupt_error(rc)) {
2701                 rc = -ERESTARTSYS;
2702                 goto out;
2703         }
2704
2705         mapping_set_error(inode->i_mapping, rc);
2706         rc = 0;
2707
2708         if (attrs->ia_valid & ATTR_SIZE) {
2709                 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2710                 if (rc != 0)
2711                         goto out;
2712         }
2713
2714         /* skip mode change if it's just for clearing setuid/setgid */
2715         if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2716                 attrs->ia_valid &= ~ATTR_MODE;
2717
2718         args = kmalloc(sizeof(*args), GFP_KERNEL);
2719         if (args == NULL) {
2720                 rc = -ENOMEM;
2721                 goto out;
2722         }
2723
2724         /* set up the struct */
2725         if (attrs->ia_valid & ATTR_MODE)
2726                 args->mode = attrs->ia_mode;
2727         else
2728                 args->mode = NO_CHANGE_64;
2729
2730         if (attrs->ia_valid & ATTR_UID)
2731                 args->uid = attrs->ia_uid;
2732         else
2733                 args->uid = INVALID_UID; /* no change */
2734
2735         if (attrs->ia_valid & ATTR_GID)
2736                 args->gid = attrs->ia_gid;
2737         else
2738                 args->gid = INVALID_GID; /* no change */
2739
2740         if (attrs->ia_valid & ATTR_ATIME)
2741                 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2742         else
2743                 args->atime = NO_CHANGE_64;
2744
2745         if (attrs->ia_valid & ATTR_MTIME)
2746                 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2747         else
2748                 args->mtime = NO_CHANGE_64;
2749
2750         if (attrs->ia_valid & ATTR_CTIME)
2751                 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2752         else
2753                 args->ctime = NO_CHANGE_64;
2754
2755         args->device = 0;
2756         open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2757         if (open_file) {
2758                 u16 nfid = open_file->fid.netfid;
2759                 u32 npid = open_file->pid;
2760                 pTcon = tlink_tcon(open_file->tlink);
2761                 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2762                 cifsFileInfo_put(open_file);
2763         } else {
2764                 tlink = cifs_sb_tlink(cifs_sb);
2765                 if (IS_ERR(tlink)) {
2766                         rc = PTR_ERR(tlink);
2767                         goto out;
2768                 }
2769                 pTcon = tlink_tcon(tlink);
2770                 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2771                                     cifs_sb->local_nls,
2772                                     cifs_remap(cifs_sb));
2773                 cifs_put_tlink(tlink);
2774         }
2775
2776         if (rc)
2777                 goto out;
2778
2779         if ((attrs->ia_valid & ATTR_SIZE) &&
2780             attrs->ia_size != i_size_read(inode))
2781                 truncate_setsize(inode, attrs->ia_size);
2782
2783         setattr_copy(&init_user_ns, inode, attrs);
2784         mark_inode_dirty(inode);
2785
2786         /* force revalidate when any of these times are set since some
2787            of the fs types (eg ext3, fat) do not have fine enough
2788            time granularity to match protocol, and we do not have a
2789            a way (yet) to query the server fs's time granularity (and
2790            whether it rounds times down).
2791         */
2792         if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2793                 cifsInode->time = 0;
2794 out:
2795         kfree(args);
2796         free_dentry_path(page);
2797         free_xid(xid);
2798         return rc;
2799 }
2800
2801 static int
2802 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2803 {
2804         unsigned int xid;
2805         kuid_t uid = INVALID_UID;
2806         kgid_t gid = INVALID_GID;
2807         struct inode *inode = d_inode(direntry);
2808         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2809         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2810         struct cifsFileInfo *wfile;
2811         struct cifs_tcon *tcon;
2812         const char *full_path;
2813         void *page = alloc_dentry_path();
2814         int rc = -EACCES;
2815         __u32 dosattr = 0;
2816         __u64 mode = NO_CHANGE_64;
2817
2818         xid = get_xid();
2819
2820         cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2821                  direntry, attrs->ia_valid);
2822
2823         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2824                 attrs->ia_valid |= ATTR_FORCE;
2825
2826         rc = setattr_prepare(&init_user_ns, direntry, attrs);
2827         if (rc < 0)
2828                 goto cifs_setattr_exit;
2829
2830         full_path = build_path_from_dentry(direntry, page);
2831         if (IS_ERR(full_path)) {
2832                 rc = PTR_ERR(full_path);
2833                 goto cifs_setattr_exit;
2834         }
2835
2836         /*
2837          * Attempt to flush data before changing attributes. We need to do
2838          * this for ATTR_SIZE and ATTR_MTIME.  If the flush of the data
2839          * returns error, store it to report later and continue.
2840          *
2841          * BB: This should be smarter. Why bother flushing pages that
2842          * will be truncated anyway? Also, should we error out here if
2843          * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
2844          */
2845         if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
2846                 rc = filemap_write_and_wait(inode->i_mapping);
2847                 if (is_interrupt_error(rc)) {
2848                         rc = -ERESTARTSYS;
2849                         goto cifs_setattr_exit;
2850                 }
2851                 mapping_set_error(inode->i_mapping, rc);
2852         }
2853
2854         rc = 0;
2855
2856         if ((attrs->ia_valid & ATTR_MTIME) &&
2857             !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2858                 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
2859                 if (!rc) {
2860                         tcon = tlink_tcon(wfile->tlink);
2861                         rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
2862                         cifsFileInfo_put(wfile);
2863                         if (rc)
2864                                 goto cifs_setattr_exit;
2865                 } else if (rc != -EBADF)
2866                         goto cifs_setattr_exit;
2867                 else
2868                         rc = 0;
2869         }
2870
2871         if (attrs->ia_valid & ATTR_SIZE) {
2872                 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2873                 if (rc != 0)
2874                         goto cifs_setattr_exit;
2875         }
2876
2877         if (attrs->ia_valid & ATTR_UID)
2878                 uid = attrs->ia_uid;
2879
2880         if (attrs->ia_valid & ATTR_GID)
2881                 gid = attrs->ia_gid;
2882
2883         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2884             (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2885                 if (uid_valid(uid) || gid_valid(gid)) {
2886                         mode = NO_CHANGE_64;
2887                         rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2888                                                         uid, gid);
2889                         if (rc) {
2890                                 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2891                                          __func__, rc);
2892                                 goto cifs_setattr_exit;
2893                         }
2894                 }
2895         } else
2896         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2897                 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2898
2899         /* skip mode change if it's just for clearing setuid/setgid */
2900         if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2901                 attrs->ia_valid &= ~ATTR_MODE;
2902
2903         if (attrs->ia_valid & ATTR_MODE) {
2904                 mode = attrs->ia_mode;
2905                 rc = 0;
2906                 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
2907                     (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
2908                         rc = id_mode_to_cifs_acl(inode, full_path, &mode,
2909                                                 INVALID_UID, INVALID_GID);
2910                         if (rc) {
2911                                 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2912                                          __func__, rc);
2913                                 goto cifs_setattr_exit;
2914                         }
2915
2916                         /*
2917                          * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
2918                          * Pick up the actual mode bits that were set.
2919                          */
2920                         if (mode != attrs->ia_mode)
2921                                 attrs->ia_mode = mode;
2922                 } else
2923                 if (((mode & S_IWUGO) == 0) &&
2924                     (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
2925
2926                         dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2927
2928                         /* fix up mode if we're not using dynperm */
2929                         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2930                                 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2931                 } else if ((mode & S_IWUGO) &&
2932                            (cifsInode->cifsAttrs & ATTR_READONLY)) {
2933
2934                         dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2935                         /* Attributes of 0 are ignored */
2936                         if (dosattr == 0)
2937                                 dosattr |= ATTR_NORMAL;
2938
2939                         /* reset local inode permissions to normal */
2940                         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2941                                 attrs->ia_mode &= ~(S_IALLUGO);
2942                                 if (S_ISDIR(inode->i_mode))
2943                                         attrs->ia_mode |=
2944                                                 cifs_sb->ctx->dir_mode;
2945                                 else
2946                                         attrs->ia_mode |=
2947                                                 cifs_sb->ctx->file_mode;
2948                         }
2949                 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2950                         /* ignore mode change - ATTR_READONLY hasn't changed */
2951                         attrs->ia_valid &= ~ATTR_MODE;
2952                 }
2953         }
2954
2955         if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2956             ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2957                 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2958                 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2959
2960                 /* Even if error on time set, no sense failing the call if
2961                 the server would set the time to a reasonable value anyway,
2962                 and this check ensures that we are not being called from
2963                 sys_utimes in which case we ought to fail the call back to
2964                 the user when the server rejects the call */
2965                 if ((rc) && (attrs->ia_valid &
2966                                 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
2967                         rc = 0;
2968         }
2969
2970         /* do not need local check to inode_check_ok since the server does
2971            that */
2972         if (rc)
2973                 goto cifs_setattr_exit;
2974
2975         if ((attrs->ia_valid & ATTR_SIZE) &&
2976             attrs->ia_size != i_size_read(inode))
2977                 truncate_setsize(inode, attrs->ia_size);
2978
2979         setattr_copy(&init_user_ns, inode, attrs);
2980         mark_inode_dirty(inode);
2981
2982 cifs_setattr_exit:
2983         free_xid(xid);
2984         free_dentry_path(page);
2985         return rc;
2986 }
2987
2988 int
2989 cifs_setattr(struct user_namespace *mnt_userns, struct dentry *direntry,
2990              struct iattr *attrs)
2991 {
2992         struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
2993         struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
2994         int rc, retries = 0;
2995
2996         if (unlikely(cifs_forced_shutdown(cifs_sb)))
2997                 return -EIO;
2998
2999         do {
3000                 if (pTcon->unix_ext)
3001                         rc = cifs_setattr_unix(direntry, attrs);
3002                 else
3003                         rc = cifs_setattr_nounix(direntry, attrs);
3004                 retries++;
3005         } while (is_retryable_error(rc) && retries < 2);
3006
3007         /* BB: add cifs_setattr_legacy for really old servers */
3008         return rc;
3009 }