mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
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:
parent
2ca58e30b1
commit
7c7c436e14
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
@ -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 = {
|
||||||
|
@ -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 *,
|
||||||
|
Loading…
Reference in New Issue
Block a user