X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fosd%2Fosd_internal.h;h=0b1ca690f95c8f1fcbefb02bcbacf72968023ea4;hb=fbfd488a2f87ea43332ae16341887f68c0ffbde5;hp=8fd25f2737bdf2eb633718b7cff35bfa70991909;hpb=2c5b845758dfb8e197ffdc2bd7a83c3b5c02f469;p=fs%2Flustre-release.git diff --git a/lustre/osd/osd_internal.h b/lustre/osd/osd_internal.h index 8fd25f2..0b1ca69 100644 --- a/lustre/osd/osd_internal.h +++ b/lustre/osd/osd_internal.h @@ -53,7 +53,6 @@ #include /* struct dentry */ #include -#include /* struct dirent64 */ #include @@ -65,6 +64,7 @@ #include #include "osd_oi.h" +#include "osd_iam.h" struct inode; @@ -129,6 +129,26 @@ struct osd_device { }; /** + * Storage representation for fids. + * + * Variable size, first byte contains the length of the whole record. + */ +struct osd_fid_pack { + unsigned char fp_len; + char fp_area[sizeof(struct lu_fid)]; +}; + +struct osd_it_ea_dirent { + __u64 oied_ino; + __u64 oied_off; + unsigned short oied_namelen; + unsigned int oied_type; + char oied_name[0]; +} __attribute__((packed)); + +#define OSD_IT_EA_BUFSIZE CFS_PAGE_SIZE + +/** * This is iterator's in-memory data structure in interoperability * mode (i.e. iterator over ldiskfs style directory) */ @@ -136,15 +156,14 @@ struct osd_it_ea { struct osd_object *oie_obj; /** used in ldiskfs iterator, to stored file pointer */ struct file oie_file; - /** used in ldiskfs iterator, to store directory entry */ - struct dirent64 oie_dirent64; - /** current file position */ - __u64 oie_curr_pos; - /** next file position */ - __u64 oie_next_pos; - /** namelen of the file */ - __u8 oie_namelen; - + /** how many entries have been read-cached from storage */ + int oie_rd_dirent; + /** current entry is being iterated by caller */ + int oie_it_dirent; + /** current processing entry */ + struct osd_it_ea_dirent *oie_dirent; + /** buffer to hold entries, size == OSD_IT_EA_BUFSIZE */ + void *oie_buf; }; /** @@ -173,10 +192,8 @@ struct osd_thread_info { * XXX temporary: for ->i_op calls. */ struct txn_param oti_txn; - /* - * XXX temporary: fake dentry used by xattr calls. - */ struct timespec oti_time; + struct timespec oti_time2; /* * XXX temporary: fake struct file for osd_object_sync */ @@ -187,8 +204,6 @@ struct osd_thread_info { struct lustre_capa_key oti_capa_key; struct lustre_capa oti_capa; - struct lu_fid_pack oti_pack; - /** * following ipd and it structures are used for osd_index_iam_lookup() * these are defined separately as we might do index operation @@ -203,6 +218,8 @@ struct osd_thread_info { struct osd_it_ea oti_it_ea; }; + /** pre-allocated buffer used by oti_it_ea, size OSD_IT_EA_BUFSIZE */ + void *oti_it_ea_buf; /** IAM iterator for index operation. */ struct iam_iterator oti_idx_it; @@ -229,6 +246,9 @@ struct osd_thread_info { #ifdef HAVE_QUOTA_SUPPORT struct osd_ctxt oti_ctxt; #endif + struct lu_env oti_obj_delete_tx_env; +#define OSD_FID_REC_SZ 32 + char oti_fid_packed[OSD_FID_REC_SZ]; }; #ifdef LPROCFS @@ -243,5 +263,31 @@ void osd_lprocfs_time_end(const struct lu_env *env, int osd_statfs(const struct lu_env *env, struct dt_device *dev, struct kstatfs *sfs); +/* + * Invariants, assertions. + */ + +/* + * XXX: do not enable this, until invariant checking code is made thread safe + * in the face of pdirops locking. + */ +#define OSD_INVARIANT_CHECKS (0) + +#if OSD_INVARIANT_CHECKS +static inline int osd_invariant(const struct osd_object *obj) +{ + return + obj != NULL && + ergo(obj->oo_inode != NULL, + obj->oo_inode->i_sb == osd_sb(osd_obj2dev(obj)) && + atomic_read(&obj->oo_inode->i_count) > 0) && + ergo(obj->oo_dir != NULL && + obj->oo_dir->od_conationer.ic_object != NULL, + obj->oo_dir->od_conationer.ic_object == obj->oo_inode); +} +#else +#define osd_invariant(obj) (1) +#endif + #endif /* __KERNEL__ */ #endif /* _OSD_INTERNAL_H */