aboutsummaryrefslogtreecommitdiffstats
path: root/include/sys/zvol_impl.h
diff options
context:
space:
mode:
authorMatthew Macy <[email protected]>2019-09-25 09:20:30 -0700
committerBrian Behlendorf <[email protected]>2019-09-25 09:20:30 -0700
commit5df7e9d85ced424292e8312a7848b6092a29c930 (patch)
tree391e1488d4a8081ce22c7401c6392a72dc661c13 /include/sys/zvol_impl.h
parentd359e99c38f66732d42278c32d52cfcf1839aa4f (diff)
OpenZFS restructuring - zvol
Refactor the zvol in to platform dependent and independent bits. Reviewed-by: Allan Jude <[email protected]> Reviewed-by: Jorgen Lundman <[email protected]> Reviewed-by: Igor Kozhukhov <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Matt Macy <[email protected]> Closes #9295
Diffstat (limited to 'include/sys/zvol_impl.h')
-rw-r--r--include/sys/zvol_impl.h107
1 files changed, 107 insertions, 0 deletions
diff --git a/include/sys/zvol_impl.h b/include/sys/zvol_impl.h
new file mode 100644
index 000000000..12b653e66
--- /dev/null
+++ b/include/sys/zvol_impl.h
@@ -0,0 +1,107 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+#ifndef _SYS_ZVOL_IMPL_H
+#define _SYS_ZVOL_IMPL_H
+
+#include <sys/zfs_context.h>
+
+#define ZVOL_RDONLY 0x1
+/*
+ * Whether the zvol has been written to (as opposed to ZVOL_RDONLY, which
+ * specifies whether or not the zvol _can_ be written to)
+ */
+#define ZVOL_WRITTEN_TO 0x2
+
+#define ZVOL_DUMPIFIED 0x4
+
+#define ZVOL_EXCL 0x8
+
+/*
+ * The in-core state of each volume.
+ */
+typedef struct zvol_state {
+ char zv_name[MAXNAMELEN]; /* name */
+ uint64_t zv_volsize; /* advertised space */
+ uint64_t zv_volblocksize; /* volume block size */
+ objset_t *zv_objset; /* objset handle */
+ uint32_t zv_flags; /* ZVOL_* flags */
+ uint32_t zv_open_count; /* open counts */
+ uint32_t zv_changed; /* disk changed */
+ zilog_t *zv_zilog; /* ZIL handle */
+ rangelock_t zv_rangelock; /* for range locking */
+ dnode_t *zv_dn; /* dnode hold */
+ list_node_t zv_next; /* next zvol_state_t linkage */
+ uint64_t zv_hash; /* name hash */
+ struct hlist_node zv_hlink; /* hash link */
+ kmutex_t zv_state_lock; /* protects zvol_state_t */
+ atomic_t zv_suspend_ref; /* refcount for suspend */
+ krwlock_t zv_suspend_lock; /* suspend lock */
+ struct zvol_state_os *zv_zso; /* private platform state */
+} zvol_state_t;
+
+
+extern list_t zvol_state_list;
+extern krwlock_t zvol_state_lock;
+#define ZVOL_HT_SIZE 1024
+extern struct hlist_head *zvol_htable;
+#define ZVOL_HT_HEAD(hash) (&zvol_htable[(hash) & (ZVOL_HT_SIZE-1)])
+extern zil_replay_func_t *zvol_replay_vector[TX_MAX_TYPE];
+
+extern unsigned int zvol_volmode;
+extern unsigned int zvol_inhibit_dev;
+
+/*
+ * platform independent functions exported to platform code
+ */
+zvol_state_t *zvol_find_by_name_hash(const char *name,
+ uint64_t hash, int mode);
+int zvol_first_open(zvol_state_t *zv, boolean_t readonly);
+uint64_t zvol_name_hash(const char *name);
+void zvol_remove_minors_impl(const char *name);
+void zvol_last_close(zvol_state_t *zv);
+void zvol_insert(zvol_state_t *zv);
+void zvol_log_truncate(zvol_state_t *zv, dmu_tx_t *tx, uint64_t off,
+ uint64_t len, boolean_t sync);
+void zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, uint64_t offset,
+ uint64_t size, int sync);
+int zvol_get_data(void *arg, lr_write_t *lr, char *buf, struct lwb *lwb,
+ zio_t *zio);
+int zvol_init_impl(void);
+void zvol_fini_impl(void);
+
+/*
+ * platform dependent functions exported to platform independent code
+ */
+typedef struct zvol_platform_ops {
+ void (*zv_free)(zvol_state_t *);
+ void (*zv_rename_minor)(zvol_state_t *, const char *);
+ int (*zv_create_minor)(const char *);
+ int (*zv_update_volsize)(zvol_state_t *, uint64_t);
+ boolean_t (*zv_is_zvol)(const char *);
+ void (*zv_clear_private)(zvol_state_t *);
+ void (*zv_set_disk_ro)(zvol_state_t *, int flags);
+ void (*zv_set_capacity)(zvol_state_t *, uint64_t capacity);
+} zvol_platform_ops_t;
+
+void zvol_register_ops(const zvol_platform_ops_t *ops);
+
+#endif