Whamcloud - gitweb
libext2fs: allow the unix_io manager's cache to be disabled and re-enabled
authorTheodore Ts'o <tytso@mit.edu>
Thu, 14 Jan 2021 00:27:21 +0000 (16:27 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 21 Jan 2021 15:50:40 +0000 (10:50 -0500)
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/ext2fs/ext2_io.h
lib/ext2fs/unix_io.c

index 2e0da5a..95c25a7 100644 (file)
@@ -106,6 +106,7 @@ struct struct_io_manager {
 #define IO_FLAG_DIRECT_IO      0x0004
 #define IO_FLAG_FORCE_BOUNCE   0x0008
 #define IO_FLAG_THREADS                0x0010
+#define IO_FLAG_NOCACHE                0x0020
 
 /*
  * Convenience functions....
index 9385487..2df53e5 100644 (file)
@@ -942,6 +942,8 @@ static errcode_t unix_read_blk64(io_channel channel, unsigned long long block,
 #ifdef NO_IO_CACHE
        return raw_read_blk(channel, data, block, count, buf);
 #else
+       if (data->flags & IO_FLAG_NOCACHE)
+               return raw_read_blk(channel, data, block, count, buf);
        /*
         * If we're doing an odd-sized read or a very large read,
         * flush out the cache and then do a direct read.
@@ -1032,6 +1034,8 @@ static errcode_t unix_write_blk64(io_channel channel, unsigned long long block,
 #ifdef NO_IO_CACHE
        return raw_write_blk(channel, data, block, count, buf);
 #else
+       if (data->flags & IO_FLAG_NOCACHE)
+               return raw_write_blk(channel, data, block, count, buf);
        /*
         * If we're doing an odd-sized write or a very large write,
         * flush out the cache completely and then do a direct write.
@@ -1161,6 +1165,7 @@ static errcode_t unix_set_option(io_channel channel, const char *option,
 {
        struct unix_private_data *data;
        unsigned long long tmp;
+       errcode_t retval;
        char *end;
 
        EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
@@ -1179,6 +1184,20 @@ static errcode_t unix_set_option(io_channel channel, const char *option,
                        return EXT2_ET_INVALID_ARGUMENT;
                return 0;
        }
+       if (!strcmp(option, "cache")) {
+               if (!arg)
+                       return EXT2_ET_INVALID_ARGUMENT;
+               if (!strcmp(arg, "on")) {
+                       data->flags &= ~IO_FLAG_NOCACHE;
+                       return 0;
+               }
+               if (!strcmp(arg, "off")) {
+                       retval = flush_cached_blocks(channel, data, 0);
+                       data->flags |= IO_FLAG_NOCACHE;
+                       return retval;
+               }
+               return EXT2_ET_INVALID_ARGUMENT;
+       }
        return EXT2_ET_INVALID_ARGUMENT;
 }