From 819157db798cd514aa2f3ae421d64e2e0c9b7fa8 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Wed, 22 Jan 2003 18:25:39 -0500 Subject: [PATCH] Remove 32-bit limitations for debugfs's dump command and to the ext2fs library's ext2fs_file_read. --- debugfs/ChangeLog | 5 +++++ debugfs/dump.c | 6 +++++- lib/ext2fs/ChangeLog | 8 ++++++++ lib/ext2fs/ext2fs.h | 8 ++++++++ lib/ext2fs/fileio.c | 48 +++++++++++++++++++++++++++++++++++++++--------- 5 files changed, 65 insertions(+), 10 deletions(-) diff --git a/debugfs/ChangeLog b/debugfs/ChangeLog index 661bc45..ca3b22f 100644 --- a/debugfs/ChangeLog +++ b/debugfs/ChangeLog @@ -1,3 +1,8 @@ +2003-01-21 Theodore Ts'o + + * dump.c (do_dump): Open the output file with O_LARGEFILE so we + can write files larger than 2GB. + 2002-11-09 Theodore Ts'o * Release of E2fsprogs 1.32 diff --git a/debugfs/dump.c b/debugfs/dump.c index 98088d6..e9227f0 100644 --- a/debugfs/dump.c +++ b/debugfs/dump.c @@ -30,6 +30,10 @@ extern int optreset; /* defined by BSD, but not others */ #include "debugfs.h" +#ifndef O_LARGEFILE +#define O_LARGEFILE 0 +#endif + /* * The mode_xlate function translates a linux mode into a native-OS mode_t. */ @@ -174,7 +178,7 @@ void do_dump(int argc, char **argv) if (!inode) return; - fd = open(out_fn, O_CREAT | O_WRONLY | O_TRUNC, 0666); + fd = open(out_fn, O_CREAT | O_WRONLY | O_TRUNC | O_LARGEFILE, 0666); if (fd < 0) { com_err(argv[0], errno, "while opening %s for dump_inode", out_fn); diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog index 749bafb..4f3a9c1 100644 --- a/lib/ext2fs/ChangeLog +++ b/lib/ext2fs/ChangeLog @@ -1,3 +1,11 @@ +2003-01-21 Theodore Ts'o + + * fileio.c (ext2fs_file_read, ext2_file_lseek, + ext2_file_get_size): Add 64-bit support. + + * ext2fs.h (EXT2_I_SIZE): Add macro which caluates a 64bit size + from i_size and i_size_high. + 2003-01-19 Theodore Ts'o * initialize.c (ext2fs_initialize): If the user specifies a really diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index 992fc74..af3450f 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -381,6 +381,11 @@ typedef struct ext2_struct_inode_scan *ext2_inode_scan; #define LINUX_S_ISSOCK(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK) /* + * ext2 size of an inode + */ +#define EXT2_I_SIZE(i) ((i)->i_size | ((__u64) (i)->i_size_high << 32)) + +/* * ext2_icount_t abstraction */ #define EXT2_ICOUNT_OPT_INCREMENT 0x01 @@ -687,8 +692,11 @@ extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf, unsigned int wanted, unsigned int *got); extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf, unsigned int nbytes, unsigned int *written); +extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset, + int whence, __u64 *ret_pos); extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset, int whence, ext2_off_t *ret_pos); +errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size); extern ext2_off_t ext2fs_file_get_size(ext2_file_t file); extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size); diff --git a/lib/ext2fs/fileio.c b/lib/ext2fs/fileio.c index 32f5b37..859135b 100644 --- a/lib/ext2fs/fileio.c +++ b/lib/ext2fs/fileio.c @@ -24,7 +24,7 @@ struct ext2_file { ext2_ino_t ino; struct ext2_inode inode; int flags; - ext2_off_t pos; + __u64 pos; blk_t blockno; blk_t physblock; char *buf; @@ -199,13 +199,14 @@ errcode_t ext2fs_file_read(ext2_file_t file, void *buf, { ext2_filsys fs; errcode_t retval = 0; - unsigned int start, left, c, count = 0; + unsigned int start, c, count = 0; + __u64 left; char *ptr = (char *) buf; EXT2_CHECK_MAGIC(file, EXT2_ET_MAGIC_EXT2_FILE); fs = file->fs; - while ((file->pos < file->inode.i_size) && (wanted > 0)) { + while ((file->pos < EXT2_I_SIZE(&file->inode)) && (wanted > 0)) { retval = sync_buffer_position(file); if (retval) goto fail; @@ -217,7 +218,7 @@ errcode_t ext2fs_file_read(ext2_file_t file, void *buf, c = fs->blocksize - start; if (c > wanted) c = wanted; - left = file->inode.i_size - file->pos ; + left = EXT2_I_SIZE(&file->inode) - file->pos ; if (c > left) c = left; @@ -281,8 +282,8 @@ fail: return retval; } -errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset, - int whence, ext2_off_t *ret_pos) +errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset, + int whence, __u64 *ret_pos) { EXT2_CHECK_MAGIC(file, EXT2_ET_MAGIC_EXT2_FILE); @@ -291,7 +292,7 @@ errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset, else if (whence == EXT2_SEEK_CUR) file->pos += offset; else if (whence == EXT2_SEEK_END) - file->pos = file->inode.i_size + offset; + file->pos = EXT2_I_SIZE(&file->inode) + offset; else return EXT2_ET_INVALID_ARGUMENT; @@ -301,14 +302,42 @@ errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset, return 0; } +errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset, + int whence, ext2_off_t *ret_pos) +{ + __u64 loffset, ret_loffset; + errcode_t retval; + + loffset = offset; + retval = ext2fs_file_llseek(file, loffset, whence, &ret_loffset); + *ret_pos = (ext2_off_t) ret_loffset; + return retval; +} + + /* * This function returns the size of the file, according to the inode */ -ext2_off_t ext2fs_file_get_size(ext2_file_t file) +errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size) { if (file->magic != EXT2_ET_MAGIC_EXT2_FILE) + return EXT2_ET_MAGIC_EXT2_FILE; + *ret_size = EXT2_I_SIZE(&file->inode); + return 0; +} + +/* + * This function returns the size of the file, according to the inode + */ +ext2_off_t ext2fs_file_get_size(ext2_file_t file) +{ + __u64 size; + + if (ext2fs_file_get_lsize(file, &size)) + return 0; + if ((size >> 32) != 0) return 0; - return file->inode.i_size; + return size; } /* @@ -322,6 +351,7 @@ errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size) EXT2_CHECK_MAGIC(file, EXT2_ET_MAGIC_EXT2_FILE); file->inode.i_size = size; + file->inode.i_size_high = 0; retval = ext2fs_write_inode(file->fs, file->ino, &file->inode); if (retval) return retval; -- 1.8.3.1