X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_oi.c;h=a6fed15322fb6e3c48df7fa1ccfa69d358745747;hb=85c6c099d83b19480dd4160de57e7ffac5b312af;hp=4a9a513bb2062561d1d26f76bc667302556be509;hpb=9bd7e40d2934cd0162eeff5388f054444a982ac9;p=fs%2Flustre-release.git diff --git a/lustre/osd-ldiskfs/osd_oi.c b/lustre/osd-ldiskfs/osd_oi.c index 4a9a513..a6fed15 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, 2013, Intel Corporation. + * Copyright (c) 2012, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,7 +40,7 @@ * Author: Nikita Danilov */ -#define DEBUG_SUBSYSTEM S_MDS +#define DEBUG_SUBSYSTEM S_OSD #include @@ -139,6 +139,9 @@ static int osd_oi_index_create_one(struct osd_thread_info *info, return PTR_ERR(inode); } + ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NOSCRUB); + unlock_new_inode(inode); + if (feat->dif_flags & DT_IND_VARKEY) rc = iam_lvar_create(inode, feat->dif_keysize_max, feat->dif_ptrsize, feat->dif_recsize_max, @@ -228,7 +231,6 @@ 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); /* 'What the @fid is' is not imporatant, because these objects * have no OI mappings, and only are visible inside the OSD.*/ lu_igif_build(&info->oti_fid, inode->i_ino, inode->i_generation); @@ -368,6 +370,7 @@ int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd) /* if previous failed then try found single OI from old filesystem */ rc = osd_oi_open(info, osd, OSD_OI_NAME_BASE, &oi[0], false); if (rc == 0) { /* found single OI from old filesystem */ + ldiskfs_clear_bit(0, sf->sf_oi_bitmap); if (sf->sf_success_count == 0) /* XXX: There is one corner case that if the OI_scrub * file crashed or lost and we regard it upgrade, @@ -493,6 +496,8 @@ static int osd_oi_iam_lookup(struct osd_thread_info *oti, int fid_is_on_ost(struct osd_thread_info *info, struct osd_device *osd, const struct lu_fid *fid, enum oi_check_flags flags) { + struct lu_seq_range *range = &info->oti_seq_range; + int rc; ENTRY; if (flags & OI_KNOWN_ON_OST) @@ -509,7 +514,18 @@ int fid_is_on_ost(struct osd_thread_info *info, struct osd_device *osd, if (!(flags & OI_CHECK_FLD)) RETURN(0); - if (osd->od_is_ost) + if (osd_seq_site(osd)->ss_server_fld == NULL) + RETURN(0); + + rc = osd_fld_lookup(info->oti_env, osd, fid_seq(fid), range); + if (rc != 0) { + if (rc != -ENOENT) + CERROR("%s: lookup FLD "DFID": rc = %d\n", + osd_name(osd), PFID(fid), rc); + RETURN(0); + } + + if (fld_range_is_ost(range)) RETURN(1); RETURN(0); @@ -543,14 +559,23 @@ int osd_oi_lookup(struct osd_thread_info *info, struct osd_device *osd, if (fid_is_on_ost(info, osd, fid, flags) || fid_is_llog(fid)) return osd_obj_map_lookup(info, osd, fid, id); - 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); - return 0; - } - if (unlikely(fid_is_acct(fid))) - return osd_acct_obj_lookup(info, osd, fid, id); + if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE)) { + int rc; + 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); + return 0; + } + if (unlikely(fid_is_acct(fid))) + return osd_acct_obj_lookup(info, osd, fid, id); + + /* For other special FIDs, try OI first, then do spec lookup */ + rc = __osd_oi_lookup(info, osd, fid, id); + if (rc == -ENOENT) + return osd_obj_spec_lookup(info, osd, fid, id); + return rc; + } if (!osd->od_igif_inoi && fid_is_igif(fid)) { osd_id_gen(id, lu_igif_ino(fid), lu_igif_gen(fid)); @@ -562,11 +587,10 @@ int osd_oi_lookup(struct osd_thread_info *info, struct osd_device *osd, static int osd_oi_iam_refresh(struct osd_thread_info *oti, struct osd_oi *oi, const struct dt_rec *rec, const struct dt_key *key, - struct thandle *th, bool insert) + handle_t *th, bool insert) { struct iam_container *bag; struct iam_path_descr *ipd; - struct osd_thandle *oh; int rc; ENTRY; @@ -579,14 +603,13 @@ static int osd_oi_iam_refresh(struct osd_thread_info *oti, struct osd_oi *oi, if (unlikely(ipd == NULL)) RETURN(-ENOMEM); - oh = container_of0(th, struct osd_thandle, ot_super); - LASSERT(oh->ot_handle != NULL); - LASSERT(oh->ot_handle->h_transaction != NULL); + LASSERT(th != NULL); + LASSERT(th->h_transaction != NULL); if (insert) - rc = iam_insert(oh->ot_handle, bag, (const struct iam_key *)key, + rc = iam_insert(th, bag, (const struct iam_key *)key, (const struct iam_rec *)rec, ipd); else - rc = iam_update(oh->ot_handle, bag, (const struct iam_key *)key, + rc = iam_update(th, bag, (const struct iam_key *)key, (const struct iam_rec *)rec, ipd); osd_ipd_put(oti->oti_env, bag, ipd); LINVRNT(osd_invariant(obj)); @@ -595,7 +618,7 @@ static int osd_oi_iam_refresh(struct osd_thread_info *oti, struct osd_oi *oi, int osd_oi_insert(struct osd_thread_info *info, struct osd_device *osd, const struct lu_fid *fid, const struct osd_inode_id *id, - struct thandle *th, enum oi_check_flags flags) + handle_t *th, enum oi_check_flags flags) { struct lu_fid *oi_fid = &info->oti_fid2; struct osd_inode_id *oi_id = &info->oti_id2; @@ -668,36 +691,34 @@ update: } static int osd_oi_iam_delete(struct osd_thread_info *oti, struct osd_oi *oi, - const struct dt_key *key, struct thandle *handle) + const struct dt_key *key, handle_t *th) { - struct iam_container *bag; - struct iam_path_descr *ipd; - struct osd_thandle *oh; - int rc; - ENTRY; + struct iam_container *bag; + struct iam_path_descr *ipd; + int rc; + ENTRY; - LASSERT(oi); + LASSERT(oi); LASSERT(oi->oi_inode); ll_vfs_dq_init(oi->oi_inode); - bag = &oi->oi_dir.od_container; - ipd = osd_idx_ipd_get(oti->oti_env, bag); - if (unlikely(ipd == NULL)) - RETURN(-ENOMEM); + bag = &oi->oi_dir.od_container; + ipd = osd_idx_ipd_get(oti->oti_env, bag); + if (unlikely(ipd == NULL)) + RETURN(-ENOMEM); - oh = container_of0(handle, struct osd_thandle, ot_super); - LASSERT(oh->ot_handle != NULL); - LASSERT(oh->ot_handle->h_transaction != NULL); + LASSERT(th != NULL); + LASSERT(th->h_transaction != NULL); - rc = iam_delete(oh->ot_handle, bag, (const struct iam_key *)key, ipd); - osd_ipd_put(oti->oti_env, bag, ipd); - LINVRNT(osd_invariant(obj)); - RETURN(rc); + rc = iam_delete(th, bag, (const struct iam_key *)key, ipd); + osd_ipd_put(oti->oti_env, bag, ipd); + LINVRNT(osd_invariant(obj)); + RETURN(rc); } int osd_oi_delete(struct osd_thread_info *info, struct osd_device *osd, const struct lu_fid *fid, - struct thandle *th, enum oi_check_flags flags) + handle_t *th, enum oi_check_flags flags) { struct lu_fid *oi_fid = &info->oti_fid2; @@ -718,7 +739,7 @@ int osd_oi_delete(struct osd_thread_info *info, int osd_oi_update(struct osd_thread_info *info, struct osd_device *osd, const struct lu_fid *fid, const struct osd_inode_id *id, - struct thandle *th, enum oi_check_flags flags) + handle_t *th, enum oi_check_flags flags) { struct lu_fid *oi_fid = &info->oti_fid2; struct osd_inode_id *oi_id = &info->oti_id2;