[sheepdog] [PATCH] cache: correct block size calculation for inode object
MORITA Kazutaka
morita.kazutaka at gmail.com
Wed Aug 7 23:51:22 CEST 2013
At Wed, 7 Aug 2013 16:10:01 +0800,
Liu Yuan wrote:
>
> inode and data object have different sizes and thus cache block size is
> different. Current code fail to get the right size for inode object when
> its last bit of bmap is set with the fixed block size.
>
> This patch tries to get the dynamic block size based on the oid.
>
> Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> ---
> sheep/object_cache.c | 36 ++++++++++++++++--------------------
> 1 file changed, 16 insertions(+), 20 deletions(-)
>
> diff --git a/sheep/object_cache.c b/sheep/object_cache.c
> index dcf6972..957b052 100644
> --- a/sheep/object_cache.c
> +++ b/sheep/object_cache.c
> @@ -28,8 +28,6 @@
>
> #define CACHE_INDEX_MASK (CACHE_CREATE_BIT)
>
> -#define CACHE_BLOCK_SIZE ((UINT64_C(1) << 10) * 64) /* 64 KB */
> -
> #define CACHE_OBJECT_SIZE (SD_DATA_OBJ_SIZE / 1024 / 1024) /* M */
>
> /* Kick background pusher if dirty_count greater than it */
> @@ -116,13 +114,19 @@ static inline bool idx_has_vdi_bit(uint32_t idx)
> return !!(idx & CACHE_VDI_BIT);
> }
>
> -static uint64_t calc_object_bmap(size_t len, off_t offset)
> +static inline int get_cache_block_size(uint64_t oid)
> +{
> + return DIV_ROUND_UP(get_objsize(oid), sizeof(uint64_t) * BITS_PER_BYTE);
> +}
The size of cache block must be sector-aligned for O_DIRECT. I'd
suggest rounding up to 4 KB boundary (the size of blocks for most
filesystems) like as follows.
static inline int get_cache_block_size(uint64_t oid)
{
int bsize = DIV_ROUND_UP(get_objsize(oid), sizeof(uint64_t) * BITS_PER_BYTE);
return round_up(bsize, BLOCK_SIZE);
}
Thanks,
Kazutaka
More information about the sheepdog
mailing list