From: Alex Zhuravlev Date: Tue, 29 Nov 2016 16:48:59 +0000 (+0300) Subject: LU-8873 osd: use sa_handle_get_from_db() X-Git-Tag: 2.9.57~9 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=0c3cd64ad827c34f8943c9569c5db163f3aee1dd;p=fs%2Flustre-release.git LU-8873 osd: use sa_handle_get_from_db() use sa_handle_get_from_db() instead of sa_handle_get() and save on object->dnode lookup Change-Id: I2a23e36c3c98ecf4ec00ac590a32d2c14a867aa0 Signed-off-by: Alex Zhuravlev Reviewed-on: https://review.whamcloud.com/24004 Reviewed-by: Nathaniel Clark Tested-by: Jenkins Reviewed-by: Jinshan Xiong Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/osd-zfs/osd_index.c b/lustre/osd-zfs/osd_index.c index 9190f65..1dddb40 100644 --- a/lustre/osd-zfs/osd_index.c +++ b/lustre/osd-zfs/osd_index.c @@ -213,6 +213,30 @@ static inline void osd_it_append_attrs(struct lu_dirent *ent, __u32 attr, ent->lde_attrs = cpu_to_le32(ent->lde_attrs); } +int __osd_xattr_load_by_oid(struct osd_device *osd, uint64_t oid, nvlist_t **sa) +{ + sa_handle_t *hdl; + dmu_buf_t *db; + int rc; + + rc = -dmu_bonus_hold(osd->od_os, oid, osd_obj_tag, &db); + if (rc < 0) { + CERROR("%s: can't get bonus, rc = %d\n", osd->od_svname, rc); + return rc; + } + + rc = -sa_handle_get_from_db(osd->od_os, db, NULL, SA_HDL_PRIVATE, &hdl); + if (rc) { + dmu_buf_rele(db, osd_obj_tag); + return rc; + } + + rc = __osd_xattr_load(osd, hdl, sa); + + sa_handle_destroy(hdl); + + return rc; +} /** * Get the object's FID from its LMA EA. * @@ -240,7 +264,7 @@ static int osd_get_fid_by_oid(const struct lu_env *env, struct osd_device *osd, int rc; ENTRY; - rc = __osd_xattr_load(osd, oid, &sa_xattr); + rc = __osd_xattr_load_by_oid(osd, oid, &sa_xattr); if (rc == -ENOENT) goto regular; @@ -310,21 +334,17 @@ static int osd_find_parent_by_dnode(const struct lu_env *env, struct dt_object *o, struct lu_fid *fid) { - struct osd_device *osd = osd_obj2dev(osd_dt_obj(o)); - sa_handle_t *sa_hdl; + struct osd_object *obj = osd_dt_obj(o); + struct osd_device *osd = osd_obj2dev(obj); uint64_t dnode = ZFS_NO_OBJECT; int rc; ENTRY; /* first of all, get parent dnode from own attributes */ - LASSERT(osd_dt_obj(o)->oo_dn); - rc = -sa_handle_get(osd->od_os, osd_dt_obj(o)->oo_dn->dn_object, - NULL, SA_HDL_PRIVATE, &sa_hdl); + rc = osd_sa_handle_get(obj); if (rc != 0) RETURN(rc); - - rc = -sa_lookup(sa_hdl, SA_ZPL_PARENT(osd), &dnode, 8); - sa_handle_destroy(sa_hdl); + rc = -sa_lookup(obj->oo_sa_hdl, SA_ZPL_PARENT(osd), &dnode, 8); if (rc == 0) rc = osd_get_fid_by_oid(env, osd, dnode, fid); @@ -1466,7 +1486,7 @@ static int osd_zfs_otable_it_next(const struct lu_env *env, struct dt_it *di) /* LMA is required for this to be a Lustre object. * If there is no xattr skip it. */ - rc = __osd_xattr_load(dev, it->mit_pos, &nvbuf); + rc = __osd_xattr_load_by_oid(dev, it->mit_pos, &nvbuf); if (unlikely(rc != 0)) continue; diff --git a/lustre/osd-zfs/osd_internal.h b/lustre/osd-zfs/osd_internal.h index 6ad66cb..5e8a156 100644 --- a/lustre/osd-zfs/osd_internal.h +++ b/lustre/osd-zfs/osd_internal.h @@ -535,8 +535,7 @@ int osd_remote_fid(const struct lu_env *env, struct osd_device *osd, const struct lu_fid *fid); /* osd_xattr.c */ -int __osd_xattr_load(struct osd_device *osd, uint64_t dnode, - nvlist_t **sa_xattr); +int __osd_xattr_load(struct osd_device *osd, sa_handle_t *hdl, nvlist_t **sa); int __osd_xattr_get_large(const struct lu_env *env, struct osd_device *osd, uint64_t xattr, struct lu_buf *buf, const char *name, int *sizep); @@ -723,6 +722,24 @@ osd_obj_bonuslen(struct osd_object *obj) dmu_prefetch((os), (obj), (lvl), (off)) #endif +static inline int osd_sa_handle_get(struct osd_object *obj) +{ + struct osd_device *osd = osd_obj2dev(obj); + dnode_t *dn = obj->oo_dn; + int rc; + + if (obj->oo_sa_hdl) + return 0; + + dbuf_read(dn->dn_bonus, NULL, DB_RF_MUST_SUCCEED | DB_RF_NOPREFETCH); + rc = -sa_handle_get_from_db(osd->od_os, &dn->dn_bonus->db, obj, + SA_HDL_PRIVATE, &obj->oo_sa_hdl); + if (rc) + return rc; + refcount_add(&dn->dn_bonus->db_holds, osd_obj_tag); + return 0; +} + static inline void osd_dnode_rele(dnode_t *dn) { dmu_buf_impl_t *db; diff --git a/lustre/osd-zfs/osd_object.c b/lustre/osd-zfs/osd_object.c index d8a4edd..4a1dfe1 100644 --- a/lustre/osd-zfs/osd_object.c +++ b/lustre/osd-zfs/osd_object.c @@ -88,8 +88,7 @@ osd_object_sa_init(struct osd_object *obj, struct osd_device *o) LASSERT(obj->oo_sa_hdl == NULL); LASSERT(obj->oo_dn != NULL); - rc = -sa_handle_get(o->od_os, obj->oo_dn->dn_object, obj, - SA_HDL_PRIVATE, &obj->oo_sa_hdl); + rc = osd_sa_handle_get(obj); if (rc) return rc; @@ -184,18 +183,12 @@ int __osd_object_attr_get(const struct lu_env *env, struct osd_device *o, { struct osa_attr *osa = &osd_oti_get(env)->oti_osa; sa_bulk_attr_t *bulk = osd_oti_get(env)->oti_attr_bulk; - sa_handle_t *sa_hdl; int cnt = 0; int rc; ENTRY; LASSERT(obj->oo_dn != NULL); - rc = -sa_handle_get(o->od_os, obj->oo_dn->dn_object, NULL, - SA_HDL_PRIVATE, &sa_hdl); - if (rc) - RETURN(rc); - la->la_valid |= LA_ATIME | LA_MTIME | LA_CTIME | LA_MODE | LA_TYPE | LA_SIZE | LA_UID | LA_GID | LA_FLAGS | LA_NLINK; @@ -210,7 +203,7 @@ int __osd_object_attr_get(const struct lu_env *env, struct osd_device *o, SA_ADD_BULK_ATTR(bulk, cnt, SA_ZPL_FLAGS(o), NULL, &osa->flags, 8); LASSERT(cnt <= ARRAY_SIZE(osd_oti_get(env)->oti_attr_bulk)); - rc = -sa_bulk_lookup(sa_hdl, bulk, cnt); + rc = -sa_bulk_lookup(obj->oo_sa_hdl, bulk, cnt); if (rc) GOTO(out_sa, rc); @@ -247,14 +240,13 @@ int __osd_object_attr_get(const struct lu_env *env, struct osd_device *o, } if (S_ISCHR(la->la_mode) || S_ISBLK(la->la_mode)) { - rc = -sa_lookup(sa_hdl, SA_ZPL_RDEV(o), &osa->rdev, 8); + rc = -sa_lookup(obj->oo_sa_hdl, SA_ZPL_RDEV(o), &osa->rdev, 8); if (rc) GOTO(out_sa, rc); la->la_rdev = osa->rdev; la->la_valid |= LA_RDEV; } out_sa: - sa_handle_destroy(sa_hdl); RETURN(rc); } @@ -1245,6 +1237,7 @@ static int osd_find_new_dnode(const struct lu_env *env, dmu_tx_t *tx, atomic_inc_32(&dn->dn_dbufs_count); } *dnp = dn; + dbuf_read(db, NULL, DB_RF_MUST_SUCCEED | DB_RF_NOPREFETCH); break; } @@ -1503,15 +1496,13 @@ static int osd_object_create(const struct lu_env *env, struct dt_object *dt, rc = -zap_add(osd->od_os, zapid, buf, 8, 1, zde, oh->ot_tx); if (rc) GOTO(out, rc); - + obj->oo_dn = dn; /* Now add in all of the "SA" attributes */ - rc = -sa_handle_get(osd->od_os, dn->dn_object, NULL, - SA_HDL_PRIVATE, &obj->oo_sa_hdl); + rc = osd_sa_handle_get(obj); if (rc) GOTO(out, rc); /* configure new osd object */ - obj->oo_dn = dn; parent = parent != 0 ? parent : zapid; rc = __osd_attr_init(env, osd, obj->oo_sa_hdl, oh->ot_tx, &obj->oo_attr, parent); diff --git a/lustre/osd-zfs/osd_xattr.c b/lustre/osd-zfs/osd_xattr.c index 9c2bac9..c220e0e 100644 --- a/lustre/osd-zfs/osd_xattr.c +++ b/lustre/osd-zfs/osd_xattr.c @@ -65,20 +65,12 @@ #include -int __osd_xattr_load(struct osd_device *osd, uint64_t dnode, nvlist_t **sa) +int __osd_xattr_load(struct osd_device *osd, sa_handle_t *hdl, nvlist_t **sa) { - sa_handle_t *sa_hdl; char *buf; int rc, size; - if (unlikely(dnode == ZFS_NO_OBJECT)) - return -ENOENT; - - rc = -sa_handle_get(osd->od_os, dnode, NULL, SA_HDL_PRIVATE, &sa_hdl); - if (rc) - return rc; - - rc = -sa_size(sa_hdl, SA_ZPL_DXATTR(osd), &size); + rc = -sa_size(hdl, SA_ZPL_DXATTR(osd), &size); if (rc) { if (rc == -ENOENT) rc = -nvlist_alloc(sa, NV_UNIQUE_NAME, KM_SLEEP); @@ -90,24 +82,22 @@ int __osd_xattr_load(struct osd_device *osd, uint64_t dnode, nvlist_t **sa) rc = -ENOMEM; goto out_sa; } - rc = -sa_lookup(sa_hdl, SA_ZPL_DXATTR(osd), buf, size); + rc = -sa_lookup(hdl, SA_ZPL_DXATTR(osd), buf, size); if (rc == 0) rc = -nvlist_unpack(buf, size, sa, KM_SLEEP); osd_zio_buf_free(buf, size); out_sa: - sa_handle_destroy(sa_hdl); return rc; } -static inline int __osd_xattr_cache(const struct lu_env *env, - struct osd_object *obj) +static inline int __osd_xattr_cache(struct osd_object *obj) { - LASSERT(obj->oo_sa_xattr == NULL); - LASSERT(obj->oo_dn != NULL); - - return __osd_xattr_load(osd_obj2dev(obj), obj->oo_dn->dn_object, - &obj->oo_sa_xattr); + LASSERT(obj->oo_sa_hdl); + if (obj->oo_sa_xattr != NULL) + return 0; + return __osd_xattr_load(osd_obj2dev(obj), + obj->oo_sa_hdl, &obj->oo_sa_xattr); } static int @@ -115,19 +105,15 @@ __osd_sa_xattr_get(const struct lu_env *env, struct osd_object *obj, const struct lu_buf *buf, const char *name, int *sizep) { uchar_t *nv_value; - int rc; - - LASSERT(obj->oo_sa_hdl); + int rc = 0; - if (obj->oo_sa_xattr == NULL) { - rc = __osd_xattr_cache(env, obj); - if (rc) - return rc; - } + rc = __osd_xattr_cache(obj); + if (rc) + return rc; LASSERT(obj->oo_sa_xattr); - rc = -nvlist_lookup_byte_array(obj->oo_sa_xattr, name, &nv_value, - sizep); + rc = -nvlist_lookup_byte_array(obj->oo_sa_xattr, name, + &nv_value, sizep); if (rc) return rc; @@ -411,12 +397,9 @@ int __osd_sa_xattr_set(const struct lu_env *env, struct osd_object *obj, int rc; int too_big = 0; - LASSERT(obj->oo_sa_hdl); - if (obj->oo_sa_xattr == NULL) { - rc = __osd_xattr_cache(env, obj); - if (rc) - return rc; - } + rc = __osd_xattr_cache(obj); + if (rc) + return rc; LASSERT(obj->oo_sa_xattr); /* Limited to 32k to keep nvpair memory allocations small */ @@ -682,11 +665,9 @@ static int __osd_sa_xattr_del(const struct lu_env *env, struct osd_object *obj, { int rc; - if (obj->oo_sa_xattr == NULL) { - rc = __osd_xattr_cache(env, obj); - if (rc) - return rc; - } + rc = __osd_xattr_cache(obj); + if (rc) + return rc; rc = -nvlist_remove(obj->oo_sa_xattr, name, DATA_TYPE_BYTE_ARRAY); if (rc == 0) @@ -856,13 +837,9 @@ osd_sa_xattr_list(const struct lu_env *env, struct osd_object *obj, int len, counted = 0; int rc = 0; - if (obj->oo_sa_xattr == NULL) { - rc = __osd_xattr_cache(env, obj); - if (rc) - return rc; - } - - LASSERT(obj->oo_sa_xattr); + rc = __osd_xattr_cache(obj); + if (rc) + return rc; while ((nvp = nvlist_next_nvpair(obj->oo_sa_xattr, nvp)) != NULL) { const char *name = nvpair_name(nvp);