Skip to content

Commit

Permalink
Revert "Report holes when there are only metadata changes"
Browse files Browse the repository at this point in the history
This reverts commit ec4f9b8 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
  • Loading branch information
behlendorf committed Jun 7, 2019
1 parent 94866d8 commit 4f8eef2
Showing 1 changed file with 3 additions and 28 deletions.
31 changes: 3 additions & 28 deletions module/zfs/dmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 4f8eef2

Please sign in to comment.