AC_CHECK_LINUX_FUNC([__vfs_write],
[#include <linux/fs.h>],
[__vfs_write(NULL, NULL, 0, NULL);])
+ AC_CHECK_LINUX_FUNC([kernel_write],
+ [#include <linux/fs.h>],
+ [kernel_write(NULL, NULL, 0, NULL);])
AC_CHECK_LINUX_FUNC([bdi_init],
[#include <linux/backing-dev.h>],
[bdi_init(NULL);])
#endif
}
+#if defined(HAVE_LINUX___VFS_WRITE)
+# define AFS_FILE_NEEDS_SET_FS 1
+#elif defined(HAVE_LINUX_KERNEL_WRITE)
+/* #undef AFS_FILE_NEEDS_SET_FS */
+#else
+# define AFS_FILE_NEEDS_SET_FS 1
+#endif
+
static inline int
afs_file_read(struct file *filp, char __user *buf, size_t len, loff_t *pos)
{
#if defined(HAVE_LINUX___VFS_WRITE)
return __vfs_read(filp, buf, len, pos);
+#elif defined(HAVE_LINUX_KERNEL_WRITE)
+ return kernel_read(filp, buf, len, pos);
#else
return filp->f_op->read(filp, buf, len, pos);
#endif
{
#if defined(HAVE_LINUX___VFS_WRITE)
return __vfs_write(filp, buf, len, pos);
+#elif defined(HAVE_LINUX_KERNEL_WRITE)
+ return kernel_write(filp, buf, len, pos);
#else
return filp->f_op->write(filp, buf, len, pos);
#endif
osi_rdwr(struct osi_file *osifile, struct uio *uiop, int rw)
{
struct file *filp = osifile->filp;
+#ifdef AFS_FILE_NEEDS_SET_FS
mm_segment_t old_fs = {0};
+#endif /* AFS_FILE_NEEDS_SET_FS */
int code = 0;
struct iovec *iov;
size_t count;
savelim = current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur;
current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
+#ifdef AFS_FILE_NEEDS_SET_FS
if (uiop->uio_seg == AFS_UIOSYS) {
/* Switch into user space */
old_fs = get_fs();
set_fs(get_ds());
}
+#endif /* AFS_FILE_NEEDS_SET_FS */
while (code == 0 && uiop->uio_resid > 0 && uiop->uio_iovcnt > 0) {
iov = uiop->uio_iov;
code = 0;
}
+#ifdef AFS_FILE_NEEDS_SET_FS
if (uiop->uio_seg == AFS_UIOSYS) {
/* Switch back into kernel space */
set_fs(old_fs);
}
+#endif /* AFS_FILE_NEEDS_SET_FS */
current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur = savelim;
#ifdef STRUCT_FILE_OPERATIONS_HAS_READ_ITER
.read_iter = afs_linux_read_iter,
.write_iter = afs_linux_write_iter,
-# if !defined(HAVE_LINUX___VFS_WRITE)
+# if !defined(HAVE_LINUX___VFS_WRITE) && !defined(HAVE_LINUX_KERNEL_WRITE)
.read = new_sync_read,
.write = new_sync_write,
# endif