changeset 298:6a1401c53100

objstore: keep count of obj opens Call the open and close object ops only on the first open and the last close. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sat, 30 Apr 2016 08:22:56 -0400
parents 595ad4b68395
children 804cbc3b6ccd
files src/objstore/include/nomad/objstore_backend.h src/objstore/obj.c src/objstore/vg.c
diffstat 3 files changed, 30 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/objstore/include/nomad/objstore_backend.h	Sat Apr 30 08:21:20 2016 -0400
+++ b/src/objstore/include/nomad/objstore_backend.h	Sat Apr 30 08:22:56 2016 -0400
@@ -66,6 +66,7 @@
 	 */
 	struct nattr attrs;
 	void *private;
+	uint32_t open_count;
 
 	/* misc */
 	struct obj *obj;
--- a/src/objstore/obj.c	Sat Apr 30 08:21:20 2016 -0400
+++ b/src/objstore/obj.c	Sat Apr 30 08:22:56 2016 -0400
@@ -105,6 +105,7 @@
 	memset(&ver->attrs, 0, sizeof(ver->attrs));
 
 	ver->private = NULL;
+	ver->open_count = 0;
 	ver->obj = NULL;
 
 	return ver;
--- a/src/objstore/vg.c	Sat Apr 30 08:21:20 2016 -0400
+++ b/src/objstore/vg.c	Sat Apr 30 08:22:56 2016 -0400
@@ -402,17 +402,22 @@
 
 	obj = objver->obj;
 
-	if (obj->ops && obj->ops->open)
-		ret = obj->ops->open(objver);
-	else
-		ret = 0;
+	if (!objver->open_count) {
+		/* first open */
+		if (obj->ops && obj->ops->open)
+			ret = obj->ops->open(objver);
+		else
+			ret = 0;
 
-	if (ret) {
-		mxunlock(&obj->lock);
-		obj_putref(obj);
-		return ERR_PTR(ret);
+		if (ret) {
+			mxunlock(&obj->lock);
+			obj_putref(obj);
+			return ERR_PTR(ret);
+		}
 	}
 
+	objver->open_count++;
+
 	/*
 	 * The object associated with 'objver' is locked and held.  We
 	 * unlock it, but keep the hold on it.  Then we return the pointer
@@ -435,6 +440,7 @@
 {
 	struct objver *objver = cookie;
 	struct obj *obj;
+	bool putref;
 	int ret;
 
 	if (!vg || !objver)
@@ -454,14 +460,25 @@
 	 */
 
 	mxlock(&obj->lock);
-	if (obj->ops && obj->ops->close)
+	objver->open_count--;
+	putref = true;
+
+	if (objver->open_count) {
+		ret = 0;
+		putref = false;
+	} else if (obj->ops && obj->ops->close) {
+		/* last close */
 		ret = obj->ops->close(objver);
-	else
+	} else {
 		ret = 0;
+	}
+
+	if (ret)
+		objver->open_count++; /* undo earlier decrement */
 	mxunlock(&obj->lock);
 
 	/* release the reference obtained in objstore_open() */
-	if (!ret)
+	if (putref && !ret)
 		obj_putref(obj);
 
 	return ret;