diff options
author | Brian Behlendorf <[email protected]> | 2019-01-10 14:37:43 -0800 |
---|---|---|
committer | GitHub <[email protected]> | 2019-01-10 14:37:43 -0800 |
commit | 6955b40138b959af724a332df32ae64c872d876b (patch) | |
tree | 14a0e26473d758f2533e2a1c4c81f4ac9e167a86 /module/zfs/dmu.c | |
parent | 58769a4ebd462461131f19cccf25c3d19a4dbfb5 (diff) |
Provide more flexible object allocation interface
Object allocation performance can be improved for complex operations
by providing an interface which returns the newly allocated dnode.
This allows the caller to immediately use the dnode without incurring
the expense of looking up the dnode by object number.
The functions dmu_object_alloc_hold(), zap_create_hold(), and
dmu_bonus_hold_by_dnode() were added for this purpose.
The zap_create_* functions have been updated to take advantage of
this new functionality. The dmu_bonus_hold_impl() function should
really have never been included in sys/dmu.h and was removed.
It's sole caller was converted to use dmu_bonus_hold_by_dnode().
The new symbols have been exported for use by Lustre.
Reviewed-by: Tony Hutter <[email protected]>
Reviewed by: Matt Ahrens <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #8015
Diffstat (limited to 'module/zfs/dmu.c')
-rw-r--r-- | module/zfs/dmu.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/module/zfs/dmu.c b/module/zfs/dmu.c index e8d0ce3be..5b79eb907 100644 --- a/module/zfs/dmu.c +++ b/module/zfs/dmu.c @@ -330,13 +330,13 @@ dmu_rm_spill(objset_t *os, uint64_t object, dmu_tx_t *tx) } /* - * returns ENOENT, EIO, or 0. + * Lookup and hold the bonus buffer for the provided dnode. If the dnode + * has not yet been allocated a new bonus dbuf a will be allocated. + * Returns ENOENT, EIO, or 0. */ -int -dmu_bonus_hold_impl(objset_t *os, uint64_t object, void *tag, uint32_t flags, - dmu_buf_t **dbp) +int dmu_bonus_hold_by_dnode(dnode_t *dn, void *tag, dmu_buf_t **dbp, + uint32_t flags) { - dnode_t *dn; dmu_buf_impl_t *db; int error; uint32_t db_flags = DB_RF_MUST_SUCCEED; @@ -346,10 +346,6 @@ dmu_bonus_hold_impl(objset_t *os, uint64_t object, void *tag, uint32_t flags, if (flags & DMU_READ_NO_DECRYPT) db_flags |= DB_RF_NO_DECRYPT; - error = dnode_hold(os, object, FTAG, &dn); - if (error) - return (error); - rw_enter(&dn->dn_struct_rwlock, RW_READER); if (dn->dn_bonus == NULL) { rw_exit(&dn->dn_struct_rwlock); @@ -372,8 +368,6 @@ dmu_bonus_hold_impl(objset_t *os, uint64_t object, void *tag, uint32_t flags, */ rw_exit(&dn->dn_struct_rwlock); - dnode_rele(dn, FTAG); - error = dbuf_read(db, NULL, db_flags); if (error) { dnode_evict_bonus(dn); @@ -387,9 +381,19 @@ dmu_bonus_hold_impl(objset_t *os, uint64_t object, void *tag, uint32_t flags, } int -dmu_bonus_hold(objset_t *os, uint64_t obj, void *tag, dmu_buf_t **dbp) +dmu_bonus_hold(objset_t *os, uint64_t object, void *tag, dmu_buf_t **dbp) { - return (dmu_bonus_hold_impl(os, obj, tag, DMU_READ_NO_PREFETCH, dbp)); + dnode_t *dn; + int error; + + error = dnode_hold(os, object, FTAG, &dn); + if (error) + return (error); + + error = dmu_bonus_hold_by_dnode(dn, tag, dbp, DMU_READ_NO_PREFETCH); + dnode_rele(dn, FTAG); + + return (error); } /* @@ -2547,6 +2551,7 @@ dmu_fini(void) #if defined(_KERNEL) EXPORT_SYMBOL(dmu_bonus_hold); +EXPORT_SYMBOL(dmu_bonus_hold_by_dnode); EXPORT_SYMBOL(dmu_buf_hold_array_by_bonus); EXPORT_SYMBOL(dmu_buf_rele_array); EXPORT_SYMBOL(dmu_prefetch); |