mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Add temporary mount options
Add the required kernel side infrastructure to parse arbitrary mount options. This enables us to support temporary mount options in largely the same way it is handled on other platforms. See the 'Temporary Mount Point Properties' section of zfs(8) for complete details. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #985 Closes #3351
This commit is contained in:
@@ -28,10 +28,14 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/mntent.h>
|
||||
#include <sys/stat.h>
|
||||
#include <libzfs.h>
|
||||
#include <locale.h>
|
||||
|
||||
#define ZS_COMMENT 0x00000000 /* comment */
|
||||
#define ZS_ZFSUTIL 0x00000001 /* caller is zfs(8) */
|
||||
|
||||
libzfs_handle_t *g_zfs;
|
||||
|
||||
typedef struct option_map {
|
||||
@@ -335,14 +339,18 @@ mtab_update(char *dataset, char *mntpoint, char *type, char *mntopts)
|
||||
}
|
||||
|
||||
static void
|
||||
__zfs_selinux_setcontext(const char *name, const char *context, char *mntopts,
|
||||
char *mtabopt)
|
||||
append_mntopt(const char *name, const char *val, char *mntopts,
|
||||
char *mtabopt, boolean_t quote)
|
||||
{
|
||||
char tmp[MNT_LINE_MAX];
|
||||
|
||||
snprintf(tmp, MNT_LINE_MAX, ",%s=\"%s\"", name, context);
|
||||
strlcat(mntopts, tmp, MNT_LINE_MAX);
|
||||
strlcat(mtabopt, tmp, MNT_LINE_MAX);
|
||||
snprintf(tmp, MNT_LINE_MAX, quote ? ",%s=\"%s\"" : ",%s=%s", name, val);
|
||||
|
||||
if (mntopts)
|
||||
strlcat(mntopts, tmp, MNT_LINE_MAX);
|
||||
|
||||
if (mtabopt)
|
||||
strlcat(mtabopt, tmp, MNT_LINE_MAX);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -354,7 +362,7 @@ zfs_selinux_setcontext(zfs_handle_t *zhp, zfs_prop_t zpt, const char *name,
|
||||
if (zfs_prop_get(zhp, zpt, context, sizeof (context),
|
||||
NULL, NULL, 0, B_FALSE) == 0) {
|
||||
if (strcmp(context, "none") != 0)
|
||||
__zfs_selinux_setcontext(name, context, mntopts, mtabopt);
|
||||
append_mntopt(name, context, mntopts, mtabopt, B_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -506,11 +514,14 @@ main(int argc, char **argv)
|
||||
ZFS_PROP_SELINUX_ROOTCONTEXT, MNTOPT_ROOTCONTEXT,
|
||||
mntopts, mtabopt);
|
||||
} else {
|
||||
__zfs_selinux_setcontext(MNTOPT_CONTEXT,
|
||||
prop, mntopts, mtabopt);
|
||||
append_mntopt(MNTOPT_CONTEXT, prop,
|
||||
mntopts, mtabopt, B_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/* A hint used to determine an auto-mounted snapshot mount point */
|
||||
append_mntopt(MNTOPT_MNTPOINT, mntpoint, mntopts, NULL, B_FALSE);
|
||||
|
||||
/* treat all snapshots as legacy mount points */
|
||||
if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT)
|
||||
(void) strlcpy(prop, ZFS_MOUNTPOINT_LEGACY, ZFS_MAXPROPLEN);
|
||||
|
||||
Reference in New Issue
Block a user