VFS: fix check_bsf() locking
The check_bsf() macro uses assert(mutex_trylock(&bsf_lock)) and assumes bsf_lock is locked afterwards. This breaks when compiling with NOASSERTS="yes". Also: macro to function transition.
This commit is contained in:
parent
7e1074732b
commit
e35c4f78d2
2 changed files with 17 additions and 4 deletions
|
@ -78,10 +78,6 @@ void write_elf_core_file(struct filp *f, int csig, char *exe_name);
|
||||||
/* exec.c */
|
/* exec.c */
|
||||||
int pm_exec(endpoint_t proc_e, vir_bytes path, size_t path_len, vir_bytes frame,
|
int pm_exec(endpoint_t proc_e, vir_bytes path, size_t path_len, vir_bytes frame,
|
||||||
size_t frame_len, vir_bytes *pc, vir_bytes *newsp, int flags);
|
size_t frame_len, vir_bytes *pc, vir_bytes *newsp, int flags);
|
||||||
#define check_bsf_lock() do { \
|
|
||||||
assert(mutex_trylock(&bsf_lock) == 0); \
|
|
||||||
unlock_bsf(); \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
/* filedes.c */
|
/* filedes.c */
|
||||||
void *do_filp_gc(void *arg);
|
void *do_filp_gc(void *arg);
|
||||||
|
@ -213,6 +209,7 @@ int do_read(void);
|
||||||
int do_getdents(void);
|
int do_getdents(void);
|
||||||
void lock_bsf(void);
|
void lock_bsf(void);
|
||||||
void unlock_bsf(void);
|
void unlock_bsf(void);
|
||||||
|
void check_bsf_lock(void);
|
||||||
int do_read_write(int rw_flag);
|
int do_read_write(int rw_flag);
|
||||||
int read_write(int rw_flag, struct filp *f, char *buffer, size_t nbytes,
|
int read_write(int rw_flag, struct filp *f, char *buffer, size_t nbytes,
|
||||||
endpoint_t for_e);
|
endpoint_t for_e);
|
||||||
|
|
|
@ -65,6 +65,22 @@ void unlock_bsf(void)
|
||||||
panic("failed to unlock block special file lock");
|
panic("failed to unlock block special file lock");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* check_bsf *
|
||||||
|
*===========================================================================*/
|
||||||
|
void check_bsf_lock(void)
|
||||||
|
{
|
||||||
|
int r = mutex_trylock(&bsf_lock);
|
||||||
|
|
||||||
|
if (r == -EBUSY)
|
||||||
|
panic("bsf_lock locked");
|
||||||
|
else if (r != 0)
|
||||||
|
panic("bsf_lock weird state");
|
||||||
|
|
||||||
|
/* r == 0 */
|
||||||
|
unlock_bsf();
|
||||||
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* do_read_write *
|
* do_read_write *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
|
|
Loading…
Reference in a new issue