[PATCH v2] mkfs: add discard support

Eric Sandeen sandeen at sandeen.net
Sat Oct 10 15:55:29 CDT 2009


Christoph Hellwig wrote:
> Call the BLKDISCARD ioctl to mark the whole disk as unused before creating
> a new filesystem.  This will allow SSDs, Arrays with thin provisioning support
> and virtual machines to make smarter allocation decisions.
> 
> Add a new -K option to prevent mkfs from discarding blocks to aid
> trouble-shooting or specialized requirements.
> 
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> 

I might have made the manpage help a bit more for people who don't know 
what discard means, but *shrug*

Reviewed-by: Eric Sandeen <sandeen at sandeen.net>

> Index: xfsprogs-dev/mkfs/xfs_mkfs.c
> ===================================================================
> --- xfsprogs-dev.orig/mkfs/xfs_mkfs.c	2009-10-07 21:47:31.000000000 +0000
> +++ xfsprogs-dev/mkfs/xfs_mkfs.c	2009-10-07 22:25:29.000000000 +0000
> @@ -605,6 +605,20 @@ done:
>  	free(buf);
>  }
>  
> +static void
> +discard_blocks(dev_t dev, __uint64_t nsectors)
> +{
> +	int fd;
> +
> +	/*
> +	 * We intentionally ignore errors from the discard ioctl.  It is
> +	 * not necessary for the mkfs functionality but just an optimization.
> +	 */
> +	fd = libxfs_device_to_fd(dev);
> +	if (fd > 0)
> +		platform_discard_blocks(fd, 0, nsectors << 9);
> +}
> +
>  int
>  main(
>  	int			argc,
> @@ -681,6 +695,7 @@ main(
>  	int			nvflag;
>  	int			nci;
>  	int			Nflag;
> +	int			discard;
>  	char			*p;
>  	char			*protofile;
>  	char			*protostring;
> @@ -741,7 +756,7 @@ main(
>  	xi.isdirect = LIBXFS_DIRECT;
>  	xi.isreadonly = LIBXFS_EXCLUSIVELY;
>  
> -	while ((c = getopt(argc, argv, "b:d:i:l:L:n:Np:qr:s:CfV")) != EOF) {
> +	while ((c = getopt(argc, argv, "b:d:i:l:L:n:KNp:qr:s:CfV")) != EOF) {
>  		switch (c) {
>  		case 'C':
>  		case 'f':
> @@ -1257,6 +1272,9 @@ main(
>  		case 'N':
>  			Nflag = 1;
>  			break;
> +		case 'K':
> +			discard = 0;
> +			break;
>  		case 'p':
>  			if (protofile)
>  				respec('p', NULL, 0);
> @@ -1645,6 +1663,14 @@ main(
>  		}
>  	}
>  
> +	if (discard) {
> +		discard_blocks(xi.ddev, xi.dsize);
> +		if (xi.rtdev)
> +			discard_blocks(xi.rtdev, xi.rtsize);
> +		if (xi.logdev && xi.logdev != xi.ddev)
> +			discard_blocks(xi.logdev, xi.logBBsize);
> +	}
> +
>  	if (!liflag && !ldflag)
>  		loginternal = xi.logdev == 0;
>  	if (xi.logname)
> Index: xfsprogs-dev/include/linux.h
> ===================================================================
> --- xfsprogs-dev.orig/include/linux.h	2009-10-07 21:47:31.000000000 +0000
> +++ xfsprogs-dev/include/linux.h	2009-10-07 22:15:32.000000000 +0000
> @@ -93,6 +93,20 @@ static __inline__ void platform_uuid_cop
>  	uuid_copy(*dst, *src);
>  }
>  
> +#ifndef BLKDISCARD
> +#define BLKDISCARD	_IO(0x12,119)
> +#endif
> +
> +static __inline__ int
> +platform_discard_blocks(int fd, off64_t start, off64_t end)
> +{
> +	__uint64_t range[2] = { start, end };
> +
> +	if (ioctl(fd, BLKDISCARD, &range) < 0)
> +		return errno;
> +	return 0;
> +}
> +
>  #if (__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ <= 1))
>  # define constpp	const char * const *
>  #else
> Index: xfsprogs-dev/include/darwin.h
> ===================================================================
> --- xfsprogs-dev.orig/include/darwin.h	2009-10-07 21:47:31.000000000 +0000
> +++ xfsprogs-dev/include/darwin.h	2009-10-07 22:15:32.000000000 +0000
> @@ -154,4 +154,10 @@ typedef unsigned char	uchar_t;
>  
>  #define HAVE_FID	1
>  
> +static __inline__ int
> +platform_discard_blocks(int fd, off64_t start, off64_t end)
> +{
> +	return 0;
> +}
> +
>  #endif	/* __XFS_DARWIN_H__ */
> Index: xfsprogs-dev/include/freebsd.h
> ===================================================================
> --- xfsprogs-dev.orig/include/freebsd.h	2009-10-07 21:47:31.000000000 +0000
> +++ xfsprogs-dev/include/freebsd.h	2009-10-07 22:15:32.000000000 +0000
> @@ -139,4 +139,10 @@ static __inline__ void platform_uuid_cop
>  	memcpy(dst, src, sizeof(uuid_t));
>  }
>  
> +static __inline__ int
> +platform_discard_blocks(int fd, off64_t start, off64_t end)
> +{
> +	return 0;
> +}
> +
>  #endif	/* __XFS_FREEBSD_H__ */
> Index: xfsprogs-dev/include/irix.h
> ===================================================================
> --- xfsprogs-dev.orig/include/irix.h	2009-10-07 21:47:31.000000000 +0000
> +++ xfsprogs-dev/include/irix.h	2009-10-07 22:15:32.000000000 +0000
> @@ -337,6 +337,12 @@ static __inline__ void platform_uuid_cop
>  	memcpy(dst, src, sizeof(uuid_t));
>  }
>  
> +static __inline__ int
> +platform_discard_blocks(int fd, off64_t start, off64_t end)
> +{
> +	return 0;
> +}
> +
>  static __inline__ char * strsep(char **s, const char *ct)
>  {
>  	char *sbegin = *s, *end;
> Index: xfsprogs-dev/man/man8/mkfs.xfs.8
> ===================================================================
> --- xfsprogs-dev.orig/man/man8/mkfs.xfs.8	2009-10-07 22:19:23.000000000 +0000
> +++ xfsprogs-dev/man/man8/mkfs.xfs.8	2009-10-07 22:22:26.000000000 +0000
> @@ -36,6 +36,8 @@ mkfs.xfs \- construct an XFS filesystem
>  .I label
>  ] [
>  .B \-N
> +] [
> +.B \-K
>  ]
>  .I device
>  .SH DESCRIPTION
> @@ -714,6 +716,9 @@ manual entries for additional informatio
>  .B \-N
>  Causes the file system parameters to be printed out without really
>  creating the file system.
> +.TP
> +.B \-K
> +Do not attempt to discard blocks at mkfs time.
>  .SH SEE ALSO
>  .BR xfs (5),
>  .BR mkfs (8),
> 
> _______________________________________________
> xfs mailing list
> xfs at oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
> 




More information about the xfs mailing list