0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #include "udfdecl.h"
0029 #include <linux/fs.h>
0030 #include <linux/uaccess.h>
0031 #include <linux/kernel.h>
0032 #include <linux/string.h> /* memset */
0033 #include <linux/capability.h>
0034 #include <linux/errno.h>
0035 #include <linux/pagemap.h>
0036 #include <linux/uio.h>
0037
0038 #include "udf_i.h"
0039 #include "udf_sb.h"
0040
0041 static void __udf_adinicb_readpage(struct page *page)
0042 {
0043 struct inode *inode = page->mapping->host;
0044 char *kaddr;
0045 struct udf_inode_info *iinfo = UDF_I(inode);
0046 loff_t isize = i_size_read(inode);
0047
0048
0049
0050
0051
0052 kaddr = kmap_atomic(page);
0053 memcpy(kaddr, iinfo->i_data + iinfo->i_lenEAttr, isize);
0054 memset(kaddr + isize, 0, PAGE_SIZE - isize);
0055 flush_dcache_page(page);
0056 SetPageUptodate(page);
0057 kunmap_atomic(kaddr);
0058 }
0059
0060 static int udf_adinicb_read_folio(struct file *file, struct folio *folio)
0061 {
0062 BUG_ON(!folio_test_locked(folio));
0063 __udf_adinicb_readpage(&folio->page);
0064 folio_unlock(folio);
0065
0066 return 0;
0067 }
0068
0069 static int udf_adinicb_writepage(struct page *page,
0070 struct writeback_control *wbc)
0071 {
0072 struct inode *inode = page->mapping->host;
0073 char *kaddr;
0074 struct udf_inode_info *iinfo = UDF_I(inode);
0075
0076 BUG_ON(!PageLocked(page));
0077
0078 kaddr = kmap_atomic(page);
0079 memcpy(iinfo->i_data + iinfo->i_lenEAttr, kaddr, i_size_read(inode));
0080 SetPageUptodate(page);
0081 kunmap_atomic(kaddr);
0082 mark_inode_dirty(inode);
0083 unlock_page(page);
0084
0085 return 0;
0086 }
0087
0088 static int udf_adinicb_write_begin(struct file *file,
0089 struct address_space *mapping, loff_t pos,
0090 unsigned len, struct page **pagep,
0091 void **fsdata)
0092 {
0093 struct page *page;
0094
0095 if (WARN_ON_ONCE(pos >= PAGE_SIZE))
0096 return -EIO;
0097 page = grab_cache_page_write_begin(mapping, 0);
0098 if (!page)
0099 return -ENOMEM;
0100 *pagep = page;
0101
0102 if (!PageUptodate(page))
0103 __udf_adinicb_readpage(page);
0104 return 0;
0105 }
0106
0107 static ssize_t udf_adinicb_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
0108 {
0109
0110 return 0;
0111 }
0112
0113 static int udf_adinicb_write_end(struct file *file, struct address_space *mapping,
0114 loff_t pos, unsigned len, unsigned copied,
0115 struct page *page, void *fsdata)
0116 {
0117 struct inode *inode = page->mapping->host;
0118 loff_t last_pos = pos + copied;
0119 if (last_pos > inode->i_size)
0120 i_size_write(inode, last_pos);
0121 set_page_dirty(page);
0122 unlock_page(page);
0123 put_page(page);
0124 return copied;
0125 }
0126
0127 const struct address_space_operations udf_adinicb_aops = {
0128 .dirty_folio = block_dirty_folio,
0129 .invalidate_folio = block_invalidate_folio,
0130 .read_folio = udf_adinicb_read_folio,
0131 .writepage = udf_adinicb_writepage,
0132 .write_begin = udf_adinicb_write_begin,
0133 .write_end = udf_adinicb_write_end,
0134 .direct_IO = udf_adinicb_direct_IO,
0135 };
0136
0137 static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
0138 {
0139 ssize_t retval;
0140 struct file *file = iocb->ki_filp;
0141 struct inode *inode = file_inode(file);
0142 struct udf_inode_info *iinfo = UDF_I(inode);
0143 int err;
0144
0145 inode_lock(inode);
0146
0147 retval = generic_write_checks(iocb, from);
0148 if (retval <= 0)
0149 goto out;
0150
0151 down_write(&iinfo->i_data_sem);
0152 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
0153 loff_t end = iocb->ki_pos + iov_iter_count(from);
0154
0155 if (inode->i_sb->s_blocksize <
0156 (udf_file_entry_alloc_offset(inode) + end)) {
0157 err = udf_expand_file_adinicb(inode);
0158 if (err) {
0159 inode_unlock(inode);
0160 udf_debug("udf_expand_adinicb: err=%d\n", err);
0161 return err;
0162 }
0163 } else {
0164 iinfo->i_lenAlloc = max(end, inode->i_size);
0165 up_write(&iinfo->i_data_sem);
0166 }
0167 } else
0168 up_write(&iinfo->i_data_sem);
0169
0170 retval = __generic_file_write_iter(iocb, from);
0171 out:
0172 inode_unlock(inode);
0173
0174 if (retval > 0) {
0175 mark_inode_dirty(inode);
0176 retval = generic_write_sync(iocb, retval);
0177 }
0178
0179 return retval;
0180 }
0181
0182 long udf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
0183 {
0184 struct inode *inode = file_inode(filp);
0185 long old_block, new_block;
0186 int result;
0187
0188 if (file_permission(filp, MAY_READ) != 0) {
0189 udf_debug("no permission to access inode %lu\n", inode->i_ino);
0190 return -EPERM;
0191 }
0192
0193 if (!arg && ((cmd == UDF_GETVOLIDENT) || (cmd == UDF_GETEASIZE) ||
0194 (cmd == UDF_RELOCATE_BLOCKS) || (cmd == UDF_GETEABLOCK))) {
0195 udf_debug("invalid argument to udf_ioctl\n");
0196 return -EINVAL;
0197 }
0198
0199 switch (cmd) {
0200 case UDF_GETVOLIDENT:
0201 if (copy_to_user((char __user *)arg,
0202 UDF_SB(inode->i_sb)->s_volume_ident, 32))
0203 return -EFAULT;
0204 return 0;
0205 case UDF_RELOCATE_BLOCKS:
0206 if (!capable(CAP_SYS_ADMIN))
0207 return -EPERM;
0208 if (get_user(old_block, (long __user *)arg))
0209 return -EFAULT;
0210 result = udf_relocate_blocks(inode->i_sb,
0211 old_block, &new_block);
0212 if (result == 0)
0213 result = put_user(new_block, (long __user *)arg);
0214 return result;
0215 case UDF_GETEASIZE:
0216 return put_user(UDF_I(inode)->i_lenEAttr, (int __user *)arg);
0217 case UDF_GETEABLOCK:
0218 return copy_to_user((char __user *)arg,
0219 UDF_I(inode)->i_data,
0220 UDF_I(inode)->i_lenEAttr) ? -EFAULT : 0;
0221 default:
0222 return -ENOIOCTLCMD;
0223 }
0224
0225 return 0;
0226 }
0227
0228 static int udf_release_file(struct inode *inode, struct file *filp)
0229 {
0230 if (filp->f_mode & FMODE_WRITE &&
0231 atomic_read(&inode->i_writecount) == 1) {
0232
0233
0234
0235
0236 inode_lock(inode);
0237 down_write(&UDF_I(inode)->i_data_sem);
0238 udf_discard_prealloc(inode);
0239 udf_truncate_tail_extent(inode);
0240 up_write(&UDF_I(inode)->i_data_sem);
0241 inode_unlock(inode);
0242 }
0243 return 0;
0244 }
0245
0246 const struct file_operations udf_file_operations = {
0247 .read_iter = generic_file_read_iter,
0248 .unlocked_ioctl = udf_ioctl,
0249 .open = generic_file_open,
0250 .mmap = generic_file_mmap,
0251 .write_iter = udf_file_write_iter,
0252 .release = udf_release_file,
0253 .fsync = generic_file_fsync,
0254 .splice_read = generic_file_splice_read,
0255 .llseek = generic_file_llseek,
0256 };
0257
0258 static int udf_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
0259 struct iattr *attr)
0260 {
0261 struct inode *inode = d_inode(dentry);
0262 struct super_block *sb = inode->i_sb;
0263 int error;
0264
0265 error = setattr_prepare(&init_user_ns, dentry, attr);
0266 if (error)
0267 return error;
0268
0269 if ((attr->ia_valid & ATTR_UID) &&
0270 UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET) &&
0271 !uid_eq(attr->ia_uid, UDF_SB(sb)->s_uid))
0272 return -EPERM;
0273 if ((attr->ia_valid & ATTR_GID) &&
0274 UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET) &&
0275 !gid_eq(attr->ia_gid, UDF_SB(sb)->s_gid))
0276 return -EPERM;
0277
0278 if ((attr->ia_valid & ATTR_SIZE) &&
0279 attr->ia_size != i_size_read(inode)) {
0280 error = udf_setsize(inode, attr->ia_size);
0281 if (error)
0282 return error;
0283 }
0284
0285 if (attr->ia_valid & ATTR_MODE)
0286 udf_update_extra_perms(inode, attr->ia_mode);
0287
0288 setattr_copy(&init_user_ns, inode, attr);
0289 mark_inode_dirty(inode);
0290 return 0;
0291 }
0292
0293 const struct inode_operations udf_file_inode_operations = {
0294 .setattr = udf_setattr,
0295 };