aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ext2fs/fileio.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ext2fs/fileio.c')
-rw-r--r--lib/ext2fs/fileio.c160
1 files changed, 20 insertions, 140 deletions
diff --git a/lib/ext2fs/fileio.c b/lib/ext2fs/fileio.c
index 2e1b6824..834867e1 100644
--- a/lib/ext2fs/fileio.c
+++ b/lib/ext2fs/fileio.c
@@ -17,7 +17,6 @@
#include "ext2_fs.h"
#include "ext2fs.h"
-#include "ext2fsP.h"
struct ext2_file {
errcode_t magic;
@@ -26,8 +25,8 @@ struct ext2_file {
struct ext2_inode inode;
int flags;
__u64 pos;
- blk64_t blockno;
- blk64_t physblock;
+ blk_t blockno;
+ blk_t physblock;
char *buf;
};
@@ -97,24 +96,6 @@ ext2_filsys ext2fs_file_get_fs(ext2_file_t file)
}
/*
- * This function returns the pointer to the inode of a file from the structure
- */
-struct ext2_inode *ext2fs_file_get_inode(ext2_file_t file)
-{
- if (file->magic != EXT2_ET_MAGIC_EXT2_FILE)
- return NULL;
- return &file->inode;
-}
-
-/* This function returns the inode number from the structure */
-ext2_ino_t ext2fs_file_get_inode_num(ext2_file_t file)
-{
- if (file->magic != EXT2_ET_MAGIC_EXT2_FILE)
- return 0;
- return file->ino;
-}
-
-/*
* This function flushes the dirty block buffer out to disk if
* necessary.
*/
@@ -135,14 +116,15 @@ errcode_t ext2fs_file_flush(ext2_file_t file)
* Allocate it.
*/
if (!file->physblock) {
- retval = ext2fs_bmap2(fs, file->ino, &file->inode,
+ retval = ext2fs_bmap(fs, file->ino, &file->inode,
BMAP_BUFFER, file->ino ? BMAP_ALLOC : 0,
- file->blockno, 0, &file->physblock);
+ file->blockno, &file->physblock);
if (retval)
return retval;
}
- retval = io_channel_write_blk64(fs->io, file->physblock, 1, file->buf);
+ retval = io_channel_write_blk(fs->io, file->physblock,
+ 1, file->buf);
if (retval)
return retval;
@@ -157,7 +139,7 @@ errcode_t ext2fs_file_flush(ext2_file_t file)
*/
static errcode_t sync_buffer_position(ext2_file_t file)
{
- blk64_t b;
+ blk_t b;
errcode_t retval;
b = file->pos / file->fs->blocksize;
@@ -186,16 +168,16 @@ static errcode_t load_buffer(ext2_file_t file, int dontfill)
errcode_t retval;
if (!(file->flags & EXT2_FILE_BUF_VALID)) {
- retval = ext2fs_bmap2(fs, file->ino, &file->inode,
- BMAP_BUFFER, 0, file->blockno, 0,
+ retval = ext2fs_bmap(fs, file->ino, &file->inode,
+ BMAP_BUFFER, 0, file->blockno,
&file->physblock);
if (retval)
return retval;
if (!dontfill) {
if (file->physblock) {
- retval = io_channel_read_blk64(fs->io,
- file->physblock,
- 1, file->buf);
+ retval = io_channel_read_blk(fs->io,
+ file->physblock,
+ 1, file->buf);
if (retval)
return retval;
} else
@@ -297,20 +279,6 @@ errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
if (retval)
goto fail;
- /*
- * OK, the physical block hasn't been allocated yet.
- * Allocate it.
- */
- if (!file->physblock) {
- retval = ext2fs_bmap2(fs, file->ino, &file->inode,
- BMAP_BUFFER,
- file->ino ? BMAP_ALLOC : 0,
- file->blockno, 0,
- &file->physblock);
- if (retval)
- goto fail;
- }
-
file->flags |= EXT2_FILE_BUF_DIRTY;
memcpy(file->buf+start, ptr, c);
file->pos += c;
@@ -320,15 +288,6 @@ errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
}
fail:
- /* Update inode size */
- if (count != 0 && EXT2_I_SIZE(&file->inode) < file->pos) {
- errcode_t rc;
-
- rc = ext2fs_file_set_size2(file, file->pos);
- if (retval == 0)
- retval = rc;
- }
-
if (written)
*written = count;
return retval;
@@ -393,106 +352,27 @@ ext2_off_t ext2fs_file_get_size(ext2_file_t file)
return size;
}
-/* Zero the parts of the last block that are past EOF. */
-static errcode_t ext2fs_file_zero_past_offset(ext2_file_t file,
- ext2_off64_t offset)
-{
- ext2_filsys fs = file->fs;
- char *b = NULL;
- ext2_off64_t off = offset % fs->blocksize;
- blk64_t blk;
- int ret_flags;
- errcode_t retval;
-
- if (off == 0)
- return 0;
-
- retval = sync_buffer_position(file);
- if (retval)
- return retval;
-
- /* Is there an initialized block at the end? */
- retval = ext2fs_bmap2(fs, file->ino, NULL, NULL, 0,
- offset / fs->blocksize, &ret_flags, &blk);
- if (retval)
- return retval;
- if ((blk == 0) || (ret_flags & BMAP_RET_UNINIT))
- return 0;
-
- /* Zero to the end of the block */
- retval = ext2fs_get_mem(fs->blocksize, &b);
- if (retval)
- return retval;
-
- /* Read/zero/write block */
- retval = io_channel_read_blk64(fs->io, blk, 1, b);
- if (retval)
- goto out;
-
- memset(b + off, 0, fs->blocksize - off);
-
- retval = io_channel_write_blk64(fs->io, blk, 1, b);
- if (retval)
- goto out;
-
-out:
- ext2fs_free_mem(&b);
- return retval;
-}
-
/*
* This function sets the size of the file, truncating it if necessary
*
+ * XXX still need to call truncate
*/
-errcode_t ext2fs_file_set_size2(ext2_file_t file, ext2_off64_t size)
+errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size)
{
- ext2_off64_t old_size;
errcode_t retval;
- blk64_t old_truncate, truncate_block;
-
EXT2_CHECK_MAGIC(file, EXT2_ET_MAGIC_EXT2_FILE);
- if (size && ext2fs_file_block_offset_too_big(file->fs, &file->inode,
- (size - 1) / file->fs->blocksize))
- return EXT2_ET_FILE_TOO_BIG;
- truncate_block = ((size + file->fs->blocksize - 1) >>
- EXT2_BLOCK_SIZE_BITS(file->fs->super));
- old_size = EXT2_I_SIZE(&file->inode);
- old_truncate = ((old_size + file->fs->blocksize - 1) >>
- EXT2_BLOCK_SIZE_BITS(file->fs->super));
-
- /* If we're writing a large file, set the large_file flag */
- if (LINUX_S_ISREG(file->inode.i_mode) &&
- ext2fs_needs_large_file_feature(EXT2_I_SIZE(&file->inode)) &&
- (!EXT2_HAS_RO_COMPAT_FEATURE(file->fs->super,
- EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ||
- file->fs->super->s_rev_level == EXT2_GOOD_OLD_REV)) {
- file->fs->super->s_feature_ro_compat |=
- EXT2_FEATURE_RO_COMPAT_LARGE_FILE;
- ext2fs_update_dynamic_rev(file->fs);
- ext2fs_mark_super_dirty(file->fs);
- }
-
- file->inode.i_size = size & 0xffffffff;
- file->inode.i_size_high = (size >> 32);
+ file->inode.i_size = size;
+ file->inode.i_size_high = 0;
if (file->ino) {
retval = ext2fs_write_inode(file->fs, file->ino, &file->inode);
if (retval)
return retval;
}
- retval = ext2fs_file_zero_past_offset(file, size);
- if (retval)
- return retval;
-
- if (truncate_block >= old_truncate)
- return 0;
-
- return ext2fs_punch(file->fs, file->ino, &file->inode, 0,
- truncate_block, ~0ULL);
-}
+ /*
+ * XXX truncate inode if necessary
+ */
-errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size)
-{
- return ext2fs_file_set_size2(file, size);
+ return 0;
}