mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	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); |     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_xvattr_set(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx); | ||||||
| extern void zfs_upgrade(zfsvfs_t *zfsvfs, 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) | #if defined(HAVE_UIO_RW) | ||||||
| extern caddr_t zfs_map_page(page_t *, enum seg_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)); | 	    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 | int | ||||||
| zfs_secpolicy_share(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr) | 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)); | 	return (SET_ERROR(ENOTSUP)); | ||||||
| #endif /* HAVE_SMB_SHARE */ |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int | int | ||||||
| zfs_secpolicy_smb_acl(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr) | 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)); | 	return (SET_ERROR(ENOTSUP)); | ||||||
| #endif /* HAVE_SMB_SHARE */ |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| @ -5615,159 +5566,10 @@ zfs_ioc_diff(zfs_cmd_t *zc) | |||||||
| 	return (error); | 	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 | static int | ||||||
| zfs_ioc_smb_acl(zfs_cmd_t *zc) | 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)); | 	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); | 		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 | static void | ||||||
| zfs_znode_sa_init(zfsvfs_t *zfsvfs, znode_t *zp, | 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) |     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); | 	sa_handle_destroy(rootzp->z_sa_hdl); | ||||||
| 	kmem_cache_free(znode_cache, rootzp); | 	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++) { | 	for (i = 0; i != size; i++) { | ||||||
| 		avl_destroy(&zfsvfs->z_hold_trees[i]); | 		avl_destroy(&zfsvfs->z_hold_trees[i]); | ||||||
| 		mutex_destroy(&zfsvfs->z_hold_locks[i]); | 		mutex_destroy(&zfsvfs->z_hold_locks[i]); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Matthew Ahrens
						Matthew Ahrens