From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: tytso@mit.edu, darrick.wong@oracle.com
Cc: linux-ext4@vger.kernel.org
Subject: [PATCH 2/3] e2info: create a tool to display ext4 fs geometry online
Date: Wed, 01 Mar 2017 20:52:19 -0800 [thread overview]
Message-ID: <148843033922.21733.4922683685279348093.stgit@birch.djwong.org> (raw)
In-Reply-To: <148843032650.21733.13980225191301375698.stgit@birch.djwong.org>
From: Darrick J. Wong <darrick.wong@oracle.com>
Create e2info, which reports the fs geometry of an online ext4 filesystem.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
configure | 4 +
configure.ac | 3 +
lib/ext2fs/ext2_fs.h | 34 ++++++++
misc/Makefile.in | 30 ++++++-
misc/e2info.8.in | 64 ++++++++++++++++
misc/e2info.c | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 336 insertions(+), 4 deletions(-)
create mode 100644 misc/e2info.8.in
create mode 100644 misc/e2info.c
diff --git a/configure b/configure
index 5f7b429..b553da1 100755
--- a/configure
+++ b/configure
@@ -642,6 +642,7 @@ root_prefix
UNIX_CMT
CYGWIN_CMT
LINUX_CMT
+E2INFO_CMT
UNI_DIFF_OPTS
SEM_INIT_LIB
FUSE_CMT
@@ -13663,13 +13664,16 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNI_DIFF_OPTS" >&5
$as_echo "$UNI_DIFF_OPTS" >&6; }
+E2INFO_CMT="#"
case "$host_os" in
linux*)
$as_echo "#define HAVE_EXT2_IOCTLS 1" >>confdefs.h
+ E2INFO_CMT=
;;
esac
+
LINUX_CMT="#"
CYGWIN_CMT="#"
UNIX_CMT=
diff --git a/configure.ac b/configure.ac
index 9da7b86..bf613fd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1260,11 +1260,14 @@ AC_SUBST(UNI_DIFF_OPTS)
dnl
dnl We use the EXT2 ioctls only under Linux
dnl
+E2INFO_CMT="#"
case "$host_os" in
linux*)
AC_DEFINE(HAVE_EXT2_IOCTLS, 1, [Define to 1 if Ext2 ioctls present])
+ E2INFO_CMT=
;;
esac
+AC_SUBST(E2INFO_CMT)
dnl
dnl OS-specific uncomment control
dnl
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 27a7d3a..bad7648 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -372,6 +372,40 @@ struct ext4_new_group_input {
#define EXT4_IOC_GROUP_ADD _IOW('f', 8,struct ext4_new_group_input)
#define EXT4_IOC_RESIZE_FS _IOW('f', 16, __u64)
+/* ext4 fs geometry. */
+struct ext4_fsop_geom {
+ __u32 efg_blocksize; /* filesystem (data) block size */
+ __u32 efg_bgblocks; /* fsblocks in an AG */
+ __u32 efg_bgcount; /* number of allocation groups */
+ __u32 efg_logblocks; /* fsblocks in the log */
+ __u32 efg_resvblocks; /* number of reserved blocks */
+ __u32 efg_inodesize; /* inode size in bytes */
+ __u32 efg_bg_iblocks; /* inode blocks per AG */
+ __u32 efg_flags; /* superblock version flags */
+ __u64 efg_inodecount; /* inode count */
+ __u64 efg_blockcount; /* fsblocks in filesystem */
+ unsigned char efg_uuid[16]; /* unique id of the filesystem */
+ __u32 efg_sunit; /* stripe unit, fsblocks */
+ __u32 efg_swidth; /* stripe width, fsblocks */
+ __u32 efg_clustersize;/* fs cluster size */
+ __u32 efg_flexbgsize; /* number of bg's in a flexbg */
+ __u64 efg_resv[6];
+};
+
+#define EXT4_FSOP_GEOM_FLAGS_ATTR 0x00001 /* extended attr in use */
+#define EXT4_FSOP_GEOM_FLAGS_NLINK 0x00002 /* 32-bit nlink values */
+#define EXT4_FSOP_GEOM_FLAGS_QUOTA 0x00004 /* quotas enabled */
+#define EXT4_FSOP_GEOM_FLAGS_PROJQ 0x00008 /* project quotas */
+#define EXT4_FSOP_GEOM_FLAGS_META_CSUM 0x00010 /* metadata checksums */
+#define EXT4_FSOP_GEOM_FLAGS_FTYPE 0x00020 /* inode directory types */
+#define EXT4_FSOP_GEOM_FLAGS_64BIT 0x00040 /* 64-bit support */
+#define EXT4_FSOP_GEOM_FLAGS_INLINEDATA 0x00080 /* inline data */
+#define EXT4_FSOP_GEOM_FLAGS_ENCRYPT 0x00100 /* encrypted files */
+#define EXT4_FSOP_GEOM_FLAGS_LARGEDIR 0x00200 /* large directories */
+#define EXT4_FSOP_GEOM_FLAGS_EXTENTS 0x00400 /* extents */
+
+#define EXT4_IOC_FSGEOMETRY _IOR ('f', 19, struct ext4_fsop_geom)
+
/*
* Structure of an inode on the disk
*/
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 467c15d..311aa57 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -32,14 +32,19 @@ INSTALL = @INSTALL@
@FUSE_CMT@FUSE_PROG= fuse2fs
+@E2INFO_CMT@E2INFO_PROG= e2info
+@E2INFO_CMT@E2INFO_MAN= e2info.8
+
SPROGS= mke2fs badblocks tune2fs dumpe2fs $(BLKID_PROG) logsave \
$(E2IMAGE_PROG) @FSCK_PROG@ e2undo
USPROGS= mklost+found filefrag e2freefrag $(UUIDD_PROG) \
- $(E4DEFRAG_PROG) $(E4CRYPT_PROG) $(FUSE_PROG)
+ $(E4DEFRAG_PROG) $(E4CRYPT_PROG) $(FUSE_PROG) \
+ $(E2INFO_PROG)
SMANPAGES= tune2fs.8 mklost+found.8 mke2fs.8 dumpe2fs.8 badblocks.8 \
e2label.8 $(FINDFS_MAN) $(BLKID_MAN) $(E2IMAGE_MAN) \
logsave.8 filefrag.8 e2freefrag.8 e2undo.8 \
- $(UUIDD_MAN) $(E4DEFRAG_MAN) $(E4CRYPT_MAN) @FSCK_MAN@
+ $(UUIDD_MAN) $(E4DEFRAG_MAN) $(E4CRYPT_MAN) @FSCK_MAN@ \
+ $(E2INFO_MAN)
FMANPAGES= mke2fs.conf.5 ext4.5
UPROGS= chattr lsattr @UUID_CMT@ uuidgen
@@ -68,6 +73,7 @@ E4CRYPT_OBJS= e4crypt.o
E2FREEFRAG_OBJS= e2freefrag.o
E2FUZZ_OBJS= e2fuzz.o
FUSE2FS_OBJS= fuse2fs.o journal.o recovery.o revoke.o
+E2INFO_OBJS= e2info.o
PROFILED_TUNE2FS_OBJS= profiled/tune2fs.o profiled/util.o
PROFILED_MKLPF_OBJS= profiled/mklost+found.o
@@ -90,8 +96,9 @@ PROFILED_E2FREEFRAG_OBJS= profiled/e2freefrag.o
PROFILED_E2UNDO_OBJS= profiled/e2undo.o
PROFILED_E4DEFRAG_OBJS= profiled/e4defrag.o
PROFILED_E4CRYPT_OBJS= profiled/e4crypt.o
-PROFILED_FUSE2FS_OJBS= profiled/fuse2fs.o profiled/journal.o \
+PROFILED_FUSE2FS_OBJS= profiled/fuse2fs.o profiled/journal.o \
profiled/recovery.o profiled/revoke.o
+PROFILED_E2INFO_OBJS= profiled/e2info.o
SRCS= $(srcdir)/tune2fs.c $(srcdir)/mklost+found.c $(srcdir)/mke2fs.c $(srcdir)/mk_hugefiles.c \
$(srcdir)/chattr.c $(srcdir)/lsattr.c $(srcdir)/dumpe2fs.c \
@@ -102,7 +109,7 @@ SRCS= $(srcdir)/tune2fs.c $(srcdir)/mklost+found.c $(srcdir)/mke2fs.c $(srcdir)/
$(srcdir)/e2freefrag.c $(srcdir)/create_inode.c \
$(srcdir)/fuse2fs.c \
$(srcdir)/../debugfs/journal.c $(srcdir)/../e2fsck/revoke.c \
- $(srcdir)/../e2fsck/recovery.c
+ $(srcdir)/../e2fsck/recovery.c $(srcdir)/e2info.c
LIBS= $(LIBEXT2FS) $(LIBCOM_ERR) $(LIBSUPPORT)
DEPLIBS= $(LIBEXT2FS) $(DEPLIBCOM_ERR) $(DEPLIBSUPPORT)
@@ -391,6 +398,11 @@ fuse2fs: $(FUSE2FS_OBJS) $(DEPLIBS) $(DEPLIBBLKID) $(DEPLIBUUID) \
$(LIBFUSE) $(LIBBLKID) $(LIBUUID) $(LIBEXT2FS) $(LIBINTL) \
$(CLOCK_GETTIME_LIB) $(SYSLIBS)
+e2info: $(E2INFO_OBJS) $(DEPLIBS)
+ $(E) " LD $@"
+ $(Q) $(CC) $(ALL_LDFLAGS) -o e2info $(E2INFO_OBJS) $(LIBINTL) \
+ $(SYSLIBS)
+
journal.o: $(srcdir)/../debugfs/journal.c
$(E) " CC $@"
$(Q) $(CC) -c $(JOURNAL_CFLAGS) -I$(srcdir) \
@@ -411,6 +423,10 @@ tst_ismounted: $(srcdir)/ismounted.c $(STATIC_LIBEXT2FS) $(DEPLIBCOM_ERR)
$(CC) -o tst_ismounted $(srcdir)/ismounted.c -DDEBUG $(ALL_CFLAGS) \
$(LIBCOM_ERR) $(SYSLIBS)
+e2info.8: $(DEP_SUBSTITUTE) $(srcdir)/e2info.8.in
+ $(E) " SUBST $@"
+ $(Q) $(SUBSTITUTE_UPTIME) $(srcdir)/e2info.8.in e2info.8
+
tune2fs.8: $(DEP_SUBSTITUTE) $(srcdir)/tune2fs.8.in
$(E) " SUBST $@"
$(Q) $(SUBSTITUTE_UPTIME) $(srcdir)/tune2fs.8.in tune2fs.8
@@ -844,3 +860,9 @@ recovery.o: $(srcdir)/../e2fsck/recovery.c $(srcdir)/../e2fsck/jfs_user.h \
$(top_srcdir)/lib/support/quotaio_tree.h \
$(top_srcdir)/lib/ext2fs/kernel-jbd.h $(top_srcdir)/lib/ext2fs/jfs_compat.h \
$(top_srcdir)/lib/ext2fs/kernel-list.h
+e2info.o: $(srcdir)/e2info.c $(top_builddir)/lib/config.h \
+ $(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
+ $(top_builddir)/lib/ext2fs/ext2_types.h $(top_srcdir)/lib/ext2fs/ext2_fs.h \
+ $(top_srcdir)/lib/ext2fs/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
+ $(top_srcdir)/lib/ext2fs/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+ $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/bitops.h
diff --git a/misc/e2info.8.in b/misc/e2info.8.in
new file mode 100644
index 0000000..c7f580f
--- /dev/null
+++ b/misc/e2info.8.in
@@ -0,0 +1,64 @@
+.\" -*- nroff -*-
+.\" Copyright 2017 Oracle Inc. All Rights Reserved.
+.\" This file may be copied under the terms of the GNU Public License.
+.\"
+.\" Verbatim blocks taken from openssl req manpage content
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+
+.TH E2INFO 8 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@"
+.SH NAME
+e2info \- Display information about a mounted ext4 filesystem
+.SH SYNOPSIS
+.B e2info
+.I mount-point
+.br
+.B e2info \-V
+.SH DESCRIPTION
+Prints the filesystem geometry of an ext4 filesystem. If the mounted
+filesystem is an ext2 or ext3 filesystem mounted with the ext4 driver,
+the geometry will be displayed.
+.SH "EXAMPLES"
+
+Understanding e2info output.
+.PP
+Suppose one has the following "e2info /dev/sda" output:
+.PP
+.RS 2
+.Vb
+\&meta-data=/dev/loop0 isize=256 bgcount=14808 bgsize=32768 blks
+\& = attr=1 quota=0 pquota=0
+\& = crc=0 64bit=0 inlinedata=0 extents=1
+\& = flexbg=16
+\&data = bsize=4096 blocks=485198848 bg_iblocks=512
+\& = sunit=32 swidth=128 blks clustersize=0
+\& = encrypt=0
+\&naming = bsize=4096 largedir=0 ftype=1 nlink=1
+\&log = bsize=4096 blocks=32768
+.Ve
+.RE
+.PP
+
+Here, the data section of the output indicates "bsize=4096",
+meaning the data block size for this filesystem is 4096 bytes.
+This section also shows "sunit=32 swidth=128 blks", which means
+the stripe unit is 32*4096 bytes = 128 kibibytes and the stripe
+width is 128*4096 bytes = 512 kibibytes.
+A single stripe of this filesystem therefore consists
+of four stripe units (128 blocks / 32 blocks per unit).
+Note also that "flexbg=16", which means that this filesystem has
+512MB flex block groups.
+That is the upper limit of how much physical disk space can be mapped
+into a file.
+.SH SEE ALSO
+.BR mkfs.ext4 (8),
+.BR md (4),
+.BR lvm (8),
+.BR mount (8).
diff --git a/misc/e2info.c b/misc/e2info.c
new file mode 100644
index 0000000..675f005
--- /dev/null
+++ b/misc/e2info.c
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2017 Oracle.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libgen.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <mntent.h>
+#include <limits.h>
+
+#include "ext2fs/ext2_fs.h"
+
+#include "../version.h"
+#include "support/nls-enable.h"
+
+static const char *progname = "e2info";
+
+static void
+usage(void)
+{
+ fprintf(stderr, _(
+"Usage: %s [options] mountpoint\n\n\
+ -V print version information\n"),
+ progname);
+ exit(2);
+}
+
+#define PROC_MOUNTS "/proc/mounts"
+int
+find_datadev(
+ const char *arg,
+ char *datadev,
+ char *mntpoint)
+{
+ struct mntent *mnt;
+ FILE *mtp;
+ char *mtab_file;
+ char rmnt_fsname[PATH_MAX], rmnt_dir[PATH_MAX];
+ struct stat sbuf;
+ dev_t fd_dev;
+
+ if (stat(arg, &sbuf) < 0)
+ return errno;
+ /*
+ * We want to match st_rdev if the path provided is a device
+ * special file. Otherwise we are looking for the the
+ * device id for the containing filesystem, in st_dev.
+ */
+ if (S_ISBLK(sbuf.st_mode) || S_ISCHR(sbuf.st_mode))
+ fd_dev = sbuf.st_rdev;
+ else
+ fd_dev = sbuf.st_dev;
+
+ mtab_file = PROC_MOUNTS;
+ if (access(mtab_file, R_OK) != 0)
+ mtab_file = MOUNTED;
+
+ if ((mtp = setmntent(mtab_file, "r")) == NULL)
+ return ENOENT;
+
+ while ((mnt = getmntent(mtp)) != NULL) {
+ if (!realpath(mnt->mnt_dir, rmnt_dir))
+ continue;
+ if (!realpath(mnt->mnt_fsname, rmnt_fsname))
+ continue;
+
+ if (stat(rmnt_fsname, &sbuf) < 0)
+ continue;
+ if (sbuf.st_rdev == fd_dev) {
+ strncpy(datadev, rmnt_fsname, PATH_MAX);
+ strncpy(mntpoint, rmnt_dir, PATH_MAX);
+ break;
+ }
+ }
+ endmntent(mtp);
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ struct ext4_fsop_geom geo;
+ char *progname;
+ int fd;
+ int c;
+ int attr_enabled;
+ int nlink_enabled;
+ int quota_enabled;
+ int projquota_enabled;
+ int metacrc_enabled;
+ int ftype_enabled;
+ int is_64bit;
+ int inlinedata_enabled;
+ int encrypt_enabled;
+ int largedir_enabled;
+ int extents_enabled;
+ char datadev[PATH_MAX];
+ char mntpoint[PATH_MAX];
+
+ progname = basename(argv[0]);
+#ifdef ENABLE_NLS
+ setlocale(LC_ALL, "");
+ bindtextdomain(PACKAGE, LOCALEDIR);
+ textdomain(PACKAGE);
+#endif
+
+ while ((c = getopt(argc, argv, "V")) != EOF) {
+ switch (c) {
+ case 'V':
+ printf(_("%s version %s\n"), progname, VERSION);
+ exit(0);
+ case '?':
+ default:
+ usage();
+ }
+ }
+ if (argc - optind != 1)
+ usage();
+
+ fd = open(argv[optind], O_RDONLY);
+ if (fd < 0) {
+ perror(argv[optind]);
+ return 1;
+ }
+
+ if (find_datadev(argv[optind], datadev, mntpoint)) {
+ perror("find_datadev");
+ strncpy(datadev, argv[optind], PATH_MAX);
+ strncpy(mntpoint, argv[optind], PATH_MAX);
+ }
+
+ close(fd);
+ fd = open(mntpoint, O_RDONLY);
+ if (fd < 0) {
+ perror(mntpoint);
+ return 1;
+ }
+
+ /* get the current filesystem size & geometry */
+ if (ioctl(fd, EXT4_IOC_FSGEOMETRY, &geo) < 0) {
+ fprintf(stderr, _(
+ "%s: cannot determine geometry of filesystem"
+ " mounted at %s: %s\n"),
+ progname, argv[optind], strerror(errno));
+ exit(1);
+ }
+
+ attr_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_ATTR ? 1 : 0;
+ nlink_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_NLINK ? 1 : 0;
+ quota_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_QUOTA ? 1 : 0;
+ projquota_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_PROJQ ? 1 : 0;
+ metacrc_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_META_CSUM ? 1 : 0;
+ ftype_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_FTYPE ? 1 : 0;
+ is_64bit = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_64BIT ? 1 : 0;
+ inlinedata_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_INLINEDATA ? 1 : 0;
+ encrypt_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_ENCRYPT ? 1 : 0;
+ largedir_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_LARGEDIR ? 1 : 0;
+ extents_enabled = geo.efg_flags & EXT4_FSOP_GEOM_FLAGS_EXTENTS ? 1 : 0;
+
+ printf(_(
+ "meta-data=%-22s isize=%-6u bgcount=%u bgsize=%u blks\n"
+ " =%-22s attr=%-7u quota=%u pquota=%u\n"
+ " =%-22s crc=%-8u 64bit=%u inlinedata=%u extents=%u\n"
+ " =%-22s flexbg=%u\n"
+ "data =%-22s bsize=%-6u blocks=%llu bg_iblocks=%u\n"
+ " =%-22s sunit=%-6u swidth=%u blks clustersize=%u\n"
+ " =%-22s encrypt=%u\n"
+ "naming =%-22s bsize=%-6u largedir=%d ftype=%d nlink=%u\n"
+ "log =%-22s bsize=%-6u blocks=%u\n"),
+ datadev, geo.efg_inodesize, geo.efg_bgcount, geo.efg_bgblocks,
+ "", attr_enabled, quota_enabled, projquota_enabled,
+ "", metacrc_enabled, is_64bit, inlinedata_enabled,
+ extents_enabled,
+ "", geo.efg_flexbgsize,
+ "", geo.efg_blocksize, (unsigned long long)geo.efg_blockcount,
+ geo.efg_bg_iblocks,
+ "", geo.efg_sunit, geo.efg_swidth, geo.efg_clustersize,
+ "", encrypt_enabled,
+ "", geo.efg_blocksize, largedir_enabled, ftype_enabled,
+ nlink_enabled,
+ "", geo.efg_blocksize, geo.efg_logblocks);
+
+ exit(0);
+}
next prev parent reply other threads:[~2017-03-02 4:52 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-02 4:52 [PATCH 0/3] e2fsprogs: new tools e2info/e2spacey Darrick J. Wong
2017-03-02 4:52 ` [PATCH 1/3] misc: fix all the compiler warnings Darrick J. Wong
2017-03-03 15:04 ` Theodore Ts'o
2017-03-02 4:52 ` Darrick J. Wong [this message]
2017-03-02 19:49 ` [PATCH 2/3] e2info: create a tool to display ext4 fs geometry online Andreas Dilger
2017-03-02 21:50 ` Darrick J. Wong
2017-03-02 22:05 ` Andreas Dilger
[not found] ` <20170302224413.GN26319@birch.djwong.org>
2017-03-03 5:12 ` Theodore Ts'o
2017-03-02 4:52 ` [PATCH 3/3] e2spacey: create a program to use getfsmap to profile free space Darrick J. Wong
2017-03-02 19:45 ` Andreas Dilger
2017-03-02 21:27 ` Darrick J. Wong
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=148843033922.21733.4922683685279348093.stgit@birch.djwong.org \
--to=darrick.wong@oracle.com \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
/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.