cifs: Fix duplicate fscache cookie warnings
[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         /* [!] The compared values must be the same in struct cifs_fscache_inode_key. */
1355
1356         /* don't match inode with different uniqueid */
1357         if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1358                 return 0;
1359
1360         /* use createtime like an i_generation field */
1361         if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1362                 return 0;
1363
1364         /* don't match inode of different type */
1365         if (inode_wrong_type(inode, fattr->cf_mode))
1366                 return 0;
1367
1368         /* if it's not a directory or has no dentries, then flag it */
1369         if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1370                 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1371
1372         return 1;
1373 }
1374
1375 static int
1376 cifs_init_inode(struct inode *inode, void *opaque)
1377 {
1378         struct cifs_fattr *fattr = opaque;
1379
1380         CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1381         CIFS_I(inode)->createtime = fattr->cf_createtime;
1382         return 0;
1383 }
1384
1385 /*
1386  * walk dentry list for an inode and report whether it has aliases that
1387  * are hashed. We use this to determine if a directory inode can actually
1388  * be used.
1389  */
1390 static bool
1391 inode_has_hashed_dentries(struct inode *inode)
1392 {
1393         struct dentry *dentry;
1394
1395         spin_lock(&inode->i_lock);
1396         hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1397                 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1398                         spin_unlock(&inode->i_lock);
1399                         return true;
1400                 }
1401         }
1402         spin_unlock(&inode->i_lock);
1403         return false;
1404 }
1405
1406 /* Given fattrs, get a corresponding inode */
1407 struct inode *
1408 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1409 {
1410         unsigned long hash;
1411         struct inode *inode;
1412
1413 retry_iget5_locked:
1414         cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1415
1416         /* hash down to 32-bits on 32-bit arch */
1417         hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1418
1419         inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1420         if (inode) {
1421                 /* was there a potentially problematic inode collision? */
1422                 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1423                         fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1424
1425                         if (inode_has_hashed_dentries(inode)) {
1426                                 cifs_autodisable_serverino(CIFS_SB(sb));
1427                                 iput(inode);
1428                                 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1429                                 goto retry_iget5_locked;
1430                         }
1431                 }
1432
1433                 /* can't fail - see cifs_find_inode() */
1434                 cifs_fattr_to_inode(inode, fattr, false);
1435                 if (sb->s_flags & SB_NOATIME)
1436                         inode->i_flags |= S_NOATIME | S_NOCMTIME;
1437                 if (inode->i_state & I_NEW) {
1438                         inode->i_ino = hash;
1439                         cifs_fscache_get_inode_cookie(inode);
1440                         unlock_new_inode(inode);
1441                 }
1442         }
1443
1444         return inode;
1445 }
1446
1447 /* gets root inode */
1448 struct inode *cifs_root_iget(struct super_block *sb)
1449 {
1450         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1451         struct cifs_fattr fattr = {};
1452         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1453         struct inode *inode = NULL;
1454         unsigned int xid;
1455         char *path = NULL;
1456         int len;
1457         int rc;
1458
1459         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1460             && cifs_sb->prepath) {
1461                 len = strlen(cifs_sb->prepath);
1462                 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1463                 if (path == NULL)
1464                         return ERR_PTR(-ENOMEM);
1465                 path[0] = '/';
1466                 memcpy(path+1, cifs_sb->prepath, len);
1467         } else {
1468                 path = kstrdup("", GFP_KERNEL);
1469                 if (path == NULL)
1470                         return ERR_PTR(-ENOMEM);
1471         }
1472
1473         xid = get_xid();
1474         if (tcon->unix_ext) {
1475                 rc = cifs_get_unix_fattr(path, sb, &fattr, &inode, xid);
1476                 /* some servers mistakenly claim POSIX support */
1477                 if (rc != -EOPNOTSUPP)
1478                         goto iget_root;
1479                 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1480                 tcon->unix_ext = false;
1481         }
1482
1483         convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1484         if (tcon->posix_extensions)
1485                 rc = smb311_posix_get_fattr(NULL, &fattr, path, sb, xid);
1486         else
1487                 rc = cifs_get_fattr(NULL, sb, xid, NULL, &fattr, &inode, path);
1488
1489 iget_root:
1490         if (!rc) {
1491                 if (fattr.cf_flags & CIFS_FATTR_JUNCTION) {
1492                         fattr.cf_flags &= ~CIFS_FATTR_JUNCTION;
1493                         cifs_autodisable_serverino(cifs_sb);
1494                 }
1495                 inode = cifs_iget(sb, &fattr);
1496         }
1497
1498         if (!inode) {
1499                 inode = ERR_PTR(rc);
1500                 goto out;
1501         }
1502
1503         if (!rc && fattr.cf_flags & CIFS_FATTR_DELETE_PENDING)
1504                 cifs_mark_open_handles_for_deleted_file(inode, path);
1505
1506         if (rc && tcon->pipe) {
1507                 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1508                 spin_lock(&inode->i_lock);
1509                 inode->i_mode |= S_IFDIR;
1510                 set_nlink(inode, 2);
1511                 inode->i_op = &cifs_ipc_inode_ops;
1512                 inode->i_fop = &simple_dir_operations;
1513                 inode->i_uid = cifs_sb->ctx->linux_uid;
1514                 inode->i_gid = cifs_sb->ctx->linux_gid;
1515                 spin_unlock(&inode->i_lock);
1516         } else if (rc) {
1517                 iget_failed(inode);
1518                 inode = ERR_PTR(rc);
1519         }
1520
1521 out:
1522         kfree(path);
1523         free_xid(xid);
1524         kfree(fattr.cf_symlink_target);
1525         return inode;
1526 }
1527
1528 int
1529 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1530                    const char *full_path, __u32 dosattr)
1531 {
1532         bool set_time = false;
1533         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1534         struct TCP_Server_Info *server;
1535         FILE_BASIC_INFO info_buf;
1536
1537         if (attrs == NULL)
1538                 return -EINVAL;
1539
1540         server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1541         if (!server->ops->set_file_info)
1542                 return -ENOSYS;
1543
1544         info_buf.Pad = 0;
1545
1546         if (attrs->ia_valid & ATTR_ATIME) {
1547                 set_time = true;
1548                 info_buf.LastAccessTime =
1549                         cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1550         } else
1551                 info_buf.LastAccessTime = 0;
1552
1553         if (attrs->ia_valid & ATTR_MTIME) {
1554                 set_time = true;
1555                 info_buf.LastWriteTime =
1556                     cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1557         } else
1558                 info_buf.LastWriteTime = 0;
1559
1560         /*
1561          * Samba throws this field away, but windows may actually use it.
1562          * Do not set ctime unless other time stamps are changed explicitly
1563          * (i.e. by utimes()) since we would then have a mix of client and
1564          * server times.
1565          */
1566         if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1567                 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1568                 info_buf.ChangeTime =
1569                     cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1570         } else
1571                 info_buf.ChangeTime = 0;
1572
1573         info_buf.CreationTime = 0;      /* don't change */
1574         info_buf.Attributes = cpu_to_le32(dosattr);
1575
1576         return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1577 }
1578
1579 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1580 /*
1581  * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1582  * and rename it to a random name that hopefully won't conflict with
1583  * anything else.
1584  */
1585 int
1586 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1587                            const unsigned int xid)
1588 {
1589         int oplock = 0;
1590         int rc;
1591         struct cifs_fid fid;
1592         struct cifs_open_parms oparms;
1593         struct inode *inode = d_inode(dentry);
1594         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1595         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1596         struct tcon_link *tlink;
1597         struct cifs_tcon *tcon;
1598         __u32 dosattr, origattr;
1599         FILE_BASIC_INFO *info_buf = NULL;
1600
1601         tlink = cifs_sb_tlink(cifs_sb);
1602         if (IS_ERR(tlink))
1603                 return PTR_ERR(tlink);
1604         tcon = tlink_tcon(tlink);
1605
1606         /*
1607          * We cannot rename the file if the server doesn't support
1608          * CAP_INFOLEVEL_PASSTHRU
1609          */
1610         if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1611                 rc = -EBUSY;
1612                 goto out;
1613         }
1614
1615         oparms = (struct cifs_open_parms) {
1616                 .tcon = tcon,
1617                 .cifs_sb = cifs_sb,
1618                 .desired_access = DELETE | FILE_WRITE_ATTRIBUTES,
1619                 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
1620                 .disposition = FILE_OPEN,
1621                 .path = full_path,
1622                 .fid = &fid,
1623         };
1624
1625         rc = CIFS_open(xid, &oparms, &oplock, NULL);
1626         if (rc != 0)
1627                 goto out;
1628
1629         origattr = cifsInode->cifsAttrs;
1630         if (origattr == 0)
1631                 origattr |= ATTR_NORMAL;
1632
1633         dosattr = origattr & ~ATTR_READONLY;
1634         if (dosattr == 0)
1635                 dosattr |= ATTR_NORMAL;
1636         dosattr |= ATTR_HIDDEN;
1637
1638         /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1639         if (dosattr != origattr) {
1640                 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1641                 if (info_buf == NULL) {
1642                         rc = -ENOMEM;
1643                         goto out_close;
1644                 }
1645                 info_buf->Attributes = cpu_to_le32(dosattr);
1646                 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1647                                         current->tgid);
1648                 /* although we would like to mark the file hidden
1649                    if that fails we will still try to rename it */
1650                 if (!rc)
1651                         cifsInode->cifsAttrs = dosattr;
1652                 else
1653                         dosattr = origattr; /* since not able to change them */
1654         }
1655
1656         /* rename the file */
1657         rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1658                                    cifs_sb->local_nls,
1659                                    cifs_remap(cifs_sb));
1660         if (rc != 0) {
1661                 rc = -EBUSY;
1662                 goto undo_setattr;
1663         }
1664
1665         /* try to set DELETE_ON_CLOSE */
1666         if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1667                 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1668                                                current->tgid);
1669                 /*
1670                  * some samba versions return -ENOENT when we try to set the
1671                  * file disposition here. Likely a samba bug, but work around
1672                  * it for now. This means that some cifsXXX files may hang
1673                  * around after they shouldn't.
1674                  *
1675                  * BB: remove this hack after more servers have the fix
1676                  */
1677                 if (rc == -ENOENT)
1678                         rc = 0;
1679                 else if (rc != 0) {
1680                         rc = -EBUSY;
1681                         goto undo_rename;
1682                 }
1683                 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1684         }
1685
1686 out_close:
1687         CIFSSMBClose(xid, tcon, fid.netfid);
1688 out:
1689         kfree(info_buf);
1690         cifs_put_tlink(tlink);
1691         return rc;
1692
1693         /*
1694          * reset everything back to the original state. Don't bother
1695          * dealing with errors here since we can't do anything about
1696          * them anyway.
1697          */
1698 undo_rename:
1699         CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1700                                 cifs_sb->local_nls, cifs_remap(cifs_sb));
1701 undo_setattr:
1702         if (dosattr != origattr) {
1703                 info_buf->Attributes = cpu_to_le32(origattr);
1704                 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1705                                         current->tgid))
1706                         cifsInode->cifsAttrs = origattr;
1707         }
1708
1709         goto out_close;
1710 }
1711 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1712
1713 /* copied from fs/nfs/dir.c with small changes */
1714 static void
1715 cifs_drop_nlink(struct inode *inode)
1716 {
1717         spin_lock(&inode->i_lock);
1718         if (inode->i_nlink > 0)
1719                 drop_nlink(inode);
1720         spin_unlock(&inode->i_lock);
1721 }
1722
1723 /*
1724  * If d_inode(dentry) is null (usually meaning the cached dentry
1725  * is a negative dentry) then we would attempt a standard SMB delete, but
1726  * if that fails we can not attempt the fall back mechanisms on EACCES
1727  * but will return the EACCES to the caller. Note that the VFS does not call
1728  * unlink on negative dentries currently.
1729  */
1730 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1731 {
1732         int rc = 0;
1733         unsigned int xid;
1734         const char *full_path;
1735         void *page;
1736         struct inode *inode = d_inode(dentry);
1737         struct cifsInodeInfo *cifs_inode;
1738         struct super_block *sb = dir->i_sb;
1739         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1740         struct tcon_link *tlink;
1741         struct cifs_tcon *tcon;
1742         struct TCP_Server_Info *server;
1743         struct iattr *attrs = NULL;
1744         __u32 dosattr = 0, origattr = 0;
1745
1746         cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1747
1748         if (unlikely(cifs_forced_shutdown(cifs_sb)))
1749                 return -EIO;
1750
1751         tlink = cifs_sb_tlink(cifs_sb);
1752         if (IS_ERR(tlink))
1753                 return PTR_ERR(tlink);
1754         tcon = tlink_tcon(tlink);
1755         server = tcon->ses->server;
1756
1757         xid = get_xid();
1758         page = alloc_dentry_path();
1759
1760         if (tcon->nodelete) {
1761                 rc = -EACCES;
1762                 goto unlink_out;
1763         }
1764
1765         /* Unlink can be called from rename so we can not take the
1766          * sb->s_vfs_rename_mutex here */
1767         full_path = build_path_from_dentry(dentry, page);
1768         if (IS_ERR(full_path)) {
1769                 rc = PTR_ERR(full_path);
1770                 goto unlink_out;
1771         }
1772
1773         cifs_close_deferred_file_under_dentry(tcon, full_path);
1774 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1775         if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1776                                 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1777                 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1778                         SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1779                         cifs_remap(cifs_sb));
1780                 cifs_dbg(FYI, "posix del rc %d\n", rc);
1781                 if ((rc == 0) || (rc == -ENOENT))
1782                         goto psx_del_no_retry;
1783         }
1784 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1785
1786 retry_std_delete:
1787         if (!server->ops->unlink) {
1788                 rc = -ENOSYS;
1789                 goto psx_del_no_retry;
1790         }
1791
1792         rc = server->ops->unlink(xid, tcon, full_path, cifs_sb, dentry);
1793
1794 psx_del_no_retry:
1795         if (!rc) {
1796                 if (inode) {
1797                         cifs_mark_open_handles_for_deleted_file(inode, full_path);
1798                         cifs_drop_nlink(inode);
1799                 }
1800         } else if (rc == -ENOENT) {
1801                 d_drop(dentry);
1802         } else if (rc == -EBUSY) {
1803                 if (server->ops->rename_pending_delete) {
1804                         rc = server->ops->rename_pending_delete(full_path,
1805                                                                 dentry, xid);
1806                         if (rc == 0) {
1807                                 cifs_mark_open_handles_for_deleted_file(inode, full_path);
1808                                 cifs_drop_nlink(inode);
1809                         }
1810                 }
1811         } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1812                 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1813                 if (attrs == NULL) {
1814                         rc = -ENOMEM;
1815                         goto out_reval;
1816                 }
1817
1818                 /* try to reset dos attributes */
1819                 cifs_inode = CIFS_I(inode);
1820                 origattr = cifs_inode->cifsAttrs;
1821                 if (origattr == 0)
1822                         origattr |= ATTR_NORMAL;
1823                 dosattr = origattr & ~ATTR_READONLY;
1824                 if (dosattr == 0)
1825                         dosattr |= ATTR_NORMAL;
1826                 dosattr |= ATTR_HIDDEN;
1827
1828                 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1829                 if (rc != 0)
1830                         goto out_reval;
1831
1832                 goto retry_std_delete;
1833         }
1834
1835         /* undo the setattr if we errored out and it's needed */
1836         if (rc != 0 && dosattr != 0)
1837                 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1838
1839 out_reval:
1840         if (inode) {
1841                 cifs_inode = CIFS_I(inode);
1842                 cifs_inode->time = 0;   /* will force revalidate to get info
1843                                            when needed */
1844                 inode_set_ctime_current(inode);
1845         }
1846         inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
1847         cifs_inode = CIFS_I(dir);
1848         CIFS_I(dir)->time = 0;  /* force revalidate of dir as well */
1849 unlink_out:
1850         free_dentry_path(page);
1851         kfree(attrs);
1852         free_xid(xid);
1853         cifs_put_tlink(tlink);
1854         return rc;
1855 }
1856
1857 static int
1858 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1859                  const char *full_path, struct cifs_sb_info *cifs_sb,
1860                  struct cifs_tcon *tcon, const unsigned int xid)
1861 {
1862         int rc = 0;
1863         struct inode *inode = NULL;
1864
1865         if (tcon->posix_extensions) {
1866                 rc = smb311_posix_get_inode_info(&inode, full_path,
1867                                                  NULL, parent->i_sb, xid);
1868 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1869         } else if (tcon->unix_ext) {
1870                 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1871                                               xid);
1872 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1873         } else {
1874                 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1875                                          xid, NULL);
1876         }
1877
1878         if (rc)
1879                 return rc;
1880
1881         if (!S_ISDIR(inode->i_mode)) {
1882                 /*
1883                  * mkdir succeeded, but another client has managed to remove the
1884                  * sucker and replace it with non-directory.  Return success,
1885                  * but don't leave the child in dcache.
1886                  */
1887                  iput(inode);
1888                  d_drop(dentry);
1889                  return 0;
1890         }
1891         /*
1892          * setting nlink not necessary except in cases where we failed to get it
1893          * from the server or was set bogus. Also, since this is a brand new
1894          * inode, no need to grab the i_lock before setting the i_nlink.
1895          */
1896         if (inode->i_nlink < 2)
1897                 set_nlink(inode, 2);
1898         mode &= ~current_umask();
1899         /* must turn on setgid bit if parent dir has it */
1900         if (parent->i_mode & S_ISGID)
1901                 mode |= S_ISGID;
1902
1903 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1904         if (tcon->unix_ext) {
1905                 struct cifs_unix_set_info_args args = {
1906                         .mode   = mode,
1907                         .ctime  = NO_CHANGE_64,
1908                         .atime  = NO_CHANGE_64,
1909                         .mtime  = NO_CHANGE_64,
1910                         .device = 0,
1911                 };
1912                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1913                         args.uid = current_fsuid();
1914                         if (parent->i_mode & S_ISGID)
1915                                 args.gid = parent->i_gid;
1916                         else
1917                                 args.gid = current_fsgid();
1918                 } else {
1919                         args.uid = INVALID_UID; /* no change */
1920                         args.gid = INVALID_GID; /* no change */
1921                 }
1922                 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1923                                        cifs_sb->local_nls,
1924                                        cifs_remap(cifs_sb));
1925         } else {
1926 #else
1927         {
1928 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1929                 struct TCP_Server_Info *server = tcon->ses->server;
1930                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1931                     (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1932                         server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1933                                                    tcon, xid);
1934                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1935                         inode->i_mode = (mode | S_IFDIR);
1936
1937                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1938                         inode->i_uid = current_fsuid();
1939                         if (inode->i_mode & S_ISGID)
1940                                 inode->i_gid = parent->i_gid;
1941                         else
1942                                 inode->i_gid = current_fsgid();
1943                 }
1944         }
1945         d_instantiate(dentry, inode);
1946         return 0;
1947 }
1948
1949 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1950 static int
1951 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1952                  const char *full_path, struct cifs_sb_info *cifs_sb,
1953                  struct cifs_tcon *tcon, const unsigned int xid)
1954 {
1955         int rc = 0;
1956         u32 oplock = 0;
1957         FILE_UNIX_BASIC_INFO *info = NULL;
1958         struct inode *newinode = NULL;
1959         struct cifs_fattr fattr;
1960
1961         info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1962         if (info == NULL) {
1963                 rc = -ENOMEM;
1964                 goto posix_mkdir_out;
1965         }
1966
1967         mode &= ~current_umask();
1968         rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1969                              NULL /* netfid */, info, &oplock, full_path,
1970                              cifs_sb->local_nls, cifs_remap(cifs_sb));
1971         if (rc == -EOPNOTSUPP)
1972                 goto posix_mkdir_out;
1973         else if (rc) {
1974                 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1975                 d_drop(dentry);
1976                 goto posix_mkdir_out;
1977         }
1978
1979         if (info->Type == cpu_to_le32(-1))
1980                 /* no return info, go query for it */
1981                 goto posix_mkdir_get_info;
1982         /*
1983          * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1984          * need to set uid/gid.
1985          */
1986
1987         cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1988         cifs_fill_uniqueid(inode->i_sb, &fattr);
1989         newinode = cifs_iget(inode->i_sb, &fattr);
1990         if (!newinode)
1991                 goto posix_mkdir_get_info;
1992
1993         d_instantiate(dentry, newinode);
1994
1995 #ifdef CONFIG_CIFS_DEBUG2
1996         cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1997                  dentry, dentry, newinode);
1998
1999         if (newinode->i_nlink != 2)
2000                 cifs_dbg(FYI, "unexpected number of links %d\n",
2001                          newinode->i_nlink);
2002 #endif
2003
2004 posix_mkdir_out:
2005         kfree(info);
2006         return rc;
2007 posix_mkdir_get_info:
2008         rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
2009                               xid);
2010         goto posix_mkdir_out;
2011 }
2012 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2013
2014 int cifs_mkdir(struct mnt_idmap *idmap, struct inode *inode,
2015                struct dentry *direntry, umode_t mode)
2016 {
2017         int rc = 0;
2018         unsigned int xid;
2019         struct cifs_sb_info *cifs_sb;
2020         struct tcon_link *tlink;
2021         struct cifs_tcon *tcon;
2022         struct TCP_Server_Info *server;
2023         const char *full_path;
2024         void *page;
2025
2026         cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
2027                  mode, inode);
2028
2029         cifs_sb = CIFS_SB(inode->i_sb);
2030         if (unlikely(cifs_forced_shutdown(cifs_sb)))
2031                 return -EIO;
2032         tlink = cifs_sb_tlink(cifs_sb);
2033         if (IS_ERR(tlink))
2034                 return PTR_ERR(tlink);
2035         tcon = tlink_tcon(tlink);
2036
2037         xid = get_xid();
2038
2039         page = alloc_dentry_path();
2040         full_path = build_path_from_dentry(direntry, page);
2041         if (IS_ERR(full_path)) {
2042                 rc = PTR_ERR(full_path);
2043                 goto mkdir_out;
2044         }
2045
2046         server = tcon->ses->server;
2047
2048         if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
2049                 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
2050                                               cifs_sb);
2051                 d_drop(direntry); /* for time being always refresh inode info */
2052                 goto mkdir_out;
2053         }
2054
2055 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2056         if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
2057                                 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
2058                 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
2059                                       tcon, xid);
2060                 if (rc != -EOPNOTSUPP)
2061                         goto mkdir_out;
2062         }
2063 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2064
2065         if (!server->ops->mkdir) {
2066                 rc = -ENOSYS;
2067                 goto mkdir_out;
2068         }
2069
2070         /* BB add setting the equivalent of mode via CreateX w/ACLs */
2071         rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
2072         if (rc) {
2073                 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
2074                 d_drop(direntry);
2075                 goto mkdir_out;
2076         }
2077
2078         /* TODO: skip this for smb2/smb3 */
2079         rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
2080                               xid);
2081 mkdir_out:
2082         /*
2083          * Force revalidate to get parent dir info when needed since cached
2084          * attributes are invalid now.
2085          */
2086         CIFS_I(inode)->time = 0;
2087         free_dentry_path(page);
2088         free_xid(xid);
2089         cifs_put_tlink(tlink);
2090         return rc;
2091 }
2092
2093 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
2094 {
2095         int rc = 0;
2096         unsigned int xid;
2097         struct cifs_sb_info *cifs_sb;
2098         struct tcon_link *tlink;
2099         struct cifs_tcon *tcon;
2100         struct TCP_Server_Info *server;
2101         const char *full_path;
2102         void *page = alloc_dentry_path();
2103         struct cifsInodeInfo *cifsInode;
2104
2105         cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
2106
2107         xid = get_xid();
2108
2109         full_path = build_path_from_dentry(direntry, page);
2110         if (IS_ERR(full_path)) {
2111                 rc = PTR_ERR(full_path);
2112                 goto rmdir_exit;
2113         }
2114
2115         cifs_sb = CIFS_SB(inode->i_sb);
2116         if (unlikely(cifs_forced_shutdown(cifs_sb))) {
2117                 rc = -EIO;
2118                 goto rmdir_exit;
2119         }
2120
2121         tlink = cifs_sb_tlink(cifs_sb);
2122         if (IS_ERR(tlink)) {
2123                 rc = PTR_ERR(tlink);
2124                 goto rmdir_exit;
2125         }
2126         tcon = tlink_tcon(tlink);
2127         server = tcon->ses->server;
2128
2129         if (!server->ops->rmdir) {
2130                 rc = -ENOSYS;
2131                 cifs_put_tlink(tlink);
2132                 goto rmdir_exit;
2133         }
2134
2135         if (tcon->nodelete) {
2136                 rc = -EACCES;
2137                 cifs_put_tlink(tlink);
2138                 goto rmdir_exit;
2139         }
2140
2141         rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
2142         cifs_put_tlink(tlink);
2143
2144         if (!rc) {
2145                 spin_lock(&d_inode(direntry)->i_lock);
2146                 i_size_write(d_inode(direntry), 0);
2147                 clear_nlink(d_inode(direntry));
2148                 spin_unlock(&d_inode(direntry)->i_lock);
2149         }
2150
2151         cifsInode = CIFS_I(d_inode(direntry));
2152         /* force revalidate to go get info when needed */
2153         cifsInode->time = 0;
2154
2155         cifsInode = CIFS_I(inode);
2156         /*
2157          * Force revalidate to get parent dir info when needed since cached
2158          * attributes are invalid now.
2159          */
2160         cifsInode->time = 0;
2161
2162         inode_set_ctime_current(d_inode(direntry));
2163         inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
2164
2165 rmdir_exit:
2166         free_dentry_path(page);
2167         free_xid(xid);
2168         return rc;
2169 }
2170
2171 static int
2172 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2173                const char *from_path, struct dentry *to_dentry,
2174                const char *to_path)
2175 {
2176         struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2177         struct tcon_link *tlink;
2178         struct cifs_tcon *tcon;
2179         struct TCP_Server_Info *server;
2180 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2181         struct cifs_fid fid;
2182         struct cifs_open_parms oparms;
2183         int oplock;
2184 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2185         int rc;
2186
2187         tlink = cifs_sb_tlink(cifs_sb);
2188         if (IS_ERR(tlink))
2189                 return PTR_ERR(tlink);
2190         tcon = tlink_tcon(tlink);
2191         server = tcon->ses->server;
2192
2193         if (!server->ops->rename)
2194                 return -ENOSYS;
2195
2196         /* try path-based rename first */
2197         rc = server->ops->rename(xid, tcon, from_dentry,
2198                                  from_path, to_path, cifs_sb);
2199
2200         /*
2201          * Don't bother with rename by filehandle unless file is busy and
2202          * source. Note that cross directory moves do not work with
2203          * rename by filehandle to various Windows servers.
2204          */
2205         if (rc == 0 || rc != -EBUSY)
2206                 goto do_rename_exit;
2207
2208         /* Don't fall back to using SMB on SMB 2+ mount */
2209         if (server->vals->protocol_id != 0)
2210                 goto do_rename_exit;
2211
2212 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2213         /* open-file renames don't work across directories */
2214         if (to_dentry->d_parent != from_dentry->d_parent)
2215                 goto do_rename_exit;
2216
2217         oparms = (struct cifs_open_parms) {
2218                 .tcon = tcon,
2219                 .cifs_sb = cifs_sb,
2220                 /* open the file to be renamed -- we need DELETE perms */
2221                 .desired_access = DELETE,
2222                 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
2223                 .disposition = FILE_OPEN,
2224                 .path = from_path,
2225                 .fid = &fid,
2226         };
2227
2228         rc = CIFS_open(xid, &oparms, &oplock, NULL);
2229         if (rc == 0) {
2230                 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2231                                 (const char *) to_dentry->d_name.name,
2232                                 cifs_sb->local_nls, cifs_remap(cifs_sb));
2233                 CIFSSMBClose(xid, tcon, fid.netfid);
2234         }
2235 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2236 do_rename_exit:
2237         if (rc == 0)
2238                 d_move(from_dentry, to_dentry);
2239         cifs_put_tlink(tlink);
2240         return rc;
2241 }
2242
2243 int
2244 cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
2245              struct dentry *source_dentry, struct inode *target_dir,
2246              struct dentry *target_dentry, unsigned int flags)
2247 {
2248         const char *from_name, *to_name;
2249         void *page1, *page2;
2250         struct cifs_sb_info *cifs_sb;
2251         struct tcon_link *tlink;
2252         struct cifs_tcon *tcon;
2253         unsigned int xid;
2254         int rc, tmprc;
2255         int retry_count = 0;
2256         FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2257 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2258         FILE_UNIX_BASIC_INFO *info_buf_target;
2259 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2260
2261         if (flags & ~RENAME_NOREPLACE)
2262                 return -EINVAL;
2263
2264         cifs_sb = CIFS_SB(source_dir->i_sb);
2265         if (unlikely(cifs_forced_shutdown(cifs_sb)))
2266                 return -EIO;
2267
2268         tlink = cifs_sb_tlink(cifs_sb);
2269         if (IS_ERR(tlink))
2270                 return PTR_ERR(tlink);
2271         tcon = tlink_tcon(tlink);
2272
2273         page1 = alloc_dentry_path();
2274         page2 = alloc_dentry_path();
2275         xid = get_xid();
2276
2277         from_name = build_path_from_dentry(source_dentry, page1);
2278         if (IS_ERR(from_name)) {
2279                 rc = PTR_ERR(from_name);
2280                 goto cifs_rename_exit;
2281         }
2282
2283         to_name = build_path_from_dentry(target_dentry, page2);
2284         if (IS_ERR(to_name)) {
2285                 rc = PTR_ERR(to_name);
2286                 goto cifs_rename_exit;
2287         }
2288
2289         cifs_close_deferred_file_under_dentry(tcon, from_name);
2290         if (d_inode(target_dentry) != NULL)
2291                 cifs_close_deferred_file_under_dentry(tcon, to_name);
2292
2293         rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2294                             to_name);
2295
2296         if (rc == -EACCES) {
2297                 while (retry_count < 3) {
2298                         cifs_close_all_deferred_files(tcon);
2299                         rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2300                                             to_name);
2301                         if (rc != -EACCES)
2302                                 break;
2303                         retry_count++;
2304                 }
2305         }
2306
2307         /*
2308          * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2309          */
2310         if (flags & RENAME_NOREPLACE)
2311                 goto cifs_rename_exit;
2312
2313 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2314         if (rc == -EEXIST && tcon->unix_ext) {
2315                 /*
2316                  * Are src and dst hardlinks of same inode? We can only tell
2317                  * with unix extensions enabled.
2318                  */
2319                 info_buf_source =
2320                         kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2321                                         GFP_KERNEL);
2322                 if (info_buf_source == NULL) {
2323                         rc = -ENOMEM;
2324                         goto cifs_rename_exit;
2325                 }
2326
2327                 info_buf_target = info_buf_source + 1;
2328                 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2329                                              info_buf_source,
2330                                              cifs_sb->local_nls,
2331                                              cifs_remap(cifs_sb));
2332                 if (tmprc != 0)
2333                         goto unlink_target;
2334
2335                 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2336                                              info_buf_target,
2337                                              cifs_sb->local_nls,
2338                                              cifs_remap(cifs_sb));
2339
2340                 if (tmprc == 0 && (info_buf_source->UniqueId ==
2341                                    info_buf_target->UniqueId)) {
2342                         /* same file, POSIX says that this is a noop */
2343                         rc = 0;
2344                         goto cifs_rename_exit;
2345                 }
2346         }
2347         /*
2348          * else ... BB we could add the same check for Windows by
2349          * checking the UniqueId via FILE_INTERNAL_INFO
2350          */
2351
2352 unlink_target:
2353 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2354
2355         /* Try unlinking the target dentry if it's not negative */
2356         if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2357                 if (d_is_dir(target_dentry))
2358                         tmprc = cifs_rmdir(target_dir, target_dentry);
2359                 else
2360                         tmprc = cifs_unlink(target_dir, target_dentry);
2361                 if (tmprc)
2362                         goto cifs_rename_exit;
2363                 rc = cifs_do_rename(xid, source_dentry, from_name,
2364                                     target_dentry, to_name);
2365         }
2366
2367         /* force revalidate to go get info when needed */
2368         CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2369
2370 cifs_rename_exit:
2371         kfree(info_buf_source);
2372         free_dentry_path(page2);
2373         free_dentry_path(page1);
2374         free_xid(xid);
2375         cifs_put_tlink(tlink);
2376         return rc;
2377 }
2378
2379 static bool
2380 cifs_dentry_needs_reval(struct dentry *dentry)
2381 {
2382         struct inode *inode = d_inode(dentry);
2383         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2384         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2385         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2386         struct cached_fid *cfid = NULL;
2387
2388         if (cifs_i->time == 0)
2389                 return true;
2390
2391         if (CIFS_CACHE_READ(cifs_i))
2392                 return false;
2393
2394         if (!lookupCacheEnabled)
2395                 return true;
2396
2397         if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2398                 spin_lock(&cfid->fid_lock);
2399                 if (cfid->time && cifs_i->time > cfid->time) {
2400                         spin_unlock(&cfid->fid_lock);
2401                         close_cached_dir(cfid);
2402                         return false;
2403                 }
2404                 spin_unlock(&cfid->fid_lock);
2405                 close_cached_dir(cfid);
2406         }
2407         /*
2408          * depending on inode type, check if attribute caching disabled for
2409          * files or directories
2410          */
2411         if (S_ISDIR(inode->i_mode)) {
2412                 if (!cifs_sb->ctx->acdirmax)
2413                         return true;
2414                 if (!time_in_range(jiffies, cifs_i->time,
2415                                    cifs_i->time + cifs_sb->ctx->acdirmax))
2416                         return true;
2417         } else { /* file */
2418                 if (!cifs_sb->ctx->acregmax)
2419                         return true;
2420                 if (!time_in_range(jiffies, cifs_i->time,
2421                                    cifs_i->time + cifs_sb->ctx->acregmax))
2422                         return true;
2423         }
2424
2425         /* hardlinked files w/ noserverino get "special" treatment */
2426         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2427             S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2428                 return true;
2429
2430         return false;
2431 }
2432
2433 /*
2434  * Zap the cache. Called when invalid_mapping flag is set.
2435  */
2436 int
2437 cifs_invalidate_mapping(struct inode *inode)
2438 {
2439         int rc = 0;
2440
2441         if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2442                 rc = invalidate_inode_pages2(inode->i_mapping);
2443                 if (rc)
2444                         cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n",
2445                                  __func__, inode, rc);
2446         }
2447
2448         return rc;
2449 }
2450
2451 /**
2452  * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2453  *
2454  * @key:        currently unused
2455  * @mode:       the task state to sleep in
2456  */
2457 static int
2458 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2459 {
2460         schedule();
2461         if (signal_pending_state(mode, current))
2462                 return -ERESTARTSYS;
2463         return 0;
2464 }
2465
2466 int
2467 cifs_revalidate_mapping(struct inode *inode)
2468 {
2469         int rc;
2470         unsigned long *flags = &CIFS_I(inode)->flags;
2471         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2472
2473         /* swapfiles are not supposed to be shared */
2474         if (IS_SWAPFILE(inode))
2475                 return 0;
2476
2477         rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2478                                      TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
2479         if (rc)
2480                 return rc;
2481
2482         if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2483                 /* for cache=singleclient, do not invalidate */
2484                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2485                         goto skip_invalidate;
2486
2487                 rc = cifs_invalidate_mapping(inode);
2488                 if (rc)
2489                         set_bit(CIFS_INO_INVALID_MAPPING, flags);
2490         }
2491
2492 skip_invalidate:
2493         clear_bit_unlock(CIFS_INO_LOCK, flags);
2494         smp_mb__after_atomic();
2495         wake_up_bit(flags, CIFS_INO_LOCK);
2496
2497         return rc;
2498 }
2499
2500 int
2501 cifs_zap_mapping(struct inode *inode)
2502 {
2503         set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2504         return cifs_revalidate_mapping(inode);
2505 }
2506
2507 int cifs_revalidate_file_attr(struct file *filp)
2508 {
2509         int rc = 0;
2510         struct dentry *dentry = file_dentry(filp);
2511 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2512         struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2513 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2514
2515         if (!cifs_dentry_needs_reval(dentry))
2516                 return rc;
2517
2518 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2519         if (tlink_tcon(cfile->tlink)->unix_ext)
2520                 rc = cifs_get_file_info_unix(filp);
2521         else
2522 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2523                 rc = cifs_get_file_info(filp);
2524
2525         return rc;
2526 }
2527
2528 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2529 {
2530         unsigned int xid;
2531         int rc = 0;
2532         struct inode *inode = d_inode(dentry);
2533         struct super_block *sb = dentry->d_sb;
2534         const char *full_path;
2535         void *page;
2536         int count = 0;
2537
2538         if (inode == NULL)
2539                 return -ENOENT;
2540
2541         if (!cifs_dentry_needs_reval(dentry))
2542                 return rc;
2543
2544         xid = get_xid();
2545
2546         page = alloc_dentry_path();
2547         full_path = build_path_from_dentry(dentry, page);
2548         if (IS_ERR(full_path)) {
2549                 rc = PTR_ERR(full_path);
2550                 goto out;
2551         }
2552
2553         cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2554                  full_path, inode, inode->i_count.counter,
2555                  dentry, cifs_get_time(dentry), jiffies);
2556
2557 again:
2558         if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions) {
2559                 rc = smb311_posix_get_inode_info(&inode, full_path,
2560                                                  NULL, sb, xid);
2561         } else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext) {
2562                 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2563         } else {
2564                 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2565                                          xid, NULL);
2566         }
2567         if (rc == -EAGAIN && count++ < 10)
2568                 goto again;
2569 out:
2570         free_dentry_path(page);
2571         free_xid(xid);
2572
2573         return rc;
2574 }
2575
2576 int cifs_revalidate_file(struct file *filp)
2577 {
2578         int rc;
2579         struct inode *inode = file_inode(filp);
2580
2581         rc = cifs_revalidate_file_attr(filp);
2582         if (rc)
2583                 return rc;
2584
2585         return cifs_revalidate_mapping(inode);
2586 }
2587
2588 /* revalidate a dentry's inode attributes */
2589 int cifs_revalidate_dentry(struct dentry *dentry)
2590 {
2591         int rc;
2592         struct inode *inode = d_inode(dentry);
2593
2594         rc = cifs_revalidate_dentry_attr(dentry);
2595         if (rc)
2596                 return rc;
2597
2598         return cifs_revalidate_mapping(inode);
2599 }
2600
2601 int cifs_getattr(struct mnt_idmap *idmap, const struct path *path,
2602                  struct kstat *stat, u32 request_mask, unsigned int flags)
2603 {
2604         struct dentry *dentry = path->dentry;
2605         struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2606         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2607         struct inode *inode = d_inode(dentry);
2608         int rc;
2609
2610         if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2611                 return -EIO;
2612
2613         /*
2614          * We need to be sure that all dirty pages are written and the server
2615          * has actual ctime, mtime and file length.
2616          */
2617         if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2618             !CIFS_CACHE_READ(CIFS_I(inode)) &&
2619             inode->i_mapping && inode->i_mapping->nrpages != 0) {
2620                 rc = filemap_fdatawait(inode->i_mapping);
2621                 if (rc) {
2622                         mapping_set_error(inode->i_mapping, rc);
2623                         return rc;
2624                 }
2625         }
2626
2627         if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2628                 CIFS_I(inode)->time = 0; /* force revalidate */
2629
2630         /*
2631          * If the caller doesn't require syncing, only sync if
2632          * necessary (e.g. due to earlier truncate or setattr
2633          * invalidating the cached metadata)
2634          */
2635         if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2636             (CIFS_I(inode)->time == 0)) {
2637                 rc = cifs_revalidate_dentry_attr(dentry);
2638                 if (rc)
2639                         return rc;
2640         }
2641
2642         generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
2643         stat->blksize = cifs_sb->ctx->bsize;
2644         stat->ino = CIFS_I(inode)->uniqueid;
2645
2646         /* old CIFS Unix Extensions doesn't return create time */
2647         if (CIFS_I(inode)->createtime) {
2648                 stat->result_mask |= STATX_BTIME;
2649                 stat->btime =
2650                       cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2651         }
2652
2653         stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2654         if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2655                 stat->attributes |= STATX_ATTR_COMPRESSED;
2656         if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2657                 stat->attributes |= STATX_ATTR_ENCRYPTED;
2658
2659         /*
2660          * If on a multiuser mount without unix extensions or cifsacl being
2661          * enabled, and the admin hasn't overridden them, set the ownership
2662          * to the fsuid/fsgid of the current process.
2663          */
2664         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2665             !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2666             !tcon->unix_ext) {
2667                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2668                         stat->uid = current_fsuid();
2669                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2670                         stat->gid = current_fsgid();
2671         }
2672         return 0;
2673 }
2674
2675 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2676                 u64 len)
2677 {
2678         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2679         struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->netfs.inode.i_sb);
2680         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2681         struct TCP_Server_Info *server = tcon->ses->server;
2682         struct cifsFileInfo *cfile;
2683         int rc;
2684
2685         if (unlikely(cifs_forced_shutdown(cifs_sb)))
2686                 return -EIO;
2687
2688         /*
2689          * We need to be sure that all dirty pages are written as they
2690          * might fill holes on the server.
2691          */
2692         if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2693             inode->i_mapping->nrpages != 0) {
2694                 rc = filemap_fdatawait(inode->i_mapping);
2695                 if (rc) {
2696                         mapping_set_error(inode->i_mapping, rc);
2697                         return rc;
2698                 }
2699         }
2700
2701         cfile = find_readable_file(cifs_i, false);
2702         if (cfile == NULL)
2703                 return -EINVAL;
2704
2705         if (server->ops->fiemap) {
2706                 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2707                 cifsFileInfo_put(cfile);
2708                 return rc;
2709         }
2710
2711         cifsFileInfo_put(cfile);
2712         return -EOPNOTSUPP;
2713 }
2714
2715 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2716 {
2717         pgoff_t index = from >> PAGE_SHIFT;
2718         unsigned offset = from & (PAGE_SIZE - 1);
2719         struct page *page;
2720         int rc = 0;
2721
2722         page = grab_cache_page(mapping, index);
2723         if (!page)
2724                 return -ENOMEM;
2725
2726         zero_user_segment(page, offset, PAGE_SIZE);
2727         unlock_page(page);
2728         put_page(page);
2729         return rc;
2730 }
2731
2732 void cifs_setsize(struct inode *inode, loff_t offset)
2733 {
2734         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2735
2736         spin_lock(&inode->i_lock);
2737         i_size_write(inode, offset);
2738         spin_unlock(&inode->i_lock);
2739
2740         /* Cached inode must be refreshed on truncate */
2741         cifs_i->time = 0;
2742         truncate_pagecache(inode, offset);
2743 }
2744
2745 static int
2746 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2747                    unsigned int xid, const char *full_path, struct dentry *dentry)
2748 {
2749         int rc;
2750         struct cifsFileInfo *open_file;
2751         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2752         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2753         struct tcon_link *tlink = NULL;
2754         struct cifs_tcon *tcon = NULL;
2755         struct TCP_Server_Info *server;
2756
2757         /*
2758          * To avoid spurious oplock breaks from server, in the case of
2759          * inodes that we already have open, avoid doing path based
2760          * setting of file size if we can do it by handle.
2761          * This keeps our caching token (oplock) and avoids timeouts
2762          * when the local oplock break takes longer to flush
2763          * writebehind data than the SMB timeout for the SetPathInfo
2764          * request would allow
2765          */
2766         open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2767         if (open_file) {
2768                 tcon = tlink_tcon(open_file->tlink);
2769                 server = tcon->ses->server;
2770                 if (server->ops->set_file_size)
2771                         rc = server->ops->set_file_size(xid, tcon, open_file,
2772                                                         attrs->ia_size, false);
2773                 else
2774                         rc = -ENOSYS;
2775                 cifsFileInfo_put(open_file);
2776                 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2777         } else
2778                 rc = -EINVAL;
2779
2780         if (!rc)
2781                 goto set_size_out;
2782
2783         if (tcon == NULL) {
2784                 tlink = cifs_sb_tlink(cifs_sb);
2785                 if (IS_ERR(tlink))
2786                         return PTR_ERR(tlink);
2787                 tcon = tlink_tcon(tlink);
2788                 server = tcon->ses->server;
2789         }
2790
2791         /*
2792          * Set file size by pathname rather than by handle either because no
2793          * valid, writeable file handle for it was found or because there was
2794          * an error setting it by handle.
2795          */
2796         if (server->ops->set_path_size)
2797                 rc = server->ops->set_path_size(xid, tcon, full_path,
2798                                                 attrs->ia_size, cifs_sb, false, dentry);
2799         else
2800                 rc = -ENOSYS;
2801         cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2802
2803         if (tlink)
2804                 cifs_put_tlink(tlink);
2805
2806 set_size_out:
2807         if (rc == 0) {
2808                 netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
2809                 cifs_setsize(inode, attrs->ia_size);
2810                 /*
2811                  * i_blocks is not related to (i_size / i_blksize), but instead
2812                  * 512 byte (2**9) size is required for calculating num blocks.
2813                  * Until we can query the server for actual allocation size,
2814                  * this is best estimate we have for blocks allocated for a file
2815                  * Number of blocks must be rounded up so size 1 is not 0 blocks
2816                  */
2817                 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2818
2819                 /*
2820                  * The man page of truncate says if the size changed,
2821                  * then the st_ctime and st_mtime fields for the file
2822                  * are updated.
2823                  */
2824                 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2825                 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2826
2827                 cifs_truncate_page(inode->i_mapping, inode->i_size);
2828         }
2829
2830         return rc;
2831 }
2832
2833 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2834 static int
2835 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2836 {
2837         int rc;
2838         unsigned int xid;
2839         const char *full_path;
2840         void *page = alloc_dentry_path();
2841         struct inode *inode = d_inode(direntry);
2842         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2843         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2844         struct tcon_link *tlink;
2845         struct cifs_tcon *pTcon;
2846         struct cifs_unix_set_info_args *args = NULL;
2847         struct cifsFileInfo *open_file;
2848
2849         cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2850                  direntry, attrs->ia_valid);
2851
2852         xid = get_xid();
2853
2854         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2855                 attrs->ia_valid |= ATTR_FORCE;
2856
2857         rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
2858         if (rc < 0)
2859                 goto out;
2860
2861         full_path = build_path_from_dentry(direntry, page);
2862         if (IS_ERR(full_path)) {
2863                 rc = PTR_ERR(full_path);
2864                 goto out;
2865         }
2866
2867         /*
2868          * Attempt to flush data before changing attributes. We need to do
2869          * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2870          * ownership or mode then we may also need to do this. Here, we take
2871          * the safe way out and just do the flush on all setattr requests. If
2872          * the flush returns error, store it to report later and continue.
2873          *
2874          * BB: This should be smarter. Why bother flushing pages that
2875          * will be truncated anyway? Also, should we error out here if
2876          * the flush returns error?
2877          */
2878         rc = filemap_write_and_wait(inode->i_mapping);
2879         if (is_interrupt_error(rc)) {
2880                 rc = -ERESTARTSYS;
2881                 goto out;
2882         }
2883
2884         mapping_set_error(inode->i_mapping, rc);
2885         rc = 0;
2886
2887         if (attrs->ia_valid & ATTR_SIZE) {
2888                 rc = cifs_set_file_size(inode, attrs, xid, full_path, direntry);
2889                 if (rc != 0)
2890                         goto out;
2891         }
2892
2893         /* skip mode change if it's just for clearing setuid/setgid */
2894         if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2895                 attrs->ia_valid &= ~ATTR_MODE;
2896
2897         args = kmalloc(sizeof(*args), GFP_KERNEL);
2898         if (args == NULL) {
2899                 rc = -ENOMEM;
2900                 goto out;
2901         }
2902
2903         /* set up the struct */
2904         if (attrs->ia_valid & ATTR_MODE)
2905                 args->mode = attrs->ia_mode;
2906         else
2907                 args->mode = NO_CHANGE_64;
2908
2909         if (attrs->ia_valid & ATTR_UID)
2910                 args->uid = attrs->ia_uid;
2911         else
2912                 args->uid = INVALID_UID; /* no change */
2913
2914         if (attrs->ia_valid & ATTR_GID)
2915                 args->gid = attrs->ia_gid;
2916         else
2917                 args->gid = INVALID_GID; /* no change */
2918
2919         if (attrs->ia_valid & ATTR_ATIME)
2920                 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2921         else
2922                 args->atime = NO_CHANGE_64;
2923
2924         if (attrs->ia_valid & ATTR_MTIME)
2925                 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2926         else
2927                 args->mtime = NO_CHANGE_64;
2928
2929         if (attrs->ia_valid & ATTR_CTIME)
2930                 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2931         else
2932                 args->ctime = NO_CHANGE_64;
2933
2934         args->device = 0;
2935         open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2936         if (open_file) {
2937                 u16 nfid = open_file->fid.netfid;
2938                 u32 npid = open_file->pid;
2939                 pTcon = tlink_tcon(open_file->tlink);
2940                 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2941                 cifsFileInfo_put(open_file);
2942         } else {
2943                 tlink = cifs_sb_tlink(cifs_sb);
2944                 if (IS_ERR(tlink)) {
2945                         rc = PTR_ERR(tlink);
2946                         goto out;
2947                 }
2948                 pTcon = tlink_tcon(tlink);
2949                 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2950                                     cifs_sb->local_nls,
2951                                     cifs_remap(cifs_sb));
2952                 cifs_put_tlink(tlink);
2953         }
2954
2955         if (rc)
2956                 goto out;
2957
2958         if ((attrs->ia_valid & ATTR_SIZE) &&
2959             attrs->ia_size != i_size_read(inode)) {
2960                 truncate_setsize(inode, attrs->ia_size);
2961                 netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
2962                 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
2963         }
2964
2965         setattr_copy(&nop_mnt_idmap, inode, attrs);
2966         mark_inode_dirty(inode);
2967
2968         /* force revalidate when any of these times are set since some
2969            of the fs types (eg ext3, fat) do not have fine enough
2970            time granularity to match protocol, and we do not have a
2971            a way (yet) to query the server fs's time granularity (and
2972            whether it rounds times down).
2973         */
2974         if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2975                 cifsInode->time = 0;
2976 out:
2977         kfree(args);
2978         free_dentry_path(page);
2979         free_xid(xid);
2980         return rc;
2981 }
2982 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2983
2984 static int
2985 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2986 {
2987         unsigned int xid;
2988         kuid_t uid = INVALID_UID;
2989         kgid_t gid = INVALID_GID;
2990         struct inode *inode = d_inode(direntry);
2991         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2992         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2993         struct cifsFileInfo *wfile;
2994         struct cifs_tcon *tcon;
2995         const char *full_path;
2996         void *page = alloc_dentry_path();
2997         int rc = -EACCES;
2998         __u32 dosattr = 0;
2999         __u64 mode = NO_CHANGE_64;
3000
3001         xid = get_xid();
3002
3003         cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
3004                  direntry, attrs->ia_valid);
3005
3006         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
3007                 attrs->ia_valid |= ATTR_FORCE;
3008
3009         rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
3010         if (rc < 0)
3011                 goto cifs_setattr_exit;
3012
3013         full_path = build_path_from_dentry(direntry, page);
3014         if (IS_ERR(full_path)) {
3015                 rc = PTR_ERR(full_path);
3016                 goto cifs_setattr_exit;
3017         }
3018
3019         /*
3020          * Attempt to flush data before changing attributes. We need to do
3021          * this for ATTR_SIZE and ATTR_MTIME.  If the flush of the data
3022          * returns error, store it to report later and continue.
3023          *
3024          * BB: This should be smarter. Why bother flushing pages that
3025          * will be truncated anyway? Also, should we error out here if
3026          * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
3027          */
3028         if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
3029                 rc = filemap_write_and_wait(inode->i_mapping);
3030                 if (is_interrupt_error(rc)) {
3031                         rc = -ERESTARTSYS;
3032                         goto cifs_setattr_exit;
3033                 }
3034                 mapping_set_error(inode->i_mapping, rc);
3035         }
3036
3037         rc = 0;
3038
3039         if ((attrs->ia_valid & ATTR_MTIME) &&
3040             !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
3041                 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
3042                 if (!rc) {
3043                         tcon = tlink_tcon(wfile->tlink);
3044                         rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
3045                         cifsFileInfo_put(wfile);
3046                         if (rc)
3047                                 goto cifs_setattr_exit;
3048                 } else if (rc != -EBADF)
3049                         goto cifs_setattr_exit;
3050                 else
3051                         rc = 0;
3052         }
3053
3054         if (attrs->ia_valid & ATTR_SIZE) {
3055                 rc = cifs_set_file_size(inode, attrs, xid, full_path, direntry);
3056                 if (rc != 0)
3057                         goto cifs_setattr_exit;
3058         }
3059
3060         if (attrs->ia_valid & ATTR_UID)
3061                 uid = attrs->ia_uid;
3062
3063         if (attrs->ia_valid & ATTR_GID)
3064                 gid = attrs->ia_gid;
3065
3066         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3067             (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3068                 if (uid_valid(uid) || gid_valid(gid)) {
3069                         mode = NO_CHANGE_64;
3070                         rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3071                                                         uid, gid);
3072                         if (rc) {
3073                                 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
3074                                          __func__, rc);
3075                                 goto cifs_setattr_exit;
3076                         }
3077                 }
3078         } else
3079         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
3080                 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
3081
3082         /* skip mode change if it's just for clearing setuid/setgid */
3083         if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
3084                 attrs->ia_valid &= ~ATTR_MODE;
3085
3086         if (attrs->ia_valid & ATTR_MODE) {
3087                 mode = attrs->ia_mode;
3088                 rc = 0;
3089                 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3090                     (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3091                         rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3092                                                 INVALID_UID, INVALID_GID);
3093                         if (rc) {
3094                                 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
3095                                          __func__, rc);
3096                                 goto cifs_setattr_exit;
3097                         }
3098
3099                         /*
3100                          * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
3101                          * Pick up the actual mode bits that were set.
3102                          */
3103                         if (mode != attrs->ia_mode)
3104                                 attrs->ia_mode = mode;
3105                 } else
3106                 if (((mode & S_IWUGO) == 0) &&
3107                     (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
3108
3109                         dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
3110
3111                         /* fix up mode if we're not using dynperm */
3112                         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
3113                                 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
3114                 } else if ((mode & S_IWUGO) &&
3115                            (cifsInode->cifsAttrs & ATTR_READONLY)) {
3116
3117                         dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
3118                         /* Attributes of 0 are ignored */
3119                         if (dosattr == 0)
3120                                 dosattr |= ATTR_NORMAL;
3121
3122                         /* reset local inode permissions to normal */
3123                         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3124                                 attrs->ia_mode &= ~(S_IALLUGO);
3125                                 if (S_ISDIR(inode->i_mode))
3126                                         attrs->ia_mode |=
3127                                                 cifs_sb->ctx->dir_mode;
3128                                 else
3129                                         attrs->ia_mode |=
3130                                                 cifs_sb->ctx->file_mode;
3131                         }
3132                 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3133                         /* ignore mode change - ATTR_READONLY hasn't changed */
3134                         attrs->ia_valid &= ~ATTR_MODE;
3135                 }
3136         }
3137
3138         if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
3139             ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
3140                 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
3141                 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
3142
3143                 /* Even if error on time set, no sense failing the call if
3144                 the server would set the time to a reasonable value anyway,
3145                 and this check ensures that we are not being called from
3146                 sys_utimes in which case we ought to fail the call back to
3147                 the user when the server rejects the call */
3148                 if ((rc) && (attrs->ia_valid &
3149                                 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
3150                         rc = 0;
3151         }
3152
3153         /* do not need local check to inode_check_ok since the server does
3154            that */
3155         if (rc)
3156                 goto cifs_setattr_exit;
3157
3158         if ((attrs->ia_valid & ATTR_SIZE) &&
3159             attrs->ia_size != i_size_read(inode)) {
3160                 truncate_setsize(inode, attrs->ia_size);
3161                 netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true);
3162                 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3163         }
3164
3165         setattr_copy(&nop_mnt_idmap, inode, attrs);
3166         mark_inode_dirty(inode);
3167
3168 cifs_setattr_exit:
3169         free_xid(xid);
3170         free_dentry_path(page);
3171         return rc;
3172 }
3173
3174 int
3175 cifs_setattr(struct mnt_idmap *idmap, struct dentry *direntry,
3176              struct iattr *attrs)
3177 {
3178         struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
3179         int rc, retries = 0;
3180 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3181         struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
3182 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3183
3184         if (unlikely(cifs_forced_shutdown(cifs_sb)))
3185                 return -EIO;
3186
3187         do {
3188 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3189                 if (pTcon->unix_ext)
3190                         rc = cifs_setattr_unix(direntry, attrs);
3191                 else
3192 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3193                         rc = cifs_setattr_nounix(direntry, attrs);
3194                 retries++;
3195         } while (is_retryable_error(rc) && retries < 2);
3196
3197         /* BB: add cifs_setattr_legacy for really old servers */
3198         return rc;
3199 }