- fixes in split code, after allocating fid in new seq, caller should also setup FLD for it.
#include "mdc_internal.h"
static int cmm_fld_lookup(struct cmm_device *cm,
- const struct lu_fid *fid, mdsno_t *mds)
+ const struct lu_fid *fid, mdsno_t *mds,
+ const struct lu_context *ctx)
{
struct lu_site *ls;
int rc = 0;
ls = cm->cmm_md_dev.md_lu_dev.ld_site;
rc = fld_client_lookup(ls->ls_client_fld,
- fid_seq(fid), mds);
+ fid_seq(fid), mds, ctx);
if (rc) {
CERROR("can't find mds by seq "LPX64", rc %d\n",
fid_seq(fid), rc);
cd = lu2cmm_dev(ld);
if (cd->cmm_flags & CMM_INITIALIZED) {
/* get object location */
- rc = cmm_fld_lookup(lu2cmm_dev(ld), fid, &mdsnum);
+ rc = cmm_fld_lookup(lu2cmm_dev(ld), fid, &mdsnum, ctx);
if (rc)
RETURN(NULL);
} else
LASSERT(cmm->cmm_local_num != mc->mc_num);
rc = obd_fid_alloc(mc->mc_desc.cl_exp, &fid[i++], NULL);
+ if (rc > 0) {
+ struct lu_site *ls;
+
+ ls = cmm->cmm_md_dev.md_lu_dev.ld_site;
+ rc = fld_client_create(ls->ls_client_fld,
+ fid_seq(&fid[i]),
+ mc->mc_num, ctx);
+ }
if (rc < 0) {
spin_unlock(&cmm->cmm_tgt_guard);
RETURN(rc);
RETURN(PTR_ERR(obj));
for (i = 0; i < rdpg->rp_npages; i++) {
- rc = mdc_send_page(ctx, md_object_next(&obj->cmo_obj),
+ rc = mdc_send_page(cmm, ctx, md_object_next(&obj->cmo_obj),
rdpg->rp_pages[i], hash_end);
if (rc)
break;
}
#ifdef HAVE_SPLIT_SUPPORT
-int mdc_send_page(const struct lu_context *ctx, struct md_object *mo,
- struct page *page, __u32 end)
+int mdc_send_page(struct cmm_device *cm, const struct lu_context *ctx,
+ struct md_object *mo, struct page *page, __u32 end)
{
struct mdc_device *mc = md2mdc_dev(md_obj2dev(mo));
struct lu_dirpage *dp;
kmap(page);
dp = page_address(page);
for (ent = lu_dirent_start(dp); ent != NULL;
- ent = lu_dirent_next(ent)) {
+ ent = lu_dirent_next(ent)) {
if (ent->lde_hash < end) {
offset = (int)((__u32)ent - (__u32)dp);
rc1 = -E2BIG;
/* allocate new fid for each obj */
rc = obd_fid_alloc(mc->mc_desc.cl_exp, &ent->lde_fid, NULL);
- if (rc) {
+ if (rc > 0) {
+ struct lu_site *ls;
+
+ ls = cm->cmm_md_dev.md_lu_dev.ld_site;
+ rc = fld_client_create(ls->ls_client_fld,
+ fid_seq(&ent->lde_fid),
+ mc->mc_num, ctx);
+ }
+
+ if (rc < 0) {
kunmap(page);
RETURN(rc);
}
#define FLD_CACHE_THRESHOLD 10
int fld_client_init(struct lu_client_fld *fld,
- const char *prefix, int hash,
- const struct lu_context *ctx)
+ const char *prefix, int hash)
{
#ifdef __KERNEL__
int cache_size, cache_threshold;
}
fld->lcf_count = 0;
- fld->lcf_ctx = ctx;
spin_lock_init(&fld->lcf_lock);
fld->lcf_hash = &fld_hash[hash];
INIT_LIST_HEAD(&fld->lcf_targets);
}
int fld_client_create(struct lu_client_fld *fld,
- seqno_t seq, mdsno_t mds)
+ seqno_t seq, mdsno_t mds,
+ const struct lu_context *ctx)
{
struct md_fld md_fld = { .mf_seq = seq, .mf_mds = mds };
struct lu_fld_target *target;
#ifdef __KERNEL__
if (target->ft_srv != NULL) {
- LASSERT(fld->lcf_ctx != NULL);
+ LASSERT(ctx != NULL);
rc = fld_server_create(target->ft_srv,
- fld->lcf_ctx,
- seq, mds);
+ ctx, seq, mds);
} else {
#endif
rc = fld_client_rpc(target->ft_exp,
}
EXPORT_SYMBOL(fld_client_create);
-int fld_client_delete(struct lu_client_fld *fld,
- seqno_t seq)
+int fld_client_delete(struct lu_client_fld *fld, seqno_t seq,
+ const struct lu_context *ctx)
{
struct md_fld md_fld = { .mf_seq = seq, .mf_mds = 0 };
struct lu_fld_target *target;
#ifdef __KERNEL__
if (target->ft_srv != NULL) {
- LASSERT(fld->lcf_ctx != NULL);
+ LASSERT(ctx != NULL);
rc = fld_server_delete(target->ft_srv,
- fld->lcf_ctx,
- seq);
+ ctx, seq);
} else {
#endif
rc = fld_client_rpc(target->ft_exp,
EXPORT_SYMBOL(fld_client_delete);
int fld_client_lookup(struct lu_client_fld *fld,
- seqno_t seq, mdsno_t *mds)
+ seqno_t seq, mdsno_t *mds,
+ const struct lu_context *ctx)
{
struct md_fld md_fld = { .mf_seq = seq, .mf_mds = 0 };
struct lu_fld_target *target;
#ifdef __KERNEL__
if (target->ft_srv != NULL) {
- LASSERT(fld->lcf_ctx != NULL);
+ LASSERT(ctx != NULL);
rc = fld_server_lookup(target->ft_srv,
- fld->lcf_ctx,
- seq, mds);
+ ctx, seq, mds);
} else {
#endif
rc = fld_client_rpc(target->ft_exp,
/* Client methods */
int fld_client_init(struct lu_client_fld *fld,
- const char *prefix, int hash,
- const struct lu_context *ctx);
+ const char *prefix, int hash);
void fld_client_fini(struct lu_client_fld *fld);
int fld_client_lookup(struct lu_client_fld *fld,
- seqno_t seq, mdsno_t *mds);
+ seqno_t seq, mdsno_t *mds,
+ const struct lu_context *ctx);
int fld_client_create(struct lu_client_fld *fld,
- seqno_t seq, mdsno_t mds);
+ seqno_t seq, mdsno_t mds,
+ const struct lu_context *ctx);
int fld_client_delete(struct lu_client_fld *fld,
- seqno_t seq);
+ seqno_t seq,
+ const struct lu_context *ctx);
int fld_client_add_target(struct lu_client_fld *fld,
struct lu_fld_target *tar);
ENTRY;
LASSERT(fid_is_sane(fid));
- rc = fld_client_lookup(&lmv->lmv_fld, fid_seq(fid), mds);
+ rc = fld_client_lookup(&lmv->lmv_fld, fid_seq(fid), mds, NULL);
if (rc) {
CERROR("error while looking for mds number. Seq "LPU64
", rc %d\n", fid_seq(fid), rc);
LASSERT(fid_is_sane(fid));
rc = fld_client_create(&lmv->lmv_fld, fid_seq(fid),
- mds);
+ mds, NULL);
if (rc) {
CERROR("can't create fld entry, rc %d\n", rc);
RETURN(rc);
}
#endif
rc = fld_client_init(&lmv->lmv_fld, obd->obd_name,
- LUSTRE_CLI_FLD_HASH_DHT, NULL);
+ LUSTRE_CLI_FLD_HASH_DHT);
if (rc) {
CERROR("can't init FLD, err %d\n",
rc);
GOTO(out_fld_fini, rc = -ENOMEM);
rc = fld_client_init(ls->ls_client_fld, uuid,
- LUSTRE_CLI_FLD_HASH_DHT,
- ctx);
+ LUSTRE_CLI_FLD_HASH_DHT);
if (rc) {
CERROR("can't init FLD, err %d\n", rc);
OBD_FREE_PTR(ls->ls_client_fld);