X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_oi.h;h=e27841198db7f1590b266944c5a2d31db1fa228c;hb=e5116ab831c6b7c87594c52d9bdb5a786b35b956;hp=287ede3ecd5532a49b3d83a05547dd465a9cd3c4;hpb=e3a7c58aebafce40323db54bf6056029e5af4a70;p=fs%2Flustre-release.git diff --git a/lustre/osd-ldiskfs/osd_oi.h b/lustre/osd-ldiskfs/osd_oi.h index 287ede3..e278411 100644 --- a/lustre/osd-ldiskfs/osd_oi.h +++ b/lustre/osd-ldiskfs/osd_oi.h @@ -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) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -49,18 +49,22 @@ #ifndef _OSD_OI_H #define _OSD_OI_H -#if defined(__KERNEL__) /* struct rw_semaphore */ #include +#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; struct osd_device; @@ -70,25 +74,87 @@ 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 */ +}; + +/* OI cache entry */ +struct osd_idmap_cache { + struct lu_fid oic_fid; + struct osd_inode_id oic_lid; + struct osd_device *oic_dev; + __u16 oic_remote:1; /* FID isn't local */ +}; + +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_device *osd); +int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd, + bool restored); 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); + 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, int ingore_quota); + const struct lu_fid *fid, const struct osd_inode_id *id, + handle_t *th, enum oi_check_flags flags, bool *exist); int osd_oi_delete(struct osd_thread_info *info, - struct osd_device *osd, const struct lu_fid *fid, - struct thandle *th); + struct osd_device *osd, const struct lu_fid *fid, + handle_t *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, + handle_t *th, enum oi_check_flags flags); -#endif /* __KERNEL__ */ +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 /* _OSD_OI_H */