nilfs2: convert to fileattr

Use the fileattr API to let the VFS handle locking, permission checking and
conversion.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Cc: Ryusuke Konishi <konishi.ryusuke@gmail.com>
This commit is contained in:
Miklos Szeredi 2021-04-07 14:36:44 +02:00
parent 2ca58e30b1
commit 7c7c436e14
4 changed files with 25 additions and 43 deletions

View File

@ -148,6 +148,8 @@ const struct inode_operations nilfs_file_inode_operations = {
.setattr = nilfs_setattr, .setattr = nilfs_setattr,
.permission = nilfs_permission, .permission = nilfs_permission,
.fiemap = nilfs_fiemap, .fiemap = nilfs_fiemap,
.fileattr_get = nilfs_fileattr_get,
.fileattr_set = nilfs_fileattr_set,
}; };
/* end of file */ /* end of file */

View File

@ -16,6 +16,7 @@
#include <linux/compat.h> /* compat_ptr() */ #include <linux/compat.h> /* compat_ptr() */
#include <linux/mount.h> /* mnt_want_write_file(), mnt_drop_write_file() */ #include <linux/mount.h> /* mnt_want_write_file(), mnt_drop_write_file() */
#include <linux/buffer_head.h> #include <linux/buffer_head.h>
#include <linux/fileattr.h>
#include "nilfs.h" #include "nilfs.h"
#include "segment.h" #include "segment.h"
#include "bmap.h" #include "bmap.h"
@ -113,51 +114,39 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs,
} }
/** /**
* nilfs_ioctl_getflags - ioctl to support lsattr * nilfs_fileattr_get - ioctl to support lsattr
*/ */
static int nilfs_ioctl_getflags(struct inode *inode, void __user *argp) int nilfs_fileattr_get(struct dentry *dentry, struct fileattr *fa)
{ {
unsigned int flags = NILFS_I(inode)->i_flags & FS_FL_USER_VISIBLE; struct inode *inode = d_inode(dentry);
return put_user(flags, (int __user *)argp); fileattr_fill_flags(fa, NILFS_I(inode)->i_flags & FS_FL_USER_VISIBLE);
return 0;
} }
/** /**
* nilfs_ioctl_setflags - ioctl to support chattr * nilfs_fileattr_set - ioctl to support chattr
*/ */
static int nilfs_ioctl_setflags(struct inode *inode, struct file *filp, int nilfs_fileattr_set(struct user_namespace *mnt_userns,
void __user *argp) struct dentry *dentry, struct fileattr *fa)
{ {
struct inode *inode = d_inode(dentry);
struct nilfs_transaction_info ti; struct nilfs_transaction_info ti;
unsigned int flags, oldflags; unsigned int flags, oldflags;
int ret; int ret;
if (!inode_owner_or_capable(&init_user_ns, inode)) if (fileattr_has_fsx(fa))
return -EACCES; return -EOPNOTSUPP;
if (get_user(flags, (int __user *)argp)) flags = nilfs_mask_flags(inode->i_mode, fa->flags);
return -EFAULT;
ret = mnt_want_write_file(filp);
if (ret)
return ret;
flags = nilfs_mask_flags(inode->i_mode, flags);
inode_lock(inode);
oldflags = NILFS_I(inode)->i_flags;
ret = vfs_ioc_setflags_prepare(inode, oldflags, flags);
if (ret)
goto out;
ret = nilfs_transaction_begin(inode->i_sb, &ti, 0); ret = nilfs_transaction_begin(inode->i_sb, &ti, 0);
if (ret) if (ret)
goto out; return ret;
NILFS_I(inode)->i_flags = (oldflags & ~FS_FL_USER_MODIFIABLE) | oldflags = NILFS_I(inode)->i_flags & ~FS_FL_USER_MODIFIABLE;
(flags & FS_FL_USER_MODIFIABLE); NILFS_I(inode)->i_flags = oldflags | (flags & FS_FL_USER_MODIFIABLE);
nilfs_set_inode_flags(inode); nilfs_set_inode_flags(inode);
inode->i_ctime = current_time(inode); inode->i_ctime = current_time(inode);
@ -165,11 +154,7 @@ static int nilfs_ioctl_setflags(struct inode *inode, struct file *filp,
nilfs_set_transaction_flag(NILFS_TI_SYNC); nilfs_set_transaction_flag(NILFS_TI_SYNC);
nilfs_mark_inode_dirty(inode); nilfs_mark_inode_dirty(inode);
ret = nilfs_transaction_commit(inode->i_sb); return nilfs_transaction_commit(inode->i_sb);
out:
inode_unlock(inode);
mnt_drop_write_file(filp);
return ret;
} }
/** /**
@ -1282,10 +1267,6 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;
switch (cmd) { switch (cmd) {
case FS_IOC_GETFLAGS:
return nilfs_ioctl_getflags(inode, argp);
case FS_IOC_SETFLAGS:
return nilfs_ioctl_setflags(inode, filp, argp);
case FS_IOC_GETVERSION: case FS_IOC_GETVERSION:
return nilfs_ioctl_getversion(inode, argp); return nilfs_ioctl_getversion(inode, argp);
case NILFS_IOCTL_CHANGE_CPMODE: case NILFS_IOCTL_CHANGE_CPMODE:
@ -1331,12 +1312,6 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{ {
switch (cmd) { switch (cmd) {
case FS_IOC32_GETFLAGS:
cmd = FS_IOC_GETFLAGS;
break;
case FS_IOC32_SETFLAGS:
cmd = FS_IOC_SETFLAGS;
break;
case FS_IOC32_GETVERSION: case FS_IOC32_GETVERSION:
cmd = FS_IOC_GETVERSION; cmd = FS_IOC_GETVERSION;
break; break;

View File

@ -552,6 +552,8 @@ const struct inode_operations nilfs_dir_inode_operations = {
.setattr = nilfs_setattr, .setattr = nilfs_setattr,
.permission = nilfs_permission, .permission = nilfs_permission,
.fiemap = nilfs_fiemap, .fiemap = nilfs_fiemap,
.fileattr_get = nilfs_fileattr_get,
.fileattr_set = nilfs_fileattr_set,
}; };
const struct inode_operations nilfs_special_inode_operations = { const struct inode_operations nilfs_special_inode_operations = {

View File

@ -243,6 +243,9 @@ extern void nilfs_set_link(struct inode *, struct nilfs_dir_entry *,
extern int nilfs_sync_file(struct file *, loff_t, loff_t, int); extern int nilfs_sync_file(struct file *, loff_t, loff_t, int);
/* ioctl.c */ /* ioctl.c */
int nilfs_fileattr_get(struct dentry *dentry, struct fileattr *m);
int nilfs_fileattr_set(struct user_namespace *mnt_userns,
struct dentry *dentry, struct fileattr *fa);
long nilfs_ioctl(struct file *, unsigned int, unsigned long); long nilfs_ioctl(struct file *, unsigned int, unsigned long);
long nilfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg); long nilfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *, struct nilfs_argv *, int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *, struct nilfs_argv *,