9
0
Fork 0

Correct opendir semaphore hanlding -- was causing deadlock

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@285 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2007-06-10 17:50:16 +00:00
parent b1bfef33b6
commit 3398eb6ebe
3 changed files with 13 additions and 7 deletions

View File

@ -181,5 +181,6 @@
* tools/Makefile.mkconfig: Under Cygwin, executable has a different name
* tools/mkdeps.sh & arch/arm/src/Makefile: Corrected a problem makeing dependencies
* tools/zipme.sh: Force directory name to be nuttx-xx.yy.zz
* fs/fs_opendir.c: Correct errors in semaphore usage that can cause deadlock.
* Started m68322

View File

@ -616,6 +616,7 @@ Other memory:
* tools/Makefile.mkconfig: Under Cygwin, executable has a different name
* tools/mkdeps.sh & arch/arm/src/Makefile: Corrected a problem makeing dependencies
* tools/zipme.sh: Force directory name to be nuttx-xx.yy.zz
* fs/fs_opendir.c: Correct errors in semaphore usage that can cause deadlock.
* Started m68322
</pre></ul>

View File

@ -94,9 +94,9 @@ FAR DIR *opendir(const char *path)
* request for the root inode.
*/
inode_semtake();
if (!path || *path == 0 || strcmp(path, "/") == 0)
{
inode_semgive();
inode = root_inode;
isroot = TRUE;
}
@ -106,12 +106,12 @@ FAR DIR *opendir(const char *path)
if (*path != '/')
{
return NULL;
ret = -ENOTDIR;
goto errout_with_semaphore;
}
/* Find the node matching the path. */
inode_semtake();
inode = inode_search(&path, (FAR void*)NULL, (FAR void*)NULL, &relpath);
}
@ -166,9 +166,11 @@ FAR DIR *opendir(const char *path)
goto errout_with_direntry;
}
/* Take reference to the mountpoint inode (fd_root) */
/* Take reference to the mountpoint inode (fd_root). Note that we do
* not use inode_addref() because we already hold the tree semaphore.
*/
inode_addref(inode);
inode->i_crefs++;
/* Perform the opendir() operation */
@ -199,10 +201,12 @@ FAR DIR *opendir(const char *path)
/* It looks we have a valid psuedo-filesystem node. Take two references
* on the inode -- one for the parent (fd_root) and one for the child (fd_next).
* Note that we do not call inode_addref because we are holding
* the tree semaphore and that would result in deadlock.
*/
inode_addref(inode);
inode_addref(inode);
inode->i_crefs++;
inode->i_crefs++;
dir->u.psuedo.fd_next = inode; /* This is the next node to use for readdir() */
/* Flag the inode as belonging to the psuedo-filesystem */