diff options
author | Christoph Hellwig <hch@lst.de> | 2010-09-30 23:41:27 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2010-09-30 23:41:27 -0400 |
commit | 249e6353001e407edf5c9a74482ecfca90c8ff33 (patch) | |
tree | c9f30ff5f686e06cd97fbc891dd90346fc8bc9a7 /fs/hfsplus | |
parent | 0f44fbd297e1cda5d9ecc9f5321a86fe647c7d4a (diff) |
hfsplus: fix BKL leak in hfsplus_ioctl
Currenly the HFSPLUS_IOC_EXT2_GETFLAGS case never unlocks the BKL, which
can lead to easily reproduced lockups when doing multiple GETFLAGS ioctls.
Fix this by only taking the BKL for the HFSPLUS_IOC_EXT2_SETFLAGS case
as neither HFSPLUS_IOC_EXT2_GETFLAGS not the default error case needs it.
Signed-off-by: Christoph Hellwig <hch@tuxera.com>
Diffstat (limited to 'fs/hfsplus')
-rw-r--r-- | fs/hfsplus/ioctl.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/hfsplus/ioctl.c b/fs/hfsplus/ioctl.c index ac405f099026..59dc402dfe95 100644 --- a/fs/hfsplus/ioctl.c +++ b/fs/hfsplus/ioctl.c | |||
@@ -26,7 +26,6 @@ long hfsplus_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
26 | struct inode *inode = filp->f_path.dentry->d_inode; | 26 | struct inode *inode = filp->f_path.dentry->d_inode; |
27 | unsigned int flags; | 27 | unsigned int flags; |
28 | 28 | ||
29 | lock_kernel(); | ||
30 | switch (cmd) { | 29 | switch (cmd) { |
31 | case HFSPLUS_IOC_EXT2_GETFLAGS: | 30 | case HFSPLUS_IOC_EXT2_GETFLAGS: |
32 | flags = 0; | 31 | flags = 0; |
@@ -39,6 +38,8 @@ long hfsplus_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
39 | return put_user(flags, (int __user *)arg); | 38 | return put_user(flags, (int __user *)arg); |
40 | case HFSPLUS_IOC_EXT2_SETFLAGS: { | 39 | case HFSPLUS_IOC_EXT2_SETFLAGS: { |
41 | int err = 0; | 40 | int err = 0; |
41 | |||
42 | lock_kernel(); | ||
42 | err = mnt_want_write(filp->f_path.mnt); | 43 | err = mnt_want_write(filp->f_path.mnt); |
43 | if (err) { | 44 | if (err) { |
44 | unlock_kernel(); | 45 | unlock_kernel(); |
@@ -93,7 +94,6 @@ setflags_out: | |||
93 | return err; | 94 | return err; |
94 | } | 95 | } |
95 | default: | 96 | default: |
96 | unlock_kernel(); | ||
97 | return -ENOTTY; | 97 | return -ENOTTY; |
98 | } | 98 | } |
99 | } | 99 | } |