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