Merge remote-tracking branch 'lsk/v3.10/topic/arm64-topology' into linux-linaro-lsk
[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                 if (fattr->cf_nlink < 1) {
562                         cifs_dbg(1, "replacing bogus file nlink value %u\n",
563                                 fattr->cf_nlink);
564                         fattr->cf_nlink = 1;
565                 }
566         }
567
568         fattr->cf_uid = cifs_sb->mnt_uid;
569         fattr->cf_gid = cifs_sb->mnt_gid;
570 }
571
572 static int
573 cifs_get_file_info(struct file *filp)
574 {
575         int rc;
576         unsigned int xid;
577         FILE_ALL_INFO find_data;
578         struct cifs_fattr fattr;
579         struct inode *inode = file_inode(filp);
580         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
581         struct cifsFileInfo *cfile = filp->private_data;
582         struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
583         struct TCP_Server_Info *server = tcon->ses->server;
584
585         if (!server->ops->query_file_info)
586                 return -ENOSYS;
587
588         xid = get_xid();
589         rc = server->ops->query_file_info(xid, tcon, &cfile->fid, &find_data);
590         switch (rc) {
591         case 0:
592                 cifs_all_info_to_fattr(&fattr, &find_data, cifs_sb, false);
593                 break;
594         case -EREMOTE:
595                 cifs_create_dfs_fattr(&fattr, inode->i_sb);
596                 rc = 0;
597                 break;
598         case -EOPNOTSUPP:
599         case -EINVAL:
600                 /*
601                  * FIXME: legacy server -- fall back to path-based call?
602                  * for now, just skip revalidating and mark inode for
603                  * immediate reval.
604                  */
605                 rc = 0;
606                 CIFS_I(inode)->time = 0;
607         default:
608                 goto cgfi_exit;
609         }
610
611         /*
612          * don't bother with SFU junk here -- just mark inode as needing
613          * revalidation.
614          */
615         fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
616         fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
617         cifs_fattr_to_inode(inode, &fattr);
618 cgfi_exit:
619         free_xid(xid);
620         return rc;
621 }
622
623 int
624 cifs_get_inode_info(struct inode **inode, const char *full_path,
625                     FILE_ALL_INFO *data, struct super_block *sb, int xid,
626                     const __u16 *fid)
627 {
628         bool validinum = false;
629         __u16 srchflgs;
630         int rc = 0, tmprc = ENOSYS;
631         struct cifs_tcon *tcon;
632         struct TCP_Server_Info *server;
633         struct tcon_link *tlink;
634         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
635         char *buf = NULL;
636         bool adjust_tz = false;
637         struct cifs_fattr fattr;
638         struct cifs_search_info *srchinf = NULL;
639
640         tlink = cifs_sb_tlink(cifs_sb);
641         if (IS_ERR(tlink))
642                 return PTR_ERR(tlink);
643         tcon = tlink_tcon(tlink);
644         server = tcon->ses->server;
645
646         cifs_dbg(FYI, "Getting info on %s\n", full_path);
647
648         if ((data == NULL) && (*inode != NULL)) {
649                 if (CIFS_I(*inode)->clientCanCacheRead) {
650                         cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
651                         goto cgii_exit;
652                 }
653         }
654
655         /* if inode info is not passed, get it from server */
656         if (data == NULL) {
657                 if (!server->ops->query_path_info) {
658                         rc = -ENOSYS;
659                         goto cgii_exit;
660                 }
661                 buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
662                 if (buf == NULL) {
663                         rc = -ENOMEM;
664                         goto cgii_exit;
665                 }
666                 data = (FILE_ALL_INFO *)buf;
667                 rc = server->ops->query_path_info(xid, tcon, cifs_sb, full_path,
668                                                   data, &adjust_tz);
669         }
670
671         if (!rc) {
672                 cifs_all_info_to_fattr(&fattr, (FILE_ALL_INFO *)data, cifs_sb,
673                                        adjust_tz);
674         } else if (rc == -EREMOTE) {
675                 cifs_create_dfs_fattr(&fattr, sb);
676                 rc = 0;
677         } else if (rc == -EACCES && backup_cred(cifs_sb)) {
678                         srchinf = kzalloc(sizeof(struct cifs_search_info),
679                                                 GFP_KERNEL);
680                         if (srchinf == NULL) {
681                                 rc = -ENOMEM;
682                                 goto cgii_exit;
683                         }
684
685                         srchinf->endOfSearch = false;
686                         srchinf->info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
687
688                         srchflgs = CIFS_SEARCH_CLOSE_ALWAYS |
689                                         CIFS_SEARCH_CLOSE_AT_END |
690                                         CIFS_SEARCH_BACKUP_SEARCH;
691
692                         rc = CIFSFindFirst(xid, tcon, full_path,
693                                 cifs_sb, NULL, srchflgs, srchinf, false);
694                         if (!rc) {
695                                 data =
696                                 (FILE_ALL_INFO *)srchinf->srch_entries_start;
697
698                                 cifs_dir_info_to_fattr(&fattr,
699                                 (FILE_DIRECTORY_INFO *)data, cifs_sb);
700                                 fattr.cf_uniqueid = le64_to_cpu(
701                                 ((SEARCH_ID_FULL_DIR_INFO *)data)->UniqueId);
702                                 validinum = true;
703
704                                 cifs_buf_release(srchinf->ntwrk_buf_start);
705                         }
706                         kfree(srchinf);
707         } else
708                 goto cgii_exit;
709
710         /*
711          * If an inode wasn't passed in, then get the inode number
712          *
713          * Is an i_ino of zero legal? Can we use that to check if the server
714          * supports returning inode numbers?  Are there other sanity checks we
715          * can use to ensure that the server is really filling in that field?
716          */
717         if (*inode == NULL) {
718                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
719                         if (validinum == false) {
720                                 if (server->ops->get_srv_inum)
721                                         tmprc = server->ops->get_srv_inum(xid,
722                                                 tcon, cifs_sb, full_path,
723                                                 &fattr.cf_uniqueid, data);
724                                 if (tmprc) {
725                                         cifs_dbg(FYI, "GetSrvInodeNum rc %d\n",
726                                                  tmprc);
727                                         fattr.cf_uniqueid = iunique(sb, ROOT_I);
728                                         cifs_autodisable_serverino(cifs_sb);
729                                 }
730                         }
731                 } else
732                         fattr.cf_uniqueid = iunique(sb, ROOT_I);
733         } else
734                 fattr.cf_uniqueid = CIFS_I(*inode)->uniqueid;
735
736         /* query for SFU type info if supported and needed */
737         if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
738             cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
739                 tmprc = cifs_sfu_type(&fattr, full_path, cifs_sb, xid);
740                 if (tmprc)
741                         cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
742         }
743
744 #ifdef CONFIG_CIFS_ACL
745         /* fill in 0777 bits from ACL */
746         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
747                 rc = cifs_acl_to_fattr(cifs_sb, &fattr, *inode, full_path, fid);
748                 if (rc) {
749                         cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
750                                  __func__, rc);
751                         goto cgii_exit;
752                 }
753         }
754 #endif /* CONFIG_CIFS_ACL */
755
756         /* fill in remaining high mode bits e.g. SUID, VTX */
757         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
758                 cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
759
760         /* check for Minshall+French symlinks */
761         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
762                 tmprc = CIFSCheckMFSymlink(&fattr, full_path, cifs_sb, xid);
763                 if (tmprc)
764                         cifs_dbg(FYI, "CIFSCheckMFSymlink: %d\n", tmprc);
765         }
766
767         if (!*inode) {
768                 *inode = cifs_iget(sb, &fattr);
769                 if (!*inode)
770                         rc = -ENOMEM;
771         } else {
772                 cifs_fattr_to_inode(*inode, &fattr);
773         }
774
775 cgii_exit:
776         kfree(buf);
777         cifs_put_tlink(tlink);
778         return rc;
779 }
780
781 static const struct inode_operations cifs_ipc_inode_ops = {
782         .lookup = cifs_lookup,
783 };
784
785 static int
786 cifs_find_inode(struct inode *inode, void *opaque)
787 {
788         struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
789
790         /* don't match inode with different uniqueid */
791         if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
792                 return 0;
793
794         /* use createtime like an i_generation field */
795         if (CIFS_I(inode)->createtime != fattr->cf_createtime)
796                 return 0;
797
798         /* don't match inode of different type */
799         if ((inode->i_mode & S_IFMT) != (fattr->cf_mode & S_IFMT))
800                 return 0;
801
802         /* if it's not a directory or has no dentries, then flag it */
803         if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
804                 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
805
806         return 1;
807 }
808
809 static int
810 cifs_init_inode(struct inode *inode, void *opaque)
811 {
812         struct cifs_fattr *fattr = (struct cifs_fattr *) opaque;
813
814         CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
815         CIFS_I(inode)->createtime = fattr->cf_createtime;
816         return 0;
817 }
818
819 /*
820  * walk dentry list for an inode and report whether it has aliases that
821  * are hashed. We use this to determine if a directory inode can actually
822  * be used.
823  */
824 static bool
825 inode_has_hashed_dentries(struct inode *inode)
826 {
827         struct dentry *dentry;
828
829         spin_lock(&inode->i_lock);
830         hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
831                 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
832                         spin_unlock(&inode->i_lock);
833                         return true;
834                 }
835         }
836         spin_unlock(&inode->i_lock);
837         return false;
838 }
839
840 /* Given fattrs, get a corresponding inode */
841 struct inode *
842 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
843 {
844         unsigned long hash;
845         struct inode *inode;
846
847 retry_iget5_locked:
848         cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
849
850         /* hash down to 32-bits on 32-bit arch */
851         hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
852
853         inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
854         if (inode) {
855                 /* was there a potentially problematic inode collision? */
856                 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
857                         fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
858
859                         if (inode_has_hashed_dentries(inode)) {
860                                 cifs_autodisable_serverino(CIFS_SB(sb));
861                                 iput(inode);
862                                 fattr->cf_uniqueid = iunique(sb, ROOT_I);
863                                 goto retry_iget5_locked;
864                         }
865                 }
866
867                 cifs_fattr_to_inode(inode, fattr);
868                 if (sb->s_flags & MS_NOATIME)
869                         inode->i_flags |= S_NOATIME | S_NOCMTIME;
870                 if (inode->i_state & I_NEW) {
871                         inode->i_ino = hash;
872                         if (S_ISREG(inode->i_mode))
873                                 inode->i_data.backing_dev_info = sb->s_bdi;
874 #ifdef CONFIG_CIFS_FSCACHE
875                         /* initialize per-inode cache cookie pointer */
876                         CIFS_I(inode)->fscache = NULL;
877 #endif
878                         unlock_new_inode(inode);
879                 }
880         }
881
882         return inode;
883 }
884
885 /* gets root inode */
886 struct inode *cifs_root_iget(struct super_block *sb)
887 {
888         unsigned int xid;
889         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
890         struct inode *inode = NULL;
891         long rc;
892         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
893
894         xid = get_xid();
895         if (tcon->unix_ext)
896                 rc = cifs_get_inode_info_unix(&inode, "", sb, xid);
897         else
898                 rc = cifs_get_inode_info(&inode, "", NULL, sb, xid, NULL);
899
900         if (!inode) {
901                 inode = ERR_PTR(rc);
902                 goto out;
903         }
904
905 #ifdef CONFIG_CIFS_FSCACHE
906         /* populate tcon->resource_id */
907         tcon->resource_id = CIFS_I(inode)->uniqueid;
908 #endif
909
910         if (rc && tcon->ipc) {
911                 cifs_dbg(FYI, "ipc connection - fake read inode\n");
912                 spin_lock(&inode->i_lock);
913                 inode->i_mode |= S_IFDIR;
914                 set_nlink(inode, 2);
915                 inode->i_op = &cifs_ipc_inode_ops;
916                 inode->i_fop = &simple_dir_operations;
917                 inode->i_uid = cifs_sb->mnt_uid;
918                 inode->i_gid = cifs_sb->mnt_gid;
919                 spin_unlock(&inode->i_lock);
920         } else if (rc) {
921                 iget_failed(inode);
922                 inode = ERR_PTR(rc);
923         }
924
925 out:
926         /* can not call macro free_xid here since in a void func
927          * TODO: This is no longer true
928          */
929         _free_xid(xid);
930         return inode;
931 }
932
933 int
934 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
935                    char *full_path, __u32 dosattr)
936 {
937         bool set_time = false;
938         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
939         struct TCP_Server_Info *server;
940         FILE_BASIC_INFO info_buf;
941
942         if (attrs == NULL)
943                 return -EINVAL;
944
945         server = cifs_sb_master_tcon(cifs_sb)->ses->server;
946         if (!server->ops->set_file_info)
947                 return -ENOSYS;
948
949         if (attrs->ia_valid & ATTR_ATIME) {
950                 set_time = true;
951                 info_buf.LastAccessTime =
952                         cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
953         } else
954                 info_buf.LastAccessTime = 0;
955
956         if (attrs->ia_valid & ATTR_MTIME) {
957                 set_time = true;
958                 info_buf.LastWriteTime =
959                     cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
960         } else
961                 info_buf.LastWriteTime = 0;
962
963         /*
964          * Samba throws this field away, but windows may actually use it.
965          * Do not set ctime unless other time stamps are changed explicitly
966          * (i.e. by utimes()) since we would then have a mix of client and
967          * server times.
968          */
969         if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
970                 cifs_dbg(FYI, "CIFS - CTIME changed\n");
971                 info_buf.ChangeTime =
972                     cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
973         } else
974                 info_buf.ChangeTime = 0;
975
976         info_buf.CreationTime = 0;      /* don't change */
977         info_buf.Attributes = cpu_to_le32(dosattr);
978
979         return server->ops->set_file_info(inode, full_path, &info_buf, xid);
980 }
981
982 /*
983  * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
984  * and rename it to a random name that hopefully won't conflict with
985  * anything else.
986  */
987 int
988 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
989                            const unsigned int xid)
990 {
991         int oplock = 0;
992         int rc;
993         __u16 netfid;
994         struct inode *inode = dentry->d_inode;
995         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
996         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
997         struct tcon_link *tlink;
998         struct cifs_tcon *tcon;
999         __u32 dosattr, origattr;
1000         FILE_BASIC_INFO *info_buf = NULL;
1001
1002         tlink = cifs_sb_tlink(cifs_sb);
1003         if (IS_ERR(tlink))
1004                 return PTR_ERR(tlink);
1005         tcon = tlink_tcon(tlink);
1006
1007         /*
1008          * We cannot rename the file if the server doesn't support
1009          * CAP_INFOLEVEL_PASSTHRU
1010          */
1011         if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1012                 rc = -EBUSY;
1013                 goto out;
1014         }
1015
1016         rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
1017                          DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR,
1018                          &netfid, &oplock, NULL, cifs_sb->local_nls,
1019                          cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
1020         if (rc != 0)
1021                 goto out;
1022
1023         origattr = cifsInode->cifsAttrs;
1024         if (origattr == 0)
1025                 origattr |= ATTR_NORMAL;
1026
1027         dosattr = origattr & ~ATTR_READONLY;
1028         if (dosattr == 0)
1029                 dosattr |= ATTR_NORMAL;
1030         dosattr |= ATTR_HIDDEN;
1031
1032         /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1033         if (dosattr != origattr) {
1034                 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1035                 if (info_buf == NULL) {
1036                         rc = -ENOMEM;
1037                         goto out_close;
1038                 }
1039                 info_buf->Attributes = cpu_to_le32(dosattr);
1040                 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, netfid,
1041                                         current->tgid);
1042                 /* although we would like to mark the file hidden
1043                    if that fails we will still try to rename it */
1044                 if (!rc)
1045                         cifsInode->cifsAttrs = dosattr;
1046                 else
1047                         dosattr = origattr; /* since not able to change them */
1048         }
1049
1050         /* rename the file */
1051         rc = CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
1052                                    cifs_sb->mnt_cifs_flags &
1053                                             CIFS_MOUNT_MAP_SPECIAL_CHR);
1054         if (rc != 0) {
1055                 rc = -EBUSY;
1056                 goto undo_setattr;
1057         }
1058
1059         /* try to set DELETE_ON_CLOSE */
1060         if (!cifsInode->delete_pending) {
1061                 rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid,
1062                                                current->tgid);
1063                 /*
1064                  * some samba versions return -ENOENT when we try to set the
1065                  * file disposition here. Likely a samba bug, but work around
1066                  * it for now. This means that some cifsXXX files may hang
1067                  * around after they shouldn't.
1068                  *
1069                  * BB: remove this hack after more servers have the fix
1070                  */
1071                 if (rc == -ENOENT)
1072                         rc = 0;
1073                 else if (rc != 0) {
1074                         rc = -EBUSY;
1075                         goto undo_rename;
1076                 }
1077                 cifsInode->delete_pending = true;
1078         }
1079
1080 out_close:
1081         CIFSSMBClose(xid, tcon, netfid);
1082 out:
1083         kfree(info_buf);
1084         cifs_put_tlink(tlink);
1085         return rc;
1086
1087         /*
1088          * reset everything back to the original state. Don't bother
1089          * dealing with errors here since we can't do anything about
1090          * them anyway.
1091          */
1092 undo_rename:
1093         CIFSSMBRenameOpenFile(xid, tcon, netfid, dentry->d_name.name,
1094                                 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1095                                             CIFS_MOUNT_MAP_SPECIAL_CHR);
1096 undo_setattr:
1097         if (dosattr != origattr) {
1098                 info_buf->Attributes = cpu_to_le32(origattr);
1099                 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, netfid,
1100                                         current->tgid))
1101                         cifsInode->cifsAttrs = origattr;
1102         }
1103
1104         goto out_close;
1105 }
1106
1107 /* copied from fs/nfs/dir.c with small changes */
1108 static void
1109 cifs_drop_nlink(struct inode *inode)
1110 {
1111         spin_lock(&inode->i_lock);
1112         if (inode->i_nlink > 0)
1113                 drop_nlink(inode);
1114         spin_unlock(&inode->i_lock);
1115 }
1116
1117 /*
1118  * If dentry->d_inode is null (usually meaning the cached dentry
1119  * is a negative dentry) then we would attempt a standard SMB delete, but
1120  * if that fails we can not attempt the fall back mechanisms on EACCESS
1121  * but will return the EACCESS to the caller. Note that the VFS does not call
1122  * unlink on negative dentries currently.
1123  */
1124 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1125 {
1126         int rc = 0;
1127         unsigned int xid;
1128         char *full_path = NULL;
1129         struct inode *inode = dentry->d_inode;
1130         struct cifsInodeInfo *cifs_inode;
1131         struct super_block *sb = dir->i_sb;
1132         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1133         struct tcon_link *tlink;
1134         struct cifs_tcon *tcon;
1135         struct TCP_Server_Info *server;
1136         struct iattr *attrs = NULL;
1137         __u32 dosattr = 0, origattr = 0;
1138
1139         cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1140
1141         tlink = cifs_sb_tlink(cifs_sb);
1142         if (IS_ERR(tlink))
1143                 return PTR_ERR(tlink);
1144         tcon = tlink_tcon(tlink);
1145         server = tcon->ses->server;
1146
1147         xid = get_xid();
1148
1149         /* Unlink can be called from rename so we can not take the
1150          * sb->s_vfs_rename_mutex here */
1151         full_path = build_path_from_dentry(dentry);
1152         if (full_path == NULL) {
1153                 rc = -ENOMEM;
1154                 goto unlink_out;
1155         }
1156
1157         if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1158                                 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1159                 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1160                         SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1161                         cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
1162                 cifs_dbg(FYI, "posix del rc %d\n", rc);
1163                 if ((rc == 0) || (rc == -ENOENT))
1164                         goto psx_del_no_retry;
1165         }
1166
1167 retry_std_delete:
1168         if (!server->ops->unlink) {
1169                 rc = -ENOSYS;
1170                 goto psx_del_no_retry;
1171         }
1172
1173         rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1174
1175 psx_del_no_retry:
1176         if (!rc) {
1177                 if (inode)
1178                         cifs_drop_nlink(inode);
1179         } else if (rc == -ENOENT) {
1180                 d_drop(dentry);
1181         } else if (rc == -EBUSY) {
1182                 if (server->ops->rename_pending_delete) {
1183                         rc = server->ops->rename_pending_delete(full_path,
1184                                                                 dentry, xid);
1185                         if (rc == 0)
1186                                 cifs_drop_nlink(inode);
1187                 }
1188         } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1189                 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1190                 if (attrs == NULL) {
1191                         rc = -ENOMEM;
1192                         goto out_reval;
1193                 }
1194
1195                 /* try to reset dos attributes */
1196                 cifs_inode = CIFS_I(inode);
1197                 origattr = cifs_inode->cifsAttrs;
1198                 if (origattr == 0)
1199                         origattr |= ATTR_NORMAL;
1200                 dosattr = origattr & ~ATTR_READONLY;
1201                 if (dosattr == 0)
1202                         dosattr |= ATTR_NORMAL;
1203                 dosattr |= ATTR_HIDDEN;
1204
1205                 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1206                 if (rc != 0)
1207                         goto out_reval;
1208
1209                 goto retry_std_delete;
1210         }
1211
1212         /* undo the setattr if we errored out and it's needed */
1213         if (rc != 0 && dosattr != 0)
1214                 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1215
1216 out_reval:
1217         if (inode) {
1218                 cifs_inode = CIFS_I(inode);
1219                 cifs_inode->time = 0;   /* will force revalidate to get info
1220                                            when needed */
1221                 inode->i_ctime = current_fs_time(sb);
1222         }
1223         dir->i_ctime = dir->i_mtime = current_fs_time(sb);
1224         cifs_inode = CIFS_I(dir);
1225         CIFS_I(dir)->time = 0;  /* force revalidate of dir as well */
1226 unlink_out:
1227         kfree(full_path);
1228         kfree(attrs);
1229         free_xid(xid);
1230         cifs_put_tlink(tlink);
1231         return rc;
1232 }
1233
1234 static int
1235 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1236                  const char *full_path, struct cifs_sb_info *cifs_sb,
1237                  struct cifs_tcon *tcon, const unsigned int xid)
1238 {
1239         int rc = 0;
1240         struct inode *inode = NULL;
1241
1242         if (tcon->unix_ext)
1243                 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1244                                               xid);
1245         else
1246                 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1247                                          xid, NULL);
1248
1249         if (rc)
1250                 return rc;
1251
1252         /*
1253          * setting nlink not necessary except in cases where we failed to get it
1254          * from the server or was set bogus. Also, since this is a brand new
1255          * inode, no need to grab the i_lock before setting the i_nlink.
1256          */
1257         if (inode->i_nlink < 2)
1258                 set_nlink(inode, 2);
1259         mode &= ~current_umask();
1260         /* must turn on setgid bit if parent dir has it */
1261         if (parent->i_mode & S_ISGID)
1262                 mode |= S_ISGID;
1263
1264         if (tcon->unix_ext) {
1265                 struct cifs_unix_set_info_args args = {
1266                         .mode   = mode,
1267                         .ctime  = NO_CHANGE_64,
1268                         .atime  = NO_CHANGE_64,
1269                         .mtime  = NO_CHANGE_64,
1270                         .device = 0,
1271                 };
1272                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1273                         args.uid = current_fsuid();
1274                         if (parent->i_mode & S_ISGID)
1275                                 args.gid = parent->i_gid;
1276                         else
1277                                 args.gid = current_fsgid();
1278                 } else {
1279                         args.uid = INVALID_UID; /* no change */
1280                         args.gid = INVALID_GID; /* no change */
1281                 }
1282                 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1283                                        cifs_sb->local_nls,
1284                                        cifs_sb->mnt_cifs_flags &
1285                                        CIFS_MOUNT_MAP_SPECIAL_CHR);
1286         } else {
1287                 struct TCP_Server_Info *server = tcon->ses->server;
1288                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1289                     (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1290                         server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1291                                                    tcon, xid);
1292                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1293                         inode->i_mode = (mode | S_IFDIR);
1294
1295                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1296                         inode->i_uid = current_fsuid();
1297                         if (inode->i_mode & S_ISGID)
1298                                 inode->i_gid = parent->i_gid;
1299                         else
1300                                 inode->i_gid = current_fsgid();
1301                 }
1302         }
1303         d_instantiate(dentry, inode);
1304         return rc;
1305 }
1306
1307 static int
1308 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1309                  const char *full_path, struct cifs_sb_info *cifs_sb,
1310                  struct cifs_tcon *tcon, const unsigned int xid)
1311 {
1312         int rc = 0;
1313         u32 oplock = 0;
1314         FILE_UNIX_BASIC_INFO *info = NULL;
1315         struct inode *newinode = NULL;
1316         struct cifs_fattr fattr;
1317
1318         info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1319         if (info == NULL) {
1320                 rc = -ENOMEM;
1321                 goto posix_mkdir_out;
1322         }
1323
1324         mode &= ~current_umask();
1325         rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1326                              NULL /* netfid */, info, &oplock, full_path,
1327                              cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1328                              CIFS_MOUNT_MAP_SPECIAL_CHR);
1329         if (rc == -EOPNOTSUPP)
1330                 goto posix_mkdir_out;
1331         else if (rc) {
1332                 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1333                 d_drop(dentry);
1334                 goto posix_mkdir_out;
1335         }
1336
1337         if (info->Type == cpu_to_le32(-1))
1338                 /* no return info, go query for it */
1339                 goto posix_mkdir_get_info;
1340         /*
1341          * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1342          * need to set uid/gid.
1343          */
1344
1345         cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1346         cifs_fill_uniqueid(inode->i_sb, &fattr);
1347         newinode = cifs_iget(inode->i_sb, &fattr);
1348         if (!newinode)
1349                 goto posix_mkdir_get_info;
1350
1351         d_instantiate(dentry, newinode);
1352
1353 #ifdef CONFIG_CIFS_DEBUG2
1354         cifs_dbg(FYI, "instantiated dentry %p %s to inode %p\n",
1355                  dentry, dentry->d_name.name, newinode);
1356
1357         if (newinode->i_nlink != 2)
1358                 cifs_dbg(FYI, "unexpected number of links %d\n",
1359                          newinode->i_nlink);
1360 #endif
1361
1362 posix_mkdir_out:
1363         kfree(info);
1364         return rc;
1365 posix_mkdir_get_info:
1366         rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1367                               xid);
1368         goto posix_mkdir_out;
1369 }
1370
1371 int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode)
1372 {
1373         int rc = 0;
1374         unsigned int xid;
1375         struct cifs_sb_info *cifs_sb;
1376         struct tcon_link *tlink;
1377         struct cifs_tcon *tcon;
1378         struct TCP_Server_Info *server;
1379         char *full_path;
1380
1381         cifs_dbg(FYI, "In cifs_mkdir, mode = 0x%hx inode = 0x%p\n",
1382                  mode, inode);
1383
1384         cifs_sb = CIFS_SB(inode->i_sb);
1385         tlink = cifs_sb_tlink(cifs_sb);
1386         if (IS_ERR(tlink))
1387                 return PTR_ERR(tlink);
1388         tcon = tlink_tcon(tlink);
1389
1390         xid = get_xid();
1391
1392         full_path = build_path_from_dentry(direntry);
1393         if (full_path == NULL) {
1394                 rc = -ENOMEM;
1395                 goto mkdir_out;
1396         }
1397
1398         if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1399                                 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1400                 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
1401                                       tcon, xid);
1402                 if (rc != -EOPNOTSUPP)
1403                         goto mkdir_out;
1404         }
1405
1406         server = tcon->ses->server;
1407
1408         if (!server->ops->mkdir) {
1409                 rc = -ENOSYS;
1410                 goto mkdir_out;
1411         }
1412
1413         /* BB add setting the equivalent of mode via CreateX w/ACLs */
1414         rc = server->ops->mkdir(xid, tcon, full_path, cifs_sb);
1415         if (rc) {
1416                 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
1417                 d_drop(direntry);
1418                 goto mkdir_out;
1419         }
1420
1421         rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
1422                               xid);
1423 mkdir_out:
1424         /*
1425          * Force revalidate to get parent dir info when needed since cached
1426          * attributes are invalid now.
1427          */
1428         CIFS_I(inode)->time = 0;
1429         kfree(full_path);
1430         free_xid(xid);
1431         cifs_put_tlink(tlink);
1432         return rc;
1433 }
1434
1435 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1436 {
1437         int rc = 0;
1438         unsigned int xid;
1439         struct cifs_sb_info *cifs_sb;
1440         struct tcon_link *tlink;
1441         struct cifs_tcon *tcon;
1442         struct TCP_Server_Info *server;
1443         char *full_path = NULL;
1444         struct cifsInodeInfo *cifsInode;
1445
1446         cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
1447
1448         xid = get_xid();
1449
1450         full_path = build_path_from_dentry(direntry);
1451         if (full_path == NULL) {
1452                 rc = -ENOMEM;
1453                 goto rmdir_exit;
1454         }
1455
1456         cifs_sb = CIFS_SB(inode->i_sb);
1457         tlink = cifs_sb_tlink(cifs_sb);
1458         if (IS_ERR(tlink)) {
1459                 rc = PTR_ERR(tlink);
1460                 goto rmdir_exit;
1461         }
1462         tcon = tlink_tcon(tlink);
1463         server = tcon->ses->server;
1464
1465         if (!server->ops->rmdir) {
1466                 rc = -ENOSYS;
1467                 cifs_put_tlink(tlink);
1468                 goto rmdir_exit;
1469         }
1470
1471         rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
1472         cifs_put_tlink(tlink);
1473
1474         if (!rc) {
1475                 spin_lock(&direntry->d_inode->i_lock);
1476                 i_size_write(direntry->d_inode, 0);
1477                 clear_nlink(direntry->d_inode);
1478                 spin_unlock(&direntry->d_inode->i_lock);
1479         }
1480
1481         cifsInode = CIFS_I(direntry->d_inode);
1482         /* force revalidate to go get info when needed */
1483         cifsInode->time = 0;
1484
1485         cifsInode = CIFS_I(inode);
1486         /*
1487          * Force revalidate to get parent dir info when needed since cached
1488          * attributes are invalid now.
1489          */
1490         cifsInode->time = 0;
1491
1492         direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime =
1493                 current_fs_time(inode->i_sb);
1494
1495 rmdir_exit:
1496         kfree(full_path);
1497         free_xid(xid);
1498         return rc;
1499 }
1500
1501 static int
1502 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
1503                const char *from_path, struct dentry *to_dentry,
1504                const char *to_path)
1505 {
1506         struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
1507         struct tcon_link *tlink;
1508         struct cifs_tcon *tcon;
1509         struct TCP_Server_Info *server;
1510         __u16 srcfid;
1511         int oplock, rc;
1512
1513         tlink = cifs_sb_tlink(cifs_sb);
1514         if (IS_ERR(tlink))
1515                 return PTR_ERR(tlink);
1516         tcon = tlink_tcon(tlink);
1517         server = tcon->ses->server;
1518
1519         if (!server->ops->rename)
1520                 return -ENOSYS;
1521
1522         /* try path-based rename first */
1523         rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
1524
1525         /*
1526          * Don't bother with rename by filehandle unless file is busy and
1527          * source. Note that cross directory moves do not work with
1528          * rename by filehandle to various Windows servers.
1529          */
1530         if (rc == 0 || rc != -EBUSY)
1531                 goto do_rename_exit;
1532
1533         /* open-file renames don't work across directories */
1534         if (to_dentry->d_parent != from_dentry->d_parent)
1535                 goto do_rename_exit;
1536
1537         /* open the file to be renamed -- we need DELETE perms */
1538         rc = CIFSSMBOpen(xid, tcon, from_path, FILE_OPEN, DELETE,
1539                          CREATE_NOT_DIR, &srcfid, &oplock, NULL,
1540                          cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1541                                 CIFS_MOUNT_MAP_SPECIAL_CHR);
1542         if (rc == 0) {
1543                 rc = CIFSSMBRenameOpenFile(xid, tcon, srcfid,
1544                                 (const char *) to_dentry->d_name.name,
1545                                 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1546                                         CIFS_MOUNT_MAP_SPECIAL_CHR);
1547                 CIFSSMBClose(xid, tcon, srcfid);
1548         }
1549 do_rename_exit:
1550         cifs_put_tlink(tlink);
1551         return rc;
1552 }
1553
1554 int
1555 cifs_rename(struct inode *source_dir, struct dentry *source_dentry,
1556             struct inode *target_dir, struct dentry *target_dentry)
1557 {
1558         char *from_name = NULL;
1559         char *to_name = NULL;
1560         struct cifs_sb_info *cifs_sb;
1561         struct tcon_link *tlink;
1562         struct cifs_tcon *tcon;
1563         FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
1564         FILE_UNIX_BASIC_INFO *info_buf_target;
1565         unsigned int xid;
1566         int rc, tmprc;
1567
1568         cifs_sb = CIFS_SB(source_dir->i_sb);
1569         tlink = cifs_sb_tlink(cifs_sb);
1570         if (IS_ERR(tlink))
1571                 return PTR_ERR(tlink);
1572         tcon = tlink_tcon(tlink);
1573
1574         xid = get_xid();
1575
1576         /*
1577          * we already have the rename sem so we do not need to
1578          * grab it again here to protect the path integrity
1579          */
1580         from_name = build_path_from_dentry(source_dentry);
1581         if (from_name == NULL) {
1582                 rc = -ENOMEM;
1583                 goto cifs_rename_exit;
1584         }
1585
1586         to_name = build_path_from_dentry(target_dentry);
1587         if (to_name == NULL) {
1588                 rc = -ENOMEM;
1589                 goto cifs_rename_exit;
1590         }
1591
1592         rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
1593                             to_name);
1594
1595         if (rc == -EEXIST && tcon->unix_ext) {
1596                 /*
1597                  * Are src and dst hardlinks of same inode? We can only tell
1598                  * with unix extensions enabled.
1599                  */
1600                 info_buf_source =
1601                         kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO),
1602                                         GFP_KERNEL);
1603                 if (info_buf_source == NULL) {
1604                         rc = -ENOMEM;
1605                         goto cifs_rename_exit;
1606                 }
1607
1608                 info_buf_target = info_buf_source + 1;
1609                 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
1610                                              info_buf_source,
1611                                              cifs_sb->local_nls,
1612                                              cifs_sb->mnt_cifs_flags &
1613                                                 CIFS_MOUNT_MAP_SPECIAL_CHR);
1614                 if (tmprc != 0)
1615                         goto unlink_target;
1616
1617                 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
1618                                              info_buf_target,
1619                                              cifs_sb->local_nls,
1620                                              cifs_sb->mnt_cifs_flags &
1621                                                 CIFS_MOUNT_MAP_SPECIAL_CHR);
1622
1623                 if (tmprc == 0 && (info_buf_source->UniqueId ==
1624                                    info_buf_target->UniqueId)) {
1625                         /* same file, POSIX says that this is a noop */
1626                         rc = 0;
1627                         goto cifs_rename_exit;
1628                 }
1629         }
1630         /*
1631          * else ... BB we could add the same check for Windows by
1632          * checking the UniqueId via FILE_INTERNAL_INFO
1633          */
1634
1635 unlink_target:
1636         /* Try unlinking the target dentry if it's not negative */
1637         if (target_dentry->d_inode && (rc == -EACCES || rc == -EEXIST)) {
1638                 tmprc = cifs_unlink(target_dir, target_dentry);
1639                 if (tmprc)
1640                         goto cifs_rename_exit;
1641                 rc = cifs_do_rename(xid, source_dentry, from_name,
1642                                     target_dentry, to_name);
1643         }
1644
1645 cifs_rename_exit:
1646         kfree(info_buf_source);
1647         kfree(from_name);
1648         kfree(to_name);
1649         free_xid(xid);
1650         cifs_put_tlink(tlink);
1651         return rc;
1652 }
1653
1654 static bool
1655 cifs_inode_needs_reval(struct inode *inode)
1656 {
1657         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
1658         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1659
1660         if (cifs_i->clientCanCacheRead)
1661                 return false;
1662
1663         if (!lookupCacheEnabled)
1664                 return true;
1665
1666         if (cifs_i->time == 0)
1667                 return true;
1668
1669         if (!time_in_range(jiffies, cifs_i->time,
1670                                 cifs_i->time + cifs_sb->actimeo))
1671                 return true;
1672
1673         /* hardlinked files w/ noserverino get "special" treatment */
1674         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
1675             S_ISREG(inode->i_mode) && inode->i_nlink != 1)
1676                 return true;
1677
1678         return false;
1679 }
1680
1681 /*
1682  * Zap the cache. Called when invalid_mapping flag is set.
1683  */
1684 int
1685 cifs_invalidate_mapping(struct inode *inode)
1686 {
1687         int rc = 0;
1688         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
1689
1690         cifs_i->invalid_mapping = false;
1691
1692         if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
1693                 rc = invalidate_inode_pages2(inode->i_mapping);
1694                 if (rc) {
1695                         cifs_dbg(VFS, "%s: could not invalidate inode %p\n",
1696                                  __func__, inode);
1697                         cifs_i->invalid_mapping = true;
1698                 }
1699         }
1700
1701         cifs_fscache_reset_inode_cookie(inode);
1702         return rc;
1703 }
1704
1705 int cifs_revalidate_file_attr(struct file *filp)
1706 {
1707         int rc = 0;
1708         struct inode *inode = file_inode(filp);
1709         struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
1710
1711         if (!cifs_inode_needs_reval(inode))
1712                 return rc;
1713
1714         if (tlink_tcon(cfile->tlink)->unix_ext)
1715                 rc = cifs_get_file_info_unix(filp);
1716         else
1717                 rc = cifs_get_file_info(filp);
1718
1719         return rc;
1720 }
1721
1722 int cifs_revalidate_dentry_attr(struct dentry *dentry)
1723 {
1724         unsigned int xid;
1725         int rc = 0;
1726         struct inode *inode = dentry->d_inode;
1727         struct super_block *sb = dentry->d_sb;
1728         char *full_path = NULL;
1729
1730         if (inode == NULL)
1731                 return -ENOENT;
1732
1733         if (!cifs_inode_needs_reval(inode))
1734                 return rc;
1735
1736         xid = get_xid();
1737
1738         /* can not safely grab the rename sem here if rename calls revalidate
1739            since that would deadlock */
1740         full_path = build_path_from_dentry(dentry);
1741         if (full_path == NULL) {
1742                 rc = -ENOMEM;
1743                 goto out;
1744         }
1745
1746         cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
1747                  full_path, inode, inode->i_count.counter,
1748                  dentry, dentry->d_time, jiffies);
1749
1750         if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
1751                 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
1752         else
1753                 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
1754                                          xid, NULL);
1755
1756 out:
1757         kfree(full_path);
1758         free_xid(xid);
1759         return rc;
1760 }
1761
1762 int cifs_revalidate_file(struct file *filp)
1763 {
1764         int rc;
1765         struct inode *inode = file_inode(filp);
1766
1767         rc = cifs_revalidate_file_attr(filp);
1768         if (rc)
1769                 return rc;
1770
1771         if (CIFS_I(inode)->invalid_mapping)
1772                 rc = cifs_invalidate_mapping(inode);
1773         return rc;
1774 }
1775
1776 /* revalidate a dentry's inode attributes */
1777 int cifs_revalidate_dentry(struct dentry *dentry)
1778 {
1779         int rc;
1780         struct inode *inode = dentry->d_inode;
1781
1782         rc = cifs_revalidate_dentry_attr(dentry);
1783         if (rc)
1784                 return rc;
1785
1786         if (CIFS_I(inode)->invalid_mapping)
1787                 rc = cifs_invalidate_mapping(inode);
1788         return rc;
1789 }
1790
1791 int cifs_getattr(struct vfsmount *mnt, struct dentry *dentry,
1792                  struct kstat *stat)
1793 {
1794         struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
1795         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1796         struct inode *inode = dentry->d_inode;
1797         int rc;
1798
1799         /*
1800          * We need to be sure that all dirty pages are written and the server
1801          * has actual ctime, mtime and file length.
1802          */
1803         if (!CIFS_I(inode)->clientCanCacheRead && inode->i_mapping &&
1804             inode->i_mapping->nrpages != 0) {
1805                 rc = filemap_fdatawait(inode->i_mapping);
1806                 if (rc) {
1807                         mapping_set_error(inode->i_mapping, rc);
1808                         return rc;
1809                 }
1810         }
1811
1812         rc = cifs_revalidate_dentry_attr(dentry);
1813         if (rc)
1814                 return rc;
1815
1816         generic_fillattr(inode, stat);
1817         stat->blksize = CIFS_MAX_MSGSIZE;
1818         stat->ino = CIFS_I(inode)->uniqueid;
1819
1820         /*
1821          * If on a multiuser mount without unix extensions or cifsacl being
1822          * enabled, and the admin hasn't overridden them, set the ownership
1823          * to the fsuid/fsgid of the current process.
1824          */
1825         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
1826             !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1827             !tcon->unix_ext) {
1828                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
1829                         stat->uid = current_fsuid();
1830                 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
1831                         stat->gid = current_fsgid();
1832         }
1833         return rc;
1834 }
1835
1836 static int cifs_truncate_page(struct address_space *mapping, loff_t from)
1837 {
1838         pgoff_t index = from >> PAGE_CACHE_SHIFT;
1839         unsigned offset = from & (PAGE_CACHE_SIZE - 1);
1840         struct page *page;
1841         int rc = 0;
1842
1843         page = grab_cache_page(mapping, index);
1844         if (!page)
1845                 return -ENOMEM;
1846
1847         zero_user_segment(page, offset, PAGE_CACHE_SIZE);
1848         unlock_page(page);
1849         page_cache_release(page);
1850         return rc;
1851 }
1852
1853 static void cifs_setsize(struct inode *inode, loff_t offset)
1854 {
1855         loff_t oldsize;
1856
1857         spin_lock(&inode->i_lock);
1858         oldsize = inode->i_size;
1859         i_size_write(inode, offset);
1860         spin_unlock(&inode->i_lock);
1861
1862         truncate_pagecache(inode, oldsize, offset);
1863 }
1864
1865 static int
1866 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
1867                    unsigned int xid, char *full_path)
1868 {
1869         int rc;
1870         struct cifsFileInfo *open_file;
1871         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1872         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1873         struct tcon_link *tlink = NULL;
1874         struct cifs_tcon *tcon = NULL;
1875         struct TCP_Server_Info *server;
1876         struct cifs_io_parms io_parms;
1877
1878         /*
1879          * To avoid spurious oplock breaks from server, in the case of
1880          * inodes that we already have open, avoid doing path based
1881          * setting of file size if we can do it by handle.
1882          * This keeps our caching token (oplock) and avoids timeouts
1883          * when the local oplock break takes longer to flush
1884          * writebehind data than the SMB timeout for the SetPathInfo
1885          * request would allow
1886          */
1887         open_file = find_writable_file(cifsInode, true);
1888         if (open_file) {
1889                 tcon = tlink_tcon(open_file->tlink);
1890                 server = tcon->ses->server;
1891                 if (server->ops->set_file_size)
1892                         rc = server->ops->set_file_size(xid, tcon, open_file,
1893                                                         attrs->ia_size, false);
1894                 else
1895                         rc = -ENOSYS;
1896                 cifsFileInfo_put(open_file);
1897                 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
1898                 if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
1899                         unsigned int bytes_written;
1900
1901                         io_parms.netfid = open_file->fid.netfid;
1902                         io_parms.pid = open_file->pid;
1903                         io_parms.tcon = tcon;
1904                         io_parms.offset = 0;
1905                         io_parms.length = attrs->ia_size;
1906                         rc = CIFSSMBWrite(xid, &io_parms, &bytes_written,
1907                                           NULL, NULL, 1);
1908                         cifs_dbg(FYI, "Wrt seteof rc %d\n", rc);
1909                 }
1910         } else
1911                 rc = -EINVAL;
1912
1913         if (!rc)
1914                 goto set_size_out;
1915
1916         if (tcon == NULL) {
1917                 tlink = cifs_sb_tlink(cifs_sb);
1918                 if (IS_ERR(tlink))
1919                         return PTR_ERR(tlink);
1920                 tcon = tlink_tcon(tlink);
1921                 server = tcon->ses->server;
1922         }
1923
1924         /*
1925          * Set file size by pathname rather than by handle either because no
1926          * valid, writeable file handle for it was found or because there was
1927          * an error setting it by handle.
1928          */
1929         if (server->ops->set_path_size)
1930                 rc = server->ops->set_path_size(xid, tcon, full_path,
1931                                                 attrs->ia_size, cifs_sb, false);
1932         else
1933                 rc = -ENOSYS;
1934         cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
1935         if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
1936                 __u16 netfid;
1937                 int oplock = 0;
1938
1939                 rc = SMBLegacyOpen(xid, tcon, full_path, FILE_OPEN,
1940                                    GENERIC_WRITE, CREATE_NOT_DIR, &netfid,
1941                                    &oplock, NULL, cifs_sb->local_nls,
1942                                    cifs_sb->mnt_cifs_flags &
1943                                                 CIFS_MOUNT_MAP_SPECIAL_CHR);
1944                 if (rc == 0) {
1945                         unsigned int bytes_written;
1946
1947                         io_parms.netfid = netfid;
1948                         io_parms.pid = current->tgid;
1949                         io_parms.tcon = tcon;
1950                         io_parms.offset = 0;
1951                         io_parms.length = attrs->ia_size;
1952                         rc = CIFSSMBWrite(xid, &io_parms, &bytes_written, NULL,
1953                                           NULL,  1);
1954                         cifs_dbg(FYI, "wrt seteof rc %d\n", rc);
1955                         CIFSSMBClose(xid, tcon, netfid);
1956                 }
1957         }
1958         if (tlink)
1959                 cifs_put_tlink(tlink);
1960
1961 set_size_out:
1962         if (rc == 0) {
1963                 cifsInode->server_eof = attrs->ia_size;
1964                 cifs_setsize(inode, attrs->ia_size);
1965                 cifs_truncate_page(inode->i_mapping, inode->i_size);
1966         }
1967
1968         return rc;
1969 }
1970
1971 static int
1972 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
1973 {
1974         int rc;
1975         unsigned int xid;
1976         char *full_path = NULL;
1977         struct inode *inode = direntry->d_inode;
1978         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1979         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1980         struct tcon_link *tlink;
1981         struct cifs_tcon *pTcon;
1982         struct cifs_unix_set_info_args *args = NULL;
1983         struct cifsFileInfo *open_file;
1984
1985         cifs_dbg(FYI, "setattr_unix on file %s attrs->ia_valid=0x%x\n",
1986                  direntry->d_name.name, attrs->ia_valid);
1987
1988         xid = get_xid();
1989
1990         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
1991                 attrs->ia_valid |= ATTR_FORCE;
1992
1993         rc = inode_change_ok(inode, attrs);
1994         if (rc < 0)
1995                 goto out;
1996
1997         full_path = build_path_from_dentry(direntry);
1998         if (full_path == NULL) {
1999                 rc = -ENOMEM;
2000                 goto out;
2001         }
2002
2003         /*
2004          * Attempt to flush data before changing attributes. We need to do
2005          * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2006          * ownership or mode then we may also need to do this. Here, we take
2007          * the safe way out and just do the flush on all setattr requests. If
2008          * the flush returns error, store it to report later and continue.
2009          *
2010          * BB: This should be smarter. Why bother flushing pages that
2011          * will be truncated anyway? Also, should we error out here if
2012          * the flush returns error?
2013          */
2014         rc = filemap_write_and_wait(inode->i_mapping);
2015         mapping_set_error(inode->i_mapping, rc);
2016         rc = 0;
2017
2018         if (attrs->ia_valid & ATTR_SIZE) {
2019                 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2020                 if (rc != 0)
2021                         goto out;
2022         }
2023
2024         /* skip mode change if it's just for clearing setuid/setgid */
2025         if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2026                 attrs->ia_valid &= ~ATTR_MODE;
2027
2028         args = kmalloc(sizeof(*args), GFP_KERNEL);
2029         if (args == NULL) {
2030                 rc = -ENOMEM;
2031                 goto out;
2032         }
2033
2034         /* set up the struct */
2035         if (attrs->ia_valid & ATTR_MODE)
2036                 args->mode = attrs->ia_mode;
2037         else
2038                 args->mode = NO_CHANGE_64;
2039
2040         if (attrs->ia_valid & ATTR_UID)
2041                 args->uid = attrs->ia_uid;
2042         else
2043                 args->uid = INVALID_UID; /* no change */
2044
2045         if (attrs->ia_valid & ATTR_GID)
2046                 args->gid = attrs->ia_gid;
2047         else
2048                 args->gid = INVALID_GID; /* no change */
2049
2050         if (attrs->ia_valid & ATTR_ATIME)
2051                 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2052         else
2053                 args->atime = NO_CHANGE_64;
2054
2055         if (attrs->ia_valid & ATTR_MTIME)
2056                 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2057         else
2058                 args->mtime = NO_CHANGE_64;
2059
2060         if (attrs->ia_valid & ATTR_CTIME)
2061                 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2062         else
2063                 args->ctime = NO_CHANGE_64;
2064
2065         args->device = 0;
2066         open_file = find_writable_file(cifsInode, true);
2067         if (open_file) {
2068                 u16 nfid = open_file->fid.netfid;
2069                 u32 npid = open_file->pid;
2070                 pTcon = tlink_tcon(open_file->tlink);
2071                 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2072                 cifsFileInfo_put(open_file);
2073         } else {
2074                 tlink = cifs_sb_tlink(cifs_sb);
2075                 if (IS_ERR(tlink)) {
2076                         rc = PTR_ERR(tlink);
2077                         goto out;
2078                 }
2079                 pTcon = tlink_tcon(tlink);
2080                 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2081                                     cifs_sb->local_nls,
2082                                     cifs_sb->mnt_cifs_flags &
2083                                         CIFS_MOUNT_MAP_SPECIAL_CHR);
2084                 cifs_put_tlink(tlink);
2085         }
2086
2087         if (rc)
2088                 goto out;
2089
2090         if ((attrs->ia_valid & ATTR_SIZE) &&
2091             attrs->ia_size != i_size_read(inode))
2092                 truncate_setsize(inode, attrs->ia_size);
2093
2094         setattr_copy(inode, attrs);
2095         mark_inode_dirty(inode);
2096
2097         /* force revalidate when any of these times are set since some
2098            of the fs types (eg ext3, fat) do not have fine enough
2099            time granularity to match protocol, and we do not have a
2100            a way (yet) to query the server fs's time granularity (and
2101            whether it rounds times down).
2102         */
2103         if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2104                 cifsInode->time = 0;
2105 out:
2106         kfree(args);
2107         kfree(full_path);
2108         free_xid(xid);
2109         return rc;
2110 }
2111
2112 static int
2113 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2114 {
2115         unsigned int xid;
2116         kuid_t uid = INVALID_UID;
2117         kgid_t gid = INVALID_GID;
2118         struct inode *inode = direntry->d_inode;
2119         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2120         struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2121         char *full_path = NULL;
2122         int rc = -EACCES;
2123         __u32 dosattr = 0;
2124         __u64 mode = NO_CHANGE_64;
2125
2126         xid = get_xid();
2127
2128         cifs_dbg(FYI, "setattr on file %s attrs->iavalid 0x%x\n",
2129                  direntry->d_name.name, attrs->ia_valid);
2130
2131         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2132                 attrs->ia_valid |= ATTR_FORCE;
2133
2134         rc = inode_change_ok(inode, attrs);
2135         if (rc < 0) {
2136                 free_xid(xid);
2137                 return rc;
2138         }
2139
2140         full_path = build_path_from_dentry(direntry);
2141         if (full_path == NULL) {
2142                 rc = -ENOMEM;
2143                 free_xid(xid);
2144                 return rc;
2145         }
2146
2147         /*
2148          * Attempt to flush data before changing attributes. We need to do
2149          * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2150          * ownership or mode then we may also need to do this. Here, we take
2151          * the safe way out and just do the flush on all setattr requests. If
2152          * the flush returns error, store it to report later and continue.
2153          *
2154          * BB: This should be smarter. Why bother flushing pages that
2155          * will be truncated anyway? Also, should we error out here if
2156          * the flush returns error?
2157          */
2158         rc = filemap_write_and_wait(inode->i_mapping);
2159         mapping_set_error(inode->i_mapping, rc);
2160         rc = 0;
2161
2162         if (attrs->ia_valid & ATTR_SIZE) {
2163                 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2164                 if (rc != 0)
2165                         goto cifs_setattr_exit;
2166         }
2167
2168         if (attrs->ia_valid & ATTR_UID)
2169                 uid = attrs->ia_uid;
2170
2171         if (attrs->ia_valid & ATTR_GID)
2172                 gid = attrs->ia_gid;
2173
2174 #ifdef CONFIG_CIFS_ACL
2175         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
2176                 if (uid_valid(uid) || gid_valid(gid)) {
2177                         rc = id_mode_to_cifs_acl(inode, full_path, NO_CHANGE_64,
2178                                                         uid, gid);
2179                         if (rc) {
2180                                 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
2181                                          __func__, rc);
2182                                 goto cifs_setattr_exit;
2183                         }
2184                 }
2185         } else
2186 #endif /* CONFIG_CIFS_ACL */
2187         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
2188                 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
2189
2190         /* skip mode change if it's just for clearing setuid/setgid */
2191         if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2192                 attrs->ia_valid &= ~ATTR_MODE;
2193
2194         if (attrs->ia_valid & ATTR_MODE) {
2195                 mode = attrs->ia_mode;
2196                 rc = 0;
2197 #ifdef CONFIG_CIFS_ACL
2198                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
2199                         rc = id_mode_to_cifs_acl(inode, full_path, mode,
2200                                                 INVALID_UID, INVALID_GID);
2201                         if (rc) {
2202                                 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
2203                                          __func__, rc);
2204                                 goto cifs_setattr_exit;
2205                         }
2206                 } else
2207 #endif /* CONFIG_CIFS_ACL */
2208                 if (((mode & S_IWUGO) == 0) &&
2209                     (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
2210
2211                         dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
2212
2213                         /* fix up mode if we're not using dynperm */
2214                         if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
2215                                 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
2216                 } else if ((mode & S_IWUGO) &&
2217                            (cifsInode->cifsAttrs & ATTR_READONLY)) {
2218
2219                         dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
2220                         /* Attributes of 0 are ignored */
2221                         if (dosattr == 0)
2222                                 dosattr |= ATTR_NORMAL;
2223
2224                         /* reset local inode permissions to normal */
2225                         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2226                                 attrs->ia_mode &= ~(S_IALLUGO);
2227                                 if (S_ISDIR(inode->i_mode))
2228                                         attrs->ia_mode |=
2229                                                 cifs_sb->mnt_dir_mode;
2230                                 else
2231                                         attrs->ia_mode |=
2232                                                 cifs_sb->mnt_file_mode;
2233                         }
2234                 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
2235                         /* ignore mode change - ATTR_READONLY hasn't changed */
2236                         attrs->ia_valid &= ~ATTR_MODE;
2237                 }
2238         }
2239
2240         if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
2241             ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
2242                 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
2243                 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
2244
2245                 /* Even if error on time set, no sense failing the call if
2246                 the server would set the time to a reasonable value anyway,
2247                 and this check ensures that we are not being called from
2248                 sys_utimes in which case we ought to fail the call back to
2249                 the user when the server rejects the call */
2250                 if ((rc) && (attrs->ia_valid &
2251                                 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
2252                         rc = 0;
2253         }
2254
2255         /* do not need local check to inode_check_ok since the server does
2256            that */
2257         if (rc)
2258                 goto cifs_setattr_exit;
2259
2260         if ((attrs->ia_valid & ATTR_SIZE) &&
2261             attrs->ia_size != i_size_read(inode))
2262                 truncate_setsize(inode, attrs->ia_size);
2263
2264         setattr_copy(inode, attrs);
2265         mark_inode_dirty(inode);
2266
2267 cifs_setattr_exit:
2268         kfree(full_path);
2269         free_xid(xid);
2270         return rc;
2271 }
2272
2273 int
2274 cifs_setattr(struct dentry *direntry, struct iattr *attrs)
2275 {
2276         struct inode *inode = direntry->d_inode;
2277         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2278         struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
2279
2280         if (pTcon->unix_ext)
2281                 return cifs_setattr_unix(direntry, attrs);
2282
2283         return cifs_setattr_nounix(direntry, attrs);
2284
2285         /* BB: add cifs_setattr_legacy for really old servers */
2286 }
2287
2288 #if 0
2289 void cifs_delete_inode(struct inode *inode)
2290 {
2291         cifs_dbg(FYI, "In cifs_delete_inode, inode = 0x%p\n", inode);
2292         /* may have to add back in if and when safe distributed caching of
2293            directories added e.g. via FindNotify */
2294 }
2295 #endif