]> Zhao Yanbai Git Server - minix.git/commitdiff
fix mfs/isofs signal handling
authorDavid van Moolenbroek <david@minix3.org>
Thu, 15 Apr 2010 16:10:28 +0000 (16:10 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 15 Apr 2010 16:10:28 +0000 (16:10 +0000)
servers/iso9660fs/glo.h
servers/iso9660fs/main.c
servers/iso9660fs/mount.c
servers/mfs/main.c

index 5c93a598728d7cadcbcb52c4c049fca08c8a2b3e..400f128cb9dd2724582d27378875d1d79f4ebc43 100644 (file)
@@ -28,6 +28,8 @@ EXTERN char user_path[PATH_MAX+1];  /* pathname to be processed */
 EXTERN char *vfs_slink_storage;
 EXTERN int symloop;
 
+EXTERN int unmountdone;
+
 EXTERN dev_t fs_dev;    /* the device that is handled by this FS proc */
 EXTERN char fs_dev_label[16]; /* Name of the device driver that is handled */
 
index c1c18270d5cbfa62f13184e84d1ce1e4e0461fe2..3438771d47e0081bc3816435ea267da93d0b9d20 100644 (file)
@@ -14,6 +14,7 @@ FORWARD _PROTOTYPE(void get_work, (message *m_in)                     );
 /* SEF functions and variables. */
 FORWARD _PROTOTYPE( void sef_local_startup, (void) );
 FORWARD _PROTOTYPE( int sef_cb_init_fresh, (int type, sef_init_info_t *info) );
+FORWARD _PROTOTYPE( void sef_cb_signal_handler, (int signo) );
 
 /*===========================================================================*
  *                             main                                         *
@@ -71,6 +72,9 @@ PRIVATE void sef_local_startup()
 
   /* No live update support for now. */
 
+  /* Register signal callbacks. */
+  sef_setcb_signal_handler(sef_cb_signal_handler);
+
   /* Let SEF perform startup. */
   sef_startup();
 }
@@ -100,6 +104,22 @@ PRIVATE int sef_cb_init_fresh(int type, sef_init_info_t *info)
    return(OK);
 }
 
+/*===========================================================================*
+ *                             sef_cb_signal_handler                        *
+ *===========================================================================*/
+PRIVATE void sef_cb_signal_handler(int signo)
+{
+  /* Only check for termination signal, ignore anything else. */
+  if (signo != SIGTERM) return;
+
+  /* No need to do a sync, as this is a read-only file system. */
+
+  /* If the file system has already been unmounted, exit immediately.
+   * We might not get another message.
+   */
+  if (unmountdone) exit(0);
+}
+
 /*===========================================================================*
  *                             get_work                                     *
  *===========================================================================*/
index 7df01b784180269b013be8167b3cc4a625f56385..b9842fdd0a0ffc890fca29ffb8c7e88070752435 100644 (file)
@@ -101,6 +101,7 @@ PUBLIC int fs_mountpoint()
 PUBLIC int fs_unmount(void) {
   release_v_pri(&v_pri);       /* Release the super block */
   dev_close(driver_endpoints[(fs_dev >> MAJOR) & BYTE].driver_e, fs_dev);
+  unmountdone = TRUE;
   return(OK);
 }
 
index 5acc79658ddaa9bbb7624bf129d2e63188facc9c..d36b5f66931a4596e888443fdfd6d08b45581a9c 100644 (file)
@@ -133,6 +133,11 @@ PRIVATE void sef_cb_signal_handler(int signo)
 
   exitsignaled = 1;
   fs_sync();
+
+  /* If unmounting has already been performed, exit immediately.
+   * We might not get another message.
+   */
+  if (unmountdone) exit(0);
 }
 
 /*===========================================================================*