diff options
-rw-r--r-- | lib/ext2fs/ext2_io.h | 3 | ||||
-rw-r--r-- | lib/ext2fs/unix_io.c | 14 | ||||
-rw-r--r-- | misc/mke2fs.c | 23 |
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")); |