X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-zfs%2Fosd_object.c;h=b50258559696056d57d57cbb91d2383bf0a908c0;hb=a95e9e1c4f845249f83498f9650aa9c49a0dca60;hp=97f954d1228b477c74932860d0af3f5a733513cd;hpb=a585b03a36e61b9039f87135e1542094ae0d6e28;p=fs%2Flustre-release.git diff --git a/lustre/osd-zfs/osd_object.c b/lustre/osd-zfs/osd_object.c index 97f954d..b502585 100644 --- a/lustre/osd-zfs/osd_object.c +++ b/lustre/osd-zfs/osd_object.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. */ /* @@ -42,14 +42,10 @@ * Author: Johann Lombardi */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_OSD #include #include -#include #include #include #include @@ -79,7 +75,7 @@ static struct lu_object_operations osd_lu_obj_ops; extern struct dt_body_operations osd_body_ops; static struct dt_object_operations osd_obj_otable_it_ops; -extern cfs_mem_cache_t *osd_object_kmem; +extern struct kmem_cache *osd_object_kmem; static void osd_object_sa_fini(struct osd_object *obj) @@ -290,7 +286,7 @@ struct lu_object *osd_object_alloc(const struct lu_env *env, { struct osd_object *mo; - OBD_SLAB_ALLOC_PTR_GFP(mo, osd_object_kmem, CFS_ALLOC_IO); + OBD_SLAB_ALLOC_PTR_GFP(mo, osd_object_kmem, GFP_NOFS); if (mo != NULL) { struct lu_object *l; @@ -343,12 +339,45 @@ int osd_object_init0(const struct lu_env *env, struct osd_object *obj) */ obj->oo_dt.do_lu.lo_header->loh_attr |= obj->oo_attr.la_mode & S_IFMT; - cfs_mb(); + smp_mb(); obj->oo_dt.do_lu.lo_header->loh_attr |= LOHA_EXISTS; RETURN(0); } +static int osd_check_lma(const struct lu_env *env, struct osd_object *obj) +{ + struct osd_thread_info *info = osd_oti_get(env); + struct lu_buf buf; + int rc; + struct lustre_mdt_attrs *lma; + ENTRY; + + CLASSERT(sizeof(info->oti_buf) >= sizeof(*lma)); + lma = (struct lustre_mdt_attrs *)info->oti_buf; + buf.lb_buf = lma; + buf.lb_len = sizeof(info->oti_buf); + + rc = osd_xattr_get(env, &obj->oo_dt, &buf, XATTR_NAME_LMA, BYPASS_CAPA); + if (rc > 0) { + rc = 0; + lustre_lma_swab(lma); + if (unlikely((lma->lma_incompat & ~LMA_INCOMPAT_SUPP) || + CFS_FAIL_CHECK(OBD_FAIL_OSD_LMA_INCOMPAT))) { + CWARN("%s: unsupported incompat LMA feature(s) %#x for " + "fid = "DFID"\n", osd_obj2dev(obj)->od_svname, + lma->lma_incompat & ~LMA_INCOMPAT_SUPP, + PFID(lu_object_fid(&obj->oo_dt.do_lu))); + rc = -EOPNOTSUPP; + } + } else if (rc == -ENODATA) { + /* haven't initialize LMA xattr */ + rc = 0; + } + + RETURN(rc); +} + /* * Concurrency: no concurrent access is possible that early in object * life-cycle. @@ -375,17 +404,24 @@ static int osd_object_init(const struct lu_env *env, struct lu_object *l, LASSERT(obj->oo_db == NULL); rc = __osd_obj2dbuf(env, osd->od_objset.os, oid, &obj->oo_db, osd_obj_tag); - if (rc == 0) { - LASSERT(obj->oo_db); - rc = osd_object_init0(env, obj); - } else { + if (rc != 0) { CERROR("%s: lookup "DFID"/"LPX64" failed: rc = %d\n", osd->od_svname, PFID(lu_object_fid(l)), oid, rc); + GOTO(out, rc); } + LASSERT(obj->oo_db); + rc = osd_object_init0(env, obj); + if (rc != 0) + GOTO(out, rc); + + rc = osd_check_lma(env, obj); + if (rc != 0) + GOTO(out, rc); } else if (rc == -ENOENT) { rc = 0; } LASSERT(osd_invariant(obj)); +out: RETURN(rc); } @@ -838,7 +874,10 @@ static int osd_declare_attr_set(const struct lu_env *env, oh = container_of0(handle, struct osd_thandle, ot_super); LASSERT(obj->oo_sa_hdl != NULL); + LASSERT(oh->ot_tx != NULL); dmu_tx_hold_sa(oh->ot_tx, obj->oo_sa_hdl, 0); + if (oh->ot_tx->tx_err != 0) + RETURN(-oh->ot_tx->tx_err); sa_object_size(obj->oo_sa_hdl, &blksize, &bspace); bspace = toqb(bspace * blksize); @@ -1022,7 +1061,7 @@ static int osd_attr_set(const struct lu_env *env, struct dt_object *dt, static void osd_ah_init(const struct lu_env *env, struct dt_allocation_hint *ah, struct dt_object *parent, struct dt_object *child, - cfs_umode_t child_mode) + umode_t child_mode) { LASSERT(ah); @@ -1187,10 +1226,6 @@ int __osd_object_create(const struct lu_env *env, udmu_objset_t *uos, int rc; LASSERT(tag); - spin_lock(&uos->lock); - uos->objects++; - spin_unlock(&uos->lock); - /* Assert that the transaction has been assigned to a transaction group. */ LASSERT(tx->tx_txg != 0); @@ -1199,14 +1234,24 @@ int __osd_object_create(const struct lu_env *env, udmu_objset_t *uos, oid = dmu_object_alloc(uos->os, DMU_OT_PLAIN_FILE_CONTENTS, 0, DMU_OT_SA, DN_MAX_BONUSLEN, tx); rc = -sa_buf_hold(uos->os, oid, tag, dbp); - if (rc) - return rc; + LASSERTF(rc == 0, "sa_buf_hold "LPU64" failed: %d\n", oid, rc); LASSERT(la->la_valid & LA_MODE); la->la_size = 0; la->la_nlink = 1; - return __osd_attr_init(env, uos, oid, tx, la, parent); + rc = __osd_attr_init(env, uos, oid, tx, la, parent); + if (rc != 0) { + sa_buf_rele(*dbp, tag); + *dbp = NULL; + dmu_object_free(uos->os, oid, tx); + return rc; + } + + spin_lock(&uos->lock); + uos->objects++; + spin_unlock(&uos->lock); + return 0; } /* @@ -1394,7 +1439,7 @@ static inline int osd_init_lma(const struct lu_env *env, struct osd_object *obj, struct lu_buf buf; int rc; - lustre_lma_init(lma, fid, 0); + lustre_lma_init(lma, fid, 0, 0); lustre_lma_swab(lma); buf.lb_buf = lma; buf.lb_len = sizeof(*lma); @@ -1452,7 +1497,7 @@ static int osd_object_create(const struct lu_env *env, struct dt_object *dt, db = osd_create_type_f(dof->dof_type)(env, osd, attr, zapid, oh); if (IS_ERR(db)) - GOTO(out, rc = PTR_ERR(th)); + GOTO(out, rc = PTR_ERR(db)); zde->zde_pad = 0; zde->zde_dnode = db->db_object; @@ -1712,13 +1757,16 @@ static struct obd_capa *osd_capa_get(const struct lu_env *env, RETURN(oc); } -static int osd_object_sync(const struct lu_env *env, struct dt_object *dt) +static int osd_object_sync(const struct lu_env *env, struct dt_object *dt, + __u64 start, __u64 end) { struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt)); ENTRY; /* XXX: no other option than syncing the whole filesystem until we - * support ZIL */ + * support ZIL. If the object tracked the txg that it was last + * modified in, it could pass that txg here instead of "0". Maybe + * the changes are already committed, so no wait is needed at all? */ txg_wait_synced(dmu_objset_pool(osd->od_objset.os), 0ULL); RETURN(0);