diff options
Diffstat (limited to 'fs/ext3/inode.c')
-rw-r--r-- | fs/ext3/inode.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 10d7812f602..a09790a412b 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -2891,6 +2891,8 @@ struct inode *ext3_iget(struct super_block *sb, unsigned long ino) | |||
2891 | transaction_t *transaction; | 2891 | transaction_t *transaction; |
2892 | long ret; | 2892 | long ret; |
2893 | int block; | 2893 | int block; |
2894 | uid_t i_uid; | ||
2895 | gid_t i_gid; | ||
2894 | 2896 | ||
2895 | inode = iget_locked(sb, ino); | 2897 | inode = iget_locked(sb, ino); |
2896 | if (!inode) | 2898 | if (!inode) |
@@ -2907,12 +2909,14 @@ struct inode *ext3_iget(struct super_block *sb, unsigned long ino) | |||
2907 | bh = iloc.bh; | 2909 | bh = iloc.bh; |
2908 | raw_inode = ext3_raw_inode(&iloc); | 2910 | raw_inode = ext3_raw_inode(&iloc); |
2909 | inode->i_mode = le16_to_cpu(raw_inode->i_mode); | 2911 | inode->i_mode = le16_to_cpu(raw_inode->i_mode); |
2910 | inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); | 2912 | i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); |
2911 | inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); | 2913 | i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); |
2912 | if(!(test_opt (inode->i_sb, NO_UID32))) { | 2914 | if(!(test_opt (inode->i_sb, NO_UID32))) { |
2913 | inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; | 2915 | i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; |
2914 | inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; | 2916 | i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; |
2915 | } | 2917 | } |
2918 | i_uid_write(inode, i_uid); | ||
2919 | i_gid_write(inode, i_gid); | ||
2916 | set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); | 2920 | set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); |
2917 | inode->i_size = le32_to_cpu(raw_inode->i_size); | 2921 | inode->i_size = le32_to_cpu(raw_inode->i_size); |
2918 | inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime); | 2922 | inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime); |
@@ -3068,6 +3072,8 @@ static int ext3_do_update_inode(handle_t *handle, | |||
3068 | struct ext3_inode_info *ei = EXT3_I(inode); | 3072 | struct ext3_inode_info *ei = EXT3_I(inode); |
3069 | struct buffer_head *bh = iloc->bh; | 3073 | struct buffer_head *bh = iloc->bh; |
3070 | int err = 0, rc, block; | 3074 | int err = 0, rc, block; |
3075 | uid_t i_uid; | ||
3076 | gid_t i_gid; | ||
3071 | 3077 | ||
3072 | again: | 3078 | again: |
3073 | /* we can't allow multiple procs in here at once, its a bit racey */ | 3079 | /* we can't allow multiple procs in here at once, its a bit racey */ |
@@ -3080,27 +3086,29 @@ again: | |||
3080 | 3086 | ||
3081 | ext3_get_inode_flags(ei); | 3087 | ext3_get_inode_flags(ei); |
3082 | raw_inode->i_mode = cpu_to_le16(inode->i_mode); | 3088 | raw_inode->i_mode = cpu_to_le16(inode->i_mode); |
3089 | i_uid = i_uid_read(inode); | ||
3090 | i_gid = i_gid_read(inode); | ||
3083 | if(!(test_opt(inode->i_sb, NO_UID32))) { | 3091 | if(!(test_opt(inode->i_sb, NO_UID32))) { |
3084 | raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid)); | 3092 | raw_inode->i_uid_low = cpu_to_le16(low_16_bits(i_uid)); |
3085 | raw_inode->i_gid_low = cpu_to_le16(low_16_bits(inode->i_gid)); | 3093 | raw_inode->i_gid_low = cpu_to_le16(low_16_bits(i_gid)); |
3086 | /* | 3094 | /* |
3087 | * Fix up interoperability with old kernels. Otherwise, old inodes get | 3095 | * Fix up interoperability with old kernels. Otherwise, old inodes get |
3088 | * re-used with the upper 16 bits of the uid/gid intact | 3096 | * re-used with the upper 16 bits of the uid/gid intact |
3089 | */ | 3097 | */ |
3090 | if(!ei->i_dtime) { | 3098 | if(!ei->i_dtime) { |
3091 | raw_inode->i_uid_high = | 3099 | raw_inode->i_uid_high = |
3092 | cpu_to_le16(high_16_bits(inode->i_uid)); | 3100 | cpu_to_le16(high_16_bits(i_uid)); |
3093 | raw_inode->i_gid_high = | 3101 | raw_inode->i_gid_high = |
3094 | cpu_to_le16(high_16_bits(inode->i_gid)); | 3102 | cpu_to_le16(high_16_bits(i_gid)); |
3095 | } else { | 3103 | } else { |
3096 | raw_inode->i_uid_high = 0; | 3104 | raw_inode->i_uid_high = 0; |
3097 | raw_inode->i_gid_high = 0; | 3105 | raw_inode->i_gid_high = 0; |
3098 | } | 3106 | } |
3099 | } else { | 3107 | } else { |
3100 | raw_inode->i_uid_low = | 3108 | raw_inode->i_uid_low = |
3101 | cpu_to_le16(fs_high2lowuid(inode->i_uid)); | 3109 | cpu_to_le16(fs_high2lowuid(i_uid)); |
3102 | raw_inode->i_gid_low = | 3110 | raw_inode->i_gid_low = |
3103 | cpu_to_le16(fs_high2lowgid(inode->i_gid)); | 3111 | cpu_to_le16(fs_high2lowgid(i_gid)); |
3104 | raw_inode->i_uid_high = 0; | 3112 | raw_inode->i_uid_high = 0; |
3105 | raw_inode->i_gid_high = 0; | 3113 | raw_inode->i_gid_high = 0; |
3106 | } | 3114 | } |
@@ -3262,8 +3270,8 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr) | |||
3262 | 3270 | ||
3263 | if (is_quota_modification(inode, attr)) | 3271 | if (is_quota_modification(inode, attr)) |
3264 | dquot_initialize(inode); | 3272 | dquot_initialize(inode); |
3265 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || | 3273 | if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) || |
3266 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { | 3274 | (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) { |
3267 | handle_t *handle; | 3275 | handle_t *handle; |
3268 | 3276 | ||
3269 | /* (user+group)*(old+new) structure, inode write (sb, | 3277 | /* (user+group)*(old+new) structure, inode write (sb, |