[Libguestfs] [PATCH] daemon: Run lsof when an umount command fails in umount_all call.

Richard W.M. Jones rjones at redhat.com
Thu Jul 23 17:26:59 UTC 2015


On Thu, Jul 23, 2015 at 04:36:50PM +0100, Richard W.M. Jones wrote:
> On Thu, Jul 23, 2015 at 05:29:43PM +0200, Pino Toscano wrote:
> > On Thursday 23 July 2015 16:24:23 Richard W.M. Jones wrote:
> > > Useful for debugging unmount failures.  Note that we include lsof in
> > > the appliance already.
> > > ---
> > >  daemon/mount.c | 4 ++++
> > >  1 file changed, 4 insertions(+)
> > > 
> > > diff --git a/daemon/mount.c b/daemon/mount.c
> > > index c5b7d89..e139482 100644
> > > --- a/daemon/mount.c
> > > +++ b/daemon/mount.c
> > > @@ -424,6 +424,10 @@ do_umount_all (void)
> > >      r = command (NULL, &err, str_umount, mounts.argv[i], NULL);
> > >      if (r == -1) {
> > >        reply_with_error ("umount: %s: %s", mounts.argv[i], err);
> > > +      if (verbose) {
> > > +        /* Try running lsof to see what is holding the mountpoint open. */
> > > +        command (NULL, NULL, "lsof", mounts.argv[i], NULL);
> > > +      }
> > >        free_stringslen (mounts.argv, mounts.size);
> > >        return -1;
> > >      }
> > 
> > LGTM. Maybe worth being done also on single umount API?
> 
> Unfortunately there's no actual output from 'lsof'.  I'm not sure if
> this is because I'm running lsof in the wrong way

I think it's because I'm running lsof the wrong way.  This should
be better:

diff --git a/daemon/mount.c b/daemon/mount.c
index c5b7d89..20a8d32 100644
--- a/daemon/mount.c
+++ b/daemon/mount.c
@@ -26,6 +26,8 @@
 #include <sys/types.h>
 #include <mntent.h>
 
+#include "ignore-value.h"
+
 #include "daemon.h"
 #include "actions.h"
 
@@ -421,6 +423,16 @@ do_umount_all (void)
   for (i = 0; i < mounts.size; ++i) {
     CLEANUP_FREE char *err = NULL;
 
+    if (verbose) {
+      CLEANUP_FREE char *cmd;
+
+      if (asprintf_nowarn (&cmd, "lsof %Q", mounts.argv[i]) == -1)
+        perror ("asprintf");
+      else
+        ignore_value (system (cmd));
+    }
+
     r = command (NULL, &err, str_umount, mounts.argv[i], NULL);
     if (r == -1) {
       reply_with_error ("umount: %s: %s", mounts.argv[i], err);


-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
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