Whamcloud - gitweb
LU-1408 debug: initialize debug_msg_data if needed
[fs/lustre-release.git] / lustre / include / lu_object.h
index b7604e3..94c0b47 100644 (file)
@@ -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, Intel Corporation.
+ * Copyright (c) 2011, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #define __LUSTRE_LU_OBJECT_H
 
 #include <stdarg.h>
-
-/*
- * struct lu_fid
- */
 #include <libcfs/libcfs.h>
-
 #include <lustre/lustre_idl.h>
-
 #include <lu_ref.h>
 
 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.
+        * Link to the device, for debugging.
         */
-       __u32                                   lo_flags;
-        /**
-         * Link to the device, for debugging.
-         */
-        struct lu_ref_link                *lo_dev_ref;
+       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 {
@@ -571,28 +555,28 @@ struct lu_object_header {
 struct fld;
 
 struct lu_site_bkt_data {
-        /**
-         * number of busy object on this bucket
-         */
-        long                      lsb_busy;
-        /**
-         * LRU list, updated on each access to object. Protected by
-         * bucket lock of lu_site::ls_obj_hash.
-         *
-         * "Cold" end of LRU is lu_site::ls_lru.next. Accessed object are
-         * moved to the lu_site::ls_lru.prev (this is due to the non-existence
-         * of list_for_each_entry_safe_reverse()).
-         */
-        cfs_list_t                lsb_lru;
-        /**
-         * Wait-queue signaled when an object in this site is ultimately
-         * destroyed (lu_object_free()). It is used by lu_object_find() to
-         * wait before re-trying when object in the process of destruction is
-         * found in the hash table.
-         *
-         * \see htable_lookup().
-         */
-        cfs_waitq_t               lsb_marche_funebre;
+       /**
+        * number of busy object on this bucket
+        */
+       long                      lsb_busy;
+       /**
+        * LRU list, updated on each access to object. Protected by
+        * bucket lock of lu_site::ls_obj_hash.
+        *
+        * "Cold" end of LRU is lu_site::ls_lru.next. Accessed object are
+        * moved to the lu_site::ls_lru.prev (this is due to the non-existence
+        * of list_for_each_entry_safe_reverse()).
+        */
+       cfs_list_t                lsb_lru;
+       /**
+        * Wait-queue signaled when an object in this site is ultimately
+        * destroyed (lu_object_free()). It is used by lu_object_find() to
+        * wait before re-trying when object in the process of destruction is
+        * found in the hash table.
+        *
+        * \see htable_lookup().
+        */
+       wait_queue_head_t               lsb_marche_funebre;
 };
 
 enum {
@@ -662,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.
  * @{
@@ -723,6 +712,7 @@ static inline int lu_object_is_dying(const struct lu_object_header *h)
 
 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);
 
@@ -735,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,
@@ -798,9 +790,8 @@ int lu_cdebug_printer(const struct lu_env *env,
  */
 #define LU_OBJECT_DEBUG(mask, env, object, format, ...)                   \
 do {                                                                      \
-        LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, mask, NULL);                  \
-                                                                          \
         if (cfs_cdebug_show(mask, DEBUG_SUBSYSTEM)) {                     \
+                LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, mask, NULL);          \
                 lu_object_print(env, &msgdata, lu_cdebug_printer, object);\
                 CDEBUG(mask, format , ## __VA_ARGS__);                    \
         }                                                                 \
@@ -811,9 +802,8 @@ do {                                                                      \
  */
 #define LU_OBJECT_HEADER(mask, env, object, format, ...)                \
 do {                                                                    \
-        LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, mask, NULL);                \
-                                                                        \
         if (cfs_cdebug_show(mask, DEBUG_SUBSYSTEM)) {                   \
+                LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, mask, NULL);        \
                 lu_object_header_print(env, &msgdata, lu_cdebug_printer,\
                                        (object)->lo_header);            \
                 lu_cdebug_printer(env, &msgdata, "\n");                 \
@@ -864,11 +854,19 @@ static inline __u32 lu_object_attr(const struct lu_object *o)
         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)
+{
+       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)
 {
-        return lu_ref_add(&o->lo_header->loh_reference, scope, source);
+       lu_ref_add_at(&o->lo_header->loh_reference, link, scope, source);
 }
 
 static inline void lu_object_ref_del(struct lu_object *o,
@@ -1014,7 +1012,11 @@ enum lu_context_tag {
         /**
          * Context for local operations
          */
-        LCT_LOCAL = 1 << 7,
+       LCT_LOCAL = 1 << 7,
+       /**
+        * session for server thread
+        **/
+       LCT_SERVER_SESSION = 1 << 8,
         /**
          * Set when at least one of keys, having values in this context has
          * non-NULL lu_context_key::lct_exit() method. This is used to
@@ -1111,14 +1113,14 @@ struct lu_context_key {
          * key.
          */
         cfs_atomic_t lct_used;
-        /**
-         * Internal implementation detail: module for this key.
-         */
-        cfs_module_t *lct_owner;
-        /**
-         * References to this key. For debugging.
-         */
-        struct lu_ref  lct_reference;
+       /**
+        * Internal implementation detail: module for this key.
+        */
+       struct module *lct_owner;
+       /**
+        * References to this key. For debugging.
+        */
+       struct lu_ref  lct_reference;
 };
 
 #define LU_KEY_INIT(mod, type)                                    \
@@ -1127,7 +1129,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)                                \
@@ -1273,26 +1275,6 @@ int  lu_env_refill_by_tags(struct lu_env *env, __u32 ctags, __u32 stags);
 
 /** @} lu_context */
 
-struct lu_ucred {
-       __u32               uc_valid;
-       __u32               uc_o_uid;
-       __u32               uc_o_gid;
-       __u32               uc_o_fsuid;
-       __u32               uc_o_fsgid;
-       __u32               uc_uid;
-       __u32               uc_gid;
-       __u32               uc_fsuid;
-       __u32               uc_fsgid;
-       __u32               uc_suppgids[2];
-       cfs_cap_t           uc_cap;
-       __u32               uc_umask;
-       cfs_group_info_t   *uc_ginfo;
-       struct md_identity *uc_identity;
-};
-struct lu_ucred *lu_ucred(const struct lu_env *env);
-struct lu_ucred *lu_ucred_check(const struct lu_env *env);
-struct lu_ucred *lu_ucred_assert(const struct lu_env *env);
-
 /**
  * Output site statistical counters into a buffer. Suitable for
  * ll_rd_*()-style functions.
@@ -1316,9 +1298,6 @@ struct lu_buf {
         ssize_t lb_len;
 };
 
-/** null buffer */
-extern struct lu_buf LU_BUF_NULL;
-
 #define DLUBUF "(%p %zu)"
 #define PLUBUF(buf) (buf)->lb_buf, (buf)->lb_len
 /**
@@ -1337,7 +1316,7 @@ int lu_global_init(void);
 void lu_global_fini(void);
 
 struct lu_kmem_descr {
-        cfs_mem_cache_t **ckd_cache;
+       struct kmem_cache **ckd_cache;
         const char       *ckd_name;
         const size_t      ckd_size;
 };
@@ -1351,5 +1330,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 */