|
@@ -99,7 +99,8 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs,
|
|
|
static int nilfs_ioctl_change_cpmode(struct inode *inode, struct file *filp,
|
|
|
unsigned int cmd, void __user *argp)
|
|
|
{
|
|
|
- struct inode *cpfile = NILFS_SB(inode->i_sb)->s_nilfs->ns_cpfile;
|
|
|
+ struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs;
|
|
|
+ struct inode *cpfile = nilfs->ns_cpfile;
|
|
|
struct nilfs_transaction_info ti;
|
|
|
struct nilfs_cpmode cpmode;
|
|
|
int ret;
|
|
@@ -109,14 +110,17 @@ static int nilfs_ioctl_change_cpmode(struct inode *inode, struct file *filp,
|
|
|
if (copy_from_user(&cpmode, argp, sizeof(cpmode)))
|
|
|
return -EFAULT;
|
|
|
|
|
|
+ mutex_lock(&nilfs->ns_mount_mutex);
|
|
|
nilfs_transaction_begin(inode->i_sb, &ti, 0);
|
|
|
ret = nilfs_cpfile_change_cpmode(
|
|
|
cpfile, cpmode.cm_cno, cpmode.cm_mode);
|
|
|
if (unlikely(ret < 0)) {
|
|
|
nilfs_transaction_abort(inode->i_sb);
|
|
|
+ mutex_unlock(&nilfs->ns_mount_mutex);
|
|
|
return ret;
|
|
|
}
|
|
|
nilfs_transaction_commit(inode->i_sb); /* never fails */
|
|
|
+ mutex_unlock(&nilfs->ns_mount_mutex);
|
|
|
return ret;
|
|
|
}
|
|
|
|