Whamcloud - gitweb
b=21951 Init scatterlist table.
authoryangsheng <Sheng.Yang@Sun.COM>
Tue, 15 Jun 2010 05:23:38 +0000 (13:23 +0800)
committerJohann Lombardi <johann@sun.com>
Tue, 15 Jun 2010 07:09:52 +0000 (09:09 +0200)
i=liangzhen
i=rahul

lnet/autoconf/lustre-lnet.m4
lnet/include/libcfs/linux/portals_compat25.h
lnet/klnds/o2iblnd/o2iblnd_cb.c
lustre/autoconf/lustre-core.m4

index 855baf3..fc7f877 100644 (file)
@@ -1534,6 +1534,22 @@ LB_LINUX_TRY_COMPILE([
 ])
 ])
 
+# from 2.6.24 please use sg_init_table
+AC_DEFUN([LN_SCATTERLIST_INITTABLE],
+[AC_MSG_CHECKING([if sg_init_table is defined])
+LB_LINUX_TRY_COMPILE([
+        #include <linux/scatterlist.h>
+],[
+        sg_init_table(NULL,0);
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_SCATTERLIST_INITTABLE, 1,
+                  [sg_init_table is defined])
+],[
+        AC_MSG_RESULT(NO)
+])
+])
+
 #
 # LN_PROG_LINUX
 #
@@ -1581,6 +1597,7 @@ LN_KMEM_CACHE_CREATE_DTOR
 # 2.6.24
 LN_SYSCTL_UNNUMBERED
 LN_SCATTERLIST_SETPAGE
+LN_SCATTERLIST_INITTABLE
 # 2.6.26
 LN_SEM_COUNT
 # 2.6.27
index 60755ea..455151b 100644 (file)
@@ -175,4 +175,8 @@ int proc_call_handler(void *data, int write,
                                      loff_t pos, void *buffer, int len));
 
 
+#ifndef HAVE_SCATTERLIST_INITTABLE
+#define sg_init_table(sgl, n) memset(sgl, 0, sizeof(*sgl) * n)
+#endif
+
 #endif /* _PORTALS_COMPAT_H */
index 638ffc5..4b5be58 100644 (file)
@@ -710,6 +710,28 @@ kiblnd_setup_rd_iov(lnet_ni_t *ni, kib_tx_t *tx, kib_rdma_desc_t *rd,
         return kiblnd_map_tx(ni, tx, rd, sg - tx->tx_frags);
 }
 
+static inline int
+get_kiov_length (int nkiov, lnet_kiov_t *kiov, int offset, int nob)
+{
+        int fragnob;
+        int count = 0;
+
+        do {
+                LASSERT (nkiov > 0);
+
+                fragnob = min((int)(kiov->kiov_len - offset), nob);
+
+                count++;
+
+                offset = 0;
+                kiov++;
+                nkiov--;
+                nob -= fragnob;
+        } while (nob > 0);
+
+        return count;
+}
+
 int
 kiblnd_setup_rd_kiov (lnet_ni_t *ni, kib_tx_t *tx, kib_rdma_desc_t *rd,
                       int nkiov, lnet_kiov_t *kiov, int offset, int nob)
@@ -732,12 +754,13 @@ kiblnd_setup_rd_kiov (lnet_ni_t *ni, kib_tx_t *tx, kib_rdma_desc_t *rd,
         }
 
         sg = tx->tx_frags;
+        tx->tx_nfrags = get_kiov_length(nkiov, kiov, offset, nob);
+        sg_init_table(sg, tx->tx_nfrags);        
         do {
                 LASSERT (nkiov > 0);
 
                 fragnob = min((int)(kiov->kiov_len - offset), nob);
 
-                memset(sg, 0, sizeof(*sg));
                 sg_set_page(sg, kiov->kiov_page, fragnob,
                             kiov->kiov_offset + offset);
                 sg++;
index c63e6b4..814a5d6 100644 (file)
@@ -420,6 +420,7 @@ AC_DEFUN([LC_POSIX_ACL_XATTR_H],
 [LB_CHECK_FILE([$LINUX/include/linux/posix_acl_xattr.h],[
         AC_MSG_CHECKING([if linux/posix_acl_xattr.h can be compiled])
         LB_LINUX_TRY_COMPILE([
+                #include <linux/fs.h>
                 #include <linux/posix_acl_xattr.h>
         ],[],[
                 AC_MSG_RESULT([yes])
@@ -430,7 +431,7 @@ AC_DEFUN([LC_POSIX_ACL_XATTR_H],
         ])
 $1
 ],[
-AC_MSG_RESULT([no])
+        AC_MSG_RESULT([no])
 ])
 ])