Skip to content

Commit 03eb606

Browse files
author
Miklos Szeredi
committed
reiserfs: 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: Jan Kara <jack@suse.cz>
1 parent 2b5f52c commit 03eb606

5 files changed

Lines changed: 64 additions & 70 deletions

File tree

fs/reiserfs/file.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,6 @@ const struct inode_operations reiserfs_file_inode_operations = {
258258
.permission = reiserfs_permission,
259259
.get_acl = reiserfs_get_acl,
260260
.set_acl = reiserfs_set_acl,
261+
.fileattr_get = reiserfs_fileattr_get,
262+
.fileattr_set = reiserfs_fileattr_set,
261263
};

fs/reiserfs/ioctl.c

Lines changed: 55 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,59 @@
1010
#include <linux/uaccess.h>
1111
#include <linux/pagemap.h>
1212
#include <linux/compat.h>
13+
#include <linux/fileattr.h>
14+
15+
int reiserfs_fileattr_get(struct dentry *dentry, struct fileattr *fa)
16+
{
17+
struct inode *inode = d_inode(dentry);
18+
19+
if (!reiserfs_attrs(inode->i_sb))
20+
return -ENOTTY;
21+
22+
fileattr_fill_flags(fa, REISERFS_I(inode)->i_attrs);
23+
24+
return 0;
25+
}
26+
27+
int reiserfs_fileattr_set(struct user_namespace *mnt_userns,
28+
struct dentry *dentry, struct fileattr *fa)
29+
{
30+
struct inode *inode = d_inode(dentry);
31+
unsigned int flags = fa->flags;
32+
int err;
33+
34+
reiserfs_write_lock(inode->i_sb);
35+
36+
err = -ENOTTY;
37+
if (!reiserfs_attrs(inode->i_sb))
38+
goto unlock;
39+
40+
err = -EOPNOTSUPP;
41+
if (fileattr_has_fsx(fa))
42+
goto unlock;
43+
44+
/*
45+
* Is it quota file? Do not allow user to mess with it
46+
*/
47+
err = -EPERM;
48+
if (IS_NOQUOTA(inode))
49+
goto unlock;
50+
51+
if ((flags & REISERFS_NOTAIL_FL) && S_ISREG(inode->i_mode)) {
52+
err = reiserfs_unpack(inode);
53+
if (err)
54+
goto unlock;
55+
}
56+
sd_attrs_to_i_attrs(flags, inode);
57+
REISERFS_I(inode)->i_attrs = flags;
58+
inode->i_ctime = current_time(inode);
59+
mark_inode_dirty(inode);
60+
err = 0;
61+
unlock:
62+
reiserfs_write_unlock(inode->i_sb);
63+
64+
return err;
65+
}
1366

1467
/*
1568
* reiserfs_ioctl - handler for ioctl for inode
@@ -23,7 +76,6 @@
2376
long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
2477
{
2578
struct inode *inode = file_inode(filp);
26-
unsigned int flags;
2779
int err = 0;
2880

2981
reiserfs_write_lock(inode->i_sb);
@@ -32,71 +84,14 @@ long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
3284
case REISERFS_IOC_UNPACK:
3385
if (S_ISREG(inode->i_mode)) {
3486
if (arg)
35-
err = reiserfs_unpack(inode, filp);
87+
err = reiserfs_unpack(inode);
3688
} else
3789
err = -ENOTTY;
3890
break;
3991
/*
4092
* following two cases are taken from fs/ext2/ioctl.c by Remy
4193
* Card (card@masi.ibp.fr)
4294
*/
43-
case REISERFS_IOC_GETFLAGS:
44-
if (!reiserfs_attrs(inode->i_sb)) {
45-
err = -ENOTTY;
46-
break;
47-
}
48-
49-
flags = REISERFS_I(inode)->i_attrs;
50-
err = put_user(flags, (int __user *)arg);
51-
break;
52-
case REISERFS_IOC_SETFLAGS:{
53-
if (!reiserfs_attrs(inode->i_sb)) {
54-
err = -ENOTTY;
55-
break;
56-
}
57-
58-
err = mnt_want_write_file(filp);
59-
if (err)
60-
break;
61-
62-
if (!inode_owner_or_capable(&init_user_ns, inode)) {
63-
err = -EPERM;
64-
goto setflags_out;
65-
}
66-
if (get_user(flags, (int __user *)arg)) {
67-
err = -EFAULT;
68-
goto setflags_out;
69-
}
70-
/*
71-
* Is it quota file? Do not allow user to mess with it
72-
*/
73-
if (IS_NOQUOTA(inode)) {
74-
err = -EPERM;
75-
goto setflags_out;
76-
}
77-
err = vfs_ioc_setflags_prepare(inode,
78-
REISERFS_I(inode)->i_attrs,
79-
flags);
80-
if (err)
81-
goto setflags_out;
82-
if ((flags & REISERFS_NOTAIL_FL) &&
83-
S_ISREG(inode->i_mode)) {
84-
int result;
85-
86-
result = reiserfs_unpack(inode, filp);
87-
if (result) {
88-
err = result;
89-
goto setflags_out;
90-
}
91-
}
92-
sd_attrs_to_i_attrs(flags, inode);
93-
REISERFS_I(inode)->i_attrs = flags;
94-
inode->i_ctime = current_time(inode);
95-
mark_inode_dirty(inode);
96-
setflags_out:
97-
mnt_drop_write_file(filp);
98-
break;
99-
}
10095
case REISERFS_IOC_GETVERSION:
10196
err = put_user(inode->i_generation, (int __user *)arg);
10297
break;
@@ -138,12 +133,6 @@ long reiserfs_compat_ioctl(struct file *file, unsigned int cmd,
138133
case REISERFS_IOC32_UNPACK:
139134
cmd = REISERFS_IOC_UNPACK;
140135
break;
141-
case REISERFS_IOC32_GETFLAGS:
142-
cmd = REISERFS_IOC_GETFLAGS;
143-
break;
144-
case REISERFS_IOC32_SETFLAGS:
145-
cmd = REISERFS_IOC_SETFLAGS;
146-
break;
147136
case REISERFS_IOC32_GETVERSION:
148137
cmd = REISERFS_IOC_GETVERSION;
149138
break;
@@ -165,7 +154,7 @@ int reiserfs_commit_write(struct file *f, struct page *page,
165154
* Function try to convert tail from direct item into indirect.
166155
* It set up nopack attribute in the REISERFS_I(inode)->nopack
167156
*/
168-
int reiserfs_unpack(struct inode *inode, struct file *filp)
157+
int reiserfs_unpack(struct inode *inode)
169158
{
170159
int retval = 0;
171160
int index;

fs/reiserfs/namei.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1660,6 +1660,8 @@ const struct inode_operations reiserfs_dir_inode_operations = {
16601660
.permission = reiserfs_permission,
16611661
.get_acl = reiserfs_get_acl,
16621662
.set_acl = reiserfs_set_acl,
1663+
.fileattr_get = reiserfs_fileattr_get,
1664+
.fileattr_set = reiserfs_fileattr_set,
16631665
};
16641666

16651667
/*

fs/reiserfs/reiserfs.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
/* the 32 bit compat definitions with int argument */
2020
#define REISERFS_IOC32_UNPACK _IOW(0xCD, 1, int)
21-
#define REISERFS_IOC32_GETFLAGS FS_IOC32_GETFLAGS
22-
#define REISERFS_IOC32_SETFLAGS FS_IOC32_SETFLAGS
2321
#define REISERFS_IOC32_GETVERSION FS_IOC32_GETVERSION
2422
#define REISERFS_IOC32_SETVERSION FS_IOC32_SETVERSION
2523

@@ -3408,7 +3406,10 @@ __u32 r5_hash(const signed char *msg, int len);
34083406
#define SPARE_SPACE 500
34093407

34103408
/* prototypes from ioctl.c */
3409+
int reiserfs_fileattr_get(struct dentry *dentry, struct fileattr *fa);
3410+
int reiserfs_fileattr_set(struct user_namespace *mnt_userns,
3411+
struct dentry *dentry, struct fileattr *fa);
34113412
long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
34123413
long reiserfs_compat_ioctl(struct file *filp,
34133414
unsigned int cmd, unsigned long arg);
3414-
int reiserfs_unpack(struct inode *inode, struct file *filp);
3415+
int reiserfs_unpack(struct inode *inode);

fs/reiserfs/super.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2408,7 +2408,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id,
24082408
* IO to work
24092409
*/
24102410
if (!(REISERFS_I(inode)->i_flags & i_nopack_mask)) {
2411-
err = reiserfs_unpack(inode, NULL);
2411+
err = reiserfs_unpack(inode);
24122412
if (err) {
24132413
reiserfs_warning(sb, "super-6520",
24142414
"Unpacking tail of quota file failed"

0 commit comments

Comments
 (0)