]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Handle zio_resume and mmp => off
authorOlaf Faaland <faaland1@llnl.gov>
Thu, 8 Mar 2018 23:21:54 +0000 (15:21 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 9 Mar 2018 23:42:11 +0000 (15:42 -0800)
When multihost is disabled on a pool, and the pool is resumed via zpool
clear, within a single cycle of the mmp thread's loop (e.g.  while it's
in the cv_timedwait call), both mmp_last_write and mmp_delay should be
updated.

The original code mistakenly treated the two cases as if they could not
occur at the same time.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
Closes #7286

module/zfs/mmp.c

index cb0aa53d6a48578bd238dd287b8c259157fe9fd4..420b8441c3f77c440e67fa9f5a5162157bd653c1 100644 (file)
@@ -474,16 +474,22 @@ mmp_thread(void *arg)
                }
 
                /*
-                * When MMP goes off => on, or spa goes suspended =>
-                * !suspended, we know no writes occurred recently.  We
-                * update mmp_last_write to give us some time to try.
+                * MMP off => on, or suspended => !suspended:
+                * No writes occurred recently.  Update mmp_last_write to give
+                * us some time to try.
                 */
                if ((!last_spa_multihost && multihost) ||
                    (last_spa_suspended && !suspended)) {
                        mutex_enter(&mmp->mmp_io_lock);
                        mmp->mmp_last_write = gethrtime();
                        mutex_exit(&mmp->mmp_io_lock);
-               } else if (last_spa_multihost && !multihost) {
+               }
+
+               /*
+                * MMP on => off:
+                * mmp_delay == 0 tells importing node to skip activity check.
+                */
+               if (last_spa_multihost && !multihost) {
                        mutex_enter(&mmp->mmp_io_lock);
                        mmp->mmp_delay = 0;
                        mutex_exit(&mmp->mmp_io_lock);