loopdev: Implememt loopcxt_set_status()

Implement stand-alone loopcxt_set_status(). It allows manipulation with some
loop device parameters even if it is initialized.

Its function is limited by the kernel implementation, and only a small subset of
changes is allowed.

For more see linux/drivers/block/loop.c:loop_set_status()

Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
This commit is contained in:
Stanislav Brabec 2016-08-02 19:57:56 +02:00 committed by Karel Zak
parent 9a94b634a3
commit bfd4e1f758
2 changed files with 36 additions and 1 deletions

View File

@ -164,6 +164,7 @@ extern int loopcxt_deinit_iterator(struct loopdev_cxt *lc);
extern int loopcxt_next(struct loopdev_cxt *lc);
extern int loopcxt_setup_device(struct loopdev_cxt *lc);
extern int loopcxt_set_status(struct loopdev_cxt *lc);
extern int loopcxt_delete_device(struct loopdev_cxt *lc);
extern int loopcxt_set_capacity(struct loopdev_cxt *lc);
extern int loopcxt_set_dio(struct loopdev_cxt *lc, unsigned long use_dio);

View File

@ -1204,7 +1204,7 @@ static int loopcxt_check_size(struct loopdev_cxt *lc, int file_fd)
}
/*
* @cl: context
* @lc: context
*
* Associate the current device (see loopcxt_{set,get}_device()) with
* a file (see loopcxt_set_backing_file()).
@ -1328,6 +1328,40 @@ err:
return rc;
}
/*
* @lc: context
*
* Update status of the current device (see loopcxt_{set,get}_device()).
*
* Note that once initialized, kernel accepts only selected changes:
* LO_FLAGS_AUTOCLEAR and LO_FLAGS_PARTSCAN
* For more see linux/drivers/block/loop.c:loop_set_status()
*
* Returns: <0 on error, 0 on success.
*/
int loopcxt_set_status(struct loopdev_cxt *lc)
{
int dev_fd, rc = -1;
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 (ioctl(dev_fd, LOOP_SET_STATUS64, &lc->info)) {
rc = -errno;
DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64 failed: %m"));
return rc;
}
DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64: OK"));
return 0;
}
int loopcxt_set_capacity(struct loopdev_cxt *lc)
{
int fd = loopcxt_get_fd(lc);