X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_oi.c;h=bb3efa47b034f570917139a53e2c709b905bf7ba;hp=d24ec3313fd6a9e23651abb831b6afddd335c6fe;hb=f4ea7b630b8adc9856ee67c6d16549f36e14efd1;hpb=6e7b7f67c9d382a5e543199d1bf9cf277e99ea03 diff --git a/lustre/osd-ldiskfs/osd_oi.c b/lustre/osd-ldiskfs/osd_oi.c index d24ec33..bb3efa4 100644 --- a/lustre/osd-ldiskfs/osd_oi.c +++ b/lustre/osd-ldiskfs/osd_oi.c @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, Whamcloud, Inc. + * Copyright (c) 2011, 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -69,7 +69,6 @@ #include "osd_oi.h" /* osd_lookup(), struct osd_thread_info */ #include "osd_internal.h" -#include "osd_igif.h" #include "osd_scrub.h" static unsigned int osd_oi_count = OSD_OI_FID_NR; @@ -78,7 +77,7 @@ CFS_MODULE_PARM(osd_oi_count, "i", int, 0444, "it's only valid for new filesystem."); /** to serialize concurrent OI index initialization */ -static cfs_mutex_t oi_init_lock; +static struct mutex oi_init_lock; static struct dt_index_features oi_feat = { .dif_flags = DT_IND_UPDATE, @@ -238,6 +237,7 @@ static int osd_oi_open(struct osd_thread_info *info, struct osd_device *osd, if (IS_ERR(inode)) RETURN(PTR_ERR(inode)); + ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NO_OI); OBD_ALLOC_PTR(oi); if (oi == NULL) GOTO(out_inode, rc = -ENOMEM); @@ -350,7 +350,7 @@ int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd) if (oi == NULL) RETURN(-ENOMEM); - cfs_mutex_lock(&oi_init_lock); + mutex_lock(&oi_init_lock); /* try to open existing multiple OIs first */ rc = osd_oi_table_open(info, osd, oi, sf->sf_oi_count, false); if (rc < 0) @@ -413,12 +413,15 @@ out: rc = 0; } - cfs_mutex_unlock(&oi_init_lock); + mutex_unlock(&oi_init_lock); return rc; } void osd_oi_fini(struct osd_thread_info *info, struct osd_device *osd) { + if (unlikely(osd->od_oi_table == NULL)) + return; + osd_oi_table_put(info, osd->od_oi_table, osd->od_oi_count); OBD_FREE(osd->od_oi_table, @@ -439,7 +442,6 @@ static int osd_oi_iam_lookup(struct osd_thread_info *oti, { struct iam_container *bag; struct iam_iterator *it = &oti->oti_idx_it; - struct iam_rec *iam_rec; struct iam_path_descr *ipd; int rc; ENTRY; @@ -456,17 +458,8 @@ static int osd_oi_iam_lookup(struct osd_thread_info *oti, iam_it_init(it, bag, 0, ipd); rc = iam_it_get(it, (struct iam_key *)key); - if (rc >= 0) { - if (S_ISDIR(oi->oi_inode->i_mode)) - iam_rec = (struct iam_rec *)oti->oti_ldp; - else - iam_rec = (struct iam_rec *)rec; - - iam_reccpy(&it->ii_path.ip_leaf, (struct iam_rec *)iam_rec); - if (S_ISDIR(oi->oi_inode->i_mode)) - osd_fid_unpack((struct lu_fid *)rec, - (struct osd_fid_pack *)iam_rec); - } + if (rc > 0) + iam_reccpy(&it->ii_path.ip_leaf, (struct iam_rec *)rec); iam_it_put(it); iam_it_fini(it); osd_ipd_put(oti->oti_env, bag, ipd); @@ -476,6 +469,32 @@ static int osd_oi_iam_lookup(struct osd_thread_info *oti, RETURN(rc); } +int fid_is_on_ost(struct osd_thread_info *info, struct osd_device *osd, + const struct lu_fid *fid) +{ + struct lu_seq_range *range = &info->oti_seq_range; + int rc; + ENTRY; + + if (fid_is_idif(fid) || fid_is_last_id(fid)) + RETURN(1); + + rc = osd_fld_lookup(info->oti_env, osd, fid, range); + if (rc != 0) { + CERROR("%s: Can not lookup fld for "DFID"\n", + osd2lu_dev(osd)->ld_obd->obd_name, PFID(fid)); + RETURN(rc); + } + + CDEBUG(D_INFO, "fid "DFID" range "DRANGE"\n", PFID(fid), + PRANGE(range)); + + if (range->lsr_flags == LU_SEQ_RANGE_OST) + RETURN(1); + + RETURN(0); +} + int __osd_oi_lookup(struct osd_thread_info *info, struct osd_device *osd, const struct lu_fid *fid, struct osd_inode_id *id) { @@ -495,28 +514,32 @@ int __osd_oi_lookup(struct osd_thread_info *info, struct osd_device *osd, } int osd_oi_lookup(struct osd_thread_info *info, struct osd_device *osd, - const struct lu_fid *fid, struct osd_inode_id *id) + const struct lu_fid *fid, struct osd_inode_id *id, + bool check_fld) { - int rc = 0; - - if (fid_is_idif(fid) || fid_seq(fid) == FID_SEQ_LLOG) { - /* old OSD obj id */ - rc = osd_compat_objid_lookup(info, osd, fid, id); - } else if (fid_is_igif(fid)) { - lu_igif_to_id(fid, id); - } else if (fid_is_fs_root(fid)) { + int rc = 0; + + if ((!fid_is_last_id(fid) && check_fld && + fid_is_on_ost(info, osd, fid)) || + fid_is_llog(fid)) { + /* old OSD obj id */ + /* FIXME: actually for all of the OST object */ + rc = osd_obj_map_lookup(info, osd, fid, id); + } else if (fid_is_igif(fid)) { + osd_id_gen(id, lu_igif_ino(fid), lu_igif_gen(fid)); + } else if (fid_is_fs_root(fid)) { osd_id_gen(id, osd_sb(osd)->s_root->d_inode->i_ino, osd_sb(osd)->s_root->d_inode->i_generation); } else { if (unlikely(fid_is_acct(fid))) return osd_acct_obj_lookup(info, osd, fid, id); - - if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE)) - return osd_compat_spec_lookup(info, osd, fid, id); + else if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE) || + fid_is_last_id(fid)) + return osd_obj_spec_lookup(info, osd, fid, id); rc = __osd_oi_lookup(info, osd, fid, id); - } - return rc; + } + return rc; } static int osd_oi_iam_insert(struct osd_thread_info *oti, struct osd_oi *oi, @@ -564,12 +587,14 @@ int osd_oi_insert(struct osd_thread_info *info, struct osd_device *osd, if (fid_is_igif(fid) || unlikely(fid_seq(fid) == FID_SEQ_DOT_LUSTRE)) return 0; - if (fid_is_idif(fid) || fid_seq(fid) == FID_SEQ_LLOG) - return osd_compat_objid_insert(info, osd, fid, id, th); + if ((fid_is_on_ost(info, osd, fid) && !fid_is_last_id(fid)) || + fid_is_llog(fid)) + return osd_obj_map_insert(info, osd, fid, id, th); /* Server mount should not depends on OI files */ - if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE)) - return osd_compat_spec_insert(info, osd, fid, id, th); + if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE) || + fid_is_last_id(fid)) + return osd_obj_spec_insert(info, osd, fid, id, th); fid_cpu_to_be(oi_fid, fid); osd_id_pack(oi_id, id); @@ -612,13 +637,13 @@ int osd_oi_delete(struct osd_thread_info *info, { struct lu_fid *oi_fid = &info->oti_fid2; - if (fid_is_igif(fid)) + if (fid_is_igif(fid) || fid_is_last_id(fid)) return 0; LASSERT(fid_seq(fid) != FID_SEQ_LOCAL_FILE); - if (fid_is_idif(fid) || fid_seq(fid) == FID_SEQ_LLOG) - return osd_compat_objid_delete(info, osd, fid, th); + if (fid_is_on_ost(info, osd, fid) || fid_is_llog(fid)) + return osd_obj_map_delete(info, osd, fid, th); fid_cpu_to_be(oi_fid, fid); return osd_oi_iam_delete(info, osd_fid2oi(osd, fid), @@ -636,6 +661,6 @@ int osd_oi_mod_init(void) osd_oi_count = size_roundup_power2(osd_oi_count); } - cfs_mutex_init(&oi_init_lock); + mutex_init(&oi_init_lock); return 0; }