diff options
author | Arnd Bergmann <arnd@arndb.de> | 2011-01-22 14:26:12 -0500 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2011-03-02 16:27:36 -0500 |
commit | 9a311b96c3065f362e3348cb5d7af1a57ca6bff9 (patch) | |
tree | aed281e9ff7c5e689895ff838e886dff77e3e2e9 /fs/hpfs/super.c | |
parent | 5edc341313a188d94cde7ef87ac31647cea8601a (diff) |
hpfs: remove the BKL
This removes the BKL in hpfs in a rather awful
way, by making the code only work on uniprocessor
systems without kernel preemption, as suggested
by Andi Kleen.
The HPFS code probably has close to zero remaining
users on current kernels, all archeological uses of
the file system can probably be done with the significant
restrictions.
The hpfs_lock/hpfs_unlock functions are left in the
code, sincen Mikulas has indicated that he is still
interested in fixing it in a better way.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Andi Kleen <ak@linux.intel.com>
Cc: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
Cc: linux-fsdevel@vger.kernel.org
Diffstat (limited to 'fs/hpfs/super.c')
-rw-r--r-- | fs/hpfs/super.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index b30426b1fc97..c89b40808587 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c | |||
@@ -13,7 +13,6 @@ | |||
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> | ||
17 | #include <linux/bitmap.h> | 16 | #include <linux/bitmap.h> |
18 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
19 | 18 | ||
@@ -103,15 +102,11 @@ static void hpfs_put_super(struct super_block *s) | |||
103 | { | 102 | { |
104 | struct hpfs_sb_info *sbi = hpfs_sb(s); | 103 | struct hpfs_sb_info *sbi = hpfs_sb(s); |
105 | 104 | ||
106 | lock_kernel(); | ||
107 | |||
108 | kfree(sbi->sb_cp_table); | 105 | kfree(sbi->sb_cp_table); |
109 | kfree(sbi->sb_bmp_dir); | 106 | kfree(sbi->sb_bmp_dir); |
110 | unmark_dirty(s); | 107 | unmark_dirty(s); |
111 | s->s_fs_info = NULL; | 108 | s->s_fs_info = NULL; |
112 | kfree(sbi); | 109 | kfree(sbi); |
113 | |||
114 | unlock_kernel(); | ||
115 | } | 110 | } |
116 | 111 | ||
117 | unsigned hpfs_count_one_bitmap(struct super_block *s, secno secno) | 112 | unsigned hpfs_count_one_bitmap(struct super_block *s, secno secno) |
@@ -143,7 +138,7 @@ static int hpfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
143 | struct super_block *s = dentry->d_sb; | 138 | struct super_block *s = dentry->d_sb; |
144 | struct hpfs_sb_info *sbi = hpfs_sb(s); | 139 | struct hpfs_sb_info *sbi = hpfs_sb(s); |
145 | u64 id = huge_encode_dev(s->s_bdev->bd_dev); | 140 | u64 id = huge_encode_dev(s->s_bdev->bd_dev); |
146 | lock_kernel(); | 141 | hpfs_lock(s); |
147 | 142 | ||
148 | /*if (sbi->sb_n_free == -1) {*/ | 143 | /*if (sbi->sb_n_free == -1) {*/ |
149 | sbi->sb_n_free = count_bitmaps(s); | 144 | sbi->sb_n_free = count_bitmaps(s); |
@@ -160,7 +155,7 @@ static int hpfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
160 | buf->f_fsid.val[1] = (u32)(id >> 32); | 155 | buf->f_fsid.val[1] = (u32)(id >> 32); |
161 | buf->f_namelen = 254; | 156 | buf->f_namelen = 254; |
162 | 157 | ||
163 | unlock_kernel(); | 158 | hpfs_unlock(s); |
164 | 159 | ||
165 | return 0; | 160 | return 0; |
166 | } | 161 | } |
@@ -406,7 +401,7 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
406 | 401 | ||
407 | *flags |= MS_NOATIME; | 402 | *flags |= MS_NOATIME; |
408 | 403 | ||
409 | lock_kernel(); | 404 | hpfs_lock(s); |
410 | lock_super(s); | 405 | lock_super(s); |
411 | uid = sbi->sb_uid; gid = sbi->sb_gid; | 406 | uid = sbi->sb_uid; gid = sbi->sb_gid; |
412 | umask = 0777 & ~sbi->sb_mode; | 407 | umask = 0777 & ~sbi->sb_mode; |
@@ -441,12 +436,12 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
441 | replace_mount_options(s, new_opts); | 436 | replace_mount_options(s, new_opts); |
442 | 437 | ||
443 | unlock_super(s); | 438 | unlock_super(s); |
444 | unlock_kernel(); | 439 | hpfs_unlock(s); |
445 | return 0; | 440 | return 0; |
446 | 441 | ||
447 | out_err: | 442 | out_err: |
448 | unlock_super(s); | 443 | unlock_super(s); |
449 | unlock_kernel(); | 444 | hpfs_unlock(s); |
450 | kfree(new_opts); | 445 | kfree(new_opts); |
451 | return -EINVAL; | 446 | return -EINVAL; |
452 | } | 447 | } |
@@ -484,13 +479,15 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
484 | 479 | ||
485 | int o; | 480 | int o; |
486 | 481 | ||
487 | lock_kernel(); | 482 | if (num_possible_cpus() > 1) { |
483 | printk(KERN_ERR "HPFS is not SMP safe\n"); | ||
484 | return -EINVAL; | ||
485 | } | ||
488 | 486 | ||
489 | save_mount_options(s, options); | 487 | save_mount_options(s, options); |
490 | 488 | ||
491 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); | 489 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); |
492 | if (!sbi) { | 490 | if (!sbi) { |
493 | unlock_kernel(); | ||
494 | return -ENOMEM; | 491 | return -ENOMEM; |
495 | } | 492 | } |
496 | s->s_fs_info = sbi; | 493 | s->s_fs_info = sbi; |
@@ -677,7 +674,6 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
677 | root->i_blocks = 5; | 674 | root->i_blocks = 5; |
678 | hpfs_brelse4(&qbh); | 675 | hpfs_brelse4(&qbh); |
679 | } | 676 | } |
680 | unlock_kernel(); | ||
681 | return 0; | 677 | return 0; |
682 | 678 | ||
683 | bail4: brelse(bh2); | 679 | bail4: brelse(bh2); |
@@ -689,7 +685,6 @@ bail0: | |||
689 | kfree(sbi->sb_cp_table); | 685 | kfree(sbi->sb_cp_table); |
690 | s->s_fs_info = NULL; | 686 | s->s_fs_info = NULL; |
691 | kfree(sbi); | 687 | kfree(sbi); |
692 | unlock_kernel(); | ||
693 | return -EINVAL; | 688 | return -EINVAL; |
694 | } | 689 | } |
695 | 690 | ||