mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
orangefs: don't put readdir slot twice
This was quite an oversight. After a readdir, the module could not be unloaded, the number of slots is wrong, and memory near the slot bitmap is possibly corrupt. Oops. Signed-off-by: Martin Brandenburg <martin@omnibond.com>
This commit is contained in:
parent
f55532a0c0
commit
641bb3246d
@ -235,7 +235,7 @@ get_new_buffer_index:
|
|||||||
if (ret == -EIO && op_state_purged(new_op)) {
|
if (ret == -EIO && op_state_purged(new_op)) {
|
||||||
gossip_err("%s: Client is down. Aborting readdir call.\n",
|
gossip_err("%s: Client is down. Aborting readdir call.\n",
|
||||||
__func__);
|
__func__);
|
||||||
goto out_slot;
|
goto out_free_op;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0 || new_op->downcall.status != 0) {
|
if (ret < 0 || new_op->downcall.status != 0) {
|
||||||
@ -244,14 +244,14 @@ get_new_buffer_index:
|
|||||||
new_op->downcall.status);
|
new_op->downcall.status);
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
ret = new_op->downcall.status;
|
ret = new_op->downcall.status;
|
||||||
goto out_slot;
|
goto out_free_op;
|
||||||
}
|
}
|
||||||
|
|
||||||
dents_buf = new_op->downcall.trailer_buf;
|
dents_buf = new_op->downcall.trailer_buf;
|
||||||
if (dents_buf == NULL) {
|
if (dents_buf == NULL) {
|
||||||
gossip_err("Invalid NULL buffer in readdir response\n");
|
gossip_err("Invalid NULL buffer in readdir response\n");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out_slot;
|
goto out_free_op;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes_decoded = decode_dirents(dents_buf, new_op->downcall.trailer_size,
|
bytes_decoded = decode_dirents(dents_buf, new_op->downcall.trailer_size,
|
||||||
@ -363,8 +363,6 @@ out_destroy_handle:
|
|||||||
out_vfree:
|
out_vfree:
|
||||||
gossip_debug(GOSSIP_DIR_DEBUG, "vfree %p\n", dents_buf);
|
gossip_debug(GOSSIP_DIR_DEBUG, "vfree %p\n", dents_buf);
|
||||||
vfree(dents_buf);
|
vfree(dents_buf);
|
||||||
out_slot:
|
|
||||||
orangefs_readdir_index_put(buffer_index);
|
|
||||||
out_free_op:
|
out_free_op:
|
||||||
op_release(new_op);
|
op_release(new_op);
|
||||||
gossip_debug(GOSSIP_DIR_DEBUG, "orangefs_readdir returning %d\n", ret);
|
gossip_debug(GOSSIP_DIR_DEBUG, "orangefs_readdir returning %d\n", ret);
|
||||||
|
Loading…
Reference in New Issue
Block a user