From 64736f87fe90917bf8153039dc1a93ffbe66201f Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Fri, 1 Oct 2010 05:41:35 +0200 Subject: [PATCH] --- yaml --- r: 211568 b: refs/heads/master c: 6333816ade7e04a96ec0a34a8378c455e4f7c4dd h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/hfsplus/ioctl.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index d39efa6d68a4..086059901f84 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 94744567fef9602c3d8218a1d8f58c04cce354f6 +refs/heads/master: 6333816ade7e04a96ec0a34a8378c455e4f7c4dd diff --git a/trunk/fs/hfsplus/ioctl.c b/trunk/fs/hfsplus/ioctl.c index 0e359c3b55ee..906bd3dd3145 100644 --- a/trunk/fs/hfsplus/ioctl.c +++ b/trunk/fs/hfsplus/ioctl.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include "hfsplus_fs.h" @@ -42,10 +41,9 @@ static int hfsplus_ioctl_setflags(struct file *file, int __user *user_flags) unsigned int flags; int err = 0; - lock_kernel(); err = mnt_want_write(file->f_path.mnt); if (err) - goto out_unlock_kernel; + goto out; if (!is_owner_or_cap(inode)) { err = -EACCES; @@ -57,18 +55,20 @@ static int hfsplus_ioctl_setflags(struct file *file, int __user *user_flags) goto out_drop_write; } + mutex_lock(&inode->i_mutex); + if (flags & (FS_IMMUTABLE_FL|FS_APPEND_FL) || HFSPLUS_I(inode).rootflags & (HFSPLUS_FLG_IMMUTABLE|HFSPLUS_FLG_APPEND)) { if (!capable(CAP_LINUX_IMMUTABLE)) { err = -EPERM; - goto out_drop_write; + goto out_unlock_inode; } } /* don't silently ignore unsupported ext2 flags */ if (flags & ~(FS_IMMUTABLE_FL|FS_APPEND_FL|FS_NODUMP_FL)) { err = -EOPNOTSUPP; - goto out_drop_write; + goto out_unlock_inode; } if (flags & FS_IMMUTABLE_FL) { inode->i_flags |= S_IMMUTABLE; @@ -92,10 +92,11 @@ static int hfsplus_ioctl_setflags(struct file *file, int __user *user_flags) inode->i_ctime = CURRENT_TIME_SEC; mark_inode_dirty(inode); +out_unlock_inode: + mutex_lock(&inode->i_mutex); out_drop_write: mnt_drop_write(file->f_path.mnt); -out_unlock_kernel: - unlock_kernel(); +out: return err; }