6052 decouple lzc_create() from the implementation details
illumos/illumos-gate@26455f9efc
26455f9efc
https://www.illumos.org/issues/6052
At the moment type parameter of lzc_create() is of dmu_objset_type_t type.
That exposes an implementation detail and requires sys/fs/zfs.h to be included
in libzfs_core.h creating unnecessary coupling between libzfs_core interface
and ZFS internals.
I think that dmu_objset_type_t should be replaced with a libzfs_core
enumeration of supported dataset types.
For ABI reasons the new enumeration could be bit-compatible with
dmu_objset_type_t.
For example:
typedef enum {
LZC_DST_ZFS = 2,
LZC_DST_ZVOL
} lzc_dataset_type_t;
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Author: Andriy Gapon <andriy.gapon@clusterhq.com>
This commit is contained in:
parent
6257b60dd0
commit
0efd880fa0
@ -3152,7 +3152,7 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type,
|
||||
uint64_t blocksize = zfs_prop_default_numeric(ZFS_PROP_VOLBLOCKSIZE);
|
||||
char errbuf[1024];
|
||||
uint64_t zoned;
|
||||
dmu_objset_type_t ost;
|
||||
enum lzc_dataset_type ost;
|
||||
|
||||
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
||||
"cannot create '%s'"), path);
|
||||
@ -3179,9 +3179,9 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type,
|
||||
}
|
||||
|
||||
if (type == ZFS_TYPE_VOLUME)
|
||||
ost = DMU_OST_ZVOL;
|
||||
ost = LZC_DATSET_TYPE_ZVOL;
|
||||
else
|
||||
ost = DMU_OST_ZFS;
|
||||
ost = LZC_DATSET_TYPE_ZFS;
|
||||
|
||||
/* open zpool handle for prop validation */
|
||||
char pool_path[MAXNAMELEN];
|
||||
|
@ -171,11 +171,11 @@ lzc_ioctl(zfs_ioc_t ioc, const char *name,
|
||||
}
|
||||
|
||||
int
|
||||
lzc_create(const char *fsname, dmu_objset_type_t type, nvlist_t *props)
|
||||
lzc_create(const char *fsname, enum lzc_dataset_type type, nvlist_t *props)
|
||||
{
|
||||
int error;
|
||||
nvlist_t *args = fnvlist_alloc();
|
||||
fnvlist_add_int32(args, "type", type);
|
||||
fnvlist_add_int32(args, "type", (dmu_objset_type_t)type);
|
||||
if (props != NULL)
|
||||
fnvlist_add_nvlist(args, "props", props);
|
||||
error = lzc_ioctl(ZFS_IOC_CREATE, fsname, args, NULL);
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include <libnvpair.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/fs/zfs.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -39,8 +38,16 @@ extern "C" {
|
||||
int libzfs_core_init(void);
|
||||
void libzfs_core_fini(void);
|
||||
|
||||
/*
|
||||
* NB: this type should be kept binary compatible with dmu_objset_type_t.
|
||||
*/
|
||||
enum lzc_dataset_type {
|
||||
LZC_DATSET_TYPE_ZFS = 2,
|
||||
LZC_DATSET_TYPE_ZVOL
|
||||
};
|
||||
|
||||
int lzc_snapshot(nvlist_t *, nvlist_t *, nvlist_t **);
|
||||
int lzc_create(const char *, dmu_objset_type_t, nvlist_t *);
|
||||
int lzc_create(const char *, enum lzc_dataset_type, nvlist_t *);
|
||||
int lzc_clone(const char *, const char *, nvlist_t *);
|
||||
int lzc_destroy_snaps(nvlist_t *, boolean_t, nvlist_t **);
|
||||
int lzc_bookmark(nvlist_t *, nvlist_t **);
|
||||
|
@ -54,6 +54,10 @@ typedef enum {
|
||||
ZFS_TYPE_BOOKMARK = (1 << 4)
|
||||
} zfs_type_t;
|
||||
|
||||
/*
|
||||
* NB: lzc_dataset_type should be updated whenever a new objset type is added,
|
||||
* if it represents a real type of a dataset that can be created from userland.
|
||||
*/
|
||||
typedef enum dmu_objset_type {
|
||||
DMU_OST_NONE,
|
||||
DMU_OST_META,
|
||||
|
Loading…
Reference in New Issue
Block a user