Whamcloud - gitweb
LU-1531 mdt: Check non-normalised fid.
authorbuild <build@lgit-121.(none)>
Thu, 11 Oct 2012 18:16:32 +0000 (13:16 -0500)
committerOleg Drokin <green@whamcloud.com>
Wed, 7 Nov 2012 02:21:59 +0000 (21:21 -0500)
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 <richard.henwood@intel.com>
Change-Id: Iea7ebfda8a31915b9d4fe2959773c9312b087485
Reviewed-on: http://review.whamcloud.com/4255
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Mike Pershin <tappro@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mdt/mdt_handler.c

index 5ba7efe..d30f4ec 100644 (file)
@@ -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)