libfstools: move mount points when switching to JFFS2 Switching from "tmpfs" to "jffs2" happens after JFFS2 formatting is done. During that time user can use filesystem (thanks to RAM) and the role of switch2jffs() is to copy all changes to the JFFS2 overlay partition. What wasn't handled so far was moving mount points. User can create custom mounts, cp command won't copy them and umounting "tmpfs" will cause these mounts to go away. To preserve them switch2jffs() has to find all custom mount points and move them to the new filesystem. Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Acked-by: John Crispin <john@phrozen.org>
libfstools: add "const" to char pointer arguments in mount_move() That function never modifies these strings so it can/should use consts. It makes it a bit more flexible as now callers can also pass consts. Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Acked-by: John Crispin <john@phrozen.org>
libfstools: fix foreachdir() to pass dir with a trailing slash Commit cc63723d886fd ("overlay: use lstat rather than stat and make sure there are no trailing spaces") changed behavior of foreachdir() breaking some callbacks. Before that modification all callbacks were getting directory with a trailing slash. Above commit started removing them. This broke handle_whiteout() which doesn't work at all since then. It constructs file paths incorrectly: slash is missing between directory and a file name. It seems noone noticed it for years because this issue got hidden by switch2jffs() which also handles whiteouts with its system command "cp -a" call. Fix that regression by setting trailing slash back - right after calling lstat(). Also to keep code simple just skip all entries that aren't directories. This keeps conditions for removing/setting trailing slash trivial. A side effect is not calling callbacks for files which is a free bonus optimization. Fixes: cc63723d886fd ("overlay: use lstat rather than stat and make sure there are no trailing spaces") Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Acked-by: John Crispin <john@phrozen.org>
overlay: fix compilation with glibc glibc fails with: warn_unused_result [-Wunused-result] system("cp -a /tmp/root/upper/* / 2>/dev/null"); Regression intoroduced with 11efbf3b90f031ce634fc38cad07a4aef2985777 Reported here: https://www.mail-archive.com/lede-dev@lists.infradead.org/msg10502.html Signed-off-by: Roman Yeryomin <roman@advem.lv> Acked-by: Florian Fainelli <f.fainelli@gmail.com>
libfstools: support file paths longer than 255 chars Alloc globdir buffer dynamically and simply use realloc when needed. This fixes e.g. segmentation fault in jffs2reset due to an infinite recurrency when dealing with longs paths. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
overlay: fix race condition when switching to jffs2 There is a race between `cp -a /tmp/root/* /rom/overlay` from libfstools/overlay.c and a process creating new file(s) before pivot(/rom, /mnt) occured. That is a process can create a file and it will not be copied. To workaround this, do additional copy after jffs2 is ready. This doesn't completely solve the problem but since there was no other fix provided since original RFC [1], it is better than nothiing. [1] https://www.mail-archive.com/openwrt-devel@lists.openwrt.org/msg38218.html Signed-off-by: Roman Yeryomin <roman@advem.lv>
libblkid-tiny: add support for NTFS superblock Its copied from the util-linux project and its libblkid. Call to the blkid_probe_set_utf8label was commented out due to libblkid-tiny not supporting it yet. Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Acked-by: John Crispin <john@phrozen.org>
libblkid-tiny: add support for UBI superblock Detecting UBI superblock may be useful for tools wanting to simplify or automate attaching UBI. Please note it's not directly related to the ubifs support which is just a filesystem working on top of UBI volume. This patch adds simple code reading UBI version and unique number and setting it in the blkid_probe. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
block: support /dev/xvd* nodes Xen provides paravirtualized block devices which most often appear as /dev/xvd*. This patch adds this pattern to those known to the block utilitiy. These devices require a kernel compiled with the xen-blkfront driver. Signed-off-by: W. Michael Petullo <mike@flyn.org>
libfstools: fix matching device name compare strlen()+1 characters to make sure we match the trailing \0 as well. Otherwise things get fishy when using lvm2, see this example: /dev/mapper/data: UUID="xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxxxx" MOUNT="/mnt" TYPE="LVM2_member" /dev/mapper/data-fs: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" LABEL="xxxxxxxx" VERSION="1.0" MOUNT="/mnt" TYPE="ext4" Signed-off-by: Daniel Golle <daniel@makrotopia.org>
libfstools: fix multiple volume_identify usages with the same volume This fixes e.g. factory-flashed startup issue with jffs2 on ubi overlay Commit ba019965 ("libfstools: accept volume as argument in most calls") broke startup for factory-flashed jffs2 on ubi systems, causing substantial slowdown in factory environments. When starting up with a factory-flashed jffs2 on ubi system, the "rootfs_data" volume contains a deadcode marker. In the start phase, mount_root then mounts a tmpfs overlay, and postpones remounting of the jffs2 overlay until the done phase of the startup. The refactoring in ba019965 eliminated an unneeded call to volume_find() when done() called jffs2_switch(). Unfortunately the refactoring did not take into account that volume_identify() does not function correctly when called twice in a row on the same struct volume when using an mtd driver. mtd_volume_identify() uses mtd_volume_load() to open an fd to the mtd device and reads a potential deadcode marker from the fd. The first time this works, and FS_DEADCODE is returned. When volume_identify() is called a second time however, mtd_volume_load() notices that we already have an open fd, does nothing further and returns 0 without resetting the file offset to 0. mtd_volume_identify() now reads past the deadcode marker and now returns FS_JFFS2 if the mtd device is a UBIVOLUME. jffs2_switch() then handles the wrong case, either pulling the root out from under user-space in Chaos Calmer, or indefinitely sticking to a tmpfs overlay in later OpenWRT builds. Signed-off-by: Pieter Smith <pieter.smith@philips.com> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>