* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
plus the procfs overhead :( */
static int filter_export_stats_init(struct obd_device *obd,
struct obd_export *exp,
+ int reconnect,
void *client_nid)
{
int rc, newnid = 0;
/* Self-export gets no proc entry */
RETURN(0);
- rc = lprocfs_exp_setup(exp, client_nid, &newnid);
+ rc = lprocfs_exp_setup(exp, client_nid, reconnect, &newnid);
if (rc) {
/* Mask error for already created
* /proc entries */
tmp->nid_stats);
if (rc)
GOTO(clean, rc);
- /* Always add in ldlm_stats */
- tmp->nid_ldlm_stats =
- lprocfs_alloc_stats(LDLM_LAST_OPC - LDLM_FIRST_OPC,
- LPROCFS_STATS_FLAG_NOPERCPU);
- if (tmp->nid_ldlm_stats == NULL)
- GOTO(clean, rc = -ENOMEM);
-
- lprocfs_init_ldlm_stats(tmp->nid_ldlm_stats);
- rc = lprocfs_register_stats(tmp->nid_proc, "ldlm_stats",
- tmp->nid_ldlm_stats);
+ rc = lprocfs_nid_ldlm_stats_init(tmp);
if (rc)
GOTO(clean, rc);
}
RETURN(0);
clean:
- lprocfs_exp_cleanup(exp);
return rc;
}
* caller must hold fed_lock and take fmd reference itself */
static struct filter_mod_data *filter_fmd_find_nolock(struct filter_obd *filter,
struct filter_export_data *fed,
- obd_id objid, obd_gr group)
+ obd_id objid, obd_seq group)
{
struct filter_mod_data *found = NULL, *fmd;
/* Find fmd based on objid and group, or return NULL if not found. */
struct filter_mod_data *filter_fmd_find(struct obd_export *exp,
- obd_id objid, obd_gr group)
+ obd_id objid, obd_seq group)
{
struct filter_mod_data *fmd;
* Currently this is not fatal because any fmd state is transient and
* may also be freed when it gets sufficiently old. */
struct filter_mod_data *filter_fmd_get(struct obd_export *exp,
- obd_id objid, obd_gr group)
+ obd_id objid, obd_seq group)
{
struct filter_export_data *fed = &exp->exp_filter_data;
struct filter_mod_data *found = NULL, *fmd_new = NULL;
* This isn't so critical because it would in fact only affect the one client
* that is doing the unlink and at worst we have an stale entry referencing
* an object that should never be used again. */
-static void filter_fmd_drop(struct obd_export *exp, obd_id objid, obd_gr group)
+static void filter_fmd_drop(struct obd_export *exp, obd_id objid, obd_seq group)
{
struct filter_mod_data *found = NULL;
static int filter_init_export(struct obd_export *exp)
{
+ int rc;
cfs_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);
exp->exp_connecting = 1;
cfs_spin_unlock(&exp->exp_lock);
+ rc = lut_client_alloc(exp);
+ if (rc == 0)
+ rc = ldlm_init_export(exp);
- return ldlm_init_export(exp);
+ return rc;
}
static int filter_free_server_data(struct obd_device_target *obt)
RETURN(rc);
}
-int filter_update_last_objid(struct obd_device *obd, obd_gr group,
+int filter_update_last_objid(struct obd_device *obd, obd_seq group,
int force_sync)
{
struct filter_obd *filter = &obd->u.filter;
ENTRY;
if (filter->fo_last_objid_files[group] == NULL) {
- CERROR("Object group "LPU64" not fully setup; not updating "
+ CERROR("Object seq "LPU64" not fully setup; not updating "
"last_objid\n", group);
RETURN(-EINVAL);
}
- CDEBUG(D_INODE, "%s: server last_objid for group "LPU64": "LPU64"\n",
- obd->obd_name, group, filter->fo_last_objids[group]);
+ CDEBUG(D_INODE, "%s: server last_objid for "POSTID"\n",
+ obd->obd_name, filter->fo_last_objids[group], group);
tmp = cpu_to_le64(filter->fo_last_objids[group]);
rc = fsfilt_write_record(obd, filter->fo_last_objid_files[group],
&tmp, sizeof(tmp), &off, force_sync);
if (rc)
- CERROR("error writing group "LPU64" last objid: rc = %d\n",
+ CERROR("error writing seq "LPU64" last objid: rc = %d\n",
group, rc);
RETURN(rc);
}
GOTO(out, rc = 0);
}
+ OBD_ALLOC_PTR(lcd);
+ if (!lcd)
+ GOTO(err_client, rc = -ENOMEM);
+
for (cl_idx = 0, off = le32_to_cpu(lsd->lsd_client_start);
off < last_rcvd_size; cl_idx++) {
__u64 last_rcvd;
struct obd_export *exp;
struct filter_export_data *fed;
- if (!lcd) {
- OBD_ALLOC_PTR(lcd);
- if (!lcd)
- GOTO(err_client, rc = -ENOMEM);
- }
-
/* Don't assume off is incremented properly by
* fsfilt_read_record(), in case sizeof(*lcd)
* isn't the same as lsd->lsd_client_size. */
last_rcvd = le64_to_cpu(lcd->lcd_last_transno);
+ CDEBUG(D_HA, "RCVRNG CLIENT uuid: %s idx: %d lr: "LPU64
+ " srv lr: "LPU64"\n", lcd->lcd_uuid, cl_idx,
+ last_rcvd, le64_to_cpu(lsd->lsd_last_transno));
+
/* These exports are cleaned up by filter_disconnect(), so they
* need to be set up like real exports as filter_connect() does.
*/
exp = class_new_export(obd, (struct obd_uuid *)lcd->lcd_uuid);
-
- CDEBUG(D_HA, "RCVRNG CLIENT uuid: %s idx: %d lr: "LPU64
- " srv lr: "LPU64"\n", lcd->lcd_uuid, cl_idx,
- last_rcvd, le64_to_cpu(lsd->lsd_last_transno));
if (IS_ERR(exp)) {
if (PTR_ERR(exp) == -EALREADY) {
/* export already exists, zero out this one */
- CERROR("Zeroing out duplicate export due to "
- "bug 10479.\n");
- lcd->lcd_uuid[0] = '\0';
- } else {
- GOTO(err_client, rc = PTR_ERR(exp));
+ CERROR("Duplicate export %s!\n", lcd->lcd_uuid);
+ continue;
}
- } else {
- fed = &exp->exp_filter_data;
- fed->fed_ted.ted_lcd = lcd;
- fed->fed_group = 0; /* will be assigned at connect */
- filter_export_stats_init(obd, exp, NULL);
- rc = filter_client_add(obd, exp, cl_idx);
- /* can't fail for existing client */
- LASSERTF(rc == 0, "rc = %d\n", rc);
-
- /* VBR: set export last committed */
- exp->exp_last_committed = last_rcvd;
- cfs_spin_lock(&exp->exp_lock);
- exp->exp_connecting = 0;
- exp->exp_in_recovery = 0;
- cfs_spin_unlock(&exp->exp_lock);
- cfs_spin_lock_bh(&obd->obd_processing_task_lock);
- obd->obd_max_recoverable_clients++;
- cfs_spin_unlock_bh(&obd->obd_processing_task_lock);
- lcd = NULL;
- class_export_put(exp);
+ OBD_FREE_PTR(lcd);
+ GOTO(err_client, rc = PTR_ERR(exp));
}
- /* Need to check last_rcvd even for duplicated exports. */
- CDEBUG(D_OTHER, "client at idx %d has last_rcvd = "LPU64"\n",
- cl_idx, last_rcvd);
+ fed = &exp->exp_filter_data;
+ *fed->fed_ted.ted_lcd = *lcd;
+ fed->fed_group = 0; /* will be assigned at connect */
+ filter_export_stats_init(obd, exp, 0, NULL);
+ rc = filter_client_add(obd, exp, cl_idx);
+ /* can't fail for existing client */
+ LASSERTF(rc == 0, "rc = %d\n", rc);
+
+ /* VBR: set export last committed */
+ exp->exp_last_committed = last_rcvd;
+ cfs_spin_lock(&exp->exp_lock);
+ exp->exp_connecting = 0;
+ exp->exp_in_recovery = 0;
+ cfs_spin_unlock(&exp->exp_lock);
+ obd->obd_max_recoverable_clients++;
+ class_export_put(exp);
if (last_rcvd > le64_to_cpu(lsd->lsd_last_transno))
lsd->lsd_last_transno = cpu_to_le64(last_rcvd);
}
-
- if (lcd)
- OBD_FREE_PTR(lcd);
+ OBD_FREE_PTR(lcd);
obd->obd_last_committed = le64_to_cpu(lsd->lsd_last_transno);
out:
- lut->lut_mount_count = mount_count + 1;
- lsd->lsd_mount_count = cpu_to_le64(lut->lut_mount_count);
+ obd->u.obt.obt_mount_count = mount_count + 1;
+ lsd->lsd_mount_count = cpu_to_le64(obd->u.obt.obt_mount_count);
/* save it, so mount count and last_transno is current */
rc = filter_update_server_data(obd);
GOTO(cleanup, rc);
}
- if (filter->fo_subdir_count && filter_group_is_mds(group)) {
+ if (filter->fo_subdir_count && fid_seq_is_mdt(group)) {
OBD_ALLOC(tmp_subdirs, sizeof(*tmp_subdirs));
if (tmp_subdirs == NULL)
GOTO(cleanup, rc = -ENOMEM);
filter->fo_dentry_O_groups[group] = dentry;
filter->fo_last_objid_files[group] = filp;
- if (filter->fo_subdir_count && filter_group_is_mds(group)) {
+ if (filter->fo_subdir_count && fid_seq_is_mdt(group)) {
filter->fo_dentry_O_sub[group] = *tmp_subdirs;
OBD_FREE(tmp_subdirs, sizeof(*tmp_subdirs));
}
if (new_files != NULL)
OBD_FREE(new_files, len * sizeof(*new_files));
case 3:
- if (filter->fo_subdir_count && filter_group_is_mds(group)) {
+ if (filter->fo_subdir_count && fid_seq_is_mdt(group)) {
for (i = 0; i < filter->fo_subdir_count; i++) {
if (tmp_subdirs->dentry[i] != NULL)
dput(tmp_subdirs->dentry[i]);
}
if (off == 0)
- last_group = FILTER_GROUP_MDS0;
+ last_group = FID_SEQ_OST_MDT0;
CWARN("%s: initialize groups [%d,%d]\n", obd->obd_name,
- FILTER_GROUP_MDS0, last_group);
+ FID_SEQ_OST_MDT0, last_group);
filter->fo_committed_group = last_group;
rc = filter_read_groups(obd, last_group, 1);
if (rc)
}
static void filter_set_last_id(struct filter_obd *filter,
- obd_id id, obd_gr group)
+ obd_id id, obd_seq group)
{
LASSERT(group <= filter->fo_group_count);
cfs_spin_unlock(&filter->fo_objidlock);
}
-obd_id filter_last_id(struct filter_obd *filter, obd_gr group)
+obd_id filter_last_id(struct filter_obd *filter, obd_seq group)
{
obd_id id;
LASSERT(group <= filter->fo_group_count);
}
/* We never dget the object parent, so DON'T dput it either */
-struct dentry *filter_parent(struct obd_device *obd, obd_gr group, obd_id objid)
+struct dentry *filter_parent(struct obd_device *obd, obd_seq group, obd_id objid)
{
struct filter_obd *filter = &obd->u.filter;
struct filter_subdirs *subdirs;
LASSERT(group < filter->fo_group_count); /* FIXME: object groups */
- if (!filter_group_is_mds(group) || filter->fo_subdir_count == 0)
+ if (!fid_seq_is_mdt(group) || filter->fo_subdir_count == 0)
return filter->fo_dentry_O_groups[group];
subdirs = &filter->fo_dentry_O_sub[group];
}
/* We never dget the object parent, so DON'T dput it either */
-struct dentry *filter_parent_lock(struct obd_device *obd, obd_gr group,
+struct dentry *filter_parent_lock(struct obd_device *obd, obd_seq group,
obd_id objid)
{
unsigned long now = jiffies;
* internal to the filesystem code. */
struct dentry *filter_fid2dentry(struct obd_device *obd,
struct dentry *dir_dentry,
- obd_gr group, obd_id id)
+ obd_seq group, obd_id id)
{
struct dentry *dparent = dir_dentry;
struct dentry *dchild;
if (dir_dentry == NULL) {
dparent = filter_parent_lock(obd, group, id);
if (IS_ERR(dparent)) {
- CERROR("%s: error getting object "LPU64":"LPU64
+ CERROR("%s: error getting object "POSTID
" parent: rc %ld\n", obd->obd_name,
id, group, PTR_ERR(dparent));
RETURN(dparent);
if (dir_dentry == NULL)
filter_parent_unlock(dparent);
if (IS_ERR(dchild)) {
- CERROR("%s: child lookup error %ld\n", obd->obd_name,
- PTR_ERR(dchild));
+ CERROR("%s: object "LPU64":"LPU64" lookup error: rc %ld\n",
+ obd->obd_name, id, group, PTR_ERR(dchild));
RETURN(dchild);
}
* Caller must hold child i_mutex, we drop it always.
* Caller is also required to ensure that dchild->d_inode exists. */
static int filter_destroy_internal(struct obd_device *obd, obd_id objid,
- obd_gr group, struct dentry *dparent,
+ obd_seq group, struct dentry *dparent,
struct dentry *dchild)
{
struct inode *inode = dchild->d_inode;
obd->u.obt.obt_vfsmnt = mnt;
obd->u.obt.obt_sb = mnt->mnt_sb;
+ obd->u.obt.obt_magic = OBT_MAGIC;
filter->fo_fstype = mnt->mnt_sb->s_type->name;
CDEBUG(D_SUPER, "%s: mnt = %p\n", filter->fo_fstype, mnt);
CFS_INIT_LIST_HEAD(&filter->fo_export_list);
cfs_sema_init(&filter->fo_alloc_lock, 1);
init_brw_stats(&filter->fo_filter_stats);
+ cfs_spin_lock_init(&filter->fo_flags_lock);
filter->fo_read_cache = 1; /* enable read-only cache by default */
filter->fo_writethrough_cache = 1; /* enable writethrough cache */
filter->fo_readcache_max_filesize = FILTER_MAX_CACHE_SIZE;
filter->fo_fmd_max_num = FILTER_FMD_MAX_NUM_DEFAULT;
filter->fo_fmd_max_age = FILTER_FMD_MAX_AGE_DEFAULT;
+ filter->fo_syncjournal = 0; /* Don't sync journals on i/o by default */
+ filter_slc_set(filter); /* initialize sync on lock cancel */
rc = filter_prep(obd);
if (rc)
LASSERT_SPIN_LOCKED(&filter->fo_llog_list_lock);
cfs_list_for_each_entry(olg, &filter->fo_llog_list, olg_list) {
- if (olg->olg_group == group)
+ if (olg->olg_seq == group)
RETURN(olg);
}
RETURN(NULL);
filter = &obd->u.filter;
- if (group == FILTER_GROUP_LLOG)
+ if (group == FID_SEQ_LLOG)
RETURN(&obd->obd_olg);
cfs_spin_lock(&filter->fo_llog_list_lock);
filter = &obd->u.filter;
- if (group == FILTER_GROUP_LLOG)
+ if (group == FID_SEQ_LLOG)
RETURN(&obd->obd_olg);
cfs_spin_lock(&filter->fo_llog_list_lock);
CDEBUG(D_OTHER, "%s: LLog connect for: "LPX64"/"LPX64":%x\n",
obd->obd_name, body->lgdc_logid.lgl_oid,
- body->lgdc_logid.lgl_ogr, body->lgdc_logid.lgl_ogen);
+ body->lgdc_logid.lgl_oseq, body->lgdc_logid.lgl_ogen);
- olg = filter_find_olg(obd, body->lgdc_logid.lgl_ogr);
+ olg = filter_find_olg(obd, body->lgdc_logid.lgl_oseq);
if (!olg) {
CERROR(" %s: can not find olg of group %d\n",
- obd->obd_name, (int)body->lgdc_logid.lgl_ogr);
+ obd->obd_name, (int)body->lgdc_logid.lgl_oseq);
RETURN(-ENOENT);
}
llog_group_set_export(olg, exp);
CWARN("%s: Recovery from log "LPX64"/"LPX64":%x\n",
obd->obd_name, body->lgdc_logid.lgl_oid,
- body->lgdc_logid.lgl_ogr, body->lgdc_logid.lgl_ogen);
+ body->lgdc_logid.lgl_oseq, body->lgdc_logid.lgl_ogen);
- cfs_spin_lock_bh(&obd->obd_processing_task_lock);
+ cfs_spin_lock(&obd->u.filter.fo_flags_lock);
obd->u.filter.fo_mds_ost_sync = 1;
- cfs_spin_unlock_bh(&obd->obd_processing_task_lock);
+ cfs_spin_unlock(&obd->u.filter.fo_flags_lock);
rc = llog_connect(ctxt, &body->lgdc_logid,
&body->lgdc_gen, NULL);
llog_ctxt_put(ctxt);
rc = filter_olg_fini(olg);
if (rc)
CERROR("failed to cleanup llogging subsystem for %u\n",
- olg->olg_group);
+ olg->olg_seq);
OBD_FREE_PTR(olg);
}
rc = filter_connect_internal(exp, data, 1);
if (rc == 0)
- filter_export_stats_init(obd, exp, localdata);
+ filter_export_stats_init(obd, exp, 1, localdata);
RETURN(rc);
}
struct lvfs_run_ctxt saved;
struct lustre_handle conn = { 0 };
struct obd_export *lexp;
- struct tg_export_data *ted;
- struct lsd_client_data *lcd = NULL;
__u32 group;
int rc;
ENTRY;
lexp = class_conn2export(&conn);
LASSERT(lexp != NULL);
- ted = &lexp->exp_target_data;
-
rc = filter_connect_internal(lexp, data, 0);
if (rc)
GOTO(cleanup, rc);
- filter_export_stats_init(obd, lexp, localdata);
+ filter_export_stats_init(obd, lexp, 0, localdata);
if (obd->obd_replayable) {
- OBD_ALLOC(lcd, sizeof(*lcd));
- if (!lcd) {
- CERROR("filter: out of memory for client data\n");
- GOTO(cleanup, rc = -ENOMEM);
- }
-
+ struct lsd_client_data *lcd = lexp->exp_target_data.ted_lcd;
+ LASSERT(lcd);
memcpy(lcd->lcd_uuid, cluuid, sizeof(lcd->lcd_uuid));
- ted->ted_lcd = lcd;
rc = filter_client_add(obd, lexp, -1);
if (rc)
GOTO(cleanup, rc);
cleanup:
if (rc) {
class_disconnect(lexp);
- lprocfs_exp_cleanup(lexp);
*exp = NULL;
} else {
*exp = lexp;
target_destroy_export(exp);
ldlm_destroy_export(exp);
+ lut_client_free(exp);
if (obd_uuid_equals(&exp->exp_client_uuid, &exp->exp_obd->obd_uuid))
RETURN(0);
- lut_client_free(exp);
-
if (!exp->exp_obd->obd_replayable)
fsfilt_sync(exp->exp_obd, exp->exp_obd->u.obt.obt_sb);
}
if (!(exp->exp_flags & OBD_OPT_FORCE))
- filter_grant_sanity_check(exp->exp_obd, __FUNCTION__);
+ filter_grant_sanity_check(exp->exp_obd, __func__);
RETURN(0);
}
group = 1 << 30;
cfs_spin_lock(&filter->fo_llog_list_lock);
cfs_list_for_each_entry(olg, &filter->fo_llog_list, olg_list) {
- if (olg->olg_group <= worked) {
+ if (olg->olg_seq <= worked) {
/* this group is already synced */
continue;
}
- if (group < olg->olg_group) {
+ if (group < olg->olg_seq) {
/* we have group with smaller number to sync */
continue;
}
/* store current minimal group */
olg_min = olg;
- group = olg->olg_group;
+ group = olg->olg_seq;
}
cfs_spin_unlock(&filter->fo_llog_list_lock);
if (olg_min == NULL)
break;
- worked = olg_min->olg_group;
+ worked = olg_min->olg_seq;
if (olg_min->olg_exp &&
(dexp == olg_min->olg_exp || dexp == NULL)) {
int err;
class_export_get(exp);
if (!(exp->exp_flags & OBD_OPT_FORCE))
- filter_grant_sanity_check(obd, __FUNCTION__);
+ filter_grant_sanity_check(obd, __func__);
filter_grant_discard(exp);
/* Flush any remaining cancel messages out to the target */
return 0;
}
-struct dentry *__filter_oa2dentry(struct obd_device *obd, struct obdo *oa,
+struct dentry *__filter_oa2dentry(struct obd_device *obd, struct ost_id *ostid,
const char *what, int quiet)
{
struct dentry *dchild = NULL;
- obd_gr group = 0;
- if (oa->o_valid & OBD_MD_FLGROUP)
- group = oa->o_gr;
-
- dchild = filter_fid2dentry(obd, NULL, group, oa->o_id);
+ dchild = filter_fid2dentry(obd, NULL, ostid->oi_seq, ostid->oi_id);
if (IS_ERR(dchild)) {
- CERROR("%s error looking up object: "LPU64":"LPU64"\n",
- what, group, oa->o_id);
+ CERROR("%s error looking up object: "POSTID"\n",
+ what, ostid->oi_id, ostid->oi_seq);
RETURN(dchild);
}
if (dchild->d_inode == NULL) {
if (!quiet)
- CERROR("%s: %s on non-existent object: "LPU64"\n",
- obd->obd_name, what, oa->o_id);
+ CERROR("%s: %s on non-existent object: "POSTID" \n",
+ obd->obd_name, what, ostid->oi_id,ostid->oi_seq);
f_dput(dchild);
RETURN(ERR_PTR(-ENOENT));
}
int rc = 0;
ENTRY;
- LASSERT(oinfo->oi_oa->o_valid & OBD_MD_FLGROUP);
- rc = filter_auth_capa(exp, NULL, oinfo->oi_oa->o_gr,
+ rc = filter_auth_capa(exp, NULL, oinfo->oi_oa->o_seq,
oinfo_capa(oinfo), CAPA_OPC_META_READ);
if (rc)
RETURN(rc);
RETURN(-EINVAL);
}
- dentry = filter_oa2dentry(obd, oinfo->oi_oa);
+ dentry = filter_oa2dentry(obd, &oinfo->oi_oa->o_oi);
if (IS_ERR(dentry))
RETURN(PTR_ERR(dentry));
/* Limit the valid bits in the return data to what we actually use */
oinfo->oi_oa->o_valid = OBD_MD_FLID;
- obdo_from_inode(oinfo->oi_oa, dentry->d_inode, FILTER_VALID_FLAGS);
+ obdo_from_inode(oinfo->oi_oa, dentry->d_inode, NULL, FILTER_VALID_FLAGS);
f_dput(dentry);
RETURN(rc);
struct filter_fid ff;
if (!(oa->o_valid & OBD_MD_FLGROUP))
- oa->o_gr = 0;
+ oa->o_seq = 0;
/* packing fid and converting it to LE for storing into EA.
* Here ->o_stripe_idx should be filled by LOV and rest of
* fields - by client. */
- ff.ff_fid.id = cpu_to_le64(oa->o_fid);
- ff.ff_fid.f_type = cpu_to_le32(oa->o_stripe_idx);
- ff.ff_fid.generation = cpu_to_le32(oa->o_generation);
+ ff.ff_parent.f_seq = cpu_to_le64(oa->o_parent_seq);
+ ff.ff_parent.f_oid = cpu_to_le32(oa->o_parent_oid);
+ /* XXX: we are ignoring o_parent_ver here, since this should
+ * be the same for all objects in this fileset. */
+ ff.ff_parent.f_ver = cpu_to_le32(oa->o_stripe_idx);
ff.ff_objid = cpu_to_le64(oa->o_id);
- ff.ff_group = cpu_to_le64(oa->o_gr);
+ ff.ff_seq = cpu_to_le64(oa->o_seq);
- CDEBUG(D_INODE, "storing filter fid EA ("LPU64"/%u/%u"
- LPU64"/"LPU64")\n", oa->o_fid, oa->o_stripe_idx,
- oa->o_generation, oa->o_id, oa->o_gr);
+ CDEBUG(D_INODE, "storing filter fid EA (parent "DFID" "
+ LPU64"/"LPU64")\n", PFID(&ff.ff_parent), oa->o_id,
+ oa->o_seq);
rc = fsfilt_set_md(obd, inode, handle, &ff, sizeof(ff), "fid");
if (rc)
if (OBD_FAIL_CHECK(OBD_FAIL_OST_SETATTR_CREDITS))
fsfilt_extend(exp->exp_obd, inode, 0, handle);
- /* The truncate might have used up our transaction credits. Make
- * sure we have one left for the last_rcvd update. */
- err = fsfilt_extend(exp->exp_obd, inode, 1, handle);
+ /* The truncate might have used up our transaction credits. Make sure
+ * we have two left for the last_rcvd and VBR inode version updates. */
+ err = fsfilt_extend(exp->exp_obd, inode, 2, handle);
rc = filter_finish_transno(exp, inode, oti, rc, sync);
if (sync) {
if (oa->o_valid & OBD_FL_TRUNC)
opc |= CAPA_OPC_OSS_TRUNC;
- LASSERT(oa->o_valid & OBD_MD_FLGROUP);
- rc = filter_auth_capa(exp, NULL, oa->o_gr, capa, opc);
+ rc = filter_auth_capa(exp, NULL, oa->o_seq, capa, opc);
if (rc)
RETURN(rc);
if (oa->o_valid & (OBD_MD_FLUID | OBD_MD_FLGID)) {
- rc = filter_capa_fixoa(exp, oa, oa->o_gr, capa);
+ rc = filter_capa_fixoa(exp, oa, oa->o_seq, capa);
if (rc)
RETURN(rc);
}
- osc_build_res_name(oa->o_id, oa->o_gr, &res_id);
+ osc_build_res_name(oa->o_id, oa->o_seq, &res_id);
/* This would be very bad - accidentally truncating a file when
* changing the time or similar - bug 12203. */
if (oa->o_valid & OBD_MD_FLSIZE &&
static char mdsinum[48];
if (oa->o_valid & OBD_MD_FLFID)
- snprintf(mdsinum, sizeof(mdsinum) - 1,
- " of inode "LPU64"/%u", oa->o_fid,
- oa->o_generation);
+ snprintf(mdsinum, sizeof(mdsinum) - 1, " of inode "DFID,
+ oa->o_parent_seq, oa->o_parent_oid,
+ oa->o_parent_ver);
else
mdsinum[0] = '\0';
- CERROR("%s: setattr from %s trying to truncate objid "LPU64
- " %s\n",
- exp->exp_obd->obd_name, obd_export_nid2str(exp),
- oa->o_id, mdsinum);
+ CERROR("%s: setattr from %s trying to truncate objid "POSTID
+ "%s\n", exp->exp_obd->obd_name, obd_export_nid2str(exp),
+ oa->o_id, oa->o_seq, mdsinum);
RETURN(-EPERM);
}
- dentry = __filter_oa2dentry(exp->exp_obd, oa, __FUNCTION__, 1);
+ dentry = __filter_oa2dentry(exp->exp_obd, &oinfo->oi_oa->o_oi, __func__, 1);
if (IS_ERR(dentry))
RETURN(PTR_ERR(dentry));
if (oa->o_valid &
(OBD_MD_FLMTIME | OBD_MD_FLATIME | OBD_MD_FLCTIME)) {
down_write(&dentry->d_inode->i_alloc_sem);
- fmd = filter_fmd_get(exp, oa->o_id, oa->o_gr);
+ fmd = filter_fmd_get(exp, oa->o_id, oa->o_seq);
if (fmd && fmd->fmd_mactime_xid < oti->oti_xid)
fmd->fmd_mactime_xid = oti->oti_xid;
filter_fmd_put(exp, fmd);
oa->o_valid = OBD_MD_FLID;
/* Quota release need uid/gid info */
- obdo_from_inode(oa, dentry->d_inode,
+ obdo_from_inode(oa, dentry->d_inode, NULL,
FILTER_VALID_FLAGS | OBD_MD_FLUID | OBD_MD_FLGID);
EXIT;
RETURN(lsm_size);
}
-/* caller must hold fo_create_locks[oa->o_gr] */
+/* caller must hold fo_create_locks[oa->o_seq] */
static int filter_destroy_precreated(struct obd_export *exp, struct obdo *oa,
struct filter_obd *filter)
{
int skip_orphan;
ENTRY;
- LASSERT(oa);
- LASSERT_MDS_GROUP(oa->o_gr);
- LASSERT(oa->o_valid & OBD_MD_FLGROUP);
- LASSERT(down_trylock(&filter->fo_create_locks[oa->o_gr]) != 0);
+ LASSERT(down_trylock(&filter->fo_create_locks[oa->o_seq]) != 0);
memset(&doa, 0, sizeof(doa));
doa.o_valid |= OBD_MD_FLGROUP;
- doa.o_gr = oa->o_gr;
+ doa.o_seq = oa->o_seq;
doa.o_mode = S_IFREG;
- if (!cfs_test_bit(doa.o_gr, &filter->fo_destroys_in_progress)) {
+ if (!cfs_test_bit(doa.o_seq, &filter->fo_destroys_in_progress)) {
CERROR("%s:["LPU64"] destroys_in_progress already cleared\n",
- exp->exp_obd->obd_name, doa.o_gr);
+ exp->exp_obd->obd_name, doa.o_seq);
RETURN(0);
}
- last = filter_last_id(filter, doa.o_gr);
+ last = filter_last_id(filter, doa.o_seq);
skip_orphan = !!(exp->exp_connect_flags & OBD_CONNECT_SKIP_ORPHAN);
/* 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 ((id & 511) == 0 && !skip_orphan) {
- filter_set_last_id(filter, id - 1, doa.o_gr);
- filter_update_last_objid(exp->exp_obd, doa.o_gr, 0);
+ filter_set_last_id(filter, id - 1, doa.o_seq);
+ filter_update_last_objid(exp->exp_obd, doa.o_seq, 0);
}
}
CDEBUG(D_HA, "%s: after destroy: set last_objids["LPU64"] = "LPU64"\n",
- exp->exp_obd->obd_name, doa.o_gr, oa->o_id);
+ exp->exp_obd->obd_name, doa.o_seq, oa->o_id);
if (!skip_orphan) {
- filter_set_last_id(filter, id, doa.o_gr);
- rc = filter_update_last_objid(exp->exp_obd, doa.o_gr, 1);
+ filter_set_last_id(filter, id, doa.o_seq);
+ rc = filter_update_last_objid(exp->exp_obd, doa.o_seq, 1);
} else {
- /* don't reuse orphan object, return last used objid */
+ /*
+ * We have destroyed orphan objects, but don't want to reuse
+ * them. Therefore we don't reset last_id to the last created
+ * objects. Instead, we report back to the MDS the object id
+ * of the last orphan, so that the MDS can restart allocating
+ * objects from this id + 1 and thus skip the whole orphan
+ * object id range
+ */
oa->o_id = last;
rc = 0;
}
- cfs_clear_bit(doa.o_gr, &filter->fo_destroys_in_progress);
+ cfs_clear_bit(doa.o_seq, &filter->fo_destroys_in_progress);
RETURN(rc);
}
static int filter_precreate(struct obd_device *obd, struct obdo *oa,
- obd_gr group, int *num);
+ obd_seq group, int *num);
/* returns a negative error or a nonnegative number of files to create */
static int filter_handle_precreate(struct obd_export *exp, struct obdo *oa,
- obd_gr group, struct obd_trans_info *oti)
+ obd_seq group, struct obd_trans_info *oti)
{
struct obd_device *obd = exp->exp_obd;
struct filter_obd *filter = &obd->u.filter;
GOTO(out, rc = 0);
}
/* only precreate if group == 0 and o_id is specfied */
- if (!filter_group_is_mds(group) || oa->o_id == 0)
+ if (!fid_seq_is_mdt(group) || oa->o_id == 0)
diff = 1;
else
diff = oa->o_id - filter_last_id(filter, group);
oa->o_id = filter_last_id(&obd->u.filter, group);
rc = filter_precreate(obd, oa, group, &diff);
oa->o_id = filter_last_id(&obd->u.filter, group);
- oa->o_gr = group;
+ oa->o_seq = group;
oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP;
GOTO(out, rc);
}
filter->fo_tot_pending,
osfs->os_bfree << blockbits, osfs->os_bavail << blockbits);
- filter_grant_sanity_check(obd, __FUNCTION__);
+ filter_grant_sanity_check(obd, __func__);
osfs->os_bavail -= min(osfs->os_bavail, GRANT_FOR_LLOG(obd) +
((filter->fo_tot_dirty + filter->fo_tot_pending +
* Caller must hold fo_create_locks[group]
*/
static int filter_precreate(struct obd_device *obd, struct obdo *oa,
- obd_gr group, int *num)
+ obd_seq group, int *num)
{
struct dentry *dchild = NULL, *dparent = NULL;
struct filter_obd *filter;
OBD_ALLOC(osfs, sizeof(*osfs));
if (osfs == NULL)
RETURN(-ENOMEM);
- rc = filter_statfs(obd, osfs, cfs_time_current_64() - CFS_HZ,
+ rc = filter_statfs(obd, osfs,
+ cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
0);
if (rc == 0 && osfs->os_bavail < (osfs->os_blocks >> 10)) {
CDEBUG(D_RPCTRACE,"%s: not enough space for create "
} else
next_id = filter_last_id(filter, group) + 1;
+ /* Temporary solution for oid in CMD before fid-on-OST */
+ if ((fid_seq_is_mdt0(oa->o_seq) && next_id >= IDIF_MAX_OID) &&
+ (fid_seq_is_cmd(oa->o_seq) && next_id >= OBIF_MAX_OID)) {
+ CERROR("%s:"POSTID" hit the max IDIF_MAX_OID(1<<48)!\n",
+ obd->obd_name, next_id, group);
+ GOTO(cleanup, rc = -ENOSPC);
+ }
+
dparent = filter_parent_lock(obd, group, next_id);
if (IS_ERR(dparent))
GOTO(cleanup, rc = PTR_ERR(dparent));
GOTO(cleanup, rc = PTR_ERR(handle));
cleanup_phase = 3;
- CDEBUG(D_INODE, "%s: filter_precreate(od->o_gr="LPU64
+ CDEBUG(D_INODE, "%s: filter_precreate(od->o_seq="LPU64
",od->o_id="LPU64")\n", obd->obd_name, group,
next_id);
if (rc)
break;
if (cfs_time_after(jiffies, enough_time)) {
+ i++;
CDEBUG(D_RPCTRACE,
"%s: precreate slow - want %d got %d \n",
obd->obd_name, *num, i);
*num = i;
CDEBUG(D_RPCTRACE,
- "%s: created %d objects for group "LPU64": "LPU64" rc %d\n",
- obd->obd_name, i, group, filter->fo_last_objids[group], rc);
+ "%s: created %d objects for group "POSTID" rc %d\n",
+ obd->obd_name, i, filter->fo_last_objids[group], group, rc);
RETURN(rc);
}
-static int filter_create(struct obd_export *exp, struct obdo *oa,
- struct lov_stripe_md **ea, struct obd_trans_info *oti)
+int filter_create(struct obd_export *exp, struct obdo *oa,
+ struct lov_stripe_md **ea, struct obd_trans_info *oti)
{
struct obd_device *obd = exp->exp_obd;
struct filter_export_data *fed;
struct filter_obd *filter;
struct lvfs_run_ctxt saved;
struct lov_stripe_md *lsm = NULL;
- int rc = 0, diff, group = oa->o_gr;
+ int rc = 0, diff;
ENTRY;
- CDEBUG(D_INODE, "%s: filter_create(od->o_gr="LPU64",od->o_id="
- LPU64")\n", obd->obd_name, oa->o_gr, oa->o_id);
-
- if (!(oa->o_valid & OBD_MD_FLGROUP)) {
- CERROR("!!! nid %s sent invalid object group %d\n",
- obd_export_nid2str(exp), group);
- RETURN(-EINVAL);
- }
+ CDEBUG(D_INODE, "%s: filter_create(group="LPU64",id="
+ LPU64")\n", obd->obd_name, oa->o_seq, oa->o_id);
fed = &exp->exp_filter_data;
filter = &obd->u.filter;
- if (fed->fed_group != group) {
- CERROR("!!! this export (nid %s) used object group %d "
- "earlier; now it's trying to use group %d! This could "
- "be a bug in the MDS. Please report to "
- "http://bugzilla.lustre.org/\n",
- obd_export_nid2str(exp), fed->fed_group, group);
+ if (fed->fed_group != oa->o_seq) {
+ CERROR("%s: this export (nid %s) used object group %d "
+ "earlier; now it's trying to use group "LPU64"!"
+ " This could be a bug in the MDS. Please report to "
+ "http://bugzilla.lustre.org/\n", obd->obd_name,
+ obd_export_nid2str(exp), fed->fed_group, oa->o_seq);
RETURN(-ENOTUNIQ);
}
if ((oa->o_valid & OBD_MD_FLFLAGS) &&
(oa->o_flags & OBD_FL_RECREATE_OBJS)) {
- if (oa->o_id > filter_last_id(filter, oa->o_gr)) {
+ if (!obd->obd_recovering ||
+ oa->o_id > filter_last_id(filter, oa->o_seq)) {
CERROR("recreate objid "LPU64" > last id "LPU64"\n",
- oa->o_id, filter_last_id(filter,
- oa->o_gr));
+ oa->o_id, filter_last_id(filter, oa->o_seq));
rc = -EINVAL;
} else {
diff = 1;
- cfs_down(&filter->fo_create_locks[oa->o_gr]);
- rc = filter_precreate(obd, oa, oa->o_gr, &diff);
- cfs_up(&filter->fo_create_locks[oa->o_gr]);
+ cfs_down(&filter->fo_create_locks[oa->o_seq]);
+ rc = filter_precreate(obd, oa, oa->o_seq, &diff);
+ cfs_up(&filter->fo_create_locks[oa->o_seq]);
}
} else {
- rc = filter_handle_precreate(exp, oa, oa->o_gr, oti);
+ rc = filter_handle_precreate(exp, oa, oa->o_seq, oti);
}
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
struct iattr iattr;
ENTRY;
- LASSERT(oa->o_valid & OBD_MD_FLGROUP);
- rc = filter_auth_capa(exp, NULL, oa->o_gr,
+ rc = filter_auth_capa(exp, NULL, oa->o_seq,
(struct lustre_capa *)capa, CAPA_OPC_OSS_DESTROY);
if (rc)
RETURN(rc);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
cleanup_phase = 1;
- CDEBUG(D_INODE, "%s: filter_destroy(od->o_gr="LPU64",od->o_id="
- LPU64")\n", obd->obd_name, oa->o_gr, oa->o_id);
+ CDEBUG(D_INODE, "%s: filter_destroy(group="LPU64",oid="
+ LPU64")\n", obd->obd_name, oa->o_seq, oa->o_id);
- dchild = filter_fid2dentry(obd, NULL, oa->o_gr, oa->o_id);
+ dchild = filter_fid2dentry(obd, NULL, oa->o_seq, oa->o_id);
if (IS_ERR(dchild))
GOTO(cleanup, rc = PTR_ERR(dchild));
cleanup_phase = 2;
if (dchild->d_inode == NULL) {
- CDEBUG(D_INODE, "destroying non-existent object "LPU64"\n",
- oa->o_id);
+ CDEBUG(D_INODE, "destroying non-existent object "POSTID"\n",
+ oa->o_id, oa->o_seq);
/* If object already gone, cancel cookie right now */
if (oa->o_valid & OBD_MD_FLCOOKIE) {
struct llog_ctxt *ctxt;
struct obd_llog_group *olg;
- olg = filter_find_olg(obd, oa->o_gr);
+ olg = filter_find_olg(obd, oa->o_seq);
if (!olg) {
CERROR(" %s: can not find olg of group %d\n",
- obd->obd_name, (int)oa->o_gr);
+ obd->obd_name, (int)oa->o_seq);
GOTO(cleanup, rc = PTR_ERR(olg));
}
fcc = &oa->o_lcookie;
GOTO(cleanup, rc = -ENOENT);
}
- rc = filter_prepare_destroy(obd, oa->o_id, oa->o_gr, &lockh);
+ rc = filter_prepare_destroy(obd, oa->o_id, oa->o_seq, &lockh);
if (rc)
GOTO(cleanup, rc);
* here, and not while truncating above. That avoids holding the
* parent lock for a long time during truncate, which can block other
* threads from doing anything to objects in that directory. bug 7171 */
- dparent = filter_parent_lock(obd, oa->o_gr, oa->o_id);
+ dparent = filter_parent_lock(obd, oa->o_seq, oa->o_id);
if (IS_ERR(dparent))
GOTO(cleanup, rc = PTR_ERR(dparent));
cleanup_phase = 3; /* filter_parent_unlock */
cleanup_phase = 4; /* fsfilt_commit */
/* Quota release need uid/gid of inode */
- obdo_from_inode(oa, dchild->d_inode, OBD_MD_FLUID|OBD_MD_FLGID);
+ obdo_from_inode(oa, dchild->d_inode, NULL, OBD_MD_FLUID|OBD_MD_FLGID);
- filter_fmd_drop(exp, oa->o_id, oa->o_gr);
+ filter_fmd_drop(exp, oa->o_id, oa->o_seq);
/* this drops dchild->d_inode->i_mutex unconditionally */
- rc = filter_destroy_internal(obd, oa->o_id, oa->o_gr, dparent, dchild);
+ rc = filter_destroy_internal(obd, oa->o_id, oa->o_seq, dparent, dchild);
EXIT;
cleanup:
}
CDEBUG(D_INODE, "calling truncate for object "LPU64", valid = "LPX64
- ", o_size = "LPD64"\n", oinfo->oi_oa->o_id,
- oinfo->oi_oa->o_valid, oinfo->oi_policy.l_extent.start);
+ ", o_size = "LPD64"\n", oinfo->oi_oa->o_id,oinfo->oi_oa->o_valid,
+ oinfo->oi_policy.l_extent.start);
oinfo->oi_oa->o_size = oinfo->oi_policy.l_extent.start;
oinfo->oi_oa->o_valid |= OBD_FL_TRUNC;
int rc, rc2;
ENTRY;
- LASSERT(oa->o_valid & OBD_MD_FLGROUP);
- rc = filter_auth_capa(exp, NULL, oa->o_gr,
+ rc = filter_auth_capa(exp, NULL, oa->o_seq,
(struct lustre_capa *)capa, CAPA_OPC_OSS_WRITE);
if (rc)
RETURN(rc);
RETURN(rc);
}
- dentry = filter_oa2dentry(exp->exp_obd, oa);
+ dentry = filter_oa2dentry(exp->exp_obd, &oa->o_oi);
if (IS_ERR(dentry))
RETURN(PTR_ERR(dentry));
UNLOCK_INODE_MUTEX(dentry->d_inode);
oa->o_valid = OBD_MD_FLID;
- obdo_from_inode(oa, dentry->d_inode, FILTER_VALID_FLAGS);
+ obdo_from_inode(oa, dentry->d_inode, NULL, FILTER_VALID_FLAGS);
pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
RETURN(0);
}
- dentry = __filter_oa2dentry(exp->exp_obd, &fm_key->oa,
- __FUNCTION__, 1);
+ dentry = __filter_oa2dentry(exp->exp_obd, &fm_key->oa.o_oi,
+ __func__, 1);
if (IS_ERR(dentry))
RETURN(PTR_ERR(dentry));
RETURN(rc);
}
+ if (KEY_IS(KEY_SYNC_LOCK_CANCEL)) {
+ *((__u32 *) val) = obd->u.filter.fo_sync_lock_cancel;
+ *vallen = sizeof(__u32);
+ RETURN(0);
+ }
+
CDEBUG(D_IOCTL, "invalid key\n");
RETURN(-EINVAL);
}
else
group = 0; /* default value */
- LASSERT_MDS_GROUP(group);
+ LASSERT_SEQ_IS_MDT(group);
rc = filter_setup_llog_group(exp, obd, group);
if (rc)
goto out;
- if (group == FILTER_GROUP_MDS0) {
+ if (group == FID_SEQ_OST_MDT0) {
/* setup llog group 1 for interop */
- filter_setup_llog_group(exp, obd, FILTER_GROUP_LLOG);
+ filter_setup_llog_group(exp, obd, FID_SEQ_LLOG);
}
lquota_setinfo(filter_quota_interface_ref, obd, exp);
int rc, i;
/** sanity check for group<->mdsno conversion */
- for (i = 0; i < 32; i++)
- LASSERT(objgrp_to_mdsno(mdt_to_obd_objgrp(i)) == i);
+ for (i = 0; i < MAX_MDT_COUNT; i++)
+ LASSERT(objseq_to_mdsno(mdt_to_obd_objseq(i)) == i);
lprocfs_filter_init_vars(&lvars);