diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2011-10-29 09:05:00 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2011-10-29 09:05:00 -0400 |
commit | 5cb81dabcc28863e7d04e6fd9ede154bd8459c14 (patch) | |
tree | 704df9fffdc243449dc5eba697cec133162ee1bf /fs/ext4/ialloc.c | |
parent | fba90ffee813e2425feb9a57c532b3d297af18c3 (diff) |
ext4: fix quota accounting during migration
The tmp_inode should have same uid/gid as the original inode.
Otherwise new metadata blocks will be accounted to wrong quota-id,
which will result in a quota leak after the inode migration is
completed.
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/ialloc.c')
-rw-r--r-- | fs/ext4/ialloc.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index e007fecdaedc..acdde93b74d7 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
@@ -691,7 +691,7 @@ err_ret: | |||
691 | * group to find a free inode. | 691 | * group to find a free inode. |
692 | */ | 692 | */ |
693 | struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode, | 693 | struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode, |
694 | const struct qstr *qstr, __u32 goal) | 694 | const struct qstr *qstr, __u32 goal, uid_t *owner) |
695 | { | 695 | { |
696 | struct super_block *sb; | 696 | struct super_block *sb; |
697 | struct buffer_head *inode_bitmap_bh = NULL; | 697 | struct buffer_head *inode_bitmap_bh = NULL; |
@@ -852,8 +852,11 @@ got: | |||
852 | flex_group = ext4_flex_group(sbi, group); | 852 | flex_group = ext4_flex_group(sbi, group); |
853 | atomic_dec(&sbi->s_flex_groups[flex_group].free_inodes); | 853 | atomic_dec(&sbi->s_flex_groups[flex_group].free_inodes); |
854 | } | 854 | } |
855 | 855 | if (owner) { | |
856 | if (test_opt(sb, GRPID)) { | 856 | inode->i_mode = mode; |
857 | inode->i_uid = owner[0]; | ||
858 | inode->i_gid = owner[1]; | ||
859 | } else if (test_opt(sb, GRPID)) { | ||
857 | inode->i_mode = mode; | 860 | inode->i_mode = mode; |
858 | inode->i_uid = current_fsuid(); | 861 | inode->i_uid = current_fsuid(); |
859 | inode->i_gid = dir->i_gid; | 862 | inode->i_gid = dir->i_gid; |