From 89f8ee7f964d2598939ca483f522d6918915962c Mon Sep 17 00:00:00 2001 From: Tony Hutter Date: Thu, 11 Oct 2018 15:07:44 -0700 Subject: [PATCH] LU-11507 osd-zfs: Use zfs_refcount_add if available refcount_add was removed from ZFS master in: Linux 4.19-rc3+ compat: Remove refcount_t compat https://github.com/zfsonlinux/zfs/pull/7932 It is expected to be removed in zfs-0.7.12 as well. Update Lustre to use zfs_refcount_add if zfs supports it, and fall back to refcount_add if not. Signed-off-by: Tony Hutter Change-Id: Ib1b2ff13eb4ff8c56dd49a427b9827c6649ecd31 Reviewed-on: https://review.whamcloud.com/33359 Reviewed-by: Andreas Dilger Reviewed-by: Nathaniel Clark Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- config/lustre-build-zfs.m4 | 12 ++++++++++++ lustre/osd-zfs/osd_internal.h | 6 +++++- lustre/osd-zfs/osd_object.c | 4 ++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/config/lustre-build-zfs.m4 b/config/lustre-build-zfs.m4 index 5d024c2..eb82bb4 100644 --- a/config/lustre-build-zfs.m4 +++ b/config/lustre-build-zfs.m4 @@ -683,6 +683,18 @@ your distribution. AC_DEFINE(HAVE_ZFS_INODE_TIMESPEC, 1, [Have inode_timespec_t]) ]) + dnl # ZFS 0.7.12/0.8.x uses zfs_refcount_add() instead of + dnl # refcount_add(). + dnl # + LB_CHECK_COMPILE([if ZFS has 'zfs_refcount_add'], + zfs_refcount_add, [ + #include + ],[ + zfs_refcount_add((zfs_refcount_t *) NULL, NULL); + ],[ + AC_DEFINE(HAVE_ZFS_REFCOUNT_ADD, 1, + [Have zfs_refcount_add]) + ]) ]) AS_IF([test "x$enable_zfs" = xyes], [ diff --git a/lustre/osd-zfs/osd_internal.h b/lustre/osd-zfs/osd_internal.h index d34afe5..20656b4 100644 --- a/lustre/osd-zfs/osd_internal.h +++ b/lustre/osd-zfs/osd_internal.h @@ -99,6 +99,10 @@ #define OSD_MAX_CACHE_SIZE OBD_OBJECT_EOF +#ifndef HAVE_ZFS_REFCOUNT_ADD +#define zfs_refcount_add refcount_add +#endif + extern struct dt_body_operations osd_body_scrub_ops; /** @@ -925,7 +929,7 @@ static inline int osd_sa_handle_get(struct osd_object *obj) SA_HDL_PRIVATE, &obj->oo_sa_hdl); if (rc) return rc; - refcount_add(&dn->dn_bonus->db_holds, osd_obj_tag); + zfs_refcount_add(&dn->dn_bonus->db_holds, osd_obj_tag); return 0; } diff --git a/lustre/osd-zfs/osd_object.c b/lustre/osd-zfs/osd_object.c index 909af49..dd42a45 100644 --- a/lustre/osd-zfs/osd_object.c +++ b/lustre/osd-zfs/osd_object.c @@ -1639,8 +1639,8 @@ int osd_find_new_dnode(const struct lu_env *env, dmu_tx_t *tx, LASSERT(db); LASSERT(dn->dn_handle); DB_DNODE_ENTER(db); - if (refcount_add(&db->db_holds, osd_obj_tag) == 1) { - refcount_add(&dn->dn_holds, osd_obj_tag); + if (zfs_refcount_add(&db->db_holds, osd_obj_tag) == 1) { + zfs_refcount_add(&dn->dn_holds, osd_obj_tag); atomic_inc_32(&dn->dn_dbufs_count); } *dnp = dn; -- 1.8.3.1