mirror of https://gitee.com/openkylin/linux.git
gfs2: fix withdraw sequence deadlock
After a gfs2 file system withdraw, any attempt to read metadata is automatically rejected by function gfs2_meta_read() except for reads of the journal inode. This turns out to be a problem because function signal_our_withdraw() repeatedly calls check_journal_clean() which reads the metadata (both its dinode and indirect blocks) to see if the entire journal is mapped. The dinode read works, but reading the indirect blocks returns -EIO which gets sent back up and causes a consistency error. This results in withdraw-from-withdraw, which becomes a deadlock. This patch changes the test in gfs2_meta_read() to allow all metadata reads for the journal. Instead of checking the journal block, it now checks for the journal inode glock which is the same for all blocks in the journal. This allows check_journal_clean() to properly check the journal without trying to withdraw recursively. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
This commit is contained in:
parent
8f3d9f3542
commit
ac91558428
|
@ -252,7 +252,7 @@ int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags,
|
|||
int num = 0;
|
||||
|
||||
if (unlikely(gfs2_withdrawn(sdp)) &&
|
||||
(!sdp->sd_jdesc || (blkno != sdp->sd_jdesc->jd_no_addr))) {
|
||||
(!sdp->sd_jdesc || gl != sdp->sd_jinode_gl)) {
|
||||
*bhp = NULL;
|
||||
return -EIO;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue