Mercurial > nomad > experimental
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;