pnfsblock: fix writeback deadlock
We should check if the sector is already initialized before
trying to grab the page from page cache. Otherwise when two
pages of the same block are written back by two threads each
calling from writepage_locked, it can cause deadlock like bellow.
[ 1080.972099] INFO: task kswapd0:25 blocked for more than 120 seconds.
[ 1080.972377] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 1080.972812] kswapd0 D
ffff88000c4926c0 0 25 2 0x00000000
[ 1080.972816]
ffff88000df276b0 0000000000000046 ffff88000df27640 ffffffff81013ba7
[ 1080.972821]
ffff88000c492310 ffff88000df27fd8 ffff88000df27fd8 00000000001d3440
[ 1080.972824]
ffff88000c378000 ffff88000c492310 ffff8800175d3d40 ffff880017fc75a8
[ 1080.972828] Call Trace:
[ 1080.972860] [<
ffffffff81013ba7>] ? read_tsc+0x9/0x19
[ 1080.972877] [<
ffffffff810e0b23>] ? lock_page+0x2b/0x2b
[ 1080.972899] [<
ffffffff81475a1d>] io_schedule+0x63/0x7e
[ 1080.972902] [<
ffffffff810e0b31>] sleep_on_page+0xe/0x12
[ 1080.972905] [<
ffffffff81475fe8>] __wait_on_bit_lock+0x46/0x8f
[ 1080.972916] [<
ffffffff810822d7>] ? lock_release_holdtime.part.7+0x6b/0x72
[ 1080.972919] [<
ffffffff810e0af6>] __lock_page+0x66/0x68
[ 1080.972928] [<
ffffffff81072705>] ? autoremove_wake_function+0x3d/0x3d
[ 1080.972932] [<
ffffffff810e0b1f>] lock_page+0x27/0x2b
[ 1080.972934] [<
ffffffff810e0bcf>] find_lock_page+0x34/0x57
[ 1080.972937] [<
ffffffff810e1738>] find_or_create_page+0x34/0x8a
[ 1080.972947] [<
ffffffffa034245b>] bl_write_pagelist+0x205/0x6da [blocklayoutdriver]
[ 1080.972951] [<
ffffffffa034145d>] ? bl_free_lseg+0x38/0x38 [blocklayoutdriver]
[ 1080.972995] [<
ffffffffa02e27b9>] ? nfs_write_rpcsetup+0x118/0x123 [nfs]
[ 1080.973033] [<
ffffffffa030246b>] pnfs_generic_pg_writepages+0x10b/0x1f4 [nfs]
[ 1080.973089] [<
ffffffffa02deaae>] nfs_pageio_doio+0x1a/0x43 [nfs]
[ 1080.973098] [<
ffffffffa02df035>] nfs_pageio_complete+0x16/0x2d [nfs]
[ 1080.973108] [<
ffffffffa02e2d8f>] nfs_writepage_locked+0xa0/0xbf [nfs]
[ 1080.973119] [<
ffffffffa02e36a1>] nfs_writepage+0x16/0x2b [nfs]
[ 1080.973122] [<
ffffffff810e8762>] ? clear_page_dirty_for_io+0x87/0x9a
[ 1080.973133] [<
ffffffff810efc5b>] shrink_page_list+0x39b/0x6c8
[ 1080.973139] [<
ffffffff810f03bb>] shrink_inactive_list+0x22c/0x39e
[ 1080.973144] [<
ffffffff810822d7>] ? lock_release_holdtime.part.7+0x6b/0x72
[ 1080.973148] [<
ffffffff810f0c33>] shrink_zone+0x445/0x588
[ 1080.973152] [<
ffffffff810f1a11>] balance_pgdat+0x2c2/0x56b
[ 1080.973170] [<
ffffffff81254208>] ? __bitmap_weight+0x34/0x80
[ 1080.973175] [<
ffffffff810f1f78>] kswapd+0x2be/0x2fa
[ 1080.973179] [<
ffffffff810726c8>] ? __init_waitqueue_head+0x4b/0x4b
[ 1080.973183] [<
ffffffff810f1cba>] ? balance_pgdat+0x56b/0x56b
[ 1080.973187] [<
ffffffff81071f69>] kthread+0xa8/0xb0
[ 1080.973200] [<
ffffffff814806b4>] kernel_thread_helper+0x4/0x10
[ 1080.973205] [<
ffffffff81071ec1>] ? __init_kthread_worker+0x5a/0x5a
[ 1080.973210] [<
ffffffff814806b0>] ? gs_change+0x13/0x13
[ 1080.973213] no locks held by kswapd0/25.
Signed-off-by: Peng Tao <peng_tao@emc.com>
Signed-off-by: Jim Rees <rees@umich.edu>
Cc: stable@kernel.org [3.0]
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>