orangefs: make sure that reopening pvfs2-req won't overlap with the end of close
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 23 Jan 2016 00:46:08 +0000 (19:46 -0500)
committerMike Marshall <hubcap@omnibond.com>
Sat, 23 Jan 2016 17:55:24 +0000 (12:55 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
fs/orangefs/devorangefs-req.c

index dadeb381f9fc38285307ac95f559855054899511..92573d9cc17c36d692f5336de4fb43e28bc5f5ab 100644 (file)
@@ -85,7 +85,7 @@ static int orangefs_devreq_open(struct inode *inode, struct file *file)
        mutex_lock(&devreq_mutex);
 
        if (open_access_count == 0) {
-               open_access_count++;
+               open_access_count = 1;
                ret = 0;
        } else {
                DUMP_DEVICE_ERROR();
@@ -533,12 +533,11 @@ static int orangefs_devreq_release(struct inode *inode, struct file *file)
        if (orangefs_get_bufmap_init())
                orangefs_bufmap_finalize();
 
-       open_access_count--;
+       open_access_count = -1;
 
        unmounted = mark_all_pending_mounts();
        gossip_debug(GOSSIP_DEV_DEBUG, "ORANGEFS Device Close: Filesystem(s) %s\n",
                     (unmounted ? "UNMOUNTED" : "MOUNTED"));
-       mutex_unlock(&devreq_mutex);
 
        /*
         * Walk through the list of ops in the request list, mark them
@@ -552,6 +551,8 @@ static int orangefs_devreq_release(struct inode *inode, struct file *file)
        purge_inprogress_ops();
        gossip_debug(GOSSIP_DEV_DEBUG,
                     "pvfs2-client-core: device close complete\n");
+       open_access_count = 0;
+       mutex_unlock(&devreq_mutex);
        return 0;
 }