mnt: Fix mntflush "rpc tags" error
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Jan 2017 22:56:09 +0000 (17:56 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Jan 2017 22:56:09 +0000 (17:56 -0500)
This might be the third time we tried to fix this.  In this case, if a
process has a syscall in progress that is blocked in mntio(), then when
that process dies, its syscall will get aborted.  When this loop retried,
it would block and immediately fail again (rendez aborts when DYING).

Since this loop didn't allow aborts to happen (abort == retry, here), we
needed to special case when the process is actually dying and *really*
abort.

Ugh.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/mnt.c

index 8f946a3..52db491 100644 (file)
@@ -854,12 +854,17 @@ void mountio(struct mnt *m, struct mntrpc *r)
                /* Syscall aborts are like Plan 9 Eintr.  For those, we need to change
                 * the old request to a flsh (mntflushalloc) and try again.  We'll
                 * always try to flush, and you can't get out until the flush either
-                * succeeds or errors out with a non-abort/Eintr error. */
-               if (get_errno() != EINTR) {
-                       /* all other errors (not abort or Eintr) */
+                * succeeds or errors out with a non-abort/Eintr error.
+                *
+                * This all means that regular aborts cannot break us out of here!  We
+                * can consider that policy in the future, if we need to.  Regardless,
+                * if the process is dying, we really do need to abort. */
+               if ((get_errno() != EINTR) || proc_is_dying(current)) {
+                       /* all other errors or dying, bail out! */
                        mntflushfree(m, r);
                        nexterror();
                }
+               /* try again.  this is where you can get the "rpc tags" errstr. */
                r = mntflushalloc(r, m->msize);
                /* need one for every waserror call (so this plus one outside) */
                poperror();