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