Whamcloud - gitweb
b=13129
authornathan <nathan>
Fri, 27 Jul 2007 22:59:00 +0000 (22:59 +0000)
committernathan <nathan>
Fri, 27 Jul 2007 22:59:00 +0000 (22:59 +0000)
i=adilger
i=johann
Block umount forever until the mount refcount is zero rather than giving up
after an arbitrary timeout.

lustre/ChangeLog
lustre/obdclass/obd_mount.c

index 8259078..1dd0526 100644 (file)
@@ -76,6 +76,13 @@ Details    : Merging of two LCONSOLE_ERROR_MSG into one.
         may be released separately in future.
 
 
+Severity   : normal
+Frequency  : rare
+Bugzilla   : 13129
+Description: server LBUG when shutting down
+Details    : Block umount forever until the mount refcount is zero rather
+            than giving up after an arbitrary timeout.
+       
 Severity   : enhancement
 Bugzilla   : 12194
 Description: add optional extra BUILD_VERSION info
index d04136f..2843b54 100644 (file)
@@ -1296,28 +1296,26 @@ out_free:
         RETURN(ERR_PTR(rc));
 }
 
+/* We have to wait for everything to finish, including lnet lnd expires,
+   before it is safe to free the sb */
 static void server_wait_finished(struct vfsmount *mnt)
 {
         wait_queue_head_t   waitq;
         struct l_wait_info  lwi;
-        int                 retries = 120;
+        int                 waited = 0;
 
         init_waitqueue_head(&waitq);
 
-        while ((atomic_read(&mnt->mnt_count) > 1) && (retries > 0)) {
-                LCONSOLE_WARN("Mount still busy with %d refs, waiting for "
-                              "%d secs...\n",
-                              atomic_read(&mnt->mnt_count), retries);
-
+        while (atomic_read(&mnt->mnt_count) > 1) {
+                if (waited && (waited % 30 == 0)) 
+                        LCONSOLE_WARN("Mount still busy with %d refs after "
+                                      "%d secs\n", atomic_read(&mnt->mnt_count), 
+                                      waited);
                 /* Wait for a bit */
-                retries -= 5;
-                lwi = LWI_TIMEOUT(5 * HZ, NULL, NULL);
+                waited += 3;
+                lwi = LWI_TIMEOUT(cfs_time_seconds(3), NULL, NULL);
                 l_wait_event(waitq, 0, &lwi);
         }
-        if (atomic_read(&mnt->mnt_count) > 1) {
-                CERROR("Mount %p is still busy (%d refs), giving up.\n",
-                       mnt, atomic_read(&mnt->mnt_count));
-        }
 }
 
 static void server_put_super(struct super_block *sb)