X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=inline;f=lustre%2Finclude%2Flu_object.h;h=bd0e58d1270ca479cc4b4c6adcfd8cf071f0c215;hb=295968fa7257978bba7aa4fedb28cd3563d4a5e0;hp=d47db1287ddc78533b3d88900935e72c8c2a4dfd;hpb=c7f2e70a27e872ddf61f254fd6d9b299d9745aa6;p=fs%2Flustre-release.git diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index d47db12..bd0e58d 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.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) 2011, 2012, Whamcloud, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -38,14 +38,8 @@ #define __LUSTRE_LU_OBJECT_H #include - -/* - * struct lu_fid - */ #include - #include - #include struct seq_file; @@ -398,16 +392,10 @@ struct lu_device_type_operations { void (*ldto_stop)(struct lu_device_type *t); }; -/** - * Flags for the object layers. - */ -enum lu_object_flags { - /** - * this flags is set if lu_object_operations::loo_object_init() has - * been called for this layer. Used by lu_object_alloc(). - */ - LU_OBJECT_ALLOCATED = (1 << 0) -}; +static inline int lu_device_is_md(const struct lu_device *d) +{ + return ergo(d != NULL, d->ld_type->ldt_tags & LU_DEVICE_MD); +} /** * Common object attributes. @@ -486,27 +474,23 @@ struct lu_object { * Linkage into list of all layers. */ cfs_list_t lo_linkage; - /** - * Depth. Top level layer depth is 0. - */ - int lo_depth; - /** - * Flags from enum lu_object_flags. - */ - unsigned long lo_flags; - /** - * Link to the device, for debugging. - */ - struct lu_ref_link *lo_dev_ref; + /** + * Link to the device, for debugging. + */ + struct lu_ref_link lo_dev_ref; }; enum lu_object_header_flags { - /** - * Don't keep this object in cache. Object will be destroyed as soon - * as last reference to it is released. This flag cannot be cleared - * once set. - */ - LU_OBJECT_HEARD_BANSHEE = 0 + /** + * Don't keep this object in cache. Object will be destroyed as soon + * as last reference to it is released. This flag cannot be cleared + * once set. + */ + LU_OBJECT_HEARD_BANSHEE = 0, + /** + * Mark this object has already been taken out of cache. + */ + LU_OBJECT_UNHASHED = 1, }; enum lu_object_header_attr { @@ -628,6 +612,10 @@ struct lu_site { * Top-level device for this stack. */ struct lu_device *ls_top_dev; + /** + * Bottom-level device for this stack + */ + struct lu_device *ls_bottom_dev; /** * Linkage into global list of sites. */ @@ -637,17 +625,16 @@ struct lu_site { * by ls_ld_lock. **/ cfs_list_t ls_ld_linkage; - cfs_spinlock_t ls_ld_lock; + spinlock_t ls_ld_lock; - /** - * lu_site stats - */ - struct lprocfs_stats *ls_stats; - struct lprocfs_stats *ls_time_stats; + /** + * lu_site stats + */ + struct lprocfs_stats *ls_stats; /** * XXX: a hack! fld has to find md_site via site, remove when possible */ - struct md_site *ld_md_site; + struct seq_server_site *ld_seq_site; }; static inline struct lu_site_bkt_data * @@ -659,6 +646,11 @@ lu_site_bkt_from_fid(struct lu_site *site, struct lu_fid *fid) return cfs_hash_bd_extra_get(site->ls_obj_hash, &bd); } +static inline struct seq_server_site *lu_site2seq(const struct lu_site *s) +{ + return s->ld_seq_site; +} + /** \name ctors * Constructors/destructors. * @{ @@ -715,11 +707,12 @@ static inline void lu_object_get(struct lu_object *o) */ static inline int lu_object_is_dying(const struct lu_object_header *h) { - return cfs_test_bit(LU_OBJECT_HEARD_BANSHEE, &h->loh_flags); + return test_bit(LU_OBJECT_HEARD_BANSHEE, &h->loh_flags); } void lu_object_put(const struct lu_env *env, struct lu_object *o); void lu_object_put_nocache(const struct lu_env *env, struct lu_object *o); +void lu_object_unhash(const struct lu_env *env, struct lu_object *o); int lu_site_purge(const struct lu_env *env, struct lu_site *s, int nr); @@ -732,6 +725,8 @@ struct lu_object *lu_object_find_at(const struct lu_env *env, struct lu_device *dev, const struct lu_fid *f, const struct lu_object_conf *conf); +void lu_object_purge(const struct lu_env *env, struct lu_device *dev, + const struct lu_fid *f); struct lu_object *lu_object_find_slice(const struct lu_env *env, struct lu_device *dev, const struct lu_fid *f, @@ -831,31 +826,25 @@ int lu_object_invariant(const struct lu_object *o); /** - * \retval 1 iff object \a o exists on stable storage, - * \retval 0 iff object \a o not exists on stable storage. - * \retval -1 iff object \a o is on remote server. + * Check whether object exists, no matter on local or remote storage. + * Note: LOHA_EXISTS will be set once some one created the object, + * and it does not needs to be committed to storage. */ -static inline int lu_object_exists(const struct lu_object *o) -{ - __u32 attr; - - attr = o->lo_header->loh_attr; - if (attr & LOHA_REMOTE) - return -1; - else if (attr & LOHA_EXISTS) - return +1; - else - return 0; -} +#define lu_object_exists(o) ((o)->lo_header->loh_attr & LOHA_EXISTS) + +/** + * Check whether object on the remote storage. + */ +#define lu_object_remote(o) unlikely((o)->lo_header->loh_attr & LOHA_REMOTE) static inline int lu_object_assert_exists(const struct lu_object *o) { - return lu_object_exists(o) != 0; + return lu_object_exists(o); } static inline int lu_object_assert_not_exists(const struct lu_object *o) { - return lu_object_exists(o) <= 0; + return !lu_object_exists(o); } /** @@ -863,15 +852,23 @@ static inline int lu_object_assert_not_exists(const struct lu_object *o) */ static inline __u32 lu_object_attr(const struct lu_object *o) { - LASSERT(lu_object_exists(o) > 0); + LASSERT(lu_object_exists(o) != 0); return o->lo_header->loh_attr; } -static inline struct lu_ref_link *lu_object_ref_add(struct lu_object *o, - const char *scope, - const void *source) +static inline void lu_object_ref_add(struct lu_object *o, + const char *scope, + const void *source) { - return lu_ref_add(&o->lo_header->loh_reference, scope, source); + lu_ref_add(&o->lo_header->loh_reference, scope, source); +} + +static inline void lu_object_ref_add_at(struct lu_object *o, + struct lu_ref_link *link, + const char *scope, + const void *source) +{ + lu_ref_add_at(&o->lo_header->loh_reference, link, scope, source); } static inline void lu_object_ref_del(struct lu_object *o, @@ -1130,7 +1127,7 @@ struct lu_context_key { { \ type *value; \ \ - CLASSERT(CFS_PAGE_SIZE >= sizeof (*value)); \ + CLASSERT(PAGE_CACHE_SIZE >= sizeof (*value)); \ \ OBD_ALLOC_PTR(value); \ if (value == NULL) \ @@ -1299,10 +1296,7 @@ struct lu_buf { ssize_t lb_len; }; -/** null buffer */ -extern struct lu_buf LU_BUF_NULL; - -#define DLUBUF "(%p %z)" +#define DLUBUF "(%p %zu)" #define PLUBUF(buf) (buf)->lb_buf, (buf)->lb_len /** * One-time initializers, called at obdclass module initialization, not @@ -1319,17 +1313,8 @@ int lu_global_init(void); */ void lu_global_fini(void); -enum { - LU_TIME_FIND_LOOKUP, - LU_TIME_FIND_ALLOC, - LU_TIME_FIND_INSERT, - LU_TIME_NR -}; - -extern const char *lu_time_names[LU_TIME_NR]; - struct lu_kmem_descr { - cfs_mem_cache_t **ckd_cache; + struct kmem_cache **ckd_cache; const char *ckd_name; const size_t ckd_size; }; @@ -1343,5 +1328,15 @@ struct lu_object *lu_object_anon(const struct lu_env *env, struct lu_device *dev, const struct lu_object_conf *conf); +/** null buffer */ +extern struct lu_buf LU_BUF_NULL; + +void lu_buf_free(struct lu_buf *buf); +void lu_buf_alloc(struct lu_buf *buf, int size); +void lu_buf_realloc(struct lu_buf *buf, int size); + +int lu_buf_check_and_grow(struct lu_buf *buf, int len); +struct lu_buf *lu_buf_check_and_alloc(struct lu_buf *buf, int len); + /** @} lu */ #endif /* __LUSTRE_LU_OBJECT_H */