• Bob Peterson's avatar
    gfs2: conversion deadlock do_promote bypass · 66fa9912
    Bob Peterson authored
    Consider the following case:
    1. A glock is held in shared mode.
    2. A process requests the glock in exclusive mode (rename).
    3. Before the lock is granted, more processes (read / ls) request the
       glock in shared mode again.
    4. gfs2 sends a request to dlm for the lock in exclusive mode because
       that holder is at the head of the queue.
    5. Somehow the dlm request gets canceled, so dlm sends us back a
       response with state == LM_ST_SHARED and LM_OUT_CANCELED.  So at that
       point, the glock is still held in shared mode.
    6. finish_xmote gets called to process the response from dlm. It detects
       that the glock is not in the requested mode and no demote is in
       progress, so it moves the canceled holder to the tail of the queue
       and finds the new holder at the head of the queue.  That holder is
       requesting the glock in shared mode.
    7. finish_xmote calls do_xmote to transition the glock into shared mode,
       but the glock is already in shared mode and so do_xmote complains
       about that with:
    	GLOCK_BUG_ON(gl, gl->gl_state == gl->gl_target);
    
    Instead, in finish_xmote, after moving the canceled holder to the tail
    of the queue, check if any new holders can be granted.  Only call
    do_xmote to repeat the dlm request if the holder at the head of the
    queue is requesting the glock in a mode that is incompatible with the
    mode the glock is currently held in.
    Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    66fa9912
glock.c 72.9 KB