])
])
+# from 2.6.24 please use sg_init_table
+AC_DEFUN([LIBCFS_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)
+])
+])
+
# 2.6.24
AC_DEFUN([LIBCFS_NETWORK_NAMESPACE],
[AC_MSG_CHECKING([for network stack has namespaces])
# 2.6.24
LIBCFS_SYSCTL_UNNUMBERED
LIBCFS_SCATTERLIST_SETPAGE
+LIBCFS_SCATTERLIST_INITTABLE
LIBCFS_NL_BROADCAST_GFP
LIBCFS_NETWORK_NAMESPACE
LIBCFS_NETLINK_NETNS
int (*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 */
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)
}
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++;