return rc;
}
-static inline int osp_objs_precreated(struct osp_device *osp)
+static inline int osp_objs_precreated_nolock(struct osp_device *osp)
{
return osp_fid_diff(&osp->opd_pre_last_created_fid,
&osp->opd_pre_used_fid);
}
+static inline int osp_objs_precreated(struct osp_device *osp)
+{
+ int diff;
+
+ spin_lock(&osp->opd_pre_lock);
+ diff = osp_objs_precreated_nolock(osp);
+ spin_unlock(&osp->opd_pre_lock);
+ return diff;
+}
+
static inline int osp_is_fid_client(struct osp_device *osp)
{
struct obd_import *imp = osp->opd_obd->u.cli.cl_import;
*/
static inline int osp_precreate_is_low_nolock(struct osp_device *d)
{
- int available = osp_objs_precreated(d) - d->opd_pre_reserved;
+ int available = osp_objs_precreated_nolock(d) - d->opd_pre_reserved;
int precreate_needed = d->opd_pre_create_count > 1024 ?
d->opd_pre_create_count / 4 : d->opd_pre_create_count / 2;
ostid_to_fid(fid, &body->oa.o_oi, d->opd_index);
ready:
+ spin_lock(&d->opd_pre_lock);
+
if (osp_fid_diff(fid, &d->opd_pre_used_fid) <= 0) {
CERROR("%s: precreate fid "DFID" <= local used fid "DFID
": rc = %d\n", d->opd_obd->obd_name,
PFID(fid), PFID(&d->opd_pre_used_fid), -ESTALE);
+ spin_unlock(&d->opd_pre_lock);
GOTO(out_req, rc = -ESTALE);
}
diff = osp_fid_diff(fid, &d->opd_pre_last_created_fid);
- spin_lock(&d->opd_pre_lock);
if (diff < grow) {
/* the OST has not managed to create all the
* objects we asked for */
while ((rc = d->opd_pre_status) == 0 || rc == -ENOSPC ||
rc == -ENODEV || rc == -EAGAIN || rc == -ENOTCONN) {
+ spin_lock(&d->opd_pre_lock);
+ precreated = osp_objs_precreated_nolock(d);
/*
* increase number of precreations
*/
- precreated = osp_objs_precreated(d);
if (d->opd_pre_create_count < d->opd_pre_max_create_count &&
d->opd_pre_create_slow == 0 &&
precreated <= (d->opd_pre_create_count / 4 + 1)) {
- spin_lock(&d->opd_pre_lock);
d->opd_pre_create_slow = 1;
d->opd_pre_create_count *= 2;
- spin_unlock(&d->opd_pre_lock);
}
- spin_lock(&d->opd_pre_lock);
- precreated = osp_objs_precreated(d);
if (!d->opd_pre_recovering && !d->opd_force_creation) {
if (precreated > d->opd_pre_reserved) {
d->opd_pre_reserved++;