From 72f790f18098bbeb24e056dfdaf8ca14b9f701e9 Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Fri, 5 Oct 2007 04:09:55 +0000 Subject: [PATCH] DEVEL15-linux-2623-support-20071004 FIXES 70773 update for support for 2.6.23 (cherry picked from commit 127cebfacdaf84292fc1ecfd64c0e8d259aba474) --- acinclude.m4 | 12 ++++++++++++ src/afs/LINUX/osi_vfsops.c | 15 +++++++++++++++ src/afs/LINUX/osi_vnodeops.c | 2 +- src/cf/linux-test4.m4 | 31 +++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/acinclude.m4 b/acinclude.m4 index 811e2d3042..2d94dd8530 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -597,6 +597,8 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) ) LINUX_KERNEL_COMPILE_WORKS + LINUX_HAVE_KMEM_CACHE_T + LINUX_KMEM_CACHE_CREATE_TAKES_DTOR LINUX_CONFIG_H_EXISTS LINUX_COMPLETION_H_EXISTS LINUX_DEFINES_FOR_EACH_PROCESS @@ -626,6 +628,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_FOP_F_FLUSH_TAKES_FL_OWNER_T LINUX_AOP_WRITEBACK_CONTROL LINUX_FS_STRUCT_FOP_HAS_FLOCK + LINUX_FS_STRUCT_FOP_HAS_SENDFILE LINUX_KERNEL_LINUX_SYSCALL_H LINUX_KERNEL_LINUX_SEQ_FILE_H LINUX_KERNEL_POSIX_LOCK_FILE_WAIT_ARG @@ -870,12 +873,21 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) if test "x$ac_cv_linux_fs_struct_fop_has_flock" = "xyes" ; then AC_DEFINE(STRUCT_FILE_OPERATIONS_HAS_FLOCK, 1, [define if your struct file_operations has flock]) fi + if test "x$ac_cv_linux_fs_struct_fop_has_sendfile" = "xyes" ; then + AC_DEFINE(STRUCT_FILE_OPERATIONS_HAS_SENDFILE, 1, [define if your struct file_operations has sendfile]) + fi if test "x$ac_cv_linux_register_sysctl_table_noflag" = "xyes" ; then AC_DEFINE(REGISTER_SYSCTL_TABLE_NOFLAG, 1, [define if register_sysctl_table has no insert_at head flag]) fi if test "x$ac_cv_linux_exports_tasklist_lock" = "xyes" ; then AC_DEFINE(EXPORTED_TASKLIST_LOCK, 1, [define if tasklist_lock exported]) fi + if test "x$ac_cv_linux_have_kmem_cache_t" = "xyes" ; then + AC_DEFINE(HAVE_KMEM_CACHE_T, 1, [define if kmem_cache_t exists]) + fi + if test "x$ac_cv_linux_have_kmem_cache_t" = "xyes" ; then + AC_DEFINE(KMEM_CACHE_TAKES_DTOR, 1, [define if kmem_cache_create takes a destructor argument]) + fi if test "x$ac_cv_linux_kernel_page_follow_link" = "xyes" -o "x$ac_cv_linux_func_i_put_link_takes_cookie" = "xyes"; then AC_DEFINE(USABLE_KERNEL_PAGE_SYMLINK_CACHE, 1, [define if your kernel has a usable symlink cache API]) else diff --git a/src/afs/LINUX/osi_vfsops.c b/src/afs/LINUX/osi_vfsops.c index 589dfb2201..5bf4ae2364 100644 --- a/src/afs/LINUX/osi_vfsops.c +++ b/src/afs/LINUX/osi_vfsops.c @@ -269,7 +269,11 @@ afs_notify_change(struct dentry *dp, struct iattr *iattrp) #if defined(STRUCT_SUPER_HAS_ALLOC_INODE) +#if defined(HAVE_KMEM_CACHE_T) static kmem_cache_t *afs_inode_cachep; +#else +struct kmem_cache *afs_inode_cachep; +#endif static struct inode * afs_alloc_inode(struct super_block *sb) @@ -294,7 +298,11 @@ afs_destroy_inode(struct inode *inode) } static void +#if defined(HAVE_KMEM_CACHE_T) init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) +#else +init_once(void * foo, struct kmem_cache * cachep, unsigned long flags) +#endif { struct vcache *vcp = (struct vcache *) foo; @@ -312,10 +320,17 @@ afs_init_inodecache(void) #define SLAB_RECLAIM_ACCOUNT 0 #endif +#if defined(KMEM_CACHE_TAKES_DTOR) afs_inode_cachep = kmem_cache_create("afs_inode_cache", sizeof(struct vcache), 0, SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT, init_once, NULL); +#else + afs_inode_cachep = kmem_cache_create("afs_inode_cache", + sizeof(struct vcache), + 0, SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT, + init_once); +#endif if (afs_inode_cachep == NULL) return -ENOMEM; return 0; diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index 61f7bbf10e..ca72569b16 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -658,7 +658,7 @@ struct file_operations afs_file_fops = { .mmap = afs_linux_mmap, .open = afs_linux_open, .flush = afs_linux_flush, -#ifdef AFS_LINUX26_ENV +#if defined(AFS_LINUX26_ENV) && defined(STRUCT_FILE_OPERATIONS_HAS_SENDFILE) .sendfile = generic_file_sendfile, #endif .release = afs_linux_release, diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 51b9e2e9f6..4827ab4f4f 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -871,3 +871,34 @@ fl_owner_t id; ac_cv_linux_func_f_flush_takes_fl_owner_t=no)]) AC_MSG_RESULT($ac_cv_linux_func_f_flush_takes_fl_owner_t)]) +AC_DEFUN([LINUX_HAVE_KMEM_CACHE_T], [ + AC_MSG_CHECKING([whether kmem_cache_t exists]) + AC_CACHE_VAL([ac_cv_linux_have_kmem_cache_t], [ + AC_TRY_KBUILD( +[#include ], +[kmem_cache_t *k;], + ac_cv_linux_have_kmem_cache_t=yes, + ac_cv_linux_have_kmem_cache_t=no)]) + AC_MSG_RESULT($ac_cv_linux_have_kmem_cache_t)]) + +AC_DEFUN([LINUX_KMEM_CACHE_CREATE_TAKES_DTOR], [ + AC_MSG_CHECKING([whether kmem_cache_create takes a destructor argument]) + AC_CACHE_VAL([ac_cv_linux_kmem_cache_create_takes_dtor], [ + AC_TRY_KBUILD( +[#include ], +[kmem_cache_create(NULL, 0, 0, 0, NULL, NULL);], + ac_cv_linux_kmem_cache_create_takes_dtor=yes, + ac_cv_linux_kmem_cache_create_takes_dtor=no)]) + AC_MSG_RESULT($ac_cv_linux_kmem_cache_create_takes_dtor)]) + +AC_DEFUN([LINUX_FS_STRUCT_FOP_HAS_SENDFILE], [ + AC_MSG_CHECKING([for sendfile in struct file_operations]) + AC_CACHE_VAL([ac_cv_linux_fs_struct_fop_has_sendfile], [ + AC_TRY_KBUILD( +[#include ], +[struct file_operations _fop; +_fop.sendfile(NULL, NULL, 0, 0, NULL);], + ac_cv_linux_fs_struct_fop_has_sendfile=yes, + ac_cv_linux_fs_struct_fop_has_sendfile=no)]) + AC_MSG_RESULT($ac_cv_linux_fs_struct_fop_has_sendfile)]) +