X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosc%2Fosc_create.c;h=aff69bdeb76bc1732b0ec392cc463454240935fd;hb=6b4fbaefc816644bac03f7ea9840f764ccc2efbd;hp=a644f7c1789f16f443ad71b92725b1faa9a2b064;hpb=710e1a34bada840db26198d8333d6477e536ef86;p=fs%2Flustre-release.git diff --git a/lustre/osc/osc_create.c b/lustre/osc/osc_create.c index a644f7c..aff69bd 100644 --- a/lustre/osc/osc_create.c +++ b/lustre/osc/osc_create.c @@ -66,7 +66,28 @@ static int osc_interpret_create(struct ptlrpc_request *req, void *data, int rc) spin_lock(&oscc->oscc_lock); oscc->oscc_flags &= ~OSCC_FLAG_CREATING; - if (rc == -ENOSPC || rc == -EROFS) { + switch (rc) { + case 0: { + if (body) { + int diff = body->oa.o_id - oscc->oscc_last_id; + + if (diff < oscc->oscc_grow_count) + oscc->oscc_grow_count = + max(diff/3, OST_MIN_PRECREATE); + else + oscc->oscc_flags &= ~OSCC_FLAG_LOW; + oscc->oscc_last_id = body->oa.o_id; + } + spin_unlock(&oscc->oscc_lock); + break; + } + case -EAGAIN: + /* valid race delorphan vs create, or somthing after resend */ + spin_unlock(&oscc->oscc_lock); + DEBUG_REQ(D_INODE, req, "Got EGAIN - resend \n"); + break; + case -ENOSPC: + case -EROFS: { oscc->oscc_flags |= OSCC_FLAG_NOSPC; if (body && rc == -ENOSPC) { oscc->oscc_grow_count = OST_MIN_PRECREATE; @@ -74,7 +95,17 @@ static int osc_interpret_create(struct ptlrpc_request *req, void *data, int rc) } spin_unlock(&oscc->oscc_lock); DEBUG_REQ(D_INODE, req, "OST out of space, flagging"); - } else if (rc != 0 && rc != -EIO) { + break; + } + case -EIO: { + /* filter always set body->oa.o_id as the last_id + * of filter (see filter_handle_precreate for detail)*/ + if (body && body->oa.o_id > oscc->oscc_last_id) + oscc->oscc_last_id = body->oa.o_id; + spin_unlock(&oscc->oscc_lock); + break; + } + default: { oscc->oscc_flags |= OSCC_FLAG_RECOVERING; oscc->oscc_grow_count = OST_MIN_PRECREATE; spin_unlock(&oscc->oscc_lock); @@ -82,26 +113,7 @@ static int osc_interpret_create(struct ptlrpc_request *req, void *data, int rc) "Unknown rc %d from async create: failing oscc", rc); ptlrpc_fail_import(req->rq_import, lustre_msg_get_conn_cnt(req->rq_reqmsg)); - } else { - if (rc == 0) { - if (body) { - int diff = body->oa.o_id - oscc->oscc_last_id; - - if (diff < oscc->oscc_grow_count) - oscc->oscc_grow_count = - max(diff/3, OST_MIN_PRECREATE); - else - oscc->oscc_flags &= ~OSCC_FLAG_LOW; - oscc->oscc_last_id = body->oa.o_id; - } - } else { - /* filter always set body->oa.o_id as the last_id - * of filter (see filter_handle_precreate for detail)*/ - if (body && body->oa.o_id > oscc->oscc_last_id) - oscc->oscc_last_id = body->oa.o_id; - } - spin_unlock(&oscc->oscc_lock); - + } } CDEBUG(D_HA, "preallocated through id "LPU64" (next to use "LPU64")\n", @@ -118,7 +130,8 @@ static int oscc_internal_create(struct osc_creator *oscc) int size[] = { sizeof(struct ptlrpc_body), sizeof(*body) }; ENTRY; - spin_lock(&oscc->oscc_lock); + LASSERT_SPIN_LOCKED(&oscc->oscc_lock); + if (oscc->oscc_grow_count < OST_MAX_PRECREATE && !(oscc->oscc_flags & (OSCC_FLAG_LOW | OSCC_FLAG_RECOVERING)) && (__s64)(oscc->oscc_last_id - oscc->oscc_next_id) <= @@ -174,10 +187,12 @@ 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) + if (!have_objs) { oscc_internal_create(oscc); + } else { + spin_unlock(&oscc->oscc_lock); + } return have_objs; } @@ -241,7 +256,7 @@ int oscc_recovering(struct osc_creator *oscc) a potentially very long time 1000 : unusable */ -int osc_precreate(struct obd_export *exp, int need_create) +int osc_precreate(struct obd_export *exp) { struct osc_creator *oscc = &exp->exp_obd->u.cli.cl_oscc; struct obd_import *imp = exp->exp_imp_reverse; @@ -265,13 +280,11 @@ int osc_precreate(struct obd_export *exp, int need_create) spin_unlock(&oscc->oscc_lock); RETURN(2); } - spin_unlock(&oscc->oscc_lock); - - if (oscc->oscc_flags & OSCC_FLAG_CREATING) - RETURN(1); - if (!need_create) + if (oscc->oscc_flags & OSCC_FLAG_CREATING) { + spin_unlock(&oscc->oscc_lock); RETURN(1); + } oscc_internal_create(oscc); RETURN(1);