diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2012-02-07 18:41:49 -0500 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2012-05-15 17:59:27 -0400 |
commit | 08cefc7ab839cf3ece44b8033968a4732eac06d8 (patch) | |
tree | 7264efb33cb3d1249f7be3a7ea6dd12d30c313c1 /fs/ext4/inode.c | |
parent | 1523299d5817773e344d135d4b1c485f269400bc (diff) |
userns: Convert ext4 to user kuid/kgid where appropriate
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index c77b0bd2c711..07eaf565fdcb 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -3630,6 +3630,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
3630 | journal_t *journal = EXT4_SB(sb)->s_journal; | 3630 | journal_t *journal = EXT4_SB(sb)->s_journal; |
3631 | long ret; | 3631 | long ret; |
3632 | int block; | 3632 | int block; |
3633 | uid_t i_uid; | ||
3634 | gid_t i_gid; | ||
3633 | 3635 | ||
3634 | inode = iget_locked(sb, ino); | 3636 | inode = iget_locked(sb, ino); |
3635 | if (!inode) | 3637 | if (!inode) |
@@ -3645,12 +3647,14 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
3645 | goto bad_inode; | 3647 | goto bad_inode; |
3646 | raw_inode = ext4_raw_inode(&iloc); | 3648 | raw_inode = ext4_raw_inode(&iloc); |
3647 | inode->i_mode = le16_to_cpu(raw_inode->i_mode); | 3649 | inode->i_mode = le16_to_cpu(raw_inode->i_mode); |
3648 | inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); | 3650 | i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); |
3649 | inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); | 3651 | i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); |
3650 | if (!(test_opt(inode->i_sb, NO_UID32))) { | 3652 | if (!(test_opt(inode->i_sb, NO_UID32))) { |
3651 | inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; | 3653 | i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; |
3652 | inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; | 3654 | i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; |
3653 | } | 3655 | } |
3656 | i_uid_write(inode, i_uid); | ||
3657 | i_gid_write(inode, i_gid); | ||
3654 | set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); | 3658 | set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); |
3655 | 3659 | ||
3656 | ext4_clear_state_flags(ei); /* Only relevant on 32-bit archs */ | 3660 | ext4_clear_state_flags(ei); /* Only relevant on 32-bit archs */ |
@@ -3870,6 +3874,8 @@ static int ext4_do_update_inode(handle_t *handle, | |||
3870 | struct ext4_inode_info *ei = EXT4_I(inode); | 3874 | struct ext4_inode_info *ei = EXT4_I(inode); |
3871 | struct buffer_head *bh = iloc->bh; | 3875 | struct buffer_head *bh = iloc->bh; |
3872 | int err = 0, rc, block; | 3876 | int err = 0, rc, block; |
3877 | uid_t i_uid; | ||
3878 | gid_t i_gid; | ||
3873 | 3879 | ||
3874 | /* For fields not not tracking in the in-memory inode, | 3880 | /* For fields not not tracking in the in-memory inode, |
3875 | * initialise them to zero for new inodes. */ | 3881 | * initialise them to zero for new inodes. */ |
@@ -3878,27 +3884,27 @@ static int ext4_do_update_inode(handle_t *handle, | |||
3878 | 3884 | ||
3879 | ext4_get_inode_flags(ei); | 3885 | ext4_get_inode_flags(ei); |
3880 | raw_inode->i_mode = cpu_to_le16(inode->i_mode); | 3886 | raw_inode->i_mode = cpu_to_le16(inode->i_mode); |
3887 | i_uid = i_uid_read(inode); | ||
3888 | i_gid = i_gid_read(inode); | ||
3881 | if (!(test_opt(inode->i_sb, NO_UID32))) { | 3889 | if (!(test_opt(inode->i_sb, NO_UID32))) { |
3882 | raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid)); | 3890 | raw_inode->i_uid_low = cpu_to_le16(low_16_bits(i_uid)); |
3883 | raw_inode->i_gid_low = cpu_to_le16(low_16_bits(inode->i_gid)); | 3891 | raw_inode->i_gid_low = cpu_to_le16(low_16_bits(i_gid)); |
3884 | /* | 3892 | /* |
3885 | * Fix up interoperability with old kernels. Otherwise, old inodes get | 3893 | * Fix up interoperability with old kernels. Otherwise, old inodes get |
3886 | * re-used with the upper 16 bits of the uid/gid intact | 3894 | * re-used with the upper 16 bits of the uid/gid intact |
3887 | */ | 3895 | */ |
3888 | if (!ei->i_dtime) { | 3896 | if (!ei->i_dtime) { |
3889 | raw_inode->i_uid_high = | 3897 | raw_inode->i_uid_high = |
3890 | cpu_to_le16(high_16_bits(inode->i_uid)); | 3898 | cpu_to_le16(high_16_bits(i_uid)); |
3891 | raw_inode->i_gid_high = | 3899 | raw_inode->i_gid_high = |
3892 | cpu_to_le16(high_16_bits(inode->i_gid)); | 3900 | cpu_to_le16(high_16_bits(i_gid)); |
3893 | } else { | 3901 | } else { |
3894 | raw_inode->i_uid_high = 0; | 3902 | raw_inode->i_uid_high = 0; |
3895 | raw_inode->i_gid_high = 0; | 3903 | raw_inode->i_gid_high = 0; |
3896 | } | 3904 | } |
3897 | } else { | 3905 | } else { |
3898 | raw_inode->i_uid_low = | 3906 | raw_inode->i_uid_low = cpu_to_le16(fs_high2lowuid(i_uid)); |
3899 | cpu_to_le16(fs_high2lowuid(inode->i_uid)); | 3907 | raw_inode->i_gid_low = cpu_to_le16(fs_high2lowgid(i_gid)); |
3900 | raw_inode->i_gid_low = | ||
3901 | cpu_to_le16(fs_high2lowgid(inode->i_gid)); | ||
3902 | raw_inode->i_uid_high = 0; | 3908 | raw_inode->i_uid_high = 0; |
3903 | raw_inode->i_gid_high = 0; | 3909 | raw_inode->i_gid_high = 0; |
3904 | } | 3910 | } |
@@ -4084,8 +4090,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
4084 | 4090 | ||
4085 | if (is_quota_modification(inode, attr)) | 4091 | if (is_quota_modification(inode, attr)) |
4086 | dquot_initialize(inode); | 4092 | dquot_initialize(inode); |
4087 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || | 4093 | if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) || |
4088 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { | 4094 | (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) { |
4089 | handle_t *handle; | 4095 | handle_t *handle; |
4090 | 4096 | ||
4091 | /* (user+group)*(old+new) structure, inode write (sb, | 4097 | /* (user+group)*(old+new) structure, inode write (sb, |