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