Whamcloud - gitweb
Branch: b1_4
authoradilger <adilger>
Thu, 24 Feb 2005 23:27:17 +0000 (23:27 +0000)
committeradilger <adilger>
Thu, 24 Feb 2005 23:27:17 +0000 (23:27 +0000)
Allow mtime/atime to be set backward.
b=4829, b=5669

lustre/ChangeLog
lustre/lov/lov_internal.h
lustre/lov/lov_obd.c
lustre/lov/lov_request.c

index e71df7f..8828480 100644 (file)
@@ -25,6 +25,7 @@ tbd         Cluster File Systems, Inc. <info@clusterfs.com>
        - 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)
index 752d074..635a913 100644 (file)
@@ -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);
index 70e9690..55166c2 100644 (file)
@@ -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",
index 01fd978..e273c63 100644 (file)
@@ -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)
 {