mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
OpenZFS 6676 - Race between unique_insert() and unique_remove() causes ZFS fsid change
Authored by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com> Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com> Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com> Reviewed by: Dan Vatca <dan.vatca@gmail.com> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Sebastien Roy <sebastien.roy@delphix.com> Approved by: Robert Mustacchi <rm@joyent.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Ported-by: George Melikov <mail@gmelikov.ru> OpenZFS-issue: https://www.illumos.org/issues/6676 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/40510e8 Closes #5667
This commit is contained in:
committed by
Brian Behlendorf
parent
aeacdefedc
commit
39efbde7c5
+17
-7
@@ -549,8 +549,14 @@ typedef struct dmu_buf_user {
|
||||
*/
|
||||
taskq_ent_t dbu_tqent;
|
||||
|
||||
/* This instance's eviction function pointer. */
|
||||
dmu_buf_evict_func_t *dbu_evict_func;
|
||||
/*
|
||||
* This instance's eviction function pointers.
|
||||
*
|
||||
* dbu_evict_func_sync is called synchronously and then
|
||||
* dbu_evict_func_async is executed asynchronously on a taskq.
|
||||
*/
|
||||
dmu_buf_evict_func_t *dbu_evict_func_sync;
|
||||
dmu_buf_evict_func_t *dbu_evict_func_async;
|
||||
#ifdef ZFS_DEBUG
|
||||
/*
|
||||
* Pointer to user's dbuf pointer. NULL for clients that do
|
||||
@@ -572,12 +578,16 @@ typedef struct dmu_buf_user {
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
static inline void
|
||||
dmu_buf_init_user(dmu_buf_user_t *dbu, dmu_buf_evict_func_t *evict_func,
|
||||
dmu_buf_t **clear_on_evict_dbufp)
|
||||
dmu_buf_init_user(dmu_buf_user_t *dbu, dmu_buf_evict_func_t *evict_func_sync,
|
||||
dmu_buf_evict_func_t *evict_func_async, dmu_buf_t **clear_on_evict_dbufp)
|
||||
{
|
||||
ASSERT(dbu->dbu_evict_func == NULL);
|
||||
ASSERT(evict_func != NULL);
|
||||
dbu->dbu_evict_func = evict_func;
|
||||
ASSERT(dbu->dbu_evict_func_sync == NULL);
|
||||
ASSERT(dbu->dbu_evict_func_async == NULL);
|
||||
|
||||
/* must have at least one evict func */
|
||||
IMPLY(evict_func_sync == NULL, evict_func_async != NULL);
|
||||
dbu->dbu_evict_func_sync = evict_func_sync;
|
||||
dbu->dbu_evict_func_async = evict_func_async;
|
||||
taskq_init_ent(&dbu->dbu_tqent);
|
||||
#ifdef ZFS_DEBUG
|
||||
dbu->dbu_clear_on_evict_dbufp = clear_on_evict_dbufp;
|
||||
|
||||
@@ -198,7 +198,7 @@ boolean_t zap_match(zap_name_t *zn, const char *matchname);
|
||||
int zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx,
|
||||
krw_t lti, boolean_t fatreader, boolean_t adding, void *tag, zap_t **zapp);
|
||||
void zap_unlockdir(zap_t *zap, void *tag);
|
||||
void zap_evict(void *dbu);
|
||||
void zap_evict_sync(void *dbu);
|
||||
zap_name_t *zap_name_alloc(zap_t *zap, const char *key, matchtype_t mt);
|
||||
void zap_name_free(zap_name_t *zn);
|
||||
int zap_hashbits(zap_t *zap);
|
||||
|
||||
Reference in New Issue
Block a user