Whamcloud - gitweb
LU-16335 test: add fail_abort_cleanup()
[fs/lustre-release.git] / lustre / lov / lov_merge.c
index 30fb5b4..09d2299 100644 (file)
@@ -32,7 +32,7 @@
 #define DEBUG_SUBSYSTEM S_LOV
 
 #include <libcfs/libcfs.h>
-
+#include <cl_object.h>
 #include <obd_class.h>
 #include "lov_internal.h"
 
  * uptodate time on the local client.
  */
 int lov_merge_lvb_kms(struct lov_stripe_md *lsm, int index,
-                     struct ost_lvb *lvb, __u64 *kms_place)
+                     struct cl_attr *attr)
 {
        struct lov_stripe_md_entry *lse = lsm->lsm_entries[index];
        u64 size = 0;
        u64 kms = 0;
        u64 blocks = 0;
-       s64 current_mtime = lvb->lvb_mtime;
-       s64 current_atime = lvb->lvb_atime;
-       s64 current_ctime = lvb->lvb_ctime;
+       /* XXX: timestamps can be negative by sanity:test_39m,
+        * how can it be? */
+       s64 current_mtime = LLONG_MIN;
+       s64 current_atime = LLONG_MIN;
+       s64 current_ctime = LLONG_MIN;
        int i;
        int rc = 0;
 
        assert_spin_locked(&lsm->lsm_lock);
        LASSERT(lsm->lsm_lock_owner == current->pid);
-
-       CDEBUG(D_INODE, "MDT ID "DOSTID" initial value: s=%llu m=%llu"
-              " a=%llu c=%llu b=%llu\n", POSTID(&lsm->lsm_oi),
-              lvb->lvb_size, lvb->lvb_mtime, lvb->lvb_atime, lvb->lvb_ctime,
-              lvb->lvb_blocks);
        for (i = 0; i < lse->lsme_stripe_count; i++) {
                struct lov_oinfo *loi = lse->lsme_oinfo[i];
                u64 lov_size;
@@ -71,7 +68,12 @@ int lov_merge_lvb_kms(struct lov_stripe_md *lsm, int index,
                        continue;
                }
 
-               tmpsize = loi->loi_kms;
+               if (loi->loi_kms_valid) {
+                       attr->cat_kms_valid = 1;
+                       tmpsize = loi->loi_kms;
+               } else {
+                       tmpsize = 0;
+               }
                lov_size = lov_stripe_size(lsm, index, tmpsize, i);
                if (lov_size > kms)
                        kms = lov_size;
@@ -91,18 +93,20 @@ int lov_merge_lvb_kms(struct lov_stripe_md *lsm, int index,
                if (loi->loi_lvb.lvb_ctime > current_ctime)
                        current_ctime = loi->loi_lvb.lvb_ctime;
 
-               CDEBUG(D_INODE, "MDT ID "DOSTID" on OST[%u]: s=%llu m=%llu"
+               CDEBUG(D_INODE, "MDT ID "DOSTID" on OST[%u]: s=%llu (%d) m=%llu"
                       " a=%llu c=%llu b=%llu\n", POSTID(&lsm->lsm_oi),
-                      loi->loi_ost_idx, loi->loi_lvb.lvb_size,
+                      loi->loi_ost_idx, loi->loi_lvb.lvb_size, loi->loi_kms_valid,
                       loi->loi_lvb.lvb_mtime, loi->loi_lvb.lvb_atime,
                       loi->loi_lvb.lvb_ctime, loi->loi_lvb.lvb_blocks);
        }
 
-       *kms_place = kms;
-       lvb->lvb_size = size;
-       lvb->lvb_blocks = blocks;
-       lvb->lvb_mtime = current_mtime;
-       lvb->lvb_atime = current_atime;
-       lvb->lvb_ctime = current_ctime;
+       if (!rc) {
+               attr->cat_kms    = kms;
+               attr->cat_size   = size;
+               attr->cat_mtime  = current_mtime;
+               attr->cat_atime  = current_atime;
+               attr->cat_ctime  = current_ctime;
+               attr->cat_blocks = blocks;
+       }
        RETURN(rc);
 }