Whamcloud - gitweb
b=15316,13969
[fs/lustre-release.git] / lustre / liblustre / rw.c
index d7afd79..021a592 100644 (file)
@@ -179,7 +179,6 @@ static int llu_glimpse_callback(struct ldlm_lock *lock, void *reqp)
         struct inode *inode = llu_inode_from_lock(lock);
         struct llu_inode_info *lli;
         struct ost_lvb *lvb;
-        int size[2] = { sizeof(struct ptlrpc_body), sizeof(*lvb) };
         int rc, stripe = 0;
         ENTRY;
 
@@ -195,11 +194,16 @@ static int llu_glimpse_callback(struct ldlm_lock *lock, void *reqp)
         if (lli->lli_smd->lsm_stripe_count > 1)
                 stripe = llu_lock_to_stripe_offset(inode, lock);
 
-        rc = lustre_pack_reply(req, 2, size, NULL);
-        if (rc)
+        req_capsule_extend(&req->rq_pill, &RQF_LDLM_GL_CALLBACK);
+        req_capsule_set_size(&req->rq_pill, &RMF_DLM_LVB, RCL_SERVER,
+                             sizeof(*lvb));
+        rc = req_capsule_server_pack(&req->rq_pill);
+        if (rc) {
+                CERROR("failed pack reply: %d\n", rc);
                 GOTO(iput, rc);
+        }
 
-        lvb = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, sizeof(*lvb));
+        lvb = req_capsule_server_get(&req->rq_pill, &RMF_DLM_LVB);
         lvb->lvb_size = lli->lli_smd->lsm_oinfo[stripe]->loi_kms;
 
         LDLM_DEBUG(lock, "i_size: %llu -> stripe number %u -> kms "LPU64,
@@ -216,22 +220,27 @@ static int llu_glimpse_callback(struct ldlm_lock *lock, void *reqp)
         return rc;
 }
 
-static void llu_merge_lvb(struct inode *inode)
+static int llu_merge_lvb(struct inode *inode)
 {
         struct llu_inode_info *lli = llu_i2info(inode);
         struct llu_sb_info *sbi = llu_i2sbi(inode);
         struct intnl_stat *st = llu_i2stat(inode);
         struct ost_lvb lvb;
+        int rc;
         ENTRY;
 
         inode_init_lvb(inode, &lvb);
-        obd_merge_lvb(sbi->ll_dt_exp, lli->lli_smd, &lvb, 0);
+        rc = obd_merge_lvb(sbi->ll_dt_exp, lli->lli_smd, &lvb, 0);
         st->st_size = lvb.lvb_size;
         st->st_blocks = lvb.lvb_blocks;
+        /* handle st_blocks overflow gracefully */
+        if (st->st_blocks < lvb.lvb_blocks)
+                st->st_blocks = ~0UL;
         st->st_mtime = lvb.lvb_mtime;
         st->st_atime = lvb.lvb_atime;
         st->st_ctime = lvb.lvb_ctime;
-        EXIT;
+
+        RETURN(rc);
 }
 
 int llu_local_size(struct inode *inode)
@@ -254,9 +263,9 @@ int llu_local_size(struct inode *inode)
         else if (rc == 0)
                 RETURN(-ENODATA);
         
-        llu_merge_lvb(inode);
+        rc = llu_merge_lvb(inode);
         obd_cancel(sbi->ll_dt_exp, lli->lli_smd, LCK_PR, &lockh);
-        RETURN(0);
+        RETURN(rc);
 }
 
 /* NB: lov_merge_size will prefer locally cached writes if they extend the
@@ -302,7 +311,7 @@ int llu_glimpse_size(struct inode *inode)
                 RETURN(rc > 0 ? -EIO : rc);
         }
 
-        llu_merge_lvb(inode);
+        rc = llu_merge_lvb(inode);
         CDEBUG(D_DLMTRACE, "glimpse: size: "LPU64", blocks: "LPU64"\n",
                (__u64)st->st_size, (__u64)st->st_blocks);
 
@@ -451,12 +460,18 @@ static int llu_ap_completion(void *data, int cmd, struct obdo *oa, int rc)
         RETURN(0);
 }
 
+static struct obd_capa * llu_ap_lookup_capa(void *data, int cmd)
+{
+        return NULL;
+}
+
 static struct obd_async_page_ops llu_async_page_ops = {
         .ap_make_ready =        NULL,
         .ap_refresh_count =     NULL,
         .ap_fill_obdo =         llu_ap_fill_obdo,
         .ap_update_obdo =       llu_ap_update_obdo,
         .ap_completion =        llu_ap_completion,
+        .ap_lookup_capa =       llu_ap_lookup_capa,
 };
 
 static int llu_queue_pio(int cmd, struct llu_io_group *group,
@@ -528,6 +543,7 @@ static int llu_queue_pio(int cmd, struct llu_io_group *group,
                         llap->llap_cookie = NULL;
                         RETURN(rc);
                 }
+
                 CDEBUG(D_CACHE, "llap %p page %p group %p obj off "LPU64"\n",
                        llap, page, llap->llap_cookie,
                        (obd_off)pages->index << CFS_PAGE_SHIFT);