Skip to content

Commit

Permalink
gfs2: changes to gfs2_log_XXX_bio
Browse files Browse the repository at this point in the history
Change gfs2_log_XXX_bio family of functions so they can be used
with different bios, not just sdp->sd_log_bio.

This patch also contains some clean up suggested by Andreas.

Signed-off-by: Abhi Das <adas@redhat.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
  • Loading branch information
Abhi Das authored and Andreas Gruenbacher committed Dec 11, 2018
1 parent 98583b3 commit 5b84609
Showing 3 changed files with 42 additions and 37 deletions.
4 changes: 2 additions & 2 deletions fs/gfs2/log.c
Original file line number Diff line number Diff line change
@@ -734,7 +734,7 @@ void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
lh->lh_crc = cpu_to_be32(crc);

gfs2_log_write(sdp, page, sb->s_blocksize, 0, addr);
gfs2_log_flush_bio(sdp, REQ_OP_WRITE, op_flags);
gfs2_log_submit_bio(&sdp->sd_log_bio, REQ_OP_WRITE, op_flags);
log_flush_wait(sdp);
}

@@ -811,7 +811,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)

gfs2_ordered_write(sdp);
lops_before_commit(sdp, tr);
gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0);
gfs2_log_submit_bio(&sdp->sd_log_bio, REQ_OP_WRITE, 0);

if (sdp->sd_log_head != sdp->sd_log_flush_head) {
log_flush_wait(sdp);
73 changes: 39 additions & 34 deletions fs/gfs2/lops.c
Original file line number Diff line number Diff line change
@@ -228,83 +228,87 @@ static void gfs2_end_log_write(struct bio *bio)
}

/**
* gfs2_log_flush_bio - Submit any pending log bio
* @sdp: The superblock
* gfs2_log_submit_bio - Submit any pending log bio
* @biop: Address of the bio pointer
* @op: REQ_OP
* @op_flags: req_flag_bits
*
* Submit any pending part-built or full bio to the block device. If
* there is no pending bio, then this is a no-op.
*/

void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int op, int op_flags)
void gfs2_log_submit_bio(struct bio **biop, int op, int op_flags)
{
if (sdp->sd_log_bio) {
struct bio *bio = *biop;
if (bio) {
struct gfs2_sbd *sdp = bio->bi_private;
atomic_inc(&sdp->sd_log_in_flight);
bio_set_op_attrs(sdp->sd_log_bio, op, op_flags);
submit_bio(sdp->sd_log_bio);
sdp->sd_log_bio = NULL;
bio_set_op_attrs(bio, op, op_flags);
submit_bio(bio);
*biop = NULL;
}
}

/**
* gfs2_log_alloc_bio - Allocate a new bio for log writing
* @sdp: The superblock
* @blkno: The next device block number we want to write to
* gfs2_log_alloc_bio - Allocate a bio
* @sdp: The super block
* @blkno: The device block number we want to write to
* @end_io: The bi_end_io callback
*
* This should never be called when there is a cached bio in the
* super block. When it returns, there will be a cached bio in the
* super block which will have as many bio_vecs as the device is
* happy to handle.
* Allocate a new bio, initialize it with the given parameters and return it.
*
* Returns: Newly allocated bio
* Returns: The newly allocated bio
*/

static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd *sdp, u64 blkno)
static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd *sdp, u64 blkno,
bio_end_io_t *end_io)
{
struct super_block *sb = sdp->sd_vfs;
struct bio *bio;
struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);

BUG_ON(sdp->sd_log_bio);

bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
bio->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9);
bio_set_dev(bio, sb->s_bdev);
bio->bi_end_io = gfs2_end_log_write;
bio->bi_end_io = end_io;
bio->bi_private = sdp;

sdp->sd_log_bio = bio;

return bio;
}

/**
* gfs2_log_get_bio - Get cached log bio, or allocate a new one
* @sdp: The superblock
* @sdp: The super block
* @blkno: The device block number we want to write to
* @bio: The bio to get or allocate
* @op: REQ_OP
* @end_io: The bi_end_io callback
* @flush: Always flush the current bio and allocate a new one?
*
* If there is a cached bio, then if the next block number is sequential
* with the previous one, return it, otherwise flush the bio to the
* device. If there is not a cached bio, or we just flushed it, then
* device. If there is no cached bio, or we just flushed it, then
* allocate a new one.
*
* Returns: The bio to use for log writes
*/

static struct bio *gfs2_log_get_bio(struct gfs2_sbd *sdp, u64 blkno)
static struct bio *gfs2_log_get_bio(struct gfs2_sbd *sdp, u64 blkno,
struct bio **biop, int op,
bio_end_io_t *end_io, bool flush)
{
struct bio *bio = sdp->sd_log_bio;
u64 nblk;
struct bio *bio = *biop;

if (bio) {
u64 nblk;

nblk = bio_end_sector(bio);
nblk >>= sdp->sd_fsb2bb_shift;
if (blkno == nblk)
if (blkno == nblk && !flush)
return bio;
gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0);
gfs2_log_submit_bio(biop, op, 0);
}

return gfs2_log_alloc_bio(sdp, blkno);
*biop = gfs2_log_alloc_bio(sdp, blkno, end_io);
return *biop;
}

/**
@@ -326,11 +330,12 @@ void gfs2_log_write(struct gfs2_sbd *sdp, struct page *page,
struct bio *bio;
int ret;

bio = gfs2_log_get_bio(sdp, blkno);
bio = gfs2_log_get_bio(sdp, blkno, &sdp->sd_log_bio, REQ_OP_WRITE,
gfs2_end_log_write, false);
ret = bio_add_page(bio, page, size, offset);
if (ret == 0) {
gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0);
bio = gfs2_log_alloc_bio(sdp, blkno);
bio = gfs2_log_get_bio(sdp, blkno, &sdp->sd_log_bio,
REQ_OP_WRITE, gfs2_end_log_write, true);
ret = bio_add_page(bio, page, size, offset);
WARN_ON(ret == 0);
}
2 changes: 1 addition & 1 deletion fs/gfs2/lops.h
Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@ extern u64 gfs2_log_bmap(struct gfs2_sbd *sdp);
extern void gfs2_log_write(struct gfs2_sbd *sdp, struct page *page,
unsigned size, unsigned offset, u64 blkno);
extern void gfs2_log_write_page(struct gfs2_sbd *sdp, struct page *page);
extern void gfs2_log_flush_bio(struct gfs2_sbd *sdp, int op, int op_flags);
extern void gfs2_log_submit_bio(struct bio **biop, int op, int op_flags);
extern void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh);

static inline unsigned int buf_limit(struct gfs2_sbd *sdp)

0 comments on commit 5b84609

Please sign in to comment.