aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/ioctl.c
diff options
context:
space:
mode:
authorYongqiang Yang <xiaoqiangnk@gmail.com>2011-07-26 21:35:44 -0400
committerTheodore Ts'o <tytso@mit.edu>2011-07-26 21:35:44 -0400
commit8f82f840ec6ab873f520364d443ff6fa1b3f8e22 (patch)
tree72d90cdc8f7311ef913b7471e53f718bebbf7414 /fs/ext4/ioctl.c
parent2d859db3e4a82a365572592d57624a5f996ed0ec (diff)
ext4: prevent parallel resizers by atomic bit ops
Before this patch, parallel resizers are allowed and protected by a mutex lock, actually, there is no need to support parallel resizer, so this patch prevents parallel resizers by atmoic bit ops, like lock_page() and unlock_page() do. To do this, the patch removed the mutex lock s_resize_lock from struct ext4_sb_info and added a unsigned long field named s_resize_flags which inidicates if there is a resizer. Signed-off-by: Yongqiang Yang <xiaoqiangnk@gmail.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/ioctl.c')
-rw-r--r--fs/ext4/ioctl.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
index 808c554e773f..f18bfe37aff8 100644
--- a/fs/ext4/ioctl.c
+++ b/fs/ext4/ioctl.c
@@ -202,8 +202,9 @@ setversion_out:
202 struct super_block *sb = inode->i_sb; 202 struct super_block *sb = inode->i_sb;
203 int err, err2=0; 203 int err, err2=0;
204 204
205 if (!capable(CAP_SYS_RESOURCE)) 205 err = ext4_resize_begin(sb);
206 return -EPERM; 206 if (err)
207 return err;
207 208
208 if (get_user(n_blocks_count, (__u32 __user *)arg)) 209 if (get_user(n_blocks_count, (__u32 __user *)arg))
209 return -EFAULT; 210 return -EFAULT;
@@ -221,6 +222,7 @@ setversion_out:
221 if (err == 0) 222 if (err == 0)
222 err = err2; 223 err = err2;
223 mnt_drop_write(filp->f_path.mnt); 224 mnt_drop_write(filp->f_path.mnt);
225 ext4_resize_end(sb);
224 226
225 return err; 227 return err;
226 } 228 }
@@ -271,8 +273,9 @@ mext_out:
271 struct super_block *sb = inode->i_sb; 273 struct super_block *sb = inode->i_sb;
272 int err, err2=0; 274 int err, err2=0;
273 275
274 if (!capable(CAP_SYS_RESOURCE)) 276 err = ext4_resize_begin(sb);
275 return -EPERM; 277 if (err)
278 return err;
276 279
277 if (copy_from_user(&input, (struct ext4_new_group_input __user *)arg, 280 if (copy_from_user(&input, (struct ext4_new_group_input __user *)arg,
278 sizeof(input))) 281 sizeof(input)))
@@ -291,6 +294,7 @@ mext_out:
291 if (err == 0) 294 if (err == 0)
292 err = err2; 295 err = err2;
293 mnt_drop_write(filp->f_path.mnt); 296 mnt_drop_write(filp->f_path.mnt);
297 ext4_resize_end(sb);
294 298
295 return err; 299 return err;
296 } 300 }