Ian Kent wrote:
> Oops, that's not quite right.
> Try this instead, of course the CHANGELOG hunk might not apply.
>
> autofs-5.0.4 - library reload fix update fix
>
> From: Ian Kent <ra...@themaw.net>
>
> The library reload fixes introduced a bug which causes autofs to
> incorrectly shutdown. Previously the signal handling thread only
> recieved signals either when they were explicity sent or it was
> time to shutdown so continuing on to call the signal handling
> routine was the correct thing to do. Now we need to join with
> the mount handling thread at exit but, in this case, we don't
> want to continue on to the signal handling routine as that will
> incorrectly cause the signal to be passed on to other mount
> handling threads.
> ---
>
>  CHANGELOG          |    1 +
>  daemon/automount.c |   13 +++++++++++--
>  lib/master.c       |    2 --
>  3 files changed, 12 insertions(+), 4 deletions(-)
>
>
> diff --git a/CHANGELOG b/CHANGELOG
> index 7ca45fd..5e01812 100644
> --- a/CHANGELOG
> +++ b/CHANGELOG
> @@ -44,6 +44,7 @@
>  - use intr option as hosts mount default.
>  - fix kernel includes.
>  - dont umount existing direct mount on master re-read.
> +- fix incorrect shutdown introduced by library relaod fixes.
>  
>  4/11/2008 autofs-5.0.4
>  -----------------------
> diff --git a/daemon/automount.c b/daemon/automount.c
> index 80691fa..d7e3e12 100644
> --- a/daemon/automount.c
> +++ b/daemon/automount.c
> @@ -1332,8 +1332,17 @@ static void *statemachine(void *arg)
>               case SIGTERM:
>               case SIGINT:
>               case SIGUSR2:
> -                     if (master_done(master_list))
> -                             return NULL;
> +                     master_mutex_lock();
> +                     if (!list_empty(&master_list->completed)) {
> +                             if (master_done(master_list)) {
> +                                     master_mutex_unlock();
> +                                     return NULL;
> +                             }
> +                             master_mutex_unlock();
> +                             break;
> +                     }
> +                     master_mutex_unlock();
> +
>               case SIGUSR1:
>                       do_signals(master_list, sig);
>                       break;
> diff --git a/lib/master.c b/lib/master.c
> index 762094f..e43f835 100644
> --- a/lib/master.c
> +++ b/lib/master.c
> @@ -1182,7 +1182,6 @@ int master_done(struct master *master)
>       struct master_mapent *entry;
>       int res = 0;
>  
> -     master_mutex_lock();
>       head = &master->completed;
>       p = head->next;
>       while (p != head) {
> @@ -1195,7 +1194,6 @@ int master_done(struct master *master)
>       }
>       if (list_empty(&master->mounts))
>               res = 1;
> -     master_mutex_unlock();
>  
>       return res;
>  }
>
>   
Ok, thanks a lot! I will try this.

Stef Bon

_______________________________________________
autofs mailing list
autofs@linux.kernel.org
http://linux.kernel.org/mailman/listinfo/autofs

Reply via email to