diff options
author | Boris Protopopov <[email protected]> | 2014-03-22 05:07:14 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-03-10 09:49:22 -0800 |
commit | a0bd735adb1b1eb81fef10b4db102ee051c4d4ff (patch) | |
tree | 121fcde3000a116f0c33143b28a530a87fd6073a /include/sys | |
parent | eb0856779f7b57162c9179f238104f6d6e150745 (diff) |
Add support for asynchronous zvol minor operations
zfsonlinux issue #2217 - zvol minor operations: check snapdev
property before traversing snapshots of a dataset
zfsonlinux issue #3681 - lock order inversion between zvol_open()
and dsl_pool_sync()...zvol_rename_minors()
Create a per-pool zvol taskq for asynchronous zvol tasks.
There are a few key design decisions to be aware of.
* Each taskq must be single threaded to ensure tasks are always
processed in the order in which they were dispatched.
* There is a taskq per-pool in order to keep the pools independent.
This way if one pool is suspended it will not impact another.
* The preferred location to dispatch a zvol minor task is a sync
task. In this context there is easy access to the spa_t and
minimal error handling is required because the sync task must
succeed.
Support for asynchronous zvol minor operations address issue #3681.
Signed-off-by: Boris Protopopov <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #2217
Closes #3678
Closes #3681
Diffstat (limited to 'include/sys')
-rw-r--r-- | include/sys/spa_impl.h | 2 | ||||
-rw-r--r-- | include/sys/zvol.h | 15 |
2 files changed, 9 insertions, 8 deletions
diff --git a/include/sys/spa_impl.h b/include/sys/spa_impl.h index 0bb6dccdc..759c3472f 100644 --- a/include/sys/spa_impl.h +++ b/include/sys/spa_impl.h @@ -23,6 +23,7 @@ * Copyright (c) 2011, 2015 by Delphix. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved. + * Copyright (c) 2016 Actifio, Inc. All rights reserved. */ #ifndef _SYS_SPA_IMPL_H @@ -253,6 +254,7 @@ struct spa { uint64_t spa_errata; /* errata issues detected */ spa_stats_t spa_stats; /* assorted spa statistics */ hrtime_t spa_ccw_fail_time; /* Conf cache write fail time */ + taskq_t *spa_zvol_taskq; /* Taskq for minor managment */ /* * spa_refcount & spa_config_lock must be the last elements diff --git a/include/sys/zvol.h b/include/sys/zvol.h index 898e23521..c3e386f0b 100644 --- a/include/sys/zvol.h +++ b/include/sys/zvol.h @@ -21,6 +21,7 @@ /* * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016 Actifio, Inc. All rights reserved. */ #ifndef _SYS_ZVOL_H @@ -31,24 +32,22 @@ #define ZVOL_OBJ 1ULL #define ZVOL_ZAP_OBJ 2ULL -#ifdef _KERNEL +extern void zvol_create_minors(spa_t *spa, const char *name, boolean_t async); +extern void zvol_remove_minors(spa_t *spa, const char *name, boolean_t async); +extern void zvol_rename_minors(spa_t *spa, const char *oldname, + const char *newname, boolean_t async); +#ifdef _KERNEL extern int zvol_check_volsize(uint64_t volsize, uint64_t blocksize); extern int zvol_check_volblocksize(const char *name, uint64_t volblocksize); extern int zvol_get_stats(objset_t *os, nvlist_t *nv); extern boolean_t zvol_is_zvol(const char *); extern void zvol_create_cb(objset_t *os, void *arg, cred_t *cr, dmu_tx_t *tx); -extern int zvol_create_minor(const char *name); -extern int zvol_create_minors(const char *name); -extern int zvol_remove_minor(const char *name); -extern void zvol_remove_minors(const char *name); -extern void zvol_rename_minors(const char *oldname, const char *newname); extern int zvol_set_volsize(const char *, uint64_t); extern int zvol_set_volblocksize(const char *, uint64_t); -extern int zvol_set_snapdev(const char *, uint64_t); +extern int zvol_set_snapdev(const char *, zprop_source_t, uint64_t); extern int zvol_init(void); extern void zvol_fini(void); - #endif /* _KERNEL */ #endif /* _SYS_ZVOL_H */ |