};
#ifndef LOOP_CONFIGURE
-#define LOOP_CONFIGURE 0x4C0A
+/*
+ * Since Linux v5.8-rc1 (commit 3448914e8cc550ba792d4ccc74471d1ca4293aae)
+ */
+# define LOOP_CONFIGURE 0x4C0A
struct loop_config {
uint32_t fd;
uint32_t block_size;
DBG(SETUP, ul_debugobj(lc, "device open: OK"));
+ /*
+ * Atomic way to configure all by one ioctl call
+ * -- since Linux v5.8-rc1, commit 3448914e8cc550ba792d4ccc74471d1ca4293aae
+ */
lc->config.fd = file_fd;
if (ioctl(dev_fd, LOOP_CONFIGURE, &lc->config) < 0) {
rc = -errno;
errsv = errno;
- if (errno != EINVAL)
- {
+ if (errno != EINVAL) {
DBG(SETUP, ul_debugobj(lc, "LOOP_CONFIGURE failed: %m"));
goto err;
}
fallback = 1;
- }
- else
- {
+ } 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"));
}
+ /*
+ * Old deprecated way; first assign backing file FD and then in the
+ * second step set loop device properties.
+ */
if (fallback) {
- /*
- * Set FD
- */
if (ioctl(dev_fd, LOOP_SET_FD, file_fd) < 0) {
rc = -errno;
errsv = errno;
if (again)
xusleep(250000);
} while (again);
+
if (err) {
rc = -errno;
errsv = errno;