[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Ext2 bugfixes
From: |
Jeroen Dekkers |
Subject: |
Ext2 bugfixes |
Date: |
Sat, 8 Nov 2003 17:38:55 +0100 |
User-agent: |
Mutt/1.5.4i |
Here are some bugfixes for ext2, the previous patch is included. The
patch and changelog should say enough.
Jeroen Dekkers
2003-11-08 Jeroen Dekkers <address@hidden>
* fs/ext2.c (pupa_ext2_read_file): Only set skipfirst for the
first block. Return -1 instead of pupa_errno on error.
(pupa_ext2_open): Check if data isn't null before calling pupa_free.
(pupa_ext2_dir): Likewise.
2003-10-30 Jeroen Dekkers <address@hidden>
* fs/ext2.c (struct pupa_ext2_inode): Declare struct datablocks
as blocks.
(pupa_ext2_get_file_block): Use blocks member.
Index: fs/ext2.c
===================================================================
RCS file: /cvsroot/pupa/pupa/fs/ext2.c,v
retrieving revision 1.1
diff -u -p -r1.1 ext2.c
--- fs/ext2.c 29 Oct 2003 18:44:27 -0000 1.1
+++ fs/ext2.c 8 Nov 2003 16:07:28 -0000
@@ -125,7 +125,7 @@ struct pupa_ext2_inode
pupa_uint32_t indir_block;
pupa_uint32_t double_indir_block;
pupa_uint32_t tripple_indir_block;
- };
+ } blocks;
char symlink[60];
};
pupa_uint32_t version;
@@ -181,13 +181,14 @@ pupa_ext2_get_file_block (struct pupa_ex
/* Direct blocks. */
if (fileblock < INDIRECT_BLOCKS)
- blknr = pupa_le_to_cpu32 (inode->dir_blocks[fileblock]);
+ blknr = pupa_le_to_cpu32 (inode->blocks.dir_blocks[fileblock]);
/* Indirect. */
else if (fileblock < INDIRECT_BLOCKS + EXT2_BLOCK_SIZE (data) / 4)
{
pupa_uint32_t indir[EXT2_BLOCK_SIZE (data) / 4];
- if (pupa_disk_read (data->disk, pupa_le_to_cpu32 (inode->indir_block)
+ if (pupa_disk_read (data->disk,
+ pupa_le_to_cpu32 (inode->blocks.indir_block)
<< LOG2_EXT2_BLOCK_SIZE (data),
0, EXT2_BLOCK_SIZE (data), (char *) indir))
return pupa_errno;
@@ -204,7 +205,7 @@ pupa_ext2_get_file_block (struct pupa_ex
pupa_uint32_t indir[EXT2_BLOCK_SIZE (data) / 4];
if (pupa_disk_read (data->disk,
- pupa_le_to_cpu32 (inode->double_indir_block)
+ pupa_le_to_cpu32 (inode->blocks.double_indir_block)
<< LOG2_EXT2_BLOCK_SIZE (data),
0, EXT2_BLOCK_SIZE (data), (char *) indir))
return pupa_errno;
@@ -233,7 +234,7 @@ pupa_ext2_get_file_block (struct pupa_ex
/* Read LEN bytes from the file described by DATA starting with byte
POS. Return the amount of read bytes in READ. */
-static pupa_err_t
+static pupa_ssize_t
pupa_ext2_read_file (struct pupa_ext2_data *data, int pos,
unsigned int len, char *buf)
{
@@ -251,24 +252,26 @@ pupa_ext2_read_file (struct pupa_ext2_da
{
int blknr;
int blockoff = pos % EXT2_BLOCK_SIZE (data);
- int blockend = (len + pos) % EXT2_BLOCK_SIZE (data);
+ int blockend = EXT2_BLOCK_SIZE (data);
int skipfirst = 0;
pupa_ext2_get_file_block (data, i, &blknr);
if (pupa_errno)
- return pupa_errno;
+ return -1;
blknr = blknr << LOG2_EXT2_BLOCK_SIZE (data);
+ /* Last block. */
+ if (i == blockcnt - 1)
+ blockend = (len + pos) % EXT2_BLOCK_SIZE (data);
+
/* First block. */
if (i == pos / EXT2_BLOCK_SIZE (data))
- skipfirst = blockoff;
-
- if (!blockend)
- blockend = EXT2_BLOCK_SIZE (data);
-
- blockend -= skipfirst;
+ {
+ skipfirst = blockoff;
+ blockend -= skipfirst;
+ }
/* If the block number is 0 this block is not stored on disk but
is zero filled instead. */
@@ -277,7 +280,7 @@ pupa_ext2_read_file (struct pupa_ext2_da
pupa_disk_read (data->disk, blknr, skipfirst,
blockend, buf);
if (pupa_errno)
- return pupa_errno;
+ return -1;
}
else
pupa_memset (buf, EXT2_BLOCK_SIZE (data) - skipfirst, 0);
@@ -550,7 +553,7 @@ pupa_ext2_find_file (struct pupa_ext2_da
static pupa_err_t
pupa_ext2_open (struct pupa_file *file, const char *name)
{
- struct pupa_ext2_data *data;
+ struct pupa_ext2_data *data = 0;
int ino;
#ifndef PUPA_UTIL
@@ -582,8 +585,8 @@ pupa_ext2_open (struct pupa_file *file,
return 0;
fail:
-
- pupa_free (data);
+ if (data)
+ pupa_free (data);
#ifndef PUPA_UTIL
pupa_dl_unref (my_mod);
@@ -675,7 +678,8 @@ pupa_ext2_dir (pupa_device_t device, con
fail:
- pupa_free (data);
+ if (data)
+ pupa_free (data);
#ifndef PUPA_UTIL
pupa_dl_unref (my_mod);