[PATCH] device-mapper ioctl: add skip lock_fs flag
Add ioctl DM_SKIP_LOCKFS_FLAG for userspace to request that lock_fs is bypassed when suspending a device. There's no change to the behaviour of existing code that doesn't know about the new flag. Signed-off-by: Alasdair G Kergon <agk@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
aa8d7c2fbe
commit
6da487dcc0
|
@ -693,14 +693,18 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)
|
||||||
static int do_suspend(struct dm_ioctl *param)
|
static int do_suspend(struct dm_ioctl *param)
|
||||||
{
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
int do_lockfs = 1;
|
||||||
struct mapped_device *md;
|
struct mapped_device *md;
|
||||||
|
|
||||||
md = find_device(param);
|
md = find_device(param);
|
||||||
if (!md)
|
if (!md)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
|
if (param->flags & DM_SKIP_LOCKFS_FLAG)
|
||||||
|
do_lockfs = 0;
|
||||||
|
|
||||||
if (!dm_suspended(md))
|
if (!dm_suspended(md))
|
||||||
r = dm_suspend(md, 1);
|
r = dm_suspend(md, do_lockfs);
|
||||||
|
|
||||||
if (!r)
|
if (!r)
|
||||||
r = __dev_status(md, param);
|
r = __dev_status(md, param);
|
||||||
|
@ -712,6 +716,7 @@ static int do_suspend(struct dm_ioctl *param)
|
||||||
static int do_resume(struct dm_ioctl *param)
|
static int do_resume(struct dm_ioctl *param)
|
||||||
{
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
int do_lockfs = 1;
|
||||||
struct hash_cell *hc;
|
struct hash_cell *hc;
|
||||||
struct mapped_device *md;
|
struct mapped_device *md;
|
||||||
struct dm_table *new_map;
|
struct dm_table *new_map;
|
||||||
|
@ -737,8 +742,10 @@ static int do_resume(struct dm_ioctl *param)
|
||||||
/* Do we need to load a new map ? */
|
/* Do we need to load a new map ? */
|
||||||
if (new_map) {
|
if (new_map) {
|
||||||
/* Suspend if it isn't already suspended */
|
/* Suspend if it isn't already suspended */
|
||||||
|
if (param->flags & DM_SKIP_LOCKFS_FLAG)
|
||||||
|
do_lockfs = 0;
|
||||||
if (!dm_suspended(md))
|
if (!dm_suspended(md))
|
||||||
dm_suspend(md, 1);
|
dm_suspend(md, do_lockfs);
|
||||||
|
|
||||||
r = dm_swap_table(md, new_map);
|
r = dm_swap_table(md, new_map);
|
||||||
if (r) {
|
if (r) {
|
||||||
|
|
|
@ -272,9 +272,9 @@ typedef char ioctl_struct[308];
|
||||||
#define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl)
|
#define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl)
|
||||||
|
|
||||||
#define DM_VERSION_MAJOR 4
|
#define DM_VERSION_MAJOR 4
|
||||||
#define DM_VERSION_MINOR 4
|
#define DM_VERSION_MINOR 5
|
||||||
#define DM_VERSION_PATCHLEVEL 0
|
#define DM_VERSION_PATCHLEVEL 0
|
||||||
#define DM_VERSION_EXTRA "-ioctl (2005-01-12)"
|
#define DM_VERSION_EXTRA "-ioctl (2005-10-04)"
|
||||||
|
|
||||||
/* Status bits */
|
/* Status bits */
|
||||||
#define DM_READONLY_FLAG (1 << 0) /* In/Out */
|
#define DM_READONLY_FLAG (1 << 0) /* In/Out */
|
||||||
|
@ -301,8 +301,13 @@ typedef char ioctl_struct[308];
|
||||||
#define DM_BUFFER_FULL_FLAG (1 << 8) /* Out */
|
#define DM_BUFFER_FULL_FLAG (1 << 8) /* Out */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set this to improve performance when you aren't going to use open_count
|
* Set this to improve performance when you aren't going to use open_count.
|
||||||
*/
|
*/
|
||||||
#define DM_SKIP_BDGET_FLAG (1 << 9) /* In */
|
#define DM_SKIP_BDGET_FLAG (1 << 9) /* In */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set this to avoid attempting to freeze any filesystem when suspending.
|
||||||
|
*/
|
||||||
|
#define DM_SKIP_LOCKFS_FLAG (1 << 10) /* In */
|
||||||
|
|
||||||
#endif /* _LINUX_DM_IOCTL_H */
|
#endif /* _LINUX_DM_IOCTL_H */
|
||||||
|
|
Loading…
Reference in New Issue