ext2_io.h revision c180ac86533bcbfb1560bd4aa01464785a760f70
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 Public 8 * License. 9 * %End-Header% 10 */ 11 12#ifndef _EXT2FS_EXT2_IO_H 13#define _EXT2FS_EXT2_IO_H 14 15/* 16 * ext2_loff_t is defined here since unix_io.c needs it. 17 */ 18#if defined(__GNUC__) || defined(HAS_LONG_LONG) 19typedef long long ext2_loff_t; 20#else 21typedef long ext2_loff_t; 22#endif 23 24/* llseek.c */ 25ext2_loff_t ext2fs_llseek (int, ext2_loff_t, int); 26 27typedef struct struct_io_manager *io_manager; 28typedef struct struct_io_channel *io_channel; 29 30#define CHANNEL_FLAGS_WRITETHROUGH 0x01 31 32struct struct_io_channel { 33 errcode_t magic; 34 io_manager manager; 35 char *name; 36 int block_size; 37 errcode_t (*read_error)(io_channel channel, 38 unsigned long block, 39 int count, 40 void *data, 41 size_t size, 42 int actual_bytes_read, 43 errcode_t error); 44 errcode_t (*write_error)(io_channel channel, 45 unsigned long block, 46 int count, 47 const void *data, 48 size_t size, 49 int actual_bytes_written, 50 errcode_t error); 51 int refcount; 52 int flags; 53 int reserved[14]; 54 void *private_data; 55 void *app_data; 56}; 57 58struct struct_io_manager { 59 errcode_t magic; 60 const char *name; 61 errcode_t (*open)(const char *name, int flags, io_channel *channel); 62 errcode_t (*close)(io_channel channel); 63 errcode_t (*set_blksize)(io_channel channel, int blksize); 64 errcode_t (*read_blk)(io_channel channel, unsigned long block, 65 int count, void *data); 66 errcode_t (*write_blk)(io_channel channel, unsigned long block, 67 int count, const void *data); 68 errcode_t (*flush)(io_channel channel); 69 errcode_t (*write_byte)(io_channel channel, unsigned long offset, 70 int count, const void *data); 71 int reserved[15]; 72}; 73 74#define IO_FLAG_RW 1 75 76/* 77 * Convenience functions.... 78 */ 79#define io_channel_close(c) ((c)->manager->close((c))) 80#define io_channel_set_blksize(c,s) ((c)->manager->set_blksize((c),s)) 81#define io_channel_read_blk(c,b,n,d) ((c)->manager->read_blk((c),b,n,d)) 82#define io_channel_write_blk(c,b,n,d) ((c)->manager->write_blk((c),b,n,d)) 83#define io_channel_flush(c) ((c)->manager->flush((c))) 84#define io_channel_write_byte(c,b,n,d) ((c)->manager->write_byte((c),b,n,d)) 85#define io_channel_bumpcount(c) ((c)->refcount++) 86 87/* unix_io.c */ 88extern io_manager unix_io_manager; 89 90/* test_io.c */ 91extern io_manager test_io_manager, test_io_backing_manager; 92extern void (*test_io_cb_read_blk) 93 (unsigned long block, int count, errcode_t err); 94extern void (*test_io_cb_write_blk) 95 (unsigned long block, int count, errcode_t err); 96extern void (*test_io_cb_set_blksize) 97 (int blksize, errcode_t err); 98 99#endif /* _EXT2FS_EXT2_IO_H */ 100 101