1 /* 2 * io.h --- the I/O manager abstraction 3 * 4 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. 5 * 6 * %Begin-Header% 7 * This file may be redistributed under the terms of the GNU Library 8 * General Public License, version 2. 9 * %End-Header% 10 */ 11 12 #ifndef _EXT2FS_EXT2_IO_H 13 #define _EXT2FS_EXT2_IO_H 14 15 #include <ext2fs/ext2_types.h> 16 17 /* 18 * ext2_loff_t is defined here since unix_io.c needs it. 19 */ 20 #if defined(__GNUC__) || defined(HAS_LONG_LONG) 21 typedef long long ext2_loff_t; 22 #else 23 typedef long ext2_loff_t; 24 #endif 25 26 /* llseek.c */ 27 ext2_loff_t ext2fs_llseek (int, ext2_loff_t, int); 28 29 typedef struct struct_io_manager *io_manager; 30 typedef struct struct_io_channel *io_channel; 31 typedef struct struct_io_stats *io_stats; 32 33 #define CHANNEL_FLAGS_WRITETHROUGH 0x01 34 #define CHANNEL_FLAGS_DISCARD_ZEROES 0x02 35 #define CHANNEL_FLAGS_BLOCK_DEVICE 0x04 36 37 #define io_channel_discard_zeroes_data(i) (i->flags & CHANNEL_FLAGS_DISCARD_ZEROES) 38 39 struct struct_io_channel { 40 errcode_t magic; 41 io_manager manager; 42 char *name; 43 int block_size; 44 errcode_t (*read_error)(io_channel channel, 45 unsigned long block, 46 int count, 47 void *data, 48 size_t size, 49 int actual_bytes_read, 50 errcode_t error); 51 errcode_t (*write_error)(io_channel channel, 52 unsigned long block, 53 int count, 54 const void *data, 55 size_t size, 56 int actual_bytes_written, 57 errcode_t error); 58 int refcount; 59 int flags; 60 long reserved[14]; 61 void *private_data; 62 void *app_data; 63 int align; 64 }; 65 66 struct struct_io_stats { 67 int num_fields; 68 int reserved; 69 unsigned long long bytes_read; 70 unsigned long long bytes_written; 71 }; 72 73 struct struct_io_manager { 74 errcode_t magic; 75 const char *name; 76 errcode_t (*open)(const char *name, int flags, io_channel *channel); 77 errcode_t (*close)(io_channel channel); 78 errcode_t (*set_blksize)(io_channel channel, int blksize); 79 errcode_t (*read_blk)(io_channel channel, unsigned long block, 80 int count, void *data); 81 errcode_t (*write_blk)(io_channel channel, unsigned long block, 82 int count, const void *data); 83 errcode_t (*flush)(io_channel channel); 84 errcode_t (*write_byte)(io_channel channel, unsigned long offset, 85 int count, const void *data); 86 errcode_t (*set_option)(io_channel channel, const char *option, 87 const char *arg); 88 errcode_t (*get_stats)(io_channel channel, io_stats *io_stats); 89 errcode_t (*read_blk64)(io_channel channel, unsigned long long block, 90 int count, void *data); 91 errcode_t (*write_blk64)(io_channel channel, unsigned long long block, 92 int count, const void *data); 93 errcode_t (*discard)(io_channel channel, unsigned long long block, 94 unsigned long long count); 95 errcode_t (*cache_readahead)(io_channel channel, 96 unsigned long long block, 97 unsigned long long count); 98 errcode_t (*zeroout)(io_channel channel, unsigned long long block, 99 unsigned long long count); 100 long reserved[14]; 101 }; 102 103 #define IO_FLAG_RW 0x0001 104 #define IO_FLAG_EXCLUSIVE 0x0002 105 #define IO_FLAG_DIRECT_IO 0x0004 106 107 /* 108 * Convenience functions.... 109 */ 110 #define io_channel_close(c) ((c)->manager->close((c))) 111 #define io_channel_set_blksize(c,s) ((c)->manager->set_blksize((c),s)) 112 #define io_channel_read_blk(c,b,n,d) ((c)->manager->read_blk((c),b,n,d)) 113 #define io_channel_write_blk(c,b,n,d) ((c)->manager->write_blk((c),b,n,d)) 114 #define io_channel_flush(c) ((c)->manager->flush((c))) 115 #define io_channel_bumpcount(c) ((c)->refcount++) 116 117 /* io_manager.c */ 118 extern errcode_t io_channel_set_options(io_channel channel, 119 const char *options); 120 extern errcode_t io_channel_write_byte(io_channel channel, 121 unsigned long offset, 122 int count, const void *data); 123 extern errcode_t io_channel_read_blk64(io_channel channel, 124 unsigned long long block, 125 int count, void *data); 126 extern errcode_t io_channel_write_blk64(io_channel channel, 127 unsigned long long block, 128 int count, const void *data); 129 extern errcode_t io_channel_discard(io_channel channel, 130 unsigned long long block, 131 unsigned long long count); 132 extern errcode_t io_channel_zeroout(io_channel channel, 133 unsigned long long block, 134 unsigned long long count); 135 extern errcode_t io_channel_alloc_buf(io_channel channel, 136 int count, void *ptr); 137 extern errcode_t io_channel_cache_readahead(io_channel io, 138 unsigned long long block, 139 unsigned long long count); 140 141 /* unix_io.c */ 142 extern io_manager unix_io_manager; 143 extern io_manager unixfd_io_manager; 144 145 /* sparse_io.c */ 146 extern io_manager sparse_io_manager; 147 extern io_manager sparsefd_io_manager; 148 149 /* undo_io.c */ 150 extern io_manager undo_io_manager; 151 extern errcode_t set_undo_io_backing_manager(io_manager manager); 152 extern errcode_t set_undo_io_backup_file(char *file_name); 153 154 /* test_io.c */ 155 extern io_manager test_io_manager, test_io_backing_manager; 156 extern void (*test_io_cb_read_blk) 157 (unsigned long block, int count, errcode_t err); 158 extern void (*test_io_cb_write_blk) 159 (unsigned long block, int count, errcode_t err); 160 extern void (*test_io_cb_read_blk64) 161 (unsigned long long block, int count, errcode_t err); 162 extern void (*test_io_cb_write_blk64) 163 (unsigned long long block, int count, errcode_t err); 164 extern void (*test_io_cb_set_blksize) 165 (int blksize, errcode_t err); 166 167 #endif /* _EXT2FS_EXT2_IO_H */ 168 169