diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-06-10 17:50:16 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-06-10 17:50:16 +0000 |
commit | 3a72b47c0c54a63a0abfc3bfd8510ed7f2fc10b9 (patch) | |
tree | bc093b5402d74916efb36a022bb4f375e7394321 /nuttx/fs | |
parent | a757e1e1b5123eab32d043e42e6bd03f25c90bf8 (diff) | |
download | px4-nuttx-3a72b47c0c54a63a0abfc3bfd8510ed7f2fc10b9.tar.gz px4-nuttx-3a72b47c0c54a63a0abfc3bfd8510ed7f2fc10b9.tar.bz2 px4-nuttx-3a72b47c0c54a63a0abfc3bfd8510ed7f2fc10b9.zip |
Correct opendir semaphore hanlding -- was causing deadlock
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@285 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/fs')
-rw-r--r-- | nuttx/fs/fs_opendir.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/nuttx/fs/fs_opendir.c b/nuttx/fs/fs_opendir.c index 6890de1ea..3fa32fc1e 100644 --- a/nuttx/fs/fs_opendir.c +++ b/nuttx/fs/fs_opendir.c @@ -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 */ |