hfsplus: fix BKL leak in hfsplus_ioctl
authorChristoph Hellwig <hch@lst.de>
Fri, 1 Oct 2010 03:41:27 +0000 (05:41 +0200)
committerChristoph Hellwig <hch@lst.de>
Fri, 1 Oct 2010 03:41:27 +0000 (05:41 +0200)
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>
fs/hfsplus/ioctl.c

index ac405f09902651838979e322931ba7a1f1441633..59dc402dfe9507e7a35e62f0c0dce5aaf3333bc0 100644 (file)
@@ -26,7 +26,6 @@ long hfsplus_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
        struct inode *inode = filp->f_path.dentry->d_inode;
        unsigned int flags;
 
-       lock_kernel();
        switch (cmd) {
        case HFSPLUS_IOC_EXT2_GETFLAGS:
                flags = 0;
@@ -39,6 +38,8 @@ long hfsplus_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
                return put_user(flags, (int __user *)arg);
        case HFSPLUS_IOC_EXT2_SETFLAGS: {
                int err = 0;
+
+               lock_kernel();
                err = mnt_want_write(filp->f_path.mnt);
                if (err) {
                        unlock_kernel();
@@ -93,7 +94,6 @@ setflags_out:
                return err;
        }
        default:
-               unlock_kernel();
                return -ENOTTY;
        }
 }