mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
A setgeometry implementation. [untested]
This commit is contained in:
parent
435c852fb8
commit
6ef080af04
@ -1,5 +1,6 @@
|
|||||||
Version 1.02.04 -
|
Version 1.02.04 -
|
||||||
============================
|
============================
|
||||||
|
Add setgeometry.
|
||||||
|
|
||||||
Version 1.02.03 - 7 Feb 2006
|
Version 1.02.03 - 7 Feb 2006
|
||||||
============================
|
============================
|
||||||
|
@ -108,3 +108,4 @@ dm_hash_get_data
|
|||||||
dm_hash_get_first
|
dm_hash_get_first
|
||||||
dm_hash_get_next
|
dm_hash_get_next
|
||||||
dm_set_selinux_context
|
dm_set_selinux_context
|
||||||
|
dm_task_set_geometry
|
||||||
|
@ -116,6 +116,7 @@ static struct cmd_data _cmd_data_v1[] = {
|
|||||||
{ "mknodes", 0, {4, 0, 0} },
|
{ "mknodes", 0, {4, 0, 0} },
|
||||||
{ "versions", 0, {4, 1, 0} },
|
{ "versions", 0, {4, 1, 0} },
|
||||||
{ "message", 0, {4, 2, 0} },
|
{ "message", 0, {4, 2, 0} },
|
||||||
|
{ "setgeometry",0, {4, 6, 0} },
|
||||||
};
|
};
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
|
@ -103,6 +103,9 @@ static struct cmd_data _cmd_data_v4[] = {
|
|||||||
#ifdef DM_TARGET_MSG
|
#ifdef DM_TARGET_MSG
|
||||||
{"message", DM_TARGET_MSG, {4, 2, 0}},
|
{"message", DM_TARGET_MSG, {4, 2, 0}},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef DM_DEV_SET_GEOMETRY
|
||||||
|
{"setgeometry", DM_DEV_SET_GEOMETRY, {4, 6, 0}},
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
@ -1001,6 +1004,23 @@ int dm_task_set_sector(struct dm_task *dmt, uint64_t sector)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dm_task_set_geometry(struct dm_task *dmt, const char *cylinders, const char *heads, const char *sectors, const char *start)
|
||||||
|
{
|
||||||
|
size_t len = strlen(cylinders) + 1 + strlen(heads) + 1 + strlen(sectors) + 1 + strlen(start) + 1;
|
||||||
|
|
||||||
|
if (!(dmt->geometry = dm_malloc(len))) {
|
||||||
|
log_error("dm_task_set_geometry: dm_malloc failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sprintf(dmt->geometry, "%s %s %s %s", cylinders, heads, sectors, start) < 0) {
|
||||||
|
log_error("dm_task_set_geometry: sprintf failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int dm_task_no_open_count(struct dm_task *dmt)
|
int dm_task_no_open_count(struct dm_task *dmt)
|
||||||
{
|
{
|
||||||
dmt->no_open_count = 1;
|
dmt->no_open_count = 1;
|
||||||
@ -1123,11 +1143,26 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt, unsigned repeat_count)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (count && dmt->geometry) {
|
||||||
|
log_error("targets and geometry are incompatible");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (dmt->newname && (dmt->sector || dmt->message)) {
|
if (dmt->newname && (dmt->sector || dmt->message)) {
|
||||||
log_error("message and newname are incompatible");
|
log_error("message and newname are incompatible");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dmt->newname && dmt->geometry) {
|
||||||
|
log_error("geometry and newname are incompatible");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dmt->geometry && (dmt->sector || dmt->message)) {
|
||||||
|
log_error("geometry and message are incompatible");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (dmt->sector && !dmt->message) {
|
if (dmt->sector && !dmt->message) {
|
||||||
log_error("message is required with sector");
|
log_error("message is required with sector");
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1139,6 +1174,9 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt, unsigned repeat_count)
|
|||||||
if (dmt->message)
|
if (dmt->message)
|
||||||
len += sizeof(struct dm_target_msg) + strlen(dmt->message) + 1;
|
len += sizeof(struct dm_target_msg) + strlen(dmt->message) + 1;
|
||||||
|
|
||||||
|
if (dmt->geometry)
|
||||||
|
len += strlen(dmt->geometry) + 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Give len a minimum size so that we have space to store
|
* Give len a minimum size so that we have space to store
|
||||||
* dependencies or status information.
|
* dependencies or status information.
|
||||||
@ -1205,6 +1243,9 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt, unsigned repeat_count)
|
|||||||
strcpy(tmsg->message, dmt->message);
|
strcpy(tmsg->message, dmt->message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dmt->geometry)
|
||||||
|
strcpy(b, dmt->geometry);
|
||||||
|
|
||||||
return dmi;
|
return dmi;
|
||||||
|
|
||||||
bad:
|
bad:
|
||||||
|
@ -50,6 +50,7 @@ struct dm_task {
|
|||||||
} dmi;
|
} dmi;
|
||||||
char *newname;
|
char *newname;
|
||||||
char *message;
|
char *message;
|
||||||
|
char *geometry;
|
||||||
uint64_t sector;
|
uint64_t sector;
|
||||||
int no_open_count;
|
int no_open_count;
|
||||||
int skip_lockfs;
|
int skip_lockfs;
|
||||||
|
@ -80,7 +80,9 @@ enum {
|
|||||||
|
|
||||||
DM_DEVICE_LIST_VERSIONS,
|
DM_DEVICE_LIST_VERSIONS,
|
||||||
|
|
||||||
DM_DEVICE_TARGET_MSG
|
DM_DEVICE_TARGET_MSG,
|
||||||
|
|
||||||
|
DM_DEVICE_SET_GEOMETRY
|
||||||
};
|
};
|
||||||
|
|
||||||
struct dm_task;
|
struct dm_task;
|
||||||
@ -145,6 +147,7 @@ int dm_task_set_uid(struct dm_task *dmt, uid_t uid);
|
|||||||
int dm_task_set_gid(struct dm_task *dmt, gid_t gid);
|
int dm_task_set_gid(struct dm_task *dmt, gid_t gid);
|
||||||
int dm_task_set_mode(struct dm_task *dmt, mode_t mode);
|
int dm_task_set_mode(struct dm_task *dmt, mode_t mode);
|
||||||
int dm_task_set_event_nr(struct dm_task *dmt, uint32_t event_nr);
|
int dm_task_set_event_nr(struct dm_task *dmt, uint32_t event_nr);
|
||||||
|
int dm_task_set_geometry(struct dm_task *dmt, const char *cylinders, const char *heads, const char *sectors, const char *start);
|
||||||
int dm_task_set_message(struct dm_task *dmt, const char *message);
|
int dm_task_set_message(struct dm_task *dmt, const char *message);
|
||||||
int dm_task_set_sector(struct dm_task *dmt, uint64_t sector);
|
int dm_task_set_sector(struct dm_task *dmt, uint64_t sector);
|
||||||
int dm_task_no_open_count(struct dm_task *dmt);
|
int dm_task_no_open_count(struct dm_task *dmt);
|
||||||
|
@ -510,3 +510,4 @@ out:
|
|||||||
dm_task_destroy(dmt);
|
dm_task_destroy(dmt);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,6 +508,39 @@ static int _message(int argc, char **argv, void *data)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _setgeometry(int argc, char **argv, void *data)
|
||||||
|
{
|
||||||
|
int r = 0;
|
||||||
|
struct dm_task *dmt;
|
||||||
|
|
||||||
|
if (!(dmt = dm_task_create(DM_DEVICE_SET_GEOMETRY)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (_switches[UUID_ARG] || _switches[MAJOR_ARG]) {
|
||||||
|
if (!_set_task_device(dmt, NULL, 0))
|
||||||
|
goto out;
|
||||||
|
} else {
|
||||||
|
if (!_set_task_device(dmt, argv[1], 0))
|
||||||
|
goto out;
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dm_task_set_geometry(dmt, argv[1], argv[2], argv[3], argv[4]))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* run the task */
|
||||||
|
if (!dm_task_run(dmt))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
r = 1;
|
||||||
|
|
||||||
|
out:
|
||||||
|
dm_task_destroy(dmt);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static int _version(int argc, char **argv, void *data)
|
static int _version(int argc, char **argv, void *data)
|
||||||
{
|
{
|
||||||
char version[80];
|
char version[80];
|
||||||
@ -1326,6 +1359,7 @@ static struct command _commands[] = {
|
|||||||
{"mknodes", "[<device>]", 0, 1, _mknodes},
|
{"mknodes", "[<device>]", 0, 1, _mknodes},
|
||||||
{"targets", "", 0, 0, _targets},
|
{"targets", "", 0, 0, _targets},
|
||||||
{"version", "", 0, 0, _version},
|
{"version", "", 0, 0, _version},
|
||||||
|
{"setgeometry", "<device> <cyl> <head> <sect> <start>", 5, 5, _setgeometry},
|
||||||
{NULL, NULL, 0, 0, NULL}
|
{NULL, NULL, 0, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user