summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorMartin Brandenburg <martin@omnibond.com>2016-03-28 17:18:27 -0400
committerMartin Brandenburg <martin@omnibond.com>2016-03-31 12:06:00 -0400
commit641bb3246dbb64c0b4a0b6dfa6a024e82c155533 (patch)
tree7bec53fea5f180d2f90e27a83d64f74b331c1984 /fs
parentf55532a0c0b8bb6148f4e07853b876ef73bc69ca (diff)
downloadlinux-641bb3246dbb64c0b4a0b6dfa6a024e82c155533.tar.gz
linux-641bb3246dbb64c0b4a0b6dfa6a024e82c155533.tar.bz2
linux-641bb3246dbb64c0b4a0b6dfa6a024e82c155533.zip
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/orangefs/dir.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/fs/orangefs/dir.c b/fs/orangefs/dir.c
index f30b6ecacdd1..ba7dec40771e 100644
--- a/fs/orangefs/dir.c
+++ b/fs/orangefs/dir.c
@@ -235,7 +235,7 @@ get_new_buffer_index:
if (ret == -EIO && op_state_purged(new_op)) {
gossip_err("%s: Client is down. Aborting readdir call.\n",
__func__);
- goto out_slot;
+ goto out_free_op;
}
if (ret < 0 || new_op->downcall.status != 0) {
@@ -244,14 +244,14 @@ get_new_buffer_index:
new_op->downcall.status);
if (ret >= 0)
ret = new_op->downcall.status;
- goto out_slot;
+ goto out_free_op;
}
dents_buf = new_op->downcall.trailer_buf;
if (dents_buf == NULL) {
gossip_err("Invalid NULL buffer in readdir response\n");
ret = -ENOMEM;
- goto out_slot;
+ goto out_free_op;
}
bytes_decoded = decode_dirents(dents_buf, new_op->downcall.trailer_size,
@@ -363,8 +363,6 @@ out_destroy_handle:
out_vfree:
gossip_debug(GOSSIP_DIR_DEBUG, "vfree %p\n", dents_buf);
vfree(dents_buf);
-out_slot:
- orangefs_readdir_index_put(buffer_index);
out_free_op:
op_release(new_op);
gossip_debug(GOSSIP_DIR_DEBUG, "orangefs_readdir returning %d\n", ret);