public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@sandeen.net>
To: Christoph Hellwig <hch@infradead.org>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH v2] mkfs: add discard support
Date: Sat, 10 Oct 2009 15:55:29 -0500	[thread overview]
Message-ID: <4AD0F4C1.1060204@sandeen.net> (raw)
In-Reply-To: <20091007222634.GA8425@infradead.org>

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@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@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@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
> 

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

      reply	other threads:[~2009-10-10 20:54 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-06 18:47 [PATCH] mkfs: add discard support Christoph Hellwig
2009-10-07  4:42 ` Dave Chinner
2009-10-07  6:05   ` Michael Monnerie
2009-10-07 14:11   ` Christoph Hellwig
2009-10-07 20:24   ` Andi Kleen
2009-10-09  2:30     ` Dave Chinner
2009-10-10  4:22       ` Andi Kleen
2009-10-10 16:24       ` Christoph Hellwig
2009-10-12  1:33         ` Andi Kleen
2009-10-07 22:26 ` [PATCH v2] " Christoph Hellwig
2009-10-10 20:55   ` Eric Sandeen [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4AD0F4C1.1060204@sandeen.net \
    --to=sandeen@sandeen.net \
    --cc=hch@infradead.org \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox