diff options
Diffstat (limited to 'storeio/storeio.c')
-rw-r--r-- | storeio/storeio.c | 24 |
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); + } } /* ---------------------------------------------------------------- */ |