autofs-5.1.8 - add function master_find_mapent_by_devid() From: Ian Kent Add a helper function that can locate an automount given its device id. Signed-off-by: Ian Kent --- 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;