Commit 03eb6066 authored by Miklos Szeredi's avatar Miklos Szeredi

reiserfs: convert to fileattr

Use the fileattr API to let the VFS handle locking, permission checking and
conversion.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
Cc: Jan Kara <jack@suse.cz>
parent 2b5f52c5
...@@ -258,4 +258,6 @@ const struct inode_operations reiserfs_file_inode_operations = { ...@@ -258,4 +258,6 @@ const struct inode_operations reiserfs_file_inode_operations = {
.permission = reiserfs_permission, .permission = reiserfs_permission,
.get_acl = reiserfs_get_acl, .get_acl = reiserfs_get_acl,
.set_acl = reiserfs_set_acl, .set_acl = reiserfs_set_acl,
.fileattr_get = reiserfs_fileattr_get,
.fileattr_set = reiserfs_fileattr_set,
}; };
...@@ -10,6 +10,59 @@ ...@@ -10,6 +10,59 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/fileattr.h>
int reiserfs_fileattr_get(struct dentry *dentry, struct fileattr *fa)
{
struct inode *inode = d_inode(dentry);
if (!reiserfs_attrs(inode->i_sb))
return -ENOTTY;
fileattr_fill_flags(fa, REISERFS_I(inode)->i_attrs);
return 0;
}
int reiserfs_fileattr_set(struct user_namespace *mnt_userns,
struct dentry *dentry, struct fileattr *fa)
{
struct inode *inode = d_inode(dentry);
unsigned int flags = fa->flags;
int err;
reiserfs_write_lock(inode->i_sb);
err = -ENOTTY;
if (!reiserfs_attrs(inode->i_sb))
goto unlock;
err = -EOPNOTSUPP;
if (fileattr_has_fsx(fa))
goto unlock;
/*
* Is it quota file? Do not allow user to mess with it
*/
err = -EPERM;
if (IS_NOQUOTA(inode))
goto unlock;
if ((flags & REISERFS_NOTAIL_FL) && S_ISREG(inode->i_mode)) {
err = reiserfs_unpack(inode);
if (err)
goto unlock;
}
sd_attrs_to_i_attrs(flags, inode);
REISERFS_I(inode)->i_attrs = flags;
inode->i_ctime = current_time(inode);
mark_inode_dirty(inode);
err = 0;
unlock:
reiserfs_write_unlock(inode->i_sb);
return err;
}
/* /*
* reiserfs_ioctl - handler for ioctl for inode * reiserfs_ioctl - handler for ioctl for inode
...@@ -23,7 +76,6 @@ ...@@ -23,7 +76,6 @@
long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{ {
struct inode *inode = file_inode(filp); struct inode *inode = file_inode(filp);
unsigned int flags;
int err = 0; int err = 0;
reiserfs_write_lock(inode->i_sb); reiserfs_write_lock(inode->i_sb);
...@@ -32,7 +84,7 @@ long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -32,7 +84,7 @@ long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
case REISERFS_IOC_UNPACK: case REISERFS_IOC_UNPACK:
if (S_ISREG(inode->i_mode)) { if (S_ISREG(inode->i_mode)) {
if (arg) if (arg)
err = reiserfs_unpack(inode, filp); err = reiserfs_unpack(inode);
} else } else
err = -ENOTTY; err = -ENOTTY;
break; break;
...@@ -40,63 +92,6 @@ long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -40,63 +92,6 @@ long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
* following two cases are taken from fs/ext2/ioctl.c by Remy * following two cases are taken from fs/ext2/ioctl.c by Remy
* Card (card@masi.ibp.fr) * Card (card@masi.ibp.fr)
*/ */
case REISERFS_IOC_GETFLAGS:
if (!reiserfs_attrs(inode->i_sb)) {
err = -ENOTTY;
break;
}
flags = REISERFS_I(inode)->i_attrs;
err = put_user(flags, (int __user *)arg);
break;
case REISERFS_IOC_SETFLAGS:{
if (!reiserfs_attrs(inode->i_sb)) {
err = -ENOTTY;
break;
}
err = mnt_want_write_file(filp);
if (err)
break;
if (!inode_owner_or_capable(&init_user_ns, inode)) {
err = -EPERM;
goto setflags_out;
}
if (get_user(flags, (int __user *)arg)) {
err = -EFAULT;
goto setflags_out;
}
/*
* Is it quota file? Do not allow user to mess with it
*/
if (IS_NOQUOTA(inode)) {
err = -EPERM;
goto setflags_out;
}
err = vfs_ioc_setflags_prepare(inode,
REISERFS_I(inode)->i_attrs,
flags);
if (err)
goto setflags_out;
if ((flags & REISERFS_NOTAIL_FL) &&
S_ISREG(inode->i_mode)) {
int result;
result = reiserfs_unpack(inode, filp);
if (result) {
err = result;
goto setflags_out;
}
}
sd_attrs_to_i_attrs(flags, inode);
REISERFS_I(inode)->i_attrs = flags;
inode->i_ctime = current_time(inode);
mark_inode_dirty(inode);
setflags_out:
mnt_drop_write_file(filp);
break;
}
case REISERFS_IOC_GETVERSION: case REISERFS_IOC_GETVERSION:
err = put_user(inode->i_generation, (int __user *)arg); err = put_user(inode->i_generation, (int __user *)arg);
break; break;
...@@ -138,12 +133,6 @@ long reiserfs_compat_ioctl(struct file *file, unsigned int cmd, ...@@ -138,12 +133,6 @@ long reiserfs_compat_ioctl(struct file *file, unsigned int cmd,
case REISERFS_IOC32_UNPACK: case REISERFS_IOC32_UNPACK:
cmd = REISERFS_IOC_UNPACK; cmd = REISERFS_IOC_UNPACK;
break; break;
case REISERFS_IOC32_GETFLAGS:
cmd = REISERFS_IOC_GETFLAGS;
break;
case REISERFS_IOC32_SETFLAGS:
cmd = REISERFS_IOC_SETFLAGS;
break;
case REISERFS_IOC32_GETVERSION: case REISERFS_IOC32_GETVERSION:
cmd = REISERFS_IOC_GETVERSION; cmd = REISERFS_IOC_GETVERSION;
break; break;
...@@ -165,7 +154,7 @@ int reiserfs_commit_write(struct file *f, struct page *page, ...@@ -165,7 +154,7 @@ int reiserfs_commit_write(struct file *f, struct page *page,
* Function try to convert tail from direct item into indirect. * Function try to convert tail from direct item into indirect.
* It set up nopack attribute in the REISERFS_I(inode)->nopack * It set up nopack attribute in the REISERFS_I(inode)->nopack
*/ */
int reiserfs_unpack(struct inode *inode, struct file *filp) int reiserfs_unpack(struct inode *inode)
{ {
int retval = 0; int retval = 0;
int index; int index;
......
...@@ -1660,6 +1660,8 @@ const struct inode_operations reiserfs_dir_inode_operations = { ...@@ -1660,6 +1660,8 @@ const struct inode_operations reiserfs_dir_inode_operations = {
.permission = reiserfs_permission, .permission = reiserfs_permission,
.get_acl = reiserfs_get_acl, .get_acl = reiserfs_get_acl,
.set_acl = reiserfs_set_acl, .set_acl = reiserfs_set_acl,
.fileattr_get = reiserfs_fileattr_get,
.fileattr_set = reiserfs_fileattr_set,
}; };
/* /*
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
/* the 32 bit compat definitions with int argument */ /* the 32 bit compat definitions with int argument */
#define REISERFS_IOC32_UNPACK _IOW(0xCD, 1, int) #define REISERFS_IOC32_UNPACK _IOW(0xCD, 1, int)
#define REISERFS_IOC32_GETFLAGS FS_IOC32_GETFLAGS
#define REISERFS_IOC32_SETFLAGS FS_IOC32_SETFLAGS
#define REISERFS_IOC32_GETVERSION FS_IOC32_GETVERSION #define REISERFS_IOC32_GETVERSION FS_IOC32_GETVERSION
#define REISERFS_IOC32_SETVERSION FS_IOC32_SETVERSION #define REISERFS_IOC32_SETVERSION FS_IOC32_SETVERSION
...@@ -3408,7 +3406,10 @@ __u32 r5_hash(const signed char *msg, int len); ...@@ -3408,7 +3406,10 @@ __u32 r5_hash(const signed char *msg, int len);
#define SPARE_SPACE 500 #define SPARE_SPACE 500
/* prototypes from ioctl.c */ /* prototypes from ioctl.c */
int reiserfs_fileattr_get(struct dentry *dentry, struct fileattr *fa);
int reiserfs_fileattr_set(struct user_namespace *mnt_userns,
struct dentry *dentry, struct fileattr *fa);
long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
long reiserfs_compat_ioctl(struct file *filp, long reiserfs_compat_ioctl(struct file *filp,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
int reiserfs_unpack(struct inode *inode, struct file *filp); int reiserfs_unpack(struct inode *inode);
...@@ -2408,7 +2408,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, ...@@ -2408,7 +2408,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id,
* IO to work * IO to work
*/ */
if (!(REISERFS_I(inode)->i_flags & i_nopack_mask)) { if (!(REISERFS_I(inode)->i_flags & i_nopack_mask)) {
err = reiserfs_unpack(inode, NULL); err = reiserfs_unpack(inode);
if (err) { if (err) {
reiserfs_warning(sb, "super-6520", reiserfs_warning(sb, "super-6520",
"Unpacking tail of quota file failed" "Unpacking tail of quota file failed"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment