From 61506bf8a83c38f79e908405cbc9248d5808f34d Mon Sep 17 00:00:00 2001 From: build Date: Thu, 11 Oct 2012 13:16:32 -0500 Subject: [PATCH] LU-1531 mdt: Check non-normalised fid. Apply fid checking in a manner similar to mdt_fid2path processing. IGIF FIDs are checked to ensure correct behavior for upgraded 1.8 filesystems. Signed-off-by: Richard Henwood Change-Id: Iea7ebfda8a31915b9d4fe2959773c9312b087485 Reviewed-on: http://review.whamcloud.com/4255 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Mike Pershin Reviewed-by: Oleg Drokin --- lustre/mdt/mdt_handler.c | 66 +++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 5ba7efe..d30f4ec 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -5772,42 +5772,50 @@ static int mdt_rpc_fid2path(struct mdt_thread_info *info, void *key, } static int mdt_fid2path(const struct lu_env *env, struct mdt_device *mdt, - struct getinfo_fid2path *fp) + struct getinfo_fid2path *fp) { - struct mdt_object *obj; - int rc; - ENTRY; + struct mdt_object *obj; + struct obd_device *obd = mdt2obd_dev(mdt); + int rc; + ENTRY; - CDEBUG(D_IOCTL, "path get "DFID" from "LPU64" #%d\n", - PFID(&fp->gf_fid), fp->gf_recno, fp->gf_linkno); + CDEBUG(D_IOCTL, "path get "DFID" from "LPU64" #%d\n", + PFID(&fp->gf_fid), fp->gf_recno, fp->gf_linkno); - if (!fid_is_sane(&fp->gf_fid)) - RETURN(-EINVAL); + if (!fid_is_sane(&fp->gf_fid)) + RETURN(-EINVAL); - obj = mdt_object_find(env, mdt, &fp->gf_fid); - if (obj == NULL || IS_ERR(obj)) { - CDEBUG(D_IOCTL, "no object "DFID": %ld\n", PFID(&fp->gf_fid), - PTR_ERR(obj)); - RETURN(-EINVAL); - } + if (!fid_is_norm(&fp->gf_fid) && !fid_is_igif(&fp->gf_fid)) { + CWARN("%s: "DFID" is invalid, sequence should be " + ">= "LPX64"\n", obd->obd_name, + PFID(&fp->gf_fid), (__u64)FID_SEQ_NORMAL); + RETURN(-EINVAL); + } - rc = lu_object_exists(&obj->mot_obj.mo_lu); - if (rc <= 0) { - if (rc == -1) - rc = -EREMOTE; - else - rc = -ENOENT; - mdt_object_put(env, obj); - CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n", - PFID(&fp->gf_fid), rc); - RETURN(rc); - } + obj = mdt_object_find(env, mdt, &fp->gf_fid); + if (obj == NULL || IS_ERR(obj)) { + CDEBUG(D_IOCTL, "no object "DFID": %ld\n", PFID(&fp->gf_fid), + PTR_ERR(obj)); + RETURN(-EINVAL); + } + + rc = lu_object_exists(&obj->mot_obj.mo_lu); + if (rc <= 0) { + if (rc == -1) + rc = -EREMOTE; + else + rc = -ENOENT; + mdt_object_put(env, obj); + CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n", + PFID(&fp->gf_fid), rc); + RETURN(rc); + } - rc = mo_path(env, md_object_next(&obj->mot_obj), fp->gf_path, - fp->gf_pathlen, &fp->gf_recno, &fp->gf_linkno); - mdt_object_put(env, obj); + rc = mo_path(env, md_object_next(&obj->mot_obj), fp->gf_path, + fp->gf_pathlen, &fp->gf_recno, &fp->gf_linkno); + mdt_object_put(env, obj); - RETURN(rc); + RETURN(rc); } static int mdt_get_info(struct mdt_thread_info *info) -- 1.8.3.1