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