mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 03:37:45 +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
+14
-3
@@ -18,11 +18,12 @@
|
||||
*
|
||||
* CDDL HEADER END
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015 by Delphix. All rights reserved.
|
||||
* Copyright 2014 Nexenta Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 by Chunwei Chen. All rights reserved.
|
||||
* Copyright 2017 Nexenta Systems, Inc.
|
||||
*/
|
||||
|
||||
/* Portions Copyright 2007 Jeremy Teo */
|
||||
@@ -1157,7 +1158,15 @@ zfs_lookup(struct inode *dip, char *nm, struct inode **ipp, int flags,
|
||||
zfs_sb_t *zsb = ITOZSB(dip);
|
||||
int error = 0;
|
||||
|
||||
/* fast path */
|
||||
/*
|
||||
* Fast path lookup, however we must skip DNLC lookup
|
||||
* for case folding or normalizing lookups because the
|
||||
* DNLC code only stores the passed in name. This means
|
||||
* creating 'a' and removing 'A' on a case insensitive
|
||||
* file system would work, but DNLC still thinks 'a'
|
||||
* exists and won't let you create it again on the next
|
||||
* pass through fast path.
|
||||
*/
|
||||
if (!(flags & (LOOKUP_XATTR | FIGNORECASE))) {
|
||||
|
||||
if (!S_ISDIR(dip->i_mode)) {
|
||||
@@ -1175,7 +1184,9 @@ zfs_lookup(struct inode *dip, char *nm, struct inode **ipp, int flags,
|
||||
}
|
||||
return (error);
|
||||
#ifdef HAVE_DNLC
|
||||
} else {
|
||||
} else if (!zdp->z_zfsvfs->z_norm &&
|
||||
(zdp->z_zfsvfs->z_case == ZFS_CASE_SENSITIVE)) {
|
||||
|
||||
vnode_t *tvp = dnlc_lookup(dvp, nm);
|
||||
|
||||
if (tvp) {
|
||||
|
||||
Reference in New Issue
Block a user