diff options
author | Kevin Hao | 2019-08-19 10:30:22 +0200 |
---|---|---|
committer | Karel Zak | 2019-08-19 14:36:55 +0200 |
commit | 042057d8029dde27cc465d573731579f50c89eee (patch) | |
tree | badba08293c7e34cff1ed741e353f88d811d7645 /libmount | |
parent | tests: Skip fdisk/mbr-nondos-mode on Sparc as unsupported (diff) | |
download | kernel-qcow2-util-linux-042057d8029dde27cc465d573731579f50c89eee.tar.gz kernel-qcow2-util-linux-042057d8029dde27cc465d573731579f50c89eee.tar.xz kernel-qcow2-util-linux-042057d8029dde27cc465d573731579f50c89eee.zip |
libmount: Keep the mnt_tab info for the existent dest in mnt_copy_fs()
The "umount -f -a -r" get stuck in a endless loop when run with a
mountinfo like below:
15 0 179:2 / / ro,relatime - ext4 /dev/root ro
16 15 0:6 / /dev rw,relatime - devtmpfs devtmpfs rw,size=242896k,nr_inodes=60724,mode=755
17 15 0:4 / /proc rw,relatime - proc proc rw
18 15 0:15 / /mnt/.psplash rw,relatime - tmpfs tmpfs rw,size=40k
19 15 0:16 / /sys rw,relatime - sysfs sysfs rw
20 19 0:7 / /sys/kernel/debug rw,relatime - debugfs debugfs rw
21 15 0:17 / /run rw,nosuid,nodev - tmpfs tmpfs rw,mode=755
22 15 0:18 / /var/volatile rw,relatime - tmpfs tmpfs rw
23 15 179:1 / /boot rw,relatime - vfat /dev/mmcblk0p1 rw,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
24 16 0:19 / /dev/pts rw,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000
25 18 0:20 / /mnt/.psplash rw,relatime - tmpfs tmpfs rw,size=40k
The reason is that the two same mnt entry "/mnt/.psplash" will cause
the dst->tab set to NULL when umount this mnt entry the second time.
This will trigger an endless loop in mnt_reset_table() because that
mnt entry is linked on the libmnt_table but its .tab is set to NULL.
Signed-off-by: Kevin Hao <kexin.hao@windriver.com>
Diffstat (limited to 'libmount')
-rw-r--r-- | libmount/src/fs.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/libmount/src/fs.c b/libmount/src/fs.c index eb89bb8a3..4126ee9dc 100644 --- a/libmount/src/fs.c +++ b/libmount/src/fs.c @@ -188,9 +188,10 @@ struct libmnt_fs *mnt_copy_fs(struct libmnt_fs *dest, dest = mnt_new_fs(); if (!dest) return NULL; + + dest->tab = NULL; } - dest->tab = NULL; dest->id = src->id; dest->parent = src->parent; dest->devno = src->devno; |