From f6590af04b98ef48cd10e950ef50a5c202bf394d Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Mon, 20 May 2024 17:20:34 -0400 Subject: [PATCH] LU-17939 ofd: validate FID in MDT/OFD OST object FID from other nodes can only be normal FID, IDIF, ECHO or OST_MDT0, and MDT object FID can only be namespace visible FID or local ROOT, return error if it's not true to avoid assertion later. Signed-off-by: Lai Siyao Change-Id: I0c518c67acad44e90159fff71ff4fa9b893e8f3d Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/55401 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Hongchao Zhang Reviewed-by: Oleg Drokin Reviewed-by: Andreas Dilger --- lustre/mdt/mdt_handler.c | 6 ++++++ lustre/ofd/ofd_objects.c | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 68c32b4..9dcae05 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -3612,6 +3612,12 @@ struct mdt_object *mdt_object_find(const struct lu_env *env, struct mdt_object *m; ENTRY; + /* mdt_orphan_open() gets local ROOT */ + if (!fid_is_namespace_visible(f) && !fid_is_local_file(f)) { + CERROR("%s: MDT object FID "DFID" is corrupt: rc = %d\n", + mdt_obd_name(d), PFID(f), -EINVAL); + RETURN(ERR_PTR(-EINVAL)); + } CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f)); o = lu_object_find(env, &d->mdt_lu_dev, f, NULL); diff --git a/lustre/ofd/ofd_objects.c b/lustre/ofd/ofd_objects.c index 2af0f2d..b66b6c0 100644 --- a/lustre/ofd/ofd_objects.c +++ b/lustre/ofd/ofd_objects.c @@ -104,7 +104,13 @@ struct ofd_object *ofd_object_find(const struct lu_env *env, struct lu_object *o; ENTRY; - + if (!(fid_is_mdt0(fid) || fid_is_norm(fid) || fid_is_idif(fid) || + fid_is_echo(fid)) || + fid_oid(fid) == 0) { + CERROR("%s: OST object FID "DFID" is corrupt, rc = %d\n", + ofd_name(ofd), PFID(fid), -EINVAL); + RETURN(ERR_PTR(-EINVAL)); + } o = lu_object_find(env, &ofd->ofd_dt_dev.dd_lu_dev, fid, NULL); if (likely(!IS_ERR(o))) fo = ofd_obj(o); -- 1.8.3.1