From 2b0d3ff9a3b516e240e7fb44f79e2cb4e4a064a7 Mon Sep 17 00:00:00 2001 From: Dmitry Eremin Date: Fri, 3 Mar 2017 21:27:36 +0300 Subject: [PATCH] LU-9183 llite: handle flags as argument for inode_operations->rename In Linux kernel v3.14 the inode_operations->rename() needs flags in arguments. Change-Id: I5028357d1d459b83ff0b1df0abeaadf78c5d05da Signed-off-by: Dmitry Eremin Reviewed-on: https://review.whamcloud.com/25827 Reviewed-by: James Simmons Reviewed-by: Andreas Dilger Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/autoconf/lustre-core.m4 | 22 ++++++++++++++++++++++ lustre/llite/namei.c | 22 ++++++++++++++++------ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index a4b33f2..16bf84b 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -1785,6 +1785,27 @@ truncate_ipages_final, [ ]) # LC_HAVE_TRUNCATE_IPAGES_FINAL # +# LC_IOPS_RENAME_WITH_FLAGS +# +# 3.14 has inode_operations->rename with 5 args +# commit 520c8b16505236fc82daa352e6c5e73cd9870cff +# +AC_DEFUN([LC_IOPS_RENAME_WITH_FLAGS], [ +LB_CHECK_COMPILE([if 'inode_operations->rename' taken flags as argument], +iops_rename_with_flags, [ + #include +],[ + struct inode *i1 = NULL, *i2 = NULL; + struct dentry *d1 = NULL, *d2 = NULL; + int rc; + rc = ((struct inode_operations *)0)->rename(i1, d1, i2, d2, 0); +], [ + AC_DEFINE(HAVE_IOPS_RENAME_WITH_FLAGS, 1, + [inode_operations->rename need flags as argument]) +]) +]) # LC_IOPS_RENAME_WITH_FLAGS + +# # LC_VFS_RENAME_6ARGS # # 3.15 has vfs_rename with 6 args @@ -2500,6 +2521,7 @@ AC_DEFUN([LC_PROG_LINUX], [ # 3.14 LC_HAVE_BVEC_ITER LC_HAVE_TRUNCATE_IPAGES_FINAL + LC_IOPS_RENAME_WITH_FLAGS # 3.15 LC_VFS_RENAME_6ARGS diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index 3b8a889..cba0ef4 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -1375,15 +1375,25 @@ static int ll_unlink(struct inode *dir, struct dentry *dchild) } static int ll_rename(struct inode *src, struct dentry *src_dchild, - struct inode *tgt, struct dentry *tgt_dchild) + struct inode *tgt, struct dentry *tgt_dchild +#ifdef HAVE_IOPS_RENAME_WITH_FLAGS + , unsigned int flags +#endif + ) { struct qstr *src_name = &src_dchild->d_name; struct qstr *tgt_name = &tgt_dchild->d_name; - struct ptlrpc_request *request = NULL; - struct ll_sb_info *sbi = ll_i2sbi(src); - struct md_op_data *op_data; - int err; - ENTRY; + struct ptlrpc_request *request = NULL; + struct ll_sb_info *sbi = ll_i2sbi(src); + struct md_op_data *op_data; + int err; + ENTRY; + +#ifdef HAVE_IOPS_RENAME_WITH_FLAGS + if (flags) + return -EINVAL; +#endif + CDEBUG(D_VFSTRACE, "VFS Op:oldname=%.*s, src_dir="DFID "(%p), newname=%.*s, tgt_dir="DFID"(%p)\n", src_name->len, src_name->name, -- 1.8.3.1