summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ext2fs/ext2_io.h3
-rw-r--r--lib/ext2fs/unix_io.c14
-rw-r--r--misc/mke2fs.c23
3 files changed, 17 insertions, 23 deletions
diff --git a/lib/ext2fs/ext2_io.h b/lib/ext2fs/ext2_io.h
index f26b569b..ba97341b 100644
--- a/lib/ext2fs/ext2_io.h
+++ b/lib/ext2fs/ext2_io.h
@@ -29,6 +29,9 @@ typedef struct struct_io_channel *io_channel;
typedef struct struct_io_stats *io_stats;
#define CHANNEL_FLAGS_WRITETHROUGH 0x01
+#define CHANNEL_FLAGS_DISCARD_ZEROES 0x02
+
+#define io_channel_discard_zeroes_data(i) (i->flags & CHANNEL_FLAGS_DISCARD_ZEROES)
struct struct_io_channel {
errcode_t magic;
diff --git a/lib/ext2fs/unix_io.c b/lib/ext2fs/unix_io.c
index 2302374c..82e0fe44 100644
--- a/lib/ext2fs/unix_io.c
+++ b/lib/ext2fs/unix_io.c
@@ -425,12 +425,18 @@ static errcode_t flush_cached_blocks(io_channel channel,
}
#endif /* NO_IO_CACHE */
+#ifdef __linux__
+#ifndef BLKDISCARDZEROES
+#define BLKDISCARDZEROES _IO(0x12,124)
+#endif
+#endif
+
static errcode_t unix_open(const char *name, int flags, io_channel *channel)
{
io_channel io = NULL;
struct unix_private_data *data = NULL;
errcode_t retval;
- int open_flags;
+ int open_flags, zeroes = 0;
struct stat st;
#ifdef __linux__
struct utsname ut;
@@ -487,6 +493,12 @@ static errcode_t unix_open(const char *name, int flags, io_channel *channel)
}
#endif
+#ifdef BLKDISCARDZEROES
+ ioctl(data->dev, BLKDISCARDZEROES, &zeroes);
+ if (zeroes)
+ io->flags |= CHANNEL_FLAGS_DISCARD_ZEROES;
+#endif
+
#if defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
/*
* Some operating systems require that the buffers be aligned,
diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index 01ad9bfa..0c30339e 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -1928,10 +1928,6 @@ static int mke2fs_setup_tdb(const char *name, io_manager *io_ptr)
#define BLKDISCARD _IO(0x12,119)
#endif
-#ifndef BLKDISCARDZEROES
-#define BLKDISCARDZEROES _IO(0x12,124)
-#endif
-
/*
* Return zero if the discard succeeds, and -1 if the discard fails.
*/
@@ -1966,23 +1962,6 @@ static int mke2fs_discard_blocks(ext2_filsys fs)
return ret;
}
-static int mke2fs_discard_zeroes_data(ext2_filsys fs)
-{
- int fd;
- int ret;
- int discard_zeroes_data = 0;
-
- fd = open64(fs->device_name, O_RDWR);
-
- if (fd > 0) {
- ioctl(fd, BLKDISCARDZEROES, &discard_zeroes_data);
- close(fd);
- }
- return discard_zeroes_data;
-}
-#else
-#define mke2fs_discard_blocks(fs) 1
-#define mke2fs_discard_zeroes_data(fs) 0
#endif
int main (int argc, char *argv[])
@@ -2047,7 +2026,7 @@ int main (int argc, char *argv[])
if (discard && (io_ptr != undo_io_manager)) {
retval = mke2fs_discard_blocks(fs);
- if (!retval && mke2fs_discard_zeroes_data(fs)) {
+ if (!retval && io_channel_discard_zeroes_data(fs->io)) {
if (verbose)
printf(_("Discard succeeded and will return 0s "
" - skipping inode table wipe\n"));