diff options
author | Jeff Mahoney <jeffm@suse.com> | 2009-03-30 14:02:41 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-30 15:16:39 -0400 |
commit | 57fe60df62410f949da094d06ced1dda9575b69c (patch) | |
tree | f3ba5db112cd7d2a8865d16bece28c38a766145c /fs/reiserfs/namei.c | |
parent | a41f1a4715f26f7bc4d047d0bc7710145c8e69c7 (diff) |
reiserfs: add atomic addition of selinux attributes during inode creation
Some time ago, some changes were made to make security inode attributes
be atomically written during inode creation. ReiserFS fell behind in
this area, but with the reworking of the xattr code, it's now fairly
easy to add.
The following patch adds the ability for security attributes to be added
automatically during inode creation.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/reiserfs/namei.c')
-rw-r--r-- | fs/reiserfs/namei.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index d9c1c8bd2950..cb1a9e977907 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c | |||
@@ -598,6 +598,7 @@ static int reiserfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
598 | 2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) + | 598 | 2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) + |
599 | REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb)); | 599 | REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb)); |
600 | struct reiserfs_transaction_handle th; | 600 | struct reiserfs_transaction_handle th; |
601 | struct reiserfs_security_handle security; | ||
601 | 602 | ||
602 | if (!(inode = new_inode(dir->i_sb))) { | 603 | if (!(inode = new_inode(dir->i_sb))) { |
603 | return -ENOMEM; | 604 | return -ENOMEM; |
@@ -605,6 +606,12 @@ static int reiserfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
605 | new_inode_init(inode, dir, mode); | 606 | new_inode_init(inode, dir, mode); |
606 | 607 | ||
607 | jbegin_count += reiserfs_cache_default_acl(dir); | 608 | jbegin_count += reiserfs_cache_default_acl(dir); |
609 | retval = reiserfs_security_init(dir, inode, &security); | ||
610 | if (retval < 0) { | ||
611 | drop_new_inode(inode); | ||
612 | return retval; | ||
613 | } | ||
614 | jbegin_count += retval; | ||
608 | reiserfs_write_lock(dir->i_sb); | 615 | reiserfs_write_lock(dir->i_sb); |
609 | 616 | ||
610 | retval = journal_begin(&th, dir->i_sb, jbegin_count); | 617 | retval = journal_begin(&th, dir->i_sb, jbegin_count); |
@@ -615,7 +622,7 @@ static int reiserfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
615 | 622 | ||
616 | retval = | 623 | retval = |
617 | reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry, | 624 | reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry, |
618 | inode); | 625 | inode, &security); |
619 | if (retval) | 626 | if (retval) |
620 | goto out_failed; | 627 | goto out_failed; |
621 | 628 | ||
@@ -655,6 +662,7 @@ static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
655 | int retval; | 662 | int retval; |
656 | struct inode *inode; | 663 | struct inode *inode; |
657 | struct reiserfs_transaction_handle th; | 664 | struct reiserfs_transaction_handle th; |
665 | struct reiserfs_security_handle security; | ||
658 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ | 666 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ |
659 | int jbegin_count = | 667 | int jbegin_count = |
660 | JOURNAL_PER_BALANCE_CNT * 3 + | 668 | JOURNAL_PER_BALANCE_CNT * 3 + |
@@ -670,6 +678,12 @@ static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
670 | new_inode_init(inode, dir, mode); | 678 | new_inode_init(inode, dir, mode); |
671 | 679 | ||
672 | jbegin_count += reiserfs_cache_default_acl(dir); | 680 | jbegin_count += reiserfs_cache_default_acl(dir); |
681 | retval = reiserfs_security_init(dir, inode, &security); | ||
682 | if (retval < 0) { | ||
683 | drop_new_inode(inode); | ||
684 | return retval; | ||
685 | } | ||
686 | jbegin_count += retval; | ||
673 | reiserfs_write_lock(dir->i_sb); | 687 | reiserfs_write_lock(dir->i_sb); |
674 | 688 | ||
675 | retval = journal_begin(&th, dir->i_sb, jbegin_count); | 689 | retval = journal_begin(&th, dir->i_sb, jbegin_count); |
@@ -680,7 +694,7 @@ static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
680 | 694 | ||
681 | retval = | 695 | retval = |
682 | reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry, | 696 | reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry, |
683 | inode); | 697 | inode, &security); |
684 | if (retval) { | 698 | if (retval) { |
685 | goto out_failed; | 699 | goto out_failed; |
686 | } | 700 | } |
@@ -723,6 +737,7 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
723 | int retval; | 737 | int retval; |
724 | struct inode *inode; | 738 | struct inode *inode; |
725 | struct reiserfs_transaction_handle th; | 739 | struct reiserfs_transaction_handle th; |
740 | struct reiserfs_security_handle security; | ||
726 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ | 741 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ |
727 | int jbegin_count = | 742 | int jbegin_count = |
728 | JOURNAL_PER_BALANCE_CNT * 3 + | 743 | JOURNAL_PER_BALANCE_CNT * 3 + |
@@ -740,6 +755,12 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
740 | new_inode_init(inode, dir, mode); | 755 | new_inode_init(inode, dir, mode); |
741 | 756 | ||
742 | jbegin_count += reiserfs_cache_default_acl(dir); | 757 | jbegin_count += reiserfs_cache_default_acl(dir); |
758 | retval = reiserfs_security_init(dir, inode, &security); | ||
759 | if (retval < 0) { | ||
760 | drop_new_inode(inode); | ||
761 | return retval; | ||
762 | } | ||
763 | jbegin_count += retval; | ||
743 | reiserfs_write_lock(dir->i_sb); | 764 | reiserfs_write_lock(dir->i_sb); |
744 | 765 | ||
745 | retval = journal_begin(&th, dir->i_sb, jbegin_count); | 766 | retval = journal_begin(&th, dir->i_sb, jbegin_count); |
@@ -756,7 +777,7 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
756 | retval = reiserfs_new_inode(&th, dir, mode, NULL /*symlink */ , | 777 | retval = reiserfs_new_inode(&th, dir, mode, NULL /*symlink */ , |
757 | old_format_only(dir->i_sb) ? | 778 | old_format_only(dir->i_sb) ? |
758 | EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE, | 779 | EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE, |
759 | dentry, inode); | 780 | dentry, inode, &security); |
760 | if (retval) { | 781 | if (retval) { |
761 | dir->i_nlink--; | 782 | dir->i_nlink--; |
762 | goto out_failed; | 783 | goto out_failed; |
@@ -999,6 +1020,7 @@ static int reiserfs_symlink(struct inode *parent_dir, | |||
999 | char *name; | 1020 | char *name; |
1000 | int item_len; | 1021 | int item_len; |
1001 | struct reiserfs_transaction_handle th; | 1022 | struct reiserfs_transaction_handle th; |
1023 | struct reiserfs_security_handle security; | ||
1002 | int mode = S_IFLNK | S_IRWXUGO; | 1024 | int mode = S_IFLNK | S_IRWXUGO; |
1003 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ | 1025 | /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */ |
1004 | int jbegin_count = | 1026 | int jbegin_count = |
@@ -1011,6 +1033,13 @@ static int reiserfs_symlink(struct inode *parent_dir, | |||
1011 | } | 1033 | } |
1012 | new_inode_init(inode, parent_dir, mode); | 1034 | new_inode_init(inode, parent_dir, mode); |
1013 | 1035 | ||
1036 | retval = reiserfs_security_init(parent_dir, inode, &security); | ||
1037 | if (retval < 0) { | ||
1038 | drop_new_inode(inode); | ||
1039 | return retval; | ||
1040 | } | ||
1041 | jbegin_count += retval; | ||
1042 | |||
1014 | reiserfs_write_lock(parent_dir->i_sb); | 1043 | reiserfs_write_lock(parent_dir->i_sb); |
1015 | item_len = ROUND_UP(strlen(symname)); | 1044 | item_len = ROUND_UP(strlen(symname)); |
1016 | if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) { | 1045 | if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) { |
@@ -1037,7 +1066,7 @@ static int reiserfs_symlink(struct inode *parent_dir, | |||
1037 | 1066 | ||
1038 | retval = | 1067 | retval = |
1039 | reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname), | 1068 | reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname), |
1040 | dentry, inode); | 1069 | dentry, inode, &security); |
1041 | kfree(name); | 1070 | kfree(name); |
1042 | if (retval) { /* reiserfs_new_inode iputs for us */ | 1071 | if (retval) { /* reiserfs_new_inode iputs for us */ |
1043 | goto out_failed; | 1072 | goto out_failed; |