diff options
author | Alessio Igor Bogani <abogani@texware.it> | 2009-05-12 09:10:54 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2009-06-11 21:36:11 -0400 |
commit | 337eb00a2c3a421999c39c94ce7e33545ee8baa7 (patch) | |
tree | d9b780d095b638b1d8fa23841ff70347cf5daa08 | |
parent | 4195f73d1329e49727bcceb028e58cb38376c2b0 (diff) |
Push BKL down into ->remount_fs()
[xfs, btrfs, capifs, shmem don't need BKL, exempt]
Signed-off-by: Alessio Igor Bogani <abogani@texware.it>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | drivers/usb/core/inode.c | 5 | ||||
-rw-r--r-- | fs/affs/super.c | 7 | ||||
-rw-r--r-- | fs/ext2/super.c | 12 | ||||
-rw-r--r-- | fs/ext3/super.c | 4 | ||||
-rw-r--r-- | fs/ext4/super.c | 4 | ||||
-rw-r--r-- | fs/hpfs/super.c | 4 | ||||
-rw-r--r-- | fs/jffs2/fs.c | 3 | ||||
-rw-r--r-- | fs/jfs/super.c | 22 | ||||
-rw-r--r-- | fs/nfs/super.c | 2 | ||||
-rw-r--r-- | fs/nilfs2/super.c | 4 | ||||
-rw-r--r-- | fs/ntfs/super.c | 15 | ||||
-rw-r--r-- | fs/ocfs2/super.c | 4 | ||||
-rw-r--r-- | fs/reiserfs/super.c | 4 | ||||
-rw-r--r-- | fs/super.c | 2 | ||||
-rw-r--r-- | fs/ubifs/super.c | 9 | ||||
-rw-r--r-- | fs/udf/super.c | 6 | ||||
-rw-r--r-- | fs/ufs/super.c | 11 | ||||
-rw-r--r-- | kernel/cgroup.c | 3 |
18 files changed, 108 insertions, 13 deletions
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index dff5760a37f6..ffe75e83787c 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/parser.h> | 39 | #include <linux/parser.h> |
40 | #include <linux/notifier.h> | 40 | #include <linux/notifier.h> |
41 | #include <linux/seq_file.h> | 41 | #include <linux/seq_file.h> |
42 | #include <linux/smp_lock.h> | ||
42 | #include <asm/byteorder.h> | 43 | #include <asm/byteorder.h> |
43 | #include "usb.h" | 44 | #include "usb.h" |
44 | #include "hcd.h" | 45 | #include "hcd.h" |
@@ -265,9 +266,13 @@ static int remount(struct super_block *sb, int *flags, char *data) | |||
265 | return -EINVAL; | 266 | return -EINVAL; |
266 | } | 267 | } |
267 | 268 | ||
269 | lock_kernel(); | ||
270 | |||
268 | if (usbfs_mount && usbfs_mount->mnt_sb) | 271 | if (usbfs_mount && usbfs_mount->mnt_sb) |
269 | update_sb(usbfs_mount->mnt_sb); | 272 | update_sb(usbfs_mount->mnt_sb); |
270 | 273 | ||
274 | unlock_kernel(); | ||
275 | |||
271 | return 0; | 276 | return 0; |
272 | } | 277 | } |
273 | 278 | ||
diff --git a/fs/affs/super.c b/fs/affs/super.c index 280d361af41f..c4814937c968 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/parser.h> | 16 | #include <linux/parser.h> |
17 | #include <linux/magic.h> | 17 | #include <linux/magic.h> |
18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
19 | #include <linux/smp_lock.h> | ||
19 | #include "affs.h" | 20 | #include "affs.h" |
20 | 21 | ||
21 | extern struct timezone sys_tz; | 22 | extern struct timezone sys_tz; |
@@ -512,6 +513,7 @@ affs_remount(struct super_block *sb, int *flags, char *data) | |||
512 | kfree(new_opts); | 513 | kfree(new_opts); |
513 | return -EINVAL; | 514 | return -EINVAL; |
514 | } | 515 | } |
516 | lock_kernel(); | ||
515 | replace_mount_options(sb, new_opts); | 517 | replace_mount_options(sb, new_opts); |
516 | 518 | ||
517 | sbi->s_flags = mount_flags; | 519 | sbi->s_flags = mount_flags; |
@@ -519,8 +521,10 @@ affs_remount(struct super_block *sb, int *flags, char *data) | |||
519 | sbi->s_uid = uid; | 521 | sbi->s_uid = uid; |
520 | sbi->s_gid = gid; | 522 | sbi->s_gid = gid; |
521 | 523 | ||
522 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) | 524 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { |
525 | unlock_kernel(); | ||
523 | return 0; | 526 | return 0; |
527 | } | ||
524 | if (*flags & MS_RDONLY) { | 528 | if (*flags & MS_RDONLY) { |
525 | sb->s_dirt = 1; | 529 | sb->s_dirt = 1; |
526 | while (sb->s_dirt) | 530 | while (sb->s_dirt) |
@@ -529,6 +533,7 @@ affs_remount(struct super_block *sb, int *flags, char *data) | |||
529 | } else | 533 | } else |
530 | res = affs_init_bitmap(sb, flags); | 534 | res = affs_init_bitmap(sb, flags); |
531 | 535 | ||
536 | unlock_kernel(); | ||
532 | return res; | 537 | return res; |
533 | } | 538 | } |
534 | 539 | ||
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index a44963d8edbd..f8cbdf569190 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -1162,6 +1162,8 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1162 | unsigned long old_sb_flags; | 1162 | unsigned long old_sb_flags; |
1163 | int err; | 1163 | int err; |
1164 | 1164 | ||
1165 | lock_kernel(); | ||
1166 | |||
1165 | /* Store the old options */ | 1167 | /* Store the old options */ |
1166 | old_sb_flags = sb->s_flags; | 1168 | old_sb_flags = sb->s_flags; |
1167 | old_opts.s_mount_opt = sbi->s_mount_opt; | 1169 | old_opts.s_mount_opt = sbi->s_mount_opt; |
@@ -1197,12 +1199,16 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1197 | sbi->s_mount_opt &= ~EXT2_MOUNT_XIP; | 1199 | sbi->s_mount_opt &= ~EXT2_MOUNT_XIP; |
1198 | sbi->s_mount_opt |= old_mount_opt & EXT2_MOUNT_XIP; | 1200 | sbi->s_mount_opt |= old_mount_opt & EXT2_MOUNT_XIP; |
1199 | } | 1201 | } |
1200 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) | 1202 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { |
1203 | unlock_kernel(); | ||
1201 | return 0; | 1204 | return 0; |
1205 | } | ||
1202 | if (*flags & MS_RDONLY) { | 1206 | if (*flags & MS_RDONLY) { |
1203 | if (le16_to_cpu(es->s_state) & EXT2_VALID_FS || | 1207 | if (le16_to_cpu(es->s_state) & EXT2_VALID_FS || |
1204 | !(sbi->s_mount_state & EXT2_VALID_FS)) | 1208 | !(sbi->s_mount_state & EXT2_VALID_FS)) { |
1209 | unlock_kernel(); | ||
1205 | return 0; | 1210 | return 0; |
1211 | } | ||
1206 | /* | 1212 | /* |
1207 | * OK, we are remounting a valid rw partition rdonly, so set | 1213 | * OK, we are remounting a valid rw partition rdonly, so set |
1208 | * the rdonly flag and then mark the partition as valid again. | 1214 | * the rdonly flag and then mark the partition as valid again. |
@@ -1229,12 +1235,14 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1229 | sb->s_flags &= ~MS_RDONLY; | 1235 | sb->s_flags &= ~MS_RDONLY; |
1230 | } | 1236 | } |
1231 | ext2_sync_super(sb, es); | 1237 | ext2_sync_super(sb, es); |
1238 | unlock_kernel(); | ||
1232 | return 0; | 1239 | return 0; |
1233 | restore_opts: | 1240 | restore_opts: |
1234 | sbi->s_mount_opt = old_opts.s_mount_opt; | 1241 | sbi->s_mount_opt = old_opts.s_mount_opt; |
1235 | sbi->s_resuid = old_opts.s_resuid; | 1242 | sbi->s_resuid = old_opts.s_resuid; |
1236 | sbi->s_resgid = old_opts.s_resgid; | 1243 | sbi->s_resgid = old_opts.s_resgid; |
1237 | sb->s_flags = old_sb_flags; | 1244 | sb->s_flags = old_sb_flags; |
1245 | unlock_kernel(); | ||
1238 | return err; | 1246 | return err; |
1239 | } | 1247 | } |
1240 | 1248 | ||
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index e213a2613a56..26aa64dee6aa 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -2490,6 +2490,8 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) | |||
2490 | int i; | 2490 | int i; |
2491 | #endif | 2491 | #endif |
2492 | 2492 | ||
2493 | lock_kernel(); | ||
2494 | |||
2493 | /* Store the original options */ | 2495 | /* Store the original options */ |
2494 | lock_super(sb); | 2496 | lock_super(sb); |
2495 | old_sb_flags = sb->s_flags; | 2497 | old_sb_flags = sb->s_flags; |
@@ -2600,6 +2602,7 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) | |||
2600 | kfree(old_opts.s_qf_names[i]); | 2602 | kfree(old_opts.s_qf_names[i]); |
2601 | #endif | 2603 | #endif |
2602 | unlock_super(sb); | 2604 | unlock_super(sb); |
2605 | unlock_kernel(); | ||
2603 | return 0; | 2606 | return 0; |
2604 | restore_opts: | 2607 | restore_opts: |
2605 | sb->s_flags = old_sb_flags; | 2608 | sb->s_flags = old_sb_flags; |
@@ -2617,6 +2620,7 @@ restore_opts: | |||
2617 | } | 2620 | } |
2618 | #endif | 2621 | #endif |
2619 | unlock_super(sb); | 2622 | unlock_super(sb); |
2623 | unlock_kernel(); | ||
2620 | return err; | 2624 | return err; |
2621 | } | 2625 | } |
2622 | 2626 | ||
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index c17200a42301..012c4251397e 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -3422,6 +3422,8 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
3422 | int i; | 3422 | int i; |
3423 | #endif | 3423 | #endif |
3424 | 3424 | ||
3425 | lock_kernel(); | ||
3426 | |||
3425 | /* Store the original options */ | 3427 | /* Store the original options */ |
3426 | lock_super(sb); | 3428 | lock_super(sb); |
3427 | old_sb_flags = sb->s_flags; | 3429 | old_sb_flags = sb->s_flags; |
@@ -3558,6 +3560,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
3558 | kfree(old_opts.s_qf_names[i]); | 3560 | kfree(old_opts.s_qf_names[i]); |
3559 | #endif | 3561 | #endif |
3560 | unlock_super(sb); | 3562 | unlock_super(sb); |
3563 | unlock_kernel(); | ||
3561 | return 0; | 3564 | return 0; |
3562 | 3565 | ||
3563 | restore_opts: | 3566 | restore_opts: |
@@ -3578,6 +3581,7 @@ restore_opts: | |||
3578 | } | 3581 | } |
3579 | #endif | 3582 | #endif |
3580 | unlock_super(sb); | 3583 | unlock_super(sb); |
3584 | unlock_kernel(); | ||
3581 | return err; | 3585 | return err; |
3582 | } | 3586 | } |
3583 | 3587 | ||
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index f68193cf0811..f2feaa06bf26 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/statfs.h> | 13 | #include <linux/statfs.h> |
14 | #include <linux/magic.h> | 14 | #include <linux/magic.h> |
15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
16 | #include <linux/smp_lock.h> | ||
16 | 17 | ||
17 | /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ | 18 | /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ |
18 | 19 | ||
@@ -398,6 +399,7 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
398 | 399 | ||
399 | *flags |= MS_NOATIME; | 400 | *flags |= MS_NOATIME; |
400 | 401 | ||
402 | lock_kernel(); | ||
401 | lock_super(s); | 403 | lock_super(s); |
402 | uid = sbi->sb_uid; gid = sbi->sb_gid; | 404 | uid = sbi->sb_uid; gid = sbi->sb_gid; |
403 | umask = 0777 & ~sbi->sb_mode; | 405 | umask = 0777 & ~sbi->sb_mode; |
@@ -432,10 +434,12 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
432 | replace_mount_options(s, new_opts); | 434 | replace_mount_options(s, new_opts); |
433 | 435 | ||
434 | unlock_super(s); | 436 | unlock_super(s); |
437 | unlock_kernel(); | ||
435 | return 0; | 438 | return 0; |
436 | 439 | ||
437 | out_err: | 440 | out_err: |
438 | unlock_super(s); | 441 | unlock_super(s); |
442 | unlock_kernel(); | ||
439 | kfree(new_opts); | 443 | kfree(new_opts); |
440 | return -EINVAL; | 444 | return -EINVAL; |
441 | } | 445 | } |
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index 237b27a3d570..3451a81b2142 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/vmalloc.h> | 20 | #include <linux/vmalloc.h> |
21 | #include <linux/vfs.h> | 21 | #include <linux/vfs.h> |
22 | #include <linux/crc32.h> | 22 | #include <linux/crc32.h> |
23 | #include <linux/smp_lock.h> | ||
23 | #include "nodelist.h" | 24 | #include "nodelist.h" |
24 | 25 | ||
25 | static int jffs2_flash_setup(struct jffs2_sb_info *c); | 26 | static int jffs2_flash_setup(struct jffs2_sb_info *c); |
@@ -387,6 +388,7 @@ int jffs2_remount_fs (struct super_block *sb, int *flags, char *data) | |||
387 | This also catches the case where it was stopped and this | 388 | This also catches the case where it was stopped and this |
388 | is just a remount to restart it. | 389 | is just a remount to restart it. |
389 | Flush the writebuffer, if neccecary, else we loose it */ | 390 | Flush the writebuffer, if neccecary, else we loose it */ |
391 | lock_kernel(); | ||
390 | if (!(sb->s_flags & MS_RDONLY)) { | 392 | if (!(sb->s_flags & MS_RDONLY)) { |
391 | jffs2_stop_garbage_collect_thread(c); | 393 | jffs2_stop_garbage_collect_thread(c); |
392 | mutex_lock(&c->alloc_sem); | 394 | mutex_lock(&c->alloc_sem); |
@@ -399,6 +401,7 @@ int jffs2_remount_fs (struct super_block *sb, int *flags, char *data) | |||
399 | 401 | ||
400 | *flags |= MS_NOATIME; | 402 | *flags |= MS_NOATIME; |
401 | 403 | ||
404 | unlock_kernel(); | ||
402 | return 0; | 405 | return 0; |
403 | } | 406 | } |
404 | 407 | ||
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 3eb13adf3862..09b1b6ee2186 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/crc32.h> | 32 | #include <linux/crc32.h> |
33 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
34 | #include <linux/seq_file.h> | 34 | #include <linux/seq_file.h> |
35 | #include <linux/smp_lock.h> | ||
35 | 36 | ||
36 | #include "jfs_incore.h" | 37 | #include "jfs_incore.h" |
37 | #include "jfs_filsys.h" | 38 | #include "jfs_filsys.h" |
@@ -375,19 +376,24 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) | |||
375 | s64 newLVSize = 0; | 376 | s64 newLVSize = 0; |
376 | int rc = 0; | 377 | int rc = 0; |
377 | int flag = JFS_SBI(sb)->flag; | 378 | int flag = JFS_SBI(sb)->flag; |
379 | int ret; | ||
378 | 380 | ||
379 | if (!parse_options(data, sb, &newLVSize, &flag)) { | 381 | if (!parse_options(data, sb, &newLVSize, &flag)) { |
380 | return -EINVAL; | 382 | return -EINVAL; |
381 | } | 383 | } |
384 | lock_kernel(); | ||
382 | if (newLVSize) { | 385 | if (newLVSize) { |
383 | if (sb->s_flags & MS_RDONLY) { | 386 | if (sb->s_flags & MS_RDONLY) { |
384 | printk(KERN_ERR | 387 | printk(KERN_ERR |
385 | "JFS: resize requires volume to be mounted read-write\n"); | 388 | "JFS: resize requires volume to be mounted read-write\n"); |
389 | unlock_kernel(); | ||
386 | return -EROFS; | 390 | return -EROFS; |
387 | } | 391 | } |
388 | rc = jfs_extendfs(sb, newLVSize, 0); | 392 | rc = jfs_extendfs(sb, newLVSize, 0); |
389 | if (rc) | 393 | if (rc) { |
394 | unlock_kernel(); | ||
390 | return rc; | 395 | return rc; |
396 | } | ||
391 | } | 397 | } |
392 | 398 | ||
393 | if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) { | 399 | if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) { |
@@ -398,23 +404,31 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) | |||
398 | truncate_inode_pages(JFS_SBI(sb)->direct_inode->i_mapping, 0); | 404 | truncate_inode_pages(JFS_SBI(sb)->direct_inode->i_mapping, 0); |
399 | 405 | ||
400 | JFS_SBI(sb)->flag = flag; | 406 | JFS_SBI(sb)->flag = flag; |
401 | return jfs_mount_rw(sb, 1); | 407 | ret = jfs_mount_rw(sb, 1); |
408 | unlock_kernel(); | ||
409 | return ret; | ||
402 | } | 410 | } |
403 | if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { | 411 | if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { |
404 | rc = jfs_umount_rw(sb); | 412 | rc = jfs_umount_rw(sb); |
405 | JFS_SBI(sb)->flag = flag; | 413 | JFS_SBI(sb)->flag = flag; |
414 | unlock_kernel(); | ||
406 | return rc; | 415 | return rc; |
407 | } | 416 | } |
408 | if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY)) | 417 | if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY)) |
409 | if (!(sb->s_flags & MS_RDONLY)) { | 418 | if (!(sb->s_flags & MS_RDONLY)) { |
410 | rc = jfs_umount_rw(sb); | 419 | rc = jfs_umount_rw(sb); |
411 | if (rc) | 420 | if (rc) { |
421 | unlock_kernel(); | ||
412 | return rc; | 422 | return rc; |
423 | } | ||
413 | JFS_SBI(sb)->flag = flag; | 424 | JFS_SBI(sb)->flag = flag; |
414 | return jfs_mount_rw(sb, 1); | 425 | ret = jfs_mount_rw(sb, 1); |
426 | unlock_kernel(); | ||
427 | return ret; | ||
415 | } | 428 | } |
416 | JFS_SBI(sb)->flag = flag; | 429 | JFS_SBI(sb)->flag = flag; |
417 | 430 | ||
431 | unlock_kernel(); | ||
418 | return 0; | 432 | return 0; |
419 | } | 433 | } |
420 | 434 | ||
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index d2d67781c579..26127b69a275 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -1813,6 +1813,7 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) | |||
1813 | if (data == NULL) | 1813 | if (data == NULL) |
1814 | return -ENOMEM; | 1814 | return -ENOMEM; |
1815 | 1815 | ||
1816 | lock_kernel(); | ||
1816 | /* fill out struct with values from existing mount */ | 1817 | /* fill out struct with values from existing mount */ |
1817 | data->flags = nfss->flags; | 1818 | data->flags = nfss->flags; |
1818 | data->rsize = nfss->rsize; | 1819 | data->rsize = nfss->rsize; |
@@ -1837,6 +1838,7 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) | |||
1837 | error = nfs_compare_remount_data(nfss, data); | 1838 | error = nfs_compare_remount_data(nfss, data); |
1838 | out: | 1839 | out: |
1839 | kfree(data); | 1840 | kfree(data); |
1841 | unlock_kernel(); | ||
1840 | return error; | 1842 | return error; |
1841 | } | 1843 | } |
1842 | 1844 | ||
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index 7262e8427c20..11151eaa2c4a 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -906,6 +906,8 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
906 | struct nilfs_mount_options old_opts; | 906 | struct nilfs_mount_options old_opts; |
907 | int err; | 907 | int err; |
908 | 908 | ||
909 | lock_kernel(); | ||
910 | |||
909 | old_sb_flags = sb->s_flags; | 911 | old_sb_flags = sb->s_flags; |
910 | old_opts.mount_opt = sbi->s_mount_opt; | 912 | old_opts.mount_opt = sbi->s_mount_opt; |
911 | old_opts.snapshot_cno = sbi->s_snapshot_cno; | 913 | old_opts.snapshot_cno = sbi->s_snapshot_cno; |
@@ -985,6 +987,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
985 | up(&sb->s_bdev->bd_mount_sem); | 987 | up(&sb->s_bdev->bd_mount_sem); |
986 | } | 988 | } |
987 | out: | 989 | out: |
990 | unlock_kernel(); | ||
988 | return 0; | 991 | return 0; |
989 | 992 | ||
990 | rw_remount_failed: | 993 | rw_remount_failed: |
@@ -993,6 +996,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
993 | sb->s_flags = old_sb_flags; | 996 | sb->s_flags = old_sb_flags; |
994 | sbi->s_mount_opt = old_opts.mount_opt; | 997 | sbi->s_mount_opt = old_opts.mount_opt; |
995 | sbi->s_snapshot_cno = old_opts.snapshot_cno; | 998 | sbi->s_snapshot_cno = old_opts.snapshot_cno; |
999 | unlock_kernel(); | ||
996 | return err; | 1000 | return err; |
997 | } | 1001 | } |
998 | 1002 | ||
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index 7a7b0d326395..abaaa1cbf8de 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c | |||
@@ -443,6 +443,8 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
443 | ntfs_volume *vol = NTFS_SB(sb); | 443 | ntfs_volume *vol = NTFS_SB(sb); |
444 | 444 | ||
445 | ntfs_debug("Entering with remount options string: %s", opt); | 445 | ntfs_debug("Entering with remount options string: %s", opt); |
446 | |||
447 | lock_kernel(); | ||
446 | #ifndef NTFS_RW | 448 | #ifndef NTFS_RW |
447 | /* For read-only compiled driver, enforce read-only flag. */ | 449 | /* For read-only compiled driver, enforce read-only flag. */ |
448 | *flags |= MS_RDONLY; | 450 | *flags |= MS_RDONLY; |
@@ -466,15 +468,18 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
466 | if (NVolErrors(vol)) { | 468 | if (NVolErrors(vol)) { |
467 | ntfs_error(sb, "Volume has errors and is read-only%s", | 469 | ntfs_error(sb, "Volume has errors and is read-only%s", |
468 | es); | 470 | es); |
471 | unlock_kernel(); | ||
469 | return -EROFS; | 472 | return -EROFS; |
470 | } | 473 | } |
471 | if (vol->vol_flags & VOLUME_IS_DIRTY) { | 474 | if (vol->vol_flags & VOLUME_IS_DIRTY) { |
472 | ntfs_error(sb, "Volume is dirty and read-only%s", es); | 475 | ntfs_error(sb, "Volume is dirty and read-only%s", es); |
476 | unlock_kernel(); | ||
473 | return -EROFS; | 477 | return -EROFS; |
474 | } | 478 | } |
475 | if (vol->vol_flags & VOLUME_MODIFIED_BY_CHKDSK) { | 479 | if (vol->vol_flags & VOLUME_MODIFIED_BY_CHKDSK) { |
476 | ntfs_error(sb, "Volume has been modified by chkdsk " | 480 | ntfs_error(sb, "Volume has been modified by chkdsk " |
477 | "and is read-only%s", es); | 481 | "and is read-only%s", es); |
482 | unlock_kernel(); | ||
478 | return -EROFS; | 483 | return -EROFS; |
479 | } | 484 | } |
480 | if (vol->vol_flags & VOLUME_MUST_MOUNT_RO_MASK) { | 485 | if (vol->vol_flags & VOLUME_MUST_MOUNT_RO_MASK) { |
@@ -482,11 +487,13 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
482 | "(0x%x) and is read-only%s", | 487 | "(0x%x) and is read-only%s", |
483 | (unsigned)le16_to_cpu(vol->vol_flags), | 488 | (unsigned)le16_to_cpu(vol->vol_flags), |
484 | es); | 489 | es); |
490 | unlock_kernel(); | ||
485 | return -EROFS; | 491 | return -EROFS; |
486 | } | 492 | } |
487 | if (ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY)) { | 493 | if (ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY)) { |
488 | ntfs_error(sb, "Failed to set dirty bit in volume " | 494 | ntfs_error(sb, "Failed to set dirty bit in volume " |
489 | "information flags%s", es); | 495 | "information flags%s", es); |
496 | unlock_kernel(); | ||
490 | return -EROFS; | 497 | return -EROFS; |
491 | } | 498 | } |
492 | #if 0 | 499 | #if 0 |
@@ -506,18 +513,21 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
506 | ntfs_error(sb, "Failed to empty journal $LogFile%s", | 513 | ntfs_error(sb, "Failed to empty journal $LogFile%s", |
507 | es); | 514 | es); |
508 | NVolSetErrors(vol); | 515 | NVolSetErrors(vol); |
516 | unlock_kernel(); | ||
509 | return -EROFS; | 517 | return -EROFS; |
510 | } | 518 | } |
511 | if (!ntfs_mark_quotas_out_of_date(vol)) { | 519 | if (!ntfs_mark_quotas_out_of_date(vol)) { |
512 | ntfs_error(sb, "Failed to mark quotas out of date%s", | 520 | ntfs_error(sb, "Failed to mark quotas out of date%s", |
513 | es); | 521 | es); |
514 | NVolSetErrors(vol); | 522 | NVolSetErrors(vol); |
523 | unlock_kernel(); | ||
515 | return -EROFS; | 524 | return -EROFS; |
516 | } | 525 | } |
517 | if (!ntfs_stamp_usnjrnl(vol)) { | 526 | if (!ntfs_stamp_usnjrnl(vol)) { |
518 | ntfs_error(sb, "Failed to stamp transation log " | 527 | ntfs_error(sb, "Failed to stamp transation log " |
519 | "($UsnJrnl)%s", es); | 528 | "($UsnJrnl)%s", es); |
520 | NVolSetErrors(vol); | 529 | NVolSetErrors(vol); |
530 | unlock_kernel(); | ||
521 | return -EROFS; | 531 | return -EROFS; |
522 | } | 532 | } |
523 | } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) { | 533 | } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) { |
@@ -533,8 +543,11 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) | |||
533 | 543 | ||
534 | // TODO: Deal with *flags. | 544 | // TODO: Deal with *flags. |
535 | 545 | ||
536 | if (!parse_options(vol, opt)) | 546 | if (!parse_options(vol, opt)) { |
547 | unlock_kernel(); | ||
537 | return -EINVAL; | 548 | return -EINVAL; |
549 | } | ||
550 | unlock_kernel(); | ||
538 | ntfs_debug("Done."); | 551 | ntfs_debug("Done."); |
539 | return 0; | 552 | return 0; |
540 | } | 553 | } |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 02737596b597..201b40a441fe 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/mount.h> | 42 | #include <linux/mount.h> |
43 | #include <linux/seq_file.h> | 43 | #include <linux/seq_file.h> |
44 | #include <linux/quotaops.h> | 44 | #include <linux/quotaops.h> |
45 | #include <linux/smp_lock.h> | ||
45 | 46 | ||
46 | #define MLOG_MASK_PREFIX ML_SUPER | 47 | #define MLOG_MASK_PREFIX ML_SUPER |
47 | #include <cluster/masklog.h> | 48 | #include <cluster/masklog.h> |
@@ -581,6 +582,8 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) | |||
581 | struct mount_options parsed_options; | 582 | struct mount_options parsed_options; |
582 | struct ocfs2_super *osb = OCFS2_SB(sb); | 583 | struct ocfs2_super *osb = OCFS2_SB(sb); |
583 | 584 | ||
585 | lock_kernel(); | ||
586 | |||
584 | if (!ocfs2_parse_options(sb, data, &parsed_options, 1)) { | 587 | if (!ocfs2_parse_options(sb, data, &parsed_options, 1)) { |
585 | ret = -EINVAL; | 588 | ret = -EINVAL; |
586 | goto out; | 589 | goto out; |
@@ -684,6 +687,7 @@ unlock_osb: | |||
684 | ocfs2_set_journal_params(osb); | 687 | ocfs2_set_journal_params(osb); |
685 | } | 688 | } |
686 | out: | 689 | out: |
690 | unlock_kernel(); | ||
687 | return ret; | 691 | return ret; |
688 | } | 692 | } |
689 | 693 | ||
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 90dcb7b033ea..2969773cfc22 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/mount.h> | 28 | #include <linux/mount.h> |
29 | #include <linux/namei.h> | 29 | #include <linux/namei.h> |
30 | #include <linux/crc32.h> | 30 | #include <linux/crc32.h> |
31 | #include <linux/smp_lock.h> | ||
31 | 32 | ||
32 | struct file_system_type reiserfs_fs_type; | 33 | struct file_system_type reiserfs_fs_type; |
33 | 34 | ||
@@ -1196,6 +1197,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
1196 | memcpy(qf_names, REISERFS_SB(s)->s_qf_names, sizeof(qf_names)); | 1197 | memcpy(qf_names, REISERFS_SB(s)->s_qf_names, sizeof(qf_names)); |
1197 | #endif | 1198 | #endif |
1198 | 1199 | ||
1200 | lock_kernel(); | ||
1199 | rs = SB_DISK_SUPER_BLOCK(s); | 1201 | rs = SB_DISK_SUPER_BLOCK(s); |
1200 | 1202 | ||
1201 | if (!reiserfs_parse_options | 1203 | if (!reiserfs_parse_options |
@@ -1318,10 +1320,12 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
1318 | 1320 | ||
1319 | out_ok: | 1321 | out_ok: |
1320 | replace_mount_options(s, new_opts); | 1322 | replace_mount_options(s, new_opts); |
1323 | unlock_kernel(); | ||
1321 | return 0; | 1324 | return 0; |
1322 | 1325 | ||
1323 | out_err: | 1326 | out_err: |
1324 | kfree(new_opts); | 1327 | kfree(new_opts); |
1328 | unlock_kernel(); | ||
1325 | return err; | 1329 | return err; |
1326 | } | 1330 | } |
1327 | 1331 | ||
diff --git a/fs/super.c b/fs/super.c index 1905f4af01cc..83b47416d006 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -540,7 +540,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | |||
540 | shrink_dcache_sb(sb); | 540 | shrink_dcache_sb(sb); |
541 | sync_filesystem(sb); | 541 | sync_filesystem(sb); |
542 | 542 | ||
543 | lock_kernel(); | ||
544 | /* If we are remounting RDONLY and current sb is read/write, | 543 | /* If we are remounting RDONLY and current sb is read/write, |
545 | make sure there are no rw files opened */ | 544 | make sure there are no rw files opened */ |
546 | if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY)) { | 545 | if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY)) { |
@@ -566,7 +565,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | |||
566 | } | 565 | } |
567 | } | 566 | } |
568 | sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK); | 567 | sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK); |
569 | unlock_kernel(); | ||
570 | if (remount_rw) | 568 | if (remount_rw) |
571 | vfs_dq_quota_on_remount(sb); | 569 | vfs_dq_quota_on_remount(sb); |
572 | return 0; | 570 | return 0; |
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 522c3fd7eb3c..3589eab02a2f 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/mount.h> | 36 | #include <linux/mount.h> |
37 | #include <linux/math64.h> | 37 | #include <linux/math64.h> |
38 | #include <linux/writeback.h> | 38 | #include <linux/writeback.h> |
39 | #include <linux/smp_lock.h> | ||
39 | #include "ubifs.h" | 40 | #include "ubifs.h" |
40 | 41 | ||
41 | /* | 42 | /* |
@@ -1770,17 +1771,22 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data) | |||
1770 | return err; | 1771 | return err; |
1771 | } | 1772 | } |
1772 | 1773 | ||
1774 | lock_kernel(); | ||
1773 | if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) { | 1775 | if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) { |
1774 | if (c->ro_media) { | 1776 | if (c->ro_media) { |
1775 | ubifs_msg("cannot re-mount due to prior errors"); | 1777 | ubifs_msg("cannot re-mount due to prior errors"); |
1778 | unlock_kernel(); | ||
1776 | return -EROFS; | 1779 | return -EROFS; |
1777 | } | 1780 | } |
1778 | err = ubifs_remount_rw(c); | 1781 | err = ubifs_remount_rw(c); |
1779 | if (err) | 1782 | if (err) { |
1783 | unlock_kernel(); | ||
1780 | return err; | 1784 | return err; |
1785 | } | ||
1781 | } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) { | 1786 | } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) { |
1782 | if (c->ro_media) { | 1787 | if (c->ro_media) { |
1783 | ubifs_msg("cannot re-mount due to prior errors"); | 1788 | ubifs_msg("cannot re-mount due to prior errors"); |
1789 | unlock_kernel(); | ||
1784 | return -EROFS; | 1790 | return -EROFS; |
1785 | } | 1791 | } |
1786 | ubifs_remount_ro(c); | 1792 | ubifs_remount_ro(c); |
@@ -1795,6 +1801,7 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data) | |||
1795 | } | 1801 | } |
1796 | 1802 | ||
1797 | ubifs_assert(c->lst.taken_empty_lebs > 0); | 1803 | ubifs_assert(c->lst.taken_empty_lebs > 0); |
1804 | unlock_kernel(); | ||
1798 | return 0; | 1805 | return 0; |
1799 | } | 1806 | } |
1800 | 1807 | ||
diff --git a/fs/udf/super.c b/fs/udf/super.c index 04802cc39b18..6832135159b6 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -568,6 +568,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
568 | if (!udf_parse_options(options, &uopt, true)) | 568 | if (!udf_parse_options(options, &uopt, true)) |
569 | return -EINVAL; | 569 | return -EINVAL; |
570 | 570 | ||
571 | lock_kernel(); | ||
571 | sbi->s_flags = uopt.flags; | 572 | sbi->s_flags = uopt.flags; |
572 | sbi->s_uid = uopt.uid; | 573 | sbi->s_uid = uopt.uid; |
573 | sbi->s_gid = uopt.gid; | 574 | sbi->s_gid = uopt.gid; |
@@ -581,13 +582,16 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
581 | *flags |= MS_RDONLY; | 582 | *flags |= MS_RDONLY; |
582 | } | 583 | } |
583 | 584 | ||
584 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) | 585 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { |
586 | unlock_kernel(); | ||
585 | return 0; | 587 | return 0; |
588 | } | ||
586 | if (*flags & MS_RDONLY) | 589 | if (*flags & MS_RDONLY) |
587 | udf_close_lvid(sb); | 590 | udf_close_lvid(sb); |
588 | else | 591 | else |
589 | udf_open_lvid(sb); | 592 | udf_open_lvid(sb); |
590 | 593 | ||
594 | unlock_kernel(); | ||
591 | return 0; | 595 | return 0; |
592 | } | 596 | } |
593 | 597 | ||
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index c97210ee0670..6560dda7b18c 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -263,6 +263,7 @@ void ufs_panic (struct super_block * sb, const char * function, | |||
263 | struct ufs_super_block_first * usb1; | 263 | struct ufs_super_block_first * usb1; |
264 | va_list args; | 264 | va_list args; |
265 | 265 | ||
266 | lock_kernel(); | ||
266 | uspi = UFS_SB(sb)->s_uspi; | 267 | uspi = UFS_SB(sb)->s_uspi; |
267 | usb1 = ubh_get_usb_first(uspi); | 268 | usb1 = ubh_get_usb_first(uspi); |
268 | 269 | ||
@@ -1182,7 +1183,8 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1182 | struct ufs_super_block_third * usb3; | 1183 | struct ufs_super_block_third * usb3; |
1183 | unsigned new_mount_opt, ufstype; | 1184 | unsigned new_mount_opt, ufstype; |
1184 | unsigned flags; | 1185 | unsigned flags; |
1185 | 1186 | ||
1187 | lock_kernel(); | ||
1186 | lock_super(sb); | 1188 | lock_super(sb); |
1187 | uspi = UFS_SB(sb)->s_uspi; | 1189 | uspi = UFS_SB(sb)->s_uspi; |
1188 | flags = UFS_SB(sb)->s_flags; | 1190 | flags = UFS_SB(sb)->s_flags; |
@@ -1198,6 +1200,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1198 | ufs_set_opt (new_mount_opt, ONERROR_LOCK); | 1200 | ufs_set_opt (new_mount_opt, ONERROR_LOCK); |
1199 | if (!ufs_parse_options (data, &new_mount_opt)) { | 1201 | if (!ufs_parse_options (data, &new_mount_opt)) { |
1200 | unlock_super(sb); | 1202 | unlock_super(sb); |
1203 | unlock_kernel(); | ||
1201 | return -EINVAL; | 1204 | return -EINVAL; |
1202 | } | 1205 | } |
1203 | if (!(new_mount_opt & UFS_MOUNT_UFSTYPE)) { | 1206 | if (!(new_mount_opt & UFS_MOUNT_UFSTYPE)) { |
@@ -1205,12 +1208,14 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1205 | } else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { | 1208 | } else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { |
1206 | printk("ufstype can't be changed during remount\n"); | 1209 | printk("ufstype can't be changed during remount\n"); |
1207 | unlock_super(sb); | 1210 | unlock_super(sb); |
1211 | unlock_kernel(); | ||
1208 | return -EINVAL; | 1212 | return -EINVAL; |
1209 | } | 1213 | } |
1210 | 1214 | ||
1211 | if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { | 1215 | if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { |
1212 | UFS_SB(sb)->s_mount_opt = new_mount_opt; | 1216 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
1213 | unlock_super(sb); | 1217 | unlock_super(sb); |
1218 | unlock_kernel(); | ||
1214 | return 0; | 1219 | return 0; |
1215 | } | 1220 | } |
1216 | 1221 | ||
@@ -1236,6 +1241,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1236 | printk("ufs was compiled with read-only support, " | 1241 | printk("ufs was compiled with read-only support, " |
1237 | "can't be mounted as read-write\n"); | 1242 | "can't be mounted as read-write\n"); |
1238 | unlock_super(sb); | 1243 | unlock_super(sb); |
1244 | unlock_kernel(); | ||
1239 | return -EINVAL; | 1245 | return -EINVAL; |
1240 | #else | 1246 | #else |
1241 | if (ufstype != UFS_MOUNT_UFSTYPE_SUN && | 1247 | if (ufstype != UFS_MOUNT_UFSTYPE_SUN && |
@@ -1245,11 +1251,13 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1245 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { | 1251 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { |
1246 | printk("this ufstype is read-only supported\n"); | 1252 | printk("this ufstype is read-only supported\n"); |
1247 | unlock_super(sb); | 1253 | unlock_super(sb); |
1254 | unlock_kernel(); | ||
1248 | return -EINVAL; | 1255 | return -EINVAL; |
1249 | } | 1256 | } |
1250 | if (!ufs_read_cylinder_structures(sb)) { | 1257 | if (!ufs_read_cylinder_structures(sb)) { |
1251 | printk("failed during remounting\n"); | 1258 | printk("failed during remounting\n"); |
1252 | unlock_super(sb); | 1259 | unlock_super(sb); |
1260 | unlock_kernel(); | ||
1253 | return -EPERM; | 1261 | return -EPERM; |
1254 | } | 1262 | } |
1255 | sb->s_flags &= ~MS_RDONLY; | 1263 | sb->s_flags &= ~MS_RDONLY; |
@@ -1257,6 +1265,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1257 | } | 1265 | } |
1258 | UFS_SB(sb)->s_mount_opt = new_mount_opt; | 1266 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
1259 | unlock_super(sb); | 1267 | unlock_super(sb); |
1268 | unlock_kernel(); | ||
1260 | return 0; | 1269 | return 0; |
1261 | } | 1270 | } |
1262 | 1271 | ||
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index a7267bfd3765..3fb789f6df94 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/cgroupstats.h> | 46 | #include <linux/cgroupstats.h> |
47 | #include <linux/hash.h> | 47 | #include <linux/hash.h> |
48 | #include <linux/namei.h> | 48 | #include <linux/namei.h> |
49 | #include <linux/smp_lock.h> | ||
49 | 50 | ||
50 | #include <asm/atomic.h> | 51 | #include <asm/atomic.h> |
51 | 52 | ||
@@ -900,6 +901,7 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data) | |||
900 | struct cgroup *cgrp = &root->top_cgroup; | 901 | struct cgroup *cgrp = &root->top_cgroup; |
901 | struct cgroup_sb_opts opts; | 902 | struct cgroup_sb_opts opts; |
902 | 903 | ||
904 | lock_kernel(); | ||
903 | mutex_lock(&cgrp->dentry->d_inode->i_mutex); | 905 | mutex_lock(&cgrp->dentry->d_inode->i_mutex); |
904 | mutex_lock(&cgroup_mutex); | 906 | mutex_lock(&cgroup_mutex); |
905 | 907 | ||
@@ -927,6 +929,7 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data) | |||
927 | kfree(opts.release_agent); | 929 | kfree(opts.release_agent); |
928 | mutex_unlock(&cgroup_mutex); | 930 | mutex_unlock(&cgroup_mutex); |
929 | mutex_unlock(&cgrp->dentry->d_inode->i_mutex); | 931 | mutex_unlock(&cgrp->dentry->d_inode->i_mutex); |
932 | unlock_kernel(); | ||
930 | return ret; | 933 | return ret; |
931 | } | 934 | } |
932 | 935 | ||