aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debian/e2fslibs.symbols2
-rw-r--r--lib/ext2fs/ext2_err.et.in3
-rw-r--r--lib/ext2fs/ext2_io.h12
-rw-r--r--lib/ext2fs/io_manager.c32
4 files changed, 45 insertions, 4 deletions
diff --git a/debian/e2fslibs.symbols b/debian/e2fslibs.symbols
index 836731a8..00887bac 100644
--- a/debian/e2fslibs.symbols
+++ b/debian/e2fslibs.symbols
@@ -370,6 +370,8 @@ libext2fs.so.2 e2fslibs #MINVER#
inode_io_manager@Base 1.37-2sarge1
io_channel_set_options@Base 1.37-2sarge1
io_channel_write_byte@Base 1.37-2sarge1
+ io_channel_read_blk64@Base 1.41.1-1
+ io_channel_write_blk64@Base 1.41.1-1
set_undo_io_backing_manager@Base 1.41.0-1
set_undo_io_backup_file@Base 1.41.0-1
tdb_null@Base 1.40-1
diff --git a/lib/ext2fs/ext2_err.et.in b/lib/ext2fs/ext2_err.et.in
index a072fb82..9ffffbb4 100644
--- a/lib/ext2fs/ext2_err.et.in
+++ b/lib/ext2fs/ext2_err.et.in
@@ -413,4 +413,7 @@ ec EXT2_ET_EXTENT_NOT_SUPPORTED,
ec EXT2_ET_EXTENT_INVALID_LENGTH,
"Extent length is invalid"
+ec EXT2_ET_IO_CHANNEL_NO_SUPPORT_64,
+ "I/O Channel does not support 64-bit block numbers"
+
end
diff --git a/lib/ext2fs/ext2_io.h b/lib/ext2fs/ext2_io.h
index d9bbcca6..dce21386 100644
--- a/lib/ext2fs/ext2_io.h
+++ b/lib/ext2fs/ext2_io.h
@@ -51,7 +51,7 @@ struct struct_io_channel {
errcode_t error);
int refcount;
int flags;
- int reserved[14];
+ long reserved[14];
void *private_data;
void *app_data;
};
@@ -83,7 +83,7 @@ struct struct_io_manager {
int count, void *data);
errcode_t (*write_blk64)(io_channel channel, unsigned long long block,
int count, const void *data);
- int reserved[16];
+ long reserved[16];
};
#define IO_FLAG_RW 0x0001
@@ -95,9 +95,7 @@ struct struct_io_manager {
#define io_channel_close(c) ((c)->manager->close((c)))
#define io_channel_set_blksize(c,s) ((c)->manager->set_blksize((c),s))
#define io_channel_read_blk(c,b,n,d) ((c)->manager->read_blk((c),b,n,d))
-#define io_channel_read_blk64(c,b,n,d) ((c)->manager->read_blk64((c),b,n,d))
#define io_channel_write_blk(c,b,n,d) ((c)->manager->write_blk((c),b,n,d))
-#define io_channel_write_blk64(c,b,n,d) ((c)->manager->write_blk64((c),b,n,d))
#define io_channel_flush(c) ((c)->manager->flush((c)))
#define io_channel_bumpcount(c) ((c)->refcount++)
@@ -107,6 +105,12 @@ extern errcode_t io_channel_set_options(io_channel channel,
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);
/* unix_io.c */
extern io_manager unix_io_manager;
diff --git a/lib/ext2fs/io_manager.c b/lib/ext2fs/io_manager.c
index e50d7e41..8d732530 100644
--- a/lib/ext2fs/io_manager.c
+++ b/lib/ext2fs/io_manager.c
@@ -67,3 +67,35 @@ errcode_t io_channel_write_byte(io_channel channel, unsigned long offset,
return EXT2_ET_UNIMPLEMENTED;
}
+
+errcode_t io_channel_read_blk64(io_channel channel, unsigned long long block,
+ int count, void *data)
+{
+ EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+
+ if (channel->manager->read_blk64)
+ return (channel->manager->read_blk64)(channel, block,
+ count, data);
+
+ if ((block >> 32) != 0)
+ return EXT2_ET_IO_CHANNEL_NO_SUPPORT_64;
+
+ return (channel->manager->read_blk)(channel, (unsigned long) block,
+ count, data);
+}
+
+errcode_t io_channel_write_blk64(io_channel channel, unsigned long long block,
+ int count, const void *data)
+{
+ EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+
+ if (channel->manager->write_blk64)
+ return (channel->manager->write_blk64)(channel, block,
+ count, data);
+
+ if ((block >> 32) != 0)
+ return EXT2_ET_IO_CHANNEL_NO_SUPPORT_64;
+
+ return (channel->manager->write_blk)(channel, (unsigned long) block,
+ count, data);
+}