aboutsummaryrefslogtreecommitdiffstats
path: root/fs/9p/vfs_inode_dotl.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-01-10 18:09:01 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-01-10 18:09:01 -0500
commit609eac1c152353ee4cd6f292d49f0aa0b885951a (patch)
tree9274243e8d62427be5b7ec15bc9cd383e482f477 /fs/9p/vfs_inode_dotl.c
parent57eccf1c2acae2fcb748730881ba75643fc31c81 (diff)
parentf766619db2be059cd0dbba8a36176fe01a29d588 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs: fs/9p: iattr_valid flags are kernel internal flags map them to 9p values. fs/9p: We should not allocate a new inode when creating hardlines. fs/9p: v9fs_stat2inode should update suid/sgid bits. 9p: Reduce object size with CONFIG_NET_9P_DEBUG fs/9p: check schedule_timeout_interruptible return value Fix up trivial conflicts in fs/9p/{vfs_inode.c,vfs_inode_dotl.c} due to debug messages having changed to use p9_debug() on one hand, and the changes for umode_t on the other.
Diffstat (limited to 'fs/9p/vfs_inode_dotl.c')
-rw-r--r--fs/9p/vfs_inode_dotl.c127
1 files changed, 82 insertions, 45 deletions
diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
index 8ef152ac6a16..a1e6c990cd41 100644
--- a/fs/9p/vfs_inode_dotl.c
+++ b/fs/9p/vfs_inode_dotl.c
@@ -283,13 +283,13 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
283 } 283 }
284 284
285 name = (char *) dentry->d_name.name; 285 name = (char *) dentry->d_name.name;
286 P9_DPRINTK(P9_DEBUG_VFS, "v9fs_vfs_create_dotl: name:%s flags:0x%x " 286 p9_debug(P9_DEBUG_VFS, "name:%s flags:0x%x mode:0x%hx\n",
287 "mode:0x%hx\n", name, flags, omode); 287 name, flags, omode);
288 288
289 dfid = v9fs_fid_lookup(dentry->d_parent); 289 dfid = v9fs_fid_lookup(dentry->d_parent);
290 if (IS_ERR(dfid)) { 290 if (IS_ERR(dfid)) {
291 err = PTR_ERR(dfid); 291 err = PTR_ERR(dfid);
292 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err); 292 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
293 return err; 293 return err;
294 } 294 }
295 295
@@ -297,7 +297,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
297 ofid = p9_client_walk(dfid, 0, NULL, 1); 297 ofid = p9_client_walk(dfid, 0, NULL, 1);
298 if (IS_ERR(ofid)) { 298 if (IS_ERR(ofid)) {
299 err = PTR_ERR(ofid); 299 err = PTR_ERR(ofid);
300 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); 300 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
301 return err; 301 return err;
302 } 302 }
303 303
@@ -307,16 +307,15 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
307 /* Update mode based on ACL value */ 307 /* Update mode based on ACL value */
308 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl); 308 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
309 if (err) { 309 if (err) {
310 P9_DPRINTK(P9_DEBUG_VFS, 310 p9_debug(P9_DEBUG_VFS, "Failed to get acl values in creat %d\n",
311 "Failed to get acl values in creat %d\n", err); 311 err);
312 goto error; 312 goto error;
313 } 313 }
314 err = p9_client_create_dotl(ofid, name, v9fs_open_to_dotl_flags(flags), 314 err = p9_client_create_dotl(ofid, name, v9fs_open_to_dotl_flags(flags),
315 mode, gid, &qid); 315 mode, gid, &qid);
316 if (err < 0) { 316 if (err < 0) {
317 P9_DPRINTK(P9_DEBUG_VFS, 317 p9_debug(P9_DEBUG_VFS, "p9_client_open_dotl failed in creat %d\n",
318 "p9_client_open_dotl failed in creat %d\n", 318 err);
319 err);
320 goto error; 319 goto error;
321 } 320 }
322 v9fs_invalidate_inode_attr(dir); 321 v9fs_invalidate_inode_attr(dir);
@@ -325,14 +324,14 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
325 fid = p9_client_walk(dfid, 1, &name, 1); 324 fid = p9_client_walk(dfid, 1, &name, 1);
326 if (IS_ERR(fid)) { 325 if (IS_ERR(fid)) {
327 err = PTR_ERR(fid); 326 err = PTR_ERR(fid);
328 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); 327 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
329 fid = NULL; 328 fid = NULL;
330 goto error; 329 goto error;
331 } 330 }
332 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 331 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
333 if (IS_ERR(inode)) { 332 if (IS_ERR(inode)) {
334 err = PTR_ERR(inode); 333 err = PTR_ERR(inode);
335 P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", err); 334 p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", err);
336 goto error; 335 goto error;
337 } 336 }
338 err = v9fs_fid_add(dentry, fid); 337 err = v9fs_fid_add(dentry, fid);
@@ -408,7 +407,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
408 struct dentry *dir_dentry; 407 struct dentry *dir_dentry;
409 struct posix_acl *dacl = NULL, *pacl = NULL; 408 struct posix_acl *dacl = NULL, *pacl = NULL;
410 409
411 P9_DPRINTK(P9_DEBUG_VFS, "name %s\n", dentry->d_name.name); 410 p9_debug(P9_DEBUG_VFS, "name %s\n", dentry->d_name.name);
412 err = 0; 411 err = 0;
413 v9ses = v9fs_inode2v9ses(dir); 412 v9ses = v9fs_inode2v9ses(dir);
414 413
@@ -420,7 +419,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
420 dfid = v9fs_fid_lookup(dir_dentry); 419 dfid = v9fs_fid_lookup(dir_dentry);
421 if (IS_ERR(dfid)) { 420 if (IS_ERR(dfid)) {
422 err = PTR_ERR(dfid); 421 err = PTR_ERR(dfid);
423 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err); 422 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
424 dfid = NULL; 423 dfid = NULL;
425 goto error; 424 goto error;
426 } 425 }
@@ -430,8 +429,8 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
430 /* Update mode based on ACL value */ 429 /* Update mode based on ACL value */
431 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl); 430 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
432 if (err) { 431 if (err) {
433 P9_DPRINTK(P9_DEBUG_VFS, 432 p9_debug(P9_DEBUG_VFS, "Failed to get acl values in mkdir %d\n",
434 "Failed to get acl values in mkdir %d\n", err); 433 err);
435 goto error; 434 goto error;
436 } 435 }
437 name = (char *) dentry->d_name.name; 436 name = (char *) dentry->d_name.name;
@@ -444,8 +443,8 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
444 fid = p9_client_walk(dfid, 1, &name, 1); 443 fid = p9_client_walk(dfid, 1, &name, 1);
445 if (IS_ERR(fid)) { 444 if (IS_ERR(fid)) {
446 err = PTR_ERR(fid); 445 err = PTR_ERR(fid);
447 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", 446 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
448 err); 447 err);
449 fid = NULL; 448 fid = NULL;
450 goto error; 449 goto error;
451 } 450 }
@@ -453,8 +452,8 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
453 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 452 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
454 if (IS_ERR(inode)) { 453 if (IS_ERR(inode)) {
455 err = PTR_ERR(inode); 454 err = PTR_ERR(inode);
456 P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", 455 p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n",
457 err); 456 err);
458 goto error; 457 goto error;
459 } 458 }
460 err = v9fs_fid_add(dentry, fid); 459 err = v9fs_fid_add(dentry, fid);
@@ -495,7 +494,7 @@ v9fs_vfs_getattr_dotl(struct vfsmount *mnt, struct dentry *dentry,
495 struct p9_fid *fid; 494 struct p9_fid *fid;
496 struct p9_stat_dotl *st; 495 struct p9_stat_dotl *st;
497 496
498 P9_DPRINTK(P9_DEBUG_VFS, "dentry: %p\n", dentry); 497 p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
499 err = -EPERM; 498 err = -EPERM;
500 v9ses = v9fs_dentry2v9ses(dentry); 499 v9ses = v9fs_dentry2v9ses(dentry);
501 if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { 500 if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
@@ -523,6 +522,46 @@ v9fs_vfs_getattr_dotl(struct vfsmount *mnt, struct dentry *dentry,
523 return 0; 522 return 0;
524} 523}
525 524
525/*
526 * Attribute flags.
527 */
528#define P9_ATTR_MODE (1 << 0)
529#define P9_ATTR_UID (1 << 1)
530#define P9_ATTR_GID (1 << 2)
531#define P9_ATTR_SIZE (1 << 3)
532#define P9_ATTR_ATIME (1 << 4)
533#define P9_ATTR_MTIME (1 << 5)
534#define P9_ATTR_CTIME (1 << 6)
535#define P9_ATTR_ATIME_SET (1 << 7)
536#define P9_ATTR_MTIME_SET (1 << 8)
537
538struct dotl_iattr_map {
539 int iattr_valid;
540 int p9_iattr_valid;
541};
542
543static int v9fs_mapped_iattr_valid(int iattr_valid)
544{
545 int i;
546 int p9_iattr_valid = 0;
547 struct dotl_iattr_map dotl_iattr_map[] = {
548 { ATTR_MODE, P9_ATTR_MODE },
549 { ATTR_UID, P9_ATTR_UID },
550 { ATTR_GID, P9_ATTR_GID },
551 { ATTR_SIZE, P9_ATTR_SIZE },
552 { ATTR_ATIME, P9_ATTR_ATIME },
553 { ATTR_MTIME, P9_ATTR_MTIME },
554 { ATTR_CTIME, P9_ATTR_CTIME },
555 { ATTR_ATIME_SET, P9_ATTR_ATIME_SET },
556 { ATTR_MTIME_SET, P9_ATTR_MTIME_SET },
557 };
558 for (i = 0; i < ARRAY_SIZE(dotl_iattr_map); i++) {
559 if (iattr_valid & dotl_iattr_map[i].iattr_valid)
560 p9_iattr_valid |= dotl_iattr_map[i].p9_iattr_valid;
561 }
562 return p9_iattr_valid;
563}
564
526/** 565/**
527 * v9fs_vfs_setattr_dotl - set file metadata 566 * v9fs_vfs_setattr_dotl - set file metadata
528 * @dentry: file whose metadata to set 567 * @dentry: file whose metadata to set
@@ -537,13 +576,13 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)
537 struct p9_fid *fid; 576 struct p9_fid *fid;
538 struct p9_iattr_dotl p9attr; 577 struct p9_iattr_dotl p9attr;
539 578
540 P9_DPRINTK(P9_DEBUG_VFS, "\n"); 579 p9_debug(P9_DEBUG_VFS, "\n");
541 580
542 retval = inode_change_ok(dentry->d_inode, iattr); 581 retval = inode_change_ok(dentry->d_inode, iattr);
543 if (retval) 582 if (retval)
544 return retval; 583 return retval;
545 584
546 p9attr.valid = iattr->ia_valid; 585 p9attr.valid = v9fs_mapped_iattr_valid(iattr->ia_valid);
547 p9attr.mode = iattr->ia_mode; 586 p9attr.mode = iattr->ia_mode;
548 p9attr.uid = iattr->ia_uid; 587 p9attr.uid = iattr->ia_uid;
549 p9attr.gid = iattr->ia_gid; 588 p9attr.gid = iattr->ia_gid;
@@ -670,14 +709,13 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
670 struct v9fs_session_info *v9ses; 709 struct v9fs_session_info *v9ses;
671 710
672 name = (char *) dentry->d_name.name; 711 name = (char *) dentry->d_name.name;
673 P9_DPRINTK(P9_DEBUG_VFS, "v9fs_vfs_symlink_dotl : %lu,%s,%s\n", 712 p9_debug(P9_DEBUG_VFS, "%lu,%s,%s\n", dir->i_ino, name, symname);
674 dir->i_ino, name, symname);
675 v9ses = v9fs_inode2v9ses(dir); 713 v9ses = v9fs_inode2v9ses(dir);
676 714
677 dfid = v9fs_fid_lookup(dentry->d_parent); 715 dfid = v9fs_fid_lookup(dentry->d_parent);
678 if (IS_ERR(dfid)) { 716 if (IS_ERR(dfid)) {
679 err = PTR_ERR(dfid); 717 err = PTR_ERR(dfid);
680 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err); 718 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
681 return err; 719 return err;
682 } 720 }
683 721
@@ -687,7 +725,7 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
687 err = p9_client_symlink(dfid, name, (char *)symname, gid, &qid); 725 err = p9_client_symlink(dfid, name, (char *)symname, gid, &qid);
688 726
689 if (err < 0) { 727 if (err < 0) {
690 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_symlink failed %d\n", err); 728 p9_debug(P9_DEBUG_VFS, "p9_client_symlink failed %d\n", err);
691 goto error; 729 goto error;
692 } 730 }
693 731
@@ -697,8 +735,8 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
697 fid = p9_client_walk(dfid, 1, &name, 1); 735 fid = p9_client_walk(dfid, 1, &name, 1);
698 if (IS_ERR(fid)) { 736 if (IS_ERR(fid)) {
699 err = PTR_ERR(fid); 737 err = PTR_ERR(fid);
700 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", 738 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
701 err); 739 err);
702 fid = NULL; 740 fid = NULL;
703 goto error; 741 goto error;
704 } 742 }
@@ -707,8 +745,8 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
707 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 745 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
708 if (IS_ERR(inode)) { 746 if (IS_ERR(inode)) {
709 err = PTR_ERR(inode); 747 err = PTR_ERR(inode);
710 P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", 748 p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n",
711 err); 749 err);
712 goto error; 750 goto error;
713 } 751 }
714 err = v9fs_fid_add(dentry, fid); 752 err = v9fs_fid_add(dentry, fid);
@@ -751,9 +789,8 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
751 struct p9_fid *dfid, *oldfid; 789 struct p9_fid *dfid, *oldfid;
752 struct v9fs_session_info *v9ses; 790 struct v9fs_session_info *v9ses;
753 791
754 P9_DPRINTK(P9_DEBUG_VFS, "dir ino: %lu, old_name: %s, new_name: %s\n", 792 p9_debug(P9_DEBUG_VFS, "dir ino: %lu, old_name: %s, new_name: %s\n",
755 dir->i_ino, old_dentry->d_name.name, 793 dir->i_ino, old_dentry->d_name.name, dentry->d_name.name);
756 dentry->d_name.name);
757 794
758 v9ses = v9fs_inode2v9ses(dir); 795 v9ses = v9fs_inode2v9ses(dir);
759 dir_dentry = v9fs_dentry_from_dir_inode(dir); 796 dir_dentry = v9fs_dentry_from_dir_inode(dir);
@@ -770,7 +807,7 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
770 err = p9_client_link(dfid, oldfid, (char *)dentry->d_name.name); 807 err = p9_client_link(dfid, oldfid, (char *)dentry->d_name.name);
771 808
772 if (err < 0) { 809 if (err < 0) {
773 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_link failed %d\n", err); 810 p9_debug(P9_DEBUG_VFS, "p9_client_link failed %d\n", err);
774 return err; 811 return err;
775 } 812 }
776 813
@@ -813,9 +850,9 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
813 struct dentry *dir_dentry; 850 struct dentry *dir_dentry;
814 struct posix_acl *dacl = NULL, *pacl = NULL; 851 struct posix_acl *dacl = NULL, *pacl = NULL;
815 852
816 P9_DPRINTK(P9_DEBUG_VFS, 853 p9_debug(P9_DEBUG_VFS, " %lu,%s mode: %hx MAJOR: %u MINOR: %u\n",
817 " %lu,%s mode: %hx MAJOR: %u MINOR: %u\n", dir->i_ino, 854 dir->i_ino, dentry->d_name.name, omode,
818 dentry->d_name.name, omode, MAJOR(rdev), MINOR(rdev)); 855 MAJOR(rdev), MINOR(rdev));
819 856
820 if (!new_valid_dev(rdev)) 857 if (!new_valid_dev(rdev))
821 return -EINVAL; 858 return -EINVAL;
@@ -825,7 +862,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
825 dfid = v9fs_fid_lookup(dir_dentry); 862 dfid = v9fs_fid_lookup(dir_dentry);
826 if (IS_ERR(dfid)) { 863 if (IS_ERR(dfid)) {
827 err = PTR_ERR(dfid); 864 err = PTR_ERR(dfid);
828 P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err); 865 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
829 dfid = NULL; 866 dfid = NULL;
830 goto error; 867 goto error;
831 } 868 }
@@ -835,8 +872,8 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
835 /* Update mode based on ACL value */ 872 /* Update mode based on ACL value */
836 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl); 873 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
837 if (err) { 874 if (err) {
838 P9_DPRINTK(P9_DEBUG_VFS, 875 p9_debug(P9_DEBUG_VFS, "Failed to get acl values in mknod %d\n",
839 "Failed to get acl values in mknod %d\n", err); 876 err);
840 goto error; 877 goto error;
841 } 878 }
842 name = (char *) dentry->d_name.name; 879 name = (char *) dentry->d_name.name;
@@ -851,8 +888,8 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
851 fid = p9_client_walk(dfid, 1, &name, 1); 888 fid = p9_client_walk(dfid, 1, &name, 1);
852 if (IS_ERR(fid)) { 889 if (IS_ERR(fid)) {
853 err = PTR_ERR(fid); 890 err = PTR_ERR(fid);
854 P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", 891 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
855 err); 892 err);
856 fid = NULL; 893 fid = NULL;
857 goto error; 894 goto error;
858 } 895 }
@@ -860,8 +897,8 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,
860 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 897 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
861 if (IS_ERR(inode)) { 898 if (IS_ERR(inode)) {
862 err = PTR_ERR(inode); 899 err = PTR_ERR(inode);
863 P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", 900 p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n",
864 err); 901 err);
865 goto error; 902 goto error;
866 } 903 }
867 err = v9fs_fid_add(dentry, fid); 904 err = v9fs_fid_add(dentry, fid);
@@ -905,7 +942,7 @@ v9fs_vfs_follow_link_dotl(struct dentry *dentry, struct nameidata *nd)
905 char *link = __getname(); 942 char *link = __getname();
906 char *target; 943 char *target;
907 944
908 P9_DPRINTK(P9_DEBUG_VFS, "%s\n", dentry->d_name.name); 945 p9_debug(P9_DEBUG_VFS, "%s\n", dentry->d_name.name);
909 946
910 if (!link) { 947 if (!link) {
911 link = ERR_PTR(-ENOMEM); 948 link = ERR_PTR(-ENOMEM);