]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Linux: Use kernel_read/kernel_write when __vfs variants are unavailable
authorDamien Diederen <ddiederen@sinenomine.net>
Mon, 18 Sep 2017 10:18:39 +0000 (12:18 +0200)
committerBenjamin Kaduk <kaduk@mit.edu>
Thu, 26 Oct 2017 01:19:03 +0000 (21:19 -0400)
We hide the uses of set_fs/get_fs behind a macro, as those functions
are likely to soon become unavailable:

> Christoph Hellwig suggested removing all calls outside of the core
> filesystem and architecture code; Andy Lutomirski went one step
> further and said they should all go.

    https://lwn.net/Articles/722267/

Reviewed-on: https://gerrit.openafs.org/12729
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
(cherry picked from commit 5ee516b3789d3545f3d78fb3aba2480308359945)

Change-Id: I28a7126bf6ab048f8d949f190e557a3fa44f3f46
Reviewed-on: https://gerrit.openafs.org/12737
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
acinclude.m4
src/afs/LINUX/osi_compat.h
src/afs/LINUX/osi_file.c
src/afs/LINUX/osi_vnodeops.c

index 162a3e9c3f464d3d932c2d0481e8947639a2ca8d..703d3ea7b5d6d6d8f3900f09d518832d4daad72e 100644 (file)
@@ -1004,6 +1004,9 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
                 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);])
index 13915b9d1726c3a4e3841724f8481779c351b1b0..60cfdc1c27143e8153e0ff61f98f50ac85963f2c 100644 (file)
@@ -645,11 +645,21 @@ afs_d_invalidate(struct dentry *dp)
 #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
@@ -660,6 +670,8 @@ afs_file_write(struct file *filp, char __user *buf, size_t len, loff_t *pos)
 {
 #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
index 1718c9606aa3458386b441e804c34a33ec2776d0..0374c1cce41652db93da706c2e8e2dfe1573e567 100644 (file)
@@ -356,7 +356,9 @@ int
 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;
@@ -366,11 +368,13 @@ osi_rdwr(struct osi_file *osifile, struct uio *uiop, int rw)
     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;
@@ -407,10 +411,12 @@ osi_rdwr(struct osi_file *osifile, struct uio *uiop, int rw)
        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;
 
index d935cf56df4892187253a6f8af296962fef9f091..b7e473440905e5a813454ec1776d57839aa51691 100644 (file)
@@ -825,7 +825,7 @@ struct file_operations afs_file_fops = {
 #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