Lines 99-106
afs_linux_VerifyVCache(struct vcache *avc, cred_t **retcred) {
Link Here
|
99 |
return afs_convert_code(code); |
99 |
return afs_convert_code(code); |
100 |
} |
100 |
} |
101 |
|
101 |
|
102 |
#ifdef HAVE_LINUX_GENERIC_FILE_AIO_READ |
102 |
#if defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) || defined(HAVE_LINUX_GENERIC_FILE_AIO_READ) |
103 |
# ifdef LINUX_HAS_NONVECTOR_AIO |
103 |
# if defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) |
|
|
104 |
static ssize_t |
105 |
afs_linux_read_iter(struct kiocb *iocb, struct iov_iter *iter) |
106 |
# elif defined(LINUX_HAS_NONVECTOR_AIO) |
104 |
static ssize_t |
107 |
static ssize_t |
105 |
afs_linux_aio_read(struct kiocb *iocb, char __user *buf, size_t bufsize, |
108 |
afs_linux_aio_read(struct kiocb *iocb, char __user *buf, size_t bufsize, |
106 |
loff_t pos) |
109 |
loff_t pos) |
Lines 113-118
afs_linux_aio_read(struct kiocb *iocb, const struct iovec *buf,
Link Here
|
113 |
struct file *fp = iocb->ki_filp; |
116 |
struct file *fp = iocb->ki_filp; |
114 |
ssize_t code = 0; |
117 |
ssize_t code = 0; |
115 |
struct vcache *vcp = VTOAFS(fp->f_dentry->d_inode); |
118 |
struct vcache *vcp = VTOAFS(fp->f_dentry->d_inode); |
|
|
119 |
# if defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) |
120 |
loff_t pos = iocb->ki_pos; |
121 |
unsigned long bufsize = iter->nr_segs; |
122 |
# endif |
123 |
|
116 |
|
124 |
|
117 |
AFS_GLOCK(); |
125 |
AFS_GLOCK(); |
118 |
afs_Trace4(afs_iclSetp, CM_TRACE_AIOREADOP, ICL_TYPE_POINTER, vcp, |
126 |
afs_Trace4(afs_iclSetp, CM_TRACE_AIOREADOP, ICL_TYPE_POINTER, vcp, |
Lines 125-131
afs_linux_aio_read(struct kiocb *iocb, const struct iovec *buf,
Link Here
|
125 |
* so we optimise by not using it */ |
133 |
* so we optimise by not using it */ |
126 |
osi_FlushPages(vcp, NULL); /* ensure stale pages are gone */ |
134 |
osi_FlushPages(vcp, NULL); /* ensure stale pages are gone */ |
127 |
AFS_GUNLOCK(); |
135 |
AFS_GUNLOCK(); |
|
|
136 |
# if defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) |
137 |
code = generic_file_read_iter(iocb, iter); |
138 |
# else |
128 |
code = generic_file_aio_read(iocb, buf, bufsize, pos); |
139 |
code = generic_file_aio_read(iocb, buf, bufsize, pos); |
|
|
140 |
# endif |
129 |
AFS_GLOCK(); |
141 |
AFS_GLOCK(); |
130 |
} |
142 |
} |
131 |
|
143 |
|
Lines 170-177
afs_linux_read(struct file *fp, char *buf, size_t count, loff_t * offp)
Link Here
|
170 |
* also take care of re-positioning the pointer if file is open in append |
182 |
* also take care of re-positioning the pointer if file is open in append |
171 |
* mode. Call fake open/close to ensure we do writes of core dumps. |
183 |
* mode. Call fake open/close to ensure we do writes of core dumps. |
172 |
*/ |
184 |
*/ |
173 |
#ifdef HAVE_LINUX_GENERIC_FILE_AIO_READ |
185 |
#if defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) || defined(HAVE_LINUX_GENERIC_FILE_AIO_READ) |
174 |
# ifdef LINUX_HAS_NONVECTOR_AIO |
186 |
# if defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) |
|
|
187 |
static ssize_t |
188 |
afs_linux_write_iter(struct kiocb *iocb, struct iov_iter *iter) |
189 |
# elif defined(LINUX_HAS_NONVECTOR_AIO) |
175 |
static ssize_t |
190 |
static ssize_t |
176 |
afs_linux_aio_write(struct kiocb *iocb, const char __user *buf, size_t bufsize, |
191 |
afs_linux_aio_write(struct kiocb *iocb, const char __user *buf, size_t bufsize, |
177 |
loff_t pos) |
192 |
loff_t pos) |
Lines 184-189
afs_linux_aio_write(struct kiocb *iocb, const struct iovec *buf,
Link Here
|
184 |
ssize_t code = 0; |
199 |
ssize_t code = 0; |
185 |
struct vcache *vcp = VTOAFS(iocb->ki_filp->f_dentry->d_inode); |
200 |
struct vcache *vcp = VTOAFS(iocb->ki_filp->f_dentry->d_inode); |
186 |
cred_t *credp; |
201 |
cred_t *credp; |
|
|
202 |
# if defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) |
203 |
loff_t pos = iocb->ki_pos; |
204 |
unsigned long bufsize = iter->nr_segs; |
205 |
# endif |
187 |
|
206 |
|
188 |
AFS_GLOCK(); |
207 |
AFS_GLOCK(); |
189 |
|
208 |
|
Lines 199-205
afs_linux_aio_write(struct kiocb *iocb, const struct iovec *buf,
Link Here
|
199 |
ReleaseWriteLock(&vcp->lock); |
218 |
ReleaseWriteLock(&vcp->lock); |
200 |
if (code == 0) { |
219 |
if (code == 0) { |
201 |
AFS_GUNLOCK(); |
220 |
AFS_GUNLOCK(); |
|
|
221 |
# if defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) |
222 |
code = generic_file_write_iter(iocb, iter); |
223 |
# else |
202 |
code = generic_file_aio_write(iocb, buf, bufsize, pos); |
224 |
code = generic_file_aio_write(iocb, buf, bufsize, pos); |
|
|
225 |
# endif |
203 |
AFS_GLOCK(); |
226 |
AFS_GLOCK(); |
204 |
} |
227 |
} |
205 |
|
228 |
|
Lines 788-794
struct file_operations afs_dir_fops = {
Link Here
|
788 |
}; |
811 |
}; |
789 |
|
812 |
|
790 |
struct file_operations afs_file_fops = { |
813 |
struct file_operations afs_file_fops = { |
791 |
#ifdef HAVE_LINUX_GENERIC_FILE_AIO_READ |
814 |
#ifdef STRUCT_FILE_OPERATIONS_HAS_READ_ITER |
|
|
815 |
.read_iter = afs_linux_read_iter, |
816 |
.write_iter = afs_linux_write_iter, |
817 |
.read = new_sync_read, |
818 |
.write = new_sync_write, |
819 |
#elif defined(HAVE_LINUX_GENERIC_FILE_AIO_READ) |
792 |
.aio_read = afs_linux_aio_read, |
820 |
.aio_read = afs_linux_aio_read, |
793 |
.aio_write = afs_linux_aio_write, |
821 |
.aio_write = afs_linux_aio_write, |
794 |
.read = do_sync_read, |
822 |
.read = do_sync_read, |