aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/inode.c
diff options
context:
space:
mode:
authorLi Xi <pkuelelixi@gmail.com>2016-01-08 16:01:21 -0500
committerTheodore Ts'o <tytso@mit.edu>2016-01-08 16:01:21 -0500
commit040cb3786d9b25293b8b0b05b90da0f871e1eb9b (patch)
treebc3decd8a3b122a4334934a4c89e38122b45f2cf /fs/ext4/inode.c
parent56a04915df4e85b34b1c1613c64b87dd2283c26a (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.c28
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
4196int 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
4196struct inode *ext4_iget(struct super_block *sb, unsigned long ino) 4204struct 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)