Linux 2.6.35 compat: filp_fsync() dropped 'stuct dentry *'

The prototype for filp_fsync() drop the unused argument 'stuct dentry *'.
I've fixed this by adding the needed autoconf check and moving all of
those filp related functions to file_compat.h.  This will simplify
handling any further API changes in the future.
This commit is contained in:
Brian Behlendorf 2010-07-14 11:26:54 -07:00
parent 82b8c8fa64
commit f0ff89fc86
6 changed files with 187 additions and 28 deletions

View File

@ -76,6 +76,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
SPL_AC_PUT_TASK_STRUCT
SPL_AC_5ARGS_PROC_HANDLER
SPL_AC_KVASPRINTF
SPL_AC_3ARGS_FILE_FSYNC
])
AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
@ -1438,3 +1439,22 @@ AC_DEFUN([SPL_AC_KVASPRINTF], [
[kvasprintf() is available])],
[])
])
dnl #
dnl # 2.6.35 API change,
dnl # Unused 'struct dentry *' removed from prototype.
dnl #
AC_DEFUN([SPL_AC_3ARGS_FILE_FSYNC], [
AC_MSG_CHECKING([whether file_fsync() wants 3 args])
SPL_LINUX_TRY_COMPILE([
#include <linux/buffer_head.h>
],[
file_fsync(NULL, NULL, 0);
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_3ARGS_FILE_FSYNC, 1,
[file_fsync() wants 3 args])
],[
AC_MSG_RESULT(no)
])
])

130
configure vendored
View File

@ -14905,6 +14905,71 @@ _ACEOF
fi
{ $as_echo "$as_me:$LINENO: checking whether file_fsync() wants 3 args" >&5
$as_echo_n "checking whether file_fsync() wants 3 args... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/buffer_head.h>
int
main (void)
{
file_fsync(NULL, NULL, 0);
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: yes" >&5
$as_echo "yes" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_3ARGS_FILE_FSYNC 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
rm -Rf build
;;
user)
if test "x$AWK" != xgawk; then
@ -18350,6 +18415,71 @@ _ACEOF
{ $as_echo "$as_me:$LINENO: checking whether file_fsync() wants 3 args" >&5
$as_echo_n "checking whether file_fsync() wants 3 args... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/buffer_head.h>
int
main (void)
{
file_fsync(NULL, NULL, 0);
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: yes" >&5
$as_echo "yes" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_3ARGS_FILE_FSYNC 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
rm -Rf build
if test "x$AWK" != xgawk; then

View File

@ -29,5 +29,32 @@
#include <linux/fdtable.h>
#endif
static inline struct file *
spl_filp_open(const char *name, int flags, int mode, int *err)
{
struct file *filp = NULL;
int rc;
filp = filp_open(name, flags, mode);
if (IS_ERR(filp)) {
rc = PTR_ERR(filp);
if (err)
*err = rc;
filp = NULL;
}
return filp;
}
#define spl_filp_close(f) filp_close(f, NULL)
#define spl_filp_poff(f) (&(f)->f_pos)
#define spl_filp_write(fp, b, s, p) (fp)->f_op->write((fp), (b), (s), p)
#ifdef HAVE_3ARGS_FILE_FSYNC
#define spl_filp_fsync(fp, sync) (fp)->f_op->fsync((fp), \
(fp)->f_dentry, sync)
#else
#define spl_filp_fsync(fp, sync) (fp)->f_op->fsync((fp), sync)
#endif
#endif /* SPL_FILE_COMPAT_H */

View File

@ -35,6 +35,7 @@
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/proc_compat.h>
#include <linux/file_compat.h>
#include <sys/sysmacros.h>
#include <sys/debug.h>
#include <spl-ctl.h>
@ -902,28 +903,6 @@ put_pages_back(struct page_collection *pc)
put_pages_back_on_all_cpus(pc);
}
static struct file *
trace_filp_open (const char *name, int flags, int mode, int *err)
{
struct file *filp = NULL;
int rc;
filp = filp_open(name, flags, mode);
if (IS_ERR(filp)) {
rc = PTR_ERR(filp);
printk(KERN_ERR "SPL: Can't open %s file: %d\n", name, rc);
if (err)
*err = rc;
filp = NULL;
}
return filp;
}
#define trace_filp_write(fp, b, s, p) (fp)->f_op->write((fp), (b), (s), p)
#define trace_filp_fsync(fp) (fp)->f_op->fsync((fp),(fp)->f_dentry,1)
#define trace_filp_close(f) filp_close(f, NULL)
#define trace_filp_poff(f) (&(f)->f_pos)
static int
spl_debug_dump_all_pages(dumplog_priv_t *dp, char *filename)
{
@ -936,7 +915,7 @@ spl_debug_dump_all_pages(dumplog_priv_t *dp, char *filename)
down_write(&trace_sem);
filp = trace_filp_open(filename, O_CREAT|O_EXCL|O_WRONLY|O_LARGEFILE,
filp = spl_filp_open(filename, O_CREAT|O_EXCL|O_WRONLY|O_LARGEFILE,
0600, &rc);
if (filp == NULL) {
if (rc != -EEXIST)
@ -958,8 +937,8 @@ spl_debug_dump_all_pages(dumplog_priv_t *dp, char *filename)
list_for_each_entry_safe(tage, tmp, &pc.pc_pages, linkage) {
__ASSERT_TAGE_INVARIANT(tage);
rc = trace_filp_write(filp, page_address(tage->page),
tage->used, trace_filp_poff(filp));
rc = spl_filp_write(filp, page_address(tage->page),
tage->used, spl_filp_poff(filp));
if (rc != (int)tage->used) {
printk(KERN_WARNING "SPL: Wanted to write %u "
"but wrote %d\n", tage->used, rc);
@ -973,11 +952,11 @@ spl_debug_dump_all_pages(dumplog_priv_t *dp, char *filename)
set_fs(oldfs);
rc = trace_filp_fsync(filp);
rc = spl_filp_fsync(filp, 1);
if (rc)
printk(KERN_ERR "SPL: Unable to sync: %d\n", rc);
close:
trace_filp_close(filp);
spl_filp_close(filp);
out:
up_write(&trace_sem);

View File

@ -473,7 +473,7 @@ int vn_fsync(vnode_t *vp, int flags, void *x3, void *x4)
if (flags & FDSYNC)
datasync = 1;
RETURN(-file_fsync(vp->v_file, vp->v_file->f_dentry, datasync));
RETURN(-spl_filp_fsync(vp->v_file, datasync));
} /* vn_fsync() */
EXPORT_SYMBOL(vn_fsync);

View File

@ -18,6 +18,9 @@
/* vfs_unlink() wants 2 args */
#undef HAVE_2ARGS_VFS_UNLINK
/* file_fsync() wants 3 args */
#undef HAVE_3ARGS_FILE_FSYNC
/* INIT_WORK wants 3 args */
#undef HAVE_3ARGS_INIT_WORK