From d76b510777f2f7d8d34898c22249aed4013f7d7f Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Wed, 10 Mar 2021 18:13:18 +0800 Subject: [PATCH] LU-14504 lod: lod_xattr_del() check obj existence lod_declare_xattr_del() skips object if it doesn't exist, but lod_xattr_del() doesn't, which may trigger assertion in osp_xattr_del() if a stripe doesn't exist. Lustre-change: https://review.whamcloud.com/41976 Lustre-commit: c8d81a1d1d82fede40ae95924aca12bc5e55426d Signed-off-by: Lai Siyao Change-Id: I00723d3b0243efd1357107c59dd86967e076e2af Reviewed-by: Li Xi Reviewed-on: https://review.whamcloud.com/42047 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- lustre/lod/lod_object.c | 45 ++++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index acccfa8..a8aace9 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -3578,10 +3578,11 @@ static int lod_xattr_del_internal(const struct lu_env *env, struct dt_object *dt, const char *name, struct thandle *th) { - struct dt_object *next = dt_object_child(dt); - struct lod_object *lo = lod_dt_obj(dt); - int rc; - int i; + struct dt_object *next = dt_object_child(dt); + struct lod_object *lo = lod_dt_obj(dt); + int i; + int rc; + ENTRY; rc = lod_sub_xattr_del(env, next, name, th); @@ -3592,7 +3593,11 @@ static int lod_xattr_del_internal(const struct lu_env *env, RETURN(rc); for (i = 0; i < lo->ldo_dir_stripe_count; i++) { - LASSERT(lo->ldo_stripe[i]); + if (!lo->ldo_stripe[i]) + continue; + + if (!dt_object_exists(lo->ldo_stripe[i])) + continue; rc = lod_sub_xattr_del(env, lo->ldo_stripe[i], name, th); if (rc != 0) @@ -4697,6 +4702,9 @@ static int lod_declare_xattr_del(const struct lu_env *env, if (!dto) continue; + if (!dt_object_exists(dto)) + continue; + rc = lod_sub_declare_xattr_del(env, dto, name, th); if (rc != 0) break; @@ -4716,35 +4724,14 @@ static int lod_declare_xattr_del(const struct lu_env *env, static int lod_xattr_del(const struct lu_env *env, struct dt_object *dt, const char *name, struct thandle *th) { - struct dt_object *next = dt_object_child(dt); - struct lod_object *lo = lod_dt_obj(dt); - int rc; - int i; + int rc; + ENTRY; if (!strcmp(name, XATTR_NAME_LOV) || !strcmp(name, XATTR_NAME_LMV)) lod_striping_free(env, lod_dt_obj(dt)); - rc = lod_sub_xattr_del(env, next, name, th); - if (rc != 0 || !S_ISDIR(dt->do_lu.lo_header->loh_attr)) - RETURN(rc); - - if (!strcmp(name, XATTR_NAME_LMV)) - RETURN(0); - - if (lo->ldo_dir_stripe_count == 0) - RETURN(0); - - for (i = 0; i < lo->ldo_dir_stripe_count; i++) { - struct dt_object *dto = lo->ldo_stripe[i]; - - if (!dto) - continue; - - rc = lod_sub_xattr_del(env, dto, name, th); - if (rc != 0) - break; - } + rc = lod_xattr_del_internal(env, dt, name, th); RETURN(rc); } -- 1.8.3.1