mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 19:57:43 +03:00
Fix out-of-order ZIL txtype lost on hardlinked files
We should only call zil_remove_async when an object is removed. However, in current implementation, it is called whenever TX_REMOVE is called. In the case of hardlinked file, every unlink will generate TX_REMOVE and causing operations to be dropped even when the object is not removed. We fix this by only calling zil_remove_async when the file is fully unlinked. Reviewed-by: George Wilson <gwilson@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Prakash Surya <prakash.surya@delphix.com> Signed-off-by: Chunwei Chen <david.chen@nutanix.com> Closes #8769 Closes #9061
This commit is contained in:
committed by
Brian Behlendorf
parent
475ebd763a
commit
8e556c5ebc
+1
-11
@@ -1875,7 +1875,7 @@ zil_aitx_compare(const void *x1, const void *x2)
|
||||
/*
|
||||
* Remove all async itx with the given oid.
|
||||
*/
|
||||
static void
|
||||
void
|
||||
zil_remove_async(zilog_t *zilog, uint64_t oid)
|
||||
{
|
||||
uint64_t otxg, txg;
|
||||
@@ -1927,16 +1927,6 @@ zil_itx_assign(zilog_t *zilog, itx_t *itx, dmu_tx_t *tx)
|
||||
itxg_t *itxg;
|
||||
itxs_t *itxs, *clean = NULL;
|
||||
|
||||
/*
|
||||
* Object ids can be re-instantiated in the next txg so
|
||||
* remove any async transactions to avoid future leaks.
|
||||
* This can happen if a fsync occurs on the re-instantiated
|
||||
* object for a WR_INDIRECT or WR_NEED_COPY write, which gets
|
||||
* the new file data and flushes a write record for the old object.
|
||||
*/
|
||||
if ((itx->itx_lr.lrc_txtype & ~TX_CI) == TX_REMOVE)
|
||||
zil_remove_async(zilog, itx->itx_oid);
|
||||
|
||||
/*
|
||||
* Ensure the data of a renamed file is committed before the rename.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user