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