parent
ab42fbbc85
commit
0f303590e7
27
0034-lslogins-improve-for-static-analyzer.patch
Normal file
27
0034-lslogins-improve-for-static-analyzer.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
From 53af90a8edf2e60342b477d28e0d802dc26f18b7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Tue, 9 Aug 2022 12:35:05 +0200
|
||||||
|
Subject: lslogins: improve for static analyzer
|
||||||
|
|
||||||
|
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2094216
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/lslogins.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
|
||||||
|
index ff4386d1b..56431212d 100644
|
||||||
|
--- a/login-utils/lslogins.c
|
||||||
|
+++ b/login-utils/lslogins.c
|
||||||
|
@@ -852,7 +852,7 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c
|
||||||
|
while (p && *p == '!')
|
||||||
|
p++, i++;
|
||||||
|
|
||||||
|
- if (i != 0 && (!*p || valid_pwd(p)))
|
||||||
|
+ if (i != 0 && p && (!*p || valid_pwd(p)))
|
||||||
|
user->pwd_lock = STATUS_TRUE;
|
||||||
|
} else
|
||||||
|
user->pwd_lock = STATUS_UNKNOWN;
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
81
0035-mount-Fix-race-in-loop-device-reuse-code.patch
Normal file
81
0035-mount-Fix-race-in-loop-device-reuse-code.patch
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
From 99e5203da4bb8c4470f0c865add67b8151405bbc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kara <jack@suse.cz>
|
||||||
|
Date: Thu, 20 Jan 2022 12:47:05 +0100
|
||||||
|
Subject: mount: Fix race in loop device reuse code
|
||||||
|
|
||||||
|
Small timing changes in the kernel loop device handling broke the
|
||||||
|
following loop:
|
||||||
|
|
||||||
|
while :; do mount -o loop,ro isofs.iso isofs/; umount isofs/; done
|
||||||
|
|
||||||
|
which quickly reports:
|
||||||
|
mount: /mnt: can't read superblock on /dev/loop0.
|
||||||
|
umount: /mnt: not mounted.
|
||||||
|
|
||||||
|
And this loop is broken because of a subtle interaction with
|
||||||
|
systemd-udevd that also opens the loop device. The race seems to be in
|
||||||
|
mount(8) handling itself and the altered kernel timing makes it happen.
|
||||||
|
It look like:
|
||||||
|
|
||||||
|
bash systemd-udevd
|
||||||
|
mount -o loop,ro isofs.iso isofs/
|
||||||
|
/dev/loop0 is created and bound to isofs.iso, autoclear is set for
|
||||||
|
loop0
|
||||||
|
opens /dev/loop0
|
||||||
|
umount isofs/
|
||||||
|
loop0 still lives because systemd-udev still has device open
|
||||||
|
mount -o loop,ro isofs.iso isofs/
|
||||||
|
gets to mnt_context_setup_loopdev()
|
||||||
|
loopcxt_find_overlap()
|
||||||
|
sees loop0 is still valid and with proper parameters
|
||||||
|
reuse = true;
|
||||||
|
close /dev/loop0
|
||||||
|
last fd closed => loop0 is
|
||||||
|
cleaned up
|
||||||
|
loopcxt_get_fd()
|
||||||
|
opens loop0 but it is no longer the device we wanted!
|
||||||
|
calls mount(2) which fails because we cannot read from the loop device
|
||||||
|
|
||||||
|
Fix the problem by rechecking that loop device is still attached after
|
||||||
|
opening the device. This makes sure the kernel will not autoclear the
|
||||||
|
device anymore.
|
||||||
|
|
||||||
|
Addresses: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=2117203
|
||||||
|
Signed-off-by: Jan Kara <jack@suse.cz>
|
||||||
|
---
|
||||||
|
libmount/src/context_loopdev.c | 19 +++++++++++++++++++
|
||||||
|
1 file changed, 19 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/libmount/src/context_loopdev.c b/libmount/src/context_loopdev.c
|
||||||
|
index 6462bfb62..73bcc01c1 100644
|
||||||
|
--- a/libmount/src/context_loopdev.c
|
||||||
|
+++ b/libmount/src/context_loopdev.c
|
||||||
|
@@ -255,6 +255,25 @@ int mnt_context_setup_loopdev(struct libmnt_context *cxt)
|
||||||
|
DBG(LOOP, ul_debugobj(cxt, "re-using existing loop device %s",
|
||||||
|
loopcxt_get_device(&lc)));
|
||||||
|
|
||||||
|
+ /* Open loop device to block device autoclear... */
|
||||||
|
+ if (loopcxt_get_fd(&lc) < 0) {
|
||||||
|
+ DBG(LOOP, ul_debugobj(cxt, "failed to get loopdev FD"));
|
||||||
|
+ rc = -errno;
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Now that we certainly have the loop device open,
|
||||||
|
+ * verify the loop device was not autocleared in the
|
||||||
|
+ * mean time.
|
||||||
|
+ */
|
||||||
|
+ if (!loopcxt_get_info(&lc)) {
|
||||||
|
+ DBG(LOOP, ul_debugobj(cxt, "lost race with %s teardown",
|
||||||
|
+ loopcxt_get_device(&lc)));
|
||||||
|
+ loopcxt_deinit(&lc);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Once a loop is initialized RO, there is no
|
||||||
|
* way to change its parameters. */
|
||||||
|
if (loopcxt_is_readonly(&lc)
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -0,0 +1,51 @@
|
|||||||
|
From 432b5024cc40647ea0a541c70c31d00719b52652 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kara <jack@suse.cz>
|
||||||
|
Date: Thu, 20 Jan 2022 13:16:38 +0100
|
||||||
|
Subject: loopdev: Properly translate errors from ul_path_read_*()
|
||||||
|
|
||||||
|
A few callsites do not translate error from ul_path_read_*() and just
|
||||||
|
treat it as error code leading to confusing EPERM errors.
|
||||||
|
|
||||||
|
Addresses: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=2117203
|
||||||
|
Signed-off-by: Jan Kara <jack@suse.cz>
|
||||||
|
---
|
||||||
|
lib/loopdev.c | 9 ++++++---
|
||||||
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/loopdev.c b/lib/loopdev.c
|
||||||
|
index d9ea1d4a2..db3aab29f 100644
|
||||||
|
--- a/lib/loopdev.c
|
||||||
|
+++ b/lib/loopdev.c
|
||||||
|
@@ -739,7 +739,8 @@ int loopcxt_get_offset(struct loopdev_cxt *lc, uint64_t *offset)
|
||||||
|
int rc = -EINVAL;
|
||||||
|
|
||||||
|
if (sysfs)
|
||||||
|
- rc = ul_path_read_u64(sysfs, offset, "loop/offset");
|
||||||
|
+ if (ul_path_read_u64(sysfs, offset, "loop/offset") == 0)
|
||||||
|
+ rc = 0;
|
||||||
|
|
||||||
|
if (rc && loopcxt_ioctl_enabled(lc)) {
|
||||||
|
struct loop_info64 *lo = loopcxt_get_info(lc);
|
||||||
|
@@ -767,7 +768,8 @@ int loopcxt_get_blocksize(struct loopdev_cxt *lc, uint64_t *blocksize)
|
||||||
|
int rc = -EINVAL;
|
||||||
|
|
||||||
|
if (sysfs)
|
||||||
|
- rc = ul_path_read_u64(sysfs, blocksize, "queue/logical_block_size");
|
||||||
|
+ if (ul_path_read_u64(sysfs, blocksize, "queue/logical_block_size") == 0)
|
||||||
|
+ rc = 0;
|
||||||
|
|
||||||
|
/* Fallback based on BLKSSZGET ioctl */
|
||||||
|
if (rc) {
|
||||||
|
@@ -799,7 +801,8 @@ int loopcxt_get_sizelimit(struct loopdev_cxt *lc, uint64_t *size)
|
||||||
|
int rc = -EINVAL;
|
||||||
|
|
||||||
|
if (sysfs)
|
||||||
|
- rc = ul_path_read_u64(sysfs, size, "loop/sizelimit");
|
||||||
|
+ if (ul_path_read_u64(sysfs, size, "loop/sizelimit") == 0)
|
||||||
|
+ rc = 0;
|
||||||
|
|
||||||
|
if (rc && loopcxt_ioctl_enabled(lc)) {
|
||||||
|
struct loop_info64 *lo = loopcxt_get_info(lc);
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -0,0 +1,56 @@
|
|||||||
|
From ea556ef1d9e26802842577597e3736528f54ee0f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kara <jack@suse.cz>
|
||||||
|
Date: Thu, 20 Jan 2022 13:16:39 +0100
|
||||||
|
Subject: loopdev: Do not treat errors when detecting overlap as fatal
|
||||||
|
|
||||||
|
When looking for overlapping loop device we can fail getting some loop
|
||||||
|
device properties when we race with device autoclear. Just squelsh these
|
||||||
|
errors and try next loop device.
|
||||||
|
|
||||||
|
Addresses: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=2117203
|
||||||
|
Signed-off-by: Jan Kara <jack@suse.cz>
|
||||||
|
---
|
||||||
|
lib/loopdev.c | 15 +++++++++------
|
||||||
|
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/loopdev.c b/lib/loopdev.c
|
||||||
|
index db3aab29f..511f8a0d6 100644
|
||||||
|
--- a/lib/loopdev.c
|
||||||
|
+++ b/lib/loopdev.c
|
||||||
|
@@ -1773,10 +1773,13 @@ int loopcxt_find_overlap(struct loopdev_cxt *lc, const char *filename,
|
||||||
|
|
||||||
|
rc = loopcxt_is_used(lc, hasst ? &st : NULL,
|
||||||
|
filename, offset, sizelimit, 0);
|
||||||
|
- if (!rc)
|
||||||
|
- continue; /* unused */
|
||||||
|
- if (rc < 0)
|
||||||
|
- break; /* error */
|
||||||
|
+ /*
|
||||||
|
+ * Either the loopdev is unused or we've got an error which can
|
||||||
|
+ * happen when we are racing with device autoclear. Just ignore
|
||||||
|
+ * this loopdev...
|
||||||
|
+ */
|
||||||
|
+ if (rc <= 0)
|
||||||
|
+ continue;
|
||||||
|
|
||||||
|
DBG(CXT, ul_debugobj(lc, "found %s backed by %s",
|
||||||
|
loopcxt_get_device(lc), filename));
|
||||||
|
@@ -1785,13 +1788,13 @@ int loopcxt_find_overlap(struct loopdev_cxt *lc, const char *filename,
|
||||||
|
if (rc) {
|
||||||
|
DBG(CXT, ul_debugobj(lc, "failed to get offset for device %s",
|
||||||
|
loopcxt_get_device(lc)));
|
||||||
|
- break;
|
||||||
|
+ continue;
|
||||||
|
}
|
||||||
|
rc = loopcxt_get_sizelimit(lc, &lc_sizelimit);
|
||||||
|
if (rc) {
|
||||||
|
DBG(CXT, ul_debugobj(lc, "failed to get sizelimit for device %s",
|
||||||
|
loopcxt_get_device(lc)));
|
||||||
|
- break;
|
||||||
|
+ continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* full match */
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
87
0038-loopdev-add-retries-on-EAGAIN.patch
Normal file
87
0038-loopdev-add-retries-on-EAGAIN.patch
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
From a24905f03e90fb2f418bd5b8816378a99bb535b2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Tue, 1 Mar 2022 12:07:07 +0100
|
||||||
|
Subject: loopdev: add retries on EAGAIN
|
||||||
|
|
||||||
|
* add limit to number of attempts for LOOP_SET_STATUS64
|
||||||
|
|
||||||
|
* use the same for LOOP_SET_BLOCK_SIZE ioctl
|
||||||
|
|
||||||
|
Addresses: https://github.com/util-linux/util-linux/issues/1582
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
lib/loopdev.c | 32 +++++++++++++++++++++++---------
|
||||||
|
1 file changed, 23 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/loopdev.c b/lib/loopdev.c
|
||||||
|
index 511f8a0d6..e8ccf6ae6 100644
|
||||||
|
--- a/lib/loopdev.c
|
||||||
|
+++ b/lib/loopdev.c
|
||||||
|
@@ -43,6 +43,9 @@
|
||||||
|
#include "debug.h"
|
||||||
|
#include "fileutils.h"
|
||||||
|
|
||||||
|
+
|
||||||
|
+#define LOOPDEV_MAX_TRIES 10
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Debug stuff (based on include/debug.h)
|
||||||
|
*/
|
||||||
|
@@ -1450,7 +1453,7 @@ err:
|
||||||
|
*/
|
||||||
|
int loopcxt_ioctl_status(struct loopdev_cxt *lc)
|
||||||
|
{
|
||||||
|
- int dev_fd, rc = -1, err, again;
|
||||||
|
+ int dev_fd, rc = -1, err, again, tries = 0;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
dev_fd = loopcxt_get_fd(lc);
|
||||||
|
@@ -1464,9 +1467,12 @@ int loopcxt_ioctl_status(struct loopdev_cxt *lc)
|
||||||
|
do {
|
||||||
|
err = ioctl(dev_fd, LOOP_SET_STATUS64, &lc->config.info);
|
||||||
|
again = err && errno == EAGAIN;
|
||||||
|
- if (again)
|
||||||
|
+ if (again) {
|
||||||
|
xusleep(250000);
|
||||||
|
- } while (again);
|
||||||
|
+ tries++;
|
||||||
|
+ }
|
||||||
|
+ } while (again && tries <= LOOPDEV_MAX_TRIES);
|
||||||
|
+
|
||||||
|
if (err) {
|
||||||
|
rc = -errno;
|
||||||
|
DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64 failed: %m"));
|
||||||
|
@@ -1520,16 +1526,24 @@ int loopcxt_ioctl_dio(struct loopdev_cxt *lc, unsigned long use_dio)
|
||||||
|
int loopcxt_ioctl_blocksize(struct loopdev_cxt *lc, uint64_t blocksize)
|
||||||
|
{
|
||||||
|
int fd = loopcxt_get_fd(lc);
|
||||||
|
+ int err, again, tries = 0;
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- /* Kernels prior to v4.14 don't support this ioctl */
|
||||||
|
- if (ioctl(fd, LOOP_SET_BLOCK_SIZE, (unsigned long) blocksize) < 0) {
|
||||||
|
- int rc = -errno;
|
||||||
|
- DBG(CXT, ul_debugobj(lc, "LOOP_SET_BLOCK_SIZE failed: %m"));
|
||||||
|
- return rc;
|
||||||
|
- }
|
||||||
|
+ do {
|
||||||
|
+ /* Kernels prior to v4.14 don't support this ioctl */
|
||||||
|
+ err = ioctl(fd, LOOP_SET_BLOCK_SIZE, (unsigned long) blocksize);
|
||||||
|
+ again = err && errno == EAGAIN;
|
||||||
|
+ if (again) {
|
||||||
|
+ xusleep(250000);
|
||||||
|
+ tries++;
|
||||||
|
+ } else if (err) {
|
||||||
|
+ int rc = -errno;
|
||||||
|
+ DBG(CXT, ul_debugobj(lc, "LOOP_SET_BLOCK_SIZE failed: %m"));
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+ } while (again && tries <= LOOPDEV_MAX_TRIES);
|
||||||
|
|
||||||
|
DBG(CXT, ul_debugobj(lc, "logical block size set"));
|
||||||
|
return 0;
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
54
0039-lib-loopdev-remove-duplicate-code.patch
Normal file
54
0039-lib-loopdev-remove-duplicate-code.patch
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
From 24a39bb8baf827133c1cc6445021170502c18b94 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Tue, 8 Mar 2022 13:02:38 +0100
|
||||||
|
Subject: lib/loopdev: remove duplicate code
|
||||||
|
|
||||||
|
Use loopcxt_ioctl_status() rather than duplicate code.
|
||||||
|
|
||||||
|
Addresses: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=2117203
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
lib/loopdev.c | 18 ++++--------------
|
||||||
|
1 file changed, 4 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/loopdev.c b/lib/loopdev.c
|
||||||
|
index e8ccf6ae6..fda0e1210 100644
|
||||||
|
--- a/lib/loopdev.c
|
||||||
|
+++ b/lib/loopdev.c
|
||||||
|
@@ -1296,7 +1296,8 @@ static int loopcxt_check_size(struct loopdev_cxt *lc, int file_fd)
|
||||||
|
*/
|
||||||
|
int loopcxt_setup_device(struct loopdev_cxt *lc)
|
||||||
|
{
|
||||||
|
- int file_fd, dev_fd, mode = O_RDWR, rc = -1, cnt = 0, err, again;
|
||||||
|
+ int file_fd, dev_fd, mode = O_RDWR;
|
||||||
|
+ int rc = -1, cnt = 0;
|
||||||
|
int errsv = 0;
|
||||||
|
int fallback = 0;
|
||||||
|
|
||||||
|
@@ -1400,21 +1401,10 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- do {
|
||||||
|
- err = ioctl(dev_fd, LOOP_SET_STATUS64, &lc->config.info);
|
||||||
|
- again = err && errno == EAGAIN;
|
||||||
|
- if (again)
|
||||||
|
- xusleep(250000);
|
||||||
|
- } while (again);
|
||||||
|
-
|
||||||
|
- if (err) {
|
||||||
|
- rc = -errno;
|
||||||
|
- errsv = errno;
|
||||||
|
- DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64 failed: %m"));
|
||||||
|
+ if ((rc = loopcxt_ioctl_status(lc)) < 0) {
|
||||||
|
+ errsv = -rc;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64: OK"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((rc = loopcxt_check_size(lc, file_fd)))
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
213
0040-lib-loopdev-consolidate-ioctls-calls-on-EAGAIN.patch
Normal file
213
0040-lib-loopdev-consolidate-ioctls-calls-on-EAGAIN.patch
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
From 53b543476d271cce71c4f5b66d9d6a28f1a75370 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Wed, 9 Mar 2022 11:28:07 +0100
|
||||||
|
Subject: lib/loopdev: consolidate ioctls calls on EAGAIN
|
||||||
|
|
||||||
|
Keep all logic to repeat ioctl calls in one macro rather than
|
||||||
|
duplicate code.
|
||||||
|
|
||||||
|
Addresses: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=2117203
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
lib/loopdev.c | 97 ++++++++++++++++++++++++++++-----------------------
|
||||||
|
1 file changed, 54 insertions(+), 43 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/loopdev.c b/lib/loopdev.c
|
||||||
|
index fda0e1210..cceab2db1 100644
|
||||||
|
--- a/lib/loopdev.c
|
||||||
|
+++ b/lib/loopdev.c
|
||||||
|
@@ -43,7 +43,6 @@
|
||||||
|
#include "debug.h"
|
||||||
|
#include "fileutils.h"
|
||||||
|
|
||||||
|
-
|
||||||
|
#define LOOPDEV_MAX_TRIES 10
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -77,6 +76,24 @@ static void loopdev_init_debug(void)
|
||||||
|
#define loopcxt_sysfs_available(_lc) (!((_lc)->flags & LOOPDEV_FL_NOSYSFS)) \
|
||||||
|
&& !loopcxt_ioctl_enabled(_lc)
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Calls @x and repeat on EAGAIN
|
||||||
|
+ */
|
||||||
|
+#define repeat_on_eagain(x) __extension__ ({ \
|
||||||
|
+ int _c = 0, _e; \
|
||||||
|
+ do { \
|
||||||
|
+ errno = 0; \
|
||||||
|
+ _e = x; \
|
||||||
|
+ if (_e == 0 || errno != EAGAIN) \
|
||||||
|
+ break; \
|
||||||
|
+ if (_c >= LOOPDEV_MAX_TRIES) \
|
||||||
|
+ break; \
|
||||||
|
+ xusleep(250000); \
|
||||||
|
+ _c++; \
|
||||||
|
+ } while (1); \
|
||||||
|
+ _e == 0 ? 0 : errno ? -errno : -1; \
|
||||||
|
+ })
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* @lc: context
|
||||||
|
* @device: device name, absolute device path or NULL to reset the current setting
|
||||||
|
@@ -1276,6 +1293,7 @@ static int loopcxt_check_size(struct loopdev_cxt *lc, int file_fd)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* @lc: context
|
||||||
|
*
|
||||||
|
@@ -1364,8 +1382,9 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
|
||||||
|
* -- since Linux v5.8-rc1, commit 3448914e8cc550ba792d4ccc74471d1ca4293aae
|
||||||
|
*/
|
||||||
|
lc->config.fd = file_fd;
|
||||||
|
- if (ioctl(dev_fd, LOOP_CONFIGURE, &lc->config) < 0) {
|
||||||
|
- rc = -errno;
|
||||||
|
+
|
||||||
|
+ rc = repeat_on_eagain( ioctl(dev_fd, LOOP_CONFIGURE, &lc->config) );
|
||||||
|
+ if (rc != 0) {
|
||||||
|
errsv = errno;
|
||||||
|
if (errno != EINVAL && errno != ENOTTY) {
|
||||||
|
DBG(SETUP, ul_debugobj(lc, "LOOP_CONFIGURE failed: %m"));
|
||||||
|
@@ -1430,6 +1449,7 @@ err:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* @lc: context
|
||||||
|
*
|
||||||
|
@@ -1443,28 +1463,18 @@ err:
|
||||||
|
*/
|
||||||
|
int loopcxt_ioctl_status(struct loopdev_cxt *lc)
|
||||||
|
{
|
||||||
|
- int dev_fd, rc = -1, err, again, tries = 0;
|
||||||
|
+ int dev_fd, rc;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
dev_fd = loopcxt_get_fd(lc);
|
||||||
|
|
||||||
|
- if (dev_fd < 0) {
|
||||||
|
- rc = -errno;
|
||||||
|
- return rc;
|
||||||
|
- }
|
||||||
|
- DBG(SETUP, ul_debugobj(lc, "device open: OK"));
|
||||||
|
+ if (dev_fd < 0)
|
||||||
|
+ return -errno;
|
||||||
|
|
||||||
|
- do {
|
||||||
|
- err = ioctl(dev_fd, LOOP_SET_STATUS64, &lc->config.info);
|
||||||
|
- again = err && errno == EAGAIN;
|
||||||
|
- if (again) {
|
||||||
|
- xusleep(250000);
|
||||||
|
- tries++;
|
||||||
|
- }
|
||||||
|
- } while (again && tries <= LOOPDEV_MAX_TRIES);
|
||||||
|
+ DBG(SETUP, ul_debugobj(lc, "calling LOOP_SET_STATUS64"));
|
||||||
|
|
||||||
|
- if (err) {
|
||||||
|
- rc = -errno;
|
||||||
|
+ rc = repeat_on_eagain( ioctl(dev_fd, LOOP_SET_STATUS64, &lc->config.info) );
|
||||||
|
+ if (rc != 0) {
|
||||||
|
DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64 failed: %m"));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
@@ -1475,14 +1485,16 @@ int loopcxt_ioctl_status(struct loopdev_cxt *lc)
|
||||||
|
|
||||||
|
int loopcxt_ioctl_capacity(struct loopdev_cxt *lc)
|
||||||
|
{
|
||||||
|
- int fd = loopcxt_get_fd(lc);
|
||||||
|
+ int rc, fd = loopcxt_get_fd(lc);
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
+ DBG(SETUP, ul_debugobj(lc, "calling LOOP_SET_CAPACITY"));
|
||||||
|
+
|
||||||
|
/* Kernels prior to v2.6.30 don't support this ioctl */
|
||||||
|
- if (ioctl(fd, LOOP_SET_CAPACITY, 0) < 0) {
|
||||||
|
- int rc = -errno;
|
||||||
|
+ rc = repeat_on_eagain( ioctl(fd, LOOP_SET_CAPACITY, 0) );
|
||||||
|
+ if (rc != 0) {
|
||||||
|
DBG(CXT, ul_debugobj(lc, "LOOP_SET_CAPACITY failed: %m"));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
@@ -1493,14 +1505,16 @@ int loopcxt_ioctl_capacity(struct loopdev_cxt *lc)
|
||||||
|
|
||||||
|
int loopcxt_ioctl_dio(struct loopdev_cxt *lc, unsigned long use_dio)
|
||||||
|
{
|
||||||
|
- int fd = loopcxt_get_fd(lc);
|
||||||
|
+ int rc, fd = loopcxt_get_fd(lc);
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
+ DBG(SETUP, ul_debugobj(lc, "calling LOOP_SET_DIRECT_IO"));
|
||||||
|
+
|
||||||
|
/* Kernels prior to v4.4 don't support this ioctl */
|
||||||
|
- if (ioctl(fd, LOOP_SET_DIRECT_IO, use_dio) < 0) {
|
||||||
|
- int rc = -errno;
|
||||||
|
+ rc = repeat_on_eagain( ioctl(fd, LOOP_SET_DIRECT_IO, use_dio) );
|
||||||
|
+ if (rc != 0) {
|
||||||
|
DBG(CXT, ul_debugobj(lc, "LOOP_SET_DIRECT_IO failed: %m"));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
@@ -1515,25 +1529,19 @@ int loopcxt_ioctl_dio(struct loopdev_cxt *lc, unsigned long use_dio)
|
||||||
|
*/
|
||||||
|
int loopcxt_ioctl_blocksize(struct loopdev_cxt *lc, uint64_t blocksize)
|
||||||
|
{
|
||||||
|
- int fd = loopcxt_get_fd(lc);
|
||||||
|
- int err, again, tries = 0;
|
||||||
|
+ int rc, fd = loopcxt_get_fd(lc);
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- do {
|
||||||
|
- /* Kernels prior to v4.14 don't support this ioctl */
|
||||||
|
- err = ioctl(fd, LOOP_SET_BLOCK_SIZE, (unsigned long) blocksize);
|
||||||
|
- again = err && errno == EAGAIN;
|
||||||
|
- if (again) {
|
||||||
|
- xusleep(250000);
|
||||||
|
- tries++;
|
||||||
|
- } else if (err) {
|
||||||
|
- int rc = -errno;
|
||||||
|
- DBG(CXT, ul_debugobj(lc, "LOOP_SET_BLOCK_SIZE failed: %m"));
|
||||||
|
- return rc;
|
||||||
|
- }
|
||||||
|
- } while (again && tries <= LOOPDEV_MAX_TRIES);
|
||||||
|
+ DBG(SETUP, ul_debugobj(lc, "calling LOOP_SET_BLOCK_SIZE"));
|
||||||
|
+
|
||||||
|
+ rc = repeat_on_eagain(
|
||||||
|
+ ioctl(fd, LOOP_SET_BLOCK_SIZE, (unsigned long) blocksize) );
|
||||||
|
+ if (rc != 0) {
|
||||||
|
+ DBG(CXT, ul_debugobj(lc, "LOOP_SET_BLOCK_SIZE failed: %m"));
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
DBG(CXT, ul_debugobj(lc, "logical block size set"));
|
||||||
|
return 0;
|
||||||
|
@@ -1541,14 +1549,17 @@ int loopcxt_ioctl_blocksize(struct loopdev_cxt *lc, uint64_t blocksize)
|
||||||
|
|
||||||
|
int loopcxt_delete_device(struct loopdev_cxt *lc)
|
||||||
|
{
|
||||||
|
- int fd = loopcxt_get_fd(lc);
|
||||||
|
+ int rc, fd = loopcxt_get_fd(lc);
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- if (ioctl(fd, LOOP_CLR_FD, 0) < 0) {
|
||||||
|
+ DBG(SETUP, ul_debugobj(lc, "calling LOOP_SET_CLR_FD"));
|
||||||
|
+
|
||||||
|
+ rc = repeat_on_eagain( ioctl(fd, LOOP_CLR_FD, 0) );
|
||||||
|
+ if (rc != 0) {
|
||||||
|
DBG(CXT, ul_debugobj(lc, "LOOP_CLR_FD failed: %m"));
|
||||||
|
- return -errno;
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG(CXT, ul_debugobj(lc, "device removed"));
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
46
0041-loopdev-set-block_size-when-using-LOOP_CONFIGURE.patch
Normal file
46
0041-loopdev-set-block_size-when-using-LOOP_CONFIGURE.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
From bb387c7bb2d9112362077d6ac275f1ebc7c24023 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hideki EIRAKU <hdk@igel.co.jp>
|
||||||
|
Date: Wed, 25 May 2022 12:23:16 +0900
|
||||||
|
Subject: loopdev: set block_size when using LOOP_CONFIGURE
|
||||||
|
|
||||||
|
LOOP_CONFIGURE ioctl was introduced by commit
|
||||||
|
d5fd456c88aba4fcf77d35fe38024a8d5c814686. Since the previous
|
||||||
|
implementation set partscan flag but did not set block_size with the
|
||||||
|
LOOP_CONFIGURE ioctl, an issue fixed by commit
|
||||||
|
422f0e9f206a145c59a71333dad20d38cbbfc0c4 was reappeared. Setting
|
||||||
|
block_size in the LOOP_CONFIGURE ioctl parameter fixes the issue.
|
||||||
|
|
||||||
|
Addresses: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=2117203
|
||||||
|
Signed-off-by: Hideki EIRAKU <hdk@igel.co.jp>
|
||||||
|
---
|
||||||
|
lib/loopdev.c | 7 ++-----
|
||||||
|
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/loopdev.c b/lib/loopdev.c
|
||||||
|
index cceab2db1..d7184aba6 100644
|
||||||
|
--- a/lib/loopdev.c
|
||||||
|
+++ b/lib/loopdev.c
|
||||||
|
@@ -1382,6 +1382,8 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
|
||||||
|
* -- since Linux v5.8-rc1, commit 3448914e8cc550ba792d4ccc74471d1ca4293aae
|
||||||
|
*/
|
||||||
|
lc->config.fd = file_fd;
|
||||||
|
+ if (lc->blocksize > 0)
|
||||||
|
+ lc->config.block_size = lc->blocksize;
|
||||||
|
|
||||||
|
rc = repeat_on_eagain( ioctl(dev_fd, LOOP_CONFIGURE, &lc->config) );
|
||||||
|
if (rc != 0) {
|
||||||
|
@@ -1392,11 +1394,6 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
|
||||||
|
}
|
||||||
|
fallback = 1;
|
||||||
|
} else {
|
||||||
|
- if (lc->blocksize > 0
|
||||||
|
- && (rc = loopcxt_ioctl_blocksize(lc, lc->blocksize)) < 0) {
|
||||||
|
- errsv = -rc;
|
||||||
|
- goto err;
|
||||||
|
- }
|
||||||
|
DBG(SETUP, ul_debugobj(lc, "LOOP_CONFIGURE: OK"));
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
Summary: A collection of basic system utilities
|
Summary: A collection of basic system utilities
|
||||||
Name: util-linux
|
Name: util-linux
|
||||||
Version: 2.37.4
|
Version: 2.37.4
|
||||||
Release: 5%{?dist}
|
Release: 6%{?dist}
|
||||||
License: GPLv2 and GPLv2+ and LGPLv2+ and BSD with advertising and Public Domain
|
License: GPLv2 and GPLv2+ and LGPLv2+ and BSD with advertising and Public Domain
|
||||||
URL: http://en.wikipedia.org/wiki/Util-linux
|
URL: http://en.wikipedia.org/wiki/Util-linux
|
||||||
|
|
||||||
@ -143,6 +143,16 @@ Patch30: 0030-libblkid-update-documentation-of-BLOCK_SIZE-tag.patch
|
|||||||
Patch31: 0031-cfdisk-don-t-use-NULL-in-printf-coverity-scan.patch
|
Patch31: 0031-cfdisk-don-t-use-NULL-in-printf-coverity-scan.patch
|
||||||
Patch32: 0032-zramctl-fix-compiler-warning-Werror-maybe-uninitiali.patch
|
Patch32: 0032-zramctl-fix-compiler-warning-Werror-maybe-uninitiali.patch
|
||||||
Patch33: 0033-lib-path-make-ul_path_read_buffer-more-robust-coveri.patch
|
Patch33: 0033-lib-path-make-ul_path_read_buffer-more-robust-coveri.patch
|
||||||
|
# 2094216 - lslogins reports incorrect "Password is locked" status
|
||||||
|
Patch34: 0034-lslogins-improve-for-static-analyzer.patch
|
||||||
|
# 2117203 - RHEL-9.1: loop-overlay test failed
|
||||||
|
Patch35: 0035-mount-Fix-race-in-loop-device-reuse-code.patch
|
||||||
|
Patch36: 0036-loopdev-Properly-translate-errors-from-ul_path_read_.patch
|
||||||
|
Patch37: 0037-loopdev-Do-not-treat-errors-when-detecting-overlap-a.patch
|
||||||
|
Patch38: 0038-loopdev-add-retries-on-EAGAIN.patch
|
||||||
|
Patch39: 0039-lib-loopdev-remove-duplicate-code.patch
|
||||||
|
Patch40: 0040-lib-loopdev-consolidate-ioctls-calls-on-EAGAIN.patch
|
||||||
|
Patch41: 0041-loopdev-set-block_size-when-using-LOOP_CONFIGURE.patch
|
||||||
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@ -978,6 +988,10 @@ fi
|
|||||||
%{_libdir}/python*/site-packages/libmount/
|
%{_libdir}/python*/site-packages/libmount/
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Aug 10 2022 Karel Zak <kzak@redhat.com> 2.37.4-6
|
||||||
|
- fix #2094216 - lslogins reports incorrect "Password is locked" status
|
||||||
|
- fix #2117203 - loop-overlay test failed
|
||||||
|
|
||||||
* Fri Jul 22 2022 Karel Zak <kzak@redhat.com> 2.37.4-5
|
* Fri Jul 22 2022 Karel Zak <kzak@redhat.com> 2.37.4-5
|
||||||
- cleanup spec file build requiremnts
|
- cleanup spec file build requiremnts
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user