X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosp%2Fosp_precreate.c;h=805f87db95588fcf180cfed05dff7622bc796357;hp=bbbf7c45954da33f700b0c799c99b5cbe14ec2dd;hb=c807e3f33b39409a061fa997cac57ac394c503ba;hpb=1b5abf625462a2b66820b2d07e25619afba504c6 diff --git a/lustre/osp/osp_precreate.c b/lustre/osp/osp_precreate.c index bbbf7c4..805f87d 100644 --- a/lustre/osp/osp_precreate.c +++ b/lustre/osp/osp_precreate.c @@ -27,7 +27,6 @@ */ /* * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. * * lustre/osp/osp_precreate.c * @@ -263,8 +262,8 @@ static int osp_statfs_update(const struct lu_env *env, struct osp_device *d) d->opd_obd->obd_name, atomic_read(&d->opd_sync_changes)); osp_sync_add_commit_cb_1s(env, d, th); - dt_trans_stop(env, d->opd_storage, th); } + dt_trans_stop(env, d->opd_storage, th); } out: @@ -675,6 +674,9 @@ static int osp_precreate_send(const struct lu_env *env, struct osp_device *d) if (rc) { CERROR("%s: can't precreate: rc = %d\n", d->opd_obd->obd_name, rc); + if (req->rq_net_err) + /* have osp_precreate_reserve() to wait for repeat */ + rc = -ENOTCONN; GOTO(out_req, rc); } LASSERT(req->rq_transno == 0); @@ -722,6 +724,9 @@ out_req: osp_pre_update_status(d, rc); wake_up(&d->opd_pre_user_waitq); + /* pause to let osp_precreate_reserve to go first */ + CFS_FAIL_TIMEOUT(OBD_FAIL_OSP_PRECREATE_PAUSE, 2); + ptlrpc_req_finished(req); RETURN(rc); } @@ -1406,7 +1411,8 @@ static int osp_precreate_ready_condition(const struct lu_env *env, * \retval -EAGAIN try later, slow precreation in progress * \retval -EIO when no access to OST */ -int osp_precreate_reserve(const struct lu_env *env, struct osp_device *d) +int osp_precreate_reserve(const struct lu_env *env, struct osp_device *d, + bool can_block) { time64_t expire = ktime_get_seconds() + obd_timeout; int precreated, rc, synced = 0; @@ -1494,6 +1500,12 @@ int osp_precreate_reserve(const struct lu_env *env, struct osp_device *d) break; } + if (!can_block) { + LASSERT(d->opd_pre); + rc = -ENOBUFS; + break; + } + if (wait_event_idle_timeout( d->opd_pre_user_waitq, osp_precreate_ready_condition(env, d), @@ -1630,12 +1642,12 @@ int osp_object_truncate(const struct lu_env *env, struct dt_object *dt, * XXX: decide how do we do here with resend * if we don't resend, then client may see wrong file size * if we do resend, then MDS thread can get stuck for quite long - * and if we don't resend, then client will also get -EWOULDBLOCK !! + * and if we don't resend, then client will also get -EAGAIN !! * (see LU-7975 and sanity/test_27F use cases) * but let's decide not to resend/delay this truncate request to OST * and allow Client to decide to resend, in a less agressive way from * after_reply(), by returning -EINPROGRESS instead of - * -EAGAIN/-EWOULDBLOCK upon return from ptlrpc_queue_wait() at the + * -EAGAIN/-EAGAIN upon return from ptlrpc_queue_wait() at the * end of this routine */ req->rq_no_resend = req->rq_no_delay = 1; @@ -1665,14 +1677,14 @@ int osp_object_truncate(const struct lu_env *env, struct dt_object *dt, rc = ptlrpc_queue_wait(req); if (rc) { - /* -EWOULDBLOCK/-EAGAIN means OST is unreachable at the moment + /* -EAGAIN/-EWOULDBLOCK means OST is unreachable at the moment * since we have decided not to resend/delay, but this could * lead to wrong size to be seen at Client side and even process * trying to open to exit/fail if not itself handling -EAGAIN. * So it should be better to return -EINPROGRESS instead and * leave the decision to resend at Client side in after_reply() */ - if (rc == -EWOULDBLOCK) { + if (rc == -EAGAIN) { rc = -EINPROGRESS; CDEBUG(D_HA, "returning -EINPROGRESS instead of " "-EWOULDBLOCK/-EAGAIN to allow Client to "