From 4f301661dfe7e90574ad634f8b7fe8da7e6b4064 Mon Sep 17 00:00:00 2001 From: Tony Hutter Date: Mon, 9 Apr 2018 14:24:46 -0700 Subject: Revert "Handle zap_add() failures in mixed ... " This reverts commit cc63068e95ee725cce03b1b7ce50179825a6cda5. Under certain circumstances this change can result in an ENOSPC error when adding new files to a directory. See #7401 for full details. Reviewed-by: Brian Behlendorf Signed-off-by: Tony Hutter Issue #7401 Cloes #7416 --- module/zfs/zfs_dir.c | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) (limited to 'module/zfs/zfs_dir.c') diff --git a/module/zfs/zfs_dir.c b/module/zfs/zfs_dir.c index 7eb426b78..76f79cc11 100644 --- a/module/zfs/zfs_dir.c +++ b/module/zfs/zfs_dir.c @@ -742,11 +742,7 @@ zfs_dirent(znode_t *zp, uint64_t mode) } /* - * Link zp into dl. Can fail in the following cases : - * - if zp has been unlinked. - * - if the number of entries with the same hash (aka. colliding entries) - * exceed the capacity of a leaf-block of fatzap and splitting of the - * leaf-block does not help. + * Link zp into dl. Can only fail if zp has been unlinked. */ int zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag) @@ -780,24 +776,6 @@ zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag) NULL, &links, sizeof (links)); } } - - value = zfs_dirent(zp, zp->z_mode); - error = zap_add(ZTOZSB(zp)->z_os, dzp->z_id, dl->dl_name, 8, 1, - &value, tx); - - /* - * zap_add could fail to add the entry if it exceeds the capacity of the - * leaf-block and zap_leaf_split() failed to help. - * The caller of this routine is responsible for failing the transaction - * which will rollback the SA updates done above. - */ - if (error != 0) { - if (!(flag & ZRENAMING) && !(flag & ZNEW)) - drop_nlink(ZTOI(zp)); - mutex_exit(&zp->z_lock); - return (error); - } - SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zfsvfs), NULL, &dzp->z_id, sizeof (dzp->z_id)); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL, @@ -835,6 +813,11 @@ zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag) ASSERT(error == 0); mutex_exit(&dzp->z_lock); + value = zfs_dirent(zp, zp->z_mode); + error = zap_add(ZTOZSB(zp)->z_os, dzp->z_id, dl->dl_name, + 8, 1, &value, tx); + ASSERT(error == 0); + return (0); } -- cgit v1.2.3