Whamcloud - gitweb
LU-2901 mdt: duplicate link names in directory 91/6591/4
authorAndreas Dilger <andreas.dilger@intel.com>
Fri, 7 Jun 2013 21:56:29 +0000 (15:56 -0600)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 19 Jun 2013 03:35:49 +0000 (03:35 +0000)
commita35113b690e39dcd39e126efc9085b3bc160b4ff
tree37779ec5e1c306a0eb0aab46229db6d53f5f4761
parentaed82035c0d194347f5cab17ebd48f355c379b1b
LU-2901 mdt: duplicate link names in directory

When creating a hard link to a file, the MDT/MDD/OSD code does
not verify whether the target link name already exists in the
directory.  The ZFS ZAP code checks for duplicate entries. The
add_dirent_to_buf() function in ldiskfs only checks entries for
duplicates while it is traversing the leaf block looking for free
space.  Even if it scanned the whole leaf block, this would not
work for non-htree directories since there is no guarantee that
the name is being inserted into the same leaf block.

To fix this, link should check target object doesn't exist as
other creat operations.

Add sanity.sh test_31o with multiple threads racing to link a new
name into the directory, while ensuring that there is a free entry
in the leaf block that is large enough to hold the duplicate name.
This needs to be racy, because otherwise the client VFS will see
the existing name and not send the RPC to the MDS, hiding the bug.

Add DLDLMRES/PLDLMRES macros for printing the whole lock resource
name (including the name hash) in LDLM_DEBUG() messages in a format
similar to DFID/PFID so they can be found in debug logs more easily.

Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Lai Siyao <lai.siyao@intel.com>
Change-Id: Iaec6098332fe6b0f6a534f8dbecfb14f6f500c1e
Reviewed-on: http://review.whamcloud.com/6591
Tested-by: Hudson
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
lustre/include/lustre/lustre_idl.h
lustre/ldlm/ldlm_lock.c
lustre/mdt/mdt_reint.c
lustre/tests/mlink.c
lustre/tests/sanity.sh