X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Fquota_master.c;h=37e6ad6eaf315c3d74f733a5ecc0500fef58bcdb;hb=35ece05e690ec123c8b9385d9011591d7cf1b6e2;hp=9629357db9fad967d286f64864eee4d0493a7826;hpb=bc60e9e0608e0afbda9e1439bf98730a83a5bb87;p=fs%2Flustre-release.git diff --git a/lustre/quota/quota_master.c b/lustre/quota/quota_master.c index 9629357..37e6ad6 100644 --- a/lustre/quota/quota_master.c +++ b/lustre/quota/quota_master.c @@ -141,7 +141,7 @@ static struct lustre_dquot *alloc_dquot(struct lustre_quota_info *lqi, struct lustre_dquot *dquot = NULL; ENTRY; - OBD_SLAB_ALLOC(dquot, lustre_dquot_cachep, CFS_ALLOC_IO, sizeof(*dquot)); + OBD_SLAB_ALLOC_PTR_GFP(dquot, lustre_dquot_cachep, CFS_ALLOC_IO); if (dquot == NULL) RETURN(NULL); @@ -552,8 +552,9 @@ int mds_quota_adjust(struct obd_device *obd, unsigned int qcids[], } if (rc2) - CDEBUG(rc2 == -EAGAIN ? D_QUOTA: D_ERROR, - "mds adjust qunit failed! (opc:%d rc:%d)\n", opc, rc2); + CDEBUG(rc2 == QUOTA_REQ_RETURNED ? D_QUOTA: D_ERROR, + "mds adjust qunit %ssuccessfully! (opc:%d rc:%d)\n", + rc2 == QUOTA_REQ_RETURNED ? "" : "un", opc, rc2); RETURN(0); } @@ -590,9 +591,9 @@ int filter_quota_adjust(struct obd_device *obd, unsigned int qcids[], if (rc || rc2) { if (!rc) rc = rc2; - CDEBUG(rc == -EAGAIN ? D_QUOTA: D_ERROR, - "filter adjust qunit failed! (opc:%d rc%d)\n", - opc, rc); + CDEBUG(rc == QUOTA_REQ_RETURNED ? D_QUOTA: D_ERROR, + "filter adjust qunit %ssuccessfully! (opc:%d rc%d)\n", + QUOTA_REQ_RETURNED ? "" : "un", opc, rc); } RETURN(0); @@ -1552,17 +1553,22 @@ static int qmaster_recovery_main(void *arg) { struct qmaster_recov_thread_data *data = arg; struct obd_device *obd = data->obd; + struct mds_obd *mds = &obd->u.mds; + struct lustre_quota_info *qinfo = &mds->mds_quota_info; int rc = 0; unsigned short type; ENTRY; ptlrpc_daemonize("qmaster_recovd"); + /* for mds */ + class_incref(obd, "qmaster_recovd_mds", obd); + /* for lov */ + class_incref(mds->mds_osc_obd, "qmaster_recovd_lov", mds->mds_osc_obd); + complete(&data->comp); for (type = USRQUOTA; type < MAXQUOTAS; type++) { - struct mds_obd *mds = &obd->u.mds; - struct lustre_quota_info *qinfo = &mds->mds_quota_info; struct list_head id_list; struct dquot_id *dqid, *tmp; @@ -1592,27 +1598,30 @@ free: kfree(dqid); } } + class_decref(mds->mds_osc_obd, "qmaster_recovd_lov", mds->mds_osc_obd); + class_decref(obd, "qmaster_recovd_mds", obd); RETURN(rc); } int mds_quota_recovery(struct obd_device *obd) { struct mds_obd *mds = &obd->u.mds; - struct lov_obd *lov = &mds->mds_osc_obd->u.lov; struct qmaster_recov_thread_data data; int rc = 0; ENTRY; - if (unlikely(!mds->mds_quota)) + if (unlikely(!mds->mds_quota || obd->obd_stopping)) RETURN(rc); - mutex_down(&lov->lov_lock); - if (lov->desc.ld_tgt_count != lov->desc.ld_active_tgt_count) { - CWARN("Not all osts are active, abort quota recovery\n"); - mutex_up(&lov->lov_lock); + mutex_down(&obd->obd_dev_sem); + if (mds->mds_lov_desc.ld_active_tgt_count != mds->mds_lov_objid_count) { + CWARN("Only %u/%u OSTs are active, abort quota recovery\n", + mds->mds_lov_desc.ld_active_tgt_count, + mds->mds_lov_objid_count); + mutex_up(&obd->obd_dev_sem); RETURN(rc); } - mutex_up(&lov->lov_lock); + mutex_up(&obd->obd_dev_sem); data.obd = obd; init_completion(&data.comp);