Merge commit 'refs/remotes/origin/linux-have-zvol' into HEAD
This commit is contained in:
commit
73a044f416
17
.topmsg
17
.topmsg
|
@ -1,19 +1,6 @@
|
||||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
Subject: [PATCH] zfs branch
|
Subject: [PATCH] linux have zvol
|
||||||
|
|
||||||
Merged result of all changes which are relevant to both Solaris
|
Use ZVOL if HAVE_ZVOL defined
|
||||||
and Linux builds of the ZFS code. These are changes where there
|
|
||||||
is a reasonable chance they will be accepted upstream.
|
|
||||||
|
|
||||||
Additionally, since this is effectively the root of the linux
|
|
||||||
ZFS tree the core linux build system is added here. This
|
|
||||||
includes autogen.sh, configure.ac, m4 macros, some scripts/*,
|
|
||||||
and makefiles for all the core ZFS components. Linux-only
|
|
||||||
features which require tweaks to the build system should appear
|
|
||||||
on the relevant topic branches. All autotools products which
|
|
||||||
result from autogen.sh are commited to the linux-configure-branch.
|
|
||||||
|
|
||||||
This branch also contains the META, ChangeLog, AUTHORS, TODO,
|
|
||||||
and README, files.
|
|
||||||
|
|
||||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
|
|
@ -4130,6 +4130,11 @@ zvol_create_link(libzfs_handle_t *hdl, const char *dataset)
|
||||||
static int
|
static int
|
||||||
zvol_create_link_common(libzfs_handle_t *hdl, const char *dataset, int ifexists)
|
zvol_create_link_common(libzfs_handle_t *hdl, const char *dataset, int ifexists)
|
||||||
{
|
{
|
||||||
|
#if !defined(HAVE_ZVOL)
|
||||||
|
return (zfs_standard_error_fmt(hdl, ENOTSUP,
|
||||||
|
dgettext(TEXT_DOMAIN, "cannot create device links "
|
||||||
|
"for '%s'"), dataset));
|
||||||
|
#else
|
||||||
zfs_cmd_t zc = { 0 };
|
zfs_cmd_t zc = { 0 };
|
||||||
di_devlink_handle_t dhdl;
|
di_devlink_handle_t dhdl;
|
||||||
priv_set_t *priv_effective;
|
priv_set_t *priv_effective;
|
||||||
|
@ -4218,6 +4223,7 @@ zvol_create_link_common(libzfs_handle_t *hdl, const char *dataset, int ifexists)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -4354,6 +4360,9 @@ zfs_expand_proplist(zfs_handle_t *zhp, zprop_list_t **plp)
|
||||||
int
|
int
|
||||||
zfs_iscsi_perm_check(libzfs_handle_t *hdl, char *dataset, ucred_t *cred)
|
zfs_iscsi_perm_check(libzfs_handle_t *hdl, char *dataset, ucred_t *cred)
|
||||||
{
|
{
|
||||||
|
#if !defined(HAVE_ZVOL)
|
||||||
|
return (ENOTSUP);
|
||||||
|
#else
|
||||||
zfs_cmd_t zc = { 0 };
|
zfs_cmd_t zc = { 0 };
|
||||||
nvlist_t *nvp;
|
nvlist_t *nvp;
|
||||||
gid_t gid;
|
gid_t gid;
|
||||||
|
@ -4395,6 +4404,7 @@ zfs_iscsi_perm_check(libzfs_handle_t *hdl, char *dataset, ucred_t *cred)
|
||||||
error = ioctl(hdl->libzfs_fd, ZFS_IOC_ISCSI_PERM_CHECK, &zc);
|
error = ioctl(hdl->libzfs_fd, ZFS_IOC_ISCSI_PERM_CHECK, &zc);
|
||||||
nvlist_free(nvp);
|
nvlist_free(nvp);
|
||||||
return (error);
|
return (error);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -2133,6 +2133,7 @@ int
|
||||||
zpool_iter_zvol(zpool_handle_t *zhp, int (*cb)(const char *, void *),
|
zpool_iter_zvol(zpool_handle_t *zhp, int (*cb)(const char *, void *),
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
libzfs_handle_t *hdl = zhp->zpool_hdl;
|
libzfs_handle_t *hdl = zhp->zpool_hdl;
|
||||||
char (*paths)[MAXPATHLEN];
|
char (*paths)[MAXPATHLEN];
|
||||||
size_t size = 4;
|
size_t size = 4;
|
||||||
|
@ -2224,7 +2225,8 @@ zpool_iter_zvol(zpool_handle_t *zhp, int (*cb)(const char *, void *),
|
||||||
err:
|
err:
|
||||||
free(paths);
|
free(paths);
|
||||||
(void) close(base);
|
(void) close(base);
|
||||||
return (-1);
|
#endif
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct zvol_cb {
|
typedef struct zvol_cb {
|
||||||
|
|
|
@ -1532,6 +1532,7 @@ zfs_set_prop_nvlist(const char *name, nvlist_t *nvl)
|
||||||
return (error);
|
return (error);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
case ZFS_PROP_VOLSIZE:
|
case ZFS_PROP_VOLSIZE:
|
||||||
if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
|
if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
|
||||||
(error = zvol_set_volsize(name,
|
(error = zvol_set_volsize(name,
|
||||||
|
@ -1544,6 +1545,11 @@ zfs_set_prop_nvlist(const char *name, nvlist_t *nvl)
|
||||||
(error = zvol_set_volblocksize(name, intval)) != 0)
|
(error = zvol_set_volblocksize(name, intval)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
break;
|
break;
|
||||||
|
#else
|
||||||
|
case ZFS_PROP_VOLSIZE:
|
||||||
|
case ZFS_PROP_VOLBLOCKSIZE:
|
||||||
|
return (ENOTSUP);
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
|
|
||||||
case ZFS_PROP_VERSION:
|
case ZFS_PROP_VERSION:
|
||||||
if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
|
if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
|
||||||
|
@ -1850,7 +1856,11 @@ zfs_ioc_get_fsacl(zfs_cmd_t *zc)
|
||||||
static int
|
static int
|
||||||
zfs_ioc_create_minor(zfs_cmd_t *zc)
|
zfs_ioc_create_minor(zfs_cmd_t *zc)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
return (zvol_create_minor(zc->zc_name, ddi_driver_major(zfs_dip)));
|
return (zvol_create_minor(zc->zc_name, ddi_driver_major(zfs_dip)));
|
||||||
|
#else
|
||||||
|
return (ENOTSUP);
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1862,7 +1872,11 @@ zfs_ioc_create_minor(zfs_cmd_t *zc)
|
||||||
static int
|
static int
|
||||||
zfs_ioc_remove_minor(zfs_cmd_t *zc)
|
zfs_ioc_remove_minor(zfs_cmd_t *zc)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
return (zvol_remove_minor(zc->zc_name));
|
return (zvol_remove_minor(zc->zc_name));
|
||||||
|
#else
|
||||||
|
return (ENOTSUP);
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2075,9 +2089,11 @@ zfs_ioc_create(zfs_cmd_t *zc)
|
||||||
cbfunc = zfs_create_cb;
|
cbfunc = zfs_create_cb;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
case DMU_OST_ZVOL:
|
case DMU_OST_ZVOL:
|
||||||
cbfunc = zvol_create_cb;
|
cbfunc = zvol_create_cb;
|
||||||
break;
|
break;
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
cbfunc = NULL;
|
cbfunc = NULL;
|
||||||
|
@ -2128,6 +2144,7 @@ zfs_ioc_create(zfs_cmd_t *zc)
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
if (type == DMU_OST_ZVOL) {
|
if (type == DMU_OST_ZVOL) {
|
||||||
uint64_t volsize, volblocksize;
|
uint64_t volsize, volblocksize;
|
||||||
|
|
||||||
|
@ -2157,7 +2174,9 @@ zfs_ioc_create(zfs_cmd_t *zc)
|
||||||
nvlist_free(nvprops);
|
nvlist_free(nvprops);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
} else if (type == DMU_OST_ZFS) {
|
} else
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
|
if (type == DMU_OST_ZFS) {
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2993,8 +3012,10 @@ zfsdev_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp)
|
||||||
uint_t vec;
|
uint_t vec;
|
||||||
int error, rc;
|
int error, rc;
|
||||||
|
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
if (getminor(dev) != 0)
|
if (getminor(dev) != 0)
|
||||||
return (zvol_ioctl(dev, cmd, arg, flag, cr, rvalp));
|
return (zvol_ioctl(dev, cmd, arg, flag, cr, rvalp));
|
||||||
|
#endif
|
||||||
|
|
||||||
vec = cmd - ZFS_IOC;
|
vec = cmd - ZFS_IOC;
|
||||||
ASSERT3U(getmajor(dev), ==, ddi_driver_major(zfs_dip));
|
ASSERT3U(getmajor(dev), ==, ddi_driver_major(zfs_dip));
|
||||||
|
@ -3106,6 +3127,7 @@ zfs_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
|
||||||
* so most of the standard driver entry points are in zvol.c.
|
* so most of the standard driver entry points are in zvol.c.
|
||||||
*/
|
*/
|
||||||
static struct cb_ops zfs_cb_ops = {
|
static struct cb_ops zfs_cb_ops = {
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
zvol_open, /* open */
|
zvol_open, /* open */
|
||||||
zvol_close, /* close */
|
zvol_close, /* close */
|
||||||
zvol_strategy, /* strategy */
|
zvol_strategy, /* strategy */
|
||||||
|
@ -3113,6 +3135,15 @@ static struct cb_ops zfs_cb_ops = {
|
||||||
zvol_dump, /* dump */
|
zvol_dump, /* dump */
|
||||||
zvol_read, /* read */
|
zvol_read, /* read */
|
||||||
zvol_write, /* write */
|
zvol_write, /* write */
|
||||||
|
#else
|
||||||
|
nodev, /* open */
|
||||||
|
nodev, /* close */
|
||||||
|
nodev, /* strategy */
|
||||||
|
nodev, /* print */
|
||||||
|
nodev, /* dump */
|
||||||
|
nodev, /* read */
|
||||||
|
nodev, /* write */
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
zfsdev_ioctl, /* ioctl */
|
zfsdev_ioctl, /* ioctl */
|
||||||
nodev, /* devmap */
|
nodev, /* devmap */
|
||||||
nodev, /* mmap */
|
nodev, /* mmap */
|
||||||
|
|
|
@ -77,8 +77,14 @@
|
||||||
#include <sys/dumphdr.h>
|
#include <sys/dumphdr.h>
|
||||||
#include <sys/zil_impl.h>
|
#include <sys/zil_impl.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_SPL
|
||||||
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/bitops_compat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "zfs_namecheck.h"
|
#include "zfs_namecheck.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
static void *zvol_state;
|
static void *zvol_state;
|
||||||
|
|
||||||
#define ZVOL_DUMPSIZE "dumpsize"
|
#define ZVOL_DUMPSIZE "dumpsize"
|
||||||
|
@ -149,6 +155,7 @@ zvol_size_changed(zvol_state_t *zv, major_t maj)
|
||||||
spec_size_invalidate(dev, VBLK);
|
spec_size_invalidate(dev, VBLK);
|
||||||
spec_size_invalidate(dev, VCHR);
|
spec_size_invalidate(dev, VCHR);
|
||||||
}
|
}
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
|
|
||||||
int
|
int
|
||||||
zvol_check_volsize(uint64_t volsize, uint64_t blocksize)
|
zvol_check_volsize(uint64_t volsize, uint64_t blocksize)
|
||||||
|
@ -159,10 +166,22 @@ zvol_check_volsize(uint64_t volsize, uint64_t blocksize)
|
||||||
if (volsize % blocksize != 0)
|
if (volsize % blocksize != 0)
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
|
|
||||||
#ifdef _ILP32
|
#ifdef HAVE_SPL
|
||||||
|
if (volsize % 512 != 0)
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On Linux, the maximum allowed block device size depends on the size
|
||||||
|
* of sector_t.
|
||||||
|
*/
|
||||||
|
if (fls64(volsize / 512 - 1) > NBBY * sizeof (sector_t))
|
||||||
|
return (EOVERFLOW);
|
||||||
|
|
||||||
|
#elif defined(_ILP32)
|
||||||
if (volsize - 1 > SPEC_MAXOFFSET_T)
|
if (volsize - 1 > SPEC_MAXOFFSET_T)
|
||||||
return (EOVERFLOW);
|
return (EOVERFLOW);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,6 +196,7 @@ zvol_check_volblocksize(uint64_t volblocksize)
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
static void
|
static void
|
||||||
zvol_readonly_changed_cb(void *arg, uint64_t newval)
|
zvol_readonly_changed_cb(void *arg, uint64_t newval)
|
||||||
{
|
{
|
||||||
|
@ -187,6 +207,7 @@ zvol_readonly_changed_cb(void *arg, uint64_t newval)
|
||||||
else
|
else
|
||||||
zv->zv_flags &= ~ZVOL_RDONLY;
|
zv->zv_flags &= ~ZVOL_RDONLY;
|
||||||
}
|
}
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
|
|
||||||
int
|
int
|
||||||
zvol_get_stats(objset_t *os, nvlist_t *nv)
|
zvol_get_stats(objset_t *os, nvlist_t *nv)
|
||||||
|
@ -212,6 +233,7 @@ zvol_get_stats(objset_t *os, nvlist_t *nv)
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
/*
|
/*
|
||||||
* Find a free minor number.
|
* Find a free minor number.
|
||||||
*/
|
*/
|
||||||
|
@ -1482,27 +1504,37 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp)
|
||||||
mutex_exit(&zvol_state_lock);
|
mutex_exit(&zvol_state_lock);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
|
|
||||||
int
|
int
|
||||||
zvol_busy(void)
|
zvol_busy(void)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
return (zvol_minors != 0);
|
return (zvol_minors != 0);
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zvol_init(void)
|
zvol_init(void)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
VERIFY(ddi_soft_state_init(&zvol_state, sizeof (zvol_state_t), 1) == 0);
|
VERIFY(ddi_soft_state_init(&zvol_state, sizeof (zvol_state_t), 1) == 0);
|
||||||
mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL);
|
mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zvol_fini(void)
|
zvol_fini(void)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
mutex_destroy(&zvol_state_lock);
|
mutex_destroy(&zvol_state_lock);
|
||||||
ddi_soft_state_fini(&zvol_state);
|
ddi_soft_state_fini(&zvol_state);
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_ZVOL
|
||||||
static boolean_t
|
static boolean_t
|
||||||
zvol_is_swap(zvol_state_t *zv)
|
zvol_is_swap(zvol_state_t *zv)
|
||||||
{
|
{
|
||||||
|
@ -1730,3 +1762,4 @@ zvol_dump_fini(zvol_state_t *zv)
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
#endif /* HAVE_ZVOL */
|
||||||
|
|
Loading…
Reference in New Issue