Re: [PATCH] gfs2: Fix missed wakeups in find_insert_glock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Mar 11, 2019 at 10:52:44AM +0100, Andreas Gruenbacher wrote:
> commit 605b0487f0bc1ae9963bf52ece0f5c8055186f81 upstream.
> 
> Mark Syms has reported seeing tasks that are stuck waiting in
> find_insert_glock.  It turns out that struct lm_lockname contains four padding
> bytes on 64-bit architectures that function glock_waitqueue doesn't skip when
> hashing the glock name.  As a result, we can end up waking up the wrong
> waitqueue, and the waiting tasks may be stuck forever.
> 
> Fix that by using ht_parms.key_len instead of sizeof(struct lm_lockname) for
> the key length.
> 
> Reported-by: Mark Syms <mark.syms@xxxxxxxxxx>
> Signed-off-by: Andreas Gruenbacher <agruenba@xxxxxxxxxx>
> Signed-off-by: Bob Peterson <rpeterso@xxxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx # v4.14+
> ---
>  fs/gfs2/glock.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
> index f66773c71bcde..d32964cd11176 100644
> --- a/fs/gfs2/glock.c
> +++ b/fs/gfs2/glock.c
> @@ -107,7 +107,7 @@ static int glock_wake_function(wait_queue_entry_t *wait, unsigned int mode,
>  
>  static wait_queue_head_t *glock_waitqueue(struct lm_lockname *name)
>  {
> -	u32 hash = jhash2((u32 *)name, sizeof(*name) / 4, 0);
> +	u32 hash = jhash2((u32 *)name, ht_parms.key_len / 4, 0);
>  
>  	return glock_wait_table + hash_32(hash, GLOCK_WAIT_TABLE_BITS);
>  }
> -- 
> 2.20.1
> 

Now queued up, thanks.

greg k-h



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux