Commit 5b846095 authored by Abhi Das's avatar Abhi Das Committed by Andreas Gruenbacher

gfs2: changes to gfs2_log_XXX_bio

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: default avatarAbhi Das <adas@redhat.com>
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
parent 98583b3e
...@@ -734,7 +734,7 @@ void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, ...@@ -734,7 +734,7 @@ void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
lh->lh_crc = cpu_to_be32(crc); lh->lh_crc = cpu_to_be32(crc);
gfs2_log_write(sdp, page, sb->s_blocksize, 0, addr); 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); log_flush_wait(sdp);
} }
...@@ -811,7 +811,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags) ...@@ -811,7 +811,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
gfs2_ordered_write(sdp); gfs2_ordered_write(sdp);
lops_before_commit(sdp, tr); 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) { if (sdp->sd_log_head != sdp->sd_log_flush_head) {
log_flush_wait(sdp); log_flush_wait(sdp);
......
...@@ -228,8 +228,8 @@ static void gfs2_end_log_write(struct bio *bio) ...@@ -228,8 +228,8 @@ static void gfs2_end_log_write(struct bio *bio)
} }
/** /**
* gfs2_log_flush_bio - Submit any pending log bio * gfs2_log_submit_bio - Submit any pending log bio
* @sdp: The superblock * @biop: Address of the bio pointer
* @op: REQ_OP * @op: REQ_OP
* @op_flags: req_flag_bits * @op_flags: req_flag_bits
* *
...@@ -237,74 +237,78 @@ static void gfs2_end_log_write(struct bio *bio) ...@@ -237,74 +237,78 @@ static void gfs2_end_log_write(struct bio *bio)
* there is no pending bio, then this is a no-op. * 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); atomic_inc(&sdp->sd_log_in_flight);
bio_set_op_attrs(sdp->sd_log_bio, op, op_flags); bio_set_op_attrs(bio, op, op_flags);
submit_bio(sdp->sd_log_bio); submit_bio(bio);
sdp->sd_log_bio = NULL; *biop = NULL;
} }
} }
/** /**
* gfs2_log_alloc_bio - Allocate a new bio for log writing * gfs2_log_alloc_bio - Allocate a bio
* @sdp: The superblock * @sdp: The super block
* @blkno: The next device block number we want to write to * @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 * Allocate a new bio, initialize it with the given parameters and return it.
* 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.
* *
* 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 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->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9);
bio_set_dev(bio, sb->s_bdev); 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; bio->bi_private = sdp;
sdp->sd_log_bio = bio;
return bio; return bio;
} }
/** /**
* gfs2_log_get_bio - Get cached log bio, or allocate a new one * 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 * @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 * 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 * 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. * allocate a new one.
* *
* Returns: The bio to use for log writes * 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; struct bio *bio = *biop;
u64 nblk;
if (bio) { if (bio) {
u64 nblk;
nblk = bio_end_sector(bio); nblk = bio_end_sector(bio);
nblk >>= sdp->sd_fsb2bb_shift; nblk >>= sdp->sd_fsb2bb_shift;
if (blkno == nblk) if (blkno == nblk && !flush)
return bio; 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, ...@@ -326,11 +330,12 @@ void gfs2_log_write(struct gfs2_sbd *sdp, struct page *page,
struct bio *bio; struct bio *bio;
int ret; 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); ret = bio_add_page(bio, page, size, offset);
if (ret == 0) { if (ret == 0) {
gfs2_log_flush_bio(sdp, REQ_OP_WRITE, 0); bio = gfs2_log_get_bio(sdp, blkno, &sdp->sd_log_bio,
bio = gfs2_log_alloc_bio(sdp, blkno); REQ_OP_WRITE, gfs2_end_log_write, true);
ret = bio_add_page(bio, page, size, offset); ret = bio_add_page(bio, page, size, offset);
WARN_ON(ret == 0); WARN_ON(ret == 0);
} }
......
...@@ -30,7 +30,7 @@ extern u64 gfs2_log_bmap(struct gfs2_sbd *sdp); ...@@ -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, extern void gfs2_log_write(struct gfs2_sbd *sdp, struct page *page,
unsigned size, unsigned offset, u64 blkno); unsigned size, unsigned offset, u64 blkno);
extern void gfs2_log_write_page(struct gfs2_sbd *sdp, struct page *page); 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); extern void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh);
static inline unsigned int buf_limit(struct gfs2_sbd *sdp) static inline unsigned int buf_limit(struct gfs2_sbd *sdp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment