pupa-devel
[Top][All Lists]
Advanced

[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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]