gfs2: Fix case in which ail writes are done to jdata holes
Patchb2a846dbef
("gfs2: Ignore journal log writes for jdata holes") tried (unsuccessfully) to fix a case in which writes were done to jdata blocks, the blocks are sent to the ail list, then a punch_hole or truncate operation caused the blocks to be freed. In other words, the ail items are for jdata holes. Beforeb2a846dbef
, the jdata hole caused function gfs2_block_map to return -EIO, which was eventually interpreted as an IO error to the journal, and then withdraw. This patch changes function gfs2_get_block_noalloc, which is only used for jdata writes, so it returns -ENODATA rather than -EIO, and when -ENODATA is returned to gfs2_ail1_start_one, the error is ignored. We can safely ignore it because gfs2_ail1_start_one is only called when the jdata pages have already been written and truncated, so the ail1 content no longer applies. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
This commit is contained in:
parent
d3039c0615
commit
4e79e3f08e
|
@ -77,7 +77,7 @@ static int gfs2_get_block_noalloc(struct inode *inode, sector_t lblock,
|
|||
if (error)
|
||||
return error;
|
||||
if (!buffer_mapped(bh_result))
|
||||
return -EIO;
|
||||
return -ENODATA;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -132,6 +132,8 @@ __acquires(&sdp->sd_ail_lock)
|
|||
spin_unlock(&sdp->sd_ail_lock);
|
||||
ret = generic_writepages(mapping, wbc);
|
||||
spin_lock(&sdp->sd_ail_lock);
|
||||
if (ret == -ENODATA) /* if a jdata write into a new hole */
|
||||
ret = 0; /* ignore it */
|
||||
if (ret || wbc->nr_to_write <= 0)
|
||||
break;
|
||||
return -EBUSY;
|
||||
|
|
Loading…
Reference in New Issue