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
prev parent 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