diff options
author | Li Xi <pkuelelixi@gmail.com> | 2016-01-08 16:01:21 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2016-01-08 16:01:21 -0500 |
commit | 040cb3786d9b25293b8b0b05b90da0f871e1eb9b (patch) | |
tree | bc3decd8a3b122a4334934a4c89e38122b45f2cf /fs/ext4/inode.c | |
parent | 56a04915df4e85b34b1c1613c64b87dd2283c26a (diff) |
ext4: adds project ID support
Signed-off-by: Li Xi <lixi@ddn.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Reviewed-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index ff2f3cd38522..6770c07ab39f 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -4193,6 +4193,14 @@ static inline void ext4_iget_extra_inode(struct inode *inode, | |||
4193 | EXT4_I(inode)->i_inline_off = 0; | 4193 | EXT4_I(inode)->i_inline_off = 0; |
4194 | } | 4194 | } |
4195 | 4195 | ||
4196 | int ext4_get_projid(struct inode *inode, kprojid_t *projid) | ||
4197 | { | ||
4198 | if (!EXT4_HAS_RO_COMPAT_FEATURE(inode->i_sb, EXT4_FEATURE_RO_COMPAT_PROJECT)) | ||
4199 | return -EOPNOTSUPP; | ||
4200 | *projid = EXT4_I(inode)->i_projid; | ||
4201 | return 0; | ||
4202 | } | ||
4203 | |||
4196 | struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | 4204 | struct inode *ext4_iget(struct super_block *sb, unsigned long ino) |
4197 | { | 4205 | { |
4198 | struct ext4_iloc iloc; | 4206 | struct ext4_iloc iloc; |
@@ -4204,6 +4212,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
4204 | int block; | 4212 | int block; |
4205 | uid_t i_uid; | 4213 | uid_t i_uid; |
4206 | gid_t i_gid; | 4214 | gid_t i_gid; |
4215 | projid_t i_projid; | ||
4207 | 4216 | ||
4208 | inode = iget_locked(sb, ino); | 4217 | inode = iget_locked(sb, ino); |
4209 | if (!inode) | 4218 | if (!inode) |
@@ -4253,12 +4262,20 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
4253 | inode->i_mode = le16_to_cpu(raw_inode->i_mode); | 4262 | inode->i_mode = le16_to_cpu(raw_inode->i_mode); |
4254 | i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); | 4263 | i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); |
4255 | i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); | 4264 | i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); |
4265 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_PROJECT) && | ||
4266 | EXT4_INODE_SIZE(sb) > EXT4_GOOD_OLD_INODE_SIZE && | ||
4267 | EXT4_FITS_IN_INODE(raw_inode, ei, i_projid)) | ||
4268 | i_projid = (projid_t)le32_to_cpu(raw_inode->i_projid); | ||
4269 | else | ||
4270 | i_projid = EXT4_DEF_PROJID; | ||
4271 | |||
4256 | if (!(test_opt(inode->i_sb, NO_UID32))) { | 4272 | if (!(test_opt(inode->i_sb, NO_UID32))) { |
4257 | i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; | 4273 | i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; |
4258 | i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; | 4274 | i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; |
4259 | } | 4275 | } |
4260 | i_uid_write(inode, i_uid); | 4276 | i_uid_write(inode, i_uid); |
4261 | i_gid_write(inode, i_gid); | 4277 | i_gid_write(inode, i_gid); |
4278 | ei->i_projid = make_kprojid(&init_user_ns, i_projid); | ||
4262 | set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); | 4279 | set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); |
4263 | 4280 | ||
4264 | ext4_clear_state_flags(ei); /* Only relevant on 32-bit archs */ | 4281 | ext4_clear_state_flags(ei); /* Only relevant on 32-bit archs */ |
@@ -4556,6 +4573,7 @@ static int ext4_do_update_inode(handle_t *handle, | |||
4556 | int need_datasync = 0, set_large_file = 0; | 4573 | int need_datasync = 0, set_large_file = 0; |
4557 | uid_t i_uid; | 4574 | uid_t i_uid; |
4558 | gid_t i_gid; | 4575 | gid_t i_gid; |
4576 | projid_t i_projid; | ||
4559 | 4577 | ||
4560 | spin_lock(&ei->i_raw_lock); | 4578 | spin_lock(&ei->i_raw_lock); |
4561 | 4579 | ||
@@ -4568,6 +4586,7 @@ static int ext4_do_update_inode(handle_t *handle, | |||
4568 | raw_inode->i_mode = cpu_to_le16(inode->i_mode); | 4586 | raw_inode->i_mode = cpu_to_le16(inode->i_mode); |
4569 | i_uid = i_uid_read(inode); | 4587 | i_uid = i_uid_read(inode); |
4570 | i_gid = i_gid_read(inode); | 4588 | i_gid = i_gid_read(inode); |
4589 | i_projid = from_kprojid(&init_user_ns, ei->i_projid); | ||
4571 | if (!(test_opt(inode->i_sb, NO_UID32))) { | 4590 | if (!(test_opt(inode->i_sb, NO_UID32))) { |
4572 | raw_inode->i_uid_low = cpu_to_le16(low_16_bits(i_uid)); | 4591 | raw_inode->i_uid_low = cpu_to_le16(low_16_bits(i_uid)); |
4573 | raw_inode->i_gid_low = cpu_to_le16(low_16_bits(i_gid)); | 4592 | raw_inode->i_gid_low = cpu_to_le16(low_16_bits(i_gid)); |
@@ -4645,6 +4664,15 @@ static int ext4_do_update_inode(handle_t *handle, | |||
4645 | cpu_to_le16(ei->i_extra_isize); | 4664 | cpu_to_le16(ei->i_extra_isize); |
4646 | } | 4665 | } |
4647 | } | 4666 | } |
4667 | |||
4668 | BUG_ON(!EXT4_HAS_RO_COMPAT_FEATURE(inode->i_sb, | ||
4669 | EXT4_FEATURE_RO_COMPAT_PROJECT) && | ||
4670 | i_projid != EXT4_DEF_PROJID); | ||
4671 | |||
4672 | if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && | ||
4673 | EXT4_FITS_IN_INODE(raw_inode, ei, i_projid)) | ||
4674 | raw_inode->i_projid = cpu_to_le32(i_projid); | ||
4675 | |||
4648 | ext4_inode_csum_set(inode, raw_inode, ei); | 4676 | ext4_inode_csum_set(inode, raw_inode, ei); |
4649 | spin_unlock(&ei->i_raw_lock); | 4677 | spin_unlock(&ei->i_raw_lock); |
4650 | if (inode->i_sb->s_flags & MS_LAZYTIME) | 4678 | if (inode->i_sb->s_flags & MS_LAZYTIME) |