From f437134e80a1b320e575d774061e693042f3eb4c Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Wed, 28 Apr 2021 12:43:11 +0800 Subject: [PATCH 1/1] LU-14646 flr: write a FLR file downgrade SoM Seek over file size and write a FLR file does not change its SoM and that makes file size incorrect. Signed-off-by: Bobi Jam Change-Id: I3075389721bdd40be60e9206c37f6c1bea514cce Reviewed-on: https://review.whamcloud.com/43471 Reviewed-by: Andreas Dilger Tested-by: jenkins Tested-by: Maloo Reviewed-by: John L. Hammond Reviewed-by: Oleg Drokin --- lustre/mdd/mdd_object.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 2cfde40..0ed2820 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -2809,6 +2809,12 @@ mdd_layout_update_rdonly(const struct lu_env *env, struct mdd_object *obj, lustre_som_swab(som); if (som->lsa_valid & SOM_FL_STRICT) fl = LU_XATTR_REPLACE; + + if (mlc->mlc_opc == MD_LAYOUT_WRITE && + mlc->mlc_intent->li_extent.e_end > som->lsa_size) { + som->lsa_size = mlc->mlc_intent->li_extent.e_end + 1; + fl = LU_XATTR_REPLACE; + } } rc = mdd_declare_layout_change(env, mdd, obj, mlc, handle); @@ -2871,6 +2877,9 @@ mdd_layout_update_write_pending(const struct lu_env *env, struct thandle *handle) { struct mdd_device *mdd = mdd_obj2mdd_dev(obj); + struct lu_buf *som_buf = &mdd_env_info(env)->mti_buf[1]; + struct lustre_som_attrs *som = &mlc->mlc_som; + int fl = 0; int rc; ENTRY; @@ -2883,8 +2892,25 @@ mdd_layout_update_write_pending(const struct lu_env *env, * resync state. */ break; case MD_LAYOUT_WRITE: - /* legal race for concurrent write, the file state has been - * changed by another client. */ + /** + * legal race for concurrent write, the file state has been + * changed by another client. Or a jump over file size and + * write. + */ + som_buf->lb_buf = som; + som_buf->lb_len = sizeof(*som); + rc = mdo_xattr_get(env, obj, som_buf, XATTR_NAME_SOM); + if (rc < 0 && rc != -ENODATA) + RETURN(rc); + + if (rc > 0) { + lustre_som_swab(som); + if (mlc->mlc_intent->li_extent.e_end > som->lsa_size) { + som->lsa_size = + mlc->mlc_intent->li_extent.e_end + 1; + fl = LU_XATTR_REPLACE; + } + } break; default: RETURN(-EBUSY); @@ -2894,6 +2920,13 @@ mdd_layout_update_write_pending(const struct lu_env *env, if (rc) GOTO(out, rc); + if (fl) { + rc = mdd_declare_xattr_set(env, mdd, obj, som_buf, + XATTR_NAME_SOM, fl, handle); + if (rc) + GOTO(out, rc); + } + rc = mdd_trans_start(env, mdd, handle); if (rc) GOTO(out, rc); @@ -2903,6 +2936,12 @@ mdd_layout_update_write_pending(const struct lu_env *env, mdd_write_lock(env, obj, DT_TGT_CHILD); rc = mdo_layout_change(env, obj, mlc, handle); + if (!rc && fl) { + som->lsa_valid = SOM_FL_STALE; + lustre_som_swab(som); + rc = mdo_xattr_set(env, obj, som_buf, XATTR_NAME_SOM, + fl, handle); + } mdd_write_unlock(env, obj); if (rc) GOTO(out, rc); -- 1.8.3.1