X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-zfs%2Fosd_oi.c;h=4acbd0d67340851017c9300689fa57371daf3714;hb=00260466f9c84f21e6db55d5dd6e87e8a9906438;hp=e059cf7e26b7819128245b28e1924b978ce8f7df;hpb=ec0c7b569d5a2f25c8ea80f515d2bdc853abc7df;p=fs%2Flustre-release.git diff --git a/lustre/osd-zfs/osd_oi.c b/lustre/osd-zfs/osd_oi.c index e059cf7..4acbd0d6 100644 --- a/lustre/osd-zfs/osd_oi.c +++ b/lustre/osd-zfs/osd_oi.c @@ -28,7 +28,7 @@ * Use is subject to license terms. */ /* - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2013, Intel Corporation. * Use is subject to license terms. */ /* @@ -43,9 +43,6 @@ * Author: Di Wang */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_OSD #include @@ -96,13 +93,11 @@ static const struct named_oid oids[] = { { MGS_CONFIGS_OID, NULL /*MOUNT_CONFIGS_DIR*/ }, { FID_SEQ_SRV_OID, "seq_srv" }, { FID_SEQ_CTL_OID, "seq_ctl" }, - { MDD_CAPA_KEYS_OID, NULL /*CAPA_KEYS*/ }, { FLD_INDEX_OID, "fld" }, { MDD_LOV_OBJ_OID, LOV_OBJID }, { OFD_HEALTH_CHECK_OID, HEALTH_CHECK }, { ACCT_USER_OID, "acct_usr_inode" }, { ACCT_GROUP_OID, "acct_grp_inode" }, - { MDD_ORPHAN_OID, NULL }, { 0, NULL } }; @@ -213,18 +208,17 @@ osd_oi_find_or_create(const struct lu_env *env, struct osd_device *o, * the object is located (tgt index) and it is MDT or OST object. */ int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd, - const struct lu_fid *fid, struct lu_seq_range *range) + obd_seq seq, struct lu_seq_range *range) { struct seq_server_site *ss = osd_seq_site(osd); - int rc; - if (fid_is_idif(fid)) { + if (fid_seq_is_idif(seq)) { fld_range_set_ost(range); - range->lsr_index = fid_idif_ost_idx(fid); + range->lsr_index = idif_ost_idx(seq); return 0; } - if (!fid_seq_in_fldb(fid_seq(fid))) { + if (!fid_seq_in_fldb(seq)) { fld_range_set_mdt(range); if (ss != NULL) /* FIXME: If ss is NULL, it suppose not get lsr_index @@ -235,33 +229,32 @@ int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd, LASSERT(ss != NULL); fld_range_set_any(range); - rc = fld_server_lookup(env, ss->ss_server_fld, fid_seq(fid), range); - if (rc != 0) - CERROR("%s: cannot find FLD range for "DFID": rc = %d\n", - osd_name(osd), PFID(fid), rc); - return rc; + /* OSD will only do local fld lookup */ + return fld_local_lookup(env, ss->ss_server_fld, seq, range); } int fid_is_on_ost(const struct lu_env *env, struct osd_device *osd, const struct lu_fid *fid) { - struct lu_seq_range *range = &osd_oti_get(env)->oti_seq_range; - int rc; + struct lu_seq_range *range = &osd_oti_get(env)->oti_seq_range; + int rc; ENTRY; if (fid_is_idif(fid)) RETURN(1); - rc = osd_fld_lookup(env, osd, fid, range); + if (unlikely(fid_is_local_file(fid) || fid_is_llog(fid)) || + fid_is_name_llog(fid) || fid_is_quota(fid)) + RETURN(0); + + rc = osd_fld_lookup(env, osd, fid_seq(fid), range); if (rc != 0) { - CERROR("%s: Can not lookup fld for "DFID"\n", - osd_name(osd), PFID(fid)); - RETURN(rc); + if (rc != -ENOENT) + CERROR("%s: "DFID" lookup failed: rc = %d\n", + osd_name(osd), PFID(fid), rc); + RETURN(0); } - CDEBUG(D_INFO, "fid "DFID" range "DRANGE"\n", PFID(fid), - PRANGE(range)); - if (fld_range_is_ost(range)) RETURN(1); @@ -331,12 +324,7 @@ static struct osd_seq *osd_find_or_add_seq(const struct lu_env *env, if (osd_seq->os_compat_dirs == NULL) GOTO(out, rc = -ENOMEM); - rc = osd_oi_lookup(env, osd, osd->od_root, "O", &oi); - if (rc != 0) { - CERROR("%s: Can not find O: rc = %d\n", osd_name(osd), rc); - GOTO(out, rc); - } - + oi.oi_zapid = osd->od_O_id; sprintf(seq_name, (fid_seq_is_rsvd(seq) || fid_seq_is_mdt0(seq)) ? LPU64 : LPX64i, fid_seq_is_idif(seq) ? 0 : seq); @@ -352,7 +340,7 @@ static struct osd_seq *osd_find_or_add_seq(const struct lu_env *env, sprintf(key, "d%d", i); rc = osd_oi_find_or_create(env, osd, odb, key, &sdb); if (rc) - GOTO(out, osd_seq = ERR_PTR(rc)); + GOTO(out, rc); osd_seq->os_compat_dirs[i] = sdb; } @@ -383,6 +371,7 @@ osd_get_idx_for_ost_obj(const struct lu_env *env, struct osd_device *osd, { struct osd_seq *osd_seq; unsigned long b; + obd_id id; int rc; osd_seq = osd_find_or_add_seq(env, osd, fid_seq(fid)); @@ -392,12 +381,18 @@ osd_get_idx_for_ost_obj(const struct lu_env *env, struct osd_device *osd, return PTR_ERR(osd_seq); } - rc = fid_to_ostid(fid, &osd_oti_get(env)->oti_ostid); - LASSERT(rc == 0); /* we should not get here with IGIF */ - b = ostid_id(&osd_oti_get(env)->oti_ostid) % OSD_OST_MAP_SIZE; + if (fid_is_last_id(fid)) { + id = 0; + } else { + rc = fid_to_ostid(fid, &osd_oti_get(env)->oti_ostid); + LASSERT(rc == 0); /* we should not get here with IGIF */ + id = ostid_id(&osd_oti_get(env)->oti_ostid); + } + + b = id % OSD_OST_MAP_SIZE; LASSERT(osd_seq->os_compat_dirs[b]); - sprintf(buf, LPU64, ostid_id(&osd_oti_get(env)->oti_ostid)); + sprintf(buf, LPU64, id); return osd_seq->os_compat_dirs[b]; } @@ -660,6 +655,8 @@ osd_oi_init_compat(const struct lu_env *env, struct osd_device *o) if (rc) RETURN(rc); + o->od_O_id = sdb; + osd_ost_seq_init(env, o); /* Create on-disk indexes to maintain per-UID/GID inode usage. * Those new indexes are created in the top-level ZAP outside the