Skip to contentSkip to conversation

fs/btrfs: Introducing btrfs rootfs support.

PATCH New Robert J. Heywood 3 participants 3 messages Aug 23, 2018 – Aug 25, 2018

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 2/2 fs/btrfs: Introducing btrfs rootfs support.

This patch makes it possible to format the rootfs using btrfs. It introduces the option; BR2_TARGET_ROOTFS_BTRFS

When selected, the user is able to specify the filesystem size, label, options, and node and sector sizes.
The new files are based on fs/ext2/{Config.in,ext2.mk}

---
 fs/Config.in       |  1 +
 fs/btrfs/Config.in | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 fs/btrfs/btrfs.mk  | 39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 91 insertions(+)
 create mode 100644 fs/btrfs/Config.in
 create mode 100644 fs/btrfs/btrfs.mk
fs/Config.in +1 -0
index c25b01c3de..24f22fd7e3 100644
@@ -1,6 +1,7 @@
 menu "Filesystem images"
 
 source "fs/axfs/Config.in"
+source "fs/btrfs/Config.in"
 source "fs/cloop/Config.in"
 source "fs/cpio/Config.in"
 source "fs/cramfs/Config.in"
fs/btrfs/Config.in new file +51 -0

51 lines not on this page · raw message

fs/btrfs/btrfs.mk new file +39 -0
new file mode 100644
index 0000000000..37b2937825
@@ -0,0 +1,39 @@
+################################################################################
+#
+# Build the btrfs root filesystem image
+#
+################################################################################
+
+BTRFS_SIZE = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE))
+ifeq ($(BR2_TARGET_ROOTFS_BTRFS)-$(BTRFS_SIZE),y-)
+$(error BR2_TARGET_ROOTFS_BTRFS_SIZE cannot be empty)
+endif
+
+BTRFS_SIZE_NODE = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE_NODE))
+BTRFS_SIZE_SECTOR = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE_SECTOR))
+BTRFS_FEATURES = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_FEATURES))
+# qstrip results in stripping consecutive spaces into a single one. So the
+# variable is not qstrip-ed to preserve the integrity of the string value.
+BTRFS_LABEL := $(subst ",,$(BR2_TARGET_ROOTFS_BTRFS_LABEL))
+# ")
+
+BTRFS_OPTS = \
+	-r '$(TARGET_DIR)' \
+	-L '$(BTRFS_LABEL)' \
+	$(if $(BTRFS_SIZE_NODE),--nodesize '$(BTRFS_SIZE_NODE)') \
+	$(if $(BTRFS_SIZE_SECTOR),--sectorsize '$(BTRFS_SIZE_SECTOR)') \
+	$(if $(BTRFS_FEATURES),--features '$(BTRFS_FEATURES)')
+
+ROOTFS_BTRFS_DEPENDENCIES = host-btrfs-progs
+
+define ROOTFS_BTRFS_CMD
+	rm -f $@
+	truncate -s $(BTRFS_SIZE) $@
+	$(HOST_DIR)/bin/mkfs.btrfs $(BTRFS_OPTS) $@ \
+	|| { ret=$$?; \
+	     echo "*** Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_BTRFS_SIZE)" 1>&2; \
+	     exit $$ret; \
+	}
+endef
+
+$(eval $(rootfs))
Signature · 1 line
2.11.0
#1 lore raw

PATCH 2/2 fs/btrfs: Introducing btrfs rootfs support.

Robert, All,

On 2018-08-23 23:01 +0100, Robert J. Heywood spake thusly:

Quoted 8 lines

This patch makes it possible to format the rootfs using btrfs. It introduces the option; BR2_TARGET_ROOTFS_BTRFS

When selected, the user is able to specify the filesystem size, label, options, and node and sector sizes.
The new files are based on fs/ext2/{Config.in,ext2.mk}

However, two very minor comments, which a maintainer can fix while applying, and that escape my tired eye the previous iterations, see below...

Quoted 6 lines
fs/btrfs/Config.in new file +0 -0
new file mode 100644
index 0000000000..52fbfd983a

fs/btrfs/Config.in line 8

Quoted 8 lines
fs/btrfs/Config.in new file +8 -0
@@ -0,0 +1,51 @@
+config BR2_TARGET_ROOTFS_BTRFS
+	bool "btrfs root filesystem"
+	select BR2_PACKAGE_HOST_BTRFS_PROGS
+	help
+	  Build a btrfs root filesystem. If you enable this option, you
+	  probably want to enable the btrfs-progs package too.
+
+

Only one empty seprarting line is enough.

Quoted 6 lines
fs/btrfs/Config.in new file +6 -0
+if BR2_TARGET_ROOTFS_BTRFS
+
+config BR2_TARGET_ROOTFS_BTRFS_LABEL
+	string "filesystem label"
+
+config BR2_TARGET_ROOTFS_BTRFS_SIZE

fs/btrfs/Config.in line 24

Quoted 10 lines
fs/btrfs/Config.in new file +10 -0
+	string "filesystem size"
+	default "100m"
+	help
+	  The size of the filesystem image in bytes.
+	  Suffix with k, m, g or t for power-of-two kilo-, mega-, giga-
+	  or terabytes.
+
+config BR2_TARGET_ROOTFS_BTRFS_SIZE_SECTOR
+	string "sector size"
+	default 4096

Defaults for string must be quoted.

It happens to work, because there is no symbol named `4096'.

fs/btrfs/Config.in line 36

Quoted 12 lines
fs/btrfs/Config.in new file +12 -0
+	help
+	  This value should be set to the page size in bytes. The default
+	  value of 4096 is the the most common page size for most systems.
+	  If the sectorsize differs from the page size, the created
+	  filesystem may not be mountable by the kernel.
+	  Therefore it is recommended to leave this value at 4096. Unless
+	  you know that your kernel uses a different page size.
+	  Suffix with k for power-of-two kilobytes.
+
+config BR2_TARGET_ROOTFS_BTRFS_SIZE_NODE
+	string "btree node size"
+	default 16384

Ditto.

Regards,
Yann E. MORIN.

Quoted 67 lines
fs/btrfs/Config.in new file +15 -0
+	help
+	  The tree block size in which btrfs stores metadata in bytes.
+	  This must be a multiple of the sectorsize, but not larger than
+	  64KiB (65536).
+	  Suffix with k for power-of-two kilobytes.
+
+config BR2_TARGET_ROOTFS_BTRFS_FEATURES
+	string "Filesystem Features"
+	help
+	  A comma separated string of features that can be enabled
+	  during creation time.
+	  For a list of available options, use:
+	    `.../host/bin/mkfs.btrfs -O list-all`
+
+endif # BR2_TARGET_ROOTFS_BTRFS
fs/btrfs/btrfs.mk new file +39 -0
new file mode 100644
index 0000000000..37b2937825
@@ -0,0 +1,39 @@
+################################################################################
+#
+# Build the btrfs root filesystem image
+#
+################################################################################
+
+BTRFS_SIZE = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE))
+ifeq ($(BR2_TARGET_ROOTFS_BTRFS)-$(BTRFS_SIZE),y-)
+$(error BR2_TARGET_ROOTFS_BTRFS_SIZE cannot be empty)
+endif
+
+BTRFS_SIZE_NODE = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE_NODE))
+BTRFS_SIZE_SECTOR = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE_SECTOR))
+BTRFS_FEATURES = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_FEATURES))
+# qstrip results in stripping consecutive spaces into a single one. So the
+# variable is not qstrip-ed to preserve the integrity of the string value.
+BTRFS_LABEL := $(subst ",,$(BR2_TARGET_ROOTFS_BTRFS_LABEL))
+# ")
+
+BTRFS_OPTS = \
+	-r '$(TARGET_DIR)' \
+	-L '$(BTRFS_LABEL)' \
+	$(if $(BTRFS_SIZE_NODE),--nodesize '$(BTRFS_SIZE_NODE)') \
+	$(if $(BTRFS_SIZE_SECTOR),--sectorsize '$(BTRFS_SIZE_SECTOR)') \
+	$(if $(BTRFS_FEATURES),--features '$(BTRFS_FEATURES)')
+
+ROOTFS_BTRFS_DEPENDENCIES = host-btrfs-progs
+
+define ROOTFS_BTRFS_CMD
+	rm -f $@
+	truncate -s $(BTRFS_SIZE) $@
+	$(HOST_DIR)/bin/mkfs.btrfs $(BTRFS_OPTS) $@ \
+	|| { ret=$$?; \
+	     echo "*** Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_BTRFS_SIZE)" 1>&2; \
+	     exit $$ret; \
+	}
+endef
+
+$(eval $(rootfs))
Signature · 6 lines
2.11.0

_______________________________________________
buildroot mailing list
buildroot at busybox.net
http://lists.busybox.net/mailman/listinfo/buildroot
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
#2 lore raw

PATCH 2/2 fs/btrfs: Introducing btrfs rootfs support.

In reply to Robert J. Heywood

Hello Robert,

Quoted 8 lines · Robert J. Heywood

This patch makes it possible to format the rootfs using btrfs. It introduces the option; BR2_TARGET_ROOTFS_BTRFS

When selected, the user is able to specify the filesystem size, label, options, and node and sector sizes.
The new files are based on fs/ext2/{Config.in,ext2.mk}

Thanks, I've applied, but I did a few changes. First, I fixed the issues pointed by Yann E. Morin in the Config.in file. But more importantly, see below.

fs/btrfs/btrfs.mk line 30

Quoted 2 lines
fs/btrfs/btrfs.mk new file +2 -0
+define ROOTFS_BTRFS_CMD
+	rm -f $@

This is not needed, once you add the -f option to mkfs.btrfs, so I've done that.

fs/btrfs/btrfs.mk line 31

Quoted 1 line
fs/btrfs/btrfs.mk new file +1 -0
+	truncate -s $(BTRFS_SIZE) $@

mkfs.btrfs has the --byte-count option that allows to set the size of the filesystem image to be generated, so I've used that instead and dropped the truncate -s.

fs/btrfs/btrfs.mk line 35

Quoted 4 lines
fs/btrfs/btrfs.mk new file +4 -0
+	$(HOST_DIR)/bin/mkfs.btrfs $(BTRFS_OPTS) $@ \
+	|| { ret=$$?; \
+	     echo "*** Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_BTRFS_SIZE)" 1>&2; \
+	     exit $$ret; \

This warning was not really useful: mkfs.btrfs automatically extends the image size as needed. So if you specify 100m, but you need 150m, mkfs.btrfs will anyway produce a 150m filesystem image, without bailing out. So an error of mkfs.brtfs cannot be explained by the BR2_TARGET_ROOTFS_BTRFS_SIZE value being too small. Therefore, I've dropped this error handling entirely.

Applied to next with those changes:

https://git.buildroot.org/buildroot/commit/?h=next&id=0aade4df1f80d7bff58da2b5d3dfd9d8d6ec4b7d

Thanks!

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com