aboutsummaryrefslogtreecommitdiff
path: root/storeio/storeio.c
diff options
context:
space:
mode:
Diffstat (limited to 'storeio/storeio.c')
-rw-r--r--storeio/storeio.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/storeio/storeio.c b/storeio/storeio.c
index 5b82a6c8..87bc249c 100644
--- a/storeio/storeio.c
+++ b/storeio/storeio.c
@@ -233,18 +233,34 @@ check_open_hook (struct trivfs_control *trivfs_control,
static error_t
open_hook (struct trivfs_peropen *peropen)
{
+ error_t err = 0;
struct dev *const dev = peropen->cntl->hook;
+
if (dev->store)
- return open_create (dev, (struct open **)&peropen->hook);
- else
- return 0;
+ {
+ mutex_lock (&dev->lock);
+ if (dev->nperopens++ == 0)
+ err = store_clear_flags (dev->store, STORE_INACTIVE);
+ mutex_unlock (&dev->lock);
+ if (!err)
+ err = open_create (dev, (struct open **)&peropen->hook);
+ }
+ return err;
}
static void
close_hook (struct trivfs_peropen *peropen)
{
+ struct dev *const dev = peropen->cntl->hook;
+
if (peropen->hook)
- open_free (peropen->hook);
+ {
+ mutex_lock (&dev->lock);
+ if (--dev->nperopens == 0)
+ store_set_flags (dev->store, STORE_INACTIVE);
+ mutex_unlock (&dev->lock);
+ open_free (peropen->hook);
+ }
}
/* ---------------------------------------------------------------- */