|
@@ -17,14 +17,16 @@
|
|
|
#include <linux/mount.h>
|
|
|
#include <linux/sched.h>
|
|
|
#include <linux/xattr.h>
|
|
|
+#include <linux/smp_lock.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
#include "hfsplus_fs.h"
|
|
|
|
|
|
-int hfsplus_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
|
|
|
- unsigned long arg)
|
|
|
+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;
|
|
@@ -38,8 +40,10 @@ int hfsplus_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
|
|
|
case HFSPLUS_IOC_EXT2_SETFLAGS: {
|
|
|
int err = 0;
|
|
|
err = mnt_want_write(filp->f_path.mnt);
|
|
|
- if (err)
|
|
|
+ if (err) {
|
|
|
+ unlock_kernel();
|
|
|
return err;
|
|
|
+ }
|
|
|
|
|
|
if (!is_owner_or_cap(inode)) {
|
|
|
err = -EACCES;
|
|
@@ -85,9 +89,11 @@ int hfsplus_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
|
|
|
mark_inode_dirty(inode);
|
|
|
setflags_out:
|
|
|
mnt_drop_write(filp->f_path.mnt);
|
|
|
+ unlock_kernel();
|
|
|
return err;
|
|
|
}
|
|
|
default:
|
|
|
+ unlock_kernel();
|
|
|
return -ENOTTY;
|
|
|
}
|
|
|
}
|