From: adilger Date: Thu, 24 Feb 2005 23:27:17 +0000 (+0000) Subject: Branch: b1_4 X-Git-Tag: v1_8_0_110~486^5~4 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=892328cc4c9909e05105f1e7555f4fc4864c2640;p=fs%2Flustre-release.git Branch: b1_4 Allow mtime/atime to be set backward. b=4829, b=5669 --- diff --git a/lustre/ChangeLog b/lustre/ChangeLog index e71df7f..8828480 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -25,6 +25,7 @@ tbd Cluster File Systems, Inc. - fix "lfs check" to not block when the MDS is down (5628) - don't LASSERT in ll_release on NULL lld with NFS export (4655, 5760) - hold NS lock when calling handle_ast_error->del_waiting_lock (5746) + - fix setattr mtime regression from lovcleanup merge (4829, 5669) * miscellania - service request history (4965) - put {ll,lov,osc}_async_page structs in a single slab (4699) diff --git a/lustre/lov/lov_internal.h b/lustre/lov/lov_internal.h index 752d074..635a913 100644 --- a/lustre/lov/lov_internal.h +++ b/lustre/lov/lov_internal.h @@ -80,7 +80,7 @@ static inline struct lov_lock_handles *lov_llh_new(struct lov_stripe_md *lsm) OBD_ALLOC(llh, sizeof *llh + sizeof(*llh->llh_handles) * lsm->lsm_stripe_count); - if (llh == NULL) + if (llh == NULL) return NULL; atomic_set(&llh->llh_refcount, 2); llh->llh_stripe_count = lsm->lsm_stripe_count; @@ -115,7 +115,7 @@ void lov_merge_attrs(struct obdo *tgt, struct obdo *src, obd_flag valid, struct lov_stripe_md *lsm, int stripeno, int *set); /* lov_offset.c */ -obd_size lov_stripe_size(struct lov_stripe_md *lsm, obd_size ost_size, +obd_size lov_stripe_size(struct lov_stripe_md *lsm, obd_size ost_size, int stripeno); int lov_stripe_offset(struct lov_stripe_md *lsm, obd_off lov_off, int stripeno, obd_off *obd_off); @@ -128,31 +128,31 @@ int lov_stripe_number(struct lov_stripe_md *lsm, obd_off lov_off); /* lov_qos.c */ void qos_shrink_lsm(struct lov_request_set *set); -int qos_prep_create(struct lov_obd *lov, struct lov_request_set *set, +int qos_prep_create(struct lov_obd *lov, struct lov_request_set *set, int newea); /* lov_request.c */ void lov_set_add_req(struct lov_request *req, struct lov_request_set *set); -int lov_update_common_set(struct lov_request_set *set, +int lov_update_common_set(struct lov_request_set *set, struct lov_request *req, int rc); -int lov_prep_create_set(struct obd_export *exp, struct lov_stripe_md **ea, +int lov_prep_create_set(struct obd_export *exp, struct lov_stripe_md **ea, struct obdo *src_oa, struct obd_trans_info *oti, struct lov_request_set **reqset); int lov_update_create_set(struct lov_request_set *set, struct lov_request *req, int rc); int lov_fini_create_set(struct lov_request_set *set, struct lov_stripe_md **ea); -int lov_prep_brw_set(struct obd_export *exp, struct obdo *src_oa, +int lov_prep_brw_set(struct obd_export *exp, struct obdo *src_oa, struct lov_stripe_md *lsm, obd_count oa_bufs, struct brw_page *pga, struct obd_trans_info *oti, struct lov_request_set **reqset); int lov_fini_brw_set(struct lov_request_set *set); -int lov_prep_getattr_set(struct obd_export *exp, struct obdo *src_oa, - struct lov_stripe_md *lsm, +int lov_prep_getattr_set(struct obd_export *exp, struct obdo *src_oa, + struct lov_stripe_md *lsm, struct lov_request_set **reqset); int lov_fini_getattr_set(struct lov_request_set *set); int lov_prep_destroy_set(struct obd_export *exp, struct obdo *src_oa, - struct lov_stripe_md *lsm, - struct obd_trans_info *oti, + struct lov_stripe_md *lsm, + struct obd_trans_info *oti, struct lov_request_set **reqset); int lov_update_destroy_set(struct lov_request_set *set, struct lov_request *req, int rc); @@ -160,6 +160,8 @@ int lov_fini_destroy_set(struct lov_request_set *set); int lov_prep_setattr_set(struct obd_export *exp, struct obdo *src_oa, struct lov_stripe_md *lsm, struct obd_trans_info *oti, struct lov_request_set **reqset); +int lov_update_setattr_set(struct lov_request_set *set, + struct lov_request *req, int rc); int lov_fini_setattr_set(struct lov_request_set *set); int lov_prep_punch_set(struct obd_export *exp, struct obdo *src_oa, struct lov_stripe_md *lsm, obd_off start, @@ -172,11 +174,11 @@ int lov_prep_sync_set(struct obd_export *exp, struct obdo *src_oa, struct lov_stripe_md *lsm, obd_off start, obd_off end, struct lov_request_set **reqset); int lov_fini_sync_set(struct lov_request_set *set); -int lov_prep_enqueue_set(struct obd_export *exp, struct lov_stripe_md *lsm, +int lov_prep_enqueue_set(struct obd_export *exp, struct lov_stripe_md *lsm, ldlm_policy_data_t *policy, __u32 mode, struct lustre_handle *lockh, struct lov_request_set **reqset); -int lov_update_enqueue_set(struct lov_request_set *set, +int lov_update_enqueue_set(struct lov_request_set *set, struct lov_request *req, int rc, int flags); int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode); int lov_prep_match_set(struct obd_export *exp, struct lov_stripe_md *lsm, @@ -185,7 +187,7 @@ int lov_prep_match_set(struct obd_export *exp, struct lov_stripe_md *lsm, struct lov_request_set **reqset); int lov_update_match_set(struct lov_request_set *set, struct lov_request *req, int rc); -int lov_fini_match_set(struct lov_request_set *set, __u32 mode, int flags); +int lov_fini_match_set(struct lov_request_set *set, __u32 mode, int flags); int lov_prep_cancel_set(struct obd_export *exp, struct lov_stripe_md *lsm, __u32 mode, struct lustre_handle *lockh, struct lov_request_set **reqset); diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index 70e9690..55166c2 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -737,10 +737,10 @@ static int lov_setattr(struct obd_export *exp, struct obdo *src_oa, list_for_each (pos, &set->set_list) { req = list_entry(pos, struct lov_request, rq_link); - + rc = obd_setattr(lov->tgts[req->rq_idx].ltd_exp, req->rq_oa, NULL, NULL); - err = lov_update_common_set(set, req, rc); + err = lov_update_setattr_set(set, req, rc); if (err) { CERROR("error: setattr objid "LPX64" subobj " LPX64" on OST idx %d: rc = %d\n", diff --git a/lustre/lov/lov_request.c b/lustre/lov/lov_request.c index 01fd978..e273c63 100644 --- a/lustre/lov/lov_request.c +++ b/lustre/lov/lov_request.c @@ -877,11 +877,6 @@ out: RETURN(rc); } -static int getattr_done(struct lov_request_set *set) -{ - return common_attr_done(set); -} - int lov_fini_getattr_set(struct lov_request_set *set) { int rc = 0; @@ -891,7 +886,7 @@ int lov_fini_getattr_set(struct lov_request_set *set) if (set == NULL) RETURN(0); if (set->set_completes) - rc = getattr_done(set); + rc = common_attr_done(set); if (atomic_dec_and_test(&set->set_refcount)) lov_finish_set(set); @@ -1029,11 +1024,6 @@ out_set: RETURN(rc); } -static int setattr_done(struct lov_request_set *set) -{ - return common_attr_done(set); -} - int lov_fini_setattr_set(struct lov_request_set *set) { int rc = 0; @@ -1043,7 +1033,7 @@ int lov_fini_setattr_set(struct lov_request_set *set) if (set == NULL) RETURN(0); if (set->set_completes) { - rc = setattr_done(set); + rc = common_attr_done(set); /* FIXME update qos data here */ } @@ -1111,6 +1101,28 @@ out_set: RETURN(rc); } +int lov_update_setattr_set(struct lov_request_set *set, + struct lov_request *req, int rc) +{ + struct lov_obd *lov = &set->set_exp->exp_obd->u.lov; + ENTRY; + + lov_update_set(set, req, rc); + + /* grace error on inactive ost */ + if (rc && !lov->tgts[req->rq_idx].active) + rc = 0; + + /* FIXME: LOV STACKING update loi data should be done by OSC * + * when this is gone we can go back to using lov_update_common_set() */ + if (rc == 0 && req->rq_oa->o_valid & OBD_MD_FLMTIME) + set->set_md->lsm_oinfo[req->rq_stripe].loi_mtime = + req->rq_oa->o_mtime; + /* ditto loi_atime, loi_ctime when available */ + + RETURN(rc); +} + int lov_update_punch_set(struct lov_request_set *set, struct lov_request *req, int rc) {