linux-kernel-test/fs/ocfs2
Xue jiufei 096b2ef83c ocfs2: dlmlock_master() should return DLM_NORMAL after adding lock to blocked list
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: joyce <xuejiufei@huawei.com>
Reviewed-by: jensen <shencanquan@huawei.com>
Cc: Jeff Liu <jeff.liu@oracle.com>
Acked-by: Sunil Mushran <sunil.mushran@gmail.com>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2013-07-03 16:07:24 -07:00
..
cluster fs/ocfs2/cluster/tcp.c: free sc->sc_page in sc_kref_release() 2013-07-03 16:07:23 -07:00
dlm ocfs2: dlmlock_master() should return DLM_NORMAL after adding lock to blocked list 2013-07-03 16:07:24 -07:00
dlmfs fs: Limit sys_mount to only request filesystem modules. 2013-03-03 19:36:31 -08:00
acl.c ocfs2: Handle kuids and kgids in acl/xattr conversions. 2013-02-13 06:00:56 -08:00
acl.h
alloc.c ocfs2: fix mutex_unlock and possible memory leak in ocfs2_remove_btree_range 2013-07-03 16:07:23 -07:00
alloc.h
aops.c ocfs2: use ->invalidatepage() length argument 2013-05-21 23:58:46 -04:00
aops.h aio: don't include aio.h in sched.h 2013-05-07 20:16:25 -07:00
blockcheck.c ocfs2: kill endianness abuses in blockcheck.c 2012-05-29 23:28:35 -04:00
blockcheck.h
buffer_head_io.c
buffer_head_io.h
dcache.c hlist: drop the node parameter from iterators 2013-02-27 19:10:24 -08:00
dcache.h
dir.c [readdir] convert ocfs2 2013-06-29 12:57:02 +04:00
dir.h [readdir] convert ocfs2 2013-06-29 12:57:02 +04:00
dlmglue.c aio: remove retry-based AIO 2013-05-07 18:38:27 -07:00
dlmglue.h
export.c fs: encode_fh: return FILEID_INVALID if invalid fid_type 2013-02-26 02:46:10 -05:00
export.h
extent_map.c ocfs2: goto out_unlock if ocfs2_get_clusters_nocache() failed in ocfs2_fiemap() 2013-05-24 16:22:52 -07:00
extent_map.h
file.c vfs: export lseek_execute() to modules 2013-07-03 16:23:27 +04:00
file.h
heartbeat.c
heartbeat.h
inode.c ocfs2: Convert uid and gids between in core and on disk inodes 2013-02-13 06:00:58 -08:00
inode.h aio: don't include aio.h in sched.h 2013-05-07 20:16:25 -07:00
ioctl.c ocfs2: fix error return code in ocfs2_info_handle_freefrag() 2013-04-29 15:54:27 -07:00
ioctl.h
journal.c [readdir] convert ocfs2 2013-06-29 12:57:02 +04:00
journal.h fs/ocfs2/journal.h: add bits_wanted while calculating credits in ocfs2_calc_extend_credits 2013-07-03 16:07:23 -07:00
Kconfig
localalloc.c ocfs2: remove kfree() redundant null checks 2013-02-21 17:22:19 -08:00
localalloc.h
locks.c
locks.h
Makefile
mmap.c kill f_vfsmnt 2013-02-26 02:46:10 -05:00
mmap.h
move_extents.c ocfs2: fix NULL dereference for moving extents 2013-04-29 15:54:27 -07:00
move_extents.h
namei.c ocfs2: should not use le32_add_cpu to set ocfs2_dinode i_flags 2013-07-03 16:07:23 -07:00
namei.h
ocfs1_fs_compat.h
ocfs2_fs.h
ocfs2_ioctl.h
ocfs2_lockid.h
ocfs2_lockingver.h
ocfs2_trace.h
ocfs2.h ocfs2: remove unecessary variable needs_checkpoint 2013-07-03 16:07:23 -07:00
quota_global.c userns: Convert struct dquot dq_id to be a struct kqid 2012-09-18 01:01:41 -07:00
quota_local.c userns: Convert struct dquot dq_id to be a struct kqid 2012-09-18 01:01:41 -07:00
quota.h
refcounttree.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2013-02-26 20:16:07 -08:00
refcounttree.h
reservations.c
reservations.h
resize.c
resize.h
slot_map.c
slot_map.h
stack_o2cb.c ocfs2: remove kfree() redundant null checks 2013-02-21 17:22:19 -08:00
stack_user.c dlm: add recovery callbacks 2012-01-04 08:56:31 -06:00
stackglue.c
stackglue.h
suballoc.c ocfs2: ac->ac_allow_chain_relink=0 won't disable group relink 2013-02-27 19:10:09 -08:00
suballoc.h ocfs2: ac->ac_allow_chain_relink=0 won't disable group relink 2013-02-27 19:10:09 -08:00
super.c ocfs2: remove unecessary variable needs_checkpoint 2013-07-03 16:07:23 -07:00
super.h
symlink.c ocfs2: Fix oops in ocfs2_fast_symlink_readpage() code path 2013-02-26 02:46:12 -05:00
symlink.h ocfs: simplify symlink handling 2012-05-29 23:28:40 -04:00
sysfile.c ocfs2: remove kfree() redundant null checks 2013-02-21 17:22:19 -08:00
sysfile.h
uptodate.c
uptodate.h
ver.c
ver.h
xattr.c ocfs2: xattr: remove useless free space checking 2013-07-03 16:07:24 -07:00
xattr.h ocfs2: propagate umode_t 2012-01-03 22:55:02 -05:00