forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/fs/coda/file.c
....@@ -20,10 +20,10 @@
2020 #include <linux/string.h>
2121 #include <linux/slab.h>
2222 #include <linux/uaccess.h>
23
+#include <linux/uio.h>
2324
2425 #include <linux/coda.h>
25
-#include <linux/coda_psdev.h>
26
-
26
+#include "coda_psdev.h"
2727 #include "coda_linux.h"
2828 #include "coda_int.h"
2929
....@@ -38,11 +38,25 @@
3838 coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
3939 {
4040 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;
4246
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;
4452
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;
4660 }
4761
4862 static ssize_t
....@@ -50,13 +64,18 @@
5064 {
5165 struct file *coda_file = iocb->ki_filp;
5266 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);
5571 ssize_t ret;
5672
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;
5878
59
- host_file = cfi->cfi_container;
6079 file_start_write(host_file);
6180 inode_lock(coda_inode);
6281 ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos, 0);
....@@ -65,6 +84,11 @@
6584 coda_inode->i_mtime = coda_inode->i_ctime = current_time(coda_inode);
6685 inode_unlock(coda_inode);
6786 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);
6892 return ret;
6993 }
7094
....@@ -99,16 +123,15 @@
99123 static int
100124 coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma)
101125 {
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);
103130 struct coda_inode_info *cii;
104
- struct file *host_file;
105
- struct inode *coda_inode, *host_inode;
106131 struct coda_vm_ops *cvm_ops;
132
+ loff_t ppos;
133
+ size_t count;
107134 int ret;
108
-
109
- cfi = CODA_FTOC(coda_file);
110
- BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
111
- host_file = cfi->cfi_container;
112135
113136 if (!host_file->f_op->mmap)
114137 return -ENODEV;
....@@ -116,12 +139,18 @@
116139 if (WARN_ON(coda_file != vma->vm_file))
117140 return -EIO;
118141
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
+
119151 cvm_ops = kmalloc(sizeof(struct coda_vm_ops), GFP_KERNEL);
120152 if (!cvm_ops)
121153 return -ENOMEM;
122
-
123
- coda_inode = file_inode(coda_file);
124
- host_inode = file_inode(host_file);
125154
126155 cii = ITOC(coda_inode);
127156 spin_lock(&cii->c_lock);
....@@ -194,6 +223,8 @@
194223 cfi->cfi_magic = CODA_MAGIC;
195224 cfi->cfi_mapcount = 0;
196225 cfi->cfi_container = host_file;
226
+ /* assume access intents are supported unless we hear otherwise */
227
+ cfi->cfi_access_intent = true;
197228
198229 BUG_ON(coda_file->private_data != NULL);
199230 coda_file->private_data = cfi;
....@@ -209,8 +240,7 @@
209240 struct inode *host_inode;
210241 int err;
211242
212
- cfi = CODA_FTOC(coda_file);
213
- BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
243
+ cfi = coda_ftoc(coda_file);
214244
215245 err = venus_close(coda_inode->i_sb, coda_i2f(coda_inode),
216246 coda_flags, coda_file->f_cred->fsuid);
....@@ -252,8 +282,7 @@
252282 return err;
253283 inode_lock(coda_inode);
254284
255
- cfi = CODA_FTOC(coda_file);
256
- BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
285
+ cfi = coda_ftoc(coda_file);
257286 host_file = cfi->cfi_container;
258287
259288 err = vfs_fsync(host_file, datasync);