X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_request.c;h=f800a18688a0159cb5134793fabcc4bbc6a1a432;hb=a25adb47c7b7eeb68a922e2647d74eeff3401c6a;hp=fbdefef140941eda53bb16e1d6f1d9c7de8c4898;hpb=d2d56f38da01001c92a09afc6b52b5acbd9bc13c;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_request.c b/lustre/lov/lov_request.c index fbdefef..f800a18 100644 --- a/lustre/lov/lov_request.c +++ b/lustre/lov/lov_request.c @@ -161,7 +161,7 @@ int lov_update_enqueue_set(struct lov_request *req, __u32 mode, int rc) ldlm_lock_allow_match(lock); LDLM_LOCK_PUT(lock); } else if ((rc == ELDLM_LOCK_ABORTED) && - (set->set_ei->ei_flags & LDLM_FL_HAS_INTENT)) { + (set->set_oi->oi_flags & LDLM_FL_HAS_INTENT)) { memset(lov_lockhp, 0, sizeof(*lov_lockhp)); lov_stripe_lock(set->set_oi->oi_md); loi->loi_lvb = req->rq_oi.oi_md->lsm_oinfo[0]->loi_lvb; @@ -192,7 +192,7 @@ int lov_update_enqueue_set(struct lov_request *req, __u32 mode, int rc) /* The callback for osc_enqueue that updates lov info for every OSC request. */ static int cb_update_enqueue(struct obd_info *oinfo, int rc) { - struct obd_enqueue_info *einfo; + struct ldlm_enqueue_info *einfo; struct lov_request *lovreq; lovreq = container_of(oinfo, struct lov_request, rq_oi); @@ -237,7 +237,8 @@ static int enqueue_done(struct lov_request_set *set, __u32 mode) RETURN(rc); } -int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode, int rc) +int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode, int rc, + struct ptlrpc_request_set *rqset) { int ret = 0; ENTRY; @@ -247,7 +248,7 @@ int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode, int rc) LASSERT(set->set_exp); /* Do enqueue_done only for sync requests and if any request * succeeded. */ - if (!set->set_ei->ei_rqset) { + if (!rqset) { if (rc) set->set_completes = 0; ret = enqueue_done(set, mode); @@ -261,7 +262,7 @@ int lov_fini_enqueue_set(struct lov_request_set *set, __u32 mode, int rc) } int lov_prep_enqueue_set(struct obd_export *exp, struct obd_info *oinfo, - struct obd_enqueue_info *einfo, + struct ldlm_enqueue_info *einfo, struct lov_request_set **reqset) { struct lov_obd *lov = &exp->exp_obd->u.lov; @@ -321,6 +322,7 @@ int lov_prep_enqueue_set(struct obd_export *exp, struct obd_info *oinfo, /* Set lov request specific parameters. */ req->rq_oi.oi_lockh = set->set_lockh->llh_handles + i; req->rq_oi.oi_cb_up = cb_update_enqueue; + req->rq_oi.oi_flags = oinfo->oi_flags; LASSERT(req->rq_oi.oi_lockh); @@ -348,7 +350,7 @@ int lov_prep_enqueue_set(struct obd_export *exp, struct obd_info *oinfo, *reqset = set; RETURN(0); out_set: - lov_fini_enqueue_set(set, einfo->ei_mode, rc); + lov_fini_enqueue_set(set, einfo->ei_mode, rc, NULL); RETURN(rc); } @@ -358,7 +360,7 @@ int lov_update_match_set(struct lov_request_set *set, struct lov_request *req, int ret = rc; ENTRY; - if (rc == 1) + if (rc > 0) ret = 0; else if (rc == 0) ret = 1; @@ -508,7 +510,7 @@ int lov_prep_cancel_set(struct obd_export *exp, struct obd_info *oinfo, lov_lockhp = set->set_lockh->llh_handles + i; if (!lustre_handle_is_used(lov_lockhp)) { - CDEBUG(D_HA, "lov idx %d subobj "LPX64" no lock?\n", + CDEBUG(D_RPCTRACE,"lov idx %d subobj "LPX64" no lock\n", loi->loi_ost_idx, loi->loi_id); continue; } @@ -1497,6 +1499,8 @@ int lov_fini_statfs_set(struct lov_request_set *set) void lov_update_statfs(struct obd_device *obd, struct obd_statfs *osfs, struct obd_statfs *lov_sfs, int success) { + int shift = 0, quit = 0; + __u64 tmp; spin_lock(&obd->obd_osfs_lock); memcpy(&obd->obd_osfs, lov_sfs, sizeof(*lov_sfs)); obd->obd_osfs_age = get_jiffies_64(); @@ -1505,6 +1509,33 @@ void lov_update_statfs(struct obd_device *obd, struct obd_statfs *osfs, if (success == 0) { memcpy(osfs, lov_sfs, sizeof(*lov_sfs)); } else { + if (osfs->os_bsize != lov_sfs->os_bsize) { + /* assume all block sizes are always powers of 2 */ + /* get the bits difference */ + tmp = osfs->os_bsize | lov_sfs->os_bsize; + for (shift = 0; shift <= 64; ++shift) { + if (tmp & 1) { + if (quit) + break; + else + quit = 1; + shift = 0; + } + tmp >>= 1; + } + } + + if (osfs->os_bsize < lov_sfs->os_bsize) { + osfs->os_bsize = lov_sfs->os_bsize; + + osfs->os_bfree >>= shift; + osfs->os_bavail >>= shift; + osfs->os_blocks >>= shift; + } else if (shift != 0) { + lov_sfs->os_bfree >>= shift; + lov_sfs->os_bavail >>= shift; + lov_sfs->os_blocks >>= shift; + } #ifdef MIN_DF /* Sandia requested that df (and so, statfs) only returned minimal available space on