fs/inode: add reference to protect filelist of group

Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
dongjiuzhu1 2024-07-02 21:46:19 +08:00 committed by Xiang Xiao
parent 6c339daa86
commit 00e878e848
3 changed files with 51 additions and 10 deletions

View File

@ -173,8 +173,7 @@ static void task_fssync(FAR struct tcb_s *tcb, FAR void *arg)
int i;
int j;
list = &tcb->group->tg_filelist;
list = files_getlist(tcb);
for (i = 0; i < list->fl_rows; i++)
{
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_crefs = 1;
list->fl_files = &list->fl_prefile;
list->fl_prefile = list->fl_prefiles;
}
@ -374,19 +376,47 @@ void files_dumplist(FAR struct filelist *list)
}
/****************************************************************************
* Name: files_releaselist
* Name: files_getlist
*
* 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 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
* mutex, but it is safe to ignore the mutex in this context

View File

@ -495,6 +495,7 @@ struct file
struct filelist
{
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 */
/* 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);
/****************************************************************************
* Name: files_releaselist
* Name: files_getlist
*
* 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

View File

@ -96,7 +96,7 @@ group_release(FAR struct task_group_s *group, uint8_t ttype)
/* Free resources held by the file descriptor list */
files_releaselist(&group->tg_filelist);
files_putlist(&group->tg_filelist);
#ifndef CONFIG_DISABLE_ENVIRON
/* Release all shared environment variables */