Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 288897
b: refs/heads/master
c: adc80ae
h: refs/heads/master
i:
  288895: a919aa2
v: v3
  • Loading branch information
K. Y. Srinivasan authored and Greg Kroah-Hartman committed Mar 16, 2012
1 parent 6d33dd0 commit bc8c3d4
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: db425334e5bb7fa65bbbd7bea9d79842f65bcf45
refs/heads/master: adc80ae60eae24a43a357bf5b30fb496f34aa605
7 changes: 4 additions & 3 deletions trunk/drivers/hv/hv_kvp.c
Original file line number Diff line number Diff line change
Expand Up @@ -289,14 +289,15 @@ kvp_respond_to_host(char *key, char *value, int error)


/*
* If the error parameter is set, terminate the host's enumeration.
* If the error parameter is set, terminate the host's enumeration
* on this pool.
*/
if (error) {
/*
* Something failed or the we have timedout;
* terminate the host-side iteration by returning an error.
* terminate the current host-side iteration.
*/
icmsghdrp->status = HV_E_FAIL;
icmsghdrp->status = HV_S_CONT;
goto response_done;
}

Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/hyperv.h
Original file line number Diff line number Diff line change
Expand Up @@ -952,6 +952,7 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver);

#define HV_S_OK 0x00000000
#define HV_E_FAIL 0x80004005
#define HV_S_CONT 0x80070103
#define HV_ERROR_NOT_SUPPORTED 0x80070032
#define HV_ERROR_MACHINE_LOCKED 0x800704F7

Expand Down
124 changes: 117 additions & 7 deletions trunk/tools/hv/hv_kvp_daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,51 @@ static void kvp_update_file(int pool)
kvp_release_lock(pool);
}

static void kvp_update_mem_state(int pool)
{
FILE *filep;
size_t records_read = 0;
struct kvp_record *record = kvp_file_info[pool].records;
struct kvp_record *readp;
int num_blocks = kvp_file_info[pool].num_blocks;
int alloc_unit = sizeof(struct kvp_record) * ENTRIES_PER_BLOCK;

kvp_acquire_lock(pool);

filep = fopen(kvp_file_info[pool].fname, "r");
if (!filep) {
kvp_release_lock(pool);
syslog(LOG_ERR, "Failed to open file, pool: %d", pool);
exit(-1);
}
while (!feof(filep)) {
readp = &record[records_read];
records_read += fread(readp, sizeof(struct kvp_record),
ENTRIES_PER_BLOCK * num_blocks,
filep);

if (!feof(filep)) {
/*
* We have more data to read.
*/
num_blocks++;
record = realloc(record, alloc_unit * num_blocks);

if (record == NULL) {
syslog(LOG_ERR, "malloc failed");
exit(-1);
}
continue;
}
break;
}

kvp_file_info[pool].num_blocks = num_blocks;
kvp_file_info[pool].records = record;
kvp_file_info[pool].num_records = records_read;

kvp_release_lock(pool);
}
static int kvp_file_init(void)
{
int ret, fd;
Expand Down Expand Up @@ -223,8 +268,16 @@ static int kvp_key_delete(int pool, __u8 *key, int key_size)
{
int i;
int j, k;
int num_records = kvp_file_info[pool].num_records;
struct kvp_record *record = kvp_file_info[pool].records;
int num_records;
struct kvp_record *record;

/*
* First update the in-memory state.
*/
kvp_update_mem_state(pool);

num_records = kvp_file_info[pool].num_records;
record = kvp_file_info[pool].records;

for (i = 0; i < num_records; i++) {
if (memcmp(key, record[i].key, key_size))
Expand Down Expand Up @@ -259,14 +312,23 @@ static int kvp_key_add_or_modify(int pool, __u8 *key, int key_size, __u8 *value,
{
int i;
int j, k;
int num_records = kvp_file_info[pool].num_records;
struct kvp_record *record = kvp_file_info[pool].records;
int num_blocks = kvp_file_info[pool].num_blocks;
int num_records;
struct kvp_record *record;
int num_blocks;

if ((key_size > HV_KVP_EXCHANGE_MAX_KEY_SIZE) ||
(value_size > HV_KVP_EXCHANGE_MAX_VALUE_SIZE))
return 1;

/*
* First update the in-memory state.
*/
kvp_update_mem_state(pool);

num_records = kvp_file_info[pool].num_records;
record = kvp_file_info[pool].records;
num_blocks = kvp_file_info[pool].num_blocks;

for (i = 0; i < num_records; i++) {
if (memcmp(key, record[i].key, key_size))
continue;
Expand Down Expand Up @@ -304,13 +366,21 @@ static int kvp_get_value(int pool, __u8 *key, int key_size, __u8 *value,
int value_size)
{
int i;
int num_records = kvp_file_info[pool].num_records;
struct kvp_record *record = kvp_file_info[pool].records;
int num_records;
struct kvp_record *record;

if ((key_size > HV_KVP_EXCHANGE_MAX_KEY_SIZE) ||
(value_size > HV_KVP_EXCHANGE_MAX_VALUE_SIZE))
return 1;

/*
* First update the in-memory state.
*/
kvp_update_mem_state(pool);

num_records = kvp_file_info[pool].num_records;
record = kvp_file_info[pool].records;

for (i = 0; i < num_records; i++) {
if (memcmp(key, record[i].key, key_size))
continue;
Expand All @@ -324,6 +394,31 @@ static int kvp_get_value(int pool, __u8 *key, int key_size, __u8 *value,
return 1;
}

static void kvp_pool_enumerate(int pool, int index, __u8 *key, int key_size,
__u8 *value, int value_size)
{
struct kvp_record *record;

/*
* First update our in-memory database.
*/
kvp_update_mem_state(pool);
record = kvp_file_info[pool].records;

if (index >= kvp_file_info[pool].num_records) {
/*
* This is an invalid index; terminate enumeration;
* - a NULL value will do the trick.
*/
strcpy(value, "");
return;
}

memcpy(key, record[index].key, key_size);
memcpy(value, record[index].value, value_size);
}


void kvp_get_os_info(void)
{
FILE *file;
Expand Down Expand Up @@ -678,6 +773,21 @@ int main(void)
if (hv_msg->kvp_hdr.operation != KVP_OP_ENUMERATE)
goto kvp_done;

/*
* If the pool is KVP_POOL_AUTO, dynamically generate
* both the key and the value; if not read from the
* appropriate pool.
*/
if (hv_msg->kvp_hdr.pool != KVP_POOL_AUTO) {
kvp_pool_enumerate(hv_msg->kvp_hdr.pool,
hv_msg->body.kvp_enum_data.index,
hv_msg->body.kvp_enum_data.data.key,
HV_KVP_EXCHANGE_MAX_KEY_SIZE,
hv_msg->body.kvp_enum_data.data.value,
HV_KVP_EXCHANGE_MAX_VALUE_SIZE);
goto kvp_done;
}

hv_msg = (struct hv_kvp_msg *)incoming_cn_msg->data;
key_name = (char *)hv_msg->body.kvp_enum_data.data.key;
key_value = (char *)hv_msg->body.kvp_enum_data.data.value;
Expand Down

0 comments on commit bc8c3d4

Please sign in to comment.