orangefs: hopefully saner op refcounting and locking

* create with refcount 1
* make op_release() decrement and free if zero (i.e. old put_op()
  has become that).
* mark when submitter has given up waiting; from that point nobody
  else can move between the lists, change state, etc.
* have daemon read/write_iter grab a reference when picking op
  and *always* give it up in the end
* don't put into hash until we know it's been successfully passed to
  daemon

* move op->lock _lower_ than htab_in_progress_lock (and make sure
  to take it in purge_inprogress_ops())

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
diff --git a/fs/orangefs/orangefs-mod.c b/fs/orangefs/orangefs-mod.c
index bd9fbfe..e07874e 100644
--- a/fs/orangefs/orangefs-mod.c
+++ b/fs/orangefs/orangefs-mod.c
@@ -271,6 +271,7 @@
 		struct orangefs_kernel_op_s *op;
 		struct orangefs_kernel_op_s *next;
 
+		spin_lock(&htable_ops_in_progress_lock);
 		list_for_each_entry_safe(op,
 					 next,
 					 &htable_ops_in_progress[i],
@@ -284,6 +285,7 @@
 			set_op_state_purged(op);
 			spin_unlock(&op->lock);
 		}
+		spin_unlock(&htable_ops_in_progress_lock);
 	}
 }