Whamcloud - gitweb
Merge branch 'maint' into next
[tools/e2fsprogs.git] / lib / ext2fs / ext2_io.h
index 9568866..1894fb8 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * io.h --- the I/O manager abstraction
- * 
+ *
  * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
  *
  * %Begin-Header%
- * This file may be redistributed under the terms of the GNU Public
- * License.
+ * This file may be redistributed under the terms of the GNU Library
+ * General Public License, version 2.
  * %End-Header%
  */
 
@@ -26,6 +26,13 @@ ext2_loff_t ext2fs_llseek (int, ext2_loff_t, int);
 
 typedef struct struct_io_manager *io_manager;
 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 CHANNEL_FLAGS_BLOCK_DEVICE     0x04
+
+#define io_channel_discard_zeroes_data(i) (i->flags & CHANNEL_FLAGS_DISCARD_ZEROES)
 
 struct struct_io_channel {
        errcode_t       magic;
@@ -47,9 +54,18 @@ struct struct_io_channel {
                                       int actual_bytes_written,
                                       errcode_t error);
        int             refcount;
-       int             reserved[15];
+       int             flags;
+       long            reserved[14];
        void            *private_data;
        void            *app_data;
+       int             align;
+};
+
+struct struct_io_stats {
+       int                     num_fields;
+       int                     reserved;
+       unsigned long long      bytes_read;
+       unsigned long long      bytes_written;
 };
 
 struct struct_io_manager {
@@ -63,10 +79,23 @@ struct struct_io_manager {
        errcode_t (*write_blk)(io_channel channel, unsigned long block,
                               int count, const void *data);
        errcode_t (*flush)(io_channel channel);
-       int             reserved[16];
+       errcode_t (*write_byte)(io_channel channel, unsigned long offset,
+                               int count, const void *data);
+       errcode_t (*set_option)(io_channel channel, const char *option,
+                               const char *arg);
+       errcode_t (*get_stats)(io_channel channel, io_stats *io_stats);
+       errcode_t (*read_blk64)(io_channel channel, unsigned long long block,
+                                       int count, void *data);
+       errcode_t (*write_blk64)(io_channel channel, unsigned long long block,
+                                       int count, const void *data);
+       errcode_t (*discard)(io_channel channel, unsigned long long block,
+                            unsigned long long count);
+       long    reserved[16];
 };
 
-#define IO_FLAG_RW     1
+#define IO_FLAG_RW             0x0001
+#define IO_FLAG_EXCLUSIVE      0x0002
+#define IO_FLAG_DIRECT_IO      0x0004
 
 /*
  * Convenience functions....
@@ -77,18 +106,45 @@ struct struct_io_manager {
 #define io_channel_write_blk(c,b,n,d)  ((c)->manager->write_blk((c),b,n,d))
 #define io_channel_flush(c)            ((c)->manager->flush((c)))
 #define io_channel_bumpcount(c)                ((c)->refcount++)
-       
+
+/* io_manager.c */
+extern errcode_t io_channel_set_options(io_channel channel,
+                                       const char *options);
+extern errcode_t io_channel_write_byte(io_channel channel,
+                                      unsigned long offset,
+                                      int count, const void *data);
+extern errcode_t io_channel_read_blk64(io_channel channel,
+                                      unsigned long long block,
+                                      int count, void *data);
+extern errcode_t io_channel_write_blk64(io_channel channel,
+                                       unsigned long long block,
+                                       int count, const void *data);
+extern errcode_t io_channel_discard(io_channel channel,
+                                   unsigned long long block,
+                                   unsigned long long count);
+extern errcode_t io_channel_alloc_buf(io_channel channel,
+                                     int count, void *ptr);
+
 /* unix_io.c */
 extern io_manager unix_io_manager;
 
+/* undo_io.c */
+extern io_manager undo_io_manager;
+extern errcode_t set_undo_io_backing_manager(io_manager manager);
+extern errcode_t set_undo_io_backup_file(char *file_name);
+
 /* test_io.c */
 extern io_manager test_io_manager, test_io_backing_manager;
 extern void (*test_io_cb_read_blk)
        (unsigned long block, int count, errcode_t err);
 extern void (*test_io_cb_write_blk)
        (unsigned long block, int count, errcode_t err);
+extern void (*test_io_cb_read_blk64)
+       (unsigned long long block, int count, errcode_t err);
+extern void (*test_io_cb_write_blk64)
+       (unsigned long long block, int count, errcode_t err);
 extern void (*test_io_cb_set_blksize)
        (int blksize, errcode_t err);
 
 #endif /* _EXT2FS_EXT2_IO_H */
-       
+