* osc_cache_truncate_start(). */
osc_extent_state_set(ext, OES_TRUNC);
ext->oe_trunc_pending = 0;
+ osc_object_unlock(obj);
} else {
int grant = 0;
grant += cli->cl_grant_extent_tax;
if (osc_extent_merge(env, ext, next_extent(ext)) == 0)
grant += cli->cl_grant_extent_tax;
- if (grant > 0)
- osc_unreserve_grant(cli, 0, grant);
if (ext->oe_urgent)
list_move_tail(&ext->oe_link,
list_move_tail(&ext->oe_link,
&obj->oo_full_exts);
}
+ osc_object_unlock(obj);
+ if (grant > 0)
+ osc_unreserve_grant(cli, 0, grant);
}
- osc_object_unlock(obj);
osc_io_unplug_async(env, cli, obj);
}
}
}
-static void osc_unreserve_grant(struct client_obd *cli,
- unsigned int reserved, unsigned int unused)
+static void osc_unreserve_grant_nolock(struct client_obd *cli,
+ unsigned int reserved,
+ unsigned int unused)
{
- spin_lock(&cli->cl_loi_list_lock);
__osc_unreserve_grant(cli, reserved, unused);
if (unused > 0)
osc_wake_cache_waiters(cli);
+}
+
+static void osc_unreserve_grant(struct client_obd *cli,
+ unsigned int reserved, unsigned int unused)
+{
+ spin_lock(&cli->cl_loi_list_lock);
+ osc_unreserve_grant_nolock(cli, reserved, unused);
spin_unlock(&cli->cl_loi_list_lock);
}
/* it doesn't need any grant to dirty this page */
spin_lock(&cli->cl_loi_list_lock);
rc = osc_enter_cache_try(cli, oap, grants, 0);
- spin_unlock(&cli->cl_loi_list_lock);
if (rc == 0) { /* try failed */
grants = 0;
need_release = 1;
} else {
OSC_EXTENT_DUMP(D_CACHE, ext,
"expanded for %lu.\n", index);
- osc_unreserve_grant(cli, grants, tmp);
+ osc_unreserve_grant_nolock(cli, grants, tmp);
grants = 0;
}
}
+ spin_unlock(&cli->cl_loi_list_lock);
rc = 0;
} else if (ext != NULL) {
/* index is located outside of active extent */