9
0
Fork 0

Need to call driver close() method on exit

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@792 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2008-08-01 00:22:09 +00:00
parent f68af6049c
commit 4d1e2b5695
6 changed files with 99 additions and 72 deletions

View File

@ -383,6 +383,7 @@
* Added a test for redirection of stdio through pipes
* Fixed error in dup and dup2: Must call open/close methods in fs/driver so that
driver can correctly maintain open reference counts.
* Same issue on closing file descriptors in exit()
* Fixed in error in stdio flush logic. Needed ssize_t vs size_t for error
check.

View File

@ -1032,6 +1032,7 @@ nuttx-0.3.12 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
* Added a test for redirection of stdio through pipes
* Fixed error in dup and dup2: Must call open/close methods in fs/driver so that
driver can correctly maintain open reference counts.
* Same issue on closing file descriptors in exit()
* Fixed in error in stdio flush logic. Needed ssize_t vs size_t for error
check.

View File

@ -242,12 +242,6 @@ o File system / Generic drivers (fs/, drivers/)
when there are not open references to the pipe/FIFO.
Priority: Medium
Desccripton: dup and dup2 need to call into driver. Most drivers
will maintain internal open counts. dup and dup2 logically
increase the open count but do not interact with the driver
Status: Open
Priority: Medium
o Pascal Add-On (pcode/)
^^^^^^^^^^^^^^^^^^^^^^

View File

@ -82,7 +82,7 @@ int close(int fd)
int err;
#if CONFIG_NFILE_DESCRIPTORS > 0
FAR struct filelist *list;
FAR struct inode *inode;
int ret;
/* Did we get a valid file descriptor? */
@ -116,8 +116,7 @@ int close(int fd)
/* If the file was properly opened, there should be an inode assigned */
inode = list->fl_files[fd].f_inode;
if (!inode)
if (!list->fl_files[fd].f_inode)
{
err = EBADF;
goto errout;
@ -133,30 +132,18 @@ int close(int fd)
* vtable.
*/
if (inode->u.i_ops && inode->u.i_ops->close)
ret = files_close(&list->fl_files[fd]);
if (ret < 0)
{
/* Perform the close operation (by the driver) */
/* An error occurred while closing the driver */
int ret = inode->u.i_ops->close(&list->fl_files[fd]);
if (ret < 0)
{
/* An error occurred while closing the driver */
err = -ret;
goto errout;
}
err = -ret;
goto errout;
}
/* Release the file descriptor */
files_release(fd);
/* Decrement the reference count on the inode. This may remove the inode and
* eliminate the name from the namespace
*/
inode_release(inode);
return OK;
#endif

View File

@ -67,6 +67,9 @@
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: _files_semtake
****************************************************************************/
static void _files_semtake(FAR struct filelist *list)
{
/* Take the semaphore (perhaps waiting) */
@ -81,22 +84,32 @@ static void _files_semtake(FAR struct filelist *list)
}
}
/****************************************************************************
* Name: _files_semgive
****************************************************************************/
#define _files_semgive(list) sem_post(&list->fl_sem)
/****************************************************************************
* Pulblic Functions
* Public Functions
****************************************************************************/
/* This is called from the FS initialization logic to configure
* the files.
*/
/****************************************************************************
* Name: files_initialize
*
* Description:
* This is called from the FS initialization logic to configure the files.
*
****************************************************************************/
void files_initialize(void)
{
}
/* Allocate a list of files for a new task */
/****************************************************************************
* Name: files_alloclist
*
* Description: Allocate a list of files for a new task
*
****************************************************************************/
FAR struct filelist *files_alloclist(void)
{
FAR struct filelist *list;
@ -114,8 +127,12 @@ FAR struct filelist *files_alloclist(void)
return list;
}
/* Increase the reference count on a file list */
/****************************************************************************
* Name: files_addreflist
*
* Description: Increase the reference count on a file list
*
****************************************************************************/
int files_addreflist(FAR struct filelist *list)
{
if (list)
@ -135,8 +152,44 @@ int files_addreflist(FAR struct filelist *list)
return OK;
}
/* Release a reference to the file list */
/****************************************************************************
* Name: files_close
*
* Description: Close an inode (if open)
*
****************************************************************************/
int files_close(FAR struct file *filep)
{
struct inode *inode = filep->f_inode;
int ret = OK;
/* Check if the struct file is open (i.e., assigned an inode) */
if (inode)
{
/* Close the file, driver, or mountpoint. */
if (inode->u.i_ops && inode->u.i_ops->close)
{
/* Perform the close operation */
ret = inode->u.i_ops->close(filep);
}
/* And release the inode */
inode_release(inode);
filep->f_inode = NULL;
}
return ret;
}
/****************************************************************************
* Name: files_releaselist
*
* Description: Release a reference to the file list
*
****************************************************************************/
int files_releaselist(FAR struct filelist *list)
{
int crefs;
@ -168,26 +221,25 @@ int files_releaselist(FAR struct filelist *list)
for (i = 0; i < CONFIG_NFILE_DESCRIPTORS; i++)
{
FAR struct inode *inode = list->fl_files[i].f_inode;
if (inode)
{
inode_release(inode);
}
(void)files_close(&list->fl_files[i]);
}
/* Destroy the semaphore and release the filelist */
/* Destroy the semaphore and release the filelist */
(void)sem_destroy(&list->fl_sem);
sched_free(list);
(void)sem_destroy(&list->fl_sem);
sched_free(list);
}
}
return OK;
}
/* Assign an inode to a specific files structure. this is the
* heart of dup2.
*/
/****************************************************************************
* Name: files_dup
*
* Description:
* Assign an inode to a specific files structure. This is the heart of dup2.
*
****************************************************************************/
int files_dup(FAR struct file *filep1, FAR struct file *filep2)
{
FAR struct filelist *list;
@ -222,27 +274,12 @@ int files_dup(FAR struct file *filep1, FAR struct file *filep2)
* close the file and release the inode.
*/
inode = filep2->f_inode;
if (inode)
ret = files_close(filep2);
if (ret < 0)
{
/* Close the file, driver, or mountpoint. */
/* An error occurred while closing the driver */
if (inode->u.i_ops && inode->u.i_ops->close)
{
/* Perform the close operation */
ret = inode->u.i_ops->close(filep2);
if (ret < 0)
{
/* An error occurred while closing the driver */
goto errout_with_ret;
}
}
/* Release the inode */
inode_release(filep2->f_inode);
goto errout_with_ret;
}
/* Increment the reference count on the contained inode */
@ -304,11 +341,14 @@ errout:
return ERROR;
}
/* Allocate a struct files instance and associate it with an
* inode instance. Returns the file descriptor == index into
* the files array.
*/
/****************************************************************************
* Name: files_allocate
*
* Description:
* Allocate a struct files instance and associate it with an inode instance.
* Returns the file descriptor == index into the files array.
*
****************************************************************************/
int files_allocate(FAR struct inode *inode, int oflags, off_t pos)
{
FAR struct filelist *list;
@ -334,6 +374,9 @@ int files_allocate(FAR struct inode *inode, int oflags, off_t pos)
return ERROR;
}
/****************************************************************************
* Name: files_release
****************************************************************************/
void files_release(int filedes)
{
FAR struct filelist *list;

View File

@ -210,6 +210,7 @@ EXTERN void inode_release(FAR struct inode *inode);
EXTERN void weak_function files_initialize(void);
EXTERN int files_allocate(FAR struct inode *inode, int oflags, off_t pos);
EXTERN void files_release(int filedes);
EXTERN int files_close(struct file *filep);
#undef EXTERN
#if defined(__cplusplus)