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