]> Zhao Yanbai Git Server - minix.git/commitdiff
VFS: fix check_bsf() locking
authorArne Welzel <arne.welzel@gmail.com>
Thu, 27 Sep 2012 20:23:49 +0000 (22:23 +0200)
committerBen Gras <ben@minix3.org>
Fri, 28 Sep 2012 12:57:34 +0000 (14:57 +0200)
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.

servers/vfs/proto.h
servers/vfs/read.c

index 735624472d07a7ab7c12c5d599ab3e0bfbcf34db..74b4b8ab89326f5383c1bbaf573773cbaf73cf08 100644 (file)
@@ -78,10 +78,6 @@ void write_elf_core_file(struct filp *f, int csig, char *exe_name);
 /* exec.c */
 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);
-#define check_bsf_lock() do {                                          \
-       assert(mutex_trylock(&bsf_lock) == 0);                          \
-       unlock_bsf();                                                   \
-                       } while(0)
 
 /* filedes.c */
 void *do_filp_gc(void *arg);
@@ -213,6 +209,7 @@ int do_read(void);
 int do_getdents(void);
 void lock_bsf(void);
 void unlock_bsf(void);
+void check_bsf_lock(void);
 int do_read_write(int rw_flag);
 int read_write(int rw_flag, struct filp *f, char *buffer, size_t nbytes,
        endpoint_t for_e);
index 4b7715017f9750c974f354d3f10be335c7269696..db6a65558a290d495002aa36649f3fe476f52bd5 100644 (file)
@@ -65,6 +65,22 @@ void unlock_bsf(void)
        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                                *
  *===========================================================================*/