1 // SPDX-License-Identifier: LGPL-2.1
2 /*
3 *
4 * Copyright (C) International Business Machines Corp., 2002,2010
5 * Author(s): Steve French (sfrench@us.ibm.com)
6 *
7 */
8 #include <linux/fs.h>
9 #include <linux/stat.h>
10 #include <linux/slab.h>
11 #include <linux/pagemap.h>
12 #include <linux/freezer.h>
13 #include <linux/sched/signal.h>
14 #include <linux/wait_bit.h>
15 #include <linux/fiemap.h>
16 #include <asm/div64.h>
17 #include "cifsfs.h"
18 #include "cifspdu.h"
19 #include "cifsglob.h"
20 #include "cifsproto.h"
21 #include "smb2proto.h"
22 #include "cifs_debug.h"
23 #include "cifs_fs_sb.h"
24 #include "cifs_unicode.h"
25 #include "fscache.h"
26 #include "fs_context.h"
27 #include "cifs_ioctl.h"
28 #include "cached_dir.h"
29
cifs_set_ops(struct inode * inode)30 static void cifs_set_ops(struct inode *inode)
31 {
32 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
33
34 switch (inode->i_mode & S_IFMT) {
35 case S_IFREG:
36 inode->i_op = &cifs_file_inode_ops;
37 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
38 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
39 inode->i_fop = &cifs_file_direct_nobrl_ops;
40 else
41 inode->i_fop = &cifs_file_direct_ops;
42 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
43 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
44 inode->i_fop = &cifs_file_strict_nobrl_ops;
45 else
46 inode->i_fop = &cifs_file_strict_ops;
47 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
48 inode->i_fop = &cifs_file_nobrl_ops;
49 else { /* not direct, send byte range locks */
50 inode->i_fop = &cifs_file_ops;
51 }
52
53 /* check if server can support readahead */
54 if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read <
55 PAGE_SIZE + MAX_CIFS_HDR_SIZE)
56 inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
57 else
58 inode->i_data.a_ops = &cifs_addr_ops;
59 break;
60 case S_IFDIR:
61 if (IS_AUTOMOUNT(inode)) {
62 inode->i_op = &cifs_namespace_inode_operations;
63 } else {
64 inode->i_op = &cifs_dir_inode_ops;
65 inode->i_fop = &cifs_dir_ops;
66 }
67 break;
68 case S_IFLNK:
69 inode->i_op = &cifs_symlink_inode_ops;
70 break;
71 default:
72 init_special_inode(inode, inode->i_mode, inode->i_rdev);
73 break;
74 }
75 }
76
77 /* check inode attributes against fattr. If they don't match, tag the
78 * inode for cache invalidation
79 */
80 static void
cifs_revalidate_cache(struct inode * inode,struct cifs_fattr * fattr)81 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
82 {
83 struct cifs_fscache_inode_coherency_data cd;
84 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
85
86 cifs_dbg(FYI, "%s: revalidating inode %llu\n",
87 __func__, cifs_i->uniqueid);
88
89 if (inode->i_state & I_NEW) {
90 cifs_dbg(FYI, "%s: inode %llu is new\n",
91 __func__, cifs_i->uniqueid);
92 return;
93 }
94
95 /* don't bother with revalidation if we have an oplock */
96 if (CIFS_CACHE_READ(cifs_i)) {
97 cifs_dbg(FYI, "%s: inode %llu is oplocked\n",
98 __func__, cifs_i->uniqueid);
99 return;
100 }
101
102 /* revalidate if mtime or size have changed */
103 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
104 if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
105 cifs_i->server_eof == fattr->cf_eof) {
106 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
107 __func__, cifs_i->uniqueid);
108 return;
109 }
110
111 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n",
112 __func__, cifs_i->uniqueid);
113 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags);
114 /* Invalidate fscache cookie */
115 cifs_fscache_fill_coherency(&cifs_i->netfs.inode, &cd);
116 fscache_invalidate(cifs_inode_cookie(inode), &cd, i_size_read(inode), 0);
117 }
118
119 /*
120 * copy nlink to the inode, unless it wasn't provided. Provide
121 * sane values if we don't have an existing one and none was provided
122 */
123 static void
cifs_nlink_fattr_to_inode(struct inode * inode,struct cifs_fattr * fattr)124 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
125 {
126 /*
127 * if we're in a situation where we can't trust what we
128 * got from the server (readdir, some non-unix cases)
129 * fake reasonable values
130 */
131 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) {
132 /* only provide fake values on a new inode */
133 if (inode->i_state & I_NEW) {
134 if (fattr->cf_cifsattrs & ATTR_DIRECTORY)
135 set_nlink(inode, 2);
136 else
137 set_nlink(inode, 1);
138 }
139 return;
140 }
141
142 /* we trust the server, so update it */
143 set_nlink(inode, fattr->cf_nlink);
144 }
145
146 /* populate an inode with info from a cifs_fattr struct */
147 int
cifs_fattr_to_inode(struct inode * inode,struct cifs_fattr * fattr)148 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
149 {
150 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
151 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
152
153 if (!(inode->i_state & I_NEW) &&
154 unlikely(inode_wrong_type(inode, fattr->cf_mode))) {
155 CIFS_I(inode)->time = 0; /* force reval */
156 return -ESTALE;
157 }
158
159 cifs_revalidate_cache(inode, fattr);
160
161 spin_lock(&inode->i_lock);
162 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode);
163 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode);
164 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode);
165 /* we do not want atime to be less than mtime, it broke some apps */
166 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0)
167 inode->i_atime = fattr->cf_mtime;
168 else
169 inode->i_atime = fattr->cf_atime;
170 inode->i_mtime = fattr->cf_mtime;
171 inode_set_ctime_to_ts(inode, fattr->cf_ctime);
172 inode->i_rdev = fattr->cf_rdev;
173 cifs_nlink_fattr_to_inode(inode, fattr);
174 inode->i_uid = fattr->cf_uid;
175 inode->i_gid = fattr->cf_gid;
176
177 /* if dynperm is set, don't clobber existing mode */
178 if (inode->i_state & I_NEW ||
179 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
180 inode->i_mode = fattr->cf_mode;
181
182 cifs_i->cifsAttrs = fattr->cf_cifsattrs;
183
184 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
185 cifs_i->time = 0;
186 else
187 cifs_i->time = jiffies;
188
189 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)
190 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
191 else
192 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags);
193
194 cifs_i->server_eof = fattr->cf_eof;
195 /*
196 * Can't safely change the file size here if the client is writing to
197 * it due to potential races.
198 */
199 if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
200 i_size_write(inode, fattr->cf_eof);
201
202 /*
203 * i_blocks is not related to (i_size / i_blksize),
204 * but instead 512 byte (2**9) size is required for
205 * calculating num blocks.
206 */
207 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9;
208 }
209
210 if (S_ISLNK(fattr->cf_mode)) {
211 kfree(cifs_i->symlink_target);
212 cifs_i->symlink_target = fattr->cf_symlink_target;
213 fattr->cf_symlink_target = NULL;
214 }
215 spin_unlock(&inode->i_lock);
216
217 if (fattr->cf_flags & CIFS_FATTR_JUNCTION)
218 inode->i_flags |= S_AUTOMOUNT;
219 if (inode->i_state & I_NEW)
220 cifs_set_ops(inode);
221 return 0;
222 }
223
224 void
cifs_fill_uniqueid(struct super_block * sb,struct cifs_fattr * fattr)225 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr)
226 {
227 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
228
229 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
230 return;
231
232 fattr->cf_uniqueid = iunique(sb, ROOT_I);
233 }
234
235 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */
236 void
cifs_unix_basic_to_fattr(struct cifs_fattr * fattr,FILE_UNIX_BASIC_INFO * info,struct cifs_sb_info * cifs_sb)237 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info,
238 struct cifs_sb_info *cifs_sb)
239 {
240 memset(fattr, 0, sizeof(*fattr));
241 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId);
242 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes);
243 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
244
245 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
246 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime);
247 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange);
248 /* old POSIX extensions don't get create time */
249
250 fattr->cf_mode = le64_to_cpu(info->Permissions);
251
252 /*
253 * Since we set the inode type below we need to mask off
254 * to avoid strange results if bits set above.
255 */
256 fattr->cf_mode &= ~S_IFMT;
257 switch (le32_to_cpu(info->Type)) {
258 case UNIX_FILE:
259 fattr->cf_mode |= S_IFREG;
260 fattr->cf_dtype = DT_REG;
261 break;
262 case UNIX_SYMLINK:
263 fattr->cf_mode |= S_IFLNK;
264 fattr->cf_dtype = DT_LNK;
265 break;
266 case UNIX_DIR:
267 fattr->cf_mode |= S_IFDIR;
268 fattr->cf_dtype = DT_DIR;
269 break;
270 case UNIX_CHARDEV:
271 fattr->cf_mode |= S_IFCHR;
272 fattr->cf_dtype = DT_CHR;
273 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
274 le64_to_cpu(info->DevMinor) & MINORMASK);
275 break;
276 case UNIX_BLOCKDEV:
277 fattr->cf_mode |= S_IFBLK;
278 fattr->cf_dtype = DT_BLK;
279 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor),
280 le64_to_cpu(info->DevMinor) & MINORMASK);
281 break;
282 case UNIX_FIFO:
283 fattr->cf_mode |= S_IFIFO;
284 fattr->cf_dtype = DT_FIFO;
285 break;
286 case UNIX_SOCKET:
287 fattr->cf_mode |= S_IFSOCK;
288 fattr->cf_dtype = DT_SOCK;
289 break;
290 default:
291 /* safest to call it a file if we do not know */
292 fattr->cf_mode |= S_IFREG;
293 fattr->cf_dtype = DT_REG;
294 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type));
295 break;
296 }
297
298 fattr->cf_uid = cifs_sb->ctx->linux_uid;
299 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) {
300 u64 id = le64_to_cpu(info->Uid);
301 if (id < ((uid_t)-1)) {
302 kuid_t uid = make_kuid(&init_user_ns, id);
303 if (uid_valid(uid))
304 fattr->cf_uid = uid;
305 }
306 }
307
308 fattr->cf_gid = cifs_sb->ctx->linux_gid;
309 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) {
310 u64 id = le64_to_cpu(info->Gid);
311 if (id < ((gid_t)-1)) {
312 kgid_t gid = make_kgid(&init_user_ns, id);
313 if (gid_valid(gid))
314 fattr->cf_gid = gid;
315 }
316 }
317
318 fattr->cf_nlink = le64_to_cpu(info->Nlinks);
319 }
320
321 /*
322 * Fill a cifs_fattr struct with fake inode info.
323 *
324 * Needed to setup cifs_fattr data for the directory which is the
325 * junction to the new submount (ie to setup the fake directory
326 * which represents a DFS referral or reparse mount point).
327 */
cifs_create_junction_fattr(struct cifs_fattr * fattr,struct super_block * sb)328 static void cifs_create_junction_fattr(struct cifs_fattr *fattr,
329 struct super_block *sb)
330 {
331 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
332
333 cifs_dbg(FYI, "%s: creating fake fattr\n", __func__);
334
335 memset(fattr, 0, sizeof(*fattr));
336 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
337 fattr->cf_uid = cifs_sb->ctx->linux_uid;
338 fattr->cf_gid = cifs_sb->ctx->linux_gid;
339 ktime_get_coarse_real_ts64(&fattr->cf_mtime);
340 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
341 fattr->cf_nlink = 2;
342 fattr->cf_flags = CIFS_FATTR_JUNCTION;
343 }
344
345 /* Update inode with final fattr data */
update_inode_info(struct super_block * sb,struct cifs_fattr * fattr,struct inode ** inode)346 static int update_inode_info(struct super_block *sb,
347 struct cifs_fattr *fattr,
348 struct inode **inode)
349 {
350 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
351 int rc = 0;
352
353 if (!*inode) {
354 *inode = cifs_iget(sb, fattr);
355 if (!*inode)
356 rc = -ENOMEM;
357 return rc;
358 }
359 /* We already have inode, update it.
360 *
361 * If file type or uniqueid is different, return error.
362 */
363 if (unlikely((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
364 CIFS_I(*inode)->uniqueid != fattr->cf_uniqueid)) {
365 CIFS_I(*inode)->time = 0; /* force reval */
366 return -ESTALE;
367 }
368 return cifs_fattr_to_inode(*inode, fattr);
369 }
370
371 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
372 static int
cifs_get_file_info_unix(struct file * filp)373 cifs_get_file_info_unix(struct file *filp)
374 {
375 int rc;
376 unsigned int xid;
377 FILE_UNIX_BASIC_INFO find_data;
378 struct cifs_fattr fattr = {};
379 struct inode *inode = file_inode(filp);
380 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
381 struct cifsFileInfo *cfile = filp->private_data;
382 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
383
384 xid = get_xid();
385
386 if (cfile->symlink_target) {
387 fattr.cf_symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL);
388 if (!fattr.cf_symlink_target) {
389 rc = -ENOMEM;
390 goto cifs_gfiunix_out;
391 }
392 }
393
394 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data);
395 if (!rc) {
396 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb);
397 } else if (rc == -EREMOTE) {
398 cifs_create_junction_fattr(&fattr, inode->i_sb);
399 rc = 0;
400 } else
401 goto cifs_gfiunix_out;
402
403 rc = cifs_fattr_to_inode(inode, &fattr);
404
405 cifs_gfiunix_out:
406 free_xid(xid);
407 return rc;
408 }
409
cifs_get_unix_fattr(const unsigned char * full_path,struct super_block * sb,struct cifs_fattr * fattr,struct inode ** pinode,const unsigned int xid)410 static int cifs_get_unix_fattr(const unsigned char *full_path,
411 struct super_block *sb,
412 struct cifs_fattr *fattr,
413 struct inode **pinode,
414 const unsigned int xid)
415 {
416 struct TCP_Server_Info *server;
417 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
418 FILE_UNIX_BASIC_INFO find_data;
419 struct cifs_tcon *tcon;
420 struct tcon_link *tlink;
421 int rc, tmprc;
422
423 cifs_dbg(FYI, "Getting info on %s\n", full_path);
424
425 tlink = cifs_sb_tlink(cifs_sb);
426 if (IS_ERR(tlink))
427 return PTR_ERR(tlink);
428 tcon = tlink_tcon(tlink);
429 server = tcon->ses->server;
430
431 /* could have done a find first instead but this returns more info */
432 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
433 cifs_sb->local_nls, cifs_remap(cifs_sb));
434 cifs_dbg(FYI, "%s: query path info: rc = %d\n", __func__, rc);
435 cifs_put_tlink(tlink);
436
437 if (!rc) {
438 cifs_unix_basic_to_fattr(fattr, &find_data, cifs_sb);
439 } else if (rc == -EREMOTE) {
440 cifs_create_junction_fattr(fattr, sb);
441 rc = 0;
442 } else {
443 return rc;
444 }
445
446 if (!*pinode)
447 cifs_fill_uniqueid(sb, fattr);
448
449 /* check for Minshall+French symlinks */
450 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
451 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
452 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
453 }
454
455 if (S_ISLNK(fattr->cf_mode) && !fattr->cf_symlink_target) {
456 if (!server->ops->query_symlink)
457 return -EOPNOTSUPP;
458 rc = server->ops->query_symlink(xid, tcon,
459 cifs_sb, full_path,
460 &fattr->cf_symlink_target,
461 NULL);
462 cifs_dbg(FYI, "%s: query_symlink: %d\n", __func__, rc);
463 }
464 return rc;
465 }
466
cifs_get_inode_info_unix(struct inode ** pinode,const unsigned char * full_path,struct super_block * sb,unsigned int xid)467 int cifs_get_inode_info_unix(struct inode **pinode,
468 const unsigned char *full_path,
469 struct super_block *sb, unsigned int xid)
470 {
471 struct cifs_fattr fattr = {};
472 int rc;
473
474 rc = cifs_get_unix_fattr(full_path, sb, &fattr, pinode, xid);
475 if (rc)
476 goto out;
477
478 rc = update_inode_info(sb, &fattr, pinode);
479 out:
480 kfree(fattr.cf_symlink_target);
481 return rc;
482 }
483 #else
cifs_get_unix_fattr(const unsigned char * full_path,struct super_block * sb,struct cifs_fattr * fattr,struct inode ** pinode,const unsigned int xid)484 static inline int cifs_get_unix_fattr(const unsigned char *full_path,
485 struct super_block *sb,
486 struct cifs_fattr *fattr,
487 struct inode **pinode,
488 const unsigned int xid)
489 {
490 return -EOPNOTSUPP;
491 }
492
cifs_get_inode_info_unix(struct inode ** pinode,const unsigned char * full_path,struct super_block * sb,unsigned int xid)493 int cifs_get_inode_info_unix(struct inode **pinode,
494 const unsigned char *full_path,
495 struct super_block *sb, unsigned int xid)
496 {
497 return -EOPNOTSUPP;
498 }
499 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
500
501 static int
cifs_sfu_type(struct cifs_fattr * fattr,const char * path,struct cifs_sb_info * cifs_sb,unsigned int xid)502 cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
503 struct cifs_sb_info *cifs_sb, unsigned int xid)
504 {
505 int rc;
506 __u32 oplock;
507 struct tcon_link *tlink;
508 struct cifs_tcon *tcon;
509 struct cifs_fid fid;
510 struct cifs_open_parms oparms;
511 struct cifs_io_parms io_parms = {0};
512 char buf[24];
513 unsigned int bytes_read;
514 char *pbuf;
515 int buf_type = CIFS_NO_BUFFER;
516
517 pbuf = buf;
518
519 fattr->cf_mode &= ~S_IFMT;
520
521 if (fattr->cf_eof == 0) {
522 fattr->cf_mode |= S_IFIFO;
523 fattr->cf_dtype = DT_FIFO;
524 return 0;
525 } else if (fattr->cf_eof < 8) {
526 fattr->cf_mode |= S_IFREG;
527 fattr->cf_dtype = DT_REG;
528 return -EINVAL; /* EOPNOTSUPP? */
529 }
530
531 tlink = cifs_sb_tlink(cifs_sb);
532 if (IS_ERR(tlink))
533 return PTR_ERR(tlink);
534 tcon = tlink_tcon(tlink);
535
536 oparms = (struct cifs_open_parms) {
537 .tcon = tcon,
538 .cifs_sb = cifs_sb,
539 .desired_access = GENERIC_READ,
540 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
541 .disposition = FILE_OPEN,
542 .path = path,
543 .fid = &fid,
544 };
545
546 if (tcon->ses->server->oplocks)
547 oplock = REQ_OPLOCK;
548 else
549 oplock = 0;
550 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL);
551 if (rc) {
552 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc);
553 cifs_put_tlink(tlink);
554 return rc;
555 }
556
557 /* Read header */
558 io_parms.netfid = fid.netfid;
559 io_parms.pid = current->tgid;
560 io_parms.tcon = tcon;
561 io_parms.offset = 0;
562 io_parms.length = 24;
563
564 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms,
565 &bytes_read, &pbuf, &buf_type);
566 if ((rc == 0) && (bytes_read >= 8)) {
567 if (memcmp("IntxBLK", pbuf, 8) == 0) {
568 cifs_dbg(FYI, "Block device\n");
569 fattr->cf_mode |= S_IFBLK;
570 fattr->cf_dtype = DT_BLK;
571 if (bytes_read == 24) {
572 /* we have enough to decode dev num */
573 __u64 mjr; /* major */
574 __u64 mnr; /* minor */
575 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
576 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
577 fattr->cf_rdev = MKDEV(mjr, mnr);
578 }
579 } else if (memcmp("IntxCHR", pbuf, 8) == 0) {
580 cifs_dbg(FYI, "Char device\n");
581 fattr->cf_mode |= S_IFCHR;
582 fattr->cf_dtype = DT_CHR;
583 if (bytes_read == 24) {
584 /* we have enough to decode dev num */
585 __u64 mjr; /* major */
586 __u64 mnr; /* minor */
587 mjr = le64_to_cpu(*(__le64 *)(pbuf+8));
588 mnr = le64_to_cpu(*(__le64 *)(pbuf+16));
589 fattr->cf_rdev = MKDEV(mjr, mnr);
590 }
591 } else if (memcmp("IntxLNK", pbuf, 7) == 0) {
592 cifs_dbg(FYI, "Symlink\n");
593 fattr->cf_mode |= S_IFLNK;
594 fattr->cf_dtype = DT_LNK;
595 } else {
596 fattr->cf_mode |= S_IFREG; /* file? */
597 fattr->cf_dtype = DT_REG;
598 rc = -EOPNOTSUPP;
599 }
600 } else {
601 fattr->cf_mode |= S_IFREG; /* then it is a file */
602 fattr->cf_dtype = DT_REG;
603 rc = -EOPNOTSUPP; /* or some unknown SFU type */
604 }
605
606 tcon->ses->server->ops->close(xid, tcon, &fid);
607 cifs_put_tlink(tlink);
608 return rc;
609 }
610
611 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
612
613 /*
614 * Fetch mode bits as provided by SFU.
615 *
616 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ?
617 */
cifs_sfu_mode(struct cifs_fattr * fattr,const unsigned char * path,struct cifs_sb_info * cifs_sb,unsigned int xid)618 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
619 struct cifs_sb_info *cifs_sb, unsigned int xid)
620 {
621 #ifdef CONFIG_CIFS_XATTR
622 ssize_t rc;
623 char ea_value[4];
624 __u32 mode;
625 struct tcon_link *tlink;
626 struct cifs_tcon *tcon;
627
628 tlink = cifs_sb_tlink(cifs_sb);
629 if (IS_ERR(tlink))
630 return PTR_ERR(tlink);
631 tcon = tlink_tcon(tlink);
632
633 if (tcon->ses->server->ops->query_all_EAs == NULL) {
634 cifs_put_tlink(tlink);
635 return -EOPNOTSUPP;
636 }
637
638 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
639 "SETFILEBITS", ea_value, 4 /* size of buf */,
640 cifs_sb);
641 cifs_put_tlink(tlink);
642 if (rc < 0)
643 return (int)rc;
644 else if (rc > 3) {
645 mode = le32_to_cpu(*((__le32 *)ea_value));
646 fattr->cf_mode &= ~SFBITS_MASK;
647 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n",
648 mode, fattr->cf_mode);
649 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode;
650 cifs_dbg(FYI, "special mode bits 0%o\n", mode);
651 }
652
653 return 0;
654 #else
655 return -EOPNOTSUPP;
656 #endif
657 }
658
659 /* Fill a cifs_fattr struct with info from POSIX info struct */
smb311_posix_info_to_fattr(struct cifs_fattr * fattr,struct cifs_open_info_data * data,struct cifs_sid * owner,struct cifs_sid * group,struct super_block * sb)660 static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr,
661 struct cifs_open_info_data *data,
662 struct cifs_sid *owner,
663 struct cifs_sid *group,
664 struct super_block *sb)
665 {
666 struct smb311_posix_qinfo *info = &data->posix_fi;
667 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
668 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
669
670 memset(fattr, 0, sizeof(*fattr));
671
672 /* no fattr->flags to set */
673 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes);
674 fattr->cf_uniqueid = le64_to_cpu(info->Inode);
675
676 if (info->LastAccessTime)
677 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
678 else
679 ktime_get_coarse_real_ts64(&fattr->cf_atime);
680
681 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
682 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
683
684 if (data->adjust_tz) {
685 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
686 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
687 }
688
689 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
690 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
691 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
692
693 fattr->cf_nlink = le32_to_cpu(info->HardLinks);
694 fattr->cf_mode = (umode_t) le32_to_cpu(info->Mode);
695 /* The srv fs device id is overridden on network mount so setting rdev isn't needed here */
696 /* fattr->cf_rdev = le32_to_cpu(info->DeviceId); */
697
698 if (data->symlink) {
699 fattr->cf_mode |= S_IFLNK;
700 fattr->cf_dtype = DT_LNK;
701 fattr->cf_symlink_target = data->symlink_target;
702 data->symlink_target = NULL;
703 } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
704 fattr->cf_mode |= S_IFDIR;
705 fattr->cf_dtype = DT_DIR;
706 } else { /* file */
707 fattr->cf_mode |= S_IFREG;
708 fattr->cf_dtype = DT_REG;
709 }
710 /* else if reparse point ... TODO: add support for FIFO and blk dev; special file types */
711
712 sid_to_id(cifs_sb, owner, fattr, SIDOWNER);
713 sid_to_id(cifs_sb, group, fattr, SIDGROUP);
714
715 cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n",
716 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink);
717 }
718
cifs_reparse_point_to_fattr(struct cifs_sb_info * cifs_sb,struct cifs_fattr * fattr,u32 tag)719 bool cifs_reparse_point_to_fattr(struct cifs_sb_info *cifs_sb,
720 struct cifs_fattr *fattr,
721 u32 tag)
722 {
723 switch (tag) {
724 case IO_REPARSE_TAG_LX_SYMLINK:
725 fattr->cf_mode |= S_IFLNK | cifs_sb->ctx->file_mode;
726 fattr->cf_dtype = DT_LNK;
727 break;
728 case IO_REPARSE_TAG_LX_FIFO:
729 fattr->cf_mode |= S_IFIFO | cifs_sb->ctx->file_mode;
730 fattr->cf_dtype = DT_FIFO;
731 break;
732 case IO_REPARSE_TAG_AF_UNIX:
733 fattr->cf_mode |= S_IFSOCK | cifs_sb->ctx->file_mode;
734 fattr->cf_dtype = DT_SOCK;
735 break;
736 case IO_REPARSE_TAG_LX_CHR:
737 fattr->cf_mode |= S_IFCHR | cifs_sb->ctx->file_mode;
738 fattr->cf_dtype = DT_CHR;
739 break;
740 case IO_REPARSE_TAG_LX_BLK:
741 fattr->cf_mode |= S_IFBLK | cifs_sb->ctx->file_mode;
742 fattr->cf_dtype = DT_BLK;
743 break;
744 case 0: /* SMB1 symlink */
745 case IO_REPARSE_TAG_SYMLINK:
746 case IO_REPARSE_TAG_NFS:
747 fattr->cf_mode = S_IFLNK;
748 fattr->cf_dtype = DT_LNK;
749 break;
750 default:
751 return false;
752 }
753 return true;
754 }
755
cifs_open_info_to_fattr(struct cifs_fattr * fattr,struct cifs_open_info_data * data,struct super_block * sb)756 static void cifs_open_info_to_fattr(struct cifs_fattr *fattr,
757 struct cifs_open_info_data *data,
758 struct super_block *sb)
759 {
760 struct smb2_file_all_info *info = &data->fi;
761 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
762 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
763
764 memset(fattr, 0, sizeof(*fattr));
765 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
766 if (info->DeletePending)
767 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
768
769 if (info->LastAccessTime)
770 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
771 else
772 ktime_get_coarse_real_ts64(&fattr->cf_atime);
773
774 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
775 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
776
777 if (data->adjust_tz) {
778 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj;
779 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj;
780 }
781
782 fattr->cf_eof = le64_to_cpu(info->EndOfFile);
783 fattr->cf_bytes = le64_to_cpu(info->AllocationSize);
784 fattr->cf_createtime = le64_to_cpu(info->CreationTime);
785 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks);
786
787 if (cifs_open_data_reparse(data) &&
788 cifs_reparse_point_to_fattr(cifs_sb, fattr, data->reparse_tag))
789 goto out_reparse;
790
791 if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
792 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode;
793 fattr->cf_dtype = DT_DIR;
794 /*
795 * Server can return wrong NumberOfLinks value for directories
796 * when Unix extensions are disabled - fake it.
797 */
798 if (!tcon->unix_ext)
799 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
800 } else {
801 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode;
802 fattr->cf_dtype = DT_REG;
803
804 /* clear write bits if ATTR_READONLY is set */
805 if (fattr->cf_cifsattrs & ATTR_READONLY)
806 fattr->cf_mode &= ~(S_IWUGO);
807
808 /*
809 * Don't accept zero nlink from non-unix servers unless
810 * delete is pending. Instead mark it as unknown.
811 */
812 if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
813 !info->DeletePending) {
814 cifs_dbg(VFS, "bogus file nlink value %u\n",
815 fattr->cf_nlink);
816 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
817 }
818 }
819
820 out_reparse:
821 if (S_ISLNK(fattr->cf_mode)) {
822 fattr->cf_symlink_target = data->symlink_target;
823 data->symlink_target = NULL;
824 }
825
826 fattr->cf_uid = cifs_sb->ctx->linux_uid;
827 fattr->cf_gid = cifs_sb->ctx->linux_gid;
828 }
829
830 static int
cifs_get_file_info(struct file * filp)831 cifs_get_file_info(struct file *filp)
832 {
833 int rc;
834 unsigned int xid;
835 struct cifs_open_info_data data = {};
836 struct cifs_fattr fattr;
837 struct inode *inode = file_inode(filp);
838 struct cifsFileInfo *cfile = filp->private_data;
839 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
840 struct TCP_Server_Info *server = tcon->ses->server;
841
842 if (!server->ops->query_file_info)
843 return -ENOSYS;
844
845 xid = get_xid();
846 rc = server->ops->query_file_info(xid, tcon, cfile, &data);
847 switch (rc) {
848 case 0:
849 /* TODO: add support to query reparse tag */
850 data.adjust_tz = false;
851 if (data.symlink_target) {
852 data.symlink = true;
853 data.reparse_tag = IO_REPARSE_TAG_SYMLINK;
854 }
855 cifs_open_info_to_fattr(&fattr, &data, inode->i_sb);
856 break;
857 case -EREMOTE:
858 cifs_create_junction_fattr(&fattr, inode->i_sb);
859 rc = 0;
860 break;
861 case -EOPNOTSUPP:
862 case -EINVAL:
863 /*
864 * FIXME: legacy server -- fall back to path-based call?
865 * for now, just skip revalidating and mark inode for
866 * immediate reval.
867 */
868 rc = 0;
869 CIFS_I(inode)->time = 0;
870 goto cgfi_exit;
871 default:
872 goto cgfi_exit;
873 }
874
875 /*
876 * don't bother with SFU junk here -- just mark inode as needing
877 * revalidation.
878 */
879 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
880 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
881 /* if filetype is different, return error */
882 rc = cifs_fattr_to_inode(inode, &fattr);
883 cgfi_exit:
884 cifs_free_open_info(&data);
885 free_xid(xid);
886 return rc;
887 }
888
889 /* Simple function to return a 64 bit hash of string. Rarely called */
simple_hashstr(const char * str)890 static __u64 simple_hashstr(const char *str)
891 {
892 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
893 __u64 hash = 0;
894
895 while (*str)
896 hash = (hash + (__u64) *str++) * hash_mult;
897
898 return hash;
899 }
900
901 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
902 /**
903 * cifs_backup_query_path_info - SMB1 fallback code to get ino
904 *
905 * Fallback code to get file metadata when we don't have access to
906 * full_path (EACCES) and have backup creds.
907 *
908 * @xid: transaction id used to identify original request in logs
909 * @tcon: information about the server share we have mounted
910 * @sb: the superblock stores info such as disk space available
911 * @full_path: name of the file we are getting the metadata for
912 * @resp_buf: will be set to cifs resp buf and needs to be freed with
913 * cifs_buf_release() when done with @data
914 * @data: will be set to search info result buffer
915 */
916 static int
cifs_backup_query_path_info(int xid,struct cifs_tcon * tcon,struct super_block * sb,const char * full_path,void ** resp_buf,FILE_ALL_INFO ** data)917 cifs_backup_query_path_info(int xid,
918 struct cifs_tcon *tcon,
919 struct super_block *sb,
920 const char *full_path,
921 void **resp_buf,
922 FILE_ALL_INFO **data)
923 {
924 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
925 struct cifs_search_info info = {0};
926 u16 flags;
927 int rc;
928
929 *resp_buf = NULL;
930 info.endOfSearch = false;
931 if (tcon->unix_ext)
932 info.info_level = SMB_FIND_FILE_UNIX;
933 else if ((tcon->ses->capabilities &
934 tcon->ses->server->vals->cap_nt_find) == 0)
935 info.info_level = SMB_FIND_FILE_INFO_STANDARD;
936 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
937 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO;
938 else /* no srvino useful for fallback to some netapp */
939 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO;
940
941 flags = CIFS_SEARCH_CLOSE_ALWAYS |
942 CIFS_SEARCH_CLOSE_AT_END |
943 CIFS_SEARCH_BACKUP_SEARCH;
944
945 rc = CIFSFindFirst(xid, tcon, full_path,
946 cifs_sb, NULL, flags, &info, false);
947 if (rc)
948 return rc;
949
950 *resp_buf = (void *)info.ntwrk_buf_start;
951 *data = (FILE_ALL_INFO *)info.srch_entries_start;
952 return 0;
953 }
954 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
955
cifs_set_fattr_ino(int xid,struct cifs_tcon * tcon,struct super_block * sb,struct inode ** inode,const char * full_path,struct cifs_open_info_data * data,struct cifs_fattr * fattr)956 static void cifs_set_fattr_ino(int xid, struct cifs_tcon *tcon, struct super_block *sb,
957 struct inode **inode, const char *full_path,
958 struct cifs_open_info_data *data, struct cifs_fattr *fattr)
959 {
960 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
961 struct TCP_Server_Info *server = tcon->ses->server;
962 int rc;
963
964 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
965 if (*inode)
966 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
967 else
968 fattr->cf_uniqueid = iunique(sb, ROOT_I);
969 return;
970 }
971
972 /*
973 * If we have an inode pass a NULL tcon to ensure we don't
974 * make a round trip to the server. This only works for SMB2+.
975 */
976 rc = server->ops->get_srv_inum(xid, *inode ? NULL : tcon, cifs_sb, full_path,
977 &fattr->cf_uniqueid, data);
978 if (rc) {
979 /*
980 * If that fails reuse existing ino or generate one
981 * and disable server ones
982 */
983 if (*inode)
984 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
985 else {
986 fattr->cf_uniqueid = iunique(sb, ROOT_I);
987 cifs_autodisable_serverino(cifs_sb);
988 }
989 return;
990 }
991
992 /* If no errors, check for zero root inode (invalid) */
993 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) {
994 cifs_dbg(FYI, "Invalid (0) inodenum\n");
995 if (*inode) {
996 /* reuse */
997 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid;
998 } else {
999 /* make an ino by hashing the UNC */
1000 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO;
1001 fattr->cf_uniqueid = simple_hashstr(tcon->tree_name);
1002 }
1003 }
1004 }
1005
is_inode_cache_good(struct inode * ino)1006 static inline bool is_inode_cache_good(struct inode *ino)
1007 {
1008 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0;
1009 }
1010
reparse_info_to_fattr(struct cifs_open_info_data * data,struct super_block * sb,const unsigned int xid,struct cifs_tcon * tcon,const char * full_path,struct cifs_fattr * fattr)1011 static int reparse_info_to_fattr(struct cifs_open_info_data *data,
1012 struct super_block *sb,
1013 const unsigned int xid,
1014 struct cifs_tcon *tcon,
1015 const char *full_path,
1016 struct cifs_fattr *fattr)
1017 {
1018 struct TCP_Server_Info *server = tcon->ses->server;
1019 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1020 struct kvec rsp_iov, *iov = NULL;
1021 int rsp_buftype = CIFS_NO_BUFFER;
1022 u32 tag = data->reparse_tag;
1023 int rc = 0;
1024
1025 if (!tag && server->ops->query_reparse_point) {
1026 rc = server->ops->query_reparse_point(xid, tcon, cifs_sb,
1027 full_path, &tag,
1028 &rsp_iov, &rsp_buftype);
1029 if (!rc)
1030 iov = &rsp_iov;
1031 }
1032 switch ((data->reparse_tag = tag)) {
1033 case 0: /* SMB1 symlink */
1034 iov = NULL;
1035 fallthrough;
1036 case IO_REPARSE_TAG_NFS:
1037 case IO_REPARSE_TAG_SYMLINK:
1038 if (!data->symlink_target && server->ops->query_symlink) {
1039 rc = server->ops->query_symlink(xid, tcon,
1040 cifs_sb, full_path,
1041 &data->symlink_target,
1042 iov);
1043 }
1044 break;
1045 case IO_REPARSE_TAG_MOUNT_POINT:
1046 cifs_create_junction_fattr(fattr, sb);
1047 goto out;
1048 }
1049
1050 cifs_open_info_to_fattr(fattr, data, sb);
1051 out:
1052 free_rsp_buf(rsp_buftype, rsp_iov.iov_base);
1053 return rc;
1054 }
1055
cifs_get_fattr(struct cifs_open_info_data * data,struct super_block * sb,int xid,const struct cifs_fid * fid,struct cifs_fattr * fattr,struct inode ** inode,const char * full_path)1056 static int cifs_get_fattr(struct cifs_open_info_data *data,
1057 struct super_block *sb, int xid,
1058 const struct cifs_fid *fid,
1059 struct cifs_fattr *fattr,
1060 struct inode **inode,
1061 const char *full_path)
1062 {
1063 struct cifs_open_info_data tmp_data = {};
1064 struct cifs_tcon *tcon;
1065 struct TCP_Server_Info *server;
1066 struct tcon_link *tlink;
1067 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1068 void *smb1_backup_rsp_buf = NULL;
1069 int rc = 0;
1070 int tmprc = 0;
1071
1072 tlink = cifs_sb_tlink(cifs_sb);
1073 if (IS_ERR(tlink))
1074 return PTR_ERR(tlink);
1075 tcon = tlink_tcon(tlink);
1076 server = tcon->ses->server;
1077
1078 /*
1079 * 1. Fetch file metadata if not provided (data)
1080 */
1081
1082 if (!data) {
1083 rc = server->ops->query_path_info(xid, tcon, cifs_sb,
1084 full_path, &tmp_data);
1085 data = &tmp_data;
1086 }
1087
1088 /*
1089 * 2. Convert it to internal cifs metadata (fattr)
1090 */
1091
1092 switch (rc) {
1093 case 0:
1094 /*
1095 * If the file is a reparse point, it is more complicated
1096 * since we have to check if its reparse tag matches a known
1097 * special file type e.g. symlink or fifo or char etc.
1098 */
1099 if (cifs_open_data_reparse(data)) {
1100 rc = reparse_info_to_fattr(data, sb, xid, tcon,
1101 full_path, fattr);
1102 } else {
1103 cifs_open_info_to_fattr(fattr, data, sb);
1104 }
1105 break;
1106 case -EREMOTE:
1107 /* DFS link, no metadata available on this server */
1108 cifs_create_junction_fattr(fattr, sb);
1109 rc = 0;
1110 break;
1111 case -EACCES:
1112 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1113 /*
1114 * perm errors, try again with backup flags if possible
1115 *
1116 * For SMB2 and later the backup intent flag
1117 * is already sent if needed on open and there
1118 * is no path based FindFirst operation to use
1119 * to retry with
1120 */
1121 if (backup_cred(cifs_sb) && is_smb1_server(server)) {
1122 /* for easier reading */
1123 FILE_ALL_INFO *fi;
1124 FILE_DIRECTORY_INFO *fdi;
1125 SEARCH_ID_FULL_DIR_INFO *si;
1126
1127 rc = cifs_backup_query_path_info(xid, tcon, sb,
1128 full_path,
1129 &smb1_backup_rsp_buf,
1130 &fi);
1131 if (rc)
1132 goto out;
1133
1134 move_cifs_info_to_smb2(&data->fi, fi);
1135 fdi = (FILE_DIRECTORY_INFO *)fi;
1136 si = (SEARCH_ID_FULL_DIR_INFO *)fi;
1137
1138 cifs_dir_info_to_fattr(fattr, fdi, cifs_sb);
1139 fattr->cf_uniqueid = le64_to_cpu(si->UniqueId);
1140 /* uniqueid set, skip get inum step */
1141 goto handle_mnt_opt;
1142 } else {
1143 /* nothing we can do, bail out */
1144 goto out;
1145 }
1146 #else
1147 goto out;
1148 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1149 break;
1150 default:
1151 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1152 goto out;
1153 }
1154
1155 /*
1156 * 3. Get or update inode number (fattr->cf_uniqueid)
1157 */
1158
1159 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, fattr);
1160
1161 /*
1162 * 4. Tweak fattr based on mount options
1163 */
1164 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1165 handle_mnt_opt:
1166 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1167 /* query for SFU type info if supported and needed */
1168 if ((fattr->cf_cifsattrs & ATTR_SYSTEM) &&
1169 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)) {
1170 tmprc = cifs_sfu_type(fattr, full_path, cifs_sb, xid);
1171 if (tmprc)
1172 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc);
1173 }
1174
1175 /* fill in 0777 bits from ACL */
1176 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) {
1177 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1178 true, full_path, fid);
1179 if (rc == -EREMOTE)
1180 rc = 0;
1181 if (rc) {
1182 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n",
1183 __func__, rc);
1184 goto out;
1185 }
1186 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
1187 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode,
1188 false, full_path, fid);
1189 if (rc == -EREMOTE)
1190 rc = 0;
1191 if (rc) {
1192 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n",
1193 __func__, rc);
1194 goto out;
1195 }
1196 }
1197
1198 /* fill in remaining high mode bits e.g. SUID, VTX */
1199 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
1200 cifs_sfu_mode(fattr, full_path, cifs_sb, xid);
1201
1202 /* check for Minshall+French symlinks */
1203 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1204 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1205 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1206 }
1207
1208 out:
1209 cifs_buf_release(smb1_backup_rsp_buf);
1210 cifs_put_tlink(tlink);
1211 cifs_free_open_info(&tmp_data);
1212 return rc;
1213 }
1214
cifs_get_inode_info(struct inode ** inode,const char * full_path,struct cifs_open_info_data * data,struct super_block * sb,int xid,const struct cifs_fid * fid)1215 int cifs_get_inode_info(struct inode **inode,
1216 const char *full_path,
1217 struct cifs_open_info_data *data,
1218 struct super_block *sb, int xid,
1219 const struct cifs_fid *fid)
1220 {
1221 struct cifs_fattr fattr = {};
1222 int rc;
1223
1224 if (is_inode_cache_good(*inode)) {
1225 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1226 return 0;
1227 }
1228
1229 rc = cifs_get_fattr(data, sb, xid, fid, &fattr, inode, full_path);
1230 if (rc)
1231 goto out;
1232
1233 rc = update_inode_info(sb, &fattr, inode);
1234 out:
1235 kfree(fattr.cf_symlink_target);
1236 return rc;
1237 }
1238
smb311_posix_get_fattr(struct cifs_fattr * fattr,const char * full_path,struct super_block * sb,const unsigned int xid)1239 static int smb311_posix_get_fattr(struct cifs_fattr *fattr,
1240 const char *full_path,
1241 struct super_block *sb,
1242 const unsigned int xid)
1243 {
1244 struct cifs_open_info_data data = {};
1245 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1246 struct cifs_tcon *tcon;
1247 struct tcon_link *tlink;
1248 struct cifs_sid owner, group;
1249 int tmprc;
1250 int rc;
1251
1252 tlink = cifs_sb_tlink(cifs_sb);
1253 if (IS_ERR(tlink))
1254 return PTR_ERR(tlink);
1255 tcon = tlink_tcon(tlink);
1256
1257 /*
1258 * 1. Fetch file metadata
1259 */
1260
1261 rc = smb311_posix_query_path_info(xid, tcon, cifs_sb,
1262 full_path, &data,
1263 &owner, &group);
1264
1265 /*
1266 * 2. Convert it to internal cifs metadata (fattr)
1267 */
1268
1269 switch (rc) {
1270 case 0:
1271 smb311_posix_info_to_fattr(fattr, &data, &owner, &group, sb);
1272 break;
1273 case -EREMOTE:
1274 /* DFS link, no metadata available on this server */
1275 cifs_create_junction_fattr(fattr, sb);
1276 rc = 0;
1277 break;
1278 case -EACCES:
1279 /*
1280 * For SMB2 and later the backup intent flag
1281 * is already sent if needed on open and there
1282 * is no path based FindFirst operation to use
1283 * to retry with so nothing we can do, bail out
1284 */
1285 goto out;
1286 default:
1287 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc);
1288 goto out;
1289 }
1290
1291 /*
1292 * 3. Tweak fattr based on mount options
1293 */
1294 /* check for Minshall+French symlinks */
1295 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
1296 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path);
1297 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc);
1298 }
1299
1300 out:
1301 cifs_put_tlink(tlink);
1302 cifs_free_open_info(&data);
1303 return rc;
1304 }
1305
smb311_posix_get_inode_info(struct inode ** inode,const char * full_path,struct super_block * sb,const unsigned int xid)1306 int smb311_posix_get_inode_info(struct inode **inode, const char *full_path,
1307 struct super_block *sb, const unsigned int xid)
1308 {
1309 struct cifs_fattr fattr = {};
1310 int rc;
1311
1312 if (is_inode_cache_good(*inode)) {
1313 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
1314 return 0;
1315 }
1316
1317 rc = smb311_posix_get_fattr(&fattr, full_path, sb, xid);
1318 if (rc)
1319 goto out;
1320
1321 rc = update_inode_info(sb, &fattr, inode);
1322 out:
1323 kfree(fattr.cf_symlink_target);
1324 return rc;
1325 }
1326
1327 static const struct inode_operations cifs_ipc_inode_ops = {
1328 .lookup = cifs_lookup,
1329 };
1330
1331 static int
cifs_find_inode(struct inode * inode,void * opaque)1332 cifs_find_inode(struct inode *inode, void *opaque)
1333 {
1334 struct cifs_fattr *fattr = opaque;
1335
1336 /* don't match inode with different uniqueid */
1337 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1338 return 0;
1339
1340 /* use createtime like an i_generation field */
1341 if (CIFS_I(inode)->createtime != fattr->cf_createtime)
1342 return 0;
1343
1344 /* don't match inode of different type */
1345 if (inode_wrong_type(inode, fattr->cf_mode))
1346 return 0;
1347
1348 /* if it's not a directory or has no dentries, then flag it */
1349 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry))
1350 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1351
1352 return 1;
1353 }
1354
1355 static int
cifs_init_inode(struct inode * inode,void * opaque)1356 cifs_init_inode(struct inode *inode, void *opaque)
1357 {
1358 struct cifs_fattr *fattr = opaque;
1359
1360 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid;
1361 CIFS_I(inode)->createtime = fattr->cf_createtime;
1362 return 0;
1363 }
1364
1365 /*
1366 * walk dentry list for an inode and report whether it has aliases that
1367 * are hashed. We use this to determine if a directory inode can actually
1368 * be used.
1369 */
1370 static bool
inode_has_hashed_dentries(struct inode * inode)1371 inode_has_hashed_dentries(struct inode *inode)
1372 {
1373 struct dentry *dentry;
1374
1375 spin_lock(&inode->i_lock);
1376 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
1377 if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
1378 spin_unlock(&inode->i_lock);
1379 return true;
1380 }
1381 }
1382 spin_unlock(&inode->i_lock);
1383 return false;
1384 }
1385
1386 /* Given fattrs, get a corresponding inode */
1387 struct inode *
cifs_iget(struct super_block * sb,struct cifs_fattr * fattr)1388 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1389 {
1390 unsigned long hash;
1391 struct inode *inode;
1392
1393 retry_iget5_locked:
1394 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid);
1395
1396 /* hash down to 32-bits on 32-bit arch */
1397 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1398
1399 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1400 if (inode) {
1401 /* was there a potentially problematic inode collision? */
1402 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1403 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1404
1405 if (inode_has_hashed_dentries(inode)) {
1406 cifs_autodisable_serverino(CIFS_SB(sb));
1407 iput(inode);
1408 fattr->cf_uniqueid = iunique(sb, ROOT_I);
1409 goto retry_iget5_locked;
1410 }
1411 }
1412
1413 /* can't fail - see cifs_find_inode() */
1414 cifs_fattr_to_inode(inode, fattr);
1415 if (sb->s_flags & SB_NOATIME)
1416 inode->i_flags |= S_NOATIME | S_NOCMTIME;
1417 if (inode->i_state & I_NEW) {
1418 inode->i_ino = hash;
1419 cifs_fscache_get_inode_cookie(inode);
1420 unlock_new_inode(inode);
1421 }
1422 }
1423
1424 return inode;
1425 }
1426
1427 /* gets root inode */
cifs_root_iget(struct super_block * sb)1428 struct inode *cifs_root_iget(struct super_block *sb)
1429 {
1430 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1431 struct cifs_fattr fattr = {};
1432 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1433 struct inode *inode = NULL;
1434 unsigned int xid;
1435 char *path = NULL;
1436 int len;
1437 int rc;
1438
1439 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
1440 && cifs_sb->prepath) {
1441 len = strlen(cifs_sb->prepath);
1442 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
1443 if (path == NULL)
1444 return ERR_PTR(-ENOMEM);
1445 path[0] = '/';
1446 memcpy(path+1, cifs_sb->prepath, len);
1447 } else {
1448 path = kstrdup("", GFP_KERNEL);
1449 if (path == NULL)
1450 return ERR_PTR(-ENOMEM);
1451 }
1452
1453 xid = get_xid();
1454 if (tcon->unix_ext) {
1455 rc = cifs_get_unix_fattr(path, sb, &fattr, &inode, xid);
1456 /* some servers mistakenly claim POSIX support */
1457 if (rc != -EOPNOTSUPP)
1458 goto iget_root;
1459 cifs_dbg(VFS, "server does not support POSIX extensions\n");
1460 tcon->unix_ext = false;
1461 }
1462
1463 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
1464 if (tcon->posix_extensions)
1465 rc = smb311_posix_get_fattr(&fattr, path, sb, xid);
1466 else
1467 rc = cifs_get_fattr(NULL, sb, xid, NULL, &fattr, &inode, path);
1468
1469 iget_root:
1470 if (!rc) {
1471 if (fattr.cf_flags & CIFS_FATTR_JUNCTION) {
1472 fattr.cf_flags &= ~CIFS_FATTR_JUNCTION;
1473 cifs_autodisable_serverino(cifs_sb);
1474 }
1475 inode = cifs_iget(sb, &fattr);
1476 }
1477
1478 if (!inode) {
1479 inode = ERR_PTR(rc);
1480 goto out;
1481 }
1482
1483 if (rc && tcon->pipe) {
1484 cifs_dbg(FYI, "ipc connection - fake read inode\n");
1485 spin_lock(&inode->i_lock);
1486 inode->i_mode |= S_IFDIR;
1487 set_nlink(inode, 2);
1488 inode->i_op = &cifs_ipc_inode_ops;
1489 inode->i_fop = &simple_dir_operations;
1490 inode->i_uid = cifs_sb->ctx->linux_uid;
1491 inode->i_gid = cifs_sb->ctx->linux_gid;
1492 spin_unlock(&inode->i_lock);
1493 } else if (rc) {
1494 iget_failed(inode);
1495 inode = ERR_PTR(rc);
1496 }
1497
1498 out:
1499 kfree(path);
1500 free_xid(xid);
1501 kfree(fattr.cf_symlink_target);
1502 return inode;
1503 }
1504
1505 int
cifs_set_file_info(struct inode * inode,struct iattr * attrs,unsigned int xid,const char * full_path,__u32 dosattr)1506 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid,
1507 const char *full_path, __u32 dosattr)
1508 {
1509 bool set_time = false;
1510 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1511 struct TCP_Server_Info *server;
1512 FILE_BASIC_INFO info_buf;
1513
1514 if (attrs == NULL)
1515 return -EINVAL;
1516
1517 server = cifs_sb_master_tcon(cifs_sb)->ses->server;
1518 if (!server->ops->set_file_info)
1519 return -ENOSYS;
1520
1521 info_buf.Pad = 0;
1522
1523 if (attrs->ia_valid & ATTR_ATIME) {
1524 set_time = true;
1525 info_buf.LastAccessTime =
1526 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
1527 } else
1528 info_buf.LastAccessTime = 0;
1529
1530 if (attrs->ia_valid & ATTR_MTIME) {
1531 set_time = true;
1532 info_buf.LastWriteTime =
1533 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
1534 } else
1535 info_buf.LastWriteTime = 0;
1536
1537 /*
1538 * Samba throws this field away, but windows may actually use it.
1539 * Do not set ctime unless other time stamps are changed explicitly
1540 * (i.e. by utimes()) since we would then have a mix of client and
1541 * server times.
1542 */
1543 if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
1544 cifs_dbg(FYI, "CIFS - CTIME changed\n");
1545 info_buf.ChangeTime =
1546 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1547 } else
1548 info_buf.ChangeTime = 0;
1549
1550 info_buf.CreationTime = 0; /* don't change */
1551 info_buf.Attributes = cpu_to_le32(dosattr);
1552
1553 return server->ops->set_file_info(inode, full_path, &info_buf, xid);
1554 }
1555
1556 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1557 /*
1558 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit
1559 * and rename it to a random name that hopefully won't conflict with
1560 * anything else.
1561 */
1562 int
cifs_rename_pending_delete(const char * full_path,struct dentry * dentry,const unsigned int xid)1563 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1564 const unsigned int xid)
1565 {
1566 int oplock = 0;
1567 int rc;
1568 struct cifs_fid fid;
1569 struct cifs_open_parms oparms;
1570 struct inode *inode = d_inode(dentry);
1571 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1572 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1573 struct tcon_link *tlink;
1574 struct cifs_tcon *tcon;
1575 __u32 dosattr, origattr;
1576 FILE_BASIC_INFO *info_buf = NULL;
1577
1578 tlink = cifs_sb_tlink(cifs_sb);
1579 if (IS_ERR(tlink))
1580 return PTR_ERR(tlink);
1581 tcon = tlink_tcon(tlink);
1582
1583 /*
1584 * We cannot rename the file if the server doesn't support
1585 * CAP_INFOLEVEL_PASSTHRU
1586 */
1587 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) {
1588 rc = -EBUSY;
1589 goto out;
1590 }
1591
1592 oparms = (struct cifs_open_parms) {
1593 .tcon = tcon,
1594 .cifs_sb = cifs_sb,
1595 .desired_access = DELETE | FILE_WRITE_ATTRIBUTES,
1596 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
1597 .disposition = FILE_OPEN,
1598 .path = full_path,
1599 .fid = &fid,
1600 };
1601
1602 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1603 if (rc != 0)
1604 goto out;
1605
1606 origattr = cifsInode->cifsAttrs;
1607 if (origattr == 0)
1608 origattr |= ATTR_NORMAL;
1609
1610 dosattr = origattr & ~ATTR_READONLY;
1611 if (dosattr == 0)
1612 dosattr |= ATTR_NORMAL;
1613 dosattr |= ATTR_HIDDEN;
1614
1615 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */
1616 if (dosattr != origattr) {
1617 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL);
1618 if (info_buf == NULL) {
1619 rc = -ENOMEM;
1620 goto out_close;
1621 }
1622 info_buf->Attributes = cpu_to_le32(dosattr);
1623 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1624 current->tgid);
1625 /* although we would like to mark the file hidden
1626 if that fails we will still try to rename it */
1627 if (!rc)
1628 cifsInode->cifsAttrs = dosattr;
1629 else
1630 dosattr = origattr; /* since not able to change them */
1631 }
1632
1633 /* rename the file */
1634 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1635 cifs_sb->local_nls,
1636 cifs_remap(cifs_sb));
1637 if (rc != 0) {
1638 rc = -EBUSY;
1639 goto undo_setattr;
1640 }
1641
1642 /* try to set DELETE_ON_CLOSE */
1643 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) {
1644 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1645 current->tgid);
1646 /*
1647 * some samba versions return -ENOENT when we try to set the
1648 * file disposition here. Likely a samba bug, but work around
1649 * it for now. This means that some cifsXXX files may hang
1650 * around after they shouldn't.
1651 *
1652 * BB: remove this hack after more servers have the fix
1653 */
1654 if (rc == -ENOENT)
1655 rc = 0;
1656 else if (rc != 0) {
1657 rc = -EBUSY;
1658 goto undo_rename;
1659 }
1660 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags);
1661 }
1662
1663 out_close:
1664 CIFSSMBClose(xid, tcon, fid.netfid);
1665 out:
1666 kfree(info_buf);
1667 cifs_put_tlink(tlink);
1668 return rc;
1669
1670 /*
1671 * reset everything back to the original state. Don't bother
1672 * dealing with errors here since we can't do anything about
1673 * them anyway.
1674 */
1675 undo_rename:
1676 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1677 cifs_sb->local_nls, cifs_remap(cifs_sb));
1678 undo_setattr:
1679 if (dosattr != origattr) {
1680 info_buf->Attributes = cpu_to_le32(origattr);
1681 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1682 current->tgid))
1683 cifsInode->cifsAttrs = origattr;
1684 }
1685
1686 goto out_close;
1687 }
1688 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1689
1690 /* copied from fs/nfs/dir.c with small changes */
1691 static void
cifs_drop_nlink(struct inode * inode)1692 cifs_drop_nlink(struct inode *inode)
1693 {
1694 spin_lock(&inode->i_lock);
1695 if (inode->i_nlink > 0)
1696 drop_nlink(inode);
1697 spin_unlock(&inode->i_lock);
1698 }
1699
1700 /*
1701 * If d_inode(dentry) is null (usually meaning the cached dentry
1702 * is a negative dentry) then we would attempt a standard SMB delete, but
1703 * if that fails we can not attempt the fall back mechanisms on EACCES
1704 * but will return the EACCES to the caller. Note that the VFS does not call
1705 * unlink on negative dentries currently.
1706 */
cifs_unlink(struct inode * dir,struct dentry * dentry)1707 int cifs_unlink(struct inode *dir, struct dentry *dentry)
1708 {
1709 int rc = 0;
1710 unsigned int xid;
1711 const char *full_path;
1712 void *page;
1713 struct inode *inode = d_inode(dentry);
1714 struct cifsInodeInfo *cifs_inode;
1715 struct super_block *sb = dir->i_sb;
1716 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
1717 struct tcon_link *tlink;
1718 struct cifs_tcon *tcon;
1719 struct TCP_Server_Info *server;
1720 struct iattr *attrs = NULL;
1721 __u32 dosattr = 0, origattr = 0;
1722
1723 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
1724
1725 if (unlikely(cifs_forced_shutdown(cifs_sb)))
1726 return -EIO;
1727
1728 tlink = cifs_sb_tlink(cifs_sb);
1729 if (IS_ERR(tlink))
1730 return PTR_ERR(tlink);
1731 tcon = tlink_tcon(tlink);
1732 server = tcon->ses->server;
1733
1734 xid = get_xid();
1735 page = alloc_dentry_path();
1736
1737 if (tcon->nodelete) {
1738 rc = -EACCES;
1739 goto unlink_out;
1740 }
1741
1742 /* Unlink can be called from rename so we can not take the
1743 * sb->s_vfs_rename_mutex here */
1744 full_path = build_path_from_dentry(dentry, page);
1745 if (IS_ERR(full_path)) {
1746 rc = PTR_ERR(full_path);
1747 goto unlink_out;
1748 }
1749
1750 cifs_close_deferred_file_under_dentry(tcon, full_path);
1751 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1752 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
1753 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
1754 rc = CIFSPOSIXDelFile(xid, tcon, full_path,
1755 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls,
1756 cifs_remap(cifs_sb));
1757 cifs_dbg(FYI, "posix del rc %d\n", rc);
1758 if ((rc == 0) || (rc == -ENOENT))
1759 goto psx_del_no_retry;
1760 }
1761 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1762
1763 retry_std_delete:
1764 if (!server->ops->unlink) {
1765 rc = -ENOSYS;
1766 goto psx_del_no_retry;
1767 }
1768
1769 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb);
1770
1771 psx_del_no_retry:
1772 if (!rc) {
1773 if (inode)
1774 cifs_drop_nlink(inode);
1775 } else if (rc == -ENOENT) {
1776 d_drop(dentry);
1777 } else if (rc == -EBUSY) {
1778 if (server->ops->rename_pending_delete) {
1779 rc = server->ops->rename_pending_delete(full_path,
1780 dentry, xid);
1781 if (rc == 0)
1782 cifs_drop_nlink(inode);
1783 }
1784 } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
1785 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1786 if (attrs == NULL) {
1787 rc = -ENOMEM;
1788 goto out_reval;
1789 }
1790
1791 /* try to reset dos attributes */
1792 cifs_inode = CIFS_I(inode);
1793 origattr = cifs_inode->cifsAttrs;
1794 if (origattr == 0)
1795 origattr |= ATTR_NORMAL;
1796 dosattr = origattr & ~ATTR_READONLY;
1797 if (dosattr == 0)
1798 dosattr |= ATTR_NORMAL;
1799 dosattr |= ATTR_HIDDEN;
1800
1801 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
1802 if (rc != 0)
1803 goto out_reval;
1804
1805 goto retry_std_delete;
1806 }
1807
1808 /* undo the setattr if we errored out and it's needed */
1809 if (rc != 0 && dosattr != 0)
1810 cifs_set_file_info(inode, attrs, xid, full_path, origattr);
1811
1812 out_reval:
1813 if (inode) {
1814 cifs_inode = CIFS_I(inode);
1815 cifs_inode->time = 0; /* will force revalidate to get info
1816 when needed */
1817 inode_set_ctime_current(inode);
1818 }
1819 dir->i_mtime = inode_set_ctime_current(dir);
1820 cifs_inode = CIFS_I(dir);
1821 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */
1822 unlink_out:
1823 free_dentry_path(page);
1824 kfree(attrs);
1825 free_xid(xid);
1826 cifs_put_tlink(tlink);
1827 return rc;
1828 }
1829
1830 static int
cifs_mkdir_qinfo(struct inode * parent,struct dentry * dentry,umode_t mode,const char * full_path,struct cifs_sb_info * cifs_sb,struct cifs_tcon * tcon,const unsigned int xid)1831 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode,
1832 const char *full_path, struct cifs_sb_info *cifs_sb,
1833 struct cifs_tcon *tcon, const unsigned int xid)
1834 {
1835 int rc = 0;
1836 struct inode *inode = NULL;
1837
1838 if (tcon->posix_extensions)
1839 rc = smb311_posix_get_inode_info(&inode, full_path, parent->i_sb, xid);
1840 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1841 else if (tcon->unix_ext)
1842 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb,
1843 xid);
1844 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1845 else
1846 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb,
1847 xid, NULL);
1848
1849 if (rc)
1850 return rc;
1851
1852 if (!S_ISDIR(inode->i_mode)) {
1853 /*
1854 * mkdir succeeded, but another client has managed to remove the
1855 * sucker and replace it with non-directory. Return success,
1856 * but don't leave the child in dcache.
1857 */
1858 iput(inode);
1859 d_drop(dentry);
1860 return 0;
1861 }
1862 /*
1863 * setting nlink not necessary except in cases where we failed to get it
1864 * from the server or was set bogus. Also, since this is a brand new
1865 * inode, no need to grab the i_lock before setting the i_nlink.
1866 */
1867 if (inode->i_nlink < 2)
1868 set_nlink(inode, 2);
1869 mode &= ~current_umask();
1870 /* must turn on setgid bit if parent dir has it */
1871 if (parent->i_mode & S_ISGID)
1872 mode |= S_ISGID;
1873
1874 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1875 if (tcon->unix_ext) {
1876 struct cifs_unix_set_info_args args = {
1877 .mode = mode,
1878 .ctime = NO_CHANGE_64,
1879 .atime = NO_CHANGE_64,
1880 .mtime = NO_CHANGE_64,
1881 .device = 0,
1882 };
1883 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1884 args.uid = current_fsuid();
1885 if (parent->i_mode & S_ISGID)
1886 args.gid = parent->i_gid;
1887 else
1888 args.gid = current_fsgid();
1889 } else {
1890 args.uid = INVALID_UID; /* no change */
1891 args.gid = INVALID_GID; /* no change */
1892 }
1893 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1894 cifs_sb->local_nls,
1895 cifs_remap(cifs_sb));
1896 } else {
1897 #else
1898 {
1899 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1900 struct TCP_Server_Info *server = tcon->ses->server;
1901 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1902 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo)
1903 server->ops->mkdir_setinfo(inode, full_path, cifs_sb,
1904 tcon, xid);
1905 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
1906 inode->i_mode = (mode | S_IFDIR);
1907
1908 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1909 inode->i_uid = current_fsuid();
1910 if (inode->i_mode & S_ISGID)
1911 inode->i_gid = parent->i_gid;
1912 else
1913 inode->i_gid = current_fsgid();
1914 }
1915 }
1916 d_instantiate(dentry, inode);
1917 return 0;
1918 }
1919
1920 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1921 static int
1922 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode,
1923 const char *full_path, struct cifs_sb_info *cifs_sb,
1924 struct cifs_tcon *tcon, const unsigned int xid)
1925 {
1926 int rc = 0;
1927 u32 oplock = 0;
1928 FILE_UNIX_BASIC_INFO *info = NULL;
1929 struct inode *newinode = NULL;
1930 struct cifs_fattr fattr;
1931
1932 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
1933 if (info == NULL) {
1934 rc = -ENOMEM;
1935 goto posix_mkdir_out;
1936 }
1937
1938 mode &= ~current_umask();
1939 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode,
1940 NULL /* netfid */, info, &oplock, full_path,
1941 cifs_sb->local_nls, cifs_remap(cifs_sb));
1942 if (rc == -EOPNOTSUPP)
1943 goto posix_mkdir_out;
1944 else if (rc) {
1945 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc);
1946 d_drop(dentry);
1947 goto posix_mkdir_out;
1948 }
1949
1950 if (info->Type == cpu_to_le32(-1))
1951 /* no return info, go query for it */
1952 goto posix_mkdir_get_info;
1953 /*
1954 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if
1955 * need to set uid/gid.
1956 */
1957
1958 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb);
1959 cifs_fill_uniqueid(inode->i_sb, &fattr);
1960 newinode = cifs_iget(inode->i_sb, &fattr);
1961 if (!newinode)
1962 goto posix_mkdir_get_info;
1963
1964 d_instantiate(dentry, newinode);
1965
1966 #ifdef CONFIG_CIFS_DEBUG2
1967 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n",
1968 dentry, dentry, newinode);
1969
1970 if (newinode->i_nlink != 2)
1971 cifs_dbg(FYI, "unexpected number of links %d\n",
1972 newinode->i_nlink);
1973 #endif
1974
1975 posix_mkdir_out:
1976 kfree(info);
1977 return rc;
1978 posix_mkdir_get_info:
1979 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon,
1980 xid);
1981 goto posix_mkdir_out;
1982 }
1983 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
1984
1985 int cifs_mkdir(struct mnt_idmap *idmap, struct inode *inode,
1986 struct dentry *direntry, umode_t mode)
1987 {
1988 int rc = 0;
1989 unsigned int xid;
1990 struct cifs_sb_info *cifs_sb;
1991 struct tcon_link *tlink;
1992 struct cifs_tcon *tcon;
1993 struct TCP_Server_Info *server;
1994 const char *full_path;
1995 void *page;
1996
1997 cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n",
1998 mode, inode);
1999
2000 cifs_sb = CIFS_SB(inode->i_sb);
2001 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2002 return -EIO;
2003 tlink = cifs_sb_tlink(cifs_sb);
2004 if (IS_ERR(tlink))
2005 return PTR_ERR(tlink);
2006 tcon = tlink_tcon(tlink);
2007
2008 xid = get_xid();
2009
2010 page = alloc_dentry_path();
2011 full_path = build_path_from_dentry(direntry, page);
2012 if (IS_ERR(full_path)) {
2013 rc = PTR_ERR(full_path);
2014 goto mkdir_out;
2015 }
2016
2017 server = tcon->ses->server;
2018
2019 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) {
2020 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path,
2021 cifs_sb);
2022 d_drop(direntry); /* for time being always refresh inode info */
2023 goto mkdir_out;
2024 }
2025
2026 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2027 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
2028 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
2029 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb,
2030 tcon, xid);
2031 if (rc != -EOPNOTSUPP)
2032 goto mkdir_out;
2033 }
2034 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2035
2036 if (!server->ops->mkdir) {
2037 rc = -ENOSYS;
2038 goto mkdir_out;
2039 }
2040
2041 /* BB add setting the equivalent of mode via CreateX w/ACLs */
2042 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb);
2043 if (rc) {
2044 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc);
2045 d_drop(direntry);
2046 goto mkdir_out;
2047 }
2048
2049 /* TODO: skip this for smb2/smb3 */
2050 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon,
2051 xid);
2052 mkdir_out:
2053 /*
2054 * Force revalidate to get parent dir info when needed since cached
2055 * attributes are invalid now.
2056 */
2057 CIFS_I(inode)->time = 0;
2058 free_dentry_path(page);
2059 free_xid(xid);
2060 cifs_put_tlink(tlink);
2061 return rc;
2062 }
2063
2064 int cifs_rmdir(struct inode *inode, struct dentry *direntry)
2065 {
2066 int rc = 0;
2067 unsigned int xid;
2068 struct cifs_sb_info *cifs_sb;
2069 struct tcon_link *tlink;
2070 struct cifs_tcon *tcon;
2071 struct TCP_Server_Info *server;
2072 const char *full_path;
2073 void *page = alloc_dentry_path();
2074 struct cifsInodeInfo *cifsInode;
2075
2076 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode);
2077
2078 xid = get_xid();
2079
2080 full_path = build_path_from_dentry(direntry, page);
2081 if (IS_ERR(full_path)) {
2082 rc = PTR_ERR(full_path);
2083 goto rmdir_exit;
2084 }
2085
2086 cifs_sb = CIFS_SB(inode->i_sb);
2087 if (unlikely(cifs_forced_shutdown(cifs_sb))) {
2088 rc = -EIO;
2089 goto rmdir_exit;
2090 }
2091
2092 tlink = cifs_sb_tlink(cifs_sb);
2093 if (IS_ERR(tlink)) {
2094 rc = PTR_ERR(tlink);
2095 goto rmdir_exit;
2096 }
2097 tcon = tlink_tcon(tlink);
2098 server = tcon->ses->server;
2099
2100 if (!server->ops->rmdir) {
2101 rc = -ENOSYS;
2102 cifs_put_tlink(tlink);
2103 goto rmdir_exit;
2104 }
2105
2106 if (tcon->nodelete) {
2107 rc = -EACCES;
2108 cifs_put_tlink(tlink);
2109 goto rmdir_exit;
2110 }
2111
2112 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
2113 cifs_put_tlink(tlink);
2114
2115 if (!rc) {
2116 spin_lock(&d_inode(direntry)->i_lock);
2117 i_size_write(d_inode(direntry), 0);
2118 clear_nlink(d_inode(direntry));
2119 spin_unlock(&d_inode(direntry)->i_lock);
2120 }
2121
2122 cifsInode = CIFS_I(d_inode(direntry));
2123 /* force revalidate to go get info when needed */
2124 cifsInode->time = 0;
2125
2126 cifsInode = CIFS_I(inode);
2127 /*
2128 * Force revalidate to get parent dir info when needed since cached
2129 * attributes are invalid now.
2130 */
2131 cifsInode->time = 0;
2132
2133 inode_set_ctime_current(d_inode(direntry));
2134 inode->i_mtime = inode_set_ctime_current(inode);
2135
2136 rmdir_exit:
2137 free_dentry_path(page);
2138 free_xid(xid);
2139 return rc;
2140 }
2141
2142 static int
2143 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
2144 const char *from_path, struct dentry *to_dentry,
2145 const char *to_path)
2146 {
2147 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
2148 struct tcon_link *tlink;
2149 struct cifs_tcon *tcon;
2150 struct TCP_Server_Info *server;
2151 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2152 struct cifs_fid fid;
2153 struct cifs_open_parms oparms;
2154 int oplock;
2155 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2156 int rc;
2157
2158 tlink = cifs_sb_tlink(cifs_sb);
2159 if (IS_ERR(tlink))
2160 return PTR_ERR(tlink);
2161 tcon = tlink_tcon(tlink);
2162 server = tcon->ses->server;
2163
2164 if (!server->ops->rename)
2165 return -ENOSYS;
2166
2167 /* try path-based rename first */
2168 rc = server->ops->rename(xid, tcon, from_path, to_path, cifs_sb);
2169
2170 /*
2171 * Don't bother with rename by filehandle unless file is busy and
2172 * source. Note that cross directory moves do not work with
2173 * rename by filehandle to various Windows servers.
2174 */
2175 if (rc == 0 || rc != -EBUSY)
2176 goto do_rename_exit;
2177
2178 /* Don't fall back to using SMB on SMB 2+ mount */
2179 if (server->vals->protocol_id != 0)
2180 goto do_rename_exit;
2181
2182 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2183 /* open-file renames don't work across directories */
2184 if (to_dentry->d_parent != from_dentry->d_parent)
2185 goto do_rename_exit;
2186
2187 oparms = (struct cifs_open_parms) {
2188 .tcon = tcon,
2189 .cifs_sb = cifs_sb,
2190 /* open the file to be renamed -- we need DELETE perms */
2191 .desired_access = DELETE,
2192 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
2193 .disposition = FILE_OPEN,
2194 .path = from_path,
2195 .fid = &fid,
2196 };
2197
2198 rc = CIFS_open(xid, &oparms, &oplock, NULL);
2199 if (rc == 0) {
2200 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
2201 (const char *) to_dentry->d_name.name,
2202 cifs_sb->local_nls, cifs_remap(cifs_sb));
2203 CIFSSMBClose(xid, tcon, fid.netfid);
2204 }
2205 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2206 do_rename_exit:
2207 if (rc == 0)
2208 d_move(from_dentry, to_dentry);
2209 cifs_put_tlink(tlink);
2210 return rc;
2211 }
2212
2213 int
2214 cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
2215 struct dentry *source_dentry, struct inode *target_dir,
2216 struct dentry *target_dentry, unsigned int flags)
2217 {
2218 const char *from_name, *to_name;
2219 void *page1, *page2;
2220 struct cifs_sb_info *cifs_sb;
2221 struct tcon_link *tlink;
2222 struct cifs_tcon *tcon;
2223 unsigned int xid;
2224 int rc, tmprc;
2225 int retry_count = 0;
2226 FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
2227 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2228 FILE_UNIX_BASIC_INFO *info_buf_target;
2229 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2230
2231 if (flags & ~RENAME_NOREPLACE)
2232 return -EINVAL;
2233
2234 cifs_sb = CIFS_SB(source_dir->i_sb);
2235 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2236 return -EIO;
2237
2238 tlink = cifs_sb_tlink(cifs_sb);
2239 if (IS_ERR(tlink))
2240 return PTR_ERR(tlink);
2241 tcon = tlink_tcon(tlink);
2242
2243 page1 = alloc_dentry_path();
2244 page2 = alloc_dentry_path();
2245 xid = get_xid();
2246
2247 from_name = build_path_from_dentry(source_dentry, page1);
2248 if (IS_ERR(from_name)) {
2249 rc = PTR_ERR(from_name);
2250 goto cifs_rename_exit;
2251 }
2252
2253 to_name = build_path_from_dentry(target_dentry, page2);
2254 if (IS_ERR(to_name)) {
2255 rc = PTR_ERR(to_name);
2256 goto cifs_rename_exit;
2257 }
2258
2259 cifs_close_deferred_file_under_dentry(tcon, from_name);
2260 if (d_inode(target_dentry) != NULL)
2261 cifs_close_deferred_file_under_dentry(tcon, to_name);
2262
2263 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2264 to_name);
2265
2266 if (rc == -EACCES) {
2267 while (retry_count < 3) {
2268 cifs_close_all_deferred_files(tcon);
2269 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
2270 to_name);
2271 if (rc != -EACCES)
2272 break;
2273 retry_count++;
2274 }
2275 }
2276
2277 /*
2278 * No-replace is the natural behavior for CIFS, so skip unlink hacks.
2279 */
2280 if (flags & RENAME_NOREPLACE)
2281 goto cifs_rename_exit;
2282
2283 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2284 if (rc == -EEXIST && tcon->unix_ext) {
2285 /*
2286 * Are src and dst hardlinks of same inode? We can only tell
2287 * with unix extensions enabled.
2288 */
2289 info_buf_source =
2290 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO),
2291 GFP_KERNEL);
2292 if (info_buf_source == NULL) {
2293 rc = -ENOMEM;
2294 goto cifs_rename_exit;
2295 }
2296
2297 info_buf_target = info_buf_source + 1;
2298 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name,
2299 info_buf_source,
2300 cifs_sb->local_nls,
2301 cifs_remap(cifs_sb));
2302 if (tmprc != 0)
2303 goto unlink_target;
2304
2305 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name,
2306 info_buf_target,
2307 cifs_sb->local_nls,
2308 cifs_remap(cifs_sb));
2309
2310 if (tmprc == 0 && (info_buf_source->UniqueId ==
2311 info_buf_target->UniqueId)) {
2312 /* same file, POSIX says that this is a noop */
2313 rc = 0;
2314 goto cifs_rename_exit;
2315 }
2316 }
2317 /*
2318 * else ... BB we could add the same check for Windows by
2319 * checking the UniqueId via FILE_INTERNAL_INFO
2320 */
2321
2322 unlink_target:
2323 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2324
2325 /* Try unlinking the target dentry if it's not negative */
2326 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
2327 if (d_is_dir(target_dentry))
2328 tmprc = cifs_rmdir(target_dir, target_dentry);
2329 else
2330 tmprc = cifs_unlink(target_dir, target_dentry);
2331 if (tmprc)
2332 goto cifs_rename_exit;
2333 rc = cifs_do_rename(xid, source_dentry, from_name,
2334 target_dentry, to_name);
2335 }
2336
2337 /* force revalidate to go get info when needed */
2338 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
2339
2340 source_dir->i_mtime = target_dir->i_mtime = inode_set_ctime_to_ts(source_dir,
2341 inode_set_ctime_current(target_dir));
2342
2343 cifs_rename_exit:
2344 kfree(info_buf_source);
2345 free_dentry_path(page2);
2346 free_dentry_path(page1);
2347 free_xid(xid);
2348 cifs_put_tlink(tlink);
2349 return rc;
2350 }
2351
2352 static bool
2353 cifs_dentry_needs_reval(struct dentry *dentry)
2354 {
2355 struct inode *inode = d_inode(dentry);
2356 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2357 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2358 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2359 struct cached_fid *cfid = NULL;
2360
2361 if (cifs_i->time == 0)
2362 return true;
2363
2364 if (CIFS_CACHE_READ(cifs_i))
2365 return false;
2366
2367 if (!lookupCacheEnabled)
2368 return true;
2369
2370 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
2371 spin_lock(&cfid->fid_lock);
2372 if (cfid->time && cifs_i->time > cfid->time) {
2373 spin_unlock(&cfid->fid_lock);
2374 close_cached_dir(cfid);
2375 return false;
2376 }
2377 spin_unlock(&cfid->fid_lock);
2378 close_cached_dir(cfid);
2379 }
2380 /*
2381 * depending on inode type, check if attribute caching disabled for
2382 * files or directories
2383 */
2384 if (S_ISDIR(inode->i_mode)) {
2385 if (!cifs_sb->ctx->acdirmax)
2386 return true;
2387 if (!time_in_range(jiffies, cifs_i->time,
2388 cifs_i->time + cifs_sb->ctx->acdirmax))
2389 return true;
2390 } else { /* file */
2391 if (!cifs_sb->ctx->acregmax)
2392 return true;
2393 if (!time_in_range(jiffies, cifs_i->time,
2394 cifs_i->time + cifs_sb->ctx->acregmax))
2395 return true;
2396 }
2397
2398 /* hardlinked files w/ noserverino get "special" treatment */
2399 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
2400 S_ISREG(inode->i_mode) && inode->i_nlink != 1)
2401 return true;
2402
2403 return false;
2404 }
2405
2406 /*
2407 * Zap the cache. Called when invalid_mapping flag is set.
2408 */
2409 int
2410 cifs_invalidate_mapping(struct inode *inode)
2411 {
2412 int rc = 0;
2413
2414 if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
2415 rc = invalidate_inode_pages2(inode->i_mapping);
2416 if (rc)
2417 cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n",
2418 __func__, inode, rc);
2419 }
2420
2421 return rc;
2422 }
2423
2424 /**
2425 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks
2426 *
2427 * @key: currently unused
2428 * @mode: the task state to sleep in
2429 */
2430 static int
2431 cifs_wait_bit_killable(struct wait_bit_key *key, int mode)
2432 {
2433 schedule();
2434 if (signal_pending_state(mode, current))
2435 return -ERESTARTSYS;
2436 return 0;
2437 }
2438
2439 int
2440 cifs_revalidate_mapping(struct inode *inode)
2441 {
2442 int rc;
2443 unsigned long *flags = &CIFS_I(inode)->flags;
2444 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2445
2446 /* swapfiles are not supposed to be shared */
2447 if (IS_SWAPFILE(inode))
2448 return 0;
2449
2450 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable,
2451 TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
2452 if (rc)
2453 return rc;
2454
2455 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) {
2456 /* for cache=singleclient, do not invalidate */
2457 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
2458 goto skip_invalidate;
2459
2460 rc = cifs_invalidate_mapping(inode);
2461 if (rc)
2462 set_bit(CIFS_INO_INVALID_MAPPING, flags);
2463 }
2464
2465 skip_invalidate:
2466 clear_bit_unlock(CIFS_INO_LOCK, flags);
2467 smp_mb__after_atomic();
2468 wake_up_bit(flags, CIFS_INO_LOCK);
2469
2470 return rc;
2471 }
2472
2473 int
2474 cifs_zap_mapping(struct inode *inode)
2475 {
2476 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
2477 return cifs_revalidate_mapping(inode);
2478 }
2479
2480 int cifs_revalidate_file_attr(struct file *filp)
2481 {
2482 int rc = 0;
2483 struct dentry *dentry = file_dentry(filp);
2484 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2485 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;
2486 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2487
2488 if (!cifs_dentry_needs_reval(dentry))
2489 return rc;
2490
2491 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2492 if (tlink_tcon(cfile->tlink)->unix_ext)
2493 rc = cifs_get_file_info_unix(filp);
2494 else
2495 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2496 rc = cifs_get_file_info(filp);
2497
2498 return rc;
2499 }
2500
2501 int cifs_revalidate_dentry_attr(struct dentry *dentry)
2502 {
2503 unsigned int xid;
2504 int rc = 0;
2505 struct inode *inode = d_inode(dentry);
2506 struct super_block *sb = dentry->d_sb;
2507 const char *full_path;
2508 void *page;
2509 int count = 0;
2510
2511 if (inode == NULL)
2512 return -ENOENT;
2513
2514 if (!cifs_dentry_needs_reval(dentry))
2515 return rc;
2516
2517 xid = get_xid();
2518
2519 page = alloc_dentry_path();
2520 full_path = build_path_from_dentry(dentry, page);
2521 if (IS_ERR(full_path)) {
2522 rc = PTR_ERR(full_path);
2523 goto out;
2524 }
2525
2526 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n",
2527 full_path, inode, inode->i_count.counter,
2528 dentry, cifs_get_time(dentry), jiffies);
2529
2530 again:
2531 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions)
2532 rc = smb311_posix_get_inode_info(&inode, full_path, sb, xid);
2533 else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
2534 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
2535 else
2536 rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
2537 xid, NULL);
2538 if (rc == -EAGAIN && count++ < 10)
2539 goto again;
2540 out:
2541 free_dentry_path(page);
2542 free_xid(xid);
2543
2544 return rc;
2545 }
2546
2547 int cifs_revalidate_file(struct file *filp)
2548 {
2549 int rc;
2550 struct inode *inode = file_inode(filp);
2551
2552 rc = cifs_revalidate_file_attr(filp);
2553 if (rc)
2554 return rc;
2555
2556 return cifs_revalidate_mapping(inode);
2557 }
2558
2559 /* revalidate a dentry's inode attributes */
2560 int cifs_revalidate_dentry(struct dentry *dentry)
2561 {
2562 int rc;
2563 struct inode *inode = d_inode(dentry);
2564
2565 rc = cifs_revalidate_dentry_attr(dentry);
2566 if (rc)
2567 return rc;
2568
2569 return cifs_revalidate_mapping(inode);
2570 }
2571
2572 int cifs_getattr(struct mnt_idmap *idmap, const struct path *path,
2573 struct kstat *stat, u32 request_mask, unsigned int flags)
2574 {
2575 struct dentry *dentry = path->dentry;
2576 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
2577 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2578 struct inode *inode = d_inode(dentry);
2579 int rc;
2580
2581 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb))))
2582 return -EIO;
2583
2584 /*
2585 * We need to be sure that all dirty pages are written and the server
2586 * has actual ctime, mtime and file length.
2587 */
2588 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) &&
2589 !CIFS_CACHE_READ(CIFS_I(inode)) &&
2590 inode->i_mapping && inode->i_mapping->nrpages != 0) {
2591 rc = filemap_fdatawait(inode->i_mapping);
2592 if (rc) {
2593 mapping_set_error(inode->i_mapping, rc);
2594 return rc;
2595 }
2596 }
2597
2598 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC)
2599 CIFS_I(inode)->time = 0; /* force revalidate */
2600
2601 /*
2602 * If the caller doesn't require syncing, only sync if
2603 * necessary (e.g. due to earlier truncate or setattr
2604 * invalidating the cached metadata)
2605 */
2606 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) ||
2607 (CIFS_I(inode)->time == 0)) {
2608 rc = cifs_revalidate_dentry_attr(dentry);
2609 if (rc)
2610 return rc;
2611 }
2612
2613 generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
2614 stat->blksize = cifs_sb->ctx->bsize;
2615 stat->ino = CIFS_I(inode)->uniqueid;
2616
2617 /* old CIFS Unix Extensions doesn't return create time */
2618 if (CIFS_I(inode)->createtime) {
2619 stat->result_mask |= STATX_BTIME;
2620 stat->btime =
2621 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
2622 }
2623
2624 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED);
2625 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED)
2626 stat->attributes |= STATX_ATTR_COMPRESSED;
2627 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED)
2628 stat->attributes |= STATX_ATTR_ENCRYPTED;
2629
2630 /*
2631 * If on a multiuser mount without unix extensions or cifsacl being
2632 * enabled, and the admin hasn't overridden them, set the ownership
2633 * to the fsuid/fsgid of the current process.
2634 */
2635 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) &&
2636 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
2637 !tcon->unix_ext) {
2638 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID))
2639 stat->uid = current_fsuid();
2640 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID))
2641 stat->gid = current_fsgid();
2642 }
2643 return 0;
2644 }
2645
2646 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start,
2647 u64 len)
2648 {
2649 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2650 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->netfs.inode.i_sb);
2651 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
2652 struct TCP_Server_Info *server = tcon->ses->server;
2653 struct cifsFileInfo *cfile;
2654 int rc;
2655
2656 if (unlikely(cifs_forced_shutdown(cifs_sb)))
2657 return -EIO;
2658
2659 /*
2660 * We need to be sure that all dirty pages are written as they
2661 * might fill holes on the server.
2662 */
2663 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
2664 inode->i_mapping->nrpages != 0) {
2665 rc = filemap_fdatawait(inode->i_mapping);
2666 if (rc) {
2667 mapping_set_error(inode->i_mapping, rc);
2668 return rc;
2669 }
2670 }
2671
2672 cfile = find_readable_file(cifs_i, false);
2673 if (cfile == NULL)
2674 return -EINVAL;
2675
2676 if (server->ops->fiemap) {
2677 rc = server->ops->fiemap(tcon, cfile, fei, start, len);
2678 cifsFileInfo_put(cfile);
2679 return rc;
2680 }
2681
2682 cifsFileInfo_put(cfile);
2683 return -EOPNOTSUPP;
2684 }
2685
2686 int cifs_truncate_page(struct address_space *mapping, loff_t from)
2687 {
2688 pgoff_t index = from >> PAGE_SHIFT;
2689 unsigned offset = from & (PAGE_SIZE - 1);
2690 struct page *page;
2691 int rc = 0;
2692
2693 page = grab_cache_page(mapping, index);
2694 if (!page)
2695 return -ENOMEM;
2696
2697 zero_user_segment(page, offset, PAGE_SIZE);
2698 unlock_page(page);
2699 put_page(page);
2700 return rc;
2701 }
2702
2703 void cifs_setsize(struct inode *inode, loff_t offset)
2704 {
2705 struct cifsInodeInfo *cifs_i = CIFS_I(inode);
2706
2707 spin_lock(&inode->i_lock);
2708 i_size_write(inode, offset);
2709 spin_unlock(&inode->i_lock);
2710
2711 /* Cached inode must be refreshed on truncate */
2712 cifs_i->time = 0;
2713 truncate_pagecache(inode, offset);
2714 }
2715
2716 static int
2717 cifs_set_file_size(struct inode *inode, struct iattr *attrs,
2718 unsigned int xid, const char *full_path)
2719 {
2720 int rc;
2721 struct cifsFileInfo *open_file;
2722 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2723 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2724 struct tcon_link *tlink = NULL;
2725 struct cifs_tcon *tcon = NULL;
2726 struct TCP_Server_Info *server;
2727
2728 /*
2729 * To avoid spurious oplock breaks from server, in the case of
2730 * inodes that we already have open, avoid doing path based
2731 * setting of file size if we can do it by handle.
2732 * This keeps our caching token (oplock) and avoids timeouts
2733 * when the local oplock break takes longer to flush
2734 * writebehind data than the SMB timeout for the SetPathInfo
2735 * request would allow
2736 */
2737 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2738 if (open_file) {
2739 tcon = tlink_tcon(open_file->tlink);
2740 server = tcon->ses->server;
2741 if (server->ops->set_file_size)
2742 rc = server->ops->set_file_size(xid, tcon, open_file,
2743 attrs->ia_size, false);
2744 else
2745 rc = -ENOSYS;
2746 cifsFileInfo_put(open_file);
2747 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc);
2748 } else
2749 rc = -EINVAL;
2750
2751 if (!rc)
2752 goto set_size_out;
2753
2754 if (tcon == NULL) {
2755 tlink = cifs_sb_tlink(cifs_sb);
2756 if (IS_ERR(tlink))
2757 return PTR_ERR(tlink);
2758 tcon = tlink_tcon(tlink);
2759 server = tcon->ses->server;
2760 }
2761
2762 /*
2763 * Set file size by pathname rather than by handle either because no
2764 * valid, writeable file handle for it was found or because there was
2765 * an error setting it by handle.
2766 */
2767 if (server->ops->set_path_size)
2768 rc = server->ops->set_path_size(xid, tcon, full_path,
2769 attrs->ia_size, cifs_sb, false);
2770 else
2771 rc = -ENOSYS;
2772 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc);
2773
2774 if (tlink)
2775 cifs_put_tlink(tlink);
2776
2777 set_size_out:
2778 if (rc == 0) {
2779 cifsInode->server_eof = attrs->ia_size;
2780 cifs_setsize(inode, attrs->ia_size);
2781 /*
2782 * i_blocks is not related to (i_size / i_blksize), but instead
2783 * 512 byte (2**9) size is required for calculating num blocks.
2784 * Until we can query the server for actual allocation size,
2785 * this is best estimate we have for blocks allocated for a file
2786 * Number of blocks must be rounded up so size 1 is not 0 blocks
2787 */
2788 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9;
2789
2790 /*
2791 * The man page of truncate says if the size changed,
2792 * then the st_ctime and st_mtime fields for the file
2793 * are updated.
2794 */
2795 attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
2796 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
2797
2798 cifs_truncate_page(inode->i_mapping, inode->i_size);
2799 }
2800
2801 return rc;
2802 }
2803
2804 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2805 static int
2806 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
2807 {
2808 int rc;
2809 unsigned int xid;
2810 const char *full_path;
2811 void *page = alloc_dentry_path();
2812 struct inode *inode = d_inode(direntry);
2813 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2814 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2815 struct tcon_link *tlink;
2816 struct cifs_tcon *pTcon;
2817 struct cifs_unix_set_info_args *args = NULL;
2818 struct cifsFileInfo *open_file;
2819
2820 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n",
2821 direntry, attrs->ia_valid);
2822
2823 xid = get_xid();
2824
2825 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2826 attrs->ia_valid |= ATTR_FORCE;
2827
2828 rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
2829 if (rc < 0)
2830 goto out;
2831
2832 full_path = build_path_from_dentry(direntry, page);
2833 if (IS_ERR(full_path)) {
2834 rc = PTR_ERR(full_path);
2835 goto out;
2836 }
2837
2838 /*
2839 * Attempt to flush data before changing attributes. We need to do
2840 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
2841 * ownership or mode then we may also need to do this. Here, we take
2842 * the safe way out and just do the flush on all setattr requests. If
2843 * the flush returns error, store it to report later and continue.
2844 *
2845 * BB: This should be smarter. Why bother flushing pages that
2846 * will be truncated anyway? Also, should we error out here if
2847 * the flush returns error?
2848 */
2849 rc = filemap_write_and_wait(inode->i_mapping);
2850 if (is_interrupt_error(rc)) {
2851 rc = -ERESTARTSYS;
2852 goto out;
2853 }
2854
2855 mapping_set_error(inode->i_mapping, rc);
2856 rc = 0;
2857
2858 if (attrs->ia_valid & ATTR_SIZE) {
2859 rc = cifs_set_file_size(inode, attrs, xid, full_path);
2860 if (rc != 0)
2861 goto out;
2862 }
2863
2864 /* skip mode change if it's just for clearing setuid/setgid */
2865 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
2866 attrs->ia_valid &= ~ATTR_MODE;
2867
2868 args = kmalloc(sizeof(*args), GFP_KERNEL);
2869 if (args == NULL) {
2870 rc = -ENOMEM;
2871 goto out;
2872 }
2873
2874 /* set up the struct */
2875 if (attrs->ia_valid & ATTR_MODE)
2876 args->mode = attrs->ia_mode;
2877 else
2878 args->mode = NO_CHANGE_64;
2879
2880 if (attrs->ia_valid & ATTR_UID)
2881 args->uid = attrs->ia_uid;
2882 else
2883 args->uid = INVALID_UID; /* no change */
2884
2885 if (attrs->ia_valid & ATTR_GID)
2886 args->gid = attrs->ia_gid;
2887 else
2888 args->gid = INVALID_GID; /* no change */
2889
2890 if (attrs->ia_valid & ATTR_ATIME)
2891 args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
2892 else
2893 args->atime = NO_CHANGE_64;
2894
2895 if (attrs->ia_valid & ATTR_MTIME)
2896 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
2897 else
2898 args->mtime = NO_CHANGE_64;
2899
2900 if (attrs->ia_valid & ATTR_CTIME)
2901 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
2902 else
2903 args->ctime = NO_CHANGE_64;
2904
2905 args->device = 0;
2906 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
2907 if (open_file) {
2908 u16 nfid = open_file->fid.netfid;
2909 u32 npid = open_file->pid;
2910 pTcon = tlink_tcon(open_file->tlink);
2911 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid);
2912 cifsFileInfo_put(open_file);
2913 } else {
2914 tlink = cifs_sb_tlink(cifs_sb);
2915 if (IS_ERR(tlink)) {
2916 rc = PTR_ERR(tlink);
2917 goto out;
2918 }
2919 pTcon = tlink_tcon(tlink);
2920 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
2921 cifs_sb->local_nls,
2922 cifs_remap(cifs_sb));
2923 cifs_put_tlink(tlink);
2924 }
2925
2926 if (rc)
2927 goto out;
2928
2929 if ((attrs->ia_valid & ATTR_SIZE) &&
2930 attrs->ia_size != i_size_read(inode)) {
2931 truncate_setsize(inode, attrs->ia_size);
2932 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
2933 }
2934
2935 setattr_copy(&nop_mnt_idmap, inode, attrs);
2936 mark_inode_dirty(inode);
2937
2938 /* force revalidate when any of these times are set since some
2939 of the fs types (eg ext3, fat) do not have fine enough
2940 time granularity to match protocol, and we do not have a
2941 a way (yet) to query the server fs's time granularity (and
2942 whether it rounds times down).
2943 */
2944 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))
2945 cifsInode->time = 0;
2946 out:
2947 kfree(args);
2948 free_dentry_path(page);
2949 free_xid(xid);
2950 return rc;
2951 }
2952 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
2953
2954 static int
2955 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
2956 {
2957 unsigned int xid;
2958 kuid_t uid = INVALID_UID;
2959 kgid_t gid = INVALID_GID;
2960 struct inode *inode = d_inode(direntry);
2961 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2962 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
2963 struct cifsFileInfo *wfile;
2964 struct cifs_tcon *tcon;
2965 const char *full_path;
2966 void *page = alloc_dentry_path();
2967 int rc = -EACCES;
2968 __u32 dosattr = 0;
2969 __u64 mode = NO_CHANGE_64;
2970
2971 xid = get_xid();
2972
2973 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n",
2974 direntry, attrs->ia_valid);
2975
2976 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
2977 attrs->ia_valid |= ATTR_FORCE;
2978
2979 rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs);
2980 if (rc < 0)
2981 goto cifs_setattr_exit;
2982
2983 full_path = build_path_from_dentry(direntry, page);
2984 if (IS_ERR(full_path)) {
2985 rc = PTR_ERR(full_path);
2986 goto cifs_setattr_exit;
2987 }
2988
2989 /*
2990 * Attempt to flush data before changing attributes. We need to do
2991 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
2992 * returns error, store it to report later and continue.
2993 *
2994 * BB: This should be smarter. Why bother flushing pages that
2995 * will be truncated anyway? Also, should we error out here if
2996 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
2997 */
2998 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
2999 rc = filemap_write_and_wait(inode->i_mapping);
3000 if (is_interrupt_error(rc)) {
3001 rc = -ERESTARTSYS;
3002 goto cifs_setattr_exit;
3003 }
3004 mapping_set_error(inode->i_mapping, rc);
3005 }
3006
3007 rc = 0;
3008
3009 if ((attrs->ia_valid & ATTR_MTIME) &&
3010 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
3011 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
3012 if (!rc) {
3013 tcon = tlink_tcon(wfile->tlink);
3014 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
3015 cifsFileInfo_put(wfile);
3016 if (rc)
3017 goto cifs_setattr_exit;
3018 } else if (rc != -EBADF)
3019 goto cifs_setattr_exit;
3020 else
3021 rc = 0;
3022 }
3023
3024 if (attrs->ia_valid & ATTR_SIZE) {
3025 rc = cifs_set_file_size(inode, attrs, xid, full_path);
3026 if (rc != 0)
3027 goto cifs_setattr_exit;
3028 }
3029
3030 if (attrs->ia_valid & ATTR_UID)
3031 uid = attrs->ia_uid;
3032
3033 if (attrs->ia_valid & ATTR_GID)
3034 gid = attrs->ia_gid;
3035
3036 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3037 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3038 if (uid_valid(uid) || gid_valid(gid)) {
3039 mode = NO_CHANGE_64;
3040 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3041 uid, gid);
3042 if (rc) {
3043 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n",
3044 __func__, rc);
3045 goto cifs_setattr_exit;
3046 }
3047 }
3048 } else
3049 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID))
3050 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID);
3051
3052 /* skip mode change if it's just for clearing setuid/setgid */
3053 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
3054 attrs->ia_valid &= ~ATTR_MODE;
3055
3056 if (attrs->ia_valid & ATTR_MODE) {
3057 mode = attrs->ia_mode;
3058 rc = 0;
3059 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) ||
3060 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) {
3061 rc = id_mode_to_cifs_acl(inode, full_path, &mode,
3062 INVALID_UID, INVALID_GID);
3063 if (rc) {
3064 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n",
3065 __func__, rc);
3066 goto cifs_setattr_exit;
3067 }
3068
3069 /*
3070 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes.
3071 * Pick up the actual mode bits that were set.
3072 */
3073 if (mode != attrs->ia_mode)
3074 attrs->ia_mode = mode;
3075 } else
3076 if (((mode & S_IWUGO) == 0) &&
3077 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
3078
3079 dosattr = cifsInode->cifsAttrs | ATTR_READONLY;
3080
3081 /* fix up mode if we're not using dynperm */
3082 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0)
3083 attrs->ia_mode = inode->i_mode & ~S_IWUGO;
3084 } else if ((mode & S_IWUGO) &&
3085 (cifsInode->cifsAttrs & ATTR_READONLY)) {
3086
3087 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY;
3088 /* Attributes of 0 are ignored */
3089 if (dosattr == 0)
3090 dosattr |= ATTR_NORMAL;
3091
3092 /* reset local inode permissions to normal */
3093 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3094 attrs->ia_mode &= ~(S_IALLUGO);
3095 if (S_ISDIR(inode->i_mode))
3096 attrs->ia_mode |=
3097 cifs_sb->ctx->dir_mode;
3098 else
3099 attrs->ia_mode |=
3100 cifs_sb->ctx->file_mode;
3101 }
3102 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) {
3103 /* ignore mode change - ATTR_READONLY hasn't changed */
3104 attrs->ia_valid &= ~ATTR_MODE;
3105 }
3106 }
3107
3108 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) ||
3109 ((attrs->ia_valid & ATTR_MODE) && dosattr)) {
3110 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr);
3111 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */
3112
3113 /* Even if error on time set, no sense failing the call if
3114 the server would set the time to a reasonable value anyway,
3115 and this check ensures that we are not being called from
3116 sys_utimes in which case we ought to fail the call back to
3117 the user when the server rejects the call */
3118 if ((rc) && (attrs->ia_valid &
3119 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE)))
3120 rc = 0;
3121 }
3122
3123 /* do not need local check to inode_check_ok since the server does
3124 that */
3125 if (rc)
3126 goto cifs_setattr_exit;
3127
3128 if ((attrs->ia_valid & ATTR_SIZE) &&
3129 attrs->ia_size != i_size_read(inode)) {
3130 truncate_setsize(inode, attrs->ia_size);
3131 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size);
3132 }
3133
3134 setattr_copy(&nop_mnt_idmap, inode, attrs);
3135 mark_inode_dirty(inode);
3136
3137 cifs_setattr_exit:
3138 free_xid(xid);
3139 free_dentry_path(page);
3140 return rc;
3141 }
3142
3143 int
3144 cifs_setattr(struct mnt_idmap *idmap, struct dentry *direntry,
3145 struct iattr *attrs)
3146 {
3147 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
3148 int rc, retries = 0;
3149 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3150 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
3151 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3152
3153 if (unlikely(cifs_forced_shutdown(cifs_sb)))
3154 return -EIO;
3155
3156 do {
3157 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
3158 if (pTcon->unix_ext)
3159 rc = cifs_setattr_unix(direntry, attrs);
3160 else
3161 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
3162 rc = cifs_setattr_nounix(direntry, attrs);
3163 retries++;
3164 } while (is_retryable_error(rc) && retries < 2);
3165
3166 /* BB: add cifs_setattr_legacy for really old servers */
3167 return rc;
3168 }
3169