aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2010-09-30 23:41:27 -0400
committerChristoph Hellwig <hch@lst.de>2010-09-30 23:41:27 -0400
commit249e6353001e407edf5c9a74482ecfca90c8ff33 (patch)
treec9f30ff5f686e06cd97fbc891dd90346fc8bc9a7 /fs
parent0f44fbd297e1cda5d9ecc9f5321a86fe647c7d4a (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')
-rw-r--r--fs/hfsplus/ioctl.c4
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}