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:
parent
9a94b634a3
commit
bfd4e1f758
|
@ -164,6 +164,7 @@ extern int loopcxt_deinit_iterator(struct loopdev_cxt *lc);
|
||||||
extern int loopcxt_next(struct loopdev_cxt *lc);
|
extern int loopcxt_next(struct loopdev_cxt *lc);
|
||||||
|
|
||||||
extern int loopcxt_setup_device(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_delete_device(struct loopdev_cxt *lc);
|
||||||
extern int loopcxt_set_capacity(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);
|
extern int loopcxt_set_dio(struct loopdev_cxt *lc, unsigned long use_dio);
|
||||||
|
|
|
@ -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
|
* Associate the current device (see loopcxt_{set,get}_device()) with
|
||||||
* a file (see loopcxt_set_backing_file()).
|
* a file (see loopcxt_set_backing_file()).
|
||||||
|
@ -1328,6 +1328,40 @@ err:
|
||||||
return rc;
|
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 loopcxt_set_capacity(struct loopdev_cxt *lc)
|
||||||
{
|
{
|
||||||
int fd = loopcxt_get_fd(lc);
|
int fd = loopcxt_get_fd(lc);
|
||||||
|
|
Loading…
Reference in New Issue