From 5462ede661ab70233b2671cbd38dc4ef8d30358f Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 29 Sep 2014 16:13:07 -0600 Subject: [PATCH] Fix some unbalanced sched_lock()/sched_unlock() pairs int the re-implemented VFS semaphore and message queue logic --- fs/mqueue/mq_close.c | 1 + fs/mqueue/mq_open.c | 3 ++- fs/mqueue/mq_unlink.c | 2 ++ fs/semaphore/sem_open.c | 5 +++-- fs/semaphore/sem_unlink.c | 5 ++++- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/fs/mqueue/mq_close.c b/fs/mqueue/mq_close.c index 7df2d8a267..e1c8c14386 100644 --- a/fs/mqueue/mq_close.c +++ b/fs/mqueue/mq_close.c @@ -150,6 +150,7 @@ int mq_close(mqd_t mqdes) /* Decrement the reference count on the inode */ mq_inode_release(inode); + sched_unlock(); } return OK; diff --git a/fs/mqueue/mq_open.c b/fs/mqueue/mq_open.c index 595adeb973..8588ebb733 100644 --- a/fs/mqueue/mq_open.c +++ b/fs/mqueue/mq_open.c @@ -235,9 +235,10 @@ mqd_t mq_open(const char *mq_name, int oflags, ...) inode->u.i_mqueue = msgq; msgq->inode = inode; } + + sched_unlock(); } - sched_unlock(); return mqdes; errout_with_msgq: diff --git a/fs/mqueue/mq_unlink.c b/fs/mqueue/mq_unlink.c index 2caf0df6bd..496571163c 100644 --- a/fs/mqueue/mq_unlink.c +++ b/fs/mqueue/mq_unlink.c @@ -160,6 +160,7 @@ int mq_unlink(FAR const char *mq_name) inode_semgive(); mq_inode_release(inode); + sched_unlock(); return OK; errout_with_semaphore: @@ -168,5 +169,6 @@ errout_with_inode: inode_release(inode); errout: set_errno(errcode); + sched_unlock(); return ERROR; } diff --git a/fs/semaphore/sem_open.c b/fs/semaphore/sem_open.c index 579a94455a..292eddc82c 100644 --- a/fs/semaphore/sem_open.c +++ b/fs/semaphore/sem_open.c @@ -255,16 +255,17 @@ FAR sem_t *sem_open (FAR const char *name, int oflags, ...) sem = &nsem->ns_sem; } + + sched_unlock(); } - sched_unlock(); return sem; errout_with_inode: inode_release(inode); errout_with_lock: - sched_unlock(); set_errno(errcode); + sched_unlock(); return (FAR sem_t *)ERROR; } diff --git a/fs/semaphore/sem_unlink.c b/fs/semaphore/sem_unlink.c index 6b10b1a6b9..393b435d4a 100644 --- a/fs/semaphore/sem_unlink.c +++ b/fs/semaphore/sem_unlink.c @@ -162,7 +162,9 @@ int sem_unlink(FAR const char *name) */ inode_semgive(); - return sem_close((FAR sem_t *)inode->u.i_nsem); + ret = sem_close((FAR sem_t *)inode->u.i_nsem); + sched_unlock(); + return ret; errout_with_semaphore: inode_semgive(); @@ -170,5 +172,6 @@ errout_with_inode: inode_release(inode); errout: set_errno(errcode); + sched_unlock(); return ERROR; }