提交 52656e6c 编写于 作者: J Jaegeuk Kim

f2fs: clean up f2fs_ioctl functions

This patch cleans up f2fs_ioctl functions for better readability.
Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
上级 8a21984d
...@@ -805,90 +805,102 @@ static inline __u32 f2fs_mask_flags(umode_t mode, __u32 flags) ...@@ -805,90 +805,102 @@ static inline __u32 f2fs_mask_flags(umode_t mode, __u32 flags)
return flags & F2FS_OTHER_FLMASK; return flags & F2FS_OTHER_FLMASK;
} }
long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)
{ {
struct inode *inode = file_inode(filp); struct inode *inode = file_inode(filp);
struct f2fs_inode_info *fi = F2FS_I(inode); struct f2fs_inode_info *fi = F2FS_I(inode);
unsigned int flags; unsigned int flags = fi->i_flags & FS_FL_USER_VISIBLE;
int ret; return put_user(flags, (int __user *)arg);
}
switch (cmd) { static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
case F2FS_IOC_GETFLAGS: {
flags = fi->i_flags & FS_FL_USER_VISIBLE; struct inode *inode = file_inode(filp);
return put_user(flags, (int __user *) arg); struct f2fs_inode_info *fi = F2FS_I(inode);
case F2FS_IOC_SETFLAGS: unsigned int flags = fi->i_flags & FS_FL_USER_VISIBLE;
{ unsigned int oldflags;
unsigned int oldflags; int ret;
ret = mnt_want_write_file(filp); ret = mnt_want_write_file(filp);
if (ret) if (ret)
return ret; return ret;
if (!inode_owner_or_capable(inode)) { if (!inode_owner_or_capable(inode)) {
ret = -EACCES; ret = -EACCES;
goto out; goto out;
} }
if (get_user(flags, (int __user *) arg)) { if (get_user(flags, (int __user *)arg)) {
ret = -EFAULT; ret = -EFAULT;
goto out; goto out;
} }
flags = f2fs_mask_flags(inode->i_mode, flags); flags = f2fs_mask_flags(inode->i_mode, flags);
mutex_lock(&inode->i_mutex); mutex_lock(&inode->i_mutex);
oldflags = fi->i_flags; oldflags = fi->i_flags;
if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) { if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) {
if (!capable(CAP_LINUX_IMMUTABLE)) { if (!capable(CAP_LINUX_IMMUTABLE)) {
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
ret = -EPERM; ret = -EPERM;
goto out; goto out;
}
} }
}
flags = flags & FS_FL_USER_MODIFIABLE; flags = flags & FS_FL_USER_MODIFIABLE;
flags |= oldflags & ~FS_FL_USER_MODIFIABLE; flags |= oldflags & ~FS_FL_USER_MODIFIABLE;
fi->i_flags = flags; fi->i_flags = flags;
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
f2fs_set_inode_flags(inode); f2fs_set_inode_flags(inode);
inode->i_ctime = CURRENT_TIME; inode->i_ctime = CURRENT_TIME;
mark_inode_dirty(inode); mark_inode_dirty(inode);
out: out:
mnt_drop_write_file(filp); mnt_drop_write_file(filp);
return ret; return ret;
} }
case FITRIM:
{
struct super_block *sb = inode->i_sb;
struct request_queue *q = bdev_get_queue(sb->s_bdev);
struct fstrim_range range;
int ret = 0;
if (!capable(CAP_SYS_ADMIN)) static int f2fs_ioc_fitrim(struct file *filp, unsigned long arg)
return -EPERM; {
struct inode *inode = file_inode(filp);
struct super_block *sb = inode->i_sb;
struct request_queue *q = bdev_get_queue(sb->s_bdev);
struct fstrim_range range;
int ret;
if (!blk_queue_discard(q)) if (!capable(CAP_SYS_ADMIN))
return -EOPNOTSUPP; return -EPERM;
if (copy_from_user(&range, (struct fstrim_range __user *)arg, if (!blk_queue_discard(q))
sizeof(range))) return -EOPNOTSUPP;
return -EFAULT;
range.minlen = max((unsigned int)range.minlen, if (copy_from_user(&range, (struct fstrim_range __user *)arg,
q->limits.discard_granularity); sizeof(range)))
ret = f2fs_trim_fs(F2FS_SB(sb), &range); return -EFAULT;
if (ret < 0)
return ret;
if (copy_to_user((struct fstrim_range __user *)arg, &range, range.minlen = max((unsigned int)range.minlen,
sizeof(range))) q->limits.discard_granularity);
return -EFAULT; ret = f2fs_trim_fs(F2FS_SB(sb), &range);
if (ret < 0)
return ret;
return 0; if (copy_to_user((struct fstrim_range __user *)arg, &range,
} sizeof(range)))
return -EFAULT;
return 0;
}
long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch (cmd) {
case F2FS_IOC_GETFLAGS:
return f2fs_ioc_getflags(filp, arg);
case F2FS_IOC_SETFLAGS:
return f2fs_ioc_setflags(filp, arg);
case FITRIM:
return f2fs_ioc_fitrim(filp, arg);
default: default:
return -ENOTTY; return -ENOTTY;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册