forked from Minki/linux
gfs2: Fix extended attribute readahead optimization
Commit 39b0555f
didn't check for a failing bio_add_page in
gfs2_submit_bhs. This could cause I/O requests to get lost, and the
affected buffer heads to stay locked forever. Fix that by submitting
the current bio and allocating another one when bio_add_page fails. (It
is guaranteed that we can at least add one page to a bio.)
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
This commit is contained in:
parent
1c185c02f4
commit
23e5671a79
@ -216,23 +216,26 @@ static void gfs2_meta_read_endio(struct bio *bio)
|
||||
static void gfs2_submit_bhs(int op, int op_flags, struct buffer_head *bhs[],
|
||||
int num)
|
||||
{
|
||||
struct buffer_head *bh = bhs[0];
|
||||
struct bio *bio;
|
||||
int i;
|
||||
while (num > 0) {
|
||||
struct buffer_head *bh = *bhs;
|
||||
struct bio *bio;
|
||||
|
||||
if (!num)
|
||||
return;
|
||||
|
||||
bio = bio_alloc(GFP_NOIO, num);
|
||||
bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
|
||||
bio->bi_bdev = bh->b_bdev;
|
||||
for (i = 0; i < num; i++) {
|
||||
bh = bhs[i];
|
||||
bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh));
|
||||
bio = bio_alloc(GFP_NOIO, num);
|
||||
bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
|
||||
bio->bi_bdev = bh->b_bdev;
|
||||
while (num > 0) {
|
||||
bh = *bhs;
|
||||
if (!bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh))) {
|
||||
BUG_ON(bio->bi_iter.bi_size == 0);
|
||||
break;
|
||||
}
|
||||
bhs++;
|
||||
num--;
|
||||
}
|
||||
bio->bi_end_io = gfs2_meta_read_endio;
|
||||
bio_set_op_attrs(bio, op, op_flags);
|
||||
submit_bio(bio);
|
||||
}
|
||||
bio->bi_end_io = gfs2_meta_read_endio;
|
||||
bio_set_op_attrs(bio, op, op_flags);
|
||||
submit_bio(bio);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user