Re: [PATCH] autofs: serialize allocation of global wait queue tokens

From: Ian Kent

Date: Tue Nov 10 2026 - 23:33:23 EST


On Wed, 2026-11-11 at 11:40 +0800, Zhu Jun wrote:
> autofs_next_wait_queue is shared by all autofs superblocks, while
> sbi->wq_mutex only serializes requests on one superblock. Concurrent
> requests on different mounts can therefore lose updates to the global
> counter. A delayed update can also move it backwards, allowing an
> outstanding token to be reused on a mount.
>
> Protect token allocation with a global spinlock. Keep the existing
> token
> type and the wraparound rule that reserves zero.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Signed-off-by: Zhu Jun <zhujun2@xxxxxxxxxxxxxxxxxxxx>

Yeah, good catch ...

Acked-by: Ian Kent <raven@xxxxxxxxxx>

> ---
>  fs/autofs/waitq.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/fs/autofs/waitq.c b/fs/autofs/waitq.c
> index 92c0bbbf452b..22bc59c2f63e 100644
> --- a/fs/autofs/waitq.c
> +++ b/fs/autofs/waitq.c
> @@ -5,12 +5,14 @@
>   */
>  
>  #include <linux/sched/signal.h>
> +#include <linux/spinlock.h>
>  #include "autofs_i.h"
>  
>  /* We make this a static variable rather than a part of the
> superblock; it
>   * is better if we don't reassign numbers easily even across
> filesystems
>   */
>  static autofs_wqt_t autofs_next_wait_queue = 1;
> +static DEFINE_SPINLOCK(autofs_wait_queue_lock);
>  
>  static void autofs_catatonic_mode_locked(struct autofs_sb_info *sbi)
>  {
> @@ -396,9 +398,11 @@ int autofs_wait(struct autofs_sb_info *sbi,
>   return -ENOMEM;
>   }
>  
> + spin_lock(&autofs_wait_queue_lock);
>   wq->wait_queue_token = autofs_next_wait_queue;
>   if (++autofs_next_wait_queue == 0)
>   autofs_next_wait_queue = 1;
> + spin_unlock(&autofs_wait_queue_lock);
>   wq->next = sbi->queues;
>   sbi->queues = wq;
>   init_waitqueue_head(&wq->queue);