Print this page
*** NO COMMENTS ***
@@ -21,18 +21,19 @@
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
*/
/*
* System includes
*/
#include <assert.h>
#include <errno.h>
+#include <libgen.h>
#include <libintl.h>
#include <libnvpair.h>
#include <libzfs.h>
#include <stdio.h>
#include <stdlib.h>
@@ -324,19 +325,34 @@
gen_tmp_altroot = B_TRUE;
} else {
tmp_altroot = *altroot;
}
+ md.altroot = tmp_altroot;
+ md.shared_fs = flags & BE_MOUNT_FLAG_SHARED_FS;
+ md.shared_rw = flags & BE_MOUNT_FLAG_SHARED_RW;
+
/* Mount the BE's root file system */
+ if (getzoneid() == GLOBAL_ZONEID) {
if ((ret = be_mount_root(zhp, tmp_altroot)) != BE_SUCCESS) {
be_print_err(gettext("be_mount: failed to "
"mount BE root file system\n"));
if (gen_tmp_altroot)
free(tmp_altroot);
ZFS_CLOSE(zhp);
return (ret);
}
+ } else {
+ /* Legacy mount the zone root dataset */
+ if ((ret = be_mount_zone_root(zhp, &md)) != BE_SUCCESS) {
+ be_print_err(gettext("be_mount: failed to "
+ "mount BE zone root file system\n"));
+ free(md.altroot);
+ ZFS_CLOSE(zhp);
+ return (ret);
+ }
+ }
/* Iterate through BE's children filesystems */
if ((err = zfs_iter_filesystems(zhp, be_mount_callback,
tmp_altroot)) != 0) {
be_print_err(gettext("be_mount: failed to "
@@ -345,14 +361,10 @@
free(tmp_altroot);
ZFS_CLOSE(zhp);
return (err);
}
- md.altroot = tmp_altroot;
- md.shared_fs = flags & BE_MOUNT_FLAG_SHARED_FS;
- md.shared_rw = flags & BE_MOUNT_FLAG_SHARED_RW;
-
/*
* Mount shared file systems if mount flag says so.
*/
if (md.shared_fs) {
/*
@@ -526,14 +538,21 @@
ZFS_CLOSE(zhp);
return (zret);
}
/* Unmount this BE's root filesystem */
+ if (getzoneid() == GLOBAL_ZONEID) {
if ((ret = be_unmount_root(zhp, &ud)) != BE_SUCCESS) {
ZFS_CLOSE(zhp);
return (ret);
}
+ } else {
+ if ((ret = be_unmount_zone_root(zhp, &ud)) != BE_SUCCESS) {
+ ZFS_CLOSE(zhp);
+ return (ret);
+ }
+ }
ZFS_CLOSE(zhp);
return (BE_SUCCESS);
}
@@ -551,10 +570,11 @@
* Semi-private (library wide use only)
*/
int
be_mount_zone_root(zfs_handle_t *zhp, be_mount_data_t *md)
{
+ struct stat buf;
char mountpoint[MAXPATHLEN];
int err = 0;
/* Get mountpoint property of dataset */
if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
@@ -574,10 +594,20 @@
be_print_err(gettext("be_mount_zone_root: "
"zone root dataset mountpoint is not 'legacy'\n"));
return (BE_ERR_ZONE_ROOT_NOT_LEGACY);
}
+ /* Create the mountpoint if it doesn't exist */
+ if (lstat(md->altroot, &buf) != 0) {
+ if (mkdirp(md->altroot, 0755) != 0) {
+ err = errno;
+ be_print_err(gettext("be_mount_zone_root: failed "
+ "to create mountpoint %s\n"), md->altroot);
+ return (errno_to_be_err(err));
+ }
+ }
+
/*
* Legacy mount the zone root dataset.
*
* As a workaround for 6176743, we mount the zone's root with the
* MS_OVERLAY option in case an alternate BE is mounted, and we're