-static int osc_interpret_create(struct ptlrpc_request *req, void *data,
- int rc)
-{
- struct osc_creator *oscc;
- struct ost_body *body = NULL;
- ENTRY;
-
- if (req->rq_repmsg) {
- body = lustre_swab_repbuf(req, 0, sizeof(*body),
- lustre_swab_ost_body);
- if (body == NULL && rc == 0)
- rc = -EPROTO;
- }
-
- oscc = req->rq_async_args.pointer_arg[0];
- spin_lock(&oscc->oscc_lock);
- if (body)
- oscc->oscc_last_id = body->oa.o_id;
- if (rc == -ENOSPC) {
- DEBUG_REQ(D_INODE, req, "OST out of space, flagging");
- oscc->oscc_flags |= OSCC_FLAG_NOSPC;
- } else if (rc != 0 && rc != -EIO) {
- DEBUG_REQ(D_ERROR, req,
- "unknown rc %d from async create: failing oscc",
- rc);
- oscc->oscc_flags |= OSCC_FLAG_RECOVERING;
- ptlrpc_fail_import(req->rq_import, req->rq_import_generation);
- }
- oscc->oscc_flags &= ~OSCC_FLAG_CREATING;
- spin_unlock(&oscc->oscc_lock);
-
- CDEBUG(D_HA, "preallocated through id "LPU64" (last used "LPU64")\n",
- oscc->oscc_last_id, oscc->oscc_next_id);
-
- wake_up(&oscc->oscc_waitq);
- RETURN(rc);
-}
-
-static int oscc_internal_create(struct osc_creator *oscc)
-{
- struct ptlrpc_request *request;
- struct ost_body *body;
- int size = sizeof(*body);
- ENTRY;
-
- spin_lock(&oscc->oscc_lock);
- if (oscc->oscc_flags & OSCC_FLAG_CREATING ||
- oscc->oscc_flags & OSCC_FLAG_RECOVERING) {
- spin_unlock(&oscc->oscc_lock);
- RETURN(0);
- }
- oscc->oscc_flags |= OSCC_FLAG_CREATING;
- spin_unlock(&oscc->oscc_lock);
-
- request = ptlrpc_prep_req(oscc->oscc_obd->u.cli.cl_import, OST_CREATE,
- 1, &size, NULL);
- if (request == NULL) {
- spin_lock(&oscc->oscc_lock);
- oscc->oscc_flags &= ~OSCC_FLAG_CREATING;
- spin_unlock(&oscc->oscc_lock);
- RETURN(-ENOMEM);
- }
-
- request->rq_request_portal = OST_CREATE_PORTAL; //XXX FIXME bug 249
- body = lustre_msg_buf(request->rq_reqmsg, 0, sizeof(*body));
-
- spin_lock(&oscc->oscc_lock);
- body->oa.o_id = oscc->oscc_last_id + oscc->oscc_grow_count;
- /* probably we should take frequence of request into account? -bzzz */
- if (oscc->oscc_grow_count < oscc->oscc_max_grow_count) {
- oscc->oscc_grow_count *= 2;
- if (oscc->oscc_grow_count > oscc->oscc_max_grow_count)
- oscc->oscc_grow_count = oscc->oscc_max_grow_count;
- }
- body->oa.o_gr = oscc->oscc_gr;
- LASSERT(body->oa.o_gr > 0);
- body->oa.o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
- CDEBUG(D_INFO, "preallocating through id "LPU64" (last used "LPU64")\n",
- body->oa.o_id, oscc->oscc_next_id);
- spin_unlock(&oscc->oscc_lock);
-
- request->rq_replen = lustre_msg_size(1, &size);
-
- request->rq_async_args.pointer_arg[0] = oscc;
- request->rq_interpret_reply = osc_interpret_create;
- ptlrpcd_add_req(request);
-
- RETURN(0);
-}
-
-static int oscc_has_objects(struct osc_creator *oscc, int count)
-{
- int have_objs;
- spin_lock(&oscc->oscc_lock);
- have_objs = ((__s64)(oscc->oscc_last_id - oscc->oscc_next_id) >= count);
- spin_unlock(&oscc->oscc_lock);
-
- if (!have_objs)
- oscc_internal_create(oscc);
-
- return have_objs;
-}
-
-static int oscc_wait_for_objects(struct osc_creator *oscc, int count)
-{
- int have_objs;
- int ost_full;
- int osc_invalid;
-
- have_objs = oscc_has_objects(oscc, count);
-
- spin_lock(&oscc->oscc_lock);
- ost_full = (oscc->oscc_flags & OSCC_FLAG_NOSPC);
- spin_unlock(&oscc->oscc_lock);
-
- osc_invalid = oscc->oscc_obd->u.cli.cl_import->imp_invalid;
-
- return have_objs || ost_full || osc_invalid;
-}
-
-static int oscc_precreate(struct osc_creator *oscc, int wait)
-{
- struct l_wait_info lwi = { 0 };
- int rc = 0;
- ENTRY;
-
- if (oscc_has_objects(oscc, oscc->oscc_kick_barrier))
- RETURN(0);
-
- if (!wait)
- RETURN(0);
-
- /* no rc check -- a no-INTR, no-TIMEOUT wait can't fail */
- l_wait_event(oscc->oscc_waitq, oscc_wait_for_objects(oscc, 1), &lwi);
-
- if (!oscc_has_objects(oscc, 1) && (oscc->oscc_flags & OSCC_FLAG_NOSPC))
- rc = -ENOSPC;
-
- if (oscc->oscc_obd->u.cli.cl_import->imp_invalid)
- rc = -EIO;
-
- RETURN(rc);
-}
-
-int oscc_recovering(struct osc_creator *oscc)