]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Support triple indirect on minix2 and minix3.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 24 Oct 2011 14:16:28 +0000 (16:16 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 24 Oct 2011 14:16:28 +0000 (16:16 +0200)
* grub-core/fs/minix.c (grub_minix_inode) [MODE_MINIX2 || MODE_MINIX3]:
Declare triple_indir_zone.
(grub_minix_get_file_block) [MODE_MINIX2 || MODE_MINIX3]: Handle triple
indirect.

ChangeLog
grub-core/fs/minix.c

index 9065162fe866d71623b9f88df9c75b63206c2f17..12117d6a016ad31099ae090603f59d5914ec5cf5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-10-24  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Support triple indirect on minix2 and minix3.
+
+       * grub-core/fs/minix.c (grub_minix_inode) [MODE_MINIX2 || MODE_MINIX3]:
+       Declare triple_indir_zone.
+       (grub_minix_get_file_block) [MODE_MINIX2 || MODE_MINIX3]: Handle triple
+       indirect.
+
 2011-10-24  Vladimir Serbinenko  <phcoder@gmail.com>
 
        Minix FS fixes.
index 1db2883cde0481803f9d35f02175d5940ffefecb..43785b6571eff9e80f3dca3aa39f4ee5d13dd43f 100644 (file)
@@ -132,7 +132,7 @@ struct grub_minix_inode
   grub_uint32_t dir_zones[7];
   grub_uint32_t indir_zone;
   grub_uint32_t double_indir_zone;
-  grub_uint32_t unused;
+  grub_uint32_t triple_indir_zone;
 };
 #else
 struct grub_minix_inode
@@ -213,6 +213,20 @@ grub_minix_get_file_block (struct grub_minix_data *data, unsigned int blk)
       return indir;
     }
 
+#if defined (MODE_MINIX3) || defined (MODE_MINIX2)
+  blk -= block_per_zone * block_per_zone;
+  if (blk < ((grub_uint64_t) block_per_zone * (grub_uint64_t) block_per_zone
+            * (grub_uint64_t) block_per_zone))
+    {
+      indir = grub_get_indir (grub_minix_le_to_cpu_n (data->inode.triple_indir_zone),
+                             (blk / block_per_zone) / block_per_zone);
+      indir = grub_get_indir (indir, (blk / block_per_zone) % block_per_zone);
+      indir = grub_get_indir (indir, blk % block_per_zone);
+
+      return indir;
+    }
+#endif
+
   /* This should never happen.  */
   grub_error (GRUB_ERR_OUT_OF_RANGE, "file bigger than maximum size");