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: Abhi Das <adas@redhat.com> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Bob Peterson <rpeterso@redhat.com>
This commit is contained in:
parent
98583b3e87
commit
5b84609532
|
@ -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);
|
||||
|
|
|
@ -228,8 +228,8 @@ 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
|
||||
*
|
||||
|
@ -237,74 +237,78 @@ static void gfs2_end_log_write(struct bio *bio)
|
|||
* 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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue