[OE-core] Add support for erofs filesystems

Submitted by Richard Weinberger on May 25, 2021, 11:04 a.m. | Patch ID: 179797

Details

Message ID 20210525110429.738-1-richard@nod.at
State New
Headers show

Commit Message

Richard Weinberger May 25, 2021, 11:04 a.m.
Since Linux 5.4 a new read-only filesystem is available, erofs.
Compared to squashfs it offers much better read performance with and
without compression enabled.
It suppports two optional compressors, lz4 and lz4hc.

From the mkfs.erofs man page:
EROFS is a new enhanced lightweight linux read-only filesystem with
modern designs (eg. no buffer head, reduced metadata, inline
xattrs/data, etc.) for scenarios which need high-performance read-only
requirements, e.g. Android OS for smartphones and LIVECDs.
It also provides fixed-sized output compression support, which improves
storage density, keeps relatively higher compression ratios, which is
more useful to achieve high performance for embedded devices with
limited  memory since it has unnoticable memory overhead and page cache
thrashing.

This commit adds support for three new filesystem targets:
erofs: erofs without compression
erofs-lz4: erofs with lz4 compresssion enabled
erofs-lz4hc: erofs with lz4hc compression enabled

Signed-off-by: Richard Weinberger <richard@nod.at>
---
 meta/classes/image_types.bbclass               |  9 +++++++++
 .../erofs-utils/erofs-utils_git.bb             | 18 ++++++++++++++++++
 scripts/lib/wic/help.py                        |  1 +
 scripts/lib/wic/ksparser.py                    |  7 ++++++-
 scripts/lib/wic/partition.py                   | 16 +++++++++++++---
 scripts/lib/wic/plugins/source/rawcopy.py      |  6 +++---
 6 files changed, 50 insertions(+), 7 deletions(-)
 create mode 100644 meta/recipes-devtools/erofs-utils/erofs-utils_git.bb

Patch hide | download patch | download mbox

diff --git a/meta/classes/image_types.bbclass b/meta/classes/image_types.bbclass
index 8028691405a7..4e95e0e2935e 100644
--- a/meta/classes/image_types.bbclass
+++ b/meta/classes/image_types.bbclass
@@ -108,6 +108,11 @@  IMAGE_CMD_squashfs-xz = "mksquashfs ${IMAGE_ROOTFS} ${IMGDEPLOYDIR}/${IMAGE_NAME
 IMAGE_CMD_squashfs-lzo = "mksquashfs ${IMAGE_ROOTFS} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs-lzo ${EXTRA_IMAGECMD} -noappend -comp lzo"
 IMAGE_CMD_squashfs-lz4 = "mksquashfs ${IMAGE_ROOTFS} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs-lz4 ${EXTRA_IMAGECMD} -noappend -comp lz4"
 
+IMAGE_CMD_erofs = "mkfs.erofs ${EXTRA_IMAGECMD} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.erofs ${IMAGE_ROOTFS}"
+IMAGE_CMD_erofs-lz4 = "mkfs.erofs -zlz4 ${EXTRA_IMAGECMD} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.erofs-lz4 ${IMAGE_ROOTFS}"
+IMAGE_CMD_erofs-lz4hc = "mkfs.erofs -zlz4hc ${EXTRA_IMAGECMD} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.erofs-lz4hc ${IMAGE_ROOTFS}"
+
+
 IMAGE_CMD_TAR ?= "tar"
 # ignore return code 1 "file changed as we read it" as other tasks(e.g. do_image_wic) may be hardlinking rootfs
 IMAGE_CMD_tar = "${IMAGE_CMD_TAR} --sort=name --format=posix --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar -C ${IMAGE_ROOTFS} . || [ $? -eq 1 ]"
@@ -243,6 +248,9 @@  do_image_ubi[depends] += "mtd-utils-native:do_populate_sysroot"
 do_image_ubifs[depends] += "mtd-utils-native:do_populate_sysroot"
 do_image_multiubi[depends] += "mtd-utils-native:do_populate_sysroot"
 do_image_f2fs[depends] += "f2fs-tools-native:do_populate_sysroot"
+do_image_erofs[depends] += "erofs-utils-native:do_populate_sysroot"
+do_image_erofs_lz4[depends] += "erofs-utils-native:do_populate_sysroot"
+do_image_erofs_lz4hc[depends] += "erofs-utils-native:do_populate_sysroot"
 
 # This variable is available to request which values are suitable for IMAGE_FSTYPES
 IMAGE_TYPES = " \
@@ -261,6 +269,7 @@  IMAGE_TYPES = " \
     wic wic.gz wic.bz2 wic.lzma wic.zst \
     container \
     f2fs \
+    erofs \
 "
 
 # Compression is a special case of conversion. The old variable
diff --git a/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb b/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb
new file mode 100644
index 000000000000..6d35d3f2fa6d
--- /dev/null
+++ b/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb
@@ -0,0 +1,18 @@ 
+SUMMARY = "Tools for erofs filesystems"
+LICENSE = "GPLv2"
+SECTION = "base"
+LIC_FILES_CHKSUM = "file://COPYING;md5=94fa01670a2a8f2d3ab2de15004e0848"
+
+PV = "1.2.1"
+SRCREV = "d1f4953edfcf4f51c71ba91586e21fc6ce9f6db9"
+SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git"
+
+S = "${WORKDIR}/git"
+
+DEPENDS = "util-linux-libuuid lz4"
+
+inherit pkgconfig autotools
+
+EXTRA_OECONF = "--enable-lz4 --disable-fuse"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/scripts/lib/wic/help.py b/scripts/lib/wic/help.py
index bd3a2b97dfaf..991e5094bb84 100644
--- a/scripts/lib/wic/help.py
+++ b/scripts/lib/wic/help.py
@@ -930,6 +930,7 @@  DESCRIPTION
              ext4
              btrfs
              squashfs
+             erofs
              swap
 
          --fsoptions: Specifies a free-form string of options to be
diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
index 3eb669da39ca..7a4cc83af556 100644
--- a/scripts/lib/wic/ksparser.py
+++ b/scripts/lib/wic/ksparser.py
@@ -157,7 +157,8 @@  class KickStart():
         part.add_argument('--fsoptions', dest='fsopts')
         part.add_argument('--fstype', default='vfat',
                           choices=('ext2', 'ext3', 'ext4', 'btrfs',
-                                   'squashfs', 'vfat', 'msdos', 'swap'))
+                                   'squashfs', 'vfat', 'msdos', 'erofs',
+                                   'swap'))
         part.add_argument('--mkfs-extraopts', default='')
         part.add_argument('--label')
         part.add_argument('--use-label', action='store_true')
@@ -229,6 +230,10 @@  class KickStart():
                                 err = "%s:%d: SquashFS does not support LABEL" \
                                        % (confpath, lineno)
                                 raise KickStartError(err)
+                        # erofs does not support filesystem labels
+                        if parsed.fstype == 'erofs' and parsed.label:
+                            err = "%s:%d: erofs does not support LABEL" % (confpath, lineno)
+                            raise KickStartError(err)
                         if parsed.fstype == 'msdos' or parsed.fstype == 'vfat':
                             if parsed.fsuuid:
                                 if parsed.fsuuid.upper().startswith('0X'):
diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py
index 76d144d12d30..e0b2c5bdf29b 100644
--- a/scripts/lib/wic/partition.py
+++ b/scripts/lib/wic/partition.py
@@ -141,9 +141,9 @@  class Partition():
                                             native_sysroot)
                 self.source_file = "%s/fs.%s" % (cr_workdir, self.fstype)
             else:
-                if self.fstype == 'squashfs':
-                    raise WicError("It's not possible to create empty squashfs "
-                                   "partition '%s'" % (self.mountpoint))
+                if self.fstype in ('squashfs', 'erofs'):
+                    raise WicError("It's not possible to create empty %s "
+                                   "partition '%s'" % (self.fstype, self.mountpoint))
 
                 rootfs = "%s/fs_%s.%s.%s" % (cr_workdir, self.label,
                                              self.lineno, self.fstype)
@@ -369,6 +369,16 @@  class Partition():
                        (rootfs_dir, rootfs, extraopts)
         exec_native_cmd(squashfs_cmd, native_sysroot, pseudo=pseudo)
 
+    def prepare_rootfs_erofs(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
+                             native_sysroot, pseudo):
+        """
+        Prepare content for a erofs rootfs partition.
+        """
+        extraopts = self.mkfs_extraopts or ''
+        erofs_cmd = "mkfs.erofs %s -U %s %s %s" % \
+                       (extraopts, self.fsuuid, rootfs, rootfs_dir)
+        exec_native_cmd(erofs_cmd, native_sysroot, pseudo=pseudo)
+
     def prepare_empty_partition_ext(self, rootfs, oe_builddir,
                                     native_sysroot):
         """
diff --git a/scripts/lib/wic/plugins/source/rawcopy.py b/scripts/lib/wic/plugins/source/rawcopy.py
index 3c4997d8ba5e..fa7b1eb8ac75 100644
--- a/scripts/lib/wic/plugins/source/rawcopy.py
+++ b/scripts/lib/wic/plugins/source/rawcopy.py
@@ -29,9 +29,9 @@  class RawCopyPlugin(SourcePlugin):
             cmd = 'btrfs filesystem label %s %s' % (dst, label)
         elif fstype == 'swap':
             cmd = 'mkswap -L %s %s' % (label, dst)
-        elif fstype == 'squashfs':
-            raise WicError("It's not possible to update a squashfs "
-                           "filesystem label '%s'" % (label))
+        elif fstype in ('squashfs', 'erofs'):
+            raise WicError("It's not possible to update a %s "
+                           "filesystem label '%s'" % (fstype, label))
         else:
             raise WicError("Cannot update filesystem label: "
                            "Unknown fstype: '%s'" % (fstype))

Comments

Richard Weinberger May 25, 2021, 11:24 a.m.
Konrad,

----- Urspr√ľngliche Mail -----
> Von: "Konrad Weihmann" <kweihmann@outlook.com>
>> +EXTRA_OECONF = "--enable-lz4 --disable-fuse"
> 
> In the commit message it's mentioned that compression is optional, still
> here lz4 is enabled by default - I would rather see these compression
> switches configurable via PACKAGECONFIG

Good point! Will send a v2 in a jiffy.

Thanks,
//richard
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#1306): https://lists.yoctoproject.org/g/docs/message/1306
Mute This Topic: https://lists.yoctoproject.org/mt/83073490/3617530
Group Owner: docs+owner@lists.yoctoproject.org
Unsubscribe: https://lists.yoctoproject.org/g/docs/unsub [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-
Quentin Schulz May 25, 2021, 9:15 p.m.
Hi Richard,

On May 25, 2021 11:04:27 AM UTC, Richard Weinberger <richard@nod.at> wrote:
>Since Linux 5.4 a new read-only filesystem is available, erofs.
>Compared to squashfs it offers much better read performance with and
>without compression enabled.
>It suppports two optional compressors, lz4 and lz4hc.
>
>From the mkfs.erofs man page:
>EROFS is a new enhanced lightweight linux read-only filesystem with
>modern designs (eg. no buffer head, reduced metadata, inline
>xattrs/data, etc.) for scenarios which need high-performance read-only
>requirements, e.g. Android OS for smartphones and LIVECDs.
>It also provides fixed-sized output compression support, which improves
>storage density, keeps relatively higher compression ratios, which is
>more useful to achieve high performance for embedded devices with
>limited  memory since it has unnoticable memory overhead and page cache
>thrashing.
>
>This commit adds support for three new filesystem targets:
>erofs: erofs without compression
>erofs-lz4: erofs with lz4 compresssion enabled
>erofs-lz4hc: erofs with lz4hc compression enabled
>
>Signed-off-by: Richard Weinberger <richard@nod.at>
>---
> meta/classes/image_types.bbclass               |  9 +++++++++
> .../erofs-utils/erofs-utils_git.bb             | 18 ++++++++++++++++++
> scripts/lib/wic/help.py                        |  1 +
> scripts/lib/wic/ksparser.py                    |  7 ++++++-
> scripts/lib/wic/partition.py                   | 16 +++++++++++++---
> scripts/lib/wic/plugins/source/rawcopy.py      |  6 +++---
> 6 files changed, 50 insertions(+), 7 deletions(-)
> create mode 100644 meta/recipes-devtools/erofs-utils/erofs-utils_git.bb
>
>diff --git a/meta/classes/image_types.bbclass b/meta/classes/image_types.bbclass
>index 8028691405a7..4e95e0e2935e 100644
>--- a/meta/classes/image_types.bbclass
>+++ b/meta/classes/image_types.bbclass
>@@ -108,6 +108,11 @@ IMAGE_CMD_squashfs-xz = "mksquashfs ${IMAGE_ROOTFS} ${IMGDEPLOYDIR}/${IMAGE_NAME
> IMAGE_CMD_squashfs-lzo = "mksquashfs ${IMAGE_ROOTFS} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs-lzo ${EXTRA_IMAGECMD} -noappend -comp lzo"
> IMAGE_CMD_squashfs-lz4 = "mksquashfs ${IMAGE_ROOTFS} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.squashfs-lz4 ${EXTRA_IMAGECMD} -noappend -comp lz4"
> 
>+IMAGE_CMD_erofs = "mkfs.erofs ${EXTRA_IMAGECMD} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.erofs ${IMAGE_ROOTFS}"
>+IMAGE_CMD_erofs-lz4 = "mkfs.erofs -zlz4 ${EXTRA_IMAGECMD} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.erofs-lz4 ${IMAGE_ROOTFS}"
>+IMAGE_CMD_erofs-lz4hc = "mkfs.erofs -zlz4hc ${EXTRA_IMAGECMD} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.erofs-lz4hc ${IMAGE_ROOTFS}"
>+
>+
> IMAGE_CMD_TAR ?= "tar"
> # ignore return code 1 "file changed as we read it" as other tasks(e.g. do_image_wic) may be hardlinking rootfs
> IMAGE_CMD_tar = "${IMAGE_CMD_TAR} --sort=name --format=posix --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar -C ${IMAGE_ROOTFS} . || [ $? -eq 1 ]"
>@@ -243,6 +248,9 @@ do_image_ubi[depends] += "mtd-utils-native:do_populate_sysroot"
> do_image_ubifs[depends] += "mtd-utils-native:do_populate_sysroot"
> do_image_multiubi[depends] += "mtd-utils-native:do_populate_sysroot"
> do_image_f2fs[depends] += "f2fs-tools-native:do_populate_sysroot"
>+do_image_erofs[depends] += "erofs-utils-native:do_populate_sysroot"
>+do_image_erofs_lz4[depends] += "erofs-utils-native:do_populate_sysroot"
>+do_image_erofs_lz4hc[depends] += "erofs-utils-native:do_populate_sysroot"
> 
> # This variable is available to request which values are suitable for IMAGE_FSTYPES
> IMAGE_TYPES = " \
>@@ -261,6 +269,7 @@ IMAGE_TYPES = " \
>     wic wic.gz wic.bz2 wic.lzma wic.zst \
>     container \
>     f2fs \
>+    erofs \

I think you're supposed to have erofs erofs-lz4 erofs-lz4hc here.

> "
> 
> # Compression is a special case of conversion. The old variable
>diff --git a/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb b/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb
>new file mode 100644
>index 000000000000..6d35d3f2fa6d
>--- /dev/null
>+++ b/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb

Any reason for using _git over _1.2.1?

>@@ -0,0 +1,18 @@
>+SUMMARY = "Tools for erofs filesystems"
>+LICENSE = "GPLv2"

GPL-2.0-or-later actually.

Thanks for the patch,
Cheers,
Quentin

>+SECTION = "base"
>+LIC_FILES_CHKSUM = "file://COPYING;md5=94fa01670a2a8f2d3ab2de15004e0848"
>+
>+PV = "1.2.1"
>+SRCREV = "d1f4953edfcf4f51c71ba91586e21fc6ce9f6db9"
>+SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git"
>+
>+S = "${WORKDIR}/git"
>+
>+DEPENDS = "util-linux-libuuid lz4"
>+
>+inherit pkgconfig autotools
>+
>+EXTRA_OECONF = "--enable-lz4 --disable-fuse"
>+
>+BBCLASSEXTEND = "native nativesdk"
>diff --git a/scripts/lib/wic/help.py b/scripts/lib/wic/help.py
>index bd3a2b97dfaf..991e5094bb84 100644
>--- a/scripts/lib/wic/help.py
>+++ b/scripts/lib/wic/help.py
>@@ -930,6 +930,7 @@ DESCRIPTION
>              ext4
>              btrfs
>              squashfs
>+             erofs
>              swap
> 
>          --fsoptions: Specifies a free-form string of options to be
>diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
>index 3eb669da39ca..7a4cc83af556 100644
>--- a/scripts/lib/wic/ksparser.py
>+++ b/scripts/lib/wic/ksparser.py
>@@ -157,7 +157,8 @@ class KickStart():
>         part.add_argument('--fsoptions', dest='fsopts')
>         part.add_argument('--fstype', default='vfat',
>                           choices=('ext2', 'ext3', 'ext4', 'btrfs',
>-                                   'squashfs', 'vfat', 'msdos', 'swap'))
>+                                   'squashfs', 'vfat', 'msdos', 'erofs',
>+                                   'swap'))
>         part.add_argument('--mkfs-extraopts', default='')
>         part.add_argument('--label')
>         part.add_argument('--use-label', action='store_true')
>@@ -229,6 +230,10 @@ class KickStart():
>                                 err = "%s:%d: SquashFS does not support LABEL" \
>                                        % (confpath, lineno)
>                                 raise KickStartError(err)
>+                        # erofs does not support filesystem labels
>+                        if parsed.fstype == 'erofs' and parsed.label:
>+                            err = "%s:%d: erofs does not support LABEL" % (confpath, lineno)
>+                            raise KickStartError(err)
>                         if parsed.fstype == 'msdos' or parsed.fstype == 'vfat':
>                             if parsed.fsuuid:
>                                 if parsed.fsuuid.upper().startswith('0X'):
>diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py
>index 76d144d12d30..e0b2c5bdf29b 100644
>--- a/scripts/lib/wic/partition.py
>+++ b/scripts/lib/wic/partition.py
>@@ -141,9 +141,9 @@ class Partition():
>                                             native_sysroot)
>                 self.source_file = "%s/fs.%s" % (cr_workdir, self.fstype)
>             else:
>-                if self.fstype == 'squashfs':
>-                    raise WicError("It's not possible to create empty squashfs "
>-                                   "partition '%s'" % (self.mountpoint))
>+                if self.fstype in ('squashfs', 'erofs'):
>+                    raise WicError("It's not possible to create empty %s "
>+                                   "partition '%s'" % (self.fstype, self.mountpoint))
> 
>                 rootfs = "%s/fs_%s.%s.%s" % (cr_workdir, self.label,
>                                              self.lineno, self.fstype)
>@@ -369,6 +369,16 @@ class Partition():
>                        (rootfs_dir, rootfs, extraopts)
>         exec_native_cmd(squashfs_cmd, native_sysroot, pseudo=pseudo)
> 
>+    def prepare_rootfs_erofs(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
>+                             native_sysroot, pseudo):
>+        """
>+        Prepare content for a erofs rootfs partition.
>+        """
>+        extraopts = self.mkfs_extraopts or ''
>+        erofs_cmd = "mkfs.erofs %s -U %s %s %s" % \
>+                       (extraopts, self.fsuuid, rootfs, rootfs_dir)
>+        exec_native_cmd(erofs_cmd, native_sysroot, pseudo=pseudo)
>+
>     def prepare_empty_partition_ext(self, rootfs, oe_builddir,
>                                     native_sysroot):
>         """
>diff --git a/scripts/lib/wic/plugins/source/rawcopy.py b/scripts/lib/wic/plugins/source/rawcopy.py
>index 3c4997d8ba5e..fa7b1eb8ac75 100644
>--- a/scripts/lib/wic/plugins/source/rawcopy.py
>+++ b/scripts/lib/wic/plugins/source/rawcopy.py
>@@ -29,9 +29,9 @@ class RawCopyPlugin(SourcePlugin):
>             cmd = 'btrfs filesystem label %s %s' % (dst, label)
>         elif fstype == 'swap':
>             cmd = 'mkswap -L %s %s' % (label, dst)
>-        elif fstype == 'squashfs':
>-            raise WicError("It's not possible to update a squashfs "
>-                           "filesystem label '%s'" % (label))
>+        elif fstype in ('squashfs', 'erofs'):
>+            raise WicError("It's not possible to update a %s "
>+                           "filesystem label '%s'" % (fstype, label))
>         else:
>             raise WicError("Cannot update filesystem label: "
>                            "Unknown fstype: '%s'" % (fstype))
>-- 
>2.26.2
>
Richard Weinberger May 25, 2021, 9:22 p.m.
Quentin,

----- Urspr√ľngliche Mail -----
> Von: "Quentin Schulz" <foss@0leil.net>
>> IMAGE_TYPES = " \
>>@@ -261,6 +269,7 @@ IMAGE_TYPES = " \
>>     wic wic.gz wic.bz2 wic.lzma wic.zst \
>>     container \
>>     f2fs \
>>+    erofs \
> 
> I think you're supposed to have erofs erofs-lz4 erofs-lz4hc here.

Oh yes. You're right.
 
>> "
>> 
>> # Compression is a special case of conversion. The old variable
>>diff --git a/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb
>>b/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb
>>new file mode 100644
>>index 000000000000..6d35d3f2fa6d
>>--- /dev/null
>>+++ b/meta/recipes-devtools/erofs-utils/erofs-utils_git.bb
> 
> Any reason for using _git over _1.2.1?

TBH, I used meta/recipes-devtools/squashfs-tools/squashfs-tools_git.bb as template. :-)
It fetches also via git and sets PV.

>>@@ -0,0 +1,18 @@
>>+SUMMARY = "Tools for erofs filesystems"
>>+LICENSE = "GPLv2"
> 
> GPL-2.0-or-later actually.

Will fix!

Thanks,
//richard
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#1309): https://lists.yoctoproject.org/g/docs/message/1309
Mute This Topic: https://lists.yoctoproject.org/mt/83073126/3617530
Group Owner: docs+owner@lists.yoctoproject.org
Unsubscribe: https://lists.yoctoproject.org/g/docs/unsub [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-