|
|
|
@ -1335,32 +1335,33 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
|
|
|
|
|
|
|
|
|
|
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; |
|
|
|
@ -1382,6 +1383,7 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
|
|
|
|
|
if (again) |
|
|
|
|
xusleep(250000); |
|
|
|
|
} while (again); |
|
|
|
|
|
|
|
|
|
if (err) { |
|
|
|
|
rc = -errno; |
|
|
|
|
errsv = errno; |
|
|
|
|