GOTO(out_unlock_child, rc);
/* save version of file name for replay, it must be ENOENT here */
if (!req_is_replay(mdt_info_req(info))) {
+ if (rc != -ENOENT) {
+ CDEBUG(D_INFO, "link target %.*s existed!\n",
+ rr->rr_namelen, (char *)rr->rr_name);
+ GOTO(out_unlock_child, rc = -EEXIST);
+ }
info->mti_ver[2] = ENOENT_VERSION;
mdt_version_save(mdt_info_req(info), info->mti_ver[2], 2);
}
int main(int argc, char ** argv)
{
- int rc;
+ int rc;
- if (argc < 3) {
- printf("Usage: %s file link\n", argv[0]);
- return 1;
- }
+ if (argc < 3) {
+ fprintf(stderr, "usage: %s file link\n", argv[0]);
+ return 1;
+ }
- rc = link(argv[1], argv[2]);
- if (rc) {
- printf("link(%s, %s) error: %s\n", argv[1], argv[2],
- strerror(errno));
+ rc = link(argv[1], argv[2]);
+ if (rc) {
+ fprintf(stderr, "link(%s, %s) error: %s\n",
+ argv[1], argv[2], strerror(errno));
return errno;
- }
+ }
return 0;
-}
+}
}
run_test 31m "link to file: the same, non-existing, dir==============="
+link_one() {
+ local TEMPNAME=$(mktemp $1_XXXXXX)
+ mlink $TEMPNAME $1 2> /dev/null &&
+ echo "$BASHPID: link $TEMPNAME to $1 succeeded"
+ munlink $TEMPNAME
+}
+
+test_31o() { # LU-2901
+ local server_version=$(lustre_version_code $SINGLEMDS)
+
+ if [[ $server_version -lt $(version_code 2.1.6) ]] ||
+ [[ $server_version -ge $(version_code 2.2.0) &&
+ $server_version -lt $(version_code 2.4.1) ]]; then
+ skip "Need MDS version at least 2.1.6 or 2.4.1"
+ return 0
+ fi
+
+ mkdir -p $DIR/$tdir
+ for LOOP in $(seq 100); do
+ rm -f $DIR/$tdir/$tfile*
+ for THREAD in $(seq 8); do
+ link_one $DIR/$tdir/$tfile.$LOOP &
+ done
+ wait
+ local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
+ [ $LINKS -gt 1 ] && ls $DIR/$tdir &&
+ error "$LINKS duplicate links to $tfile.$LOOP" &&
+ break || true
+ done
+}
+run_test 31o "duplicate hard links with same filename"
+
test_32a() {
echo "== more mountpoints and symlinks ================="
[ -e $DIR/d32a ] && rm -fr $DIR/d32a