fs/inode: add reference to protect filelist of group
Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
6c339daa86
commit
00e878e848
|
@ -173,8 +173,7 @@ static void task_fssync(FAR struct tcb_s *tcb, FAR void *arg)
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
list = &tcb->group->tg_filelist;
|
list = files_getlist(tcb);
|
||||||
|
|
||||||
for (i = 0; i < list->fl_rows; i++)
|
for (i = 0; i < list->fl_rows; i++)
|
||||||
{
|
{
|
||||||
for (j = 0; j < CONFIG_NFILE_DESCRIPTORS_PER_BLOCK; j++)
|
for (j = 0; j < CONFIG_NFILE_DESCRIPTORS_PER_BLOCK; j++)
|
||||||
|
@ -188,6 +187,8 @@ static void task_fssync(FAR struct tcb_s *tcb, FAR void *arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
files_putlist(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -308,6 +309,7 @@ void files_initlist(FAR struct filelist *list)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
list->fl_rows = 1;
|
list->fl_rows = 1;
|
||||||
|
list->fl_crefs = 1;
|
||||||
list->fl_files = &list->fl_prefile;
|
list->fl_files = &list->fl_prefile;
|
||||||
list->fl_prefile = list->fl_prefiles;
|
list->fl_prefile = list->fl_prefiles;
|
||||||
}
|
}
|
||||||
|
@ -374,19 +376,47 @@ void files_dumplist(FAR struct filelist *list)
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: files_releaselist
|
* Name: files_getlist
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Release a reference to the file list
|
* Get the list of files by tcb.
|
||||||
|
*
|
||||||
|
* Assumptions:
|
||||||
|
* Called during task deletion in a safe context.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void files_releaselist(FAR struct filelist *list)
|
FAR struct filelist *files_getlist(FAR struct tcb_s *tcb)
|
||||||
|
{
|
||||||
|
FAR struct filelist *list = &tcb->group->tg_filelist;
|
||||||
|
|
||||||
|
DEBUGASSERT(list->fl_crefs >= 1);
|
||||||
|
list->fl_crefs++;
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: files_putlist
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Release the list of files.
|
||||||
|
*
|
||||||
|
* Assumptions:
|
||||||
|
* Called during task deletion in a safe context.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void files_putlist(FAR struct filelist *list)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
DEBUGASSERT(list);
|
DEBUGASSERT(list->fl_crefs >= 1);
|
||||||
|
if (--list->fl_crefs > 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Close each file descriptor .. Normally, you would need take the list
|
/* Close each file descriptor .. Normally, you would need take the list
|
||||||
* mutex, but it is safe to ignore the mutex in this context
|
* mutex, but it is safe to ignore the mutex in this context
|
||||||
|
|
|
@ -495,6 +495,7 @@ struct file
|
||||||
struct filelist
|
struct filelist
|
||||||
{
|
{
|
||||||
uint8_t fl_rows; /* The number of rows of fl_files array */
|
uint8_t fl_rows; /* The number of rows of fl_files array */
|
||||||
|
uint8_t fl_crefs; /* The references to filelist */
|
||||||
FAR struct file **fl_files; /* The pointer of two layer file descriptors array */
|
FAR struct file **fl_files; /* The pointer of two layer file descriptors array */
|
||||||
|
|
||||||
/* Pre-allocated files to avoid allocator access during thread creation
|
/* Pre-allocated files to avoid allocator access during thread creation
|
||||||
|
@ -875,14 +876,24 @@ void files_initlist(FAR struct filelist *list);
|
||||||
void files_dumplist(FAR struct filelist *list);
|
void files_dumplist(FAR struct filelist *list);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: files_releaselist
|
* Name: files_getlist
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Release a reference to the file list
|
* Get the list of files by tcb.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void files_releaselist(FAR struct filelist *list);
|
FAR struct filelist *files_getlist(FAR struct tcb_s *tcb);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: files_putlist
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Release the list of files.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void files_putlist(FAR struct filelist * list);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: files_countlist
|
* Name: files_countlist
|
||||||
|
|
|
@ -96,7 +96,7 @@ group_release(FAR struct task_group_s *group, uint8_t ttype)
|
||||||
|
|
||||||
/* Free resources held by the file descriptor list */
|
/* Free resources held by the file descriptor list */
|
||||||
|
|
||||||
files_releaselist(&group->tg_filelist);
|
files_putlist(&group->tg_filelist);
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_ENVIRON
|
#ifndef CONFIG_DISABLE_ENVIRON
|
||||||
/* Release all shared environment variables */
|
/* Release all shared environment variables */
|
||||||
|
|
Loading…
Reference in New Issue