diff options
Diffstat (limited to 'fs/ext2/ialloc.c')
-rw-r--r-- | fs/ext2/ialloc.c | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index ad7d572ee8dc..ad70479aabff 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c | |||
@@ -106,7 +106,7 @@ void ext2_free_inode (struct inode * inode) | |||
106 | struct super_block * sb = inode->i_sb; | 106 | struct super_block * sb = inode->i_sb; |
107 | int is_directory; | 107 | int is_directory; |
108 | unsigned long ino; | 108 | unsigned long ino; |
109 | struct buffer_head *bitmap_bh = NULL; | 109 | struct buffer_head *bitmap_bh; |
110 | unsigned long block_group; | 110 | unsigned long block_group; |
111 | unsigned long bit; | 111 | unsigned long bit; |
112 | struct ext2_super_block * es; | 112 | struct ext2_super_block * es; |
@@ -118,31 +118,25 @@ void ext2_free_inode (struct inode * inode) | |||
118 | * Note: we must free any quota before locking the superblock, | 118 | * Note: we must free any quota before locking the superblock, |
119 | * as writing the quota to disk may need the lock as well. | 119 | * as writing the quota to disk may need the lock as well. |
120 | */ | 120 | */ |
121 | if (!is_bad_inode(inode)) { | 121 | /* Quota is already initialized in iput() */ |
122 | /* Quota is already initialized in iput() */ | 122 | ext2_xattr_delete_inode(inode); |
123 | ext2_xattr_delete_inode(inode); | 123 | dquot_free_inode(inode); |
124 | dquot_free_inode(inode); | 124 | dquot_drop(inode); |
125 | dquot_drop(inode); | ||
126 | } | ||
127 | 125 | ||
128 | es = EXT2_SB(sb)->s_es; | 126 | es = EXT2_SB(sb)->s_es; |
129 | is_directory = S_ISDIR(inode->i_mode); | 127 | is_directory = S_ISDIR(inode->i_mode); |
130 | 128 | ||
131 | /* Do this BEFORE marking the inode not in use or returning an error */ | ||
132 | clear_inode (inode); | ||
133 | |||
134 | if (ino < EXT2_FIRST_INO(sb) || | 129 | if (ino < EXT2_FIRST_INO(sb) || |
135 | ino > le32_to_cpu(es->s_inodes_count)) { | 130 | ino > le32_to_cpu(es->s_inodes_count)) { |
136 | ext2_error (sb, "ext2_free_inode", | 131 | ext2_error (sb, "ext2_free_inode", |
137 | "reserved or nonexistent inode %lu", ino); | 132 | "reserved or nonexistent inode %lu", ino); |
138 | goto error_return; | 133 | return; |
139 | } | 134 | } |
140 | block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb); | 135 | block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb); |
141 | bit = (ino - 1) % EXT2_INODES_PER_GROUP(sb); | 136 | bit = (ino - 1) % EXT2_INODES_PER_GROUP(sb); |
142 | brelse(bitmap_bh); | ||
143 | bitmap_bh = read_inode_bitmap(sb, block_group); | 137 | bitmap_bh = read_inode_bitmap(sb, block_group); |
144 | if (!bitmap_bh) | 138 | if (!bitmap_bh) |
145 | goto error_return; | 139 | return; |
146 | 140 | ||
147 | /* Ok, now we can actually update the inode bitmaps.. */ | 141 | /* Ok, now we can actually update the inode bitmaps.. */ |
148 | if (!ext2_clear_bit_atomic(sb_bgl_lock(EXT2_SB(sb), block_group), | 142 | if (!ext2_clear_bit_atomic(sb_bgl_lock(EXT2_SB(sb), block_group), |
@@ -154,7 +148,7 @@ void ext2_free_inode (struct inode * inode) | |||
154 | mark_buffer_dirty(bitmap_bh); | 148 | mark_buffer_dirty(bitmap_bh); |
155 | if (sb->s_flags & MS_SYNCHRONOUS) | 149 | if (sb->s_flags & MS_SYNCHRONOUS) |
156 | sync_dirty_buffer(bitmap_bh); | 150 | sync_dirty_buffer(bitmap_bh); |
157 | error_return: | 151 | |
158 | brelse(bitmap_bh); | 152 | brelse(bitmap_bh); |
159 | } | 153 | } |
160 | 154 | ||
@@ -550,16 +544,12 @@ got: | |||
550 | 544 | ||
551 | sb->s_dirt = 1; | 545 | sb->s_dirt = 1; |
552 | mark_buffer_dirty(bh2); | 546 | mark_buffer_dirty(bh2); |
553 | inode->i_uid = current_fsuid(); | 547 | if (test_opt(sb, GRPID)) { |
554 | if (test_opt (sb, GRPID)) | 548 | inode->i_mode = mode; |
555 | inode->i_gid = dir->i_gid; | 549 | inode->i_uid = current_fsuid(); |
556 | else if (dir->i_mode & S_ISGID) { | ||
557 | inode->i_gid = dir->i_gid; | 550 | inode->i_gid = dir->i_gid; |
558 | if (S_ISDIR(mode)) | ||
559 | mode |= S_ISGID; | ||
560 | } else | 551 | } else |
561 | inode->i_gid = current_fsgid(); | 552 | inode_init_owner(inode, dir, mode); |
562 | inode->i_mode = mode; | ||
563 | 553 | ||
564 | inode->i_ino = ino; | 554 | inode->i_ino = ino; |
565 | inode->i_blocks = 0; | 555 | inode->i_blocks = 0; |