[Libguestfs] [PATCH 06/12] mount: Add mount_vfs_internal and umount_internal
Richard W.M. Jones
rjones at redhat.com
Fri Feb 8 12:07:35 UTC 2013
On Thu, Feb 07, 2013 at 03:57:52PM +0000, Matthew Booth wrote:
> These 2 internal functions allow mounting and unmounting of mountables
> outside /sysroot.
There seems to be some variable movement in this patch which confuses
things. Variable placement should be left alone in unrelated patches.
> daemon/daemon.h | 8 +++++
> daemon/mount.c | 103 +++++++++++++++++++++++++++++++++++++++-----------------
> 2 files changed, 81 insertions(+), 30 deletions(-)
>
> diff --git a/daemon/daemon.h b/daemon/daemon.h
> index a94c338..78591a0 100644
> --- a/daemon/daemon.h
> +++ b/daemon/daemon.h
> @@ -65,6 +65,14 @@ extern int xread (int sock, void *buf, size_t len)
>
> extern char *mountable_to_string (const mountable_t *mountable);
>
> +/*-- in mount.c --*/
> +
> +extern int mount_vfs_internal (const char *options, const char *vfstype,
> + const mountable_t *mountable,
> + const char *mp, const char *user_mp, char **err);
> +extern int umount_internal (const char *pathordevice,
> + int force, int lazyunmount, char **err);
> +
> /* Growable strings buffer. */
> struct stringsbuf {
> char **argv;
> diff --git a/daemon/mount.c b/daemon/mount.c
> index 484e45c..34510bd 100644
> --- a/daemon/mount.c
> +++ b/daemon/mount.c
> @@ -126,31 +126,44 @@ int
> do_mount_vfs (const char *options, const char *vfstype,
> const mountable_t *mountable, const char *mountpoint)
> {
> - int r;
> - CLEANUP_FREE char *mp = NULL;
> - CLEANUP_FREE char *error = NULL;
> - struct stat statbuf;
> -
> ABS_PATH (mountpoint, , return -1);
>
> - mp = sysroot_path (mountpoint);
> + CLEANUP_FREE char *mp = sysroot_path (mountpoint);
> if (!mp) {
> reply_with_perror ("malloc");
> return -1;
> }
>
> /* Check the mountpoint exists and is a directory. */
> + struct stat statbuf;
> if (stat (mp, &statbuf) == -1) {
> reply_with_perror ("mount: %s", mountpoint);
> return -1;
> }
> +
> if (!S_ISDIR (statbuf.st_mode)) {
> reply_with_perror ("mount: %s: mount point is not a directory", mountpoint);
> return -1;
> }
>
> + CLEANUP_FREE char *err = NULL;
> + int r = mount_vfs_internal (options, vfstype, mountable,
> + mp, mountpoint, &err);
> +
> + if (r == -1) {
> + reply_with_error ("%s", err ? err : "malloc");
> + }
> +
> + return r;
> +}
> +
> +int
> +mount_vfs_internal (const char *options, const char *vfstype,
> + const mountable_t *mountable,
> + const char *mp, const char *user_mp,
> + char **err)
> +{
> CLEANUP_FREE char *options_plus = NULL;
> - const char *device = mountable->device;
> switch (mountable->type) {
> case MOUNTABLE_DEVICE:
> break;
> @@ -160,24 +173,34 @@ do_mount_vfs (const char *options, const char *vfstype,
> if (asprintf (&options_plus, "subvol=%s,%s",
> mountable->volume, options) == -1)
> {
> - reply_with_perror ("asprintf");
> + /* No point trying to allocate more memory for an error message */
> + fprintf (stderr, "asprintf: %m\n");
> return -1;
This may or may not be a good thing, but it shouldn't be
a part of this patch.
On a separate point, just because asprintf fails doesn't mean that
reply_with_perror would fail. asprintf might have failed because
'options' was somehow an unterminated string (ie. it requested a huge
amount of memory), not because there's no memory left.
> }
> }
>
> else {
> if (asprintf (&options_plus, "subvol=%s", mountable->volume) == -1) {
> - reply_with_perror ("asprintf");
> + /* No point trying to allocate more memory for an error message */
> + fprintf (stderr, "asprintf: %m\n");
> return -1;
Ditto.
> }
> break;
>
> default:
> - reply_with_error ("Invalid mountable type: %i", mountable->type);
> + if (asprintf (err, "Invalid mountable type: %i", mountable->type) == -1)
> + {
> + /* No point trying to allocate more memory for an error message */
> + fprintf (stderr, "Invalid mountable type: %i", mountable->type);
> + fprintf (stderr, "asprintf: %m\n");
> + }
> return -1;
> }
Ditto.
I didn't review further. I think this patch needs reworking.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top
More information about the Libguestfs
mailing list