Linux 4.2 compat: vfs_rename()

Attempting to perform a vfs_rename() on Linux 4.2 and newer kernels
results in an EACCES error.  Rather than attempting to add and
maintain more ugly compatibility code it's best to just retire
this interface.  As a first step the SPLAT test is disabled for
Linux 4.2 and newer kernels.

  vn_rename: Failed vn_rename /tmp/vn.tmp.1 -> /tmp/vn.tmp.2 (13)

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue zfsonlinux/zfs#3653
This commit is contained in:
Brian Behlendorf 2015-08-19 14:48:21 -07:00
parent 851a549305
commit ebc2c9374b
2 changed files with 7 additions and 0 deletions

View File

@ -28,6 +28,7 @@
#include "splat-ctl.h" #include "splat-ctl.h"
#include <sys/mutex.h> #include <sys/mutex.h>
#include <linux/file_compat.h> #include <linux/file_compat.h>
#include <linux/version.h>
#define SPLAT_SUBSYSTEM_INIT(type) \ #define SPLAT_SUBSYSTEM_INIT(type) \
({ splat_subsystem_t *_sub_; \ ({ splat_subsystem_t *_sub_; \

View File

@ -223,6 +223,7 @@ out:
return -rc; return -rc;
} /* splat_vnode_test3() */ } /* splat_vnode_test3() */
#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,1,0)
static int static int
splat_vnode_test4(struct file *file, void *arg) splat_vnode_test4(struct file *file, void *arg)
{ {
@ -303,6 +304,7 @@ out:
return -rc; return -rc;
} /* splat_vnode_test4() */ } /* splat_vnode_test4() */
#endif
static int static int
splat_vnode_test5(struct file *file, void *arg) splat_vnode_test5(struct file *file, void *arg)
@ -413,8 +415,10 @@ splat_vnode_init(void)
SPLAT_VNODE_TEST2_ID, splat_vnode_test2); SPLAT_VNODE_TEST2_ID, splat_vnode_test2);
SPLAT_TEST_INIT(sub, SPLAT_VNODE_TEST3_NAME, SPLAT_VNODE_TEST3_DESC, SPLAT_TEST_INIT(sub, SPLAT_VNODE_TEST3_NAME, SPLAT_VNODE_TEST3_DESC,
SPLAT_VNODE_TEST3_ID, splat_vnode_test3); SPLAT_VNODE_TEST3_ID, splat_vnode_test3);
#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,1,0)
SPLAT_TEST_INIT(sub, SPLAT_VNODE_TEST4_NAME, SPLAT_VNODE_TEST4_DESC, SPLAT_TEST_INIT(sub, SPLAT_VNODE_TEST4_NAME, SPLAT_VNODE_TEST4_DESC,
SPLAT_VNODE_TEST4_ID, splat_vnode_test4); SPLAT_VNODE_TEST4_ID, splat_vnode_test4);
#endif
SPLAT_TEST_INIT(sub, SPLAT_VNODE_TEST5_NAME, SPLAT_VNODE_TEST5_DESC, SPLAT_TEST_INIT(sub, SPLAT_VNODE_TEST5_NAME, SPLAT_VNODE_TEST5_DESC,
SPLAT_VNODE_TEST5_ID, splat_vnode_test5); SPLAT_VNODE_TEST5_ID, splat_vnode_test5);
SPLAT_TEST_INIT(sub, SPLAT_VNODE_TEST6_NAME, SPLAT_VNODE_TEST6_DESC, SPLAT_TEST_INIT(sub, SPLAT_VNODE_TEST6_NAME, SPLAT_VNODE_TEST6_DESC,
@ -430,7 +434,9 @@ splat_vnode_fini(splat_subsystem_t *sub)
SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST6_ID); SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST6_ID);
SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST5_ID); SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST5_ID);
#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,1,0)
SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST4_ID); SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST4_ID);
#endif
SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST3_ID); SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST3_ID);
SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST2_ID); SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST2_ID);
SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST1_ID); SPLAT_TEST_FINI(sub, SPLAT_VNODE_TEST1_ID);