Linux does not HAVE_SMB_SHARE
Since Linux does not have an in-kernel SMB server, we don't need the code to manage it. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Melikov <mail@gmelikov.ru> Reviewed-by: Richard Elling <Richard.Elling@RichardElling.com> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Closes #8032
This commit is contained in:
parent
5fbf85c4e2
commit
49394a7708
|
@ -389,7 +389,6 @@ extern void zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, znode_t *zp,
|
|||
vsecattr_t *vsecp, zfs_fuid_info_t *fuidp);
|
||||
extern void zfs_xvattr_set(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx);
|
||||
extern void zfs_upgrade(zfsvfs_t *zfsvfs, dmu_tx_t *tx);
|
||||
extern int zfs_create_share_dir(zfsvfs_t *zfsvfs, dmu_tx_t *tx);
|
||||
|
||||
#if defined(HAVE_UIO_RW)
|
||||
extern caddr_t zfs_map_page(page_t *, enum seg_rw);
|
||||
|
|
|
@ -774,65 +774,16 @@ zfs_secpolicy_send_new(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
|
|||
ZFS_DELEG_PERM_SEND, cr));
|
||||
}
|
||||
|
||||
#ifdef HAVE_SMB_SHARE
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_secpolicy_deleg_share(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
|
||||
{
|
||||
vnode_t *vp;
|
||||
int error;
|
||||
|
||||
if ((error = lookupname(zc->zc_value, UIO_SYSSPACE,
|
||||
NO_FOLLOW, NULL, &vp)) != 0)
|
||||
return (error);
|
||||
|
||||
/* Now make sure mntpnt and dataset are ZFS */
|
||||
|
||||
if (vp->v_vfsp->vfs_fstype != zfsfstype ||
|
||||
(strcmp((char *)refstr_value(vp->v_vfsp->vfs_resource),
|
||||
zc->zc_name) != 0)) {
|
||||
VN_RELE(vp);
|
||||
return (SET_ERROR(EPERM));
|
||||
}
|
||||
|
||||
VN_RELE(vp);
|
||||
return (dsl_deleg_access(zc->zc_name,
|
||||
ZFS_DELEG_PERM_SHARE, cr));
|
||||
}
|
||||
#endif /* HAVE_SMB_SHARE */
|
||||
|
||||
int
|
||||
zfs_secpolicy_share(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
|
||||
{
|
||||
#ifdef HAVE_SMB_SHARE
|
||||
if (!INGLOBALZONE(curproc))
|
||||
return (SET_ERROR(EPERM));
|
||||
|
||||
if (secpolicy_nfs(cr) == 0) {
|
||||
return (0);
|
||||
} else {
|
||||
return (zfs_secpolicy_deleg_share(zc, innvl, cr));
|
||||
}
|
||||
#else
|
||||
return (SET_ERROR(ENOTSUP));
|
||||
#endif /* HAVE_SMB_SHARE */
|
||||
}
|
||||
|
||||
int
|
||||
zfs_secpolicy_smb_acl(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
|
||||
{
|
||||
#ifdef HAVE_SMB_SHARE
|
||||
if (!INGLOBALZONE(curproc))
|
||||
return (SET_ERROR(EPERM));
|
||||
|
||||
if (secpolicy_smb(cr) == 0) {
|
||||
return (0);
|
||||
} else {
|
||||
return (zfs_secpolicy_deleg_share(zc, innvl, cr));
|
||||
}
|
||||
#else
|
||||
return (SET_ERROR(ENOTSUP));
|
||||
#endif /* HAVE_SMB_SHARE */
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -5615,159 +5566,10 @@ zfs_ioc_diff(zfs_cmd_t *zc)
|
|||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove all ACL files in shares dir
|
||||
*/
|
||||
#ifdef HAVE_SMB_SHARE
|
||||
static int
|
||||
zfs_smb_acl_purge(znode_t *dzp)
|
||||
{
|
||||
zap_cursor_t zc;
|
||||
zap_attribute_t zap;
|
||||
zfsvfs_t *zfsvfs = ZTOZSB(dzp);
|
||||
int error;
|
||||
|
||||
for (zap_cursor_init(&zc, zfsvfs->z_os, dzp->z_id);
|
||||
(error = zap_cursor_retrieve(&zc, &zap)) == 0;
|
||||
zap_cursor_advance(&zc)) {
|
||||
if ((error = VOP_REMOVE(ZTOV(dzp), zap.za_name, kcred,
|
||||
NULL, 0)) != 0)
|
||||
break;
|
||||
}
|
||||
zap_cursor_fini(&zc);
|
||||
return (error);
|
||||
}
|
||||
#endif /* HAVE_SMB_SHARE */
|
||||
|
||||
static int
|
||||
zfs_ioc_smb_acl(zfs_cmd_t *zc)
|
||||
{
|
||||
#ifdef HAVE_SMB_SHARE
|
||||
vnode_t *vp;
|
||||
znode_t *dzp;
|
||||
vnode_t *resourcevp = NULL;
|
||||
znode_t *sharedir;
|
||||
zfsvfs_t *zfsvfs;
|
||||
nvlist_t *nvlist;
|
||||
char *src, *target;
|
||||
vattr_t vattr;
|
||||
vsecattr_t vsec;
|
||||
int error = 0;
|
||||
|
||||
if ((error = lookupname(zc->zc_value, UIO_SYSSPACE,
|
||||
NO_FOLLOW, NULL, &vp)) != 0)
|
||||
return (error);
|
||||
|
||||
/* Now make sure mntpnt and dataset are ZFS */
|
||||
|
||||
if (vp->v_vfsp->vfs_fstype != zfsfstype ||
|
||||
(strcmp((char *)refstr_value(vp->v_vfsp->vfs_resource),
|
||||
zc->zc_name) != 0)) {
|
||||
VN_RELE(vp);
|
||||
return (SET_ERROR(EINVAL));
|
||||
}
|
||||
|
||||
dzp = VTOZ(vp);
|
||||
zfsvfs = ZTOZSB(dzp);
|
||||
ZFS_ENTER(zfsvfs);
|
||||
|
||||
/*
|
||||
* Create share dir if its missing.
|
||||
*/
|
||||
mutex_enter(&zfsvfs->z_lock);
|
||||
if (zfsvfs->z_shares_dir == 0) {
|
||||
dmu_tx_t *tx;
|
||||
|
||||
tx = dmu_tx_create(zfsvfs->z_os);
|
||||
dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, TRUE,
|
||||
ZFS_SHARES_DIR);
|
||||
dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
|
||||
error = dmu_tx_assign(tx, TXG_WAIT);
|
||||
if (error != 0) {
|
||||
dmu_tx_abort(tx);
|
||||
} else {
|
||||
error = zfs_create_share_dir(zfsvfs, tx);
|
||||
dmu_tx_commit(tx);
|
||||
}
|
||||
if (error != 0) {
|
||||
mutex_exit(&zfsvfs->z_lock);
|
||||
VN_RELE(vp);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
}
|
||||
}
|
||||
mutex_exit(&zfsvfs->z_lock);
|
||||
|
||||
ASSERT(zfsvfs->z_shares_dir);
|
||||
if ((error = zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &sharedir)) != 0) {
|
||||
VN_RELE(vp);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
}
|
||||
|
||||
switch (zc->zc_cookie) {
|
||||
case ZFS_SMB_ACL_ADD:
|
||||
vattr.va_mask = AT_MODE|AT_UID|AT_GID|AT_TYPE;
|
||||
vattr.va_mode = S_IFREG|0777;
|
||||
vattr.va_uid = 0;
|
||||
vattr.va_gid = 0;
|
||||
|
||||
vsec.vsa_mask = VSA_ACE;
|
||||
vsec.vsa_aclentp = &full_access;
|
||||
vsec.vsa_aclentsz = sizeof (full_access);
|
||||
vsec.vsa_aclcnt = 1;
|
||||
|
||||
error = VOP_CREATE(ZTOV(sharedir), zc->zc_string,
|
||||
&vattr, EXCL, 0, &resourcevp, kcred, 0, NULL, &vsec);
|
||||
if (resourcevp)
|
||||
VN_RELE(resourcevp);
|
||||
break;
|
||||
|
||||
case ZFS_SMB_ACL_REMOVE:
|
||||
error = VOP_REMOVE(ZTOV(sharedir), zc->zc_string, kcred,
|
||||
NULL, 0);
|
||||
break;
|
||||
|
||||
case ZFS_SMB_ACL_RENAME:
|
||||
if ((error = get_nvlist(zc->zc_nvlist_src,
|
||||
zc->zc_nvlist_src_size, zc->zc_iflags, &nvlist)) != 0) {
|
||||
VN_RELE(vp);
|
||||
VN_RELE(ZTOV(sharedir));
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
}
|
||||
if (nvlist_lookup_string(nvlist, ZFS_SMB_ACL_SRC, &src) ||
|
||||
nvlist_lookup_string(nvlist, ZFS_SMB_ACL_TARGET,
|
||||
&target)) {
|
||||
VN_RELE(vp);
|
||||
VN_RELE(ZTOV(sharedir));
|
||||
ZFS_EXIT(zfsvfs);
|
||||
nvlist_free(nvlist);
|
||||
return (error);
|
||||
}
|
||||
error = VOP_RENAME(ZTOV(sharedir), src, ZTOV(sharedir), target,
|
||||
kcred, NULL, 0);
|
||||
nvlist_free(nvlist);
|
||||
break;
|
||||
|
||||
case ZFS_SMB_ACL_PURGE:
|
||||
error = zfs_smb_acl_purge(sharedir);
|
||||
break;
|
||||
|
||||
default:
|
||||
error = SET_ERROR(EINVAL);
|
||||
break;
|
||||
}
|
||||
|
||||
VN_RELE(vp);
|
||||
VN_RELE(ZTOV(sharedir));
|
||||
|
||||
ZFS_EXIT(zfsvfs);
|
||||
|
||||
return (error);
|
||||
#else
|
||||
return (SET_ERROR(ENOTSUP));
|
||||
#endif /* HAVE_SMB_SHARE */
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -329,55 +329,6 @@ zfs_znode_hold_exit(zfsvfs_t *zfsvfs, znode_hold_t *zh)
|
|||
kmem_cache_free(znode_hold_cache, zh);
|
||||
}
|
||||
|
||||
int
|
||||
zfs_create_share_dir(zfsvfs_t *zfsvfs, dmu_tx_t *tx)
|
||||
{
|
||||
#ifdef HAVE_SMB_SHARE
|
||||
zfs_acl_ids_t acl_ids;
|
||||
vattr_t vattr;
|
||||
znode_t *sharezp;
|
||||
vnode_t *vp;
|
||||
znode_t *zp;
|
||||
int error;
|
||||
|
||||
vattr.va_mask = AT_MODE|AT_UID|AT_GID|AT_TYPE;
|
||||
vattr.va_mode = S_IFDIR | 0555;
|
||||
vattr.va_uid = crgetuid(kcred);
|
||||
vattr.va_gid = crgetgid(kcred);
|
||||
|
||||
sharezp = kmem_cache_alloc(znode_cache, KM_SLEEP);
|
||||
sharezp->z_moved = 0;
|
||||
sharezp->z_unlinked = 0;
|
||||
sharezp->z_atime_dirty = 0;
|
||||
sharezp->z_zfsvfs = zfsvfs;
|
||||
sharezp->z_is_sa = zfsvfs->z_use_sa;
|
||||
sharezp->z_pflags = 0;
|
||||
|
||||
vp = ZTOV(sharezp);
|
||||
vn_reinit(vp);
|
||||
vp->v_type = VDIR;
|
||||
|
||||
VERIFY(0 == zfs_acl_ids_create(sharezp, IS_ROOT_NODE, &vattr,
|
||||
kcred, NULL, &acl_ids));
|
||||
zfs_mknode(sharezp, &vattr, tx, kcred, IS_ROOT_NODE, &zp, &acl_ids);
|
||||
ASSERT3P(zp, ==, sharezp);
|
||||
ASSERT(!vn_in_dnlc(ZTOV(sharezp))); /* not valid to move */
|
||||
POINTER_INVALIDATE(&sharezp->z_zfsvfs);
|
||||
error = zap_add(zfsvfs->z_os, MASTER_NODE_OBJ,
|
||||
ZFS_SHARES_DIR, 8, 1, &sharezp->z_id, tx);
|
||||
zfsvfs->z_shares_dir = sharezp->z_id;
|
||||
|
||||
zfs_acl_ids_free(&acl_ids);
|
||||
// ZTOV(sharezp)->v_count = 0;
|
||||
sa_handle_destroy(sharezp->z_sa_hdl);
|
||||
kmem_cache_free(znode_cache, sharezp);
|
||||
|
||||
return (error);
|
||||
#else
|
||||
return (0);
|
||||
#endif /* HAVE_SMB_SHARE */
|
||||
}
|
||||
|
||||
static void
|
||||
zfs_znode_sa_init(zfsvfs_t *zfsvfs, znode_t *zp,
|
||||
dmu_buf_t *db, dmu_object_type_t obj_type, sa_handle_t *sa_hdl)
|
||||
|
@ -1977,12 +1928,6 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
|||
sa_handle_destroy(rootzp->z_sa_hdl);
|
||||
kmem_cache_free(znode_cache, rootzp);
|
||||
|
||||
/*
|
||||
* Create shares directory
|
||||
*/
|
||||
error = zfs_create_share_dir(zfsvfs, tx);
|
||||
ASSERT(error == 0);
|
||||
|
||||
for (i = 0; i != size; i++) {
|
||||
avl_destroy(&zfsvfs->z_hold_trees[i]);
|
||||
mutex_destroy(&zfsvfs->z_hold_locks[i]);
|
||||
|
|
Loading…
Reference in New Issue