From 68f8cee563d2812e2fdc1328c099ab3ef369069c Mon Sep 17 00:00:00 2001 From: Rahul Deshmukh Date: Mon, 1 Nov 2010 18:53:16 +0530 Subject: [PATCH] b=24010 lfs fid2path doesn't work for symlinks o=thomas i=andreas i=rahul --- lustre/tests/sanity.sh | 53 +++++++++++++++++++++++++-------------------- lustre/utils/liblustreapi.c | 24 +++++--------------- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 1b57896..6300216 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -7102,42 +7102,47 @@ check_path() { err17935 "path looked up \"${path}\" instead of \"${expected}\"" return 2 fi - echo "fid $fid resolves to path $path" + echo "fid $fid resolves to path $path (expected $expected)" } test_162() { - # Make changes to filesystem - mkdir -p $DIR/$tdir/d2 - touch $DIR/$tdir/d2/$tfile - touch $DIR/$tdir/d2/x1 - touch $DIR/$tdir/d2/x2 - mkdir -p $DIR/$tdir/d2/a/b/c - mkdir -p $DIR/$tdir/d2/p/q/r + # Make changes to filesystem + mkdir -p $DIR/$tdir/d2 + touch $DIR/$tdir/d2/$tfile + touch $DIR/$tdir/d2/x1 + touch $DIR/$tdir/d2/x2 + mkdir -p $DIR/$tdir/d2/a/b/c + mkdir -p $DIR/$tdir/d2/p/q/r # regular file - FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[') - check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 + FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]') + check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 # softlink - ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink - FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[') - check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 + ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink + FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]') + check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 + + # softlink to wrong file + ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong + FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]') + check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 # hardlink - ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink - mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file - FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[') - # fid2path dir/fsname should both work - check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 - check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 - - # hardlink count: check that there are 2 links - # Doesnt work with CMD yet: 17935 + ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink + mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file + FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]') + # fid2path dir/fsname should both work + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 + check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 + + # hardlink count: check that there are 2 links + # Doesnt work with CMD yet: 17935 ${LFS} fid2path $DIR $FID | wc -l | grep -q 2 || \ err17935 "expected 2 links" # hardlink indexing: remove the first link - rm $DIR/$tdir/d2/p/q/r/hlink - check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 + rm $DIR/$tdir/d2/p/q/r/hlink + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 return 0 } diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index a425b1a..0854d8c 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -2996,10 +2996,9 @@ int llapi_changelog_clear(const char *mdtname, const char *idstr, int llapi_fid2path(const char *device, const char *fidstr, char *buf, int buflen, long long *recno, int *linkno) { - char path[PATH_MAX]; struct lu_fid fid; struct getinfo_fid2path *gf; - int fd, rc; + int rc; while (*fidstr == '[') fidstr++; @@ -3012,26 +3011,16 @@ int llapi_fid2path(const char *device, const char *fidstr, char *buf, return -EINVAL; } - /* Take path or fsname */ - if (device[0] == '/') { - strcpy(path, device); - } else { - rc = get_root_path(WANT_PATH | WANT_ERROR, (char *)device, - NULL, path, -1); - if (rc < 0) - return rc; - } - sprintf(path, "%s/%s/fid/%s", path, dot_lustre_name, fidstr); - fd = open(path, O_RDONLY | O_NONBLOCK); - if (fd < 0) - return -errno; - gf = malloc(sizeof(*gf) + buflen); + if (gf == NULL) + return -ENOMEM; gf->gf_fid = fid; gf->gf_recno = *recno; gf->gf_linkno = *linkno; gf->gf_pathlen = buflen; - rc = ioctl(fd, OBD_IOC_FID2PATH, gf); + + /* Take path or fsname */ + rc = root_ioctl(device, OBD_IOC_FID2PATH, gf, NULL, 0); if (rc) { llapi_err(LLAPI_MSG_ERROR, "ioctl err %d", rc); } else { @@ -3041,7 +3030,6 @@ int llapi_fid2path(const char *device, const char *fidstr, char *buf, } free(gf); - close(fd); return rc; } -- 1.8.3.1