• Xue jiufei's avatar
    ocfs2: dlmlock_master() should return DLM_NORMAL after adding lock to blocked list · 096b2ef8
    Xue jiufei authored
    dlmlock_master() returns DLM_RECOVERING/DLM_MIGRATING/ DLM_FORWAR after
    adding lock to blocked list if lockres has the state
    DLM_LOCK_RES_RECOVERING/DLM_LOCK_RES_MIGRATING/ DLM_LOCK_RES_IN_PROGRESS.
    so it will retry in dlmlock().  And this may cause dlm_thread fall into an
    infinite loop
    
    	Thread1                                  dlm_thread
    
      calls dlm_lock->dlmlock_master,
      if lockresA is in state
      DLM_LOCK_RES_RECOVERING, calls
      __dlm_wait_on_lockres() and waits
      until others threads clear this
      state;
    
      If cannot grant this lock,
      adding lock to blocked list,
      and return DLM_RECOVERING;
    
                                            Grant this lock and move it to
                                            grant list;
    
      After a while, retry and
      calls list_add_tail(), adding lock
      to blocked list again.
    
    Granted and blocked list of this lockres will become the following
    conditions:
    
        lock_res->granted.next = dlm_lock->list_head;
        lock_res->blocked.next = dlm_lock->list_head;
        dlm_lock->list_head.next = dlm_lock_resource->blocked;
    
    When dlm_thread traverses the granted list, it will fall into an endless
    loop, checking dlm_lock.list_head, dlm_lock->list_head.next
    (i.e.lock_res->blocked), lock_res->blocked.next(i.e.dlm_lock.list_head
    again) .....
    Signed-off-by: default avatarjoyce <xuejiufei@huawei.com>
    Reviewed-by: default avatarjensen <shencanquan@huawei.com>
    Cc: Jeff Liu <jeff.liu@oracle.com>
    Acked-by: default avatarSunil Mushran <sunil.mushran@gmail.com>
    Cc: Mark Fasheh <mfasheh@suse.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    096b2ef8
dlmlock.c 19.5 KB