2 * test_io.c --- This is the Test I/O interface.
4 * Copyright (C) 1996 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Public
23 #include <sys/types.h>
26 #if EXT2_FLAT_INCLUDES
29 #include <linux/ext2_fs.h>
35 * For checking structure magic numbers...
38 #define EXT2_CHECK_MAGIC(struct, code) \
39 if ((struct)->magic != (code)) return (code)
41 struct test_private_data {
44 void (*read_blk)(unsigned long block, int count, errcode_t err);
45 void (*write_blk)(unsigned long block, int count, errcode_t err);
46 void (*set_blksize)(int blksize, errcode_t err);
49 static errcode_t test_open(const char *name, int flags, io_channel *channel);
50 static errcode_t test_close(io_channel channel);
51 static errcode_t test_set_blksize(io_channel channel, int blksize);
52 static errcode_t test_read_blk(io_channel channel, unsigned long block,
53 int count, void *data);
54 static errcode_t test_write_blk(io_channel channel, unsigned long block,
55 int count, const void *data);
56 static errcode_t test_flush(io_channel channel);
58 static struct struct_io_manager struct_test_manager = {
59 EXT2_ET_MAGIC_IO_MANAGER,
69 io_manager test_io_manager = &struct_test_manager;
72 * These global variable can be set by the test program as
73 * necessary *before* calling test_open
75 io_manager test_io_backing_manager = 0;
76 void (*test_io_cb_read_blk)
77 (unsigned long block, int count, errcode_t err) = 0;
78 void (*test_io_cb_write_blk)
79 (unsigned long block, int count, errcode_t err) = 0;
80 void (*test_io_cb_set_blksize)
81 (int blksize, errcode_t err) = 0;
83 static errcode_t test_open(const char *name, int flags, io_channel *channel)
86 struct test_private_data *data = NULL;
90 return EXT2_ET_BAD_DEVICE_NAME;
91 retval = ext2fs_get_mem(sizeof(struct struct_io_channel),
95 memset(io, 0, sizeof(struct struct_io_channel));
96 io->magic = EXT2_ET_MAGIC_IO_CHANNEL;
97 retval = ext2fs_get_mem(sizeof(struct test_private_data),
100 retval = EXT2_ET_NO_MEMORY;
103 io->manager = test_io_manager;
104 retval = ext2fs_get_mem(strlen(name)+1, (void **) &io->name);
108 strcpy(io->name, name);
109 io->private_data = data;
110 io->block_size = 1024;
115 memset(data, 0, sizeof(struct test_private_data));
116 data->magic = EXT2_ET_MAGIC_TEST_IO_CHANNEL;
117 if (test_io_backing_manager) {
118 retval = test_io_backing_manager->open(name, flags,
124 data->read_blk = test_io_cb_read_blk;
125 data->write_blk = test_io_cb_write_blk;
126 data->set_blksize = test_io_cb_set_blksize;
133 ext2fs_free_mem((void **) &io);
135 ext2fs_free_mem((void **) &data);
139 static errcode_t test_close(io_channel channel)
141 struct test_private_data *data;
142 errcode_t retval = 0;
144 EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
145 data = (struct test_private_data *) channel->private_data;
146 EXT2_CHECK_MAGIC(data, EXT2_ET_MAGIC_TEST_IO_CHANNEL);
148 if (--channel->refcount > 0)
152 retval = io_channel_close(data->real);
154 if (channel->private_data)
155 ext2fs_free_mem((void **) &channel->private_data);
157 ext2fs_free_mem((void **) &channel->name);
158 ext2fs_free_mem((void **) &channel);
162 static errcode_t test_set_blksize(io_channel channel, int blksize)
164 struct test_private_data *data;
165 errcode_t retval = 0;
167 EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
168 data = (struct test_private_data *) channel->private_data;
169 EXT2_CHECK_MAGIC(data, EXT2_ET_MAGIC_TEST_IO_CHANNEL);
172 retval = io_channel_set_blksize(data->real, blksize);
173 if (data->set_blksize)
174 data->set_blksize(blksize, retval);
176 printf("Test_io: set_blksize(%d) returned %s\n",
177 blksize, retval ? error_message(retval) : "OK");
182 static errcode_t test_read_blk(io_channel channel, unsigned long block,
183 int count, void *buf)
185 struct test_private_data *data;
186 errcode_t retval = 0;
188 EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
189 data = (struct test_private_data *) channel->private_data;
190 EXT2_CHECK_MAGIC(data, EXT2_ET_MAGIC_TEST_IO_CHANNEL);
193 retval = io_channel_read_blk(data->real, block, count, buf);
195 data->read_blk(block, count, retval);
197 printf("Test_io: read_blk(%lu, %d) returned %s\n",
198 block, count, retval ? error_message(retval) : "OK");
202 static errcode_t test_write_blk(io_channel channel, unsigned long block,
203 int count, const void *buf)
205 struct test_private_data *data;
206 errcode_t retval = 0;
208 EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
209 data = (struct test_private_data *) channel->private_data;
210 EXT2_CHECK_MAGIC(data, EXT2_ET_MAGIC_TEST_IO_CHANNEL);
213 retval = io_channel_write_blk(data->real, block, count, buf);
215 data->write_blk(block, count, retval);
217 printf("Test_io: write_blk(%lu, %d) returned %s\n",
218 block, count, retval ? error_message(retval) : "OK");
223 * Flush data buffers to disk.
225 static errcode_t test_flush(io_channel channel)
227 struct test_private_data *data;
228 errcode_t retval = 0;
230 EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
231 data = (struct test_private_data *) channel->private_data;
232 EXT2_CHECK_MAGIC(data, EXT2_ET_MAGIC_TEST_IO_CHANNEL);
235 retval = io_channel_flush(data->real);
237 printf("Test_io: flush() returned %s\n",
238 retval ? error_message(retval) : "OK");