0001
0002
0003
0004
0005 #include <linux/capability.h>
0006 #include <linux/fs.h>
0007 #include <linux/mount.h>
0008 #include "reiserfs.h"
0009 #include <linux/time.h>
0010 #include <linux/uaccess.h>
0011 #include <linux/pagemap.h>
0012 #include <linux/compat.h>
0013 #include <linux/fileattr.h>
0014
0015 int reiserfs_fileattr_get(struct dentry *dentry, struct fileattr *fa)
0016 {
0017 struct inode *inode = d_inode(dentry);
0018
0019 if (!reiserfs_attrs(inode->i_sb))
0020 return -ENOTTY;
0021
0022 fileattr_fill_flags(fa, REISERFS_I(inode)->i_attrs);
0023
0024 return 0;
0025 }
0026
0027 int reiserfs_fileattr_set(struct user_namespace *mnt_userns,
0028 struct dentry *dentry, struct fileattr *fa)
0029 {
0030 struct inode *inode = d_inode(dentry);
0031 unsigned int flags = fa->flags;
0032 int err;
0033
0034 reiserfs_write_lock(inode->i_sb);
0035
0036 err = -ENOTTY;
0037 if (!reiserfs_attrs(inode->i_sb))
0038 goto unlock;
0039
0040 err = -EOPNOTSUPP;
0041 if (fileattr_has_fsx(fa))
0042 goto unlock;
0043
0044
0045
0046
0047 err = -EPERM;
0048 if (IS_NOQUOTA(inode))
0049 goto unlock;
0050
0051 if ((flags & REISERFS_NOTAIL_FL) && S_ISREG(inode->i_mode)) {
0052 err = reiserfs_unpack(inode);
0053 if (err)
0054 goto unlock;
0055 }
0056 sd_attrs_to_i_attrs(flags, inode);
0057 REISERFS_I(inode)->i_attrs = flags;
0058 inode->i_ctime = current_time(inode);
0059 mark_inode_dirty(inode);
0060 err = 0;
0061 unlock:
0062 reiserfs_write_unlock(inode->i_sb);
0063
0064 return err;
0065 }
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
0077 {
0078 struct inode *inode = file_inode(filp);
0079 int err = 0;
0080
0081 reiserfs_write_lock(inode->i_sb);
0082
0083 switch (cmd) {
0084 case REISERFS_IOC_UNPACK:
0085 if (S_ISREG(inode->i_mode)) {
0086 if (arg)
0087 err = reiserfs_unpack(inode);
0088 } else
0089 err = -ENOTTY;
0090 break;
0091
0092
0093
0094
0095 case REISERFS_IOC_GETVERSION:
0096 err = put_user(inode->i_generation, (int __user *)arg);
0097 break;
0098 case REISERFS_IOC_SETVERSION:
0099 if (!inode_owner_or_capable(&init_user_ns, inode)) {
0100 err = -EPERM;
0101 break;
0102 }
0103 err = mnt_want_write_file(filp);
0104 if (err)
0105 break;
0106 if (get_user(inode->i_generation, (int __user *)arg)) {
0107 err = -EFAULT;
0108 goto setversion_out;
0109 }
0110 inode->i_ctime = current_time(inode);
0111 mark_inode_dirty(inode);
0112 setversion_out:
0113 mnt_drop_write_file(filp);
0114 break;
0115 default:
0116 err = -ENOTTY;
0117 }
0118
0119 reiserfs_write_unlock(inode->i_sb);
0120
0121 return err;
0122 }
0123
0124 #ifdef CONFIG_COMPAT
0125 long reiserfs_compat_ioctl(struct file *file, unsigned int cmd,
0126 unsigned long arg)
0127 {
0128
0129
0130
0131
0132 switch (cmd) {
0133 case REISERFS_IOC32_UNPACK:
0134 cmd = REISERFS_IOC_UNPACK;
0135 break;
0136 case REISERFS_IOC32_GETVERSION:
0137 cmd = REISERFS_IOC_GETVERSION;
0138 break;
0139 case REISERFS_IOC32_SETVERSION:
0140 cmd = REISERFS_IOC_SETVERSION;
0141 break;
0142 default:
0143 return -ENOIOCTLCMD;
0144 }
0145
0146 return reiserfs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
0147 }
0148 #endif
0149
0150 int reiserfs_commit_write(struct file *f, struct page *page,
0151 unsigned from, unsigned to);
0152
0153
0154
0155
0156
0157 int reiserfs_unpack(struct inode *inode)
0158 {
0159 int retval = 0;
0160 int index;
0161 struct page *page;
0162 struct address_space *mapping;
0163 unsigned long write_from;
0164 unsigned long blocksize = inode->i_sb->s_blocksize;
0165
0166 if (inode->i_size == 0) {
0167 REISERFS_I(inode)->i_flags |= i_nopack_mask;
0168 return 0;
0169 }
0170
0171 if (REISERFS_I(inode)->i_flags & i_nopack_mask) {
0172 return 0;
0173 }
0174
0175
0176 {
0177 int depth = reiserfs_write_unlock_nested(inode->i_sb);
0178
0179 inode_lock(inode);
0180 reiserfs_write_lock_nested(inode->i_sb, depth);
0181 }
0182
0183 reiserfs_write_lock(inode->i_sb);
0184
0185 write_from = inode->i_size & (blocksize - 1);
0186
0187 if (write_from == 0) {
0188 REISERFS_I(inode)->i_flags |= i_nopack_mask;
0189 goto out;
0190 }
0191
0192
0193
0194
0195
0196
0197 index = inode->i_size >> PAGE_SHIFT;
0198 mapping = inode->i_mapping;
0199 page = grab_cache_page(mapping, index);
0200 retval = -ENOMEM;
0201 if (!page) {
0202 goto out;
0203 }
0204 retval = __reiserfs_write_begin(page, write_from, 0);
0205 if (retval)
0206 goto out_unlock;
0207
0208
0209 flush_dcache_page(page);
0210 retval = reiserfs_commit_write(NULL, page, write_from, write_from);
0211 REISERFS_I(inode)->i_flags |= i_nopack_mask;
0212
0213 out_unlock:
0214 unlock_page(page);
0215 put_page(page);
0216
0217 out:
0218 inode_unlock(inode);
0219 reiserfs_write_unlock(inode->i_sb);
0220 return retval;
0221 }