From bb188afa0ccf4cb5c810a7a7276d8d27dd03dc27 Mon Sep 17 00:00:00 2001 From: Minh Diep Date: Fri, 1 Feb 2013 08:30:32 -0800 Subject: [PATCH] LU-2658 llite: too many arguments in generic_file_llseek_size A generic_file_llseek_size starting kernel 3.5 has 5 arguments. We need to detect and use with the correct number of arguments. Signed-off-by: Minh Diep Change-Id: I966de37a880a94cde54be84062dec2b91e8334f5 Reviewed-on: http://review.whamcloud.com/5244 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Yang Sheng Reviewed-by: Peng Tao Reviewed-by: Oleg Drokin --- lustre/autoconf/lustre-core.m4 | 16 ++++++++++++++++ lustre/include/linux/lustre_compat25.h | 8 ++++++++ lustre/llite/file.c | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index c3ee6c0..f290ea2 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -2126,6 +2126,22 @@ LB_LINUX_TRY_COMPILE([ EXTRA_KCFLAGS="$tmp_flags" ]) +# 3.5 has generic_file_llseek_size with 5 args +AC_DEFUN([LC_FILE_LLSEEK_SIZE_5ARG], +[AC_MSG_CHECKING([if kernel has generic_file_llseek_size with 5 args]) +LB_LINUX_TRY_COMPILE([ + #include +],[ + generic_file_llseek_size(NULL, 0, 0, 0, 0); +], [ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_FILE_LLSEEK_SIZE_5ARGS, 1, + [kernel has generic_file_llseek_size with 5 args]) +],[ + AC_MSG_RESULT([no]) +]) +]) + # # 3.6 switch i_dentry/d_alias from list to hlist # diff --git a/lustre/include/linux/lustre_compat25.h b/lustre/include/linux/lustre_compat25.h index b37e3cd..e300597 100644 --- a/lustre/include/linux/lustre_compat25.h +++ b/lustre/include/linux/lustre_compat25.h @@ -168,6 +168,14 @@ static inline struct file *ll_dentry_open(struct dentry *dentry, #endif +#if !defined(HAVE_FILE_LLSEEK_SIZE) || defined(HAVE_FILE_LLSEEK_5ARGS) +#define ll_generic_file_llseek_size(file, offset, origin, maxbytes, eof) \ + generic_file_llseek_size(file, offset, origin, maxbytes, eof); +#else +#define ll_generic_file_llseek_size(file, offset, origin, maxbytes, eof) \ + generic_file_llseek_size(file, offset, origin, maxbytes); +#endif + #ifdef HAVE_INODE_DIO_WAIT /* inode_dio_wait(i) use as-is for write lock */ # define inode_dio_write_done(i) do {} while (0) /* for write unlock */ diff --git a/lustre/llite/file.c b/lustre/llite/file.c index f79ef9d..81b36ce 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -2231,7 +2231,7 @@ loff_t ll_file_seek(struct file *file, loff_t offset, int origin) eof = i_size_read(inode); } - retval = generic_file_llseek_size(file, offset, origin, + retval = ll_generic_file_llseek_size(file, offset, origin, ll_file_maxbytes(inode), eof); RETURN(retval); } -- 1.8.3.1