From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bob Peterson Date: Tue, 6 Oct 2015 14:02:42 -0500 Subject: [Cluster-devel] [GFS2 PATCH v2 09/15] GFS2: generalize gfs2_check_blk_type In-Reply-To: <1444158168-23036-1-git-send-email-rpeterso@redhat.com> References: <1444158168-23036-1-git-send-email-rpeterso@redhat.com> Message-ID: <1444158168-23036-10-git-send-email-rpeterso@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit This patch reorganizes function gfs2_check_blk_type so that a more generalized function, gfs2_get_block_type, may be used in future enhancements related to the freeing of unlinked dinodes. Signed-off-by: Bob Peterson --- fs/gfs2/rgrp.c | 46 ++++++++++++++++++++++++++++++++-------------- fs/gfs2/rgrp.h | 1 + 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index b936ee1..0e3be08 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -2125,14 +2125,14 @@ void gfs2_inplace_release(struct gfs2_inode *ip) } /** - * gfs2_get_block_type - Check a block in a RG is of given type + * __get_block_type - Check a block in a RG is of given type * @rgd: the resource group holding the block * @block: the block number * * Returns: The block type (GFS2_BLKST_*) */ -static unsigned char gfs2_get_block_type(struct gfs2_rgrpd *rgd, u64 block) +static unsigned char __get_block_type(struct gfs2_rgrpd *rgd, u64 block) { struct gfs2_rbm rbm = { .rgd = rgd, }; int ret; @@ -2518,7 +2518,7 @@ void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip) } /** - * gfs2_check_blk_type - Check the type of a block + * gfs2_get_blk_type - Get the type of a block * @sdp: The superblock * @no_addr: The block number to check * @type: The block type we are looking for @@ -2528,26 +2528,44 @@ void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip) * or -ve errno if something went wrong while checking */ -int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr, unsigned int type) +int gfs2_get_blk_type(struct gfs2_sbd *sdp, u64 no_addr) { struct gfs2_rgrpd *rgd; struct gfs2_holder rgd_gh; - int error = -EINVAL; + int ret; rgd = gfs2_blk2rgrpd(sdp, no_addr, 1); if (!rgd) - goto fail; + return -EINVAL; - error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_SHARED, 0, &rgd_gh); - if (error) - goto fail; + ret = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_SHARED, 0, &rgd_gh); + if (ret == 0) { + ret = __get_block_type(rgd, no_addr); + gfs2_glock_dq_uninit(&rgd_gh); + } + return ret; +} - if (gfs2_get_block_type(rgd, no_addr) != type) - error = -ESTALE; +/** + * gfs2_check_blk_type - Check the type of a block + * @sdp: The superblock + * @no_addr: The block number to check + * @type: The block type we are looking for + * + * Returns: 0 if the block type matches the expected type + * -ESTALE if it doesn't match + * or -ve errno if something went wrong while checking + */ - gfs2_glock_dq_uninit(&rgd_gh); -fail: - return error; +int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr, unsigned int type) +{ + int ty = gfs2_get_blk_type(sdp, no_addr); + + if (ty < 0) + return ty; + if (ty != type) + return -ESTALE; + return 0; } /** diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h index c0ab33f..89cdab9 100644 --- a/fs/gfs2/rgrp.h +++ b/fs/gfs2/rgrp.h @@ -56,6 +56,7 @@ extern void __gfs2_free_blocks(struct gfs2_inode *ip, u64 bstart, u32 blen, int extern void gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen); extern void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip); extern void gfs2_unlink_di(struct inode *inode); +extern int gfs2_get_blk_type(struct gfs2_sbd *sdp, u64 no_addr); extern int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr, unsigned int type); -- 2.4.3