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