xref: /freebsd/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_zmount.c (revision 61145dc2b94f12f6a47344fb9aac702321880e43)
1*61145dc2SMartin Matuska // SPDX-License-Identifier: BSD-2-Clause
2eda14cbcSMatt Macy /*
3eda14cbcSMatt Macy  * Copyright (c) 2006 Pawel Jakub Dawidek <pjd@FreeBSD.org>
4eda14cbcSMatt Macy  * All rights reserved.
5eda14cbcSMatt Macy  *
6eda14cbcSMatt Macy  * Redistribution and use in source and binary forms, with or without
7eda14cbcSMatt Macy  * modification, are permitted provided that the following conditions
8eda14cbcSMatt Macy  * are met:
9eda14cbcSMatt Macy  * 1. Redistributions of source code must retain the above copyright
10eda14cbcSMatt Macy  *    notice, this list of conditions and the following disclaimer.
11eda14cbcSMatt Macy  * 2. Redistributions in binary form must reproduce the above copyright
12eda14cbcSMatt Macy  *    notice, this list of conditions and the following disclaimer in the
13eda14cbcSMatt Macy  *    documentation and/or other materials provided with the distribution.
14eda14cbcSMatt Macy  *
15eda14cbcSMatt Macy  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
16eda14cbcSMatt Macy  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17eda14cbcSMatt Macy  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18eda14cbcSMatt Macy  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
19eda14cbcSMatt Macy  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20eda14cbcSMatt Macy  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21eda14cbcSMatt Macy  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22eda14cbcSMatt Macy  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23eda14cbcSMatt Macy  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24eda14cbcSMatt Macy  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25eda14cbcSMatt Macy  * SUCH DAMAGE.
26eda14cbcSMatt Macy  */
27eda14cbcSMatt Macy 
28eda14cbcSMatt Macy /*
29eda14cbcSMatt Macy  * This file implements Solaris compatible zmount() function.
30eda14cbcSMatt Macy  */
31eda14cbcSMatt Macy 
32eda14cbcSMatt Macy #include <sys/param.h>
33eda14cbcSMatt Macy #include <sys/mount.h>
34eda14cbcSMatt Macy #include <sys/uio.h>
35eda14cbcSMatt Macy #include <sys/mntent.h>
36eda14cbcSMatt Macy #include <assert.h>
37eda14cbcSMatt Macy #include <stdio.h>
38eda14cbcSMatt Macy #include <stdlib.h>
39eda14cbcSMatt Macy #include <string.h>
40eda14cbcSMatt Macy #include <sys/mnttab.h>
41eda14cbcSMatt Macy #include <sys/errno.h>
42eda14cbcSMatt Macy #include <libzfs.h>
43eda14cbcSMatt Macy 
4416038816SMartin Matuska #include "../../libzfs_impl.h"
45eda14cbcSMatt Macy 
46eda14cbcSMatt Macy static void
build_iovec(struct iovec ** iov,int * iovlen,const char * name,void * val,size_t len)47eda14cbcSMatt Macy build_iovec(struct iovec **iov, int *iovlen, const char *name, void *val,
48eda14cbcSMatt Macy     size_t len)
49eda14cbcSMatt Macy {
50eda14cbcSMatt Macy 	int i;
51eda14cbcSMatt Macy 
52eda14cbcSMatt Macy 	if (*iovlen < 0)
53eda14cbcSMatt Macy 		return;
54eda14cbcSMatt Macy 	i = *iovlen;
55eda14cbcSMatt Macy 	*iov = realloc(*iov, sizeof (**iov) * (i + 2));
56eda14cbcSMatt Macy 	if (*iov == NULL) {
57eda14cbcSMatt Macy 		*iovlen = -1;
58eda14cbcSMatt Macy 		return;
59eda14cbcSMatt Macy 	}
60eda14cbcSMatt Macy 	(*iov)[i].iov_base = strdup(name);
61eda14cbcSMatt Macy 	(*iov)[i].iov_len = strlen(name) + 1;
62eda14cbcSMatt Macy 	i++;
63eda14cbcSMatt Macy 	(*iov)[i].iov_base = val;
64eda14cbcSMatt Macy 	if (len == (size_t)-1) {
65eda14cbcSMatt Macy 		if (val != NULL)
66eda14cbcSMatt Macy 			len = strlen(val) + 1;
67eda14cbcSMatt Macy 		else
68eda14cbcSMatt Macy 			len = 0;
69eda14cbcSMatt Macy 	}
70eda14cbcSMatt Macy 	(*iov)[i].iov_len = (int)len;
71eda14cbcSMatt Macy 	*iovlen = ++i;
72eda14cbcSMatt Macy }
73eda14cbcSMatt Macy 
74bb2d13b6SMartin Matuska int
do_mount(zfs_handle_t * zhp,const char * mntpt,const char * opts,int flags)75bb2d13b6SMartin Matuska do_mount(zfs_handle_t *zhp, const char *mntpt, const char *opts, int flags)
76eda14cbcSMatt Macy {
77eda14cbcSMatt Macy 	struct iovec *iov;
78eda14cbcSMatt Macy 	char *optstr, *p, *tofree;
79eda14cbcSMatt Macy 	int iovlen, rv;
80bb2d13b6SMartin Matuska 	const char *spec = zfs_get_name(zhp);
81eda14cbcSMatt Macy 
82eda14cbcSMatt Macy 	assert(spec != NULL);
83bb2d13b6SMartin Matuska 	assert(mntpt != NULL);
84bb2d13b6SMartin Matuska 	assert(opts != NULL);
85eda14cbcSMatt Macy 
86bb2d13b6SMartin Matuska 	tofree = optstr = strdup(opts);
87eda14cbcSMatt Macy 	assert(optstr != NULL);
88eda14cbcSMatt Macy 
89eda14cbcSMatt Macy 	iov = NULL;
90eda14cbcSMatt Macy 	iovlen = 0;
91eda14cbcSMatt Macy 	if (strstr(optstr, MNTOPT_REMOUNT) != NULL)
92eda14cbcSMatt Macy 		build_iovec(&iov, &iovlen, "update", NULL, 0);
93bb2d13b6SMartin Matuska 	if (flags & MS_RDONLY)
94eda14cbcSMatt Macy 		build_iovec(&iov, &iovlen, "ro", NULL, 0);
95a0b956f5SMartin Matuska 	build_iovec(&iov, &iovlen, "fstype", __DECONST(char *, MNTTYPE_ZFS),
96a0b956f5SMartin Matuska 	    (size_t)-1);
97bb2d13b6SMartin Matuska 	build_iovec(&iov, &iovlen, "fspath", __DECONST(char *, mntpt),
98eda14cbcSMatt Macy 	    (size_t)-1);
99eda14cbcSMatt Macy 	build_iovec(&iov, &iovlen, "from", __DECONST(char *, spec), (size_t)-1);
100eda14cbcSMatt Macy 	while ((p = strsep(&optstr, ",/")) != NULL)
101eda14cbcSMatt Macy 		build_iovec(&iov, &iovlen, p, NULL, (size_t)-1);
102eda14cbcSMatt Macy 	rv = nmount(iov, iovlen, 0);
103eda14cbcSMatt Macy 	free(tofree);
104eda14cbcSMatt Macy 	if (rv < 0)
105eda14cbcSMatt Macy 		return (errno);
106eda14cbcSMatt Macy 	return (rv);
107eda14cbcSMatt Macy 
108eda14cbcSMatt Macy }
109eda14cbcSMatt Macy 
110eda14cbcSMatt Macy int
do_unmount(zfs_handle_t * zhp,const char * mntpt,int flags)1113f9d360cSMartin Matuska do_unmount(zfs_handle_t *zhp, const char *mntpt, int flags)
112eda14cbcSMatt Macy {
113e92ffd9bSMartin Matuska 	(void) zhp;
1149db44a8eSMartin Matuska 	if (unmount(mntpt, flags) < 0)
1159db44a8eSMartin Matuska 		return (errno);
1169db44a8eSMartin Matuska 	return (0);
117eda14cbcSMatt Macy }
118eda14cbcSMatt Macy 
119eda14cbcSMatt Macy int
zfs_mount_delegation_check(void)120eda14cbcSMatt Macy zfs_mount_delegation_check(void)
121eda14cbcSMatt Macy {
122eda14cbcSMatt Macy 	return (0);
123eda14cbcSMatt Macy }
12453b70c86SMartin Matuska 
12553b70c86SMartin Matuska /* Called from the tail end of zpool_disable_datasets() */
12653b70c86SMartin Matuska void
zpool_disable_datasets_os(zpool_handle_t * zhp,boolean_t force)12753b70c86SMartin Matuska zpool_disable_datasets_os(zpool_handle_t *zhp, boolean_t force)
12853b70c86SMartin Matuska {
129e92ffd9bSMartin Matuska 	(void) zhp, (void) force;
13053b70c86SMartin Matuska }
13153b70c86SMartin Matuska 
13253b70c86SMartin Matuska /* Called from the tail end of zfs_unmount() */
13353b70c86SMartin Matuska void
zpool_disable_volume_os(const char * name)13453b70c86SMartin Matuska zpool_disable_volume_os(const char *name)
13553b70c86SMartin Matuska {
136e92ffd9bSMartin Matuska 	(void) name;
13753b70c86SMartin Matuska }
138