autofs-5.1.8 - add function master_find_mapent_by_devid()

From: Ian Kent <raven@themaw.net>

Add a helper function that can locate an automount given its device id.

Signed-off-by: Ian Kent <raven@themaw.net>
---
 CHANGELOG        |    1 +
 daemon/master.c  |   28 ++++++++++++++++++++++++++++
 include/master.h |    1 +
 include/mounts.h |    1 +
 lib/mounts.c     |   34 ++++++++++++++++++++++++++++++++++
 5 files changed, 65 insertions(+)

diff --git a/CHANGELOG b/CHANGELOG
index 76dfb34a..5af03a7d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -64,6 +64,7 @@
 - rename statemachine() to signal_handler().
 - make signal handling consistent.
 - eliminate last remaining state_pipe usage.
+- add function master_find_mapent_by_devid().
 
 19/10/2021 autofs-5.1.8
 - add xdr_exports().
diff --git a/daemon/master.c b/daemon/master.c
index 284c5596..366fb622 100644
--- a/daemon/master.c
+++ b/daemon/master.c
@@ -745,6 +745,34 @@ struct master_mapent *master_find_mapent(struct master *master, const char *path
 	return NULL;
 }
 
+struct autofs_point *master_find_mapent_by_devid(struct master *master, dev_t devid)
+{
+	struct autofs_point *ap = NULL;
+	struct list_head *head, *p;
+
+	master_mutex_lock();
+
+	head = &master->mounts;
+	list_for_each(p, head) {
+		struct master_mapent *entry;
+
+		entry = list_entry(p, struct master_mapent, list);
+
+		if (entry->ap->dev == devid) {
+			ap = entry->ap;
+			break;
+		}
+
+		ap = mnt_find_submount_by_devid(&entry->ap->submounts, devid);
+		if (ap)
+			break;
+	}
+
+	master_mutex_unlock();
+
+	return ap;
+}
+
 static unsigned int master_partial_match_amd_mapent(struct master *master, const char *path)
 {
 	struct list_head *head, *p;
diff --git a/include/master.h b/include/master.h
index 056e5106..befeefa2 100644
--- a/include/master.h
+++ b/include/master.h
@@ -110,6 +110,7 @@ void master_source_lock_cleanup(void *);
 void master_source_current_wait(struct master_mapent *);
 void master_source_current_signal(struct master_mapent *);
 struct master_mapent *master_find_mapent(struct master *, const char *);
+struct autofs_point *master_find_mapent_by_devid(struct master *master, dev_t devid);
 struct master_mapent *master_new_mapent(struct master *, const char *, time_t);
 void master_add_mapent(struct master *, struct master_mapent *);
 void master_remove_mapent(struct master_mapent *);
diff --git a/include/mounts.h b/include/mounts.h
index 23c7ba1c..68ab4dc6 100644
--- a/include/mounts.h
+++ b/include/mounts.h
@@ -160,6 +160,7 @@ int ext_mount_inuse(const char *);
 struct mnt_list *mnts_lookup_mount(const char *mp);
 void mnts_put_mount(struct mnt_list *mnt);
 struct mnt_list *mnts_find_submount(const char *path);
+struct autofs_point *mnt_find_submount_by_devid(struct list_head *submounts, dev_t devid);
 struct mnt_list *mnts_add_submount(struct autofs_point *ap);
 void mnts_remove_submount(const char *mp);
 struct mnt_list *mnts_find_amdmount(const char *path);
diff --git a/lib/mounts.c b/lib/mounts.c
index 06a9cf00..ec28e2bc 100644
--- a/lib/mounts.c
+++ b/lib/mounts.c
@@ -1059,6 +1059,40 @@ struct mnt_list *mnts_find_submount(const char *path)
 	return NULL;
 }
 
+static struct autofs_point *__mnt_find_submount_by_devid(struct list_head *submounts, dev_t devid)
+{
+	struct autofs_point *ap = NULL;
+	struct list_head *p;
+
+	list_for_each(p, submounts) {
+		struct mnt_list *this;
+
+		this = list_entry(p, struct mnt_list, submount);
+
+		if (this->ap->dev == devid) {
+			ap = this->ap;
+			break;
+		}
+
+		ap = mnt_find_submount_by_devid(&this->ap->submounts, devid);
+		if (ap)
+			break;
+	}
+
+	return ap;
+}
+
+struct autofs_point *mnt_find_submount_by_devid(struct list_head *submounts, dev_t devid)
+{
+	struct autofs_point *ap = NULL;
+
+	mnts_hash_mutex_lock();
+	ap = __mnt_find_submount_by_devid(submounts, devid);
+	mnts_hash_mutex_unlock();
+
+	return ap;
+}
+
 struct mnt_list *mnts_add_submount(struct autofs_point *ap)
 {
 	struct mnt_list *this;