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