mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
OpenZFS 1300 - filename normalization doesn't work for removes
Authored by: Kevin Crowe <kevin.crowe@nexenta.com> Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com> Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com> Reviewed by: Matt Ahrens <mahrens@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Ported-by: George Melikov <mail@gmelikov.ru> OpenZFS-issue: https://www.illumos.org/issues/1300 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/8f1750d Closes #5725 Porting notes: - zap_micro.c: all `MT_EXACT` are replaced by `0`
This commit is contained in:
committed by
Brian Behlendorf
parent
96f1b347f8
commit
9b7b9cd370
+6
-14
@@ -18,9 +18,11 @@
|
||||
*
|
||||
* CDDL HEADER END
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2015 by Delphix. All rights reserved.
|
||||
* Copyright 2017 Nexenta Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -364,7 +366,7 @@ zap_leaf_array_match(zap_leaf_t *l, zap_name_t *zn,
|
||||
}
|
||||
|
||||
ASSERT(zn->zn_key_intlen == 1);
|
||||
if (zn->zn_matchtype == MT_FIRST) {
|
||||
if (zn->zn_matchtype & MT_NORMALIZE) {
|
||||
char *thisname = kmem_alloc(array_numints, KM_SLEEP);
|
||||
boolean_t match;
|
||||
|
||||
@@ -406,7 +408,6 @@ zap_leaf_lookup(zap_leaf_t *l, zap_name_t *zn, zap_entry_handle_t *zeh)
|
||||
|
||||
ASSERT3U(zap_leaf_phys(l)->l_hdr.lh_magic, ==, ZAP_LEAF_MAGIC);
|
||||
|
||||
again:
|
||||
for (chunkp = LEAF_HASH_ENTPTR(l, zn->zn_hash);
|
||||
*chunkp != CHAIN_END; chunkp = &le->le_next) {
|
||||
uint16_t chunk = *chunkp;
|
||||
@@ -421,9 +422,9 @@ again:
|
||||
/*
|
||||
* NB: the entry chain is always sorted by cd on
|
||||
* normalized zap objects, so this will find the
|
||||
* lowest-cd match for MT_FIRST.
|
||||
* lowest-cd match for MT_NORMALIZE.
|
||||
*/
|
||||
ASSERT(zn->zn_matchtype == MT_EXACT ||
|
||||
ASSERT((zn->zn_matchtype == 0) ||
|
||||
(zap_leaf_phys(l)->l_hdr.lh_flags & ZLF_ENTRIES_CDSORTED));
|
||||
if (zap_leaf_array_match(l, zn, le->le_name_chunk,
|
||||
le->le_name_numints)) {
|
||||
@@ -437,15 +438,6 @@ again:
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* NB: we could of course do this in one pass, but that would be
|
||||
* a pain. We'll see if MT_BEST is even used much.
|
||||
*/
|
||||
if (zn->zn_matchtype == MT_BEST) {
|
||||
zn->zn_matchtype = MT_FIRST;
|
||||
goto again;
|
||||
}
|
||||
|
||||
return (SET_ERROR(ENOENT));
|
||||
}
|
||||
|
||||
@@ -700,7 +692,7 @@ zap_entry_normalization_conflict(zap_entry_handle_t *zeh, zap_name_t *zn,
|
||||
continue;
|
||||
|
||||
if (zn == NULL) {
|
||||
zn = zap_name_alloc(zap, name, MT_FIRST);
|
||||
zn = zap_name_alloc(zap, name, MT_NORMALIZE);
|
||||
allocdzn = B_TRUE;
|
||||
}
|
||||
if (zap_leaf_array_match(zeh->zeh_leaf, zn,
|
||||
|
||||
Reference in New Issue
Block a user