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