diff -Nurp linux-2.6.22.10-vs2.3.0.29/fs/ocfs2/ioctl.c linux-2.6.22.10-vs2.3.0.29.ocfs2/fs/ocfs2/ioctl.c --- linux-2.6.22.10-vs2.3.0.29/fs/ocfs2/ioctl.c 2007-10-30 02:23:59.000000000 +0100 +++ linux-2.6.22.10-vs2.3.0.29.ocfs2/fs/ocfs2/ioctl.c 2007-11-07 18:51:14.000000000 +0100 @@ -39,6 +39,7 @@ static int ocfs2_get_inode_attr(struct i return status; } +/* Called with inode->i_mutex locked */ int ocfs2_set_inode_attr(struct inode *inode, unsigned flags, unsigned mask) { @@ -49,8 +50,6 @@ int ocfs2_set_inode_attr(struct inode *i unsigned oldflags; int status; - mutex_lock(&inode->i_mutex); - status = ocfs2_meta_lock(inode, &bh, 1); if (status < 0) { mlog_errno(status); @@ -101,8 +100,6 @@ int ocfs2_set_inode_attr(struct inode *i bail_unlock: ocfs2_meta_unlock(inode, 1); bail: - mutex_unlock(&inode->i_mutex); - if (bh) brelse(bh); @@ -110,6 +107,16 @@ bail: return status; } +static inline int ocfs2_set_inode_attr_lock(struct inode *inode, + unsigned flags, unsigned mask) +{ + int ret; + mutex_lock(&inode->i_mutex); + ret = ocfs2_set_inode_attr(inode, flags, mask); + mutex_unlock(&inode->i_mutex); + return ret; +} + int ocfs2_ioctl(struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) { @@ -128,7 +135,7 @@ int ocfs2_ioctl(struct inode * inode, st if (get_user(flags, (int __user *) arg)) return -EFAULT; - return ocfs2_set_inode_attr(inode, flags, + return ocfs2_set_inode_attr_lock(inode, flags, OCFS2_FL_MODIFIABLE); default: return -ENOTTY;