]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Revert "Report holes when there are only metadata changes"
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 31 May 2019 00:13:18 +0000 (17:13 -0700)
committerGitHub <noreply@github.com>
Fri, 31 May 2019 00:13:18 +0000 (17:13 -0700)
This reverts commit ec4f9b8f30 which introduced a narrow race which
can lead to lseek(, SEEK_DATA) incorrectly returning ENXIO.  Resolve
the issue by revering this change to restore the previous behavior
which depends solely on checking the dirty list.

Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
Reviewed-by: Igor Kozhukhov <igor@dilos.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #8816
Closes #8834

module/zfs/dmu.c

index a283b0622384d736684b810a2e0f244ce3aee4b7..2d6740576bb6f48f78696113ac9b930d4e8f661a 100644 (file)
@@ -2373,39 +2373,14 @@ dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off)
                return (err);
 
        /*
-        * Check if there are dirty data blocks or frees which have not been
-        * synced.  Dirty spill and bonus blocks which are external to the
-        * object can ignored when reporting holes.
+        * Check if dnode is dirty
         */
-       mutex_enter(&dn->dn_mtx);
        for (i = 0; i < TXG_SIZE; i++) {
                if (multilist_link_active(&dn->dn_dirty_link[i])) {
-
-                       if (dn->dn_free_ranges[i] != NULL) {
-                               clean = B_FALSE;
-                               break;
-                       }
-
-                       list_t *list = &dn->dn_dirty_records[i];
-                       dbuf_dirty_record_t *dr;
-
-                       for (dr = list_head(list); dr != NULL;
-                           dr = list_next(list, dr)) {
-                               dmu_buf_impl_t *db = dr->dr_dbuf;
-
-                               if (db->db_blkid == DMU_SPILL_BLKID ||
-                                   db->db_blkid == DMU_BONUS_BLKID)
-                                       continue;
-
-                               clean = B_FALSE;
-                               break;
-                       }
-               }
-
-               if (clean == B_FALSE)
+                       clean = B_FALSE;
                        break;
+               }
        }
-       mutex_exit(&dn->dn_mtx);
 
        /*
         * If compatibility option is on, sync any current changes before