From: Christoph Hellwig <hch@infradead.org>
To: Nathan Scott <nscott@aconex.com>
Cc: Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com
Subject: Re: [PATCH] mkfs: add discard support
Date: Tue, 6 Oct 2009 21:18:50 -0400 [thread overview]
Message-ID: <20091007011850.GA32032@infradead.org> (raw)
In-Reply-To: <837780486.21741254857073773.JavaMail.root@mail-au.aconex.com>
> It might be a bit cleaner to add this in with the existing platform-
> specific code in libxfs/linux.c (or perhaps include/platform_defs.h)
> with wrappers for the other platforms, rather than putting it directly
> in mkfs like this? repair may want to use this someday too, I guess.
How about this one?
--
Subject: [PATCH] mkfs: add discard support
From: Christoph Hellwig <hch@lst.de>
Cal 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.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Index: xfsprogs-dev/mkfs/xfs_mkfs.c
===================================================================
--- xfsprogs-dev.orig/mkfs/xfs_mkfs.c 2009-10-06 18:46:06.000000000 +0000
+++ xfsprogs-dev/mkfs/xfs_mkfs.c 2009-10-07 01:09:49.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 nessecary 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,
@@ -1645,6 +1659,12 @@ main(
}
}
+ 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 01:06:00.000000000 +0000
+++ xfsprogs-dev/include/linux.h 2009-10-07 01:13:12.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 01:15:38.000000000 +0000
+++ xfsprogs-dev/include/darwin.h 2009-10-07 01:16:19.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 01:15:38.000000000 +0000
+++ xfsprogs-dev/include/freebsd.h 2009-10-07 01:16:06.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 01:15:38.000000000 +0000
+++ xfsprogs-dev/include/irix.h 2009-10-07 01:16:29.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;
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2009-10-07 1:17 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1235789111.21721254856913943.JavaMail.root@mail-au.aconex.com>
2009-10-06 19:24 ` [PATCH] mkfs: add discard support Nathan Scott
2009-10-06 19:26 ` Christoph Hellwig
2009-10-07 1:18 ` Christoph Hellwig [this message]
2009-10-07 1:20 ` Nathan Scott
2009-10-07 3:55 ` Eric Sandeen
2009-11-12 16:04 ` Christoph Hellwig
2009-10-06 18:47 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
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=20091007011850.GA32032@infradead.org \
--to=hch@infradead.org \
--cc=nscott@aconex.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.