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