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 | |
| 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>
| -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 | } |
