diff --git a/0034-lslogins-improve-for-static-analyzer.patch b/0034-lslogins-improve-for-static-analyzer.patch
new file mode 100644
index 0000000..ae0bd20
--- /dev/null
+++ b/0034-lslogins-improve-for-static-analyzer.patch
@@ -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
+
diff --git a/0035-mount-Fix-race-in-loop-device-reuse-code.patch b/0035-mount-Fix-race-in-loop-device-reuse-code.patch
new file mode 100644
index 0000000..bfcf6ad
--- /dev/null
+++ b/0035-mount-Fix-race-in-loop-device-reuse-code.patch
@@ -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
+
diff --git a/0036-loopdev-Properly-translate-errors-from-ul_path_read_.patch b/0036-loopdev-Properly-translate-errors-from-ul_path_read_.patch
new file mode 100644
index 0000000..dbf4040
--- /dev/null
+++ b/0036-loopdev-Properly-translate-errors-from-ul_path_read_.patch
@@ -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
+
diff --git a/0037-loopdev-Do-not-treat-errors-when-detecting-overlap-a.patch b/0037-loopdev-Do-not-treat-errors-when-detecting-overlap-a.patch
new file mode 100644
index 0000000..b3955a7
--- /dev/null
+++ b/0037-loopdev-Do-not-treat-errors-when-detecting-overlap-a.patch
@@ -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
+
diff --git a/0038-loopdev-add-retries-on-EAGAIN.patch b/0038-loopdev-add-retries-on-EAGAIN.patch
new file mode 100644
index 0000000..bce6199
--- /dev/null
+++ b/0038-loopdev-add-retries-on-EAGAIN.patch
@@ -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
+
diff --git a/0039-lib-loopdev-remove-duplicate-code.patch b/0039-lib-loopdev-remove-duplicate-code.patch
new file mode 100644
index 0000000..0854bd0
--- /dev/null
+++ b/0039-lib-loopdev-remove-duplicate-code.patch
@@ -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
+
diff --git a/0040-lib-loopdev-consolidate-ioctls-calls-on-EAGAIN.patch b/0040-lib-loopdev-consolidate-ioctls-calls-on-EAGAIN.patch
new file mode 100644
index 0000000..bf8f0d3
--- /dev/null
+++ b/0040-lib-loopdev-consolidate-ioctls-calls-on-EAGAIN.patch
@@ -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
+
diff --git a/0041-loopdev-set-block_size-when-using-LOOP_CONFIGURE.patch b/0041-loopdev-set-block_size-when-using-LOOP_CONFIGURE.patch
new file mode 100644
index 0000000..97d5dfd
--- /dev/null
+++ b/0041-loopdev-set-block_size-when-using-LOOP_CONFIGURE.patch
@@ -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
+
diff --git a/util-linux.spec b/util-linux.spec
index 7ce0b22..ce2e1d7 100644
--- a/util-linux.spec
+++ b/util-linux.spec
@@ -2,7 +2,7 @@
 Summary: A collection of basic system utilities
 Name: util-linux
 Version: 2.37.4
-Release: 5%{?dist}
+Release: 6%{?dist}
 License: GPLv2 and GPLv2+ and LGPLv2+ and BSD with advertising and Public Domain
 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
 Patch32: 0032-zramctl-fix-compiler-warning-Werror-maybe-uninitiali.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
@@ -978,6 +988,10 @@ fi
 %{_libdir}/python*/site-packages/libmount/
 
 %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
 - cleanup spec file build requiremnts