Whamcloud - gitweb
LU-3677 mdt: Set HSM dirty open-for-write file when evicted.
[fs/lustre-release.git] / lustre / include / lu_object.h
index 6e25c73..bd0e58d 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, Whamcloud, Inc.
+ * 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.
-         */
-        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 {
@@ -647,11 +631,10 @@ struct lu_site {
         * lu_site stats
         */
        struct lprocfs_stats    *ls_stats;
-       struct lprocfs_stats    *ls_time_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 *
@@ -663,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.
  * @{
@@ -724,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);
 
@@ -736,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,
@@ -835,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);
 }
 
 /**
@@ -867,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)
+{
+       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,
@@ -1134,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)                                \
@@ -1280,26 +1273,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.
@@ -1323,9 +1296,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
 /**
@@ -1343,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;
 };
@@ -1367,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 */