Message ID | 20211121094254.3425966-1-fontaine.fabrice@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [1/1] package/util-linux: fix mount -a | expand |
On 21/11/2021 10:42, Fabrice Fontaine wrote: > Fixes: > - https://bugs.buildroot.org/show_bug.cgi?id=14351 > > Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> Applied to master, thanks. Regards, Arnout > --- > ...cache-as-probed-if-sys-not-available.patch | 141 ++++++++++++++++++ > 1 file changed, 141 insertions(+) > create mode 100644 package/util-linux/0002-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch > > diff --git a/package/util-linux/0002-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch b/package/util-linux/0002-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch > new file mode 100644 > index 0000000000..bfc8f60834 > --- /dev/null > +++ b/package/util-linux/0002-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch > @@ -0,0 +1,141 @@ > +From 84d38ae3eca523ef990cb848563cc63de25266e6 Mon Sep 17 00:00:00 2001 > +From: Karel Zak <kzak@redhat.com> > +Date: Fri, 19 Nov 2021 14:19:03 +0100 > +Subject: [PATCH] libblkid: don't mark cache as "probed" if /sys not available > + > +For "mount --all" we need to read the cache more than once in a short > +time. The library checks the delay between probes, and if the delay is > +too short, it does not read devices. This is a problem on boot when there > +are no /sys, and the cache is empty. In this case, we need to check > +for /sys until it's available constantly. > + > +https://github.com/util-linux/util-linux/issues/1492 > +Signed-off-by: Karel Zak <kzak@redhat.com> > + > +[Retrieved from: > +https://github.com/util-linux/util-linux/commit/84d38ae3eca523ef990cb848563cc63de25266e6] > +Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> > +--- > + libblkid/src/devname.c | 26 +++++++++++++++++--------- > + libblkid/src/resolve.c | 2 +- > + libblkid/src/tag.c | 8 +++++--- > + 3 files changed, 23 insertions(+), 13 deletions(-) > + > +diff --git a/libblkid/src/devname.c b/libblkid/src/devname.c > +index 90a8245fc9..9a173e3489 100644 > +--- a/libblkid/src/devname.c > ++++ b/libblkid/src/devname.c > +@@ -429,6 +429,8 @@ sysfs_probe_all(blkid_cache cache, int only_if_new, int only_removable) > + if (!sysfs) > + return -BLKID_ERR_SYSFS; > + > ++ DBG(DEVNAME, ul_debug(" probe /sys/block")); > ++ > + /* scan /sys/block */ > + while ((dev = xreaddir(sysfs))) { > + DIR *dir = NULL; > +@@ -533,14 +535,18 @@ sysfs_probe_all(blkid_cache cache, int only_if_new, int only_removable) > + /* > + * Read the device data for all available block devices in the system. > + */ > +-static int probe_all(blkid_cache cache, int only_if_new) > ++static int probe_all(blkid_cache cache, int only_if_new, int update_interval) > + { > ++ int rc; > ++ > + if (!cache) > + return -BLKID_ERR_PARAM; > + > + if (cache->bic_flags & BLKID_BIC_FL_PROBED && > +- time(NULL) - cache->bic_time < BLKID_PROBE_INTERVAL) > ++ time(NULL) - cache->bic_time < BLKID_PROBE_INTERVAL) { > ++ DBG(PROBE, ul_debug("don't re-probe [delay < %d]", BLKID_PROBE_INTERVAL)); > + return 0; > ++ } > + > + blkid_read_cache(cache); > + #ifdef VG_DIR > +@@ -548,7 +554,13 @@ static int probe_all(blkid_cache cache, int only_if_new) > + #endif > + ubi_probe_all(cache, only_if_new); > + > +- sysfs_probe_all(cache, only_if_new, 0); > ++ rc = sysfs_probe_all(cache, only_if_new, 0); > ++ > ++ /* Don't mark the change as "probed" if /sys not avalable */ > ++ if (update_interval && rc == 0) { > ++ cache->bic_time = time(NULL); > ++ cache->bic_flags |= BLKID_BIC_FL_PROBED; > ++ } > + > + blkid_flush_cache(cache); > + return 0; > +@@ -567,11 +579,7 @@ int blkid_probe_all(blkid_cache cache) > + int ret; > + > + DBG(PROBE, ul_debug("Begin blkid_probe_all()")); > +- ret = probe_all(cache, 0); > +- if (ret == 0) { > +- cache->bic_time = time(NULL); > +- cache->bic_flags |= BLKID_BIC_FL_PROBED; > +- } > ++ ret = probe_all(cache, 0, 1); > + DBG(PROBE, ul_debug("End blkid_probe_all() [rc=%d]", ret)); > + return ret; > + } > +@@ -589,7 +597,7 @@ int blkid_probe_all_new(blkid_cache cache) > + int ret; > + > + DBG(PROBE, ul_debug("Begin blkid_probe_all_new()")); > +- ret = probe_all(cache, 1); > ++ ret = probe_all(cache, 1, 0); > + DBG(PROBE, ul_debug("End blkid_probe_all_new() [rc=%d]", ret)); > + return ret; > + } > +diff --git a/libblkid/src/resolve.c b/libblkid/src/resolve.c > +index 641b022860..16653fa8e1 100644 > +--- a/libblkid/src/resolve.c > ++++ b/libblkid/src/resolve.c > +@@ -32,7 +32,7 @@ char *blkid_get_tag_value(blkid_cache cache, const char *tagname, > + blkid_cache c = cache; > + char *ret = NULL; > + > +- DBG(TAG, ul_debug("looking for %s on %s", tagname, devname)); > ++ DBG(TAG, ul_debug("looking for tag %s on %s device", tagname, devname)); > + > + if (!devname) > + return NULL; > +diff --git a/libblkid/src/tag.c b/libblkid/src/tag.c > +index 390a648648..178336505f 100644 > +--- a/libblkid/src/tag.c > ++++ b/libblkid/src/tag.c > +@@ -326,14 +326,14 @@ blkid_dev blkid_find_dev_with_tag(blkid_cache cache, > + blkid_dev dev; > + int pri; > + struct list_head *p; > +- int probe_new = 0; > ++ int probe_new = 0, probe_all = 0; > + > + if (!cache || !type || !value) > + return NULL; > + > + blkid_read_cache(cache); > + > +- DBG(TAG, ul_debug("looking for %s=%s in cache", type, value)); > ++ DBG(TAG, ul_debug("looking for tag %s=%s in cache", type, value)); > + > + try_again: > + pri = -1; > +@@ -366,9 +366,11 @@ blkid_dev blkid_find_dev_with_tag(blkid_cache cache, > + goto try_again; > + } > + > +- if (!dev && !(cache->bic_flags & BLKID_BIC_FL_PROBED)) { > ++ if (!dev && !probe_all > ++ && !(cache->bic_flags & BLKID_BIC_FL_PROBED)) { > + if (blkid_probe_all(cache) < 0) > + return NULL; > ++ probe_all++; > + goto try_again; > + } > + return dev; >
diff --git a/package/util-linux/0002-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch b/package/util-linux/0002-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch new file mode 100644 index 0000000000..bfc8f60834 --- /dev/null +++ b/package/util-linux/0002-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch @@ -0,0 +1,141 @@ +From 84d38ae3eca523ef990cb848563cc63de25266e6 Mon Sep 17 00:00:00 2001 +From: Karel Zak <kzak@redhat.com> +Date: Fri, 19 Nov 2021 14:19:03 +0100 +Subject: [PATCH] libblkid: don't mark cache as "probed" if /sys not available + +For "mount --all" we need to read the cache more than once in a short +time. The library checks the delay between probes, and if the delay is +too short, it does not read devices. This is a problem on boot when there +are no /sys, and the cache is empty. In this case, we need to check +for /sys until it's available constantly. + +https://github.com/util-linux/util-linux/issues/1492 +Signed-off-by: Karel Zak <kzak@redhat.com> + +[Retrieved from: +https://github.com/util-linux/util-linux/commit/84d38ae3eca523ef990cb848563cc63de25266e6] +Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> +--- + libblkid/src/devname.c | 26 +++++++++++++++++--------- + libblkid/src/resolve.c | 2 +- + libblkid/src/tag.c | 8 +++++--- + 3 files changed, 23 insertions(+), 13 deletions(-) + +diff --git a/libblkid/src/devname.c b/libblkid/src/devname.c +index 90a8245fc9..9a173e3489 100644 +--- a/libblkid/src/devname.c ++++ b/libblkid/src/devname.c +@@ -429,6 +429,8 @@ sysfs_probe_all(blkid_cache cache, int only_if_new, int only_removable) + if (!sysfs) + return -BLKID_ERR_SYSFS; + ++ DBG(DEVNAME, ul_debug(" probe /sys/block")); ++ + /* scan /sys/block */ + while ((dev = xreaddir(sysfs))) { + DIR *dir = NULL; +@@ -533,14 +535,18 @@ sysfs_probe_all(blkid_cache cache, int only_if_new, int only_removable) + /* + * Read the device data for all available block devices in the system. + */ +-static int probe_all(blkid_cache cache, int only_if_new) ++static int probe_all(blkid_cache cache, int only_if_new, int update_interval) + { ++ int rc; ++ + if (!cache) + return -BLKID_ERR_PARAM; + + if (cache->bic_flags & BLKID_BIC_FL_PROBED && +- time(NULL) - cache->bic_time < BLKID_PROBE_INTERVAL) ++ time(NULL) - cache->bic_time < BLKID_PROBE_INTERVAL) { ++ DBG(PROBE, ul_debug("don't re-probe [delay < %d]", BLKID_PROBE_INTERVAL)); + return 0; ++ } + + blkid_read_cache(cache); + #ifdef VG_DIR +@@ -548,7 +554,13 @@ static int probe_all(blkid_cache cache, int only_if_new) + #endif + ubi_probe_all(cache, only_if_new); + +- sysfs_probe_all(cache, only_if_new, 0); ++ rc = sysfs_probe_all(cache, only_if_new, 0); ++ ++ /* Don't mark the change as "probed" if /sys not avalable */ ++ if (update_interval && rc == 0) { ++ cache->bic_time = time(NULL); ++ cache->bic_flags |= BLKID_BIC_FL_PROBED; ++ } + + blkid_flush_cache(cache); + return 0; +@@ -567,11 +579,7 @@ int blkid_probe_all(blkid_cache cache) + int ret; + + DBG(PROBE, ul_debug("Begin blkid_probe_all()")); +- ret = probe_all(cache, 0); +- if (ret == 0) { +- cache->bic_time = time(NULL); +- cache->bic_flags |= BLKID_BIC_FL_PROBED; +- } ++ ret = probe_all(cache, 0, 1); + DBG(PROBE, ul_debug("End blkid_probe_all() [rc=%d]", ret)); + return ret; + } +@@ -589,7 +597,7 @@ int blkid_probe_all_new(blkid_cache cache) + int ret; + + DBG(PROBE, ul_debug("Begin blkid_probe_all_new()")); +- ret = probe_all(cache, 1); ++ ret = probe_all(cache, 1, 0); + DBG(PROBE, ul_debug("End blkid_probe_all_new() [rc=%d]", ret)); + return ret; + } +diff --git a/libblkid/src/resolve.c b/libblkid/src/resolve.c +index 641b022860..16653fa8e1 100644 +--- a/libblkid/src/resolve.c ++++ b/libblkid/src/resolve.c +@@ -32,7 +32,7 @@ char *blkid_get_tag_value(blkid_cache cache, const char *tagname, + blkid_cache c = cache; + char *ret = NULL; + +- DBG(TAG, ul_debug("looking for %s on %s", tagname, devname)); ++ DBG(TAG, ul_debug("looking for tag %s on %s device", tagname, devname)); + + if (!devname) + return NULL; +diff --git a/libblkid/src/tag.c b/libblkid/src/tag.c +index 390a648648..178336505f 100644 +--- a/libblkid/src/tag.c ++++ b/libblkid/src/tag.c +@@ -326,14 +326,14 @@ blkid_dev blkid_find_dev_with_tag(blkid_cache cache, + blkid_dev dev; + int pri; + struct list_head *p; +- int probe_new = 0; ++ int probe_new = 0, probe_all = 0; + + if (!cache || !type || !value) + return NULL; + + blkid_read_cache(cache); + +- DBG(TAG, ul_debug("looking for %s=%s in cache", type, value)); ++ DBG(TAG, ul_debug("looking for tag %s=%s in cache", type, value)); + + try_again: + pri = -1; +@@ -366,9 +366,11 @@ blkid_dev blkid_find_dev_with_tag(blkid_cache cache, + goto try_again; + } + +- if (!dev && !(cache->bic_flags & BLKID_BIC_FL_PROBED)) { ++ if (!dev && !probe_all ++ && !(cache->bic_flags & BLKID_BIC_FL_PROBED)) { + if (blkid_probe_all(cache) < 0) + return NULL; ++ probe_all++; + goto try_again; + } + return dev;
Fixes: - https://bugs.buildroot.org/show_bug.cgi?id=14351 Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> --- ...cache-as-probed-if-sys-not-available.patch | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 package/util-linux/0002-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch