X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_merge.c;h=8ba1e1a66073279ff8a7f36b2b341d82711830b3;hb=6dd41a43e3cdff1b2e0713cfc163734889d8650a;hp=20abe46ed77fd118d975a1e0442b4798ed0ea554;hpb=fbf5870b9848929d352460f1f005b79c0b5ccc5a;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_merge.c b/lustre/lov/lov_merge.c index 20abe46..8ba1e1a 100644 --- a/lustre/lov/lov_merge.c +++ b/lustre/lov/lov_merge.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,7 +24,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -34,9 +32,6 @@ * Lustre is a trademark of Sun Microsystems, Inc. */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_LOV #ifdef __KERNEL__ @@ -61,9 +56,9 @@ int lov_merge_lvb_kms(struct lov_stripe_md *lsm, __u64 size = 0; __u64 kms = 0; __u64 blocks = 0; - __u64 current_mtime = lvb->lvb_mtime; - __u64 current_atime = lvb->lvb_atime; - __u64 current_ctime = lvb->lvb_ctime; + obd_time current_mtime = lvb->lvb_mtime; + obd_time current_atime = lvb->lvb_atime; + obd_time current_ctime = lvb->lvb_ctime; int i; int rc = 0; @@ -72,6 +67,11 @@ int lov_merge_lvb_kms(struct lov_stripe_md *lsm, LASSERT(lsm->lsm_lock_owner == cfs_curproc_pid()); #endif + CDEBUG(D_INODE, "MDT FID "DFID" initial value: s="LPU64" m="LPU64 + " a="LPU64" c="LPU64" b="LPU64"\n", + lsm->lsm_object_seq, (__u32)lsm->lsm_object_id, + (__u32)(lsm->lsm_object_id >> 32), lvb->lvb_size, + lvb->lvb_mtime, lvb->lvb_atime, lvb->lvb_ctime, lvb->lvb_blocks); for (i = 0; i < lsm->lsm_stripe_count; i++) { struct lov_oinfo *loi = lsm->lsm_oinfo[i]; obd_size lov_size, tmpsize; @@ -94,17 +94,19 @@ int lov_merge_lvb_kms(struct lov_stripe_md *lsm, size = lov_size; /* merge blocks, mtime, atime */ 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; - } + CDEBUG(D_INODE, "MDT FID "DFID" on OST[%u]: s="LPU64" m="LPU64 + " a="LPU64" c="LPU64" b="LPU64"\n", + lsm->lsm_object_seq, (__u32)lsm->lsm_object_id, + (__u32)(lsm->lsm_object_id >> 32), loi->loi_ost_idx, + loi->loi_lvb.lvb_size, loi->loi_lvb.lvb_mtime, + loi->loi_lvb.lvb_atime, loi->loi_lvb.lvb_ctime, + loi->loi_lvb.lvb_blocks); } *kms_place = kms; @@ -121,24 +123,28 @@ int lov_merge_lvb_kms(struct lov_stripe_md *lsm, * current atime, mtime, ctime to avoid regressing a more uptodate time on * the local client. * - * If @kms_only is set then we do not consider the recently seen size (rss) + * If \a kms_only is set then we do not consider the recently seen size (rss) * when updating the known minimum size (kms). Even when merging RSS, we will * take the KMS value if it's larger. This prevents getattr from stomping on * dirty cached pages which extend the file size. */ int lov_merge_lvb(struct obd_export *exp, struct lov_stripe_md *lsm, struct ost_lvb *lvb, int kms_only) { - int rc; - __u64 kms; - - ENTRY; - rc = lov_merge_lvb_kms(lsm, lvb, &kms); - if (kms_only) - lvb->lvb_size = kms; - CDEBUG(D_INODE, "merged: %llu %llu %llu %llu %llu\n", - lvb->lvb_size, lvb->lvb_mtime, lvb->lvb_atime, - lvb->lvb_ctime, lvb->lvb_blocks); - RETURN(rc); + int rc; + __u64 kms; + + ENTRY; + lov_stripe_lock(lsm); + rc = lov_merge_lvb_kms(lsm, lvb, &kms); + lov_stripe_unlock(lsm); + if (kms_only) + lvb->lvb_size = kms; + CDEBUG(D_INODE, "merged for FID "DFID" s="LPU64" m="LPU64" a="LPU64 + " c="LPU64" b="LPU64"\n", + lsm->lsm_object_seq, (__u32)lsm->lsm_object_id, + (__u32)(lsm->lsm_object_id >> 32), lvb->lvb_size, lvb->lvb_mtime, + lvb->lvb_atime, lvb->lvb_ctime, lvb->lvb_blocks); + RETURN(rc); } /* Must be called under the lov_stripe_lock() */ @@ -181,7 +187,7 @@ int lov_adjust_kms(struct obd_export *exp, struct lov_stripe_md *lsm, RETURN(0); } -void lov_merge_attrs(struct obdo *tgt, struct obdo *src, obd_flag valid, +void lov_merge_attrs(struct obdo *tgt, struct obdo *src, obd_valid valid, struct lov_stripe_md *lsm, int stripeno, int *set) { valid &= src->o_valid; @@ -201,15 +207,20 @@ 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; + if (valid & OBD_MD_FLDATAVERSION) + tgt->o_data_version += src->o_data_version; } else { memcpy(tgt, src, sizeof(*tgt)); tgt->o_id = lsm->lsm_object_id; if (valid & OBD_MD_FLSIZE) tgt->o_size = lov_stripe_size(lsm,src->o_size,stripeno); - *set = 1; } + + /* data_version needs to be valid on all stripes to be correct! */ + if (!(valid & OBD_MD_FLDATAVERSION)) + tgt->o_valid &= ~OBD_MD_FLDATAVERSION; + + *set += 1; }