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