From bff1ddd8864ce92aaad7d0ae032f9ac330bd7bf9 Mon Sep 17 00:00:00 2001 From: vs Date: Thu, 23 Oct 2008 14:19:49 +0000 Subject: [PATCH] b=11063 i=green,vitaly this patch reverses https://bugzilla.lustre.org/attachment.cgi?id=7933 https://bugzilla.lustre.org/attachment.cgi?id=7882 https://bugzilla.lustre.org/attachment.cgi?id=15831 and replaces them with setting mtime to past under extent lock sanity test (39c) is added to check original problem i=adilger,grev --- lustre/lov/lov_merge.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/lustre/lov/lov_merge.c b/lustre/lov/lov_merge.c index 9348baa..c30f5f1 100644 --- a/lustre/lov/lov_merge.c +++ b/lustre/lov/lov_merge.c @@ -92,19 +92,14 @@ int lov_merge_lvb(struct obd_export *exp, struct lov_stripe_md *lsm, lov_size = lov_stripe_size(lsm, tmpsize, i); if (lov_size > size) size = lov_size; - /* merge blocks, mtime, atime */ + /* merge blocks, mtime, atime, ctime */ blocks += loi->loi_lvb.lvb_blocks; + if (loi->loi_lvb.lvb_mtime > current_mtime) + current_mtime = loi->loi_lvb.lvb_mtime; if (loi->loi_lvb.lvb_atime > current_atime) current_atime = loi->loi_lvb.lvb_atime; - - /* mtime is always updated with ctime, but can be set in past. - As write and utime(2) may happen within 1 second, and utime's - mtime has a priority over write's one, leave mtime from mds - for the same ctimes. */ - if (loi->loi_lvb.lvb_ctime > current_ctime) { + if (loi->loi_lvb.lvb_ctime > current_ctime) current_ctime = loi->loi_lvb.lvb_ctime; - current_mtime = loi->loi_lvb.lvb_mtime; - } } lvb->lvb_size = size; @@ -177,8 +172,6 @@ void lov_merge_attrs(struct obdo *tgt, struct obdo *src, obd_flag valid, tgt->o_blksize += src->o_blksize; if (valid & OBD_MD_FLCTIME && tgt->o_ctime < src->o_ctime) tgt->o_ctime = src->o_ctime; - /* Only mtime from OSTs are merged here, as they cannot be set - in past (only MDS's mtime can) do not look at ctime. */ if (valid & OBD_MD_FLMTIME && tgt->o_mtime < src->o_mtime) tgt->o_mtime = src->o_mtime; } else { @@ -189,3 +182,24 @@ void lov_merge_attrs(struct obdo *tgt, struct obdo *src, obd_flag valid, *set = 1; } } + +int lov_update_lvb(struct obd_export *exp, struct lov_stripe_md *lsm, + struct ost_lvb *lvb, obd_flag valid) +{ + int i; + struct lov_oinfo *loi; + + LASSERT_SPIN_LOCKED(&lsm->lsm_lock); + LASSERT(lsm->lsm_lock_owner == cfs_current()); + + for (i = 0; i < lsm->lsm_stripe_count; i++) { + loi = lsm->lsm_oinfo[i]; + if (valid & OBD_MD_FLATIME) + loi->loi_lvb.lvb_atime = lvb->lvb_atime; + if (valid & OBD_MD_FLMTIME) + loi->loi_lvb.lvb_mtime = lvb->lvb_mtime; + if (valid & OBD_MD_FLCTIME) + loi->loi_lvb.lvb_ctime = lvb->lvb_ctime; + } + return 0; +} -- 1.8.3.1