| .. | .. |
|---|
| 20 | 20 | #include <linux/string.h> |
|---|
| 21 | 21 | #include <linux/slab.h> |
|---|
| 22 | 22 | #include <linux/uaccess.h> |
|---|
| 23 | +#include <linux/uio.h> |
|---|
| 23 | 24 | |
|---|
| 24 | 25 | #include <linux/coda.h> |
|---|
| 25 | | -#include <linux/coda_psdev.h> |
|---|
| 26 | | - |
|---|
| 26 | +#include "coda_psdev.h" |
|---|
| 27 | 27 | #include "coda_linux.h" |
|---|
| 28 | 28 | #include "coda_int.h" |
|---|
| 29 | 29 | |
|---|
| .. | .. |
|---|
| 38 | 38 | coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to) |
|---|
| 39 | 39 | { |
|---|
| 40 | 40 | struct file *coda_file = iocb->ki_filp; |
|---|
| 41 | | - struct coda_file_info *cfi = CODA_FTOC(coda_file); |
|---|
| 41 | + struct inode *coda_inode = file_inode(coda_file); |
|---|
| 42 | + struct coda_file_info *cfi = coda_ftoc(coda_file); |
|---|
| 43 | + loff_t ki_pos = iocb->ki_pos; |
|---|
| 44 | + size_t count = iov_iter_count(to); |
|---|
| 45 | + ssize_t ret; |
|---|
| 42 | 46 | |
|---|
| 43 | | - BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
|---|
| 47 | + ret = venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode), |
|---|
| 48 | + &cfi->cfi_access_intent, |
|---|
| 49 | + count, ki_pos, CODA_ACCESS_TYPE_READ); |
|---|
| 50 | + if (ret) |
|---|
| 51 | + goto finish_read; |
|---|
| 44 | 52 | |
|---|
| 45 | | - return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos, 0); |
|---|
| 53 | + ret = vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos, 0); |
|---|
| 54 | + |
|---|
| 55 | +finish_read: |
|---|
| 56 | + venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode), |
|---|
| 57 | + &cfi->cfi_access_intent, |
|---|
| 58 | + count, ki_pos, CODA_ACCESS_TYPE_READ_FINISH); |
|---|
| 59 | + return ret; |
|---|
| 46 | 60 | } |
|---|
| 47 | 61 | |
|---|
| 48 | 62 | static ssize_t |
|---|
| .. | .. |
|---|
| 50 | 64 | { |
|---|
| 51 | 65 | struct file *coda_file = iocb->ki_filp; |
|---|
| 52 | 66 | struct inode *coda_inode = file_inode(coda_file); |
|---|
| 53 | | - struct coda_file_info *cfi = CODA_FTOC(coda_file); |
|---|
| 54 | | - struct file *host_file; |
|---|
| 67 | + struct coda_file_info *cfi = coda_ftoc(coda_file); |
|---|
| 68 | + struct file *host_file = cfi->cfi_container; |
|---|
| 69 | + loff_t ki_pos = iocb->ki_pos; |
|---|
| 70 | + size_t count = iov_iter_count(to); |
|---|
| 55 | 71 | ssize_t ret; |
|---|
| 56 | 72 | |
|---|
| 57 | | - BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
|---|
| 73 | + ret = venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode), |
|---|
| 74 | + &cfi->cfi_access_intent, |
|---|
| 75 | + count, ki_pos, CODA_ACCESS_TYPE_WRITE); |
|---|
| 76 | + if (ret) |
|---|
| 77 | + goto finish_write; |
|---|
| 58 | 78 | |
|---|
| 59 | | - host_file = cfi->cfi_container; |
|---|
| 60 | 79 | file_start_write(host_file); |
|---|
| 61 | 80 | inode_lock(coda_inode); |
|---|
| 62 | 81 | ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos, 0); |
|---|
| .. | .. |
|---|
| 65 | 84 | coda_inode->i_mtime = coda_inode->i_ctime = current_time(coda_inode); |
|---|
| 66 | 85 | inode_unlock(coda_inode); |
|---|
| 67 | 86 | file_end_write(host_file); |
|---|
| 87 | + |
|---|
| 88 | +finish_write: |
|---|
| 89 | + venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode), |
|---|
| 90 | + &cfi->cfi_access_intent, |
|---|
| 91 | + count, ki_pos, CODA_ACCESS_TYPE_WRITE_FINISH); |
|---|
| 68 | 92 | return ret; |
|---|
| 69 | 93 | } |
|---|
| 70 | 94 | |
|---|
| .. | .. |
|---|
| 99 | 123 | static int |
|---|
| 100 | 124 | coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) |
|---|
| 101 | 125 | { |
|---|
| 102 | | - struct coda_file_info *cfi; |
|---|
| 126 | + struct inode *coda_inode = file_inode(coda_file); |
|---|
| 127 | + struct coda_file_info *cfi = coda_ftoc(coda_file); |
|---|
| 128 | + struct file *host_file = cfi->cfi_container; |
|---|
| 129 | + struct inode *host_inode = file_inode(host_file); |
|---|
| 103 | 130 | struct coda_inode_info *cii; |
|---|
| 104 | | - struct file *host_file; |
|---|
| 105 | | - struct inode *coda_inode, *host_inode; |
|---|
| 106 | 131 | struct coda_vm_ops *cvm_ops; |
|---|
| 132 | + loff_t ppos; |
|---|
| 133 | + size_t count; |
|---|
| 107 | 134 | int ret; |
|---|
| 108 | | - |
|---|
| 109 | | - cfi = CODA_FTOC(coda_file); |
|---|
| 110 | | - BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
|---|
| 111 | | - host_file = cfi->cfi_container; |
|---|
| 112 | 135 | |
|---|
| 113 | 136 | if (!host_file->f_op->mmap) |
|---|
| 114 | 137 | return -ENODEV; |
|---|
| .. | .. |
|---|
| 116 | 139 | if (WARN_ON(coda_file != vma->vm_file)) |
|---|
| 117 | 140 | return -EIO; |
|---|
| 118 | 141 | |
|---|
| 142 | + count = vma->vm_end - vma->vm_start; |
|---|
| 143 | + ppos = vma->vm_pgoff * PAGE_SIZE; |
|---|
| 144 | + |
|---|
| 145 | + ret = venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode), |
|---|
| 146 | + &cfi->cfi_access_intent, |
|---|
| 147 | + count, ppos, CODA_ACCESS_TYPE_MMAP); |
|---|
| 148 | + if (ret) |
|---|
| 149 | + return ret; |
|---|
| 150 | + |
|---|
| 119 | 151 | cvm_ops = kmalloc(sizeof(struct coda_vm_ops), GFP_KERNEL); |
|---|
| 120 | 152 | if (!cvm_ops) |
|---|
| 121 | 153 | return -ENOMEM; |
|---|
| 122 | | - |
|---|
| 123 | | - coda_inode = file_inode(coda_file); |
|---|
| 124 | | - host_inode = file_inode(host_file); |
|---|
| 125 | 154 | |
|---|
| 126 | 155 | cii = ITOC(coda_inode); |
|---|
| 127 | 156 | spin_lock(&cii->c_lock); |
|---|
| .. | .. |
|---|
| 194 | 223 | cfi->cfi_magic = CODA_MAGIC; |
|---|
| 195 | 224 | cfi->cfi_mapcount = 0; |
|---|
| 196 | 225 | cfi->cfi_container = host_file; |
|---|
| 226 | + /* assume access intents are supported unless we hear otherwise */ |
|---|
| 227 | + cfi->cfi_access_intent = true; |
|---|
| 197 | 228 | |
|---|
| 198 | 229 | BUG_ON(coda_file->private_data != NULL); |
|---|
| 199 | 230 | coda_file->private_data = cfi; |
|---|
| .. | .. |
|---|
| 209 | 240 | struct inode *host_inode; |
|---|
| 210 | 241 | int err; |
|---|
| 211 | 242 | |
|---|
| 212 | | - cfi = CODA_FTOC(coda_file); |
|---|
| 213 | | - BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
|---|
| 243 | + cfi = coda_ftoc(coda_file); |
|---|
| 214 | 244 | |
|---|
| 215 | 245 | err = venus_close(coda_inode->i_sb, coda_i2f(coda_inode), |
|---|
| 216 | 246 | coda_flags, coda_file->f_cred->fsuid); |
|---|
| .. | .. |
|---|
| 252 | 282 | return err; |
|---|
| 253 | 283 | inode_lock(coda_inode); |
|---|
| 254 | 284 | |
|---|
| 255 | | - cfi = CODA_FTOC(coda_file); |
|---|
| 256 | | - BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
|---|
| 285 | + cfi = coda_ftoc(coda_file); |
|---|
| 257 | 286 | host_file = cfi->cfi_container; |
|---|
| 258 | 287 | |
|---|
| 259 | 288 | err = vfs_fsync(host_file, datasync); |
|---|