diff options
Diffstat (limited to 'fs/ext2/ioctl.c')
| -rw-r--r-- | fs/ext2/ioctl.c | 42 | 
1 files changed, 26 insertions, 16 deletions
diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index e7431309bdc..5d46c09863f 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c @@ -19,7 +19,7 @@  long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ext2_inode_info *ei = EXT2_I(inode);  	unsigned int flags;  	unsigned short rsv_window_size; @@ -35,11 +35,11 @@ long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  	case EXT2_IOC_SETFLAGS: {  		unsigned int oldflags; -		ret = mnt_want_write(filp->f_path.mnt); +		ret = mnt_want_write_file(filp);  		if (ret)  			return ret; -		if (!is_owner_or_cap(inode)) { +		if (!inode_owner_or_capable(inode)) {  			ret = -EACCES;  			goto setflags_out;  		} @@ -77,31 +77,41 @@ long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  		flags = flags & EXT2_FL_USER_MODIFIABLE;  		flags |= oldflags & ~EXT2_FL_USER_MODIFIABLE;  		ei->i_flags = flags; -		mutex_unlock(&inode->i_mutex);  		ext2_set_inode_flags(inode);  		inode->i_ctime = CURRENT_TIME_SEC; +		mutex_unlock(&inode->i_mutex); +  		mark_inode_dirty(inode);  setflags_out: -		mnt_drop_write(filp->f_path.mnt); +		mnt_drop_write_file(filp);  		return ret;  	}  	case EXT2_IOC_GETVERSION:  		return put_user(inode->i_generation, (int __user *) arg); -	case EXT2_IOC_SETVERSION: -		if (!is_owner_or_cap(inode)) +	case EXT2_IOC_SETVERSION: { +		__u32 generation; + +		if (!inode_owner_or_capable(inode))  			return -EPERM; -		ret = mnt_want_write(filp->f_path.mnt); +		ret = mnt_want_write_file(filp);  		if (ret)  			return ret; -		if (get_user(inode->i_generation, (int __user *) arg)) { +		if (get_user(generation, (int __user *) arg)) {  			ret = -EFAULT; -		} else { -			inode->i_ctime = CURRENT_TIME_SEC; -			mark_inode_dirty(inode); +			goto setversion_out;  		} -		mnt_drop_write(filp->f_path.mnt); + +		mutex_lock(&inode->i_mutex); +		inode->i_ctime = CURRENT_TIME_SEC; +		inode->i_generation = generation; +		mutex_unlock(&inode->i_mutex); + +		mark_inode_dirty(inode); +setversion_out: +		mnt_drop_write_file(filp);  		return ret; +	}  	case EXT2_IOC_GETRSVSZ:  		if (test_opt(inode->i_sb, RESERVATION)  			&& S_ISREG(inode->i_mode) @@ -115,13 +125,13 @@ setflags_out:  		if (!test_opt(inode->i_sb, RESERVATION) ||!S_ISREG(inode->i_mode))  			return -ENOTTY; -		if (!is_owner_or_cap(inode)) +		if (!inode_owner_or_capable(inode))  			return -EACCES;  		if (get_user(rsv_window_size, (int __user *)arg))  			return -EFAULT; -		ret = mnt_want_write(filp->f_path.mnt); +		ret = mnt_want_write_file(filp);  		if (ret)  			return ret; @@ -145,7 +155,7 @@ setflags_out:  			rsv->rsv_goal_size = rsv_window_size;  		}  		mutex_unlock(&ei->truncate_mutex); -		mnt_drop_write(filp->f_path.mnt); +		mnt_drop_write_file(filp);  		return 0;  	}  	default:  | 
