]> granicus.if.org Git - zfs/commitdiff
Handle zio_resume and mmp => off
authorOlaf Faaland <faaland1@llnl.gov>
Thu, 8 Mar 2018 23:21:54 +0000 (15:21 -0800)
committerTony Hutter <hutter2@llnl.gov>
Wed, 14 Mar 2018 23:10:38 +0000 (16:10 -0700)
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 634e482879456c0fceb6ae2f70b9456bf5c968a4..15eea41abfaea7df81801e52463cc519657d4266 100644 (file)
@@ -409,16 +409,22 @@ mmp_thread(spa_t *spa)
                }
 
                /*
-                * 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);