]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2008-06-12 Pavel Roskin <proski@gnu.org>
authorproski <proski@localhost>
Thu, 12 Jun 2008 14:48:27 +0000 (14:48 +0000)
committerproski <proski@localhost>
Thu, 12 Jun 2008 14:48:27 +0000 (14:48 +0000)
* fs/fshelp.c (grub_fshelp_read): New function.  Implement
linear disk read with journal translation.
* fs/ext2.c: Use grub_fshelp_read() instead of grub_disk_read().
* include/grub/fshelp.h: Declare grub_fshelp_read().

ChangeLog
fs/ext2.c
fs/fshelp.c
include/grub/fshelp.h

index 14c205e02167001894e3301a3176e0eed2e5b2fb..f830b732a9990bcdbb031605578dfed002d41770 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-06-12  Pavel Roskin  <proski@gnu.org>
+
+       * fs/fshelp.c (grub_fshelp_read): New function.  Implement
+       linear disk read with journal translation.
+       * fs/ext2.c: Use grub_fshelp_read() instead of grub_disk_read().
+       * include/grub/fshelp.h: Declare grub_fshelp_read().
+
 2008-06-09  Pavel Roskin  <proski@gnu.org>
 
        * fs/minix.c (grub_minix_mount): Handle error reading
index ffe9e3356d4b138a9a54da8c3761f59bb3d68251..999bd8080b1f6324de06b87e27c0bebd6dad877a 100644 (file)
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -257,12 +257,11 @@ inline static grub_err_t
 grub_ext2_blockgroup (struct grub_ext2_data *data, int group, 
                      struct grub_ext2_block_group *blkgrp)
 {
-  return grub_disk_read (data->disk,
-                        (grub_fshelp_map_block (data->journal,
-                                                 grub_le_to_cpu32 (data->sblock.first_data_block) + 1)
-                         << LOG2_EXT2_BLOCK_SIZE (data)),
-                        group * sizeof (struct grub_ext2_block_group), 
-                        sizeof (struct grub_ext2_block_group), (char *) blkgrp);
+  return grub_fshelp_read (data->disk, data->journal,
+                          grub_le_to_cpu32 (data->sblock.first_data_block) + 1,
+                          group * sizeof (struct grub_ext2_block_group),
+                          sizeof (struct grub_ext2_block_group),
+                          (char *) blkgrp, LOG2_EXT2_BLOCK_SIZE (data));
 }
 
 
@@ -283,11 +282,9 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
     {
       grub_uint32_t indir[blksz / 4];
 
-      if (grub_disk_read (data->disk, 
-                         grub_fshelp_map_block(data->journal,
-                                                grub_le_to_cpu32 (inode->blocks.indir_block))
-                         << log2_blksz,
-                         0, blksz, (char *) indir))
+      if (grub_fshelp_read (data->disk, data->journal,
+                           grub_le_to_cpu32 (inode->blocks.indir_block),
+                           0, blksz, (char *) indir, log2_blksz))
        return grub_errno;
          
       blknr = grub_le_to_cpu32 (indir[fileblock - INDIRECT_BLOCKS]);
@@ -300,18 +297,14 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
                                         + blksz / 4);
       grub_uint32_t indir[blksz / 4];
 
-      if (grub_disk_read (data->disk, 
-                         grub_fshelp_map_block(data->journal,
-                                                grub_le_to_cpu32 (inode->blocks.double_indir_block))
-                         << log2_blksz,
-                         0, blksz, (char *) indir))
+      if (grub_fshelp_read (data->disk, data->journal,
+                           grub_le_to_cpu32 (inode->blocks.double_indir_block),
+                           0, blksz, (char *) indir, log2_blksz))
        return grub_errno;
 
-      if (grub_disk_read (data->disk,
-                         grub_fshelp_map_block(data->journal,
-                                                grub_le_to_cpu32 (indir[rblock / perblock]))
-                         << log2_blksz,
-                         0, blksz, (char *) indir))
+      if (grub_fshelp_read (data->disk, data->journal,
+                           grub_le_to_cpu32 (indir[rblock / perblock]),
+                           0, blksz, (char *) indir, log2_blksz))
        return grub_errno;
 
       
@@ -372,12 +365,11 @@ grub_ext2_read_inode (struct grub_ext2_data *data,
     % inodes_per_block;
   
   /* Read the inode.  */
-  if (grub_disk_read (data->disk, 
-                     grub_fshelp_map_block(data->journal,
-                                            grub_le_to_cpu32 (blkgrp.inode_table_id) + blkno)
-                      << LOG2_EXT2_BLOCK_SIZE (data),
-                     EXT2_INODE_SIZE (data) * blkoff,
-                     sizeof (struct grub_ext2_inode), (char *) inode))
+  if (grub_fshelp_read (data->disk, data->journal,
+                       grub_le_to_cpu32 (blkgrp.inode_table_id) + blkno,
+                       EXT2_INODE_SIZE (data) * blkoff,
+                       sizeof (struct grub_ext2_inode), (char *) inode,
+                       LOG2_EXT2_BLOCK_SIZE (data)))
     return grub_errno;
   
   return 0;
index faec1f7fdf5dfa2f991ecf0cb702fbdec59e44df..52131b019ddced427a397dfe015708ab7a636e0a 100644 (file)
@@ -215,6 +215,45 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
 }
 
 
+/* Read LEN bytes from the block BLOCK on disk DISK into the buffer BUF,
+   beginning with the block POS.  Apply mappings from LOG.  The blocks
+   have a size of LOG2BLOCKSIZE (in log2).  */
+grub_err_t grub_fshelp_read (grub_disk_t disk, grub_fshelp_journal_t log,
+                            grub_disk_addr_t block, grub_off_t pos,
+                            grub_size_t len, char *buf, int log2blocksize)
+{
+  grub_off_t relblk;
+
+  relblk = pos >> (log2blocksize + GRUB_DISK_SECTOR_BITS);
+  block += relblk;
+  pos -= relblk << (log2blocksize + GRUB_DISK_SECTOR_BITS);
+
+  while (len > 0)
+    {
+      grub_err_t ret;
+      grub_size_t size;
+
+      size = (GRUB_DISK_SECTOR_SIZE << log2blocksize) - pos;
+      if (size > len)
+       size = len;
+
+      ret = grub_disk_read (disk,
+                           grub_fshelp_map_block (log, block) << log2blocksize,
+                           pos, size, buf);
+
+      if (ret)
+       return ret;
+
+      block++;
+      pos = 0;
+      buf += size;
+      len -= size;
+    }
+
+  return 0;
+}
+
+
 /* Read LEN bytes from the file NODE on disk DISK into the buffer BUF,
    beginning with the block POS.  READ_HOOK should be set before
    reading a block from the file.  GET_BLOCK is used to translate file
index 0120cbf713ea1321ecb0ae7d786c830ef93aaa46..847f78e368fc5985206b8f7f6c22a691bef9c851 100644 (file)
@@ -84,6 +84,15 @@ EXPORT_FUNC(grub_fshelp_find_file) (const char *path,
                                    enum grub_fshelp_filetype expect);
 
 
+/* Read LEN bytes from the block BLOCK on disk DISK into the buffer BUF,
+   beginning with the block POS.  Apply mappings from LOG.  The blocks
+   have a size of LOG2BLOCKSIZE (in log2).  */
+grub_err_t
+EXPORT_FUNC(grub_fshelp_read) (grub_disk_t disk, grub_fshelp_journal_t log,
+                              grub_disk_addr_t block, grub_off_t pos,
+                              grub_size_t len, char *buf, int log2blocksize);
+
+
 /* Read LEN bytes from the file NODE on disk DISK into the buffer BUF,
    beginning with the block POS.  READ_HOOK should be set before
    reading a block from the file.  GET_BLOCK is used to translate file