int osc_wake_sync_fs(struct client_obd *cli)
{
- int rc = 0;
ENTRY;
if (cfs_list_empty(&cli->cl_loi_sync_fs_list) &&
cli->cl_sf_wait.started) {
- cli->cl_sf_wait.sfw_upcall(cli->cl_sf_wait.sfw_oi, rc);
+ cli->cl_sf_wait.sfw_upcall(cli->cl_sf_wait.sfw_oi, 0);
cli->cl_sf_wait.started = 0;
- CDEBUG(D_CACHE, "sync_fs_loi list is empty\n");
}
- RETURN(rc);
+ RETURN(0);
}
/* caller must hold loi_list_lock */
struct lov_stripe_md *lsm, obd_count page_count,
struct brw_page **pga,
struct ptlrpc_request **reqp,
- struct obd_capa *ocapa, int reserve)
+ struct obd_capa *ocapa, int reserve,
+ int resend)
{
struct ptlrpc_request *req;
struct ptlrpc_bulk_desc *desc;
&RMF_NIOBUF_REMOTE), (void *)(niobuf - niocount));
osc_announce_cached(cli, &body->oa, opc == OST_WRITE ? requested_nob:0);
+ if (resend) {
+ if ((body->oa.o_valid & OBD_MD_FLFLAGS) == 0) {
+ body->oa.o_valid |= OBD_MD_FLFLAGS;
+ body->oa.o_flags = 0;
+ }
+ body->oa.o_flags |= OBD_FL_RECOV_RESEND;
+ }
+
if (osc_should_shrink_grant(cli))
osc_shrink_grant_local(cli, &body->oa);
restart_bulk:
rc = osc_brw_prep_request(cmd, &exp->exp_obd->u.cli, oa, lsm,
- page_count, pga, &req, ocapa, 0);
+ page_count, pga, &req, ocapa, 0, resends);
if (rc != 0)
return (rc);
aa->aa_cli, aa->aa_oa,
NULL /* lsm unused by osc currently */,
aa->aa_page_count, aa->aa_ppga,
- &new_req, aa->aa_ocapa, 0);
+ &new_req, aa->aa_ocapa, 0, 1);
if (rc)
RETURN(rc);
ar->ar_force_sync = 0;
}
+static int osc_add_to_lop_urgent(struct loi_oap_pages *lop,
+ struct osc_async_page *oap,
+ obd_flag async_flags)
+{
+
+ /* If true, then already present in lop urgent */
+ if (!cfs_list_empty(&oap->oap_urgent_item)) {
+ CWARN("Request to add duplicate oap_urgent for flag = %d\n",
+ oap->oap_async_flags);
+ return 1;
+ }
+
+ /* item from sync_fs, to avoid duplicates check the existing flags */
+ if (async_flags & ASYNC_SYNCFS) {
+ cfs_list_add_tail(&oap->oap_urgent_item,
+ &lop->lop_urgent);
+ return 0;
+ }
+
+ if (oap->oap_async_flags & ASYNC_HP)
+ cfs_list_add(&oap->oap_urgent_item, &lop->lop_urgent);
+ else if (oap->oap_async_flags & ASYNC_URGENT ||
+ async_flags & ASYNC_URGENT)
+ cfs_list_add_tail(&oap->oap_urgent_item, &lop->lop_urgent);
+
+ return 0;
+}
+
void osc_oap_to_pending(struct osc_async_page *oap)
{
struct loi_oap_pages *lop;
else
lop = &oap->oap_loi->loi_read_lop;
- if (oap->oap_async_flags & ASYNC_HP)
- cfs_list_add(&oap->oap_urgent_item, &lop->lop_urgent);
- else if (oap->oap_async_flags & ASYNC_URGENT)
- cfs_list_add_tail(&oap->oap_urgent_item, &lop->lop_urgent);
+ osc_add_to_lop_urgent(lop, oap, 0);
cfs_list_add_tail(&oap->oap_pending_item, &lop->lop_pending);
lop_update_pending(oap->oap_cli, lop, oap->oap_cmd, 1);
}
sort_brw_pages(pga, page_count);
rc = osc_brw_prep_request(cmd, cli, oa, NULL, page_count,
- pga, &req, crattr.cra_capa, 1);
+ pga, &req, crattr.cra_capa, 1, 0);
if (rc != 0) {
CERROR("prep_req failed: %d\n", rc);
GOTO(out, req = ERR_PTR(rc));
* to be canceled, the pages covered by the lock will be sent out
* with ASYNC_HP. We have to send out them as soon as possible. */
cfs_list_for_each_entry_safe(oap, tmp, &lop->lop_urgent, oap_urgent_item) {
- if (oap->oap_async_flags & ASYNC_HP)
+ if (oap->oap_async_flags & ASYNC_HP)
cfs_list_move(&oap->oap_pending_item, &tmp_list);
else
cfs_list_move_tail(&oap->oap_pending_item, &tmp_list);
if (SETTING(oap->oap_async_flags, async_flags, ASYNC_SYNCFS) &&
cfs_list_empty(&oap->oap_rpc_item) &&
cfs_list_empty(&oap->oap_urgent_item)) {
- cfs_list_add_tail(&oap->oap_urgent_item, &lop->lop_urgent);
+ osc_add_to_lop_urgent(lop, oap, ASYNC_SYNCFS);
flags |= ASYNC_SYNCFS;
cfs_spin_lock(&oap->oap_lock);
oap->oap_async_flags |= flags;
if (SETTING(oap->oap_async_flags, async_flags, ASYNC_URGENT) &&
cfs_list_empty(&oap->oap_rpc_item)) {
- if (oap->oap_async_flags & ASYNC_HP)
- cfs_list_add(&oap->oap_urgent_item, &lop->lop_urgent);
- else
- cfs_list_add_tail(&oap->oap_urgent_item,
- &lop->lop_urgent);
+ osc_add_to_lop_urgent(lop, oap, ASYNC_URGENT);
flags |= ASYNC_URGENT;
loi_list_maint(cli, loi);
}
return(rc);
}
-static int osc_sync_fs(struct obd_device *obd, struct obd_info *oinfo,
+static int osc_sync_fs(struct obd_export *exp, struct obd_info *oinfo,
int wait)
{
+ struct obd_device *obd = class_exp2obd(exp);
struct client_obd *cli;
struct lov_oinfo *loi;
struct lov_oinfo *tloi;
oap_pending_item)
osc_set_async_flags_base(cli, loi, oap, ASYNC_SYNCFS);
}
-
osc_check_rpcs(env, cli);
osc_wake_sync_fs(cli);
client_obd_list_unlock(&cli->cl_loi_list_lock);
cl_env_put(env, &refcheck);
+
RETURN(rc);
}