Skip to content
Browse files

Refactor zvol in to platform and platform independent bits

Signed-off-by: Matt Macy <>
  • Loading branch information...
mattmacy committed Sep 6, 2019
1 parent 25f06d6 commit 749c541842fbf40a4829b6742d2d88c9170dc1e4
@@ -140,7 +140,8 @@ COMMON_H = \
$(top_srcdir)/include/sys/zfs_ioctl.h \
$(top_srcdir)/include/sys/zfs_onexit.h \
$(top_srcdir)/include/sys/zvol.h \


@@ -337,7 +337,7 @@ int dsl_destroy_snapshots_nvl(struct nvlist *snaps, boolean_t defer,
struct nvlist *errlist);
int dmu_objset_snapshot_one(const char *fsname, const char *snapname);
int dmu_objset_snapshot_tmp(const char *, const char *, int);
int dmu_objset_find(char *name, int func(const char *, void *), void *arg,
int dmu_objset_find(const char *name, int func(const char *, void *), void *arg,
int flags);
void dmu_objset_byteswap(void *buf, size_t size);
int dsl_dataset_rename_snapshot(const char *fsname,
@@ -41,12 +41,12 @@ extern void zvol_rename_minors(spa_t *spa, const char *oldname,
const char *newname, boolean_t async);

#ifdef _KERNEL
struct zvol_state;
typedef struct zvol_state zvol_state_t;

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_set_volsize(const char *, uint64_t);
extern int zvol_set_volblocksize(const char *, uint64_t);
@@ -58,5 +58,8 @@ extern void *zvol_tag(zvol_state_t *);

extern int zvol_init(void);
extern void zvol_fini(void);
extern int zvol_busy(void);
extern boolean_t zvol_is_zvol(const char *);

#endif /* _KERNEL */
#endif /* _SYS_ZVOL_H */
@@ -0,0 +1,106 @@
* 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
* 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]

#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.
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;

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;
extern unsigned int zvol_threads;

* platform independent functions exported to platform code
struct zvol_state *zvol_find_by_name_hash(const char *name, uint64_t hash, int mode);
int zvol_first_open(struct zvol_state *zv, boolean_t readonly);
uint64_t zvol_name_hash(const char *name);
void zvol_remove_minors_impl(const char *name);
void zvol_last_close(struct zvol_state *zv);
void zvol_insert(struct zvol_state *zv);
void zvol_log_truncate(struct zvol_state *zv, dmu_tx_t *tx, uint64_t off,
uint64_t len, boolean_t sync);
void zvol_log_write(struct zvol_state *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 {
int (*zv_setup_zv)(struct zvol_state *);
void (*zv_free)(void *);
void (*zv_rename_minor)(struct zvol_state *, const char *);
int (*zv_create_minor_impl)(const char *);
int (*zv_os_update_volsize)(struct zvol_state *, uint64_t);
void (*zv_os_clear_private)(struct zvol_state *);
boolean_t (*zv_is_zvol)(const char *);
} zvol_platform_ops_t;

void zvol_register_ops(const zvol_platform_ops_t *ops);

@@ -32,3 +32,4 @@ $(MODULE)-objs += ../os/linux/zfs/zpl_file.o
$(MODULE)-objs += ../os/linux/zfs/zpl_inode.o
$(MODULE)-objs += ../os/linux/zfs/zpl_super.o
$(MODULE)-objs += ../os/linux/zfs/zpl_xattr.o
$(MODULE)-objs += ../os/linux/zfs/zvol_os.o

0 comments on commit 749c541

Please sign in to comment.
You can’t perform that action at this time.