dht: Remove pointer casting in layout handling

Small changes by Anand Avati <avati@gluster.com> over original submission:

Remove pointer casting (copy data to proper memory before using it). Fixes bug #493.
Hello,

See bug #493 for more information on this patch.

http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=493#c2

This patch assumes that the scope of disk_layout is local wherever it is
used. Seems correct, not really checked, though.

Greetings,

Hraban Luyat

Signed-off-by: Hraban Luyat <hraban@0brg.net>
Signed-off-by: Anand V. Avati <avati@blackhole.gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>

BUG: 493 (tcp + dht + armv5tel: ???brick: disk layout has invalid count 29696???)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=493
This commit is contained in:
Anand Avati 2010-02-07 04:30:20 +00:00 committed by Anand V. Avati
parent fd4523e667
commit 090a96d0a5
2 changed files with 15 additions and 9 deletions

View File

@ -217,7 +217,7 @@ int dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,
int dht_disk_layout_extract (xlator_t *this, dht_layout_t *layout,
int pos, int32_t **disk_layout_p);
int dht_disk_layout_merge (xlator_t *this, dht_layout_t *layout,
int pos, int32_t *disk_layout);
int pos, void *disk_layout_raw);
int dht_frame_return (call_frame_t *frame);

View File

@ -276,15 +276,18 @@ out:
int
dht_disk_layout_merge (xlator_t *this, dht_layout_t *layout,
int pos, int32_t *disk_layout)
int pos, void *disk_layout_raw)
{
int cnt = 0;
int type = 0;
int start_off = 0;
int stop_off = 0;
int disk_layout[4];
/* TODO: assert disk_layout_ptr is of required length */
memcpy (disk_layout, disk_layout_raw, sizeof (disk_layout));
cnt = ntoh32 (disk_layout[0]);
if (cnt != 1) {
gf_log (this->name, GF_LOG_DEBUG,
@ -316,7 +319,7 @@ dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,
int i = 0;
int ret = -1;
int err = -1;
int32_t *disk_layout = NULL;
void *disk_layout_raw = NULL;
if (op_ret != 0) {
@ -339,7 +342,7 @@ dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,
if (xattr) {
/* during lookup and not mkdir */
ret = dict_get_ptr (xattr, "trusted.glusterfs.dht",
VOID(&disk_layout));
&disk_layout_raw);
}
if (ret != 0) {
@ -351,7 +354,7 @@ dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,
goto out;
}
ret = dht_disk_layout_merge (this, layout, i, disk_layout);
ret = dht_disk_layout_merge (this, layout, i, disk_layout_raw);
if (ret != 0) {
gf_log (this->name, GF_LOG_DEBUG,
"layout merge from subvolume %s failed",
@ -607,7 +610,8 @@ dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,
int ret = 0;
int err = 0;
int dict_ret = 0;
int32_t *disk_layout = NULL;
int32_t disk_layout[4];
void *disk_layout_raw = NULL;
int32_t count = -1;
uint32_t start_off = -1;
uint32_t stop_off = -1;
@ -641,8 +645,8 @@ dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,
}
dict_ret = dict_get_ptr (xattr, "trusted.glusterfs.dht",
VOID(&disk_layout));
&disk_layout_raw);
if (dict_ret < 0) {
if (err == 0) {
gf_log (this->name, GF_LOG_DEBUG,
@ -650,7 +654,9 @@ dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,
ret = -1;
}
goto out;
}
}
memcpy (disk_layout, disk_layout_raw, sizeof (disk_layout));
count = ntoh32 (disk_layout[0]);
if (count != 1) {