.. | .. |
---|
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); |
---|