diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index dbf1aede744c..85736135bcf5 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c @@ -299,6 +299,10 @@ static int gfs2_dir_read_data(struct gfs2_inode *ip, __be64 *buf, goto fail; BUG_ON(extlen < 1); bh = gfs2_meta_ra(ip->i_gl, dblock, extlen); + if (IS_ERR(bh)) { + error = PTR_ERR(bh); + goto fail; + } } else { error = gfs2_meta_read(ip->i_gl, dblock, DIO_WAIT, 0, &bh); if (error) diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index fea3efcc2f93..789294f4bf6f 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -512,7 +512,7 @@ int gfs2_meta_buffer(struct gfs2_inode *ip, u32 mtype, u64 num, * @dblock: the starting disk block * @extlen: the number of blocks in the extent * - * returns: the first buffer in the extent + * returns: the first buffer in the extent or error number */ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) @@ -521,6 +521,7 @@ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) struct buffer_head *first_bh, *bh; u32 max_ra = gfs2_tune_get(sdp, gt_max_readahead) >> sdp->sd_sb.sb_bsize_shift; + int ret; BUG_ON(!extlen); @@ -530,10 +531,15 @@ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) extlen = max_ra; first_bh = gfs2_getbuf(gl, dblock, CREATE); + if (unlikely(!first_bh)) + return ERR_PTR(-EINVAL); if (buffer_uptodate(first_bh)) goto out; - bh_read_nowait(first_bh, REQ_META | REQ_PRIO); + + ret = bh_read(first_bh, REQ_META | REQ_PRIO); + if (unlikely(ret < 0)) + return ERR_PTR(ret); dblock++; extlen--; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 72b48f6f5561..d919edfb8dda 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -1427,8 +1427,10 @@ int gfs2_quota_init(struct gfs2_sbd *sdp) } error = -EIO; bh = gfs2_meta_ra(ip->i_gl, dblock, extlen); - if (!bh) + if (IS_ERR(bh)) { + error = PTR_ERR(bh); goto fail; + } if (gfs2_metatype_check(sdp, bh, GFS2_METATYPE_QC)) goto fail_brelse; diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c index f4fe7039f725..527353c36aa5 100644 --- a/fs/gfs2/recovery.c +++ b/fs/gfs2/recovery.c @@ -49,7 +49,7 @@ int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk, *bh = gfs2_meta_ra(gl, dblock, extlen); - return error; + return IS_ERR(*bh) ? PTR_ERR(*bh) : 0; } int gfs2_revoke_add(struct gfs2_jdesc *jd, u64 blkno, unsigned int where)