* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, 2014 Intel Corporation.
+ * Copyright (c) 2012, 2015, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
{
struct obd_device *obd = ofd_obd(ofd);
struct nid_stat *stats;
- int num_stats;
- int rc, newnid = 0;
-
+ int rc;
ENTRY;
LASSERT(obd->obd_uses_nid_stats);
/* Self-export gets no proc entry */
RETURN(0);
- rc = lprocfs_exp_setup(exp, client_nid, &newnid);
- if (rc) {
- /* Mask error for already created
- * /proc entries */
- if (rc == -EALREADY)
- rc = 0;
- RETURN(rc);
- }
-
- if (newnid == 0)
- RETURN(0);
+ rc = lprocfs_exp_setup(exp, client_nid);
+ if (rc != 0)
+ /* Mask error for already created /proc entries */
+ RETURN(rc == -EALREADY ? 0 : rc);
stats = exp->exp_nid_stats;
- LASSERT(stats != NULL);
-
- num_stats = NUM_OBD_STATS + LPROC_OFD_STATS_LAST;
-
- stats->nid_stats = lprocfs_alloc_stats(num_stats,
- LPROCFS_STATS_FLAG_NOPERCPU);
+ stats->nid_stats = lprocfs_alloc_stats(NUM_OBD_STATS +
+ LPROC_OFD_STATS_LAST,
+ LPROCFS_STATS_FLAG_NOPERCPU);
if (stats->nid_stats == NULL)
- return -ENOMEM;
+ RETURN(-ENOMEM);
lprocfs_init_ops_stats(LPROC_OFD_STATS_LAST, stats->nid_stats);
+
ofd_stats_counter_init(stats->nid_stats);
- rc = lprocfs_register_stats(stats->nid_proc, "stats",
- stats->nid_stats);
- if (rc)
- GOTO(clean, rc);
- rc = lprocfs_nid_ldlm_stats_init(stats);
- if (rc) {
+ rc = lprocfs_register_stats(stats->nid_proc, "stats", stats->nid_stats);
+ if (rc != 0) {
lprocfs_free_stats(&stats->nid_stats);
- GOTO(clean, rc);
+ GOTO(out, rc);
}
- RETURN(0);
-clean:
- return rc;
+ rc = lprocfs_nid_ldlm_stats_init(stats);
+ if (rc != 0)
+ GOTO(out, rc);
+
+out:
+ RETURN(rc);
}
/**
fed->fed_group = data->ocd_group;
data->ocd_connect_flags &= OST_CONNECT_SUPPORTED;
+ data->ocd_connect_flags2 &= OST_CONNECT_SUPPORTED2;
data->ocd_version = LUSTRE_VERSION_CODE;
/* Kindly make sure the SKIP_ORPHAN flag is from MDS. */
else if (data->ocd_connect_flags & OBD_CONNECT_SKIP_ORPHAN)
RETURN(-EPROTO);
- if (ofd_grant_param_supp(exp)) {
- exp->exp_filter_data.fed_pagesize = data->ocd_blocksize;
- /* ocd_{blocksize,inodespace} are log2 values */
- data->ocd_blocksize = ofd->ofd_blockbits;
- data->ocd_inodespace = ofd->ofd_dt_conf.ddp_inodespace;
- /* ocd_grant_extent is in 1K blocks */
- data->ocd_grant_extent = ofd->ofd_dt_conf.ddp_grant_frag >> 10;
+ /* Determine optimal brw size before calculating grant */
+ if (OBD_FAIL_CHECK(OBD_FAIL_OST_BRW_SIZE)) {
+ data->ocd_brw_size = 65536;
+ } else if (OCD_HAS_FLAG(data, BRW_SIZE)) {
+ if (data->ocd_brw_size > ofd->ofd_brw_size)
+ data->ocd_brw_size = ofd->ofd_brw_size;
+ if (data->ocd_brw_size == 0) {
+ CERROR("%s: cli %s/%p ocd_connect_flags: "LPX64
+ " ocd_version: %x ocd_grant: %d ocd_index: %u "
+ "ocd_brw_size is unexpectedly zero, "
+ "network data corruption?"
+ "Refusing connection of this client\n",
+ exp->exp_obd->obd_name,
+ exp->exp_client_uuid.uuid,
+ exp, data->ocd_connect_flags, data->ocd_version,
+ data->ocd_grant, data->ocd_index);
+ RETURN(-EPROTO);
+ }
}
- if (data->ocd_connect_flags & OBD_CONNECT_GRANT)
- data->ocd_grant = ofd_grant_connect(env, exp, data->ocd_grant,
- new_connection);
+ if (OCD_HAS_FLAG(data, GRANT_PARAM)) {
+ /* client is reporting its page size, for future use */
+ exp->exp_filter_data.fed_pagebits = data->ocd_grant_blkbits;
+ data->ocd_grant_blkbits = ofd->ofd_blockbits;
+ /* ddp_inodespace may not be power-of-two value, eg. for ldiskfs
+ * it's LDISKFS_DIR_REC_LEN(20) = 28. */
+ data->ocd_grant_inobits =
+ fls(ofd->ofd_dt_conf.ddp_inodespace - 1);
+ /* ocd_grant_tax_kb is in 1K byte blocks */
+ data->ocd_grant_tax_kb = ofd->ofd_dt_conf.ddp_extent_tax >> 10;
+ data->ocd_grant_max_blks = ofd->ofd_dt_conf.ddp_max_extent_blks;
+ }
+
+ if (OCD_HAS_FLAG(data, GRANT)) {
+ /* Save connect_data we have so far because ofd_grant_connect()
+ * uses it to calculate grant. */
+ exp->exp_connect_data = *data;
+ ofd_grant_connect(env, exp, data, new_connection);
+ }
if (data->ocd_connect_flags & OBD_CONNECT_INDEX) {
struct lr_server_data *lsd = &ofd->ofd_lut.lut_lsd;
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) {
- data->ocd_brw_size = min(data->ocd_brw_size,
- (__u32)DT_MAX_BRW_SIZE);
- if (data->ocd_brw_size == 0) {
- CERROR("%s: cli %s/%p ocd_connect_flags: "LPX64
- " ocd_version: %x ocd_grant: %d ocd_index: %u "
- "ocd_brw_size is unexpectedly zero, "
- "network data corruption?"
- "Refusing connection of this client\n",
- exp->exp_obd->obd_name,
- exp->exp_client_uuid.uuid,
- exp, data->ocd_connect_flags, data->ocd_version,
- data->ocd_grant, data->ocd_index);
- RETURN(-EPROTO);
- }
- }
if (data->ocd_connect_flags & OBD_CONNECT_CKSUM) {
__u32 cksum_types = data->ocd_cksum_types;
if (exp == NULL || obd == NULL || cluuid == NULL)
RETURN(-EINVAL);
+ rc = nodemap_add_member(*(lnet_nid_t *)client_nid, exp);
+ if (rc != 0 && rc != -EEXIST)
+ RETURN(rc);
+
ofd = ofd_dev(obd->obd_lu_dev);
rc = ofd_parse_connect_data(env, exp, data, false);
if (rc == 0)
ofd_export_stats_init(ofd, exp, client_nid);
-
- nodemap_add_member(*(lnet_nid_t *)client_nid, exp);
+ else
+ nodemap_del_member(exp);
RETURN(rc);
}
struct ofd_device *ofd;
struct lustre_handle conn = { 0 };
int rc;
- lnet_nid_t *client_nid;
ENTRY;
if (_exp == NULL || obd == NULL || cluuid == NULL)
exp = class_conn2export(&conn);
LASSERT(exp != NULL);
+ if (localdata != NULL) {
+ rc = nodemap_add_member(*(lnet_nid_t *)localdata, exp);
+ if (rc != 0 && rc != -EEXIST)
+ GOTO(out, rc);
+ } else {
+ CDEBUG(D_HA, "%s: cannot find nodemap for client %s: "
+ "nid is null\n", obd->obd_name, cluuid->uuid);
+ }
+
rc = ofd_parse_connect_data(env, exp, data, true);
if (rc)
GOTO(out, rc);
- if (localdata != NULL) {
- client_nid = localdata;
- nodemap_add_member(*client_nid, exp);
- }
-
if (obd->obd_replayable) {
struct tg_export_data *ted = &exp->exp_target_data;
out:
if (rc != 0) {
- nodemap_del_member(exp);
class_disconnect(exp);
+ nodemap_del_member(exp);
*_exp = NULL;
} else {
*_exp = exp;
if (!(exp->exp_flags & OBD_OPT_FORCE))
ofd_grant_sanity_check(ofd_obd(ofd), __FUNCTION__);
- nodemap_del_member(exp);
rc = server_disconnect_export(exp);
ofd_grant_discard(exp);
lu_env_fini(&env);
}
out:
+ nodemap_del_member(exp);
class_export_put(exp);
RETURN(rc);
}
ofd_grant_discard(exp);
ofd_fmd_cleanup(exp);
- if (exp_connect_flags(exp) & OBD_CONNECT_GRANT_SHRINK) {
- if (ofd->ofd_tot_granted_clients > 0)
- ofd->ofd_tot_granted_clients --;
- }
+ if (exp_connect_flags(exp) & OBD_CONNECT_GRANT)
+ ofd->ofd_tot_granted_clients--;
if (!(exp->exp_flags & OBD_OPT_FORCE))
ofd_grant_sanity_check(exp->exp_obd, __FUNCTION__);
int ofd_postrecov(const struct lu_env *env, struct ofd_device *ofd)
{
struct lu_device *ldev = &ofd->ofd_dt_dev.dd_lu_dev;
- struct lfsck_start_param lsp;
int rc;
CDEBUG(D_HA, "%s: recovery is over\n", ofd_name(ofd));
- lsp.lsp_start = NULL;
- lsp.lsp_index_valid = 0;
- rc = lfsck_start(env, ofd->ofd_osd, &lsp);
- if (rc != 0 && rc != -EALREADY)
- CWARN("%s: auto trigger paused LFSCK failed: rc = %d\n",
- ofd_name(ofd), rc);
+ if (!ofd->ofd_skip_lfsck) {
+ struct lfsck_start_param lsp;
+
+ lsp.lsp_start = NULL;
+ lsp.lsp_index_valid = 0;
+ rc = lfsck_start(env, ofd->ofd_osd, &lsp);
+ if (rc != 0 && rc != -EALREADY)
+ CWARN("%s: auto trigger paused LFSCK failed: rc = %d\n",
+ ofd_name(ofd), rc);
+ }
return ldev->ld_ops->ldo_recovery_complete(env, ldev);
}
* \retval 0 if successful
* \retval negative value on error
*/
-int ofd_obd_postrecov(struct obd_device *obd)
+static int ofd_obd_postrecov(struct obd_device *obd)
{
struct lu_env env;
struct lu_device *ldev = obd->obd_lu_dev;
* \param[in] key key name
* \param[out] vallen length of key value
* \param[out] val the key value to return
- * \param[in] lsm not used in OFD
*
* \retval 0 if successful
* \retval negative value on error
*/
static int ofd_get_info(const struct lu_env *env, struct obd_export *exp,
- __u32 keylen, void *key, __u32 *vallen, void *val,
- struct lov_stripe_md *lsm)
+ __u32 keylen, void *key, __u32 *vallen, void *val)
{
struct ofd_thread_info *info;
struct ofd_device *ofd;
struct ll_fiemap_info_key *fm_key = key;
- struct ll_user_fiemap *fiemap = val;
+ struct fiemap *fiemap = val;
int rc = 0;
ENTRY;
if (KEY_IS(KEY_FIEMAP)) {
info = ofd_info_init(env, exp);
- rc = ostid_to_fid(&info->fti_fid, &fm_key->oa.o_oi,
+ rc = ostid_to_fid(&info->fti_fid, &fm_key->lfik_oa.o_oi,
ofd->ofd_lut.lut_lsd.lsd_osd_index);
if (rc != 0)
RETURN(rc);
int rc = 0;
ENTRY;
- down_read(&ofd->ofd_lastid_rwsem);
- /* Currently, for safe, we do not distinguish which LAST_ID is broken,
- * we may do that in the future.
- * Return -ENOSPC until the LAST_ID rebuilt. */
- if (unlikely(ofd->ofd_lastid_rebuilding))
- GOTO(out, rc = -ENOSPC);
-
spin_lock(&ofd->ofd_osfs_lock);
if (cfs_time_before_64(ofd->ofd_osfs_age, max_age) || max_age == 0) {
- obd_size unstable;
+ u64 unstable;
/* statfs data are too old, get up-to-date one.
* we must be cautious here since multiple threads might be
unstable = ofd->ofd_osfs_inflight - unstable;
ofd->ofd_osfs_unstable = 0;
if (unstable) {
- /* some writes completed while we were running statfs
+ /* some writes committed while we were running statfs
* w/o the ofd_osfs_lock. Those ones got added to
* the cached statfs data that we are about to crunch.
* Take them into account in the new statfs data */
- osfs->os_bavail -= min_t(obd_size, osfs->os_bavail,
+ osfs->os_bavail -= min_t(u64, osfs->os_bavail,
unstable >> ofd->ofd_blockbits);
/* However, we don't really know if those writes got
* accounted in the statfs call, so tell
if (from_cache)
*from_cache = 1;
}
-
GOTO(out, rc);
out:
- up_read(&ofd->ofd_lastid_rwsem);
-
return rc;
}
osfs->os_bfree << ofd->ofd_blockbits,
osfs->os_bavail << ofd->ofd_blockbits);
- osfs->os_bavail -= min_t(obd_size, osfs->os_bavail,
+ osfs->os_bavail -= min_t(u64, osfs->os_bavail,
((ofd->ofd_tot_dirty + ofd->ofd_tot_pending +
osfs->os_bsize - 1) >> ofd->ofd_blockbits));
struct filter_export_data *fed;
fed = &obd->obd_self_export->exp_filter_data;
- osfs->os_bavail -= min_t(obd_size, osfs->os_bavail,
+ osfs->os_bavail -= min_t(u64, osfs->os_bavail,
fed->fed_grant >> ofd->ofd_blockbits);
}
if (ofd->ofd_raid_degraded)
osfs->os_state |= OS_STATE_DEGRADED;
- if (obd->obd_self_export != exp && ofd_grant_compat(exp, ofd)) {
+ if (obd->obd_self_export != exp && !ofd_grant_param_supp(exp) &&
+ ofd->ofd_blockbits > COMPAT_BSIZE_SHIFT) {
/* clients which don't support OBD_CONNECT_GRANT_PARAM
* should not see a block size > page size, otherwise
* cl_lost_grant goes mad. Therefore, we emulate a 4KB (=2^12)
* \param[in] env execution environment
* \param[in] exp OBD export of OFD device
- * \param[in] oinfo obd_info with setattr parameters
- * \param[in] oti not used in OFD
+ * \param[in] oa setattr parameters
*
* \retval 0 if successful
* \retval negative value on error
*/
-int ofd_echo_setattr(const struct lu_env *env, struct obd_export *exp,
- struct obd_info *oinfo, struct obd_trans_info *oti)
+static int ofd_echo_setattr(const struct lu_env *env, struct obd_export *exp,
+ struct obdo *oa)
{
struct ofd_thread_info *info;
struct ofd_device *ofd = ofd_exp(exp);
struct ldlm_namespace *ns = ofd->ofd_namespace;
struct ldlm_resource *res;
struct ofd_object *fo;
- struct obdo *oa = oinfo->oi_oa;
struct lu_fid *fid = &oa->o_oi.oi_fid;
struct filter_fid *ff = NULL;
int rc = 0;
/* This would be very bad - accidentally truncating a file when
* changing the time or similar - bug 12203. */
- if (oa->o_valid & OBD_MD_FLSIZE &&
- oinfo->oi_policy.l_extent.end != OBD_OBJECT_EOF) {
+ if (oa->o_valid & OBD_MD_FLSIZE) {
static char mdsinum[48];
if (oa->o_valid & OBD_MD_FLFID)
int ofd_destroy_by_fid(const struct lu_env *env, struct ofd_device *ofd,
const struct lu_fid *fid, int orphan)
{
- struct ofd_thread_info *info = ofd_info(env);
- struct lustre_handle lockh;
- __u64 flags = LDLM_FL_AST_DISCARD_DATA;
- __u64 rc = 0;
- ldlm_policy_data_t policy = {
- .l_extent = { 0, OBD_OBJECT_EOF }
- };
- struct ofd_object *fo;
+ struct ofd_thread_info *info = ofd_info(env);
+ struct lustre_handle lockh;
+ union ldlm_policy_data policy = { .l_extent = { 0, OBD_OBJECT_EOF } };
+ struct ofd_object *fo;
+ __u64 flags = LDLM_FL_AST_DISCARD_DATA;
+ __u64 rc = 0;
ENTRY;
* \param[in] env execution environment
* \param[in] exp OBD export of OFD device
* \param[in] oa obdo structure with FID
- * \param[in] oti not used in OFD
*
* Note: this is OBD API method which is common API for server OBDs and
* client OBDs. Thus some parameters used in client OBDs may not be used
* \retval 0 if successful
* \retval negative value on error
*/
-int ofd_echo_destroy(const struct lu_env *env, struct obd_export *exp,
- struct obdo *oa, struct obd_trans_info *oti)
+static int ofd_echo_destroy(const struct lu_env *env, struct obd_export *exp,
+ struct obdo *oa)
{
struct ofd_device *ofd = ofd_exp(exp);
struct lu_fid *fid = &oa->o_oi.oi_fid;
* \param[in] env execution environment
* \param[in] exp OBD export of OFD device
* \param[in] oa obdo structure with FID sequence to use
- * \param[out] ea contains object ID/SEQ to return
- * \param[in] oti not used in OFD
*
* Note: this is OBD API method which is common API for server OBDs and
* client OBDs. Thus some parameters used in client OBDs may not be used
* \retval 0 if successful
* \retval negative value on error
*/
-int ofd_echo_create(const struct lu_env *env, struct obd_export *exp,
- struct obdo *oa, struct obd_trans_info *oti)
+static int ofd_echo_create(const struct lu_env *env, struct obd_export *exp,
+ struct obdo *oa)
{
struct ofd_device *ofd = ofd_exp(exp);
struct ofd_thread_info *info;
- obd_seq seq = ostid_seq(&oa->o_oi);
+ u64 seq = ostid_seq(&oa->o_oi);
struct ofd_seq *oseq;
int rc = 0, diff = 1;
- obd_id next_id;
+ long granted;
+ u64 next_id;
int count;
ENTRY;
}
mutex_lock(&oseq->os_create_lock);
- rc = ofd_grant_create(env, ofd_obd(ofd)->obd_self_export, &diff);
- if (rc < 0) {
+ granted = ofd_grant_create(env, ofd_obd(ofd)->obd_self_export, &diff);
+ if (granted < 0) {
+ rc = granted;
+ granted = 0;
CDEBUG(D_HA, "%s: failed to acquire grant space for "
"precreate (%d): rc = %d\n", ofd_name(ofd), diff, rc);
diff = 0;
rc = 0;
}
- ofd_grant_commit(env, ofd_obd(ofd)->obd_self_export, rc);
+ ofd_grant_commit(ofd_obd(ofd)->obd_self_export, granted, rc);
out:
mutex_unlock(&oseq->os_create_lock);
ofd_seq_put(env, oseq);
*
* \param[in] env execution environment
* \param[in] exp OBD export of OFD device
- * \param[in,out] oinfo contains FID of object to get attributes from and
+ * \param[in,out] oa contains FID of object to get attributes from and
* is used to return attributes back
*
* \retval 0 if successful
* \retval negative value on error
*/
-int ofd_echo_getattr(const struct lu_env *env, struct obd_export *exp,
- struct obd_info *oinfo)
+static int ofd_echo_getattr(const struct lu_env *env, struct obd_export *exp,
+ struct obdo *oa)
{
struct ofd_device *ofd = ofd_exp(exp);
struct ofd_thread_info *info;
- struct lu_fid *fid = &oinfo->oi_oa->o_oi.oi_fid;
+ struct lu_fid *fid = &oa->o_oi.oi_fid;
struct ofd_object *fo;
int rc = 0;
LASSERT(fo != NULL);
rc = ofd_attr_get(env, fo, &info->fti_attr);
- oinfo->oi_oa->o_valid = OBD_MD_FLID;
+ oa->o_valid = OBD_MD_FLID;
if (rc == 0) {
__u64 curr_version;
- obdo_from_la(oinfo->oi_oa, &info->fti_attr,
+ obdo_from_la(oa, &info->fti_attr,
OFD_VALID_FLAGS | LA_UID | LA_GID);
/* Store object version in reply */
curr_version = dt_version_get(env, ofd_object_child(fo));
if ((__s64)curr_version != -EOPNOTSUPP) {
- oinfo->oi_oa->o_valid |= OBD_MD_FLDATAVERSION;
- oinfo->oi_oa->o_data_version = curr_version;
+ oa->o_valid |= OBD_MD_FLDATAVERSION;
+ oa->o_data_version = curr_version;
}
}
* \retval 0 if successful
* \retval negative value on error
*/
-int ofd_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
- void *karg, void *uarg)
+static int ofd_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
+ void *karg, void __user *uarg)
{
struct lu_env env;
struct ofd_device *ofd = ofd_exp(exp);
switch (cmd) {
case OBD_IOC_ABORT_RECOVERY:
CERROR("%s: aborting recovery\n", obd->obd_name);
+ obd->obd_abort_recovery = 1;
target_stop_recovery_thread(obd);
break;
case OBD_IOC_SYNC:
* special actions, it just invokes target_recovery_cleanup().
*
* \param[in] obd OBD device of OFD
- * \param[in] stage cleanup stage
*
* \retval 0
*/
-static int ofd_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage)
+static int ofd_precleanup(struct obd_device *obd)
{
- int rc = 0;
-
ENTRY;
-
- switch(stage) {
- case OBD_CLEANUP_EARLY:
- break;
- case OBD_CLEANUP_EXPORTS:
- target_cleanup_recovery(obd);
- break;
- }
- RETURN(rc);
+ target_cleanup_recovery(obd);
+ RETURN(0);
}
/**