|
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 |
}
|