X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_oi.h;h=5ddf162b6da04a2574451c0ebd788fa28eb60b2c;hp=3f0b09f022ecd71c614e49869e77052dd897d2cf;hb=e0702769f267dd009a6287bbc9da2760079a101d;hpb=e992a95314f9d6721144d5521ebe795a72bb140a diff --git a/lustre/osd-ldiskfs/osd_oi.h b/lustre/osd-ldiskfs/osd_oi.h index 3f0b09f..5ddf162 100644 --- a/lustre/osd-ldiskfs/osd_oi.h +++ b/lustre/osd-ldiskfs/osd_oi.h @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,6 +26,8 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -53,58 +53,107 @@ /* struct rw_semaphore */ #include +#include #include #include +#define OSD_OI_FID_NR (1UL << OSD_OI_FID_OID_BITS) +#define OSD_OI_FID_NR_MAX (1UL << OSD_OI_FID_OID_BITS_MAX) + +#define OSD_OII_NOGEN (0) + struct lu_fid; struct osd_thread_info; struct lu_site; struct thandle; struct dt_device; - -enum { - OSD_OI_FID_16, - OSD_OI_FID_NR -}; - -/* - * Object Index (oi) instance. - */ -struct osd_oi { - /* - * underlying index object, where fid->id mapping in stored. - */ - struct dt_object *oi_dir; -}; +struct osd_device; +struct osd_oi; /* * Storage cookie. Datum uniquely identifying inode on the underlying file * system. * - * XXX Currently this is ext2/ext3/ldiskfs specific thing. In the future this - * should be generalized to work with other local file systems. + * osd_inode_id is the internal ldiskfs identifier for an object. It should + * not be visible outside of the osd-ldiskfs. Other OSDs may have different + * identifiers, so this cannot form any part of the OSD API. */ struct osd_inode_id { - __u32 oii_ino; /* inode number */ - __u32 oii_gen; /* inode generation */ + __u32 oii_ino; /* inode number */ + __u32 oii_gen; /* inode generation */ +}; + +struct osd_idmap_cache { + struct lu_fid oic_fid; + struct osd_inode_id oic_lid; + struct osd_device *oic_dev; +}; + +static inline void osd_id_pack(struct osd_inode_id *tgt, + const struct osd_inode_id *src) +{ + tgt->oii_ino = cpu_to_be32(src->oii_ino); + tgt->oii_gen = cpu_to_be32(src->oii_gen); +} + +static inline void osd_id_unpack(struct osd_inode_id *tgt, + struct osd_inode_id *src) +{ + tgt->oii_ino = be32_to_cpu(src->oii_ino); + tgt->oii_gen = be32_to_cpu(src->oii_gen); +} + +static inline void osd_id_gen(struct osd_inode_id *id, __u32 ino, __u32 gen) +{ + id->oii_ino = ino; + id->oii_gen = gen; +} + +static inline void osd_id_to_inode(struct inode *inode, + const struct osd_inode_id *id) +{ + inode->i_ino = id->oii_ino; + inode->i_generation = id->oii_gen; +} + +static inline int osd_id_eq(const struct osd_inode_id *id0, + const struct osd_inode_id *id1) +{ + return (id0->oii_ino == id1->oii_ino) && + (id0->oii_gen == id1->oii_gen || + id0->oii_gen == OSD_OII_NOGEN || + id1->oii_gen == OSD_OII_NOGEN); +} + +static inline int osd_id_eq_strict(const struct osd_inode_id *id0, + const struct osd_inode_id *id1) +{ + return (id0->oii_ino == id1->oii_ino && id0->oii_gen == id1->oii_gen); +} + +enum oi_check_flags { + OI_CHECK_FLD = 0x00000001, + OI_KNOWN_ON_OST = 0x00000002, }; int osd_oi_mod_init(void); -int osd_oi_init(struct osd_thread_info *info, - struct osd_oi *oi, - struct dt_device *dev, - struct md_device *mdev); -void osd_oi_fini(struct osd_thread_info *info, struct osd_oi *oi); - -int osd_oi_lookup(struct osd_thread_info *info, struct osd_oi *oi, - const struct lu_fid *fid, struct osd_inode_id *id); -int osd_oi_insert(struct osd_thread_info *info, struct osd_oi *oi, - const struct lu_fid *fid, const struct osd_inode_id *id, - struct thandle *th, int ingore_quota); +int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd); +void osd_oi_fini(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, + enum oi_check_flags flags); +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); int osd_oi_delete(struct osd_thread_info *info, - struct osd_oi *oi, const struct lu_fid *fid, - struct thandle *th); + struct osd_device *osd, const struct lu_fid *fid, + struct thandle *th, enum oi_check_flags flags); +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); +int fid_is_on_ost(struct osd_thread_info *info, struct osd_device *osd, + const struct lu_fid *fid, enum oi_check_flags flags); #endif /* __KERNEL__ */ #endif /* _OSD_OI_H */