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
2376long 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 ;
0 commit comments