ext2: Simplify partial sector access logic
authorAnton Staaf <robotboy@chromium.org>
Mon, 13 Jun 2011 11:40:40 +0000 (11:40 +0000)
committerWolfgang Denk <wd@denx.de>
Thu, 28 Jul 2011 13:36:32 +0000 (15:36 +0200)
Previously reading or writing zero full sectors (reading the end of
one sector and the beginning of the next for example) was special
cased and involved stack allocating a second sector buffer.  This
change uses the same code path for this case as well as when there
are a non-zero number of full sectors to access.  The result is
easier to read and reduces the maximum stack used.

Signed-off-by: Anton Staaf <robotboy@chromium.org>
Cc: Andy Fleming <afleming@freescale.com>
Acked-by: Detlev Zundel <dzu@denx.de>
fs/ext2/dev.c

index 4365b3b882a12cfc0c16ddf7341b7b378f8888a6..78851d0a5d098cd8d25e2e101bfa713cfe1429d0 100644 (file)
@@ -53,7 +53,7 @@ int ext2fs_set_blk_dev(block_dev_desc_t *rbdd, int part)
 int ext2fs_devread(int sector, int byte_offset, int byte_len, char *buf)
 {
        char sec_buf[SECTOR_SIZE];
-       unsigned block_len;
+       unsigned sectors;
 
        /*
         *  Check partition boundaries
@@ -98,35 +98,23 @@ int ext2fs_devread(int sector, int byte_offset, int byte_len, char *buf)
                sector++;
        }
 
-       if (byte_len == 0)
-               return 1;
-
        /*  read sector aligned part */
-       block_len = byte_len & ~(SECTOR_SIZE - 1);
-
-       if (block_len == 0) {
-               u8 p[SECTOR_SIZE];
-
-               block_len = SECTOR_SIZE;
-               ext2fs_block_dev_desc->block_read(ext2fs_block_dev_desc->dev,
-                                                 part_info.start + sector,
-                                                 1, (unsigned long *)p);
-               memcpy(buf, p, byte_len);
-               return 1;
-       }
+       sectors = byte_len / SECTOR_SIZE;
+
+       if (sectors > 0) {
+               if (ext2fs_block_dev_desc->block_read(
+                       ext2fs_block_dev_desc->dev,
+                       part_info.start + sector,
+                       sectors,
+                       (unsigned long *) buf) != sectors) {
+                       printf(" ** %s read error - block\n", __func__);
+                       return 0;
+               }
 
-       if (ext2fs_block_dev_desc->block_read(ext2fs_block_dev_desc->dev,
-                                             part_info.start + sector,
-                                             block_len / SECTOR_SIZE,
-                                             (unsigned long *) buf) !=
-           block_len / SECTOR_SIZE) {
-               printf(" ** %s read error - block\n", __func__);
-               return 0;
+               buf += sectors * SECTOR_SIZE;
+               byte_len -= sectors * SECTOR_SIZE;
+               sector += sectors;
        }
-       block_len = byte_len & ~(SECTOR_SIZE - 1);
-       buf += block_len;
-       byte_len -= block_len;
-       sector += block_len / SECTOR_SIZE;
 
        if (byte_len != 0) {
                /* read rest of data which are not in whole sector */