Hi Daniel,

On 2024/5/17 18:22, Daniel Kiper wrote:
On Fri, May 17, 2024 at 12:40:53PM +0800, Gao Xiang wrote:
From: Yifan Zhao <zhaoyi...@sjtu.edu.cn>

EROFS [1] is a lightweight read-only filesystem designed for performance
which has already been shipped in most Linux distributions as well as widely
used in several scenarios, such as Android system partitions, container
images, and rootfs for embedded devices.

This patch brings EROFS uncompressed support. Now, it's possible to boot
directly through GRUB with an EROFS rootfs.

EROFS compressed files will be supported later since it has more work to
polish.

[1] https://erofs.docs.kernel.org

Signed-off-by: Yifan Zhao <zhaoyi...@sjtu.edu.cn>
Tested-by: Daniel Axtens <d...@axtens.net> # fuzz testing only
Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---

[...]

+static grub_err_t
+erofs_map_blocks_chunkmode (grub_fshelp_node_t node,
+                           struct grub_erofs_map_blocks *map)
+{
+  grub_uint16_t chunk_format = grub_le_to_cpu16 (node->inode.e.i_u.c.format);
+  grub_uint64_t unit, pos, chunknr, blkaddr;
+  grub_uint8_t chunkbits;
+  grub_err_t err;
+
+  if (chunk_format & EROFS_CHUNK_FORMAT_INDEXES)
+    unit = sizeof (struct grub_erofs_inode_chunk_index);
+  else
+    unit = EROFS_BLOCK_MAP_ENTRY_SIZE;
+
+  chunkbits = node->data->sb.log2_blksz + (chunk_format & 
EROFS_CHUNK_FORMAT_BLKBITS_MASK);
+  if (chunkbits > 63)
+    return grub_error (GRUB_ERR_BAD_FS, "invalid chunkbits %u @ inode %" 
PRIuGRUB_UINT64_T,
+                      chunkbits, node->ino);
+
+  chunknr = map->m_la >> chunkbits;
+
+  if (grub_add (erofs_iloc (node), erofs_inode_size (node), &pos))
+    return grub_error (GRUB_ERR_OUT_OF_RANGE, "chunkmap position overflow when 
adding inode size");
+
+  if (grub_add (pos, erofs_inode_xattr_ibody_size (node), &pos))
+    return grub_error (GRUB_ERR_OUT_OF_RANGE, "chunkmap position overflow when 
adding xattr size");
+
+  /* pos = ALIGN_UP(pos, unit) */
+  if (grub_add (pos, unit - 1, &pos))
+    return grub_error (GRUB_ERR_OUT_OF_RANGE, "position overflow when seeking at 
the start of chunkmap");
+  pos &= ~(unit - 1);

Please create a macro as I asked you earlier. Be careful with underflows too.

Since I'm not sure how does it looks like, I wrote the
following helper, hopefully it looks good to you:

#define ALIGN_UP_OVF(v, align, res)     \
({                                      \
  bool __failed;                        \
  typeof(v) a;                          \
                                        \
  __failed = grub_sub (align, 1, &a);       \
  if (__failed == false)                \
    {                                   \
    __failed = grub_add (v, a, res);    \
    if (__failed == false)              \
      {                                 \
        *(res) &= ~(a);                     \
      }                                 \
    }                                   \
__failed;})


Otherwise patch set LGTM...

Thanks! Let me send the next version soon.

Thanks,
Gao Xiang


Daniel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to