Ian Kent d55e64
autofs-5.0.3 - wait submount expire complete
Ian Kent d55e64
Ian Kent d55e64
From: Ian Kent <raven@themaw.net>
Ian Kent d55e64
Ian Kent d55e64
When expiring a submount expires away and proceeds to shutdown we
Ian Kent d55e64
can reach the end of the expire of the parent before the submount
Ian Kent d55e64
goes away. This can cause an incomplete expire during shutdown in
Ian Kent d55e64
some cases so, for the case the submount goes to state ST_SHUTDOWN,
Ian Kent d55e64
we need to wait until the submount either goes away or fails to
Ian Kent d55e64
shutdown before continuing.
Ian Kent d55e64
---
Ian Kent d55e64
Ian Kent d55e64
 lib/master.c |   23 +++++++++++++++++++++++
Ian Kent d55e64
 1 file changed, 23 insertions(+)
Ian Kent d55e64
Ian Kent d55e64
Ian Kent d55e64
--- autofs-5.0.3.orig/lib/master.c
Ian Kent d55e64
+++ autofs-5.0.3/lib/master.c
Ian Kent d55e64
@@ -870,6 +870,29 @@ int master_notify_submount(struct autofs
Ian Kent d55e64
 
Ian Kent d55e64
 		st_wait_task(this, state, 0);
Ian Kent d55e64
 
Ian Kent d55e64
+		/*
Ian Kent d55e64
+		 * If our submount gets to state ST_SHUTDOWN we need to
Ian Kent d55e64
+		 * wait until it goes away or changes to ST_READY.
Ian Kent d55e64
+		 */
Ian Kent d55e64
+		mounts_mutex_lock(ap);
Ian Kent d55e64
+		st_mutex_lock();
Ian Kent d55e64
+		while ((this = __master_find_submount(ap, path))) {
Ian Kent d55e64
+			struct timespec t = { 0, 300000000 };
Ian Kent d55e64
+			struct timespec r;
Ian Kent d55e64
+
Ian Kent d55e64
+			if (this->state != ST_SHUTDOWN)
Ian Kent d55e64
+				break;
Ian Kent d55e64
+
Ian Kent d55e64
+			st_mutex_unlock();
Ian Kent d55e64
+			mounts_mutex_unlock(ap);
Ian Kent d55e64
+			while (nanosleep(&t, &r) == -1 && errno == EINTR)
Ian Kent d55e64
+				memcpy(&t, &r, sizeof(struct timespec));
Ian Kent d55e64
+			mounts_mutex_lock(ap);
Ian Kent d55e64
+			st_mutex_lock();
Ian Kent d55e64
+		}
Ian Kent d55e64
+		st_mutex_unlock();
Ian Kent d55e64
+		mounts_mutex_unlock(ap);
Ian Kent d55e64
+
Ian Kent d55e64
 		return ret;
Ian Kent d55e64
 
Ian Kent d55e64
 	}