summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Darcy <jdarcy@redhat.com>2014-01-15 00:44:48 +0000
committerJeff Darcy <jdarcy@redhat.com>2014-01-22 16:10:37 +0000
commit007182f1aad9d14e8d5bc7771d500b35026f0afa (patch)
tree7d59e8456343017fe1c59248ac433f0d49bbb274
parent3920b73526e2e2a4bf3187c5d9d68bb140f85d7f (diff)
Fix write-queuing logic.
The write path for followers would call STACK_WIND without incrementing ictx->active first. Therefore, when we got to nsr_writev_complete, we'd decrement from zero (overflow). That write would succeed, but then the next would see ictx->active was set and queue instead of executing. Change-Id: I05714165d68b91abfc7f274ef9f011204dbe496f Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
-rwxr-xr-xtests/basic/nsr.t2
-rw-r--r--xlators/cluster/nsr-server/src/all-templates.c13
2 files changed, 9 insertions, 6 deletions
diff --git a/tests/basic/nsr.t b/tests/basic/nsr.t
index 5d6faf78e..5dd97f2bf 100755
--- a/tests/basic/nsr.t
+++ b/tests/basic/nsr.t
@@ -13,7 +13,7 @@ function get_rep_count {
}
function ping_file {
- dd if=/dev/urandom of=$1 bs=4k count=1 2> /dev/null
+ dd if=/dev/urandom of=$1 bs=4k count=100 2> /dev/null
}
cleanup
diff --git a/xlators/cluster/nsr-server/src/all-templates.c b/xlators/cluster/nsr-server/src/all-templates.c
index 7300973d5..5a62ae507 100644
--- a/xlators/cluster/nsr-server/src/all-templates.c
+++ b/xlators/cluster/nsr-server/src/all-templates.c
@@ -258,11 +258,13 @@ nsr_$NAME$_complete (call_frame_t *frame, void *cookie, xlator_t *this,
#endif
#if defined(NSR_CG_QUEUE)
- nsr_inode_ctx_t *ictx = nsr_get_inode_ctx(this,local->fd->inode);
+ nsr_inode_ctx_t *ictx;
nsr_local_t *next;
- if (ictx) {
- LOCK(&ictx->lock);
- list_del(&local->qlinks);
+ if (local->qlinks.next != &local->qlinks) {
+ list_del(&local->qlinks);
+ ictx = nsr_get_inode_ctx(this,local->fd->inode);
+ if (ictx) {
+ LOCK(&ictx->lock);
if (ictx->pending) {
/*
* TBD: dequeue *all* non-conflicting reqs
@@ -287,7 +289,8 @@ nsr_$NAME$_complete (call_frame_t *frame, void *cookie, xlator_t *this,
else {
--(ictx->active);
}
- UNLOCK(&ictx->lock);
+ UNLOCK(&ictx->lock);
+ }
}
#endif