* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2012, Whamcloud, Inc.
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include "ofd_internal.h"
#include <obd_cksum.h>
-#include <lquota.h>
+#include <lustre_quota.h>
static int ofd_export_stats_init(struct ofd_device *ofd,
struct obd_export *exp, void *client_nid)
GOTO(clean, rc = -ENOMEM);
for (i = 0; i < BRW_LAST; i++)
- cfs_spin_lock_init(&stats->nid_brw_stats->hist[i].oh_lock);
+ spin_lock_init(&stats->nid_brw_stats->hist[i].oh_lock);
rc = lprocfs_seq_create(stats->nid_proc, "brw_stats", 0644,
&ofd_per_nid_stats_fops, stats);
if (data->ocd_connect_flags & OBD_CONNECT_INDEX) {
struct lr_server_data *lsd = &ofd->ofd_lut.lut_lsd;
- int index = lsd->lsd_ost_index;
+ int index = lsd->lsd_osd_index;
- if (!(lsd->lsd_feature_compat & OBD_COMPAT_OST)) {
- /* this will only happen on the first connect */
- lsd->lsd_ost_index = data->ocd_index;
- lsd->lsd_feature_compat |= OBD_COMPAT_OST;
- /* sync is not needed here as lut_client_add will
- * set exp_need_sync flag */
- lut_server_data_update(env, &ofd->ofd_lut, 0);
- } else if (index != data->ocd_index) {
+ if (index != data->ocd_index) {
LCONSOLE_ERROR_MSG(0x136, "Connection from %s to index"
" %u doesn't match actual OST index"
" %u in last_rcvd file, bad "
data->ocd_index);
RETURN(-EBADF);
}
+ if (!(lsd->lsd_feature_compat & OBD_COMPAT_OST)) {
+ /* this will only happen on the first connect */
+ lsd->lsd_feature_compat |= OBD_COMPAT_OST;
+ /* sync is not needed here as lut_client_add will
+ * set exp_need_sync flag */
+ tgt_server_data_update(env, &ofd->ofd_lut, 0);
+ }
}
-
if (OBD_FAIL_CHECK(OBD_FAIL_OST_BRW_SIZE)) {
data->ocd_brw_size = 65536;
} else if (data->ocd_connect_flags & OBD_CONNECT_BRW_SIZE) {
struct obd_export *exp;
struct ofd_device *ofd;
struct lustre_handle conn = { 0 };
- int rc, group;
-
+ int rc;
ENTRY;
if (_exp == NULL || obd == NULL || cluuid == NULL)
if (rc)
GOTO(out, rc);
- group = data->ocd_group;
if (obd->obd_replayable) {
struct tg_export_data *ted = &exp->exp_target_data;
memcpy(ted->ted_lcd->lcd_uuid, cluuid,
sizeof(ted->ted_lcd->lcd_uuid));
- rc = lut_client_new(env, exp);
+ rc = tgt_client_new(env, exp);
if (rc != 0)
GOTO(out, rc);
ofd_export_stats_init(ofd, exp, localdata);
}
- if (group == 0)
- GOTO(out, rc = 0);
- /* init new group */
- if (group > ofd->ofd_max_group) {
- ofd->ofd_max_group = group;
- rc = ofd_group_load(env, ofd, group);
- }
+ CDEBUG(D_HA, "%s: get connection from MDS %d\n", obd->obd_name,
+ data->ocd_group);
+
out:
if (rc != 0) {
class_disconnect(exp);
/* Do not erase record for recoverable client. */
if (exp->exp_obd->obd_replayable &&
(!exp->exp_obd->obd_fail || exp->exp_failed))
- lut_client_del(&env, exp);
+ tgt_client_del(&env, exp);
lu_env_fini(&env);
class_export_put(exp);
{
int rc;
- cfs_spin_lock_init(&exp->exp_filter_data.fed_lock);
+ spin_lock_init(&exp->exp_filter_data.fed_lock);
CFS_INIT_LIST_HEAD(&exp->exp_filter_data.fed_mod_list);
- cfs_spin_lock(&exp->exp_lock);
+ spin_lock(&exp->exp_lock);
exp->exp_connecting = 1;
- cfs_spin_unlock(&exp->exp_lock);
+ spin_unlock(&exp->exp_lock);
/* self-export doesn't need client data and ldlm initialization */
if (unlikely(obd_uuid_equals(&exp->exp_obd->obd_uuid,
&exp->exp_client_uuid)))
return 0;
- rc = lut_client_alloc(exp);
+ rc = tgt_client_alloc(exp);
if (rc == 0)
ldlm_init_export(exp);
if (rc)
return 0;
ldlm_destroy_export(exp);
- lut_client_free(exp);
+ tgt_client_free(exp);
ofd_fmd_cleanup(exp);
sptlrpc_target_update_exp_flavor(obd, &tmp_rset);
- cfs_write_lock(&fo->fo_sptlrpc_lock);
+ write_lock(&fo->fo_sptlrpc_lock);
sptlrpc_rule_set_free(&fo->fo_sptlrpc_rset);
fo->fo_sptlrpc_rset = tmp_rset;
- cfs_write_unlock(&fo->fo_sptlrpc_lock);
+ write_unlock(&fo->fo_sptlrpc_lock);
return 0;
}
} else if (KEY_IS(KEY_GRANT_SHRINK)) {
struct ost_body *body = val;
+ ofd_info_init(env, exp);
/** handle grant shrink, similar to a read request */
ofd_grant_prepare_read(env, exp, &body->oa);
} else {
*vallen = sizeof(*blocksize_bits);
} else if (KEY_IS(KEY_LAST_ID)) {
obd_id *last_id = val;
+ struct ofd_seq *oseq;
+
+ if (val == NULL) {
+ *vallen = sizeof(obd_id);
+ RETURN(0);
+ }
+ ofd_info_init(env, exp);
+ oseq = ofd_seq_load(env, ofd,
+ (obd_seq)exp->exp_filter_data.fed_group);
+ LASSERT(oseq != NULL);
if (last_id) {
- if (*vallen < sizeof(*last_id))
+ if (*vallen < sizeof(*last_id)) {
+ ofd_seq_put(env, oseq);
RETURN(-EOVERFLOW);
- *last_id = ofd_last_id(ofd,
- exp->exp_filter_data.fed_group);
+ }
+ *last_id = ofd_seq_last_oid(oseq);
}
+ ofd_seq_put(env, oseq);
*vallen = sizeof(*last_id);
} else if (KEY_IS(KEY_FIEMAP)) {
struct ofd_thread_info *info;
{
int rc;
- cfs_spin_lock(&ofd->ofd_osfs_lock);
+ spin_lock(&ofd->ofd_osfs_lock);
if (cfs_time_before_64(ofd->ofd_osfs_age, max_age) || max_age == 0) {
obd_size unstable;
/* record value of inflight counter before running statfs to
* compute the diff once statfs is completed */
unstable = ofd->ofd_osfs_inflight;
- cfs_spin_unlock(&ofd->ofd_osfs_lock);
+ spin_unlock(&ofd->ofd_osfs_lock);
/* statfs can sleep ... hopefully not for too long since we can
* call it fairly often as space fills up */
if (unlikely(rc))
return rc;
- cfs_spin_lock(&ofd->ofd_grant_lock);
- cfs_spin_lock(&ofd->ofd_osfs_lock);
+ spin_lock(&ofd->ofd_grant_lock);
+ spin_lock(&ofd->ofd_osfs_lock);
/* calculate how much space was written while we released the
* ofd_osfs_lock */
unstable = ofd->ofd_osfs_inflight - unstable;
/* similarly, there is some uncertainty on write requests
* between prepare & commit */
ofd->ofd_osfs_unstable += ofd->ofd_tot_pending;
- cfs_spin_unlock(&ofd->ofd_grant_lock);
+ spin_unlock(&ofd->ofd_grant_lock);
/* finally udpate cached statfs data */
ofd->ofd_osfs = *osfs;
ofd->ofd_statfs_inflight--; /* stop tracking */
if (ofd->ofd_statfs_inflight == 0)
ofd->ofd_osfs_inflight = 0;
- cfs_spin_unlock(&ofd->ofd_osfs_lock);
+ spin_unlock(&ofd->ofd_osfs_lock);
if (from_cache)
*from_cache = 0;
} else {
/* use cached statfs data */
*osfs = ofd->ofd_osfs;
- cfs_spin_unlock(&ofd->ofd_osfs_lock);
+ spin_unlock(&ofd->ofd_osfs_lock);
if (from_cache)
*from_cache = 1;
}
osfs->os_files, osfs->os_ffree, osfs->os_state);
if (OBD_FAIL_CHECK_VALUE(OBD_FAIL_OST_ENOINO,
- ofd->ofd_lut.lut_lsd.lsd_ost_index))
+ ofd->ofd_lut.lut_lsd.lsd_osd_index))
osfs->os_ffree = 0;
/* OS_STATE_READONLY can be set by OSD already */
}
if (OBD_FAIL_CHECK_VALUE(OBD_FAIL_OST_ENOSPC,
- ofd->ofd_lut.lut_lsd.lsd_ost_index))
+ ofd->ofd_lut.lut_lsd.lsd_osd_index))
osfs->os_bfree = osfs->os_bavail = 2;
EXIT;
{
struct ofd_thread_info *info = ofd_info(env);
struct lustre_handle lockh;
- int flags = LDLM_AST_DISCARD_DATA, rc = 0;
+ __u64 flags = LDLM_AST_DISCARD_DATA, rc = 0;
ldlm_policy_data_t policy = {
.l_extent = { 0, OBD_OBJECT_EOF }
};
ENTRY;
+ fo = ofd_object_find(env, ofd, fid);
+ if (IS_ERR(fo))
+ RETURN(PTR_ERR(fo));
+
/* Tell the clients that the object is gone now and that they should
* throw away any cached pages. */
ofd_build_resid(fid, &info->fti_resid);
rc = ldlm_cli_enqueue_local(ofd->ofd_namespace, &info->fti_resid,
LDLM_EXTENT, &policy, LCK_PW, &flags,
ldlm_blocking_ast, ldlm_completion_ast,
- NULL, NULL, 0, NULL, &lockh);
+ NULL, NULL, 0, LVB_T_NONE, NULL, &lockh);
/* We only care about the side-effects, just drop the lock. */
if (rc == ELDLM_OK)
ldlm_lock_decref(&lockh, LCK_PW);
- fo = ofd_object_find(env, ofd, fid);
- if (IS_ERR(fo))
- RETURN(PTR_ERR(fo));
LASSERT(fo != NULL);
rc = ofd_object_destroy(env, fo, orphan);
lrc = ofd_destroy_by_fid(env, ofd, &info->fti_fid, 0);
if (lrc == -ENOENT) {
CDEBUG(D_INODE,
- "destroying non-existent object "LPU64"\n",
- oa->o_id);
+ "%s: destroying non-existent object "DFID"\n",
+ ofd_obd(ofd)->obd_name, PFID(&info->fti_fid));
/* rewrite rc with -ENOENT only if it is 0 */
if (rc == 0)
rc = lrc;
} else if (lrc != 0) {
- CEMERG("error destroying object "LPU64": %d\n",
- oa->o_id, rc);
+ CERROR("%s: error destroying object "DFID": %d\n",
+ ofd_obd(ofd)->obd_name, PFID(&info->fti_fid),
+ rc);
rc = lrc;
}
count--;
int skip_orphan;
int rc = 0;
struct ost_id oi = oa->o_oi;
+ struct ofd_seq *oseq;
ENTRY;
+ oseq = ofd_seq_get(ofd, oa->o_seq);
+ if (oseq == NULL) {
+ CERROR("%s: Can not find seq for "LPU64":"LPU64"\n",
+ ofd_name(ofd), oa->o_seq, oa->o_id);
+ RETURN(-EINVAL);
+ }
+
LASSERT(exp != NULL);
skip_orphan = !!(exp->exp_connect_flags & OBD_CONNECT_SKIP_ORPHAN);
- last = ofd_last_id(ofd, oa->o_seq);
- CWARN("%s: deleting orphan objects from "LPU64" to "LPU64"\n",
- ofd_obd(ofd)->obd_name, oa->o_id + 1, last);
+ last = ofd_seq_last_oid(oseq);
+ LCONSOLE_INFO("%s: deleting orphan objects from "LPX64":"LPU64
+ " to "LPU64"\n", ofd_name(ofd), oa->o_seq,
+ oa->o_id + 1, last);
for (oi.oi_id = last; oi.oi_id > oa->o_id; oi.oi_id--) {
fid_ostid_unpack(&info->fti_fid, &oi, 0);
CEMERG("error destroying precreated id "LPU64": %d\n",
oi.oi_id, rc);
if (!skip_orphan) {
- ofd_last_id_set(ofd, oi.oi_id - 1, oa->o_seq);
+ ofd_seq_last_oid_set(oseq, oi.oi_id - 1);
/* update last_id on disk periodically so that if we
* restart * we don't need to re-scan all of the just
* deleted objects. */
if ((oi.oi_id & 511) == 0)
- ofd_last_id_write(env, ofd, oa->o_seq);
+ ofd_seq_last_oid_write(env, ofd, oseq);
}
}
CDEBUG(D_HA, "%s: after destroy: set last_objids["LPU64"] = "LPU64"\n",
ofd_obd(ofd)->obd_name, oa->o_seq, oa->o_id);
if (!skip_orphan) {
- rc = ofd_last_id_write(env, ofd, oa->o_seq);
+ rc = ofd_seq_last_oid_write(env, ofd, oseq);
} else {
/* don't reuse orphan object, return last used objid */
oa->o_id = last;
rc = 0;
}
+ ofd_seq_put(env, oseq);
RETURN(rc);
}
{
struct ofd_device *ofd = ofd_exp(exp);
struct ofd_thread_info *info;
+ obd_seq seq = oa->o_seq;
+ struct ofd_seq *oseq;
int rc = 0, diff;
ENTRY;
LASSERT(oa->o_valid & OBD_MD_FLGROUP);
CDEBUG(D_INFO, "ofd_create(oa->o_seq="LPU64",oa->o_id="LPU64")\n",
- oa->o_seq, oa->o_id);
+ seq, oa->o_id);
+
+ oseq = ofd_seq_load(env, ofd, seq);
+ if (oseq == NULL) {
+ CERROR("%s: Can't find oseq "LPX64"\n", ofd_name(ofd), seq);
+ RETURN(-EINVAL);
+ }
if ((oa->o_valid & OBD_MD_FLFLAGS) &&
(oa->o_flags & OBD_FL_RECREATE_OBJS)) {
if (!ofd_obd(ofd)->obd_recovering ||
- oa->o_id > ofd_last_id(ofd, oa->o_seq)) {
+ oa->o_id > ofd_seq_last_oid(oseq)) {
CERROR("recreate objid "LPU64" > last id "LPU64"\n",
- oa->o_id, ofd_last_id(ofd, oa->o_seq));
+ oa->o_id, ofd_seq_last_oid(oseq));
GOTO(out_nolock, rc = -EINVAL);
}
/* do nothing because we create objects during first write */
/* destroy orphans */
if (oti->oti_conn_cnt < exp->exp_conn_cnt) {
CERROR("%s: dropping old orphan cleanup request\n",
- ofd_obd(ofd)->obd_name);
+ ofd_name(ofd));
GOTO(out_nolock, rc = 0);
}
/* This causes inflight precreates to abort and drop lock */
- cfs_set_bit(oa->o_seq, &ofd->ofd_destroys_in_progress);
- cfs_mutex_lock(&ofd->ofd_create_locks[oa->o_seq]);
- if (!cfs_test_bit(oa->o_seq, &ofd->ofd_destroys_in_progress)) {
+ oseq->os_destroys_in_progress = 1;
+ mutex_lock(&oseq->os_create_lock);
+ if (!oseq->os_destroys_in_progress) {
CERROR("%s:["LPU64"] destroys_in_progress already cleared\n",
exp->exp_obd->obd_name, oa->o_seq);
GOTO(out, rc = 0);
}
- diff = oa->o_id - ofd_last_id(ofd, oa->o_seq);
+ diff = oa->o_id - ofd_seq_last_oid(oseq);
CDEBUG(D_HA, "ofd_last_id() = "LPU64" -> diff = %d\n",
- ofd_last_id(ofd, oa->o_seq), diff);
+ ofd_seq_last_oid(oseq), diff);
if (-diff > OST_MAX_PRECREATE) {
/* FIXME: should reset precreate_next_id on MDS */
rc = 0;
} else if (diff < 0) {
rc = ofd_orphans_destroy(env, exp, ofd, oa);
- cfs_clear_bit(oa->o_seq, &ofd->ofd_destroys_in_progress);
+ oseq->os_destroys_in_progress = 0;
} else {
/* XXX: Used by MDS for the first time! */
- cfs_clear_bit(oa->o_seq, &ofd->ofd_destroys_in_progress);
+ oseq->os_destroys_in_progress = 0;
}
} else {
- cfs_mutex_lock(&ofd->ofd_create_locks[oa->o_seq]);
+ mutex_lock(&oseq->os_create_lock);
if (oti->oti_conn_cnt < exp->exp_conn_cnt) {
CERROR("%s: dropping old precreate request\n",
- ofd_obd(ofd)->obd_name);
+ ofd_obd(ofd)->obd_name);
GOTO(out, rc = 0);
}
- /* only precreate if group == 0 and o_id is specfied */
+ /* only precreate if seq == 0 and o_id is specfied */
if (!fid_seq_is_mdt(oa->o_seq) || oa->o_id == 0) {
diff = 1; /* shouldn't we create this right now? */
} else {
- diff = oa->o_id - ofd_last_id(ofd, oa->o_seq);
+ diff = oa->o_id - ofd_seq_last_oid(oseq);
}
}
if (diff > 0) {
if (rc) {
CDEBUG(D_HA, "%s: failed to acquire grant space"
"for precreate (%d)\n",
- ofd_obd(ofd)->obd_name, diff);
+ ofd_name(ofd), diff);
diff = 0;
}
}
while (diff > 0) {
- next_id = ofd_last_id(ofd, oa->o_seq) + 1;
+ next_id = ofd_seq_last_oid(oseq) + 1;
count = ofd_precreate_batch(ofd, diff);
CDEBUG(D_HA, "%s: reserve %d objects in group "LPU64
created, diff + created,
created / DISK_TIMEOUT);
break;
- }
+ }
rc = ofd_precreate_objects(env, ofd, next_id,
- oa->o_seq, count);
+ oseq, count);
if (rc > 0) {
created += rc;
diff -= rc;
break;
}
}
- if (created > 0) {
+ if (created > 0)
/* some objects got created, we can return
* them, even if last creation failed */
- oa->o_id = ofd_last_id(ofd, oa->o_seq);
rc = 0;
- } else {
+ else
CERROR("unable to precreate: %d\n", rc);
- oa->o_id = ofd_last_id(ofd, oa->o_seq);
- }
+ oa->o_id = ofd_seq_last_oid(oseq);
oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
if (!(oa->o_valid & OBD_MD_FLFLAGS) ||
ofd_info2oti(info, oti);
out:
- cfs_mutex_unlock(&ofd->ofd_create_locks[oa->o_seq]);
+ mutex_unlock(&oseq->os_create_lock);
out_nolock:
if (rc == 0 && ea != NULL) {
struct lov_stripe_md *lsm = *ea;
lsm->lsm_object_id = oa->o_id;
}
- return rc;
+ ofd_seq_put(env, oseq);
+ RETURN(rc);
}
int ofd_getattr(const struct lu_env *env, struct obd_export *exp,
return !!rc;
}
-static int ofd_obd_notify(struct obd_device *obd, struct obd_device *unused,
- enum obd_notify_event ev, void *data)
-{
- switch (ev) {
- case OBD_NOTIFY_CONFIG:
- LASSERT(obd->obd_no_conn);
- cfs_spin_lock(&obd->obd_dev_lock);
- obd->obd_no_conn = 0;
- cfs_spin_unlock(&obd->obd_dev_lock);
- break;
- default:
- CDEBUG(D_INFO, "%s: Unhandled notification %#x\n",
- obd->obd_name, ev);
- }
- return 0;
-}
-
/*
* Handle quota control requests to consult current usage/limit.
*
.o_precleanup = ofd_precleanup,
.o_ping = ofd_ping,
.o_health_check = ofd_health_check,
- .o_notify = ofd_obd_notify,
.o_quotactl = ofd_quotactl,
};