[Ocfs2-tools-devel] [PATCH] discard unused blocks before mkfs

piaojun piaojun at huawei.com
Fri Feb 23 22:39:15 PST 2018


Hi Larry,

On 2018/2/24 12:14, Larry Chen wrote:
> From: Larry <lchen at suse.com>
> 
> When using a SSD as a block device, if unused SSD blocks could
> be discarded in advance, performance will be improved.
> 
> This patch uses ioctl interface to release unused blocks on SSD
> layer.
Will 'mkfs' become slower after this patch applied?

> 
> Signed-off-by: Larry Chen <lchen at suse.com>
> ---
>  mkfs.ocfs2/mkfs.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
>  mkfs.ocfs2/mkfs.h |  9 +++++++++
>  2 files changed, 53 insertions(+)
> 
> diff --git a/mkfs.ocfs2/mkfs.c b/mkfs.ocfs2/mkfs.c
> index 354b2ee5..e9c8a9fb 100644
> --- a/mkfs.ocfs2/mkfs.c
> +++ b/mkfs.ocfs2/mkfs.c
> @@ -543,6 +543,48 @@ static void finish_normal_format(State *s)
>  	ocfs2_close(fs);
>  }
>  
> +static errcode_t _discard_blocks(State *s, uint64_t block,
> +		uint64_t count)
> +{
> +	int ret;
> +	uint64_t range[2];
> +
> +	range[0] = (uint64_t)(block) << s->blocksize_bits;
> +	range[1] = (uint64_t)(count) << s->blocksize_bits;
> +
> +	ret = ioctl(s->fd, BLKDISCARD, &range);
> +	if (ret < 0) {
> +		if (errno == EOPNOTSUPP && !s->quiet)
> +			printf("block discard not supported...skip\n");
> +		return errno;
Should we catch other errno except 'EOPNOTSUPP'? And I suggest noticing
upper user if any error happens.

thanks,
Jun

> +	}
> +	return 0;
> +}
> +
> +static int discard_blocks(State *s)
> +{
> +	uint64_t blocks = s->volume_size_in_blocks;
> +	uint64_t count = DISCARD_STEP_MB;
> +	uint64_t cur = 0;
> +	int retval = 0;
> +
> +	count *= (1024 * 1024);
> +	count >>= s->blocksize_bits;
> +
> +	while (cur < blocks) {
> +		if (cur + count > blocks)
> +			count = blocks - cur;
> +
> +		retval = _discard_blocks(s, cur, count);
> +		if (retval)
> +			break;
> +		cur += count;
> +	}
> +
> +	return retval;
> +}
> +
> +
>  int
>  main(int argc, char **argv)
>  {
> @@ -615,6 +657,8 @@ main(int argc, char **argv)
>  		return 0;
>  	}
>  
> +	discard_blocks(s);
> + 
>  	clear_both_ends(s);
>  
>  	init_record(s, &superblock_rec, SFI_OTHER, S_IFREG | 0644);
> diff --git a/mkfs.ocfs2/mkfs.h b/mkfs.ocfs2/mkfs.h
> index f9ba4dcf..ac9709f3 100644
> --- a/mkfs.ocfs2/mkfs.h
> +++ b/mkfs.ocfs2/mkfs.h
> @@ -41,6 +41,7 @@
>  #include <inttypes.h>
>  #include <ctype.h>
>  #include <assert.h>
> +#include <sys/ioctl.h>
>  
>  #include <uuid/uuid.h>
>  
> @@ -92,6 +93,14 @@
>  
>  #define MAX_EXTALLOC_RESERVE_PERCENT	5
>  
> +#define DISCARD_STEP_MB         2048
> +
> +#if defined(__linux__) && !defined(BLKDISCARD)
> +#define BLKDISCARD		_IO(0x12,119)
> +#endif
> +
> +
> +
>  enum {
>  	SFI_JOURNAL,
>  	SFI_CLUSTER,
> 



More information about the Ocfs2-tools-devel mailing list