X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fliblustre%2Frw.c;h=7287e77b0e5abeeaaaee1f465e8be7ed0d4a5458;hb=bc310f7889a95597962ae4ff9414b02847b75034;hp=d7afd798ccf4e693e6042b968c8c1a89fab26058;hpb=27dd14f3dfdbcad29b29270c33b69c1e28cdecfa;p=fs%2Flustre-release.git diff --git a/lustre/liblustre/rw.c b/lustre/liblustre/rw.c index d7afd79..7287e77 100644 --- a/lustre/liblustre/rw.c +++ b/lustre/liblustre/rw.c @@ -94,7 +94,7 @@ static int llu_lock_to_stripe_offset(struct inode *inode, struct ldlm_lock *lock char name[16]; struct ldlm_lock *lock; struct lov_stripe_md *lsm; - } key = { .name = "lock_to_stripe", .lock = lock, .lsm = lsm }; + } key = { .name = KEY_LOCK_TO_STRIPE, .lock = lock, .lsm = lsm }; __u32 stripe, vallen = sizeof(stripe); int rc; ENTRY; @@ -112,9 +112,9 @@ static int llu_lock_to_stripe_offset(struct inode *inode, struct ldlm_lock *lock RETURN(stripe); } -static int llu_extent_lock_callback(struct ldlm_lock *lock, - struct ldlm_lock_desc *new, void *data, - int flag) +int llu_extent_lock_cancel_cb(struct ldlm_lock *lock, + struct ldlm_lock_desc *new, void *data, + int flag) { struct lustre_handle lockh = { 0 }; int rc; @@ -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 @@ -286,7 +295,7 @@ int llu_glimpse_size(struct inode *inode) einfo.ei_type = LDLM_EXTENT; einfo.ei_mode = LCK_PR; - einfo.ei_cb_bl = llu_extent_lock_callback; + einfo.ei_cb_bl = osc_extent_blocking_cb; einfo.ei_cb_cp = ldlm_completion_ast; einfo.ei_cb_gl = llu_glimpse_callback; einfo.ei_cbdata = inode; @@ -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); @@ -336,7 +345,7 @@ int llu_extent_lock(struct ll_file_data *fd, struct inode *inode, einfo.ei_type = LDLM_EXTENT; einfo.ei_mode = mode; - einfo.ei_cb_bl = llu_extent_lock_callback; + einfo.ei_cb_bl = osc_extent_blocking_cb; einfo.ei_cb_cp = ldlm_completion_ast; einfo.ei_cb_gl = llu_glimpse_callback; einfo.ei_cbdata = inode; @@ -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, @@ -522,12 +537,15 @@ static int llu_queue_pio(int cmd, struct llu_io_group *group, rc = obd_prep_async_page(exp, lsm, NULL, page, (obd_off)page->index << CFS_PAGE_SHIFT, &llu_async_page_ops, - llap, &llap->llap_cookie); + llap, &llap->llap_cookie, + 1 /* no cache in liblustre at all */, + NULL); if (rc) { LASSERT(rc < 0); 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); @@ -593,7 +611,8 @@ struct llu_io_group * get_io_group(struct inode *inode, int maxpages, if (!llap_cookie_size) llap_cookie_size = obd_prep_async_page(llu_i2obdexp(inode), NULL, NULL, NULL, 0, - NULL, NULL, NULL); + NULL, NULL, NULL, 0, + NULL); OBD_ALLOC(group, LLU_IO_GROUP_SIZE(maxpages)); if (!group)