9
0
Fork 0

Fix error in mount() error handling

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@2271 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2009-11-18 17:31:04 +00:00
parent 79dacc47ed
commit 0c6538c7c9
3 changed files with 21 additions and 2 deletions

View File

@ -964,4 +964,11 @@
NOTE: On initial check-in, mmcsd_sdio.c and stm32_sdio.c are merely
skeleton frameworks for the driver.
* fs/fs_mount.c -- Correct error handling logic. If the bind() method
fails, then a reserved node is left in the tree. This causes subsequent
attempts to mount at the location to fail (reporting that the node
already exists). This is a probably for block drivers for removable
media: The bind method could fail repeatedly until media is asserted.

View File

@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1>
<p>Last Updated: November 11, 2009</p>
<p>Last Updated: November 18, 2009</p>
</td>
</tr>
</table>
@ -1612,6 +1612,12 @@ nuttx-0.4.14 2009-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
NOTE: On initial check-in, mmcsd_sdio.c and stm32_sdio.c are merely
skeleton frameworks for the driver.
* fs/fs_mount.c -- Correct error handling logic. If the bind() method
fails, then a reserved node is left in the tree. This causes subsequent
attempts to mount at the location to fail (reporting that the node
already exists). This is a probably for block drivers for removable
media: The bind method could fail repeatedly until media is asserted.
pascal-0.1.3 2009-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
buildroot-0.1.8 2009-xx-xx &lt;spudmonkey@racsa.co.cr&gt;

View File

@ -227,9 +227,13 @@ int mount(const char *source, const char *target,
status = mops->bind(blkdrvr_inode, data, &fshandle);
if (status != 0)
{
/* The inode is unhappy with the blkdrvr for some reason */
/* The inode is unhappy with the blkdrvr for some reason. Back out
* the count for the reference we failed to pass and exit with an
* error.
*/
fdbg("Bind method failed: %d\n", status);
blkdrvr_inode->i_crefs--;
errcode = -status;
goto errout_with_mountpt;
}
@ -257,6 +261,8 @@ int mount(const char *source, const char *target,
/* A lot of goto's! But they make the error handling much simpler */
errout_with_mountpt:
mountpt_inode->i_crefs = 0;
inode_remove(target);
inode_semgive();
inode_release(blkdrvr_inode);
inode_release(mountpt_inode);