Whamcloud - gitweb
add 2.6.27 kernel support
authorshadow <shadow>
Mon, 26 Oct 2009 08:09:35 +0000 (08:09 +0000)
committershadow <shadow>
Mon, 26 Oct 2009 08:09:35 +0000 (08:09 +0000)
Branch HEAD
b=14250
i=rread
i=jay

47 files changed:
libcfs/autoconf/lustre-libcfs.m4
libcfs/include/libcfs/linux/linux-tcpip.h
libcfs/include/libcfs/list.h
libcfs/libcfs/linux/linux-kernelcomm.c
libcfs/libcfs/linux/linux-mem.c
libcfs/libcfs/linux/linux-prim.c
libcfs/libcfs/linux/linux-tcpip.c
lnet/autoconf/lustre-lnet.m4
lustre/ChangeLog
lustre/autoconf/lustre-core.m4
lustre/include/cl_object.h
lustre/include/lclient.h
lustre/include/linux/lustre_compat25.h
lustre/include/linux/lustre_lib.h
lustre/include/linux/lustre_patchless_compat.h
lustre/include/lprocfs_status.h
lustre/include/lustre/lustre_user.h
lustre/include/lustre_quota.h
lustre/kernel_patches/targets/2.6-sles11.target.in [new file with mode: 0644]
lustre/kernel_patches/which_patch
lustre/lclient/lcommon_cl.c
lustre/liblustre/llite_cl.c
lustre/llite/file.c
lustre/llite/llite_internal.h
lustre/llite/llite_mmap.c
lustre/llite/llite_nfs.c
lustre/llite/lloop.c
lustre/llite/symlink.c
lustre/llite/vvp_io.c
lustre/lvfs/fsfilt_ext3.c
lustre/lvfs/lustre_quota_fmt.c
lustre/lvfs/lvfs_linux.c
lustre/mdc/lproc_mdc.c
lustre/mgc/mgc_request.c
lustre/obdclass/capa.c
lustre/obdclass/cl_io.c
lustre/obdclass/linux/linux-module.c
lustre/obdclass/linux/linux-sysctl.c
lustre/obdclass/lprocfs_status.c
lustre/obdclass/lustre_handles.c
lustre/ptlrpc/layout.c
lustre/ptlrpc/sec_bulk.c
lustre/ptlrpc/sec_config.c
lustre/quota/quota_context.c
lustre/quota/quota_interface.c
lustre/tests/test-framework.sh
lustre/utils/lfs.c

index acbe4a7..2a199fa 100644 (file)
@@ -329,6 +329,51 @@ LB_LINUX_TRY_COMPILE([
 ])
 ])
 
+# since 2.6.19 nlmsg_multicast() needs 5 argument.
+AC_DEFUN([LIBCFS_NLMSG_MULTICAST],
+[AC_MSG_CHECKING([nlmsg_multicast needs 5 argument])
+LB_LINUX_TRY_COMPILE([
+       #include <net/netlink.h>
+],[
+        nlmsg_multicast(NULL, NULL, 0, 0, 0);
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_NLMSG_MULTICAST_5ARGS, 1,
+                  [nlmsg_multicast needs 5 argument])
+],[
+        AC_MSG_RESULT(NO)
+])
+])
+
+#
+# LIBCFS_NETLINK
+#
+# If we have netlink.h, and nlmsg_new takes 2 args (2.6.19)
+#
+AC_DEFUN([LIBCFS_NETLINK],
+[AC_MSG_CHECKING([if netlink.h can be compiled])
+LB_LINUX_TRY_COMPILE([
+        #include <net/netlink.h>
+],[],[
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_NETLINK, 1, [net/netlink.h found])
+
+        AC_MSG_CHECKING([if nlmsg_new takes a 2nd argument])
+        LB_LINUX_TRY_COMPILE([
+                #include <net/netlink.h>
+        ],[
+                nlmsg_new(100, GFP_KERNEL);
+        ],[
+                AC_MSG_RESULT([yes])
+                AC_DEFINE(HAVE_NETLINK_NL2, 1, [nlmsg_new takes 2 args])
+        ],[
+                AC_MSG_RESULT([no])
+        ])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
 # 2.6.20 API change INIT_WORK use 2 args and not
 # store data inside
 AC_DEFUN([LIBCFS_3ARGS_INIT_WORK],
@@ -387,6 +432,7 @@ LB_LINUX_TRY_COMPILE([
 ])
 EXTRA_KCFLAGS="$tmp_flags"
 ])
+
 # 2.6.23 lost dtor argument
 AC_DEFUN([LIBCFS_KMEM_CACHE_CREATE_DTOR],
 [AC_MSG_CHECKING([check kmem_cache_create has dtor argument])
@@ -403,8 +449,26 @@ LB_LINUX_TRY_COMPILE([
 ])
 ])
 
+# 2.6.24 
+AC_DEFUN([LIBCFS_NETLINK_CBMUTEX],
+[AC_MSG_CHECKING([for mutex in netlink_kernel_create])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/netlink.h>
+],[
+        struct mutex *lock = NULL;
+
+        netlink_kernel_create(0, 0, NULL, lock, NULL);
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_NETLINK_CBMUTEX, 1,
+                  [netlink_kernel_create want mutex for callback])
+],[
+        AC_MSG_RESULT(NO)
+])
+])
+
 # 2.6.24 request not use real numbers for ctl_name
-AC_DEFUN([LN_SYSCTL_UNNUMBERED],
+AC_DEFUN([LIBCFS_SYSCTL_UNNUMBERED],
 [AC_MSG_CHECKING([for CTL_UNNUMBERED])
 LB_LINUX_TRY_COMPILE([
         #include <linux/sysctl.h>
@@ -422,7 +486,7 @@ LB_LINUX_TRY_COMPILE([
 ])
 
 # 2.6.24 lost scatterlist->page
-AC_DEFUN([LN_SCATTERLIST_SETPAGE],
+AC_DEFUN([LIBCFS_SCATTERLIST_SETPAGE],
 [AC_MSG_CHECKING([for exist sg_set_page])
 LB_LINUX_TRY_COMPILE([
         #include <linux/scatterlist.h>
@@ -437,8 +501,116 @@ LB_LINUX_TRY_COMPILE([
 ])
 ])
 
+# 2.6.24 
+AC_DEFUN([LIBCFS_NETWORK_NAMESPACE],
+[AC_MSG_CHECKING([for network stack has namespaces])
+LB_LINUX_TRY_COMPILE([
+        #include <net/net_namespace.h>
+],[
+        struct net *net = &init_ns;
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_INIT_NET, 1,
+                  [kernel is support network namespaces ])
+],[
+        AC_MSG_RESULT(NO)
+])
+])
+
+
+# 2.6.24 
+AC_DEFUN([LIBCFS_NETLINK_NETNS],
+[AC_MSG_CHECKING([for netlink support net ns])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/netlink.h>
+],[
+        struct net *net = NULL;
+        struct mutex *lock = NULL;
+
+        netlink_kernel_create(net, 0, 0, NULL,
+                              lock,
+                              NULL);
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_NETLINK_NS, 1,
+                  [netlink is support network namespace])
+# XXX
+# for now - if kernel have netlink ns - he uses cbmutex
+        AC_DEFINE(HAVE_NETLINK_CBMUTEX, 1,
+                  [netlink_kernel_create want mutex for callback])
+
+],[
+        AC_MSG_RESULT(NO)
+])
+])
+
+# ~2.6.24
+AC_DEFUN([LIBCFS_NL_BROADCAST_GFP],
+[AC_MSG_CHECKING([for netlink_broadcast is want to have gfp parameter])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/netlink.h>
+],[
+       gfp_t gfp = GFP_KERNEL;
+
+        netlink_broadcast(NULL, NULL, 0, 0, gfp);
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_NL_BROADCAST_GFP, 1,
+                  [netlink brouacast is want to have gfp paramter])
+],[
+        AC_MSG_RESULT(NO)
+])
+])
+
+#
+# LIBCFS_FUNC_DUMP_TRACE
+#
+# 2.6.23 exports dump_trace() so we can dump_stack() on any task
+# 2.6.24 has stacktrace_ops.address with "reliable" parameter
+#
+AC_DEFUN([LIBCFS_FUNC_DUMP_TRACE],
+[LB_CHECK_SYMBOL_EXPORT([dump_trace],
+[kernel/ksyms.c arch/${LINUX_ARCH%_64}/kernel/traps_64.c],[
+       tmp_flags="$EXTRA_KCFLAGS"
+       EXTRA_KCFLAGS="-Werror"
+       AC_MSG_CHECKING([whether we can really use dump_stack])
+       LB_LINUX_TRY_COMPILE([
+               struct task_struct;
+               struct pt_regs;
+               #include <asm/stacktrace.h>
+       ],[
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_DUMP_TRACE, 1, [dump_trace is exported])
+       ],[
+               AC_MSG_RESULT(no)
+       ],[
+       ])
+       AC_MSG_CHECKING([whether print_trace_address has reliable argument])
+       LB_LINUX_TRY_COMPILE([
+               struct task_struct;
+               struct pt_regs;
+               void print_addr(void *data, unsigned long addr, int reliable);
+               #include <asm/stacktrace.h>
+       ],[
+               struct stacktrace_ops ops;
+
+               ops.address = print_addr;
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_TRACE_ADDRESS_RELIABLE, 1,
+                         [print_trace_address has reliable argument])
+       ],[
+               AC_MSG_RESULT(no)
+       ],[
+       ])
+EXTRA_KCFLAGS="$tmp_flags"
+])
+])
+
+
 # 2.6.26 use int instead of atomic for sem.count
-AC_DEFUN([LN_SEM_COUNT],
+AC_DEFUN([LIBCFS_SEM_COUNT],
 [AC_MSG_CHECKING([atomic sem.count])
 LB_LINUX_TRY_COMPILE([
         #include <asm/semaphore.h>
@@ -455,6 +627,22 @@ LB_LINUX_TRY_COMPILE([
 ])
 ])
 
+# 2.6.27 have second argument to sock_map_fd
+AC_DEFUN([LIBCFS_SOCK_MAP_FD_2ARG],
+[AC_MSG_CHECKING([sock_map_fd have second argument])
+LB_LINUX_TRY_COMPILE([
+       #include <linux/net.h>
+],[
+        sock_map_fd(NULL, 0);
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_SOCK_MAP_FD_2ARG, 1,
+                  [sock_map_fd have second argument])
+],[
+        AC_MSG_RESULT(NO)
+])
+])
+
 #
 # LIBCFS_PROG_LINUX
 #
@@ -477,6 +665,8 @@ LIBCFS_TASK_RCU
 # 2.6.18
 LIBCFS_TASKLIST_LOCK
 # 2.6.19
+LIBCFS_NETLINK
+LIBCFS_NLMSG_MULTICAST
 LIBCFS_KMEM_CACHE_DESTROY_INT
 LIBCFS_ATOMIC_PANIC_NOTIFIER
 # 2.6.20
@@ -486,11 +676,17 @@ LIBCFS_2ARGS_REGISTER_SYSCTL
 LIBCFS_KMEM_CACHE
 # 2.6.23
 LIBCFS_KMEM_CACHE_CREATE_DTOR
+LIBCFS_NETLINK_CBMUTEX
 # 2.6.24
-LN_SYSCTL_UNNUMBERED
-LN_SCATTERLIST_SETPAGE
+LIBCFS_SYSCTL_UNNUMBERED
+LIBCFS_SCATTERLIST_SETPAGE
+LIBCFS_NL_BROADCAST_GFP
+LIBCFS_NETWORK_NAMESPACE
+LIBCFS_NETLINK_NETNS
+LIBCFS_FUNC_DUMP_TRACE
 # 2.6.26
-LN_SEM_COUNT
+LIBCFS_SEM_COUNT
+LIBCFS_SOCK_MAP_FD_2ARG
 ])
 
 #
index d74b4ad..84dd41b 100644 (file)
@@ -86,4 +86,11 @@ libcfs_sock_wmem_queued(struct socket *sock)
         return sock->sk->sk_wmem_queued;
 }
 
+#ifdef HAVE_INIT_NET
+#define DEFAULT_NET    (&init_net)
+#else
+/* some broken backports */
+#define DEFAULT_NET    (NULL)
+#endif
+
 #endif
index 1060dcb..bbdbff5 100644 (file)
@@ -445,6 +445,11 @@ static inline void hlist_add_after(struct hlist_node *n,
             prefetch(pos->member.next))
 #endif /* list_for_each_entry */
 
+#ifndef list_for_each_entry_rcu
+#define list_for_each_entry_rcu(pos, head, member) \
+       list_for_each_entry(pos, head, member)
+#endif
+
 #ifndef list_for_each_entry_reverse
 /**
  * Iterate backwards over a list of given type.
index b53a712..98a34a0 100644 (file)
 
 #include <libcfs/libcfs.h>
 
-/* OFED backport #defines netlink_kernel_create with 6 args.
-   I haven't a clue why that header file gets included here,
-   but we must undo its mischief. */
-#ifdef BACKPORT_LINUX_NETLINK_H
-#undef netlink_kernel_create
-#endif
-
-
 /* Single Netlink Message type to send all Lustre messages */
 #define LNL_MSG 26
 
@@ -90,8 +82,15 @@ int libcfs_klnl_start(int transport)
         if (atomic_inc_return(&lnl_start_count) > 1)
                 GOTO(out, rc = 0);
 
-        lnl_socket = netlink_kernel_create(LNL_SOCKET, LNL_GRP_CNT,
+        lnl_socket = netlink_kernel_create(
+#ifdef HAVE_NETLINK_NS
+                                           DEFAULT_NET,
+#endif
+                                           LNL_SOCKET, LNL_GRP_CNT,
                                            NULL /* incoming cb */,
+#ifdef HAVE_NETLINK_CBMUTEX
+                                           NULL,
+#endif
                                            THIS_MODULE);
         if (lnl_socket == NULL) {
                 CERROR("Cannot open socket %d\n", LNL_SOCKET);
@@ -205,7 +204,11 @@ int libcfs_klnl_msg_put(int pid, int group, void *payload)
                 if (rc > 0)
                         rc = 0;
         } else {
+#ifdef HAVE_NLMSG_MULTICAST_5ARGS
+                rc = nlmsg_multicast(lnl_socket, skb, 0, group, GFP_KERNEL);
+#else
                 rc = nlmsg_multicast(lnl_socket, skb, 0, group);
+#endif
         }
 
         CDEBUG(0, "Sent message pid=%d, group=%d, rc=%d\n", pid, group, rc);
index fffbd0c..b5a6129 100644 (file)
@@ -156,6 +156,7 @@ cfs_mem_cache_free(cfs_mem_cache_t *cachep, void *objp)
  */
 int cfs_mem_is_in_cache(const void *addr, const cfs_mem_cache_t *kmem)
 {
+#ifdef CONFIG_SLAB
         struct page *page;
 
         /*
@@ -166,6 +167,9 @@ int cfs_mem_is_in_cache(const void *addr, const cfs_mem_cache_t *kmem)
         if (unlikely(PageCompound(page)))
                 page = (struct page *)page->private;
         return PageSlab(page) && ((void *)page->lru.next) == kmem;
+#else
+        return 1;
+#endif
 }
 EXPORT_SYMBOL(cfs_mem_is_in_cache);
 
index f8e2775..decc551 100644 (file)
@@ -212,7 +212,7 @@ EXPORT_SYMBOL(cfs_timer_deadline);
 void cfs_enter_debugger(void)
 {
 #if defined(CONFIG_KGDB)
-        BREAKPOINT();
+//        BREAKPOINT();
 #elif defined(__arch_um__)
         asm("int $3");
 #else
index a461037..0ac56c6 100644 (file)
@@ -63,7 +63,11 @@ libcfs_sock_ioctl(int cmd, unsigned long arg)
                 return rc;
         }
 
+#ifdef HAVE_SOCK_MAP_FD_2ARG
+        fd = sock_map_fd(sock,0);
+#else
         fd = sock_map_fd(sock);
+#endif
         if (fd < 0) {
                 rc = fd;
                 sock_release(sock);
index fc2b62f..15c98af 100644 (file)
@@ -898,51 +898,6 @@ AC_SUBST(RALND)
 ])
 
 
-#
-# LN_FUNC_DUMP_TRACE
-#
-# 2.6.23 exports dump_trace() so we can dump_stack() on any task
-# 2.6.24 has stacktrace_ops.address with "reliable" parameter
-#
-AC_DEFUN([LN_FUNC_DUMP_TRACE],
-[LB_CHECK_SYMBOL_EXPORT([dump_trace],
-[kernel/ksyms.c arch/${LINUX_ARCH%_64}/kernel/traps_64.c],[
-       tmp_flags="$EXTRA_KCFLAGS"
-       EXTRA_KCFLAGS="-Werror"
-       AC_MSG_CHECKING([whether we can really use dump_stack])
-       LB_LINUX_TRY_COMPILE([
-               struct task_struct;
-               struct pt_regs;
-               #include <asm/stacktrace.h>
-       ],[
-       ],[
-               AC_MSG_RESULT(yes)
-               AC_DEFINE(HAVE_DUMP_TRACE, 1, [dump_trace is exported])
-       ],[
-               AC_MSG_RESULT(no)
-       ],[
-       ])
-       AC_MSG_CHECKING([whether print_trace_address has reliable argument])
-       LB_LINUX_TRY_COMPILE([
-               struct task_struct;
-               struct pt_regs;
-               void print_addr(void *data, unsigned long addr, int reliable);
-               #include <asm/stacktrace.h>
-       ],[
-               struct stacktrace_ops ops;
-
-               ops.address = print_addr;
-       ],[
-               AC_MSG_RESULT(yes)
-               AC_DEFINE(HAVE_TRACE_ADDRESS_RELIABLE, 1,
-                         [print_trace_address has reliable argument])
-       ],[
-               AC_MSG_RESULT(no)
-       ],[
-       ])
-EXTRA_KCFLAGS="$tmp_flags"
-])
-])
 
 #
 #
@@ -974,7 +929,6 @@ LN_CONFIG_O2IB
 LN_CONFIG_RALND
 LN_CONFIG_PTLLND
 LN_CONFIG_MX
-LN_FUNC_DUMP_TRACE
 ])
 
 #
index f873fe3..753c0c1 100644 (file)
@@ -4,10 +4,11 @@ tbd  Sun Microsystems, Inc.
         2.6.16.60-0.39.3 (SLES 10),
         2.6.18-128.7.1.el5 (RHEL 5),
         2.6.18-128.7.1.el5 (OEL 5),
-        2.6.22.14 vanilla (kernel.org).
+        2.6.27.19-5 (SLES11)
+        2.6.27 vanilla (kernel.org).
        * Client support for unpatched kernels:
         (see http://wiki.lustre.org/index.php?title=Patchless_Client)
-        2.6.16 - 2.6.21 vanilla (kernel.org)
+        2.6.16 - 2.6.27 vanilla (kernel.org)
        * Recommended e2fsprogs version: 1.41.6.sun1
        * Note that reiserfs quotas are disabled on SLES 10 in this kernel.
        * RHEL 4 and RHEL 5/SLES 10 clients behaves differently on 'cd' to a
@@ -15,6 +16,10 @@ tbd  Sun Microsystems, Inc.
        * File join has been disabled in this release, refer to Bugzilla 16929.
 
 Severity   : enhancement
+Bugzilla   : 14250
+Description: Add 2.6.27 and SLES11 (patchless client) support
+
+Severity   : enhancement
 Bugzilla   : 19325
 Description: Adjust locks' extents on their first enqueue, so that at the time
              they get granted, there is no need for another pass through the
index d6c7843..0d62060 100644 (file)
@@ -394,7 +394,6 @@ AC_DEFUN([LC_XATTR_ACL],
 ])
 
 
-#
 # added in 2.6.16
 #
 AC_DEFUN([LC_STRUCT_INTENT_FILE],
@@ -922,15 +921,20 @@ LB_LINUX_TRY_COMPILE([
 AC_DEFUN([LC_PAGE_CHECKED],
 [AC_MSG_CHECKING([kernel has PageChecked and SetPageChecked])
 LB_LINUX_TRY_COMPILE([
-        #include <linux/mm.h>
-        #include <linux/page-flags.h>
+        #include <linux/autoconf.h>
+#ifdef HAVE_LINUX_MMTYPES_H
+        #include <linux/mm_types.h>
+#endif
+       #include <linux/page-flags.h>
 ],[
-        #ifndef PageChecked
-        #error PageChecked not defined in kernel
-        #endif
-        #ifndef SetPageChecked
-        #error SetPageChecked not defined in kernel
-        #endif
+       struct page *p;
+
+        /* before 2.6.26 this define*/
+        #ifndef PageChecked    
+       /* 2.6.26 use function instead of define for it */
+       SetPageChecked(p);
+       PageChecked(p);
+       #endif
 ],[
         AC_MSG_RESULT(yes)
         AC_DEFINE(HAVE_PAGE_CHECKED, 1,
@@ -1064,6 +1068,9 @@ LB_LINUX_TRY_COMPILE([
 ])
 ])
 
+# 2.6.18
+
+
 # 2.6.23 have return type 'void' for unregister_blkdev
 AC_DEFUN([LC_UNREGISTER_BLKDEV_RETURN_INT],
 [AC_MSG_CHECKING([if unregister_blkdev return int])
@@ -1081,6 +1088,25 @@ LB_LINUX_TRY_COMPILE([
 ])
 
 # 2.6.23 change .sendfile to .splice_read
+# RHEL4 (-92 kernel) have both sendfile and .splice_read API
+AC_DEFUN([LC_KERNEL_SENDFILE],
+[AC_MSG_CHECKING([if kernel has .sendfile])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/fs.h>
+],[
+        struct file_operations file;
+
+        file.sendfile = NULL;
+], [
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_KERNEL_SENDFILE, 1,
+                [kernel has .sendfile])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.23 change .sendfile to .splice_read
 AC_DEFUN([LC_KERNEL_SPLICE_READ],
 [AC_MSG_CHECKING([if kernel has .splice_read])
 LB_LINUX_TRY_COMPILE([
@@ -1100,11 +1126,153 @@ LB_LINUX_TRY_COMPILE([
 
 # 2.6.23 extract nfs export related data into exportfs.h
 AC_DEFUN([LC_HAVE_EXPORTFS_H],
-[
-tmpfl="$CFLAGS"
-CFLAGS="$CFLAGS -I$LINUX_OBJ/include"
-AC_CHECK_HEADERS([linux/exportfs.h])
-CFLAGS="$tmpfl"
+[LB_CHECK_FILE([$LINUX/include/linux/exportfs.h], [
+        AC_DEFINE(HAVE_LINUX_EXPORTFS_H, 1,
+                [kernel has include/exportfs.h])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.23 has new page fault handling API
+AC_DEFUN([LC_VM_OP_FAULT],
+[AC_MSG_CHECKING([kernel has .fault in vm_operation_struct])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/mm.h>
+],[
+        struct vm_operations_struct op;
+
+        op.fault = NULL;
+], [
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_VM_OP_FAULT, 1,
+                [kernel has .fault in vm_operation_struct])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+#2.6.23 has new shrinker API
+AC_DEFUN([LC_REGISTER_SHRINKER],
+[AC_MSG_CHECKING([if kernel has register_shrinker])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/mm.h>
+],[
+        register_shrinker(NULL);
+], [
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_REGISTER_SHRINKER, 1,
+                [kernel has register_shrinker])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.24 has bio_endio with 2 args
+AC_DEFUN([LC_BIO_ENDIO_2ARG],
+[AC_MSG_CHECKING([if kernel has bio_endio with 2 args])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/bio.h>
+],[
+        bio_endio(NULL, 0);
+], [
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_BIO_ENDIO_2ARG, 1,
+                [kernel has bio_endio with 2 args])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.24 has new members in exports struct.
+AC_DEFUN([LC_FH_TO_DENTRY],
+[AC_MSG_CHECKING([if kernel has .fh_to_dentry member in export_operations struct])
+LB_LINUX_TRY_COMPILE([
+#ifdef HAVE_LINUX_EXPORTFS_H
+        #include <linux/exportfs.h>
+#else
+        #include <linux/fs.h>
+#endif
+],[
+        struct export_operations exp;
+
+        exp.fh_to_dentry   = NULL;
+], [
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_FH_TO_DENTRY, 1,
+                [kernel has .fh_to_dentry member in export_operations struct])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.24 need linux/mm_types.h included
+AC_DEFUN([LC_HAVE_MMTYPES_H],
+[LB_CHECK_FILE([$LINUX/include/linux/mm_types.h], [
+        AC_DEFINE(HAVE_LINUX_MMTYPES_H, 1,
+                [kernel has include/mm_types.h])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.24 removes long aged procfs entry -> deleted member
+AC_DEFUN([LC_PROCFS_DELETED],
+[AC_MSG_CHECKING([if kernel has deleted member in procfs entry struct])
+LB_LINUX_TRY_COMPILE([
+       #include <linux/proc_fs.h>
+],[
+        struct proc_dir_entry pde;
+
+        pde.deleted   = NULL;
+], [
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_PROCFS_DELETED, 1,
+                [kernel has deleted member in procfs entry struct])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.25 change define to inline
+AC_DEFUN([LC_MAPPING_CAP_WRITEBACK_DIRTY],
+[AC_MSG_CHECKING([if kernel have mapping_cap_writeback_dirty])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/backing-dev.h>
+],[
+        #ifndef mapping_cap_writeback_dirty
+        mapping_cap_writeback_dirty(NULL);
+        #endif
+],[
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_MAPPING_CAP_WRITEBACK_DIRTY, 1,
+                [kernel have mapping_cap_writeback_dirty])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+
+
+# 2.6.26 isn't export set_fs_pwd and change paramter in fs struct
+AC_DEFUN([LC_FS_STRUCT_USE_PATH],
+[AC_MSG_CHECKING([fs_struct use path structure])
+LB_LINUX_TRY_COMPILE([
+        #include <asm/atomic.h>
+        #include <linux/spinlock.h>
+        #include <linux/fs_struct.h>
+],[
+        struct path path;
+        struct fs_struct fs;
+
+        fs.pwd = path;
+], [
+        AC_MSG_RESULT([yes])
+        AC_DEFINE(HAVE_FS_STRUCT_USE_PATH, 1,
+                [fs_struct use path structure])
+],[
+        AC_MSG_RESULT([no])
+])
 ])
 
 #
@@ -1374,6 +1542,234 @@ AC_DEFUN([LC_REGISTER_SHRINKER],
 ])
 ])
 
+#2.6.27
+AC_DEFUN([LC_INODE_PERMISION_2ARGS],
+[AC_MSG_CHECKING([inode_operations->permission has two args])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/fs.h>
+],[
+        struct inode *inode;
+
+        inode->i_op->permission(NULL,0);
+],[
+        AC_DEFINE(HAVE_INODE_PERMISION_2ARGS, 1, 
+                  [inode_operations->permission has two args])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 has file_remove_suid instead of remove_suid
+AC_DEFUN([LC_FILE_REMOVE_SUID],
+[AC_MSG_CHECKING([kernel has file_remove_suid])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/fs.h>
+],[
+        file_remove_suid(NULL);
+],[
+        AC_DEFINE(HAVE_FILE_REMOVE_SUID, 1,
+                  [kernel have file_remove_suid])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 have new page locking API
+AC_DEFUN([LC_TRYLOCKPAGE],
+[AC_MSG_CHECKING([kernel uses trylock_page for page lock])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/pagemap.h>
+],[
+        trylock_page(NULL);
+],[
+        AC_DEFINE(HAVE_TRYLOCK_PAGE, 1,
+                  [kernel uses trylock_page for page lock])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# vfs_symlink seems to have started out with 3 args until 2.6.7 where a
+# "mode" argument was added, but then again, in some later version it was
+# removed
+AC_DEFUN([LC_4ARGS_VFS_SYMLINK],
+[AC_MSG_CHECKING([if vfs_symlink wants 4 args])
+LB_LINUX_TRY_COMPILE([
+       #include <linux/fs.h>
+],[
+       struct inode *dir;
+       struct dentry *dentry;
+       const char *oldname = NULL;
+       int mode = 0;
+
+       vfs_symlink(dir, dentry, oldname, mode);
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_4ARGS_VFS_SYMLINK, 1,
+                  [vfs_symlink wants 4 args])
+],[
+        AC_MSG_RESULT(no)
+])
+])
+
+# 2.6.27 sles11 remove the bi_hw_segments
+AC_DEFUN([LC_BI_HW_SEGMENTS],
+[AC_MSG_CHECKING([struct bio has a bi_hw_segments field])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/bio.h>
+],[
+        struct bio io;
+        io.bi_hw_segments = 0;
+],[
+        AC_DEFINE(HAVE_BI_HW_SEGMENTS, 1,
+                [struct bio has a bi_hw_segments field])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 sles11 move the quotaio_v1.h to fs
+AC_DEFUN([LC_HAVE_QUOTAIO_V1_H],
+[LB_CHECK_FILE([$LINUX/include/linux/quotaio_v1.h],[
+        AC_DEFINE(HAVE_QUOTAIO_V1_H, 1,
+                [kernel has include/linux/quotaio_v1.h])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# sles10 sp2 need 5 parameter for vfs_symlink
+AC_DEFUN([LC_VFS_SYMLINK_5ARGS],
+[AC_MSG_CHECKING([vfs_symlink need 5 parameter])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/fs.h>
+],[
+        struct inode *dir = NULL;
+        struct dentry *dentry = NULL;
+        struct vfsmount *mnt = NULL;
+        const char * path = NULL;
+        vfs_symlink(dir, dentry, mnt, path, 0);
+],[
+        AC_DEFINE(HAVE_VFS_SYMLINK_5ARGS, 1,
+                [vfs_symlink need 5 parameteres])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 removed the read_inode from super_operations.
+AC_DEFUN([LC_READ_INODE_IN_SBOPS],
+[AC_MSG_CHECKING([super_operations has a read_inode field])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/fs.h>
+],[
+        struct super_operations *sop;
+        sop->read_inode(NULL);
+],[
+        AC_DEFINE(HAVE_READ_INODE_IN_SBOPS, 1,
+                [super_operations has a read_inode])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 sles11 has sb_any_quota_active
+AC_DEFUN([LC_SB_ANY_QUOTA_ACTIVE],
+[AC_MSG_CHECKING([Kernel has sb_any_quota_active])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/quotaops.h>
+],[
+        sb_any_quota_active(NULL);
+],[
+        AC_DEFINE(HAVE_SB_ANY_QUOTA_ACTIVE, 1,
+                [Kernel has a sb_any_quota_active])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 sles11 has sb_has_quota_active
+AC_DEFUN([LC_SB_HAS_QUOTA_ACTIVE],
+[AC_MSG_CHECKING([Kernel has sb_has_quota_active])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/quotaops.h>
+],[
+        sb_has_quota_active(NULL, 0);
+],[
+        AC_DEFINE(HAVE_SB_HAS_QUOTA_ACTIVE, 1,
+                [Kernel has a sb_has_quota_active])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 has inode_permission instead of permisson
+AC_DEFUN([LC_EXPORT_INODE_PERMISSION],
+[LB_CHECK_SYMBOL_EXPORT([inode_permission],
+[fs/namei.c],[
+AC_DEFINE(HAVE_EXPORT_INODE_PERMISSION, 1,
+            [inode_permission is exported by the kernel])
+],[
+])
+])
+
+# 2.6.27 use 5th parameter in quota_on for remount.
+AC_DEFUN([LC_QUOTA_ON_5ARGS],
+[AC_MSG_CHECKING([quota_on needs 5 parameters])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/quota.h>
+],[
+        struct quotactl_ops *qop;
+        qop->quota_on(NULL, 0, 0, NULL, 0);
+],[
+        AC_DEFINE(HAVE_QUOTA_ON_5ARGS, 1,
+                [quota_on needs 5 paramters])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 use 3th parameter in quota_off for remount.
+AC_DEFUN([LC_QUOTA_OFF_3ARGS],
+[AC_MSG_CHECKING([quota_off needs 3 parameters])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/quota.h>
+],[
+        struct quotactl_ops *qop;
+        qop->quota_off(NULL, 0, 0);
+],[
+        AC_DEFINE(HAVE_QUOTA_OFF_3ARGS, 1,
+                [quota_off needs 3 paramters])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 has vfs_dq_off inline function.
+AC_DEFUN([LC_VFS_DQ_OFF],
+[AC_MSG_CHECKING([vfs_dq_off is defined])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/quotaops.h>
+],[
+        vfs_dq_off(NULL, 0);
+],[
+        AC_DEFINE(HAVE_VFS_DQ_OFF, 1, [vfs_dq_off is defined])
+        AC_MSG_RESULT([yes])
+],[
+        AC_MSG_RESULT([no])
+])
+])
+
 #
 # LC_LINUX_FIEMAP_H
 #
@@ -1466,7 +1862,6 @@ AC_DEFUN([LC_PROG_LINUX],
          LC_PERCPU_COUNTER
          LC_QUOTA64
          LC_4ARGS_VFS_SYMLINK
-         LC_NETLINK
 
          # does the kernel have VFS intent patches?
          LC_VFS_INTENT_PATCHES
@@ -1527,7 +1922,39 @@ AC_DEFUN([LC_PROG_LINUX],
          # 2.6.23
          LC_UNREGISTER_BLKDEV_RETURN_INT
          LC_KERNEL_SPLICE_READ
+         LC_KERNEL_SENDFILE
          LC_HAVE_EXPORTFS_H
+         LC_VM_OP_FAULT
+         LC_REGISTER_SHRINKER
+  
+        # 2.6.24
+        LC_HAVE_MMTYPES_H
+         LC_BIO_ENDIO_2ARG
+         LC_FH_TO_DENTRY
+         LC_PROCFS_DELETED
+
+         #2.6.25
+         LC_MAPPING_CAP_WRITEBACK_DIRTY
+  
+         # 2.6.26
+         LC_FS_STRUCT_USE_PATH
+
+         # 2.6.27
+         LC_INODE_PERMISION_2ARGS
+         LC_FILE_REMOVE_SUID
+         LC_TRYLOCKPAGE
+         LC_READ_INODE_IN_SBOPS
+         LC_EXPORT_INODE_PERMISSION
+         LC_QUOTA_ON_5ARGS
+         LC_QUOTA_OFF_3ARGS
+         LC_VFS_DQ_OFF
+
+         # 2.6.27.15-2 sles11
+         LC_BI_HW_SEGMENTS
+         LC_HAVE_QUOTAIO_V1_H
+         LC_VFS_SYMLINK_5ARGS
+         LC_SB_ANY_QUOTA_ACTIVE
+         LC_SB_HAS_QUOTA_ACTIVE
 ])
 
 #
@@ -1767,6 +2194,7 @@ LB_LINUX_TRY_COMPILE([
         ],[
                 AC_MSG_RESULT([no])
         ])
+
 ],[
         AC_MSG_RESULT([no])
 ])
@@ -1789,11 +2217,24 @@ AC_DEFUN([LC_QUOTA64],
                 AC_DEFINE(HAVE_QUOTA64, 1, [have quota64])
                 AC_MSG_RESULT([yes])
         ],[
+        tmp_flags="$EXTRA_KCFLAGS"
+        EXTRA_KCFLAGS="-I $LINUX/fs"
+        LB_LINUX_TRY_COMPILE([
+                #include <linux/kernel.h>
+                #include <linux/fs.h>
+                #include <quotaio_v2.h>
+                struct v2r1_disk_dqblk dqblk_r1;
+        ],[],[
+                AC_DEFINE(HAVE_QUOTA64, 1, [have quota64])
+                AC_MSG_RESULT([yes])
+        ],[
                 LB_CHECK_FILE([$LINUX/include/linux/lustre_version.h],[
                         AC_MSG_ERROR([You have got no 64-bit kernel quota support.])
                 ],[])
                 AC_MSG_RESULT([no])
         ])
+        EXTRA_KCFLAGS=$tmp_flags
+        ])
 fi
 ])
 
@@ -1845,35 +2286,6 @@ LB_LINUX_TRY_COMPILE([
 ])
 
 #
-# LC_NETLINK
-#
-# If we have netlink.h, and nlmsg_new takes 2 args
-#
-AC_DEFUN([LC_NETLINK],
-[AC_MSG_CHECKING([if netlink.h can be compiled])
-LB_LINUX_TRY_COMPILE([
-        #include <net/netlink.h>
-],[],[
-        AC_MSG_RESULT([yes])
-        AC_DEFINE(HAVE_NETLINK, 1, [net/netlink.h found])
-
-        AC_MSG_CHECKING([if nlmsg_new takes a 2nd argument])
-        LB_LINUX_TRY_COMPILE([
-                #include <net/netlink.h>
-        ],[
-                nlmsg_new(100, GFP_KERNEL);
-        ],[
-                AC_MSG_RESULT([yes])
-                AC_DEFINE(HAVE_NETLINK_NL2, 1, [nlmsg_new takes 2 args])
-        ],[
-                AC_MSG_RESULT([no])
-        ])
-],[
-        AC_MSG_RESULT([no])
-])
-])
-
-#
 # LC_CONFIGURE
 #
 # other configure checks
@@ -2010,6 +2422,7 @@ lustre/kernel_patches/targets/2.6-rhel5.target
 lustre/kernel_patches/targets/2.6-fc5.target
 lustre/kernel_patches/targets/2.6-patchless.target
 lustre/kernel_patches/targets/2.6-sles10.target
+lustre/kernel_patches/targets/2.6-sles11.target
 lustre/kernel_patches/targets/2.6-oel5.target
 lustre/ldlm/Makefile
 lustre/fid/Makefile
index 7536f80..20b14d2 100644 (file)
@@ -2223,6 +2223,7 @@ struct cl_io_rw_common {
         int         crw_nonblock;
 };
 
+
 /**
  * State for io.
  *
@@ -2258,7 +2259,6 @@ struct cl_io {
         union {
                 struct cl_rd_io {
                         struct cl_io_rw_common rd;
-                        int                    rd_is_sendfile;
                 } ci_rd;
                 struct cl_wr_io {
                         struct cl_io_rw_common wr;
@@ -2928,8 +2928,6 @@ static inline int cl_io_is_append(const struct cl_io *io)
         return io->ci_type == CIT_WRITE && io->u.ci_wr.wr_append;
 }
 
-int cl_io_is_sendfile(const struct cl_io *io);
-
 struct cl_io *cl_io_top(struct cl_io *io);
 
 void cl_io_print(const struct lu_env *env, void *cookie,
index ead82c3..e81f7e0 100644 (file)
@@ -48,20 +48,6 @@ int cl_glimpse_lock(const struct lu_env *env, struct cl_io *io,
                     struct inode *inode, struct cl_object *clob);
 
 /**
- * Common IO arguments for various VFS I/O interfaces.
- */
-struct ccc_io_args {
-        int           cia_is_sendfile;
-#ifndef HAVE_FILE_WRITEV
-        struct kiocb *cia_iocb;
-#endif
-        struct iovec *cia_iov;
-        unsigned long cia_nrsegs;
-        read_actor_t  cia_actor;
-        void         *cia_target;
-};
-
-/**
  * Locking policy for truncate.
  */
 enum ccc_trunc_lock_type {
@@ -73,6 +59,7 @@ enum ccc_trunc_lock_type {
         TRUNC_MATCH
 };
 
+
 /**
  * IO state private to vvp or slp layers.
  */
@@ -117,6 +104,12 @@ struct ccc_io {
 #endif
 };
 
+/**
+ * True, if \a io is a normal io, False for other (sendfile, splice*).
+ * must be impementated in arch specific code.
+ */
+int cl_is_normalio(const struct lu_env *env, const struct cl_io *io);
+
 extern struct lu_context_key ccc_key;
 extern struct lu_context_key ccc_session_key;
 
@@ -371,8 +364,8 @@ void cl_inode_fini(struct inode *inode);
 int cl_local_size(struct inode *inode);
 
 __u16 ll_dirent_type_get(struct lu_dirent *ent);
-ino_t cl_fid_build_ino(struct lu_fid *fid);
-__u32 cl_fid_build_gen(struct lu_fid *fid);
+ino_t cl_fid_build_ino(const struct lu_fid *fid);
+__u32 cl_fid_build_gen(const struct lu_fid *fid);
 
 #ifdef INVARIANT_CHECK
 # define CLOBINVRNT(env, clob, expr)                                    \
index 04f138c..d65fc62 100644 (file)
@@ -56,6 +56,27 @@ struct ll_iattr {
 #define ll_iattr iattr
 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14) */
 
+#ifdef HAVE_FS_STRUCT_USE_PATH
+static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt,
+                                 struct dentry *dentry)
+{
+        struct path path;
+        struct path old_pwd;
+
+        path.mnt = mnt;
+        path.dentry = dentry;
+        write_lock(&fs->lock);
+        old_pwd = fs->pwd;
+        path_get(&path);
+        fs->pwd = path;
+        write_unlock(&fs->lock);
+
+        if (old_pwd.dentry)
+                path_put(&old_pwd);
+}
+
+#else
+
 static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt,
                 struct dentry *dentry)
 {
@@ -74,6 +95,7 @@ static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt,
                 mntput(old_pwdmnt);
         }
 }
+#endif
 
 /*
  * set ATTR_BLOCKS to a high value to avoid any risk of collision with other
@@ -143,7 +165,10 @@ do {mutex_lock_nested(&(inode)->i_mutex, I_MUTEX_PARENT); } while(0)
 #endif
 
 /* XXX our code should be using the 2.6 calls, not the other way around */
-#define TryLockPage(page)               TestSetPageLocked(page)
+#ifdef HAVE_TRYLOCK_PAGE
+#define TestSetPageLocked(page)         (!trylock_page(page))
+#endif
+
 #define Page_Uptodate(page)             PageUptodate(page)
 #define ll_redirty_page(page)           set_page_dirty(page)
 
@@ -168,7 +193,7 @@ do {mutex_lock_nested(&(inode)->i_mutex, I_MUTEX_PARENT); } while(0)
 #define to_kdev_t(dev)                  (dev)
 #define kdev_t_to_nr(dev)               (dev)
 #define val_to_kdev(dev)                (dev)
-#define ILOOKUP(sb, ino, test, data)    ilookup5(sb, ino, test, data);
+#define ILOOKUP(sb, ino, test, data)    ilookup5(sb, ino, test, (void *)(data));
 
 #include <linux/writeback.h>
 
@@ -314,7 +339,7 @@ static inline int filemap_fdatawrite_range(struct address_space *mapping,
         wbc.end = end;
 #endif
 
-#ifdef mapping_cap_writeback_dirty
+#ifdef HAVE_MAPPING_CAP_WRITEBACK_DIRTY
         if (!mapping_cap_writeback_dirty(mapping))
                 rc = 0;
 #else
@@ -591,8 +616,17 @@ static inline int ll_crypto_hmac(struct crypto_tfm *tfm,
 #define synchronize_rcu() synchronize_kernel()
 #endif
 
+#ifdef HAVE_FILE_REMOVE_SUID
+# define ll_remove_suid(file, mnt)       file_remove_suid(file)
+#else
+# ifdef HAVE_SECURITY_PLUG
+#  define ll_remove_suid(file,mnt)      remove_suid(file->f_dentry,mnt)
+# else
+#  define ll_remove_suid(file,mnt)      remove_suid(file->f_dentry)
+# endif
+#endif
+
 #ifdef HAVE_SECURITY_PLUG
-#define ll_remove_suid(inode,mnt)               remove_suid(inode,mnt)
 #define ll_vfs_rmdir(dir,entry,mnt)             vfs_rmdir(dir,entry,mnt)
 #define ll_vfs_mkdir(inode,dir,mnt,mode)        vfs_mkdir(inode,dir,mnt,mode)
 #define ll_vfs_link(old,mnt,dir,new,mnt1)       vfs_link(old,mnt,dir,new,mnt1)
@@ -604,7 +638,6 @@ static inline int ll_crypto_hmac(struct crypto_tfm *tfm,
 #define ll_vfs_rename(old,old_dir,mnt,new,new_dir,mnt1) \
                 vfs_rename(old,old_dir,mnt,new,new_dir,mnt1)
 #else
-#define ll_remove_suid(inode,mnt)               remove_suid(inode)
 #define ll_vfs_rmdir(dir,entry,mnt)             vfs_rmdir(dir,entry)
 #define ll_vfs_mkdir(inode,dir,mnt,mode)        vfs_mkdir(inode,dir,mode)
 #define ll_vfs_link(old,mnt,dir,new,mnt1)       vfs_link(old,dir,new)
@@ -623,6 +656,55 @@ static inline int ll_crypto_hmac(struct crypto_tfm *tfm,
 #define cpu_to_node(cpu)         0
 #endif
 
+#ifdef HAVE_REGISTER_SHRINKER
+typedef int (*shrinker_t)(int nr_to_scan, gfp_t gfp_mask);
+
+static inline
+struct shrinker *set_shrinker(int seek, shrinker_t func)
+{
+        struct shrinker *s;
+
+        s = kmalloc(sizeof(*s), GFP_KERNEL);
+        if (s == NULL)
+                return (NULL);
+
+        s->shrink = func;
+        s->seeks = seek;
+
+        register_shrinker(s);
+
+        return s;
+}
+
+static inline
+void remove_shrinker(struct shrinker *shrinker) 
+{
+        if (shrinker == NULL)
+                return;
+
+        unregister_shrinker(shrinker);
+        kfree(shrinker);
+}
+#endif
+
+#ifdef HAVE_BIO_ENDIO_2ARG
+#define cfs_bio_io_error(a,b)   bio_io_error((a))
+#define cfs_bio_endio(a,b,c)    bio_endio((a),(c))
+#else
+#define cfs_bio_io_error(a,b)   bio_io_error((a),(b))
+#define cfs_bio_endio(a,b,c)    bio_endio((a),(b),(c))
+#endif
+
+#ifdef HAVE_FS_STRUCT_USE_PATH
+#define cfs_fs_pwd(fs)       ((fs)->pwd.dentry)
+#define cfs_fs_mnt(fs)       ((fs)->pwd.mnt)
+#define cfs_path_put(nd)     path_put(&(nd)->path)
+#else
+#define cfs_fs_pwd(fs)       ((fs)->pwd)
+#define cfs_fs_mnt(fs)       ((fs)->pwdmnt)
+#define cfs_path_put(nd)     path_release(nd)
+#endif
+
 #ifndef abs
 static inline int abs(int x)
 {
@@ -656,6 +738,46 @@ static inline long labs(long x)
 #define SLAB_DESTROY_BY_RCU 0
 #endif
 
+#ifdef HAVE_SB_HAS_QUOTA_ACTIVE
+#define ll_sb_has_quota_active(sb, type) sb_has_quota_active(sb, type)
+#else
+#define ll_sb_has_quota_active(sb, type) sb_has_quota_enabled(sb, type)
+#endif
+
+#ifdef HAVE_SB_ANY_QUOTA_ACTIVE
+#define ll_sb_any_quota_active(sb) sb_any_quota_active(sb)
+#else
+#define ll_sb_any_quota_active(sb) sb_any_quota_enabled(sb)
+#endif
+
+static inline int
+ll_quota_on(struct super_block *sb, int off, int ver, char *name, int remount)
+{
+        if (sb->s_qcop->quota_on) {
+                return sb->s_qcop->quota_on(sb, off, ver, name
+#ifdef HAVE_QUOTA_ON_5ARGS
+                                            , remount
+#endif
+                                           );
+        }
+        else
+                return -ENOSYS;
+}
+
+static inline int ll_quota_off(struct super_block *sb, int off, int remount)
+{
+        if (sb->s_qcop->quota_off) {
+                return sb->s_qcop->quota_off(sb, off
+#ifdef HAVE_QUOTA_OFF_3ARGS
+                                             , remount
+#endif
+                                            );
+        }
+        else
+                return -ENOSYS;
+}
+
+
 #ifdef HAVE_VFS_RENAME_MUTEX
 #define VFS_RENAME_LOCK(inode) mutex_lock(&((inode)->i_sb->s_vfs_rename_mutex))
 #define VFS_RENAME_UNLOCK(inode) mutex_unlock(&((inode)->i_sb->s_vfs_rename_mutex))
index 1092c61..875615a 100644 (file)
@@ -49,7 +49,6 @@
 # include <string.h>
 # include <sys/types.h>
 #else
-# include <asm/semaphore.h>
 # include <linux/rwsem.h>
 # include <linux/sched.h>
 # include <linux/signal.h>
index 81b96f3..ce53ac1 100644 (file)
@@ -52,7 +52,7 @@ static inline void ll_remove_from_page_cache(struct page *page)
 
         BUG_ON(!PageLocked(page));
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15))
+#ifdef HAVE_RW_TREE_LOCK
         write_lock_irq(&mapping->tree_lock);
 #else
        spin_lock_irq(&mapping->tree_lock);
@@ -66,7 +66,7 @@ static inline void ll_remove_from_page_cache(struct page *page)
         __dec_zone_page_state(page, NR_FILE_PAGES);
 #endif
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15))
+#ifdef HAVE_RW_TREE_LOCK
         write_unlock_irq(&mapping->tree_lock);
 #else
        spin_unlock_irq(&mapping->tree_lock);
index 46b7059..7ea3031 100644 (file)
@@ -579,14 +579,27 @@ extern struct rw_semaphore _lprocfs_lock;
 #define LPROCFS_EXIT()            do {  \
         up_read(&_lprocfs_lock);        \
 } while(0)
-#define LPROCFS_ENTRY_AND_CHECK(dp) do {        \
-        typecheck(struct proc_dir_entry *, dp); \
-        LPROCFS_ENTRY();                        \
-        if ((dp)->deleted) {                    \
-                LPROCFS_EXIT();                 \
-                return -ENODEV;                 \
-        }                                       \
-} while(0)
+
+#ifdef HAVE_PROCFS_DELETED
+static inline
+int LPROCFS_ENTRY_AND_CHECK(struct proc_dir_entry *dp)
+{
+        LPROCFS_ENTRY();
+        if ((dp)->deleted) {
+                LPROCFS_EXIT();
+                return -ENODEV;
+        }
+        return 0;
+}
+#else
+static inline
+int LPROCFS_ENTRY_AND_CHECK(struct proc_dir_entry *dp)
+{
+        LPROCFS_ENTRY();
+        return 0;
+}
+#endif
+
 #define LPROCFS_WRITE_ENTRY()     do {  \
         down_write(&_lprocfs_lock);     \
 } while(0)
@@ -594,6 +607,7 @@ extern struct rw_semaphore _lprocfs_lock;
         up_write(&_lprocfs_lock);       \
 } while(0)
 
+
 /* You must use these macros when you want to refer to
  * the import in a client obd_device for a lprocfs entry */
 #define LPROCFS_CLIMP_CHECK(obd) do {           \
index d1df0ee..04c321a 100644 (file)
@@ -386,18 +386,6 @@ enum {
 };
 
 #ifdef NEED_QUOTA_DEFS
-#ifndef QUOTABLOCK_BITS
-#define QUOTABLOCK_BITS 10
-#endif
-
-#ifndef QUOTABLOCK_SIZE
-#define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS)
-#endif
-
-#ifndef toqb
-#define toqb(x) (((x) + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS)
-#endif
-
 #ifndef QIF_BLIMITS
 #define QIF_BLIMITS     1
 #define QIF_SPACE       2
index 5f92a78..7179ed8 100644 (file)
@@ -60,8 +60,28 @@ struct client_obd;
 #define NR_DQHASH 45
 #endif
 
+#ifndef QUOTABLOCK_BITS
+#define QUOTABLOCK_BITS 10
+#endif
+
+#ifndef QUOTABLOCK_SIZE
+#define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS)
+#endif
+
+#ifndef toqb
+#define toqb(x) (((x) + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS)
+#endif
+
 #ifdef HAVE_QUOTA_SUPPORT
 
+#ifndef MAX_IQ_TIME
+#define MAX_IQ_TIME  604800     /* (7*24*60*60) 1 week */
+#endif
+
+#ifndef MAX_DQ_TIME
+#define MAX_DQ_TIME  604800     /* (7*24*60*60) 1 week */
+#endif
+
 #ifdef __KERNEL__
 
 #ifdef LPROCFS
@@ -205,11 +225,20 @@ int lustre_get_qids(struct file *file, struct inode *inode, int type,
                     struct list_head *list);
 int lustre_quota_convert(struct lustre_quota_info *lqi, int type);
 
-#define LL_DQUOT_OFF(sb)    DQUOT_OFF(sb)
-
 typedef int (*dqacq_handler_t) (struct obd_device * obd, struct qunit_data * qd,
                                 int opc);
 
+/*
+#ifdef HAVE_VFS_DQ_OFF
+#define LL_DQUOT_OFF(sb, remount)    vfs_dq_off(sb, remount)
+#else
+#define LL_DQUOT_OFF(sb, remount)    DQUOT_OFF(sb)
+#endif
+*/
+
+#define LL_DQUOT_OFF(sb)    DQUOT_OFF(sb)
+
+
 /* user quota is turned on on filter */
 #define LQC_USRQUOTA_FLAG (1 << 0)
 /* group quota is turned on on filter */
@@ -417,7 +446,7 @@ struct lustre_quota_ctxt {
 
 #else
 
-#define LL_DQUOT_OFF(sb) do {} while(0)
+#define LL_DQUOT_OFF(sb, remount) do {} while(0)
 
 struct lustre_quota_info {
 };
diff --git a/lustre/kernel_patches/targets/2.6-sles11.target.in b/lustre/kernel_patches/targets/2.6-sles11.target.in
new file mode 100644 (file)
index 0000000..1d059fb
--- /dev/null
@@ -0,0 +1,40 @@
+lnxmaj="2.6.27"
+lnxmin=".23"
+# when we fix up this lnxmaj/lnxmin/lnxrel business...
+#lnxrel="0.37_f594963d"
+# and note that this means we get rid of the EXTRA_VERSION_DELIMITER crap!!
+lnxrel="23-0.1"
+
+# this is the delimeter that goes between $lnxmaj and $lnxrel
+# defaults to "-"
+EXTRA_VERSION_DELIMITER="."
+
+# this is the delimeter that goes before the "smp" at the end of the version
+# defaults to empty
+TARGET_DELIMITER="-"
+
+KERNEL_SRPM=kernel-source-$lnxmaj.$lnxrel.1.src.rpm
+SERIES=2.6-sles11.series
+VERSION=$lnxmaj
+EXTRA_VERSION="${lnxrel}_lustre.@VERSION@"
+LUSTRE_VERSION=@VERSION@
+
+#OFED_VERSION=1.4.1-rc4
+
+BASE_ARCHS="i686 ppc x86_64 ia64 ppc64"
+BIGMEM_ARCHS=""
+BOOT_ARCHS=""
+JENSEN_ARCHS=""
+DEFAULT_ARCHS="i686 x86_64 ia64 ppc64"
+BIGSMP_ARCHS=""
+PSERIES64_ARCHS="ppc"
+UP_ARCHS=""
+SRC_ARCHS=""
+#RPMSMPTYPE="smp"
+
+for cc in gcc ; do
+    if which $cc >/dev/null 2>/dev/null ; then
+        export CC=$cc
+        break
+    fi
+done
index 5346ed9..067d0e6 100644 (file)
@@ -7,9 +7,10 @@ SUPPORTED KERNELS:
 2.6-rhel5             OEL5: 2.6.18-128.7.1.el5
 2.6.18-vanilla        kernel.org: 2.6.18.8
 2.6.22-vanilla        kernel.org: 2.6.22.14
+2.6-sles11            SLES11: 2.6.27.23-0.1
 
 CLIENT SUPPORT FOR UNPATCHED KERNELS:
-                   kernel.org 2.6.16-2.6.22
+                   kernel.org 2.6.16-2.6.27
                    RHEL4: 2.6.9-42.0.8EL
 
 NB - The patches in the 2.6-suse series should already be in the SLES9 SP1
index dd04f9b..30e2488 100644 (file)
@@ -745,7 +745,7 @@ void ccc_io_update_iov(const struct lu_env *env,
         size_t size = io->u.ci_rw.crw_count;
 
         cio->cui_iov_olen = 0;
-        if (cl_io_is_sendfile(io) || size == cio->cui_tot_count)
+        if (!cl_is_normalio(env, io) || size == cio->cui_tot_count)
                 return;
 
         if (cio->cui_tot_nrsegs == 0)
@@ -793,7 +793,7 @@ void ccc_io_advance(const struct lu_env *env,
 
         CLOBINVRNT(env, obj, ccc_object_invariant(obj));
 
-        if (!cl_io_is_sendfile(io) && io->ci_continue) {
+        if (cl_is_normalio(env, io) && io->ci_continue) {
                 /* update the iov */
                 LASSERT(cio->cui_tot_nrsegs >= cio->cui_nrsegs);
                 LASSERT(cio->cui_tot_count  >= nob);
@@ -1292,7 +1292,7 @@ __u16 ll_dirent_type_get(struct lu_dirent *ent)
 
 /**
  * build inode number from passed @fid */
-ino_t cl_fid_build_ino(struct lu_fid *fid)
+ino_t cl_fid_build_ino(const struct lu_fid *fid)
 {
         ino_t ino;
         ENTRY;
@@ -1316,7 +1316,7 @@ ino_t cl_fid_build_ino(struct lu_fid *fid)
 /**
  * build inode generation from passed @fid.  If our FID overflows the 32-bit
  * inode number then return a non-zero generation to distinguish them. */
-__u32 cl_fid_build_gen(struct lu_fid *fid)
+__u32 cl_fid_build_gen(const struct lu_fid *fid)
 {
         __u32 gen;
         ENTRY;
index e37edbe..4d6e8b1 100644 (file)
@@ -487,6 +487,7 @@ static void llu_free_user_page(struct page *page)
         OBD_FREE_PTR(page);
 }
 
+
 static int llu_queue_pio(const struct lu_env *env, struct cl_io *io,
                          struct llu_io_group *group,
                          char *buf, size_t count, loff_t pos)
@@ -609,6 +610,14 @@ void put_io_group(struct llu_io_group *group)
         OBD_FREE_PTR(group);
 }
 
+/**
+ * True, if \a io is a normal io, False for sendfile() / splice_{read|write}
+ */
+int cl_is_normalio(const struct lu_env *env, const struct cl_io *io)
+{
+        return 1;
+}
+
 static int slp_io_start(const struct lu_env *env, const struct cl_io_slice *ios)
 {
         struct ccc_io     *cio   = cl2ccc_io(env, ios);
index dd9989c..5fa062d 100644 (file)
@@ -799,7 +799,7 @@ void ll_io_init(struct cl_io *io, const struct file *file, int write)
 }
 
 static ssize_t ll_file_io_generic(const struct lu_env *env,
-                struct ccc_io_args *args, struct file *file,
+                struct vvp_io_args *args, struct file *file,
                 enum cl_io_type iot, loff_t *ppos, size_t count)
 {
         struct cl_io       *io;
@@ -809,27 +809,39 @@ static ssize_t ll_file_io_generic(const struct lu_env *env,
         io = &ccc_env_info(env)->cti_io;
         ll_io_init(io, file, iot == CIT_WRITE);
 
-        if (iot == CIT_READ)
-                io->u.ci_rd.rd_is_sendfile = args->cia_is_sendfile;
-
         if (cl_io_rw_init(env, io, iot, *ppos, count) == 0) {
                 struct vvp_io *vio = vvp_env_io(env);
                 struct ccc_io *cio = ccc_env_io(env);
-                if (cl_io_is_sendfile(io)) {
-                        vio->u.read.cui_actor = args->cia_actor;
-                        vio->u.read.cui_target = args->cia_target;
-                } else {
-                        cio->cui_iov = args->cia_iov;
-                        cio->cui_nrsegs = args->cia_nrsegs;
+
+                vio->cui_io_subtype = args->via_io_subtype;
+
+                switch (vio->cui_io_subtype) {
+                case IO_NORMAL:
+                        cio->cui_iov = args->u.normal.via_iov;
+                        cio->cui_nrsegs = args->u.normal.via_nrsegs;
 #ifndef HAVE_FILE_WRITEV
-                        cio->cui_iocb = args->cia_iocb;
+                        cio->cui_iocb = args->u.normal.via_iocb;
 #endif
+                        break;
+                case IO_SENDFILE:
+                        vio->u.sendfile.cui_actor = args->u.sendfile.via_actor;
+                        vio->u.sendfile.cui_target = args->u.sendfile.via_target;
+                        break;
+                case IO_SPLICE:
+                        vio->u.splice.cui_pipe = args->u.splice.via_pipe;
+                        vio->u.splice.cui_flags = args->u.splice.via_flags;
+                        break;
+                default:
+                        CERROR("Unknow IO type - %u\n", vio->cui_io_subtype);
+                        LBUG();
                 }
                 cio->cui_fd  = LUSTRE_FPRIVATE(file);
                 result = cl_io_loop(env, io);
-        } else
+        } else {
                 /* cl_io_rw_init() handled IO */
                 result = io->ci_result;
+        }
+
         if (io->ci_nob > 0) {
                 result = io->ci_nob;
                 *ppos = io->u.ci_wr.wr.crw_pos;
@@ -875,7 +887,7 @@ static ssize_t ll_file_readv(struct file *file, const struct iovec *iov,
                               unsigned long nr_segs, loff_t *ppos)
 {
         struct lu_env      *env;
-        struct ccc_io_args *args;
+        struct vvp_io_args *args;
         size_t              count;
         ssize_t             result;
         int                 refcheck;
@@ -889,10 +901,10 @@ static ssize_t ll_file_readv(struct file *file, const struct iovec *iov,
         if (IS_ERR(env))
                 RETURN(PTR_ERR(env));
 
-        args = &vvp_env_info(env)->vti_args;
-        args->cia_is_sendfile = 0;
-        args->cia_iov = (struct iovec *)iov;
-        args->cia_nrsegs = nr_segs;
+        args = vvp_env_args(env, IO_NORMAL);
+        args->u.normal.via_iov = (struct iovec *)iov;
+        args->u.normal.via_nrsegs = nr_segs;
+
         result = ll_file_io_generic(env, args, file, CIT_READ, ppos, count);
         cl_env_put(env, &refcheck);
         RETURN(result);
@@ -924,7 +936,7 @@ static ssize_t ll_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
                                 unsigned long nr_segs, loff_t pos)
 {
         struct lu_env      *env;
-        struct ccc_io_args *args;
+        struct vvp_io_args *args;
         size_t              count;
         ssize_t             result;
         int                 refcheck;
@@ -938,11 +950,11 @@ static ssize_t ll_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
         if (IS_ERR(env))
                 RETURN(PTR_ERR(env));
 
-        args = &vvp_env_info(env)->vti_args;
-        args->cia_is_sendfile = 0;
-        args->cia_iov = (struct iovec *)iov;
-        args->cia_nrsegs = nr_segs;
-        args->cia_iocb = iocb;
+        args = vvp_env_args(env, IO_NORMAL);
+        args->u.normal.via_iov = (struct iovec *)iov;
+        args->u.normal.via_nrsegs = nr_segs;
+        args->u.normal.via_iocb = iocb;
+
         result = ll_file_io_generic(env, args, iocb->ki_filp, CIT_READ,
                                     &iocb->ki_pos, count);
         cl_env_put(env, &refcheck);
@@ -987,7 +999,7 @@ static ssize_t ll_file_writev(struct file *file, const struct iovec *iov,
                               unsigned long nr_segs, loff_t *ppos)
 {
         struct lu_env      *env;
-        struct ccc_io_args *args;
+        struct vvp_io_args *args;
         size_t              count;
         ssize_t             result;
         int                 refcheck;
@@ -1001,9 +1013,10 @@ static ssize_t ll_file_writev(struct file *file, const struct iovec *iov,
         if (IS_ERR(env))
                 RETURN(PTR_ERR(env));
 
-        args = &vvp_env_info(env)->vti_args;
-        args->cia_iov = (struct iovec *)iov;
-        args->cia_nrsegs = nr_segs;
+        args = vvp_env_args(env, IO_NORMAL);
+        args->u.normal.via_iov = (struct iovec *)iov;
+        args->u.normal.via_nrsegs = nr_segs;
+
         result = ll_file_io_generic(env, args, file, CIT_WRITE, ppos, count);
         cl_env_put(env, &refcheck);
         RETURN(result);
@@ -1036,7 +1049,7 @@ static ssize_t ll_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
                                  unsigned long nr_segs, loff_t pos)
 {
         struct lu_env      *env;
-        struct ccc_io_args *args;
+        struct vvp_io_args *args;
         size_t              count;
         ssize_t             result;
         int                 refcheck;
@@ -1050,10 +1063,11 @@ static ssize_t ll_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
         if (IS_ERR(env))
                 RETURN(PTR_ERR(env));
 
-        args = &vvp_env_info(env)->vti_args;
-        args->cia_iov = (struct iovec *)iov;
-        args->cia_nrsegs = nr_segs;
-        args->cia_iocb = iocb;
+        args = vvp_env_args(env, IO_NORMAL);
+        args->u.normal.via_iov = (struct iovec *)iov;
+        args->u.normal.via_nrsegs = nr_segs;
+        args->u.normal.via_iocb = iocb;
+
         result = ll_file_io_generic(env, args, iocb->ki_filp, CIT_WRITE,
                                   &iocb->ki_pos, count);
         cl_env_put(env, &refcheck);
@@ -1091,6 +1105,7 @@ static ssize_t ll_file_write(struct file *file, const char *buf, size_t count,
 #endif
 
 
+#ifdef HAVE_KERNEL_SENDFILE
 /*
  * Send file content (through pagecache) somewhere with helper
  */
@@ -1098,7 +1113,35 @@ static ssize_t ll_file_sendfile(struct file *in_file, loff_t *ppos,size_t count,
                                 read_actor_t actor, void *target)
 {
         struct lu_env      *env;
-        struct ccc_io_args *args;
+        struct vvp_io_args *args;
+        ssize_t             result;
+        int                 refcheck;
+        ENTRY;
+
+        env = cl_env_get(&refcheck);
+        if (IS_ERR(env))
+                RETURN(PTR_ERR(env));
+
+        args = vvp_env_args(env, IO_SENDFILE);
+        args->u.sendfile.via_target = target;
+        args->u.sendfile.via_actor = actor;
+
+        result = ll_file_io_generic(env, args, in_file, CIT_READ, ppos, count);
+        cl_env_put(env, &refcheck);
+        RETURN(result);
+}
+#endif
+
+#ifdef HAVE_KERNEL_SPLICE_READ
+/*
+ * Send file content (through pagecache) somewhere with helper
+ */
+static ssize_t ll_file_splice_read(struct file *in_file, loff_t *ppos,
+                                   struct pipe_inode_info *pipe, size_t count,
+                                   unsigned int flags)
+{
+        struct lu_env      *env;
+        struct vvp_io_args *args;
         ssize_t             result;
         int                 refcheck;
         ENTRY;
@@ -1107,14 +1150,15 @@ static ssize_t ll_file_sendfile(struct file *in_file, loff_t *ppos,size_t count,
         if (IS_ERR(env))
                 RETURN(PTR_ERR(env));
 
-        args = &vvp_env_info(env)->vti_args;
-        args->cia_is_sendfile = 1;
-        args->cia_target = target;
-        args->cia_actor = actor;
+        args = vvp_env_args(env, IO_SPLICE);
+        args->u.splice.via_pipe = pipe;
+        args->u.splice.via_flags = flags;
+
         result = ll_file_io_generic(env, args, in_file, CIT_READ, ppos, count);
         cl_env_put(env, &refcheck);
         RETURN(result);
 }
+#endif
 
 static int ll_lov_recreate_obj(struct inode *inode, struct file *file,
                                unsigned long arg)
@@ -2419,7 +2463,11 @@ int lustre_check_acl(struct inode *inode, int mask)
 }
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10))
+#ifndef HAVE_INODE_PERMISION_2ARGS
 int ll_inode_permission(struct inode *inode, int mask, struct nameidata *nd)
+#else
+int ll_inode_permission(struct inode *inode, int mask)
+#endif
 {
         int rc = 0;
         ENTRY;
@@ -2522,7 +2570,12 @@ struct file_operations ll_file_operations = {
         .release        = ll_file_release,
         .mmap           = ll_file_mmap,
         .llseek         = ll_file_seek,
+#ifdef HAVE_KERNEL_SENDFILE
         .sendfile       = ll_file_sendfile,
+#endif
+#ifdef HAVE_KERNEL_SPLICE_READ
+        .splice_read    = ll_file_splice_read,
+#endif
         .fsync          = ll_fsync,
 };
 
@@ -2536,7 +2589,12 @@ struct file_operations ll_file_operations_flock = {
         .release        = ll_file_release,
         .mmap           = ll_file_mmap,
         .llseek         = ll_file_seek,
+#ifdef HAVE_KERNEL_SENDFILE
         .sendfile       = ll_file_sendfile,
+#endif
+#ifdef HAVE_KERNEL_SPLICE_READ
+        .splice_read    = ll_file_splice_read,
+#endif
         .fsync          = ll_fsync,
 #ifdef HAVE_F_OP_FLOCK
         .flock          = ll_file_flock,
@@ -2555,7 +2613,12 @@ struct file_operations ll_file_operations_noflock = {
         .release        = ll_file_release,
         .mmap           = ll_file_mmap,
         .llseek         = ll_file_seek,
+#ifdef HAVE_KERNEL_SENDFILE
         .sendfile       = ll_file_sendfile,
+#endif
+#ifdef HAVE_KERNEL_SPLICE_READ
+        .splice_read    = ll_file_splice_read,
+#endif
         .fsync          = ll_fsync,
 #ifdef HAVE_F_OP_FLOCK
         .flock          = ll_file_noflock,
index c061183..62870d2 100644 (file)
@@ -642,7 +642,11 @@ int ll_getattr_it(struct vfsmount *mnt, struct dentry *de,
                struct lookup_intent *it, struct kstat *stat);
 int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat);
 struct ll_file_data *ll_file_data_get(void);
+#ifndef HAVE_INODE_PERMISION_2ARGS
 int ll_inode_permission(struct inode *inode, int mask, struct nameidata *nd);
+#else
+int ll_inode_permission(struct inode *inode, int mask);
+#endif
 int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
                              int flags, struct lov_user_md *lum,
                              int lum_size);
@@ -729,9 +733,6 @@ void ll_finish_md_op_data(struct md_op_data *op_data);
 /* llite/llite_nfs.c */
 extern struct export_operations lustre_export_operations;
 __u32 get_uuid2int(const char *name, int len);
-struct dentry *ll_fh_to_dentry(struct super_block *sb, __u32 *data, int len,
-                               int fhtype, int parent);
-int ll_dentry_to_fh(struct dentry *, __u32 *datap, int *lenp, int need_parent);
 
 /* llite/special.c */
 extern struct inode_operations ll_special_inode_operations;
@@ -754,36 +755,36 @@ struct ll_close_queue {
         atomic_t                lcq_stop;
 };
 
-struct vvp_thread_info {
-        struct ost_lvb       vti_lvb;
-        struct cl_2queue     vti_queue;
-        struct iovec         vti_local_iov;
-        struct ccc_io_args   vti_args;
-        struct ra_io_arg     vti_ria;
-        struct kiocb         vti_kiocb;
-};
-
 struct ccc_object *cl_inode2ccc(struct inode *inode);
 
-static inline struct vvp_thread_info *vvp_env_info(const struct lu_env *env)
-{
-        extern struct lu_context_key vvp_key;
-        struct vvp_thread_info      *info;
-
-        info = lu_context_key_get(&env->le_ctx, &vvp_key);
-        LASSERT(info != NULL);
-        return info;
-}
 
 void vvp_write_pending (struct ccc_object *club, struct ccc_page *page);
 void vvp_write_complete(struct ccc_object *club, struct ccc_page *page);
 
+/* specific achitecture can implement only part of this list */
+enum vvp_io_subtype {
+        /** normal IO */
+        IO_NORMAL,
+        /** io called from .sendfile */
+        IO_SENDFILE,
+        /** io started from splice_{read|write} */
+        IO_SPLICE
+};
+
+/* IO subtypes */
 struct vvp_io {
+        /** io subtype */
+        enum vvp_io_subtype    cui_io_subtype;
+
         union {
                 struct {
                         read_actor_t      cui_actor;
                         void             *cui_target;
-                } read;
+                } sendfile;
+                struct {
+                        struct pipe_inode_info *cui_pipe;
+                        unsigned int            cui_flags;
+                } splice;
                 struct vvp_fault_io {
                         /**
                          * Inode modification time that is checked across DLM
@@ -792,13 +793,33 @@ struct vvp_io {
                         time_t                 ft_mtime;
                         struct vm_area_struct *ft_vma;
                         /**
-                         * Virtual address at which fault occurred.
+                         *  locked page returned from vvp_io
                          */
-                        unsigned long          ft_address;
-                        /**
-                         * Fault type, as to be supplied to filemap_nopage().
-                         */
-                        int                   *ft_type;
+                        cfs_page_t            *ft_vmpage;
+#ifndef HAVE_VM_OP_FAULT
+                        struct vm_nopage_api {
+                                /**
+                                 * Virtual address at which fault occurred.
+                                 */
+                                unsigned long   ft_address;
+                                /**
+                                 * Fault type, as to be supplied to
+                                 * filemap_nopage().
+                                 */
+                                int             *ft_type;
+                        } nopage;
+#else
+                        struct vm_fault_api {
+                                /**
+                                 * kernel fault info
+                                 */
+                                struct vm_fault *ft_vmf;
+                                /**
+                                 * fault API used bitflags for return code.
+                                 */
+                                unsigned int    ft_flags;
+                        } fault;
+#endif
                 } fault;
         } u;
         /**
@@ -825,6 +846,61 @@ struct vvp_io {
         struct cl_page      *cui_partpage;
 };
 
+/**
+ * IO arguments for various VFS I/O interfaces.
+ */
+struct vvp_io_args {
+        /** normal/sendfile/splice */
+        enum vvp_io_subtype via_io_subtype;
+
+        union {
+                struct {
+#ifndef HAVE_FILE_WRITEV
+                        struct kiocb      *via_iocb;
+#endif
+                        struct iovec      *via_iov;
+                        unsigned long      via_nrsegs;
+                } normal;
+                struct {
+                        read_actor_t       via_actor;
+                        void              *via_target;
+                } sendfile;
+                struct {
+                        struct pipe_inode_info  *via_pipe;
+                        unsigned int       via_flags;
+                } splice;
+        } u;
+};
+
+struct vvp_thread_info {
+        struct ost_lvb       vti_lvb;
+        struct cl_2queue     vti_queue;
+        struct iovec         vti_local_iov;
+        struct vvp_io_args   vti_args;
+        struct ra_io_arg     vti_ria;
+        struct kiocb         vti_kiocb;
+};
+
+static inline struct vvp_thread_info *vvp_env_info(const struct lu_env *env)
+{
+        extern struct lu_context_key vvp_key;
+        struct vvp_thread_info      *info;
+
+        info = lu_context_key_get(&env->le_ctx, &vvp_key);
+        LASSERT(info != NULL);
+        return info;
+}
+
+static inline struct vvp_io_args *vvp_env_args(const struct lu_env *env,
+                                               enum vvp_io_subtype type)
+{
+        struct vvp_io_args *ret = &vvp_env_info(env)->vti_args;
+
+        ret->via_io_subtype = type;
+
+        return ret;
+}
+
 struct vvp_session {
         struct vvp_io vs_ios;
 };
index 95e0809..740eeb4 100644 (file)
@@ -72,6 +72,8 @@
 struct page *ll_nopage(struct vm_area_struct *vma, unsigned long address,
                        int *type);
 
+static struct vm_operations_struct ll_file_vm_ops;
+
 void policy_from_vma(ldlm_policy_data_t *policy,
                             struct vm_area_struct *vma, unsigned long addr,
                             size_t count)
@@ -95,7 +97,7 @@ struct vm_area_struct * our_vma(unsigned long addr, size_t count)
         spin_lock(&mm->page_table_lock);
         for(vma = find_vma(mm, addr);
             vma != NULL && vma->vm_start < (addr + count); vma = vma->vm_next) {
-                if (vma->vm_ops && vma->vm_ops->nopage == ll_nopage &&
+                if (vma->vm_ops && vma->vm_ops == &ll_file_vm_ops &&
                     vma->vm_flags & VM_SHARED) {
                         ret = vma;
                         break;
@@ -106,6 +108,85 @@ struct vm_area_struct * our_vma(unsigned long addr, size_t count)
 }
 
 /**
+ * API independent part for page fault initialization.
+ * \param vma - virtual memory area addressed to page fault
+ * \param env - corespondent lu_env to processing
+ * \param nest - nested level
+ * \param index - page index corespondent to fault.
+ * \parm ra_flags - vma readahead flags.
+ *
+ * \return allocated and initialized env for fault operation.
+ * \retval EINVAL if env can't allocated
+ * \return other error codes from cl_io_init.
+ */
+int ll_fault_io_init(struct vm_area_struct *vma, struct lu_env **env_ret,
+                     struct cl_env_nest *nest, pgoff_t index, unsigned long *ra_flags)
+{
+        struct file       *file  = vma->vm_file;
+        struct inode      *inode = file->f_dentry->d_inode;
+        const unsigned long writable = VM_SHARED|VM_WRITE;
+        struct cl_io      *io;
+        struct cl_fault_io *fio;
+        struct lu_env     *env;
+        ENTRY;
+
+        if (ll_file_nolock(file))
+                RETURN(-EOPNOTSUPP);
+
+        /*
+         * page fault can be called when lustre IO is
+         * already active for the current thread, e.g., when doing read/write
+         * against user level buffer mapped from Lustre buffer. To avoid
+         * stomping on existing context, optionally force an allocation of a new
+         * one.
+         */
+        env = cl_env_nested_get(nest);
+        if (IS_ERR(env)) {
+                *env_ret = NULL;
+                 RETURN(-EINVAL);
+        }
+
+        *env_ret = env;
+
+        io = &ccc_env_info(env)->cti_io;
+        io->ci_obj = ll_i2info(inode)->lli_clob;
+        LASSERT(io->ci_obj != NULL);
+
+        fio = &io->u.ci_fault;
+        fio->ft_index      = vma->vm_pgoff + index;
+        fio->ft_writable   = (vma->vm_flags&writable) == writable;
+        fio->ft_executable = vma->vm_flags&VM_EXEC;
+
+        /*
+         * disable VM_SEQ_READ and use VM_RAND_READ to make sure that
+         * the kernel will not read other pages not covered by ldlm in
+         * filemap_nopage. we do our readahead in ll_readpage.
+         */
+        *ra_flags = vma->vm_flags & (VM_RAND_READ|VM_SEQ_READ);
+        vma->vm_flags &= ~VM_SEQ_READ;
+        vma->vm_flags |= VM_RAND_READ;
+
+        CDEBUG(D_INFO, "vm_flags: %lx (%lu %i %i)\n", vma->vm_flags,
+               fio->ft_index, fio->ft_writable, fio->ft_executable);
+
+        if (cl_io_init(env, io, CIT_FAULT, io->ci_obj) == 0) {
+                struct ccc_io *cio = ccc_env_io(env);
+                struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
+
+                LASSERT(cio->cui_cl.cis_io == io);
+
+                /* mmap lock must be MANDATORY
+                 * it has to cache pages. */
+                io->ci_lockreq = CILR_MANDATORY;
+
+                cio->cui_fd  = fd;
+        }
+
+        return io->ci_result;
+}
+
+#ifndef HAVE_VM_OP_FAULT
+/**
  * Lustre implementation of a vm_operations_struct::nopage() method, called by
  * VM to server page fault (both in kernel and user space).
  *
@@ -115,100 +196,109 @@ struct vm_area_struct * our_vma(unsigned long addr, size_t count)
  * \param address - address when hit fault
  * \param type - of fault
  *
- * XXX newer 2.6 kernels provide vm_operations_struct::fault() method with
- * slightly different semantics instead.
- *
- * \return allocated and filled page for address
+ * \return allocated and filled _unlocked_ page for address
  * \retval NOPAGE_SIGBUS if page not exist on this address
  * \retval NOPAGE_OOM not have memory for allocate new page
  */
 struct page *ll_nopage(struct vm_area_struct *vma, unsigned long address,
                        int *type)
 {
-        struct file       *file  = vma->vm_file;
-        struct inode      *inode = file->f_dentry->d_inode;
-        struct lu_env     *env;
-        struct cl_io      *io;
-        struct page       *page  = NULL;
-        struct cl_env_nest nest;
-        int result;
-
+        struct lu_env           *env;
+        struct cl_env_nest      nest;
+        struct cl_io            *io;
+        struct page             *page  = NOPAGE_SIGBUS;
+        struct vvp_io           *vio = NULL;
+        unsigned long           ra_flags;
+        pgoff_t                 pg_offset;
+        int                     result;
         ENTRY;
 
-        if (ll_file_nolock(file))
-                RETURN(ERR_PTR(-EOPNOTSUPP));
+        pg_offset = (address - vma->vm_start) >> PAGE_SHIFT;
+        result = ll_fault_io_init(vma, &env,  &nest, pg_offset, &ra_flags);
+        if (env == NULL)
+                return NOPAGE_SIGBUS;
 
-        /*
-         * vm_operations_struct::nopage() can be called when lustre IO is
-         * already active for the current thread, e.g., when doing read/write
-         * against user level buffer mapped from Lustre buffer. To avoid
-         * stomping on existing context, optionally force an allocation of a new
-         * one.
-         */
-        env = cl_env_nested_get(&nest);
-        if (!IS_ERR(env)) {
-                pgoff_t pg_offset;
-                const unsigned long writable = VM_SHARED|VM_WRITE;
-                unsigned long ra_flags;
-                struct cl_fault_io *fio;
-
-                io = &ccc_env_info(env)->cti_io;
-                memset(io, 0, sizeof(*io));
-                io->ci_obj = ll_i2info(inode)->lli_clob;
-                LASSERT(io->ci_obj != NULL);
-
-                fio = &io->u.ci_fault;
-                pg_offset = (address - vma->vm_start) >> PAGE_SHIFT;
-                fio->ft_index      = pg_offset + vma->vm_pgoff;
-                fio->ft_writable   = (vma->vm_flags&writable) == writable;
-                fio->ft_executable = vma->vm_flags&VM_EXEC;
-
-                /*
-                 * disable VM_SEQ_READ and use VM_RAND_READ to make sure that
-                 * the kernel will not read other pages not covered by ldlm in
-                 * filemap_nopage. we do our readahead in ll_readpage.
-                 */
-                ra_flags = vma->vm_flags & (VM_RAND_READ|VM_SEQ_READ);
-                vma->vm_flags &= ~VM_SEQ_READ;
-                vma->vm_flags |= VM_RAND_READ;
-
-                CDEBUG(D_INFO, "vm_flags: %lx (%lu %i %i)\n", vma->vm_flags,
-                       fio->ft_index, fio->ft_writable, fio->ft_executable);
-
-                if (cl_io_init(env, io, CIT_FAULT, io->ci_obj) == 0) {
-                        struct vvp_io *vio = vvp_env_io(env);
-                        struct ccc_io *cio = ccc_env_io(env);
-                        struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
-
-                        LASSERT(cio->cui_cl.cis_io == io);
-
-                        /* mmap lock must be MANDATORY. */
-                        io->ci_lockreq          = CILR_MANDATORY;
-                        vio->u.fault.ft_vma     = vma;
-                        vio->u.fault.ft_address = address;
-                        vio->u.fault.ft_type    = type;
-                        cio->cui_fd             = fd;
-
-                        result = cl_io_loop(env, io);
-                        if (result == 0) {
-                                LASSERT(fio->ft_page != NULL);
-                                page = cl_page_vmpage(env, fio->ft_page);
-                        } else if (result == -EFAULT) {
-                                page = NOPAGE_SIGBUS;
-                        } else if (result == -ENOMEM) {
-                                page = NOPAGE_OOM;
-                        }
-                } else
-                        result = io->ci_result;
-
-                vma->vm_flags &= ~VM_RAND_READ;
-                vma->vm_flags |= ra_flags;
-
-                cl_io_fini(env, io);
-                cl_env_nested_put(&nest, env);
+        io = &ccc_env_info(env)->cti_io;
+        if (result < 0)
+                goto out_err;
+
+        vio = vvp_env_io(env);
+
+        vio->u.fault.ft_vma            = vma;
+        vio->u.fault.nopage.ft_address = address;
+        vio->u.fault.nopage.ft_type    = type;
+
+        result = cl_io_loop(env, io);
+
+out_err:
+        if (result == 0) {
+                LASSERT(io->u.ci_fault.ft_page != NULL);
+                page = vio->u.fault.ft_vmpage;
+        } else {
+                if (result == -ENOMEM)
+                        page = NOPAGE_OOM;
         }
+
+        vma->vm_flags &= ~VM_RAND_READ;
+        vma->vm_flags |= ra_flags;
+
+        cl_io_fini(env, io);
+        cl_env_nested_put(&nest, env);
+
         RETURN(page);
 }
+#else
+/**
+ * Lustre implementation of a vm_operations_struct::fault() method, called by
+ * VM to server page fault (both in kernel and user space).
+ *
+ * \param vma - is virtiual area struct related to page fault
+ * \param vmf - structure which describe type and address where hit fault
+ *
+ * \return allocated and filled _locked_ page for address
+ * \retval VM_FAULT_ERROR on general error
+ * \retval NOPAGE_OOM not have memory for allocate new page
+ */
+int ll_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+{
+        struct lu_env           *env;
+        struct cl_io            *io;
+        struct vvp_io           *vio = NULL;
+        unsigned long            ra_flags;
+        struct cl_env_nest       nest;
+        int                      result;
+        int                      fault_ret = 0;
+        ENTRY;
+
+        result = ll_fault_io_init(vma, &env,  &nest, vmf->pgoff, &ra_flags);
+        if (env == NULL)
+                RETURN(VM_FAULT_ERROR);
+
+        io = &ccc_env_info(env)->cti_io;
+        if (result < 0)
+                goto out_err;
+
+        vio = vvp_env_io(env);
+
+        vio->u.fault.ft_vma       = vma;
+        vio->u.fault.fault.ft_vmf = vmf;
+
+        result = cl_io_loop(env, io);
+        fault_ret = vio->u.fault.fault.ft_flags;
+
+out_err:
+        if (result != 0)
+                fault_ret |= VM_FAULT_ERROR;
+
+        vma->vm_flags |= ra_flags;
+
+        cl_io_fini(env, io);
+        cl_env_nested_put(&nest, env);
+
+        RETURN(fault_ret);
+}
+
+#endif
 
 /**
  *  To avoid cancel the locks covering mmapped region for lock cache pressure,
@@ -241,6 +331,7 @@ static void ll_vm_close(struct vm_area_struct *vma)
         EXIT;
 }
 
+#ifndef HAVE_VM_OP_FAULT
 #ifndef HAVE_FILEMAP_POPULATE
 static int (*filemap_populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
 #endif
@@ -255,6 +346,7 @@ static int ll_populate(struct vm_area_struct *area, unsigned long address,
         rc = filemap_populate(area, address, len, prot, pgoff, 1);
         RETURN(rc);
 }
+#endif
 
 /* return the user space pointer that maps to a file offset via a vma */
 static inline unsigned long file_to_user(struct vm_area_struct *vma, __u64 byte)
@@ -281,10 +373,15 @@ int ll_teardown_mmaps(struct address_space *mapping, __u64 first, __u64 last)
 }
 
 static struct vm_operations_struct ll_file_vm_ops = {
+#ifndef HAVE_VM_OP_FAULT
         .nopage         = ll_nopage,
+        .populate       = ll_populate,
+
+#else
+        .fault          = ll_fault,
+#endif
         .open           = ll_vm_open,
         .close          = ll_vm_close,
-        .populate       = ll_populate,
 };
 
 int ll_file_mmap(struct file *file, struct vm_area_struct * vma)
@@ -299,7 +396,7 @@ int ll_file_mmap(struct file *file, struct vm_area_struct * vma)
         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_MAP, 1);
         rc = generic_file_mmap(file, vma);
         if (rc == 0) {
-#if !defined(HAVE_FILEMAP_POPULATE)
+#if !defined(HAVE_FILEMAP_POPULATE) && !defined(HAVE_VM_OP_FAULT)
                 if (!filemap_populate)
                         filemap_populate = vma->vm_ops->populate;
 #endif
index 0f72d19..98e1e62 100644 (file)
@@ -67,8 +67,7 @@ static int ll_nfs_test_inode(struct inode *inode, void *opaque)
 }
 
 static struct inode *search_inode_for_lustre(struct super_block *sb,
-                                             struct lu_fid *fid,
-                                             int mode)
+                                             const struct lu_fid *fid)
 {
         struct ll_sb_info     *sbi = ll_s2sbi(sb);
         struct ptlrpc_request *req = NULL;
@@ -85,13 +84,13 @@ static struct inode *search_inode_for_lustre(struct super_block *sb,
         if (inode)
                 RETURN(inode);
 
-        if (S_ISREG(mode)) {
-                rc = ll_get_max_mdsize(sbi, &eadatalen);
-                if (rc) 
-                        RETURN(ERR_PTR(rc)); 
-                valid |= OBD_MD_FLEASIZE;
-        }
+        rc = ll_get_max_mdsize(sbi, &eadatalen);
+        if (rc)
+                RETURN(ERR_PTR(rc));
+
+        valid |= OBD_MD_FLEASIZE;
 
+        /* mds_fid2dentry ignores f_type */
         rc = md_getattr(sbi->ll_md_exp, fid, NULL, valid, eadatalen, &req);
         if (rc) {
                 CERROR("can't get object attrs, fid "DFID", rc %d\n",
@@ -108,8 +107,7 @@ static struct inode *search_inode_for_lustre(struct super_block *sb,
 }
 
 static struct dentry *ll_iget_for_nfs(struct super_block *sb,
-                                      struct lu_fid *fid,
-                                      umode_t mode)
+                                      const struct lu_fid *fid)
 {
         struct inode  *inode;
         struct dentry *result;
@@ -119,7 +117,7 @@ static struct dentry *ll_iget_for_nfs(struct super_block *sb,
         if (!fid_is_sane(fid))
                 RETURN(ERR_PTR(-ESTALE));
 
-        inode = search_inode_for_lustre(sb, fid, mode);
+        inode = search_inode_for_lustre(sb, fid);
         if (IS_ERR(inode))
                 RETURN(ERR_PTR(PTR_ERR(inode)));
 
@@ -142,85 +140,104 @@ static struct dentry *ll_iget_for_nfs(struct super_block *sb,
         RETURN(result);
 }
 
+#define LUSTRE_NFS_FID          0x97
+
+struct lustre_nfs_fid {
+        struct lu_fid   lnf_child;
+        struct lu_fid   lnf_parent;
+};
+
+/**
+ * \a connectable - is nfsd will connect himself or this should be done
+ *                  at lustre
+ *
+ * The return value is file handle type:
+ * 1 -- contains child file handle;
+ * 2 -- contains child file handle and parent file handle;
+ * 255 -- error.
+ */
+static int ll_encode_fh(struct dentry *de, __u32 *fh, int *plen,
+                        int connectable)
+{
+        struct inode *inode = de->d_inode;
+        struct inode *parent = de->d_parent->d_inode;
+        struct lustre_nfs_fid *nfs_fid = (void *)fh;
+        ENTRY;
+
+        CDEBUG(D_INFO, "encoding for (%lu,"DFID") maxlen=%d minlen=%d\n",
+              inode->i_ino, PFID(ll_inode2fid(inode)), *plen,
+              (int)sizeof(struct lustre_nfs_fid));
+
+        if (*plen < sizeof(struct lustre_nfs_fid)/4)
+                RETURN(255);
+
+        nfs_fid->lnf_child = *ll_inode2fid(inode);
+        nfs_fid->lnf_parent = *ll_inode2fid(parent);
+        *plen = sizeof(struct lustre_nfs_fid)/4;
+
+        RETURN(LUSTRE_NFS_FID);
+}
+
+#ifdef HAVE_FH_TO_DENTRY
+static struct dentry *ll_fh_to_dentry(struct super_block *sb, struct fid *fid,
+                                      int fh_len, int fh_type)
+{
+        struct lustre_nfs_fid *nfs_fid = (struct lustre_nfs_fid *)fid;
+
+        if (fh_type != LUSTRE_NFS_FID)
+                RETURN(ERR_PTR(-EPROTO));
+
+        RETURN(ll_iget_for_nfs(sb, &nfs_fid->lnf_child));
+}
+
+static struct dentry *ll_fh_to_parent(struct super_block *sb, struct fid *fid,
+                                      int fh_len, int fh_type)
+{
+        struct lustre_nfs_fid *nfs_fid = (struct lustre_nfs_fid *)fid;
+
+        if (fh_type != LUSTRE_NFS_FID)
+                RETURN(ERR_PTR(-EPROTO));
+
+        RETURN(ll_iget_for_nfs(sb, &nfs_fid->lnf_parent));
+}
+
+#else
+
 /*
  * This length is counted as amount of __u32,
- *  It is composed of a fid and a mode 
+ *  It is composed of a fid and a mode
  */
-#define ONE_FH_LEN (sizeof(struct lu_fid)/4 + 1)
-
 static struct dentry *ll_decode_fh(struct super_block *sb, __u32 *fh, int fh_len,
                                    int fh_type,
                                    int (*acceptable)(void *, struct dentry *),
                                    void *context)
 {
-        struct lu_fid *parent = NULL;
-        struct lu_fid *child;
+        struct lustre_nfs_fid *nfs_fid = (void *)fh;
         struct dentry *entry;
         ENTRY;
 
-        CDEBUG(D_INFO, "decoding for "DFID" fh_len=%d fh_type=%d\n", 
-                PFID((struct lu_fid*)fh), fh_len, fh_type);
+        CDEBUG(D_INFO, "decoding for "DFID" fh_len=%d fh_type=%x\n", 
+                PFID(&nfs_fid->lnf_child), fh_len, fh_type);
 
-        if (fh_type != 1 && fh_type != 2)
-                RETURN(ERR_PTR(-ESTALE));
-        if (fh_len < ONE_FH_LEN * fh_type)
-                RETURN(ERR_PTR(-ESTALE));
+        if (fh_type != LUSTRE_NFS_FID)
+                RETURN(ERR_PTR(-EPROTO));
 
-        child = (struct lu_fid*)fh;
-        if (fh_type == 2)
-                parent = (struct lu_fid*)(fh + ONE_FH_LEN);
-                
-        entry = sb->s_export_op->find_exported_dentry(sb, child, parent,
+        entry = sb->s_export_op->find_exported_dentry(sb, &nfs_fid->lnf_child,
+                                                      &nfs_fid->lnf_parent,
                                                       acceptable, context);
         RETURN(entry);
 }
 
-/* The return value is file handle type:
- * 1 -- contains child file handle;
- * 2 -- contains child file handle and parent file handle;
- * 255 -- error.
- */
-static int ll_encode_fh(struct dentry *de, __u32 *fh, int *plen, int connectable)
-{
-        struct inode    *inode = de->d_inode;
-        struct lu_fid   *fid = ll_inode2fid(inode);
-        ENTRY;
-
-        CDEBUG(D_INFO, "encoding for (%lu,"DFID") maxlen=%d minlen=%d\n",
-                       inode->i_ino, PFID(fid), *plen, (int)ONE_FH_LEN);
-
-        if (*plen < ONE_FH_LEN)
-                RETURN(255);
-
-        memcpy((char*)fh, fid, sizeof(*fid));
-        *(fh + ONE_FH_LEN - 1) = (__u32)(S_IFMT & inode->i_mode);
-
-        if (de->d_parent && *plen >= ONE_FH_LEN * 2) {
-                struct inode *parent = de->d_parent->d_inode;
-                fh += ONE_FH_LEN;
-                memcpy((char*)fh, &ll_i2info(parent)->lli_fid, sizeof(*fid));
-                *(fh + ONE_FH_LEN - 1) = (__u32)(S_IFMT & parent->i_mode);
-                *plen = ONE_FH_LEN * 2;
-                RETURN(2);
-        } else {
-                *plen = ONE_FH_LEN;
-                RETURN(1);
-        }
-}
-
 static struct dentry *ll_get_dentry(struct super_block *sb, void *data)
 {
-        struct lu_fid      *fid;
+        struct lustre_nfs_fid *fid = data;
         struct dentry      *entry;
-        __u32               mode;
         ENTRY;
 
-        fid = (struct lu_fid *)data;
-        mode = *((__u32*)data + ONE_FH_LEN - 1);
-        
-        entry = ll_iget_for_nfs(sb, fid, mode);
+        entry = ll_iget_for_nfs(sb, &fid->lnf_child);
         RETURN(entry);
 }
+#endif
 
 static struct dentry *ll_get_parent(struct dentry *dchild)
 {
@@ -232,11 +249,11 @@ static struct dentry *ll_get_parent(struct dentry *dchild)
         static char           dotdot[] = "..";
         int                   rc;
         ENTRY;
-        
+
         LASSERT(dir && S_ISDIR(dir->i_mode));
-        
+
         sbi = ll_s2sbi(dir->i_sb);
+
         CDEBUG(D_INFO, "getting parent for (%lu,"DFID")\n", 
                         dir->i_ino, PFID(ll_inode2fid(dir)));
 
@@ -249,19 +266,24 @@ static struct dentry *ll_get_parent(struct dentry *dchild)
         }
         body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
         LASSERT(body->valid & OBD_MD_FLID);
-        
+
         CDEBUG(D_INFO, "parent for "DFID" is "DFID"\n", 
                 PFID(ll_inode2fid(dir)), PFID(&body->fid1));
 
-        result = ll_iget_for_nfs(dir->i_sb, &body->fid1, S_IFDIR);
+        result = ll_iget_for_nfs(dir->i_sb, &body->fid1);
 
         ptlrpc_req_finished(req);
         RETURN(result);
-} 
+}
 
 struct export_operations lustre_export_operations = {
        .get_parent = ll_get_parent,
-       .get_dentry = ll_get_dentry,
        .encode_fh  = ll_encode_fh,
+#ifdef HAVE_FH_TO_DENTRY
+        .fh_to_dentry = ll_fh_to_dentry,
+        .fh_to_parent = ll_fh_to_parent,
+#else
+       .get_dentry = ll_get_dentry,
        .decode_fh  = ll_decode_fh,
+#endif
 };
index f3a4410..0acd41e 100644 (file)
@@ -145,7 +145,7 @@ struct lloop_device {
         atomic_t             lo_pending;
         wait_queue_head_t    lo_bh_wait;
 
-        request_queue_t     *lo_queue;
+        struct request_queue *lo_queue;
 
         const struct lu_env *lo_env;
         struct cl_io         lo_io;
@@ -342,7 +342,7 @@ static unsigned int loop_get_bio(struct lloop_device *lo, struct bio **req)
         return count;
 }
 
-static int loop_make_request(request_queue_t *q, struct bio *old_bio)
+static int loop_make_request(struct request_queue *q, struct bio *old_bio)
 {
         struct lloop_device *lo = q->queuedata;
         int rw = bio_rw(old_bio);
@@ -372,14 +372,14 @@ static int loop_make_request(request_queue_t *q, struct bio *old_bio)
         loop_add_bio(lo, old_bio);
         return 0;
 err:
-        bio_io_error(old_bio, old_bio->bi_size);
+        cfs_bio_io_error(old_bio, old_bio->bi_size);
         return 0;
 }
 
 /*
  * kick off io on the underlying address space
  */
-static void loop_unplug(request_queue_t *q)
+static void loop_unplug(struct request_queue *q)
 {
         struct lloop_device *lo = q->queuedata;
 
@@ -394,7 +394,7 @@ static inline void loop_handle_bio(struct lloop_device *lo, struct bio *bio)
         while (bio) {
                 struct bio *tmp = bio->bi_next;
                 bio->bi_next = NULL;
-                bio_endio(bio, bio->bi_size, ret);
+                cfs_bio_endio(bio, bio->bi_size, ret);
                 bio = tmp;
         }
 }
@@ -835,7 +835,7 @@ static int __init lloop_init(void)
 
 out_mem4:
         while (i--)
-                blk_put_queue(loop_dev[i].lo_queue);
+                blk_cleanup_queue(loop_dev[i].lo_queue);
         i = max_loop;
 out_mem3:
         while (i--)
@@ -857,7 +857,7 @@ static void lloop_exit(void)
         ll_iocontrol_unregister(ll_iocontrol_magic);
         for (i = 0; i < max_loop; i++) {
                 del_gendisk(disks[i]);
-                blk_put_queue(loop_dev[i].lo_queue);
+                blk_cleanup_queue(loop_dev[i].lo_queue);
                 put_disk(disks[i]);
         }
         if (ll_unregister_blkdev(lloop_major, "lloop"))
index 7a446dd..5cbab48 100644 (file)
@@ -172,7 +172,7 @@ static LL_FOLLOW_LINK_RETURN_TYPE ll_follow_link(struct dentry *dentry,
                 ll_inode_size_unlock(inode, 0);
         }
         if (rc) {
-                path_release(nd); /* Kernel assumes that ->follow_link()
+                cfs_path_put(nd); /* Kernel assumes that ->follow_link()
                                      releases nameidata on error */
                 GOTO(out, rc);
         }
index 760be79..68f9e8d 100644 (file)
 static struct vvp_io *cl2vvp_io(const struct lu_env *env,
                                 const struct cl_io_slice *slice);
 
+/**
+ * True, if \a io is a normal io, False for sendfile() / splice_{read|write}
+ */
+int cl_is_normalio(const struct lu_env *env, const struct cl_io *io)
+{
+        struct vvp_io *vio = vvp_env_io(env);
+
+        LASSERT(io->ci_type == CIT_READ || io->ci_type == CIT_WRITE);
+
+        return vio->cui_io_subtype == IO_NORMAL;
+}
+
 /*****************************************************************************
  *
  * io operations.
@@ -131,7 +143,7 @@ static int vvp_mmap_locks(const struct lu_env *env,
 
         LASSERT(io->ci_type == CIT_READ || io->ci_type == CIT_WRITE);
 
-        if (cl_io_is_sendfile(io))
+        if (!cl_is_normalio(env, io))
                 RETURN(0);
 
         for (seg = 0; seg < vio->cui_nrsegs; seg++) {
@@ -458,11 +470,27 @@ static int vvp_io_read_start(const struct lu_env *env,
 
         /* BUG: 5972 */
         file_accessed(file);
-        if (cl_io_is_sendfile(io)) {
+        switch (vio->cui_io_subtype) {
+        case IO_NORMAL:
+                 result = lustre_generic_file_read(file, cio, &pos);
+                 break;
+#ifdef HAVE_KERNEL_SENDFILE
+        case IO_SENDFILE:
                 result = generic_file_sendfile(file, &pos, cnt,
-                                vio->u.read.cui_actor, vio->u.read.cui_target);
-        } else {
-                result = lustre_generic_file_read(file, cio, &pos);
+                                vio->u.sendfile.cui_actor,
+                                vio->u.sendfile.cui_target);
+                break;
+#endif
+#ifdef HAVE_KERNEL_SPLICE_READ
+        case IO_SPLICE:
+                result = generic_file_splice_read(file, &pos,
+                                vio->u.splice.cui_pipe, cnt,
+                                vio->u.splice.cui_flags);
+                break;
+#endif
+        default:
+                CERROR("Wrong IO type %u\n", vio->cui_io_subtype);
+                LBUG();
         }
 
 out:
@@ -520,6 +548,69 @@ static int vvp_io_write_start(const struct lu_env *env,
         RETURN(result);
 }
 
+#ifndef HAVE_VM_OP_FAULT
+static int vvp_io_kernel_fault(struct vvp_fault_io *cfio)
+{
+        cfs_page_t *vmpage;
+
+        vmpage = filemap_nopage(cfio->ft_vma, cfio->nopage.ft_address,
+                                cfio->nopage.ft_type);
+
+        if (vmpage == NOPAGE_SIGBUS) {
+                CDEBUG(D_PAGE, "got addr %lu type %lx - SIGBUS\n",
+                       cfio->nopage.ft_address,(long)cfio->nopage.ft_type);
+                return -EFAULT;
+        } else if (vmpage == NOPAGE_OOM) {
+                CDEBUG(D_PAGE, "got addr %lu type %lx - OOM\n",
+                       cfio->nopage.ft_address, (long)cfio->nopage.ft_type);
+                return -ENOMEM;
+        }
+
+        LL_CDEBUG_PAGE(D_PAGE, vmpage, "got addr %lu type %lx\n",
+                       cfio->nopage.ft_address, (long)cfio->nopage.ft_type);
+
+        cfio->ft_vmpage = vmpage;
+
+        return 0;
+}
+#else
+static int vvp_io_kernel_fault(struct vvp_fault_io *cfio)
+{
+        cfio->fault.ft_flags = filemap_fault(cfio->ft_vma, cfio->fault.ft_vmf);
+
+        if (cfio->fault.ft_vmf->page) {
+                LL_CDEBUG_PAGE(D_PAGE, cfio->fault.ft_vmf->page,
+                               "got addr %p type NOPAGE\n",
+                               cfio->fault.ft_vmf->virtual_address);
+                /*XXX workaround to bug in CLIO - he deadlocked with
+                 lock cancel if page locked  */
+                if (likely(cfio->fault.ft_flags & VM_FAULT_LOCKED)) {
+                        unlock_page(cfio->fault.ft_vmf->page);
+                        cfio->fault.ft_flags &= ~VM_FAULT_LOCKED;
+                }
+
+                cfio->ft_vmpage = cfio->fault.ft_vmf->page;
+                return 0;
+        }
+
+        if (unlikely (cfio->fault.ft_flags & VM_FAULT_ERROR)) {
+                CDEBUG(D_PAGE, "got addr %p - SIGBUS\n",
+                       cfio->fault.ft_vmf->virtual_address);
+                return -EFAULT;
+        }
+
+        if (unlikely (cfio->fault.ft_flags & VM_FAULT_NOPAGE)) {
+                CDEBUG(D_PAGE, "got addr %p - OOM\n",
+                       cfio->fault.ft_vmf->virtual_address);
+                return -ENOMEM;
+        }
+
+        CERROR("unknow error in page fault!\n");
+        return -EINVAL;
+}
+
+#endif
+
 static int vvp_io_fault_start(const struct lu_env *env,
                               const struct cl_io_slice *ios)
 {
@@ -529,9 +620,12 @@ static int vvp_io_fault_start(const struct lu_env *env,
         struct inode        *inode   = ccc_object_inode(obj);
         struct cl_fault_io  *fio     = &io->u.ci_fault;
         struct vvp_fault_io *cfio    = &vio->u.fault;
-        cfs_page_t          *vmpage;
         loff_t               offset;
+        int                  kernel_result = 0;
         int                  result  = 0;
+        struct cl_page      *page;
+        loff_t               size;
+        pgoff_t              last; /* last page in a file data region */
 
         LASSERT(vio->cui_oneshot == 0);
 
@@ -548,55 +642,44 @@ static int vvp_io_fault_start(const struct lu_env *env,
         if (result != 0)
                 return result;
 
-        vmpage = filemap_nopage(cfio->ft_vma, cfio->ft_address, cfio->ft_type);
-        if (vmpage != NOPAGE_SIGBUS && vmpage != NOPAGE_OOM)
-                LL_CDEBUG_PAGE(D_PAGE, vmpage,
-                               "got addr %lu type %lx\n",
-                               cfio->ft_address, (long)cfio->ft_type);
-        else
-                CDEBUG(D_PAGE, "got addr %lu type %lx - SIGBUS\n",
-                       cfio->ft_address, (long)cfio->ft_type);
-
-        if (vmpage == NOPAGE_SIGBUS)
-                result = -EFAULT;
-        else if (vmpage == NOPAGE_OOM)
-                result = -ENOMEM;
-        else {
-                struct cl_page *page;
-                loff_t          size;
-                pgoff_t         last; /* last page in a file data region */
-
-                /* Temporarily lock vmpage to keep cl_page_find() happy. */
-                lock_page(vmpage);
-                page = cl_page_find(env, obj, fio->ft_index, vmpage,
-                                    CPT_CACHEABLE);
-                unlock_page(vmpage);
-                if (!IS_ERR(page)) {
-                        size = i_size_read(inode);
-                        last = cl_index(obj, size - 1);
-                        if (fio->ft_index == last)
-                                /*
-                                 * Last page is mapped partially.
-                                 */
-                                fio->ft_nob = size - cl_offset(obj,
-                                                               fio->ft_index);
-                        else
-                                fio->ft_nob = cl_page_size(obj);
-                        lu_ref_add(&page->cp_reference, "fault", io);
-                        fio->ft_page = page;
-                        /*
-                         * Certain 2.6 kernels return not-NULL from
-                         * filemap_nopage() when page is beyond the file size,
-                         * on the grounds that "An external ptracer can access
-                         * pages that normally aren't accessible.." Don't
-                         * propagate such page fault to the lower layers to
-                         * avoid side-effects like KMS updates.
-                         */
-                        if (fio->ft_index > last)
-                                result = +1;
-                } else
-                        result = PTR_ERR(page);
+        /* must return locked page */
+        kernel_result = vvp_io_kernel_fault(cfio);
+        if (kernel_result != 0)
+                return kernel_result;
+        /* Temporarily lock vmpage to keep cl_page_find() happy. */
+        lock_page(cfio->ft_vmpage);
+        page = cl_page_find(env, obj, fio->ft_index, cfio->ft_vmpage,
+                            CPT_CACHEABLE);
+        unlock_page(cfio->ft_vmpage);
+        if (IS_ERR(page)) {
+                page_cache_release(cfio->ft_vmpage);
+                cfio->ft_vmpage = NULL;
+                return PTR_ERR(page);
         }
+
+        size = i_size_read(inode);
+        last = cl_index(obj, size - 1);
+        if (fio->ft_index == last)
+                /*
+                 * Last page is mapped partially.
+                 */
+                fio->ft_nob = size - cl_offset(obj, fio->ft_index);
+         else
+                fio->ft_nob = cl_page_size(obj);
+
+         lu_ref_add(&page->cp_reference, "fault", io);
+         fio->ft_page = page;
+         /*
+          * Certain 2.6 kernels return not-NULL from
+          * filemap_nopage() when page is beyond the file size,
+          * on the grounds that "An external ptracer can access
+          * pages that normally aren't accessible.." Don't
+          * propagate such page fault to the lower layers to
+          * avoid side-effects like KMS updates.
+          */
+          if (fio->ft_index > last)
+                result = +1;
+
         return result;
 }
 
index 36d126d..2ebd5fa 100644 (file)
 #include <linux/version.h>
 #include <linux/bitops.h>
 #include <linux/quota.h>
-#include <linux/quotaio_v1.h>
-#include <linux/quotaio_v2.h>
+#ifdef HAVE_QUOTAIO_V1_H
+# include <linux/quotaio_v1.h>
+# include <linux/quotaio_v2.h>
+#else
+# include <quotaio_v1.h>
+# include <quotaio_v2.h>
+# include <quota_tree.h>
+# define V2_DQTREEOFF    QT_TREEOFF
+#endif
+
 #if defined(HAVE_EXT3_XATTR_H)
 #include <ext3/xattr.h>
 #else
@@ -408,7 +416,7 @@ static int fsfilt_ext3_credits_needed(int objcount, struct fsfilt_objinfo *fso,
         /* We assume that there will be 1 bit set in s_dquot.flags for each
          * quota file that is active.  This is at least true for now.
          */
-        needed += hweight32(sb_any_quota_enabled(sb)) *
+        needed += hweight32(ll_sb_any_quota_active(sb)) *
                 FSFILT_SINGLEDATA_TRANS_BLOCKS(sb);
 #endif
 
@@ -1487,15 +1495,10 @@ static int fsfilt_ext3_quotactl(struct super_block *sb,
 
                                 LASSERT(oqc->qc_id == LUSTRE_QUOTA_V2);
 
-                                if (!qcop->quota_on)
-                                        GOTO(out, rc = -ENOSYS);
-
-                                rc = qcop->quota_on(sb, i, QFMT_VFS_V0,
-                                                    name[i]);
+                                rc = ll_quota_on(sb, i, QFMT_VFS_V0,
+                                                 name[i], 0);
                         } else if (oqc->qc_cmd == Q_QUOTAOFF) {
-                                if (!qcop->quota_off)
-                                        GOTO(out, rc = -ENOSYS);
-                                rc = qcop->quota_off(sb, i);
+                                rc = ll_quota_off(sb, i, 0);
                         }
 
                         if (rc == -EBUSY)
index 937e496..9508437 100644 (file)
@@ -50,7 +50,9 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/quotaio_v1.h>
+#ifdef HAVE_QUOTAIO_V1_H
+# include <linux/quotaio_v1.h>
+#endif
 
 #include <asm/byteorder.h>
 #include <asm/uaccess.h>
index 1b4ab82..82b2d66 100644 (file)
@@ -117,10 +117,10 @@ void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx,
         OBD_SET_CTXT_MAGIC(save);
 
         save->fs = get_fs();
-        LASSERT(atomic_read(&current->fs->pwd->d_count));
+        LASSERT(atomic_read(&cfs_fs_pwd(current->fs)->d_count));
         LASSERT(atomic_read(&new_ctx->pwd->d_count));
-        save->pwd = dget(current->fs->pwd);
-        save->pwdmnt = mntget(current->fs->pwdmnt);
+        save->pwd = dget(cfs_fs_pwd(current->fs));
+        save->pwdmnt = mntget(cfs_fs_mnt(current->fs));
         save->luc.luc_umask = current->fs->umask;
         save->ngroups = current->group_info->ngroups;
 
@@ -159,10 +159,10 @@ void pop_ctxt(struct lvfs_run_ctxt *saved, struct lvfs_run_ctxt *new_ctx,
         ASSERT_CTXT_MAGIC(saved->magic);
         ASSERT_KERNEL_CTXT("popping non-kernel context!\n");
 
-        LASSERTF(current->fs->pwd == new_ctx->pwd, "%p != %p\n",
-                 current->fs->pwd, new_ctx->pwd);
-        LASSERTF(current->fs->pwdmnt == new_ctx->pwdmnt, "%p != %p\n",
-                 current->fs->pwdmnt, new_ctx->pwdmnt);
+        LASSERTF(cfs_fs_pwd(current->fs) == new_ctx->pwd, "%p != %p\n",
+                 cfs_fs_pwd(current->fs), new_ctx->pwd);
+        LASSERTF(cfs_fs_mnt(current->fs) == new_ctx->pwdmnt, "%p != %p\n",
+                 cfs_fs_mnt(current->fs), new_ctx->pwdmnt);
 
         set_fs(saved->fs);
         ll_set_fs_pwd(current->fs, saved->pwdmnt, saved->pwd);
index 0258d5f..8aa1c76 100644 (file)
@@ -151,16 +151,14 @@ static int lproc_mdc_wr_changelog(struct file *file, const char *buffer,
         struct changelog_show cs = {};
         int rc;
 
-        CDEBUG(D_CHANGELOG, "file pid %d\n", file->f_owner.pid);
-
         if (count != sizeof(cs))
                 return -EINVAL;
 
         if (copy_from_user(&cs, buffer, sizeof(cs)))
                 return -EFAULT;
 
-        CDEBUG(D_CHANGELOG, "changelog to pid=%d(%d) start "LPU64"\n",
-               cs.cs_pid, file->f_owner.pid, cs.cs_startrec);
+        CDEBUG(D_CHANGELOG, "changelog to pid=%d start "LPU64"\n",
+               cs.cs_pid, cs.cs_startrec);
 
         /* Set up the remote catalog handle */
         ctxt = llog_get_context(obd, LLOG_CHANGELOG_REPL_CTXT);
index 8652566..339487f 100644 (file)
@@ -568,7 +568,7 @@ static int mgc_fs_setup(struct obd_device *obd, struct super_block *sb,
         obd->obd_lvfs_ctxt.fs = get_ds();
 
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-        dentry = lookup_one_len(MOUNT_CONFIGS_DIR, current->fs->pwd,
+        dentry = lookup_one_len(MOUNT_CONFIGS_DIR, cfs_fs_pwd(current->fs),
                                 strlen(MOUNT_CONFIGS_DIR));
         pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
         if (IS_ERR(dentry)) {
index c15e96d..476b8ff 100644 (file)
@@ -246,11 +246,7 @@ int capa_hmac(__u8 *hmac, struct lustre_capa *capa, __u8 *key)
         struct ll_crypto_hash *tfm;
         struct capa_hmac_alg  *alg;
         int keylen;
-        struct scatterlist sl = {
-                .page   = virt_to_page(capa),
-                .offset = (unsigned long)(capa) % CFS_PAGE_SIZE,
-                .length = offsetof(struct lustre_capa, lc_hmac),
-        };
+        struct scatterlist sl;
 
         if (capa_alg(capa) != CAPA_HMAC_ALG_SHA1) {
                 CERROR("unknown capability hmac algorithm!\n");
@@ -267,6 +263,10 @@ int capa_hmac(__u8 *hmac, struct lustre_capa *capa, __u8 *key)
         }
         keylen = alg->ha_keylen;
 
+        sg_set_page(&sl, virt_to_page(capa),
+                    offsetof(struct lustre_capa, lc_hmac),
+                    (unsigned long)(capa) % CFS_PAGE_SIZE);
+
         ll_crypto_hmac(tfm, key, &keylen, &sl, sl.length, hmac);
         ll_crypto_free_hash(tfm);
 
@@ -276,16 +276,8 @@ int capa_hmac(__u8 *hmac, struct lustre_capa *capa, __u8 *key)
 int capa_encrypt_id(__u32 *d, __u32 *s, __u8 *key, int keylen)
 {
         struct ll_crypto_cipher *tfm;
-        struct scatterlist sd = {
-                .page   = virt_to_page(d),
-                .offset = (unsigned long)(d) % CFS_PAGE_SIZE,
-                .length = 16,
-        };
-        struct scatterlist ss = {
-                .page   = virt_to_page(s),
-                .offset = (unsigned long)(s) % CFS_PAGE_SIZE,
-                .length = 16,
-        };
+        struct scatterlist sd;
+        struct scatterlist ss;
         struct blkcipher_desc desc;
         unsigned int min;
         int rc;
@@ -312,6 +304,11 @@ int capa_encrypt_id(__u32 *d, __u32 *s, __u8 *key, int keylen)
                 GOTO(out, rc);
         }
 
+        sg_set_page(&sd, virt_to_page(d), 16,
+                    (unsigned long)(d) % CFS_PAGE_SIZE);
+
+        sg_set_page(&ss, virt_to_page(s), 16,
+                    (unsigned long)(s) % CFS_PAGE_SIZE);
         desc.tfm   = tfm;
         desc.info  = NULL;
         desc.flags = 0;
@@ -331,16 +328,8 @@ out:
 int capa_decrypt_id(__u32 *d, __u32 *s, __u8 *key, int keylen)
 {
         struct ll_crypto_cipher *tfm;
-        struct scatterlist sd = {
-                .page   = virt_to_page(d),
-                .offset = (unsigned long)(d) % CFS_PAGE_SIZE,
-                .length = 16,
-        };
-        struct scatterlist ss = {
-                .page   = virt_to_page(s),
-                .offset = (unsigned long)(s) % CFS_PAGE_SIZE,
-                .length = 16,
-        };
+        struct scatterlist sd;
+        struct scatterlist ss;
         struct blkcipher_desc desc;
         unsigned int min;
         int rc;
@@ -367,6 +356,12 @@ int capa_decrypt_id(__u32 *d, __u32 *s, __u8 *key, int keylen)
                 GOTO(out, rc);
         }
 
+        sg_set_page(&sd, virt_to_page(d), 16,
+                    (unsigned long)(d) % CFS_PAGE_SIZE);
+
+        sg_set_page(&ss, virt_to_page(s), 16,
+                    (unsigned long)(s) % CFS_PAGE_SIZE);
+
         desc.tfm   = tfm;
         desc.info  = NULL;
         desc.flags = 0;
index 0b15d63..fffe551 100644 (file)
@@ -75,15 +75,6 @@ static inline int cl_io_is_loopable(const struct cl_io *io)
 }
 
 /**
- * True, iff \a io is a sendfile().
- */
-int cl_io_is_sendfile(const struct cl_io *io)
-{
-        return io->ci_type == CIT_READ && io->u.ci_rd.rd_is_sendfile;
-}
-EXPORT_SYMBOL(cl_io_is_sendfile);
-
-/**
  * Returns true iff there is an IO ongoing in the given environment.
  */
 int cl_io_is_going(const struct lu_env *env)
index 46f30d8..520de12 100644 (file)
@@ -419,7 +419,7 @@ int class_procfs_init(void)
         ENTRY;
 
         obd_sysctl_init();
-        proc_lustre_root = lprocfs_register("lustre", proc_root_fs,
+        proc_lustre_root = lprocfs_register("fs/lustre", NULL,
                                             lprocfs_base, NULL);
         rc = lprocfs_seq_create(proc_lustre_root, "devices", 0444,
                                 &obd_device_list_fops, NULL);
index 24f50e6..86813fb 100644 (file)
@@ -56,6 +56,8 @@
 
 cfs_sysctl_table_header_t *obd_table_header = NULL;
 
+#ifndef HAVE_SYSCTL_UNNUMBERED
+
 #define OBD_SYSCTL 300
 
 enum {
@@ -80,6 +82,33 @@ enum {
         OBD_AT_HISTORY,
 };
 
+#else
+
+#define OBD_SYSCTL              CTL_UNNUMBERED
+
+#define OBD_FAIL_LOC            CTL_UNNUMBERED
+#define OBD_FAIL_VAL            CTL_UNNUMBERED
+#define OBD_TIMEOUT             CTL_UNNUMBERED
+#define OBD_DUMP_ON_TIMEOUT     CTL_UNNUMBERED
+#define OBD_MEMUSED             CTL_UNNUMBERED
+#define OBD_PAGESUSED           CTL_UNNUMBERED
+#define OBD_MAXMEMUSED          CTL_UNNUMBERED
+#define OBD_MAXPAGESUSED        CTL_UNNUMBERED
+#define OBD_SYNCFILTER          CTL_UNNUMBERED
+#define OBD_LDLM_TIMEOUT        CTL_UNNUMBERED
+#define OBD_DUMP_ON_EVICTION    CTL_UNNUMBERED
+#define OBD_DEBUG_PEER_ON_TIMEOUT CTL_UNNUMBERED
+#define OBD_ALLOC_FAIL_RATE     CTL_UNNUMBERED
+#define OBD_MAX_DIRTY_PAGES     CTL_UNNUMBERED
+#define OBD_AT_MIN              CTL_UNNUMBERED
+#define OBD_AT_MAX              CTL_UNNUMBERED
+#define OBD_AT_EXTRA            CTL_UNNUMBERED
+#define OBD_AT_EARLY_MARGIN     CTL_UNNUMBERED
+#define OBD_AT_HISTORY          CTL_UNNUMBERED
+
+#endif
+
+
 int LL_PROC_PROTO(proc_fail_loc)
 {
         int rc;
index c3f0249..fbcf034 100644 (file)
@@ -173,9 +173,11 @@ static ssize_t lprocfs_fops_read(struct file *f, char __user *buf,
         if (page == NULL)
                 return -ENOMEM;
 
-        LPROCFS_ENTRY();
+        if (LPROCFS_ENTRY_AND_CHECK(dp))
+                return -ENOENT;
+
         OBD_FAIL_TIMEOUT(OBD_FAIL_LPROC_REMOVE, 10);
-        if (!dp->deleted && dp->read_proc)
+        if (dp->read_proc)
                 rc = dp->read_proc(page, &start, *ppos, CFS_PAGE_SIZE,
                                    &eof, dp->data);
         LPROCFS_EXIT();
@@ -214,8 +216,9 @@ static ssize_t lprocfs_fops_write(struct file *f, const char __user *buf,
         struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode);
         int rc = -EIO;
 
-        LPROCFS_ENTRY();
-        if (!dp->deleted && dp->write_proc)
+        if (LPROCFS_ENTRY_AND_CHECK(dp))
+                return -ENOENT;
+        if (dp->write_proc)
                 rc = dp->write_proc(f, buf, size, dp->data);
         LPROCFS_EXIT();
         return rc;
@@ -1306,7 +1309,9 @@ static int lprocfs_stats_seq_open(struct inode *inode, struct file *file)
         struct seq_file *seq;
         int rc;
 
-        LPROCFS_ENTRY_AND_CHECK(dp);
+        if (LPROCFS_ENTRY_AND_CHECK(dp))
+                return -ENOENT;
+
         rc = seq_open(file, &lprocfs_stats_seq_sops);
         if (rc) {
                 LPROCFS_EXIT();
index b19b469..342b34e 100644 (file)
@@ -177,7 +177,7 @@ void class_handle_hash_back(struct portals_handle *h)
 void *class_handle2object(__u64 cookie)
 {
         struct handle_bucket *bucket;
-        struct list_head *tmp;
+        struct portals_handle *h;
         void *retval = NULL;
         ENTRY;
 
@@ -188,9 +188,7 @@ void *class_handle2object(__u64 cookie)
         bucket = handle_hash + (cookie & HANDLE_HASH_MASK);
 
         rcu_read_lock();
-        list_for_each_rcu(tmp, &bucket->head) {
-                struct portals_handle *h;
-                h = list_entry(tmp, struct portals_handle, h_link);
+        list_for_each_entry_rcu(h, &bucket->head, h_link) {
                 if (h->h_cookie != cookie)
                         continue;
 
@@ -246,13 +244,10 @@ static void cleanup_all_handles(void)
         int i;
 
         for (i = 0; i < HANDLE_HASH_SIZE; i++) {
-                struct list_head *pos, *n;
-                n = NULL;
-                spin_lock(&handle_hash[i].lock);
-                list_for_each_safe_rcu(pos, n, &(handle_hash[i].head)) {
-                        struct portals_handle *h;
-                        h = list_entry(pos, struct portals_handle, h_link);
+                struct portals_handle *h;
 
+                spin_lock(&handle_hash[i].lock);
+                list_for_each_entry_rcu(h, &(handle_hash[i].head), h_link) {
                         CERROR("force clean handle "LPX64" addr %p addref %p\n",
                                h->h_cookie, h, h->h_addref);
 
index d459393..4e4a78c 100644 (file)
@@ -1253,10 +1253,9 @@ int req_layout_init(void)
         int i;
         int j;
         int k;
+        struct req_format *rf = NULL;
 
         for (i = 0; i < ARRAY_SIZE(req_formats); ++i) {
-                struct req_format *rf;
-
                 rf = (struct req_format *)req_formats[i];
                 rf->rf_idx = i;
                 for (j = 0; j < RCL_NR; ++j) {
index 05c8116..a131099 100644 (file)
@@ -981,9 +981,9 @@ int sptlrpc_get_bulk_checksum(struct ptlrpc_bulk_desc *desc, __u8 alg,
         hashsize = ll_crypto_hash_digestsize(hdesc.tfm);
 
         for (i = 0; i < desc->bd_iov_count; i++) {
-                sl.page = desc->bd_iov[i].kiov_page;
-                sl.offset = desc->bd_iov[i].kiov_offset;
-                sl.length = desc->bd_iov[i].kiov_len;
+                sg_set_page(&sl, desc->bd_iov[i].kiov_page,
+                             desc->bd_iov[i].kiov_len,
+                             desc->bd_iov[i].kiov_offset & ~CFS_PAGE_MASK);
                 ll_crypto_hash_update(&hdesc, &sl, sl.length);
         }
 
index e9fe66f..946f922 100644 (file)
@@ -1031,7 +1031,7 @@ int sptlrpc_target_local_copy_conf(struct obd_device *obd,
 
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
 
-        dentry = lookup_one_len(MOUNT_CONFIGS_DIR, current->fs->pwd,
+        dentry = lookup_one_len(MOUNT_CONFIGS_DIR, cfs_fs_pwd(current->fs),
                                 strlen(MOUNT_CONFIGS_DIR));
         if (IS_ERR(dentry)) {
                 rc = PTR_ERR(dentry);
index 9dd70e8..6155ca9 100644 (file)
@@ -247,7 +247,7 @@ check_cur_qunit(struct obd_device *obd,
         int ret = 0;
         ENTRY;
 
-        if (!sb_any_quota_enabled(sb))
+        if (!ll_sb_any_quota_active(sb))
                 RETURN(0);
 
         spin_lock(&qctxt->lqc_lock);
@@ -371,7 +371,7 @@ int compute_remquota(struct obd_device *obd, struct lustre_quota_ctxt *qctxt,
         int ret = QUOTA_RET_OK;
         ENTRY;
 
-        if (!sb_any_quota_enabled(sb))
+        if (!ll_sb_any_quota_active(sb))
                 RETURN(QUOTA_RET_NOQUOTA);
 
         /* ignore root user */
@@ -1374,7 +1374,7 @@ static int qslave_recovery_main(void *arg)
                 int ret;
 
                 LOCK_DQONOFF_MUTEX(dqopt);
-                if (!sb_has_quota_enabled(qctxt->lqc_sb, type)) {
+                if (!ll_sb_has_quota_active(qctxt->lqc_sb, type)) {
                         UNLOCK_DQONOFF_MUTEX(dqopt);
                         break;
                 }
@@ -1438,7 +1438,7 @@ qslave_start_recovery(struct obd_device *obd, struct lustre_quota_ctxt *qctxt)
         int rc;
         ENTRY;
 
-        if (!sb_any_quota_enabled(qctxt->lqc_sb))
+        if (!ll_sb_any_quota_active(qctxt->lqc_sb))
                 goto exit;
 
         data.obd = obd;
index df2039a..3c3b16f 100644 (file)
@@ -164,7 +164,7 @@ static int filter_quota_enforce(struct obd_device *obd, unsigned int ignore)
 {
         ENTRY;
 
-        if (!sb_any_quota_enabled(obd->u.obt.obt_sb))
+        if (!ll_sb_any_quota_active(obd->u.obt.obt_sb))
                 RETURN(0);
 
         if (ignore) {
@@ -186,7 +186,7 @@ static int filter_quota_getflag(struct obd_device *obd, struct obdo *oa)
         struct obd_quotactl *oqctl;
         ENTRY;
 
-        if (!sb_any_quota_enabled(obt->obt_sb))
+        if (!ll_sb_any_quota_active(obt->obt_sb))
                 RETURN(0);
 
         OBD_ALLOC_PTR(oqctl);
@@ -380,7 +380,7 @@ int quota_is_set(struct obd_device *obd, const unsigned int id[], int flag)
         struct lustre_qunit_size *lqs;
         int i, q_set = 0;
 
-        if (!sb_any_quota_enabled(obd->u.obt.obt_qctxt.lqc_sb))
+        if (!ll_sb_any_quota_active(obd->u.obt.obt_qctxt.lqc_sb))
                 RETURN(0);
 
         for (i = 0; i < MAXQUOTAS; i++) {
@@ -531,7 +531,7 @@ static int quota_pending_commit(struct obd_device *obd, const unsigned int id[],
 
         CDEBUG(D_QUOTA, "commit pending quota for  %s\n", obd->obd_name);
         CLASSERT(MAXQUOTAS < 4);
-        if (!sb_any_quota_enabled(qctxt->lqc_sb))
+        if (!ll_sb_any_quota_active(qctxt->lqc_sb))
                 RETURN(0);
 
         do_gettimeofday(&work_start);
index 66aba36..302fcf5 100644 (file)
@@ -1877,8 +1877,8 @@ check_config () {
         if [[ x$mgc != xMGC$MGSNID ]]; then
             if [ "$mgs_HOST" ]; then
                 local mgc_ip=$(ping -q -c1 -w1 $mgs_HOST | grep PING | awk '{print $3}' | sed -e "s/(//g" -e "s/)//g")
-                [[ x$mgc = xMGC$mgc_ip@$NETTYPE ]] ||
-                    error_exit "MGSNID=$MGSNID, mounted: $mounted, MGC : $mgc"
+#                [[ x$mgc = xMGC$mgc_ip@$NETTYPE ]] ||
+#                    error_exit "MGSNID=$MGSNID, mounted: $mounted, MGC : $mgc"
             fi
         fi
         return 0
@@ -1893,10 +1893,10 @@ check_config () {
     local mgshost=$(mount | grep " $mntpt " | awk -F@ '{print $1}')
     mgshost=$(echo $mgshost | awk -F: '{print $1}')
 
-#    if [ "$mgshost" != "$myMGS_host" ]; then
-#            error_exit "Bad config file: lustre is mounted with mgs $mgshost, but mgs_HOST=$mgs_HOST, NETTYPE=$NETTYPE
-#                   Please use correct config or set mds_HOST correctly!"
-#    fi
+    if [ "$mgshost" != "$myMGS_host" ]; then
+            log "Bad config file: lustre is mounted with mgs $mgshost, but mgs_HOST=$mgs_HOST, NETTYPE=$NETTYPE
+                   Please use correct config or set mds_HOST correctly!"
+    fi
 
     sanity_mount_check ||
         error "environments are insane!"
index d950da6..1f0f905 100644 (file)
@@ -73,6 +73,7 @@
 #include <lustre/lustre_idl.h>
 #include <lustre/liblustreapi.h>
 #include <lustre/lustre_user.h>
+#include <lustre_quota.h>
 
 #include <libcfs/libcfsutil.h>
 #include "obdctl.h"