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:
parent
b1bfef33b6
commit
3398eb6ebe
|
@ -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
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue