mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-01-14 12:10:26 +03:00
Allow fetching the pool from the device at mount
To simplify integration with the xfstests test suite the mount.zfs helper has been extended. When passed a block device (/dev/sdX) to mount, instead of a pool/dataset, the pool name will be read from any existing zfs label and used. This allows you to mount the root dataset of a zfs filesystem by specifing any of the member vdevs. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
parent
389cf730ce
commit
0c1171dcb5
@ -211,17 +211,55 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If a file or directory in your current working directory is named
|
* Return the pool/dataset to mount given the name passed to mount. This
|
||||||
* 'dataset' then mount(8) will prepend your current working directory
|
* is expected to be of the form pool/dataset, however may also refer to
|
||||||
* to dataset. The is no way to prevent this behavior so we simply
|
* a block device if that device contains a valid zfs label.
|
||||||
* check for it and strip the prepended patch when it is added.
|
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
parse_dataset(char *dataset)
|
parse_dataset(char *dataset)
|
||||||
{
|
{
|
||||||
char cwd[PATH_MAX];
|
char cwd[PATH_MAX];
|
||||||
|
struct stat64 statbuf;
|
||||||
|
int error;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We expect a pool/dataset to be provided, however if we're
|
||||||
|
* given a device which is a member of a zpool we attempt to
|
||||||
|
* extract the pool name stored in the label. Given the pool
|
||||||
|
* name we can mount the root dataset.
|
||||||
|
*/
|
||||||
|
error = stat64(dataset, &statbuf);
|
||||||
|
if (error == 0) {
|
||||||
|
nvlist_t *config;
|
||||||
|
char *name;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = open(dataset, O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
error = zpool_read_label(fd, &config);
|
||||||
|
(void) close(fd);
|
||||||
|
if (error)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
error = nvlist_lookup_string(config,
|
||||||
|
ZPOOL_CONFIG_POOL_NAME, &name);
|
||||||
|
if (error == 0)
|
||||||
|
dataset = strdup(name);
|
||||||
|
|
||||||
|
nvlist_free(config);
|
||||||
|
return (dataset);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
/*
|
||||||
|
* If a file or directory in your current working directory is
|
||||||
|
* named 'dataset' then mount(8) will prepend your current working
|
||||||
|
* directory to the dataset. There is no way to prevent this
|
||||||
|
* behavior so we simply check for it and strip the prepended
|
||||||
|
* patch when it is added.
|
||||||
|
*/
|
||||||
if (getcwd(cwd, PATH_MAX) == NULL)
|
if (getcwd(cwd, PATH_MAX) == NULL)
|
||||||
return (dataset);
|
return (dataset);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user