-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* 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, 2012, 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;
* For lu_object_conf flags
*/
typedef enum {
- /* Currently, only used for client-side object initialization. */
- LOC_F_NEW = 0x1,
+ /* This is a new object to be allocated, or the file
+ * corresponding to the object does not exists. */
+ LOC_F_NEW = 0x00000001,
} loc_flags_t;
/**
void (*ldto_stop)(struct lu_device_type *t);
};
+static inline int lu_device_is_md(const struct lu_device *d)
+{
+ return ergo(d != NULL, d->ld_type->ldt_tags & LU_DEVICE_MD);
+}
+
/**
* Flags for the object layers.
*/
* Depth. Top level layer depth is 0.
*/
int lo_depth;
- /**
- * Flags from enum lu_object_flags.
- */
- unsigned long lo_flags;
+ /**
+ * Flags from enum lu_object_flags.
+ */
+ __u32 lo_flags;
/**
* Link to the device, for debugging.
*/
};
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 {
* 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.
*/
* by ls_ld_lock.
**/
cfs_list_t ls_ld_linkage;
- cfs_spinlock_t ls_ld_lock;
-
- /**
- * lu_site stats
- */
- struct lprocfs_stats *ls_stats;
- struct lprocfs_stats *ls_time_stats;
+ spinlock_t ls_ld_lock;
+
+ /**
+ * lu_site stats
+ */
+ struct lprocfs_stats *ls_stats;
+ /**
+ * XXX: a hack! fld has to find md_site via site, remove when possible
+ */
+ struct seq_server_site *ld_seq_site;
};
static inline struct lu_site_bkt_data *
void lu_object_add_top (struct lu_object_header *h, struct lu_object *o);
void lu_object_add (struct lu_object *before, struct lu_object *o);
+void lu_dev_add_linkage(struct lu_site *s, struct lu_device *d);
+void lu_dev_del_linkage(struct lu_site *s, struct lu_device *d);
+
/**
* Helpers to initialize and finalize device types.
*/
*/
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);
/**
- * \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);
}
/**
*/
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;
}
* from enum lu_context_tag.
*/
__u32 lc_tags;
+ enum lu_context_state lc_state;
/**
* Pointer to the home service thread. NULL for other execution
* contexts.
* detail.
*/
void **lc_value;
- enum lu_context_state lc_state;
/**
* Linkage into a list of all remembered contexts. Only
* `non-transient' contexts, i.e., ones created for service threads
* a client.
*/
LCT_SESSION = 1 << 4,
-
+ /**
+ * A per-request data on OSP device
+ */
+ LCT_OSP_THREAD = 1 << 5,
+ /**
+ * MGS device thread
+ */
+ LCT_MG_THREAD = 1 << 6,
+ /**
+ * Context for local operations
+ */
+ LCT_LOCAL = 1 << 7,
/**
* 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
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
*/
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;
const char *ckd_name;
int lu_kmem_init(struct lu_kmem_descr *caches);
void lu_kmem_fini(struct lu_kmem_descr *caches);
+void lu_object_assign_fid(const struct lu_env *env, struct lu_object *o,
+ const struct lu_fid *fid);
+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 */