From 743dbcdd62a82bbb002c70fd31e88404e2b72dab Mon Sep 17 00:00:00 2001 From: Johann Lombardi Date: Wed, 30 Jun 2010 10:53:33 +0200 Subject: [PATCH] b=23210 don't update obd->obd_osfs if target is gone already i=wangdi i=landen lov_disconnect() can clean up lov->lov_tgts while the statfs interpret routine of an rpc in flight has not been executed yet. --- lustre/lov/lov_request.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lustre/lov/lov_request.c b/lustre/lov/lov_request.c index 0d98af3..9701e0c 100644 --- a/lustre/lov/lov_request.c +++ b/lustre/lov/lov_request.c @@ -1601,14 +1601,12 @@ static int cb_statfs_update(struct obd_info *oinfo, int rc) { struct lov_request *lovreq; struct obd_statfs *osfs, *lov_sfs; - struct obd_device *obd; struct lov_obd *lov; int success; ENTRY; lovreq = container_of(oinfo, struct lov_request, rq_oi); lov = &lovreq->rq_rqset->set_obd->u.lov; - obd = class_exp2obd(lov->lov_tgts[lovreq->rq_idx]->ltd_exp); osfs = lovreq->rq_rqset->set_oi->oi_osfs; lov_sfs = oinfo->oi_osfs; @@ -1625,11 +1623,20 @@ static int cb_statfs_update(struct obd_info *oinfo, int rc) GOTO(out, rc); } - spin_lock(&obd->obd_osfs_lock); - memcpy(&obd->obd_osfs, lov_sfs, sizeof(*lov_sfs)); - if ((oinfo->oi_flags & OBD_STATFS_FROM_CACHE) == 0) - obd->obd_osfs_age = cfs_time_current_64(); - spin_unlock(&obd->obd_osfs_lock); + obd_getref(lovreq->rq_rqset->set_obd); + if (lov->lov_tgts[lovreq->rq_idx] && + lov->lov_tgts[lovreq->rq_idx]->ltd_exp) { + /* lov_disconnect() might have already removed the target */ + struct obd_device *obd; + + obd = class_exp2obd(lov->lov_tgts[lovreq->rq_idx]->ltd_exp); + spin_lock(&obd->obd_osfs_lock); + memcpy(&obd->obd_osfs, lov_sfs, sizeof(*lov_sfs)); + if ((oinfo->oi_flags & OBD_STATFS_FROM_CACHE) == 0) + obd->obd_osfs_age = cfs_time_current_64(); + spin_unlock(&obd->obd_osfs_lock); + } + obd_putref(lovreq->rq_rqset->set_obd); lov_update_statfs(osfs, lov_sfs, success); qos_update(lov); -- 1.8.3.1