X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flu_object.h;h=d99e974b571486683483332ed03005cdc41bc570;hb=71d68757c76cb01ba4d9afa09c766fe48dce369c;hp=c1bf4d89fb4f690edbc916ec818c19d4fb724a7b;hpb=6e3ec5812ebd1b5ecf7cae584f429b013ffe7431;p=fs%2Flustre-release.git diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index c1bf4d8..d99e974 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.h @@ -1,6 +1,4 @@ -/* -*- 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. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2012, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -42,10 +42,10 @@ /* * struct lu_fid */ -#include - #include +#include + #include struct seq_file; @@ -169,11 +169,23 @@ struct lu_device_operations { }; /** + * For lu_object_conf flags + */ +typedef enum { + /* Currently, only used for client-side object initialization. */ + LOC_F_NEW = 0x1, +} loc_flags_t; + +/** * Object configuration, describing particulars of object being created. On * server this is not used, as server objects are full identified by fid. On * client configuration contains struct lustre_md. */ struct lu_object_conf { + /** + * Some hints for obj find and alloc. + */ + loc_flags_t loc_flags; }; /** @@ -278,6 +290,10 @@ struct lu_device { * A list of references to this object, for debugging. */ struct lu_ref ld_reference; + /** + * Link the device to the site. + **/ + cfs_list_t ld_linkage; }; struct lu_device_type_operations; @@ -399,11 +415,11 @@ struct lu_attr { /** size in bytes */ __u64 la_size; /** modification time in seconds since Epoch */ - __u64 la_mtime; + obd_time la_mtime; /** access time in seconds since Epoch */ - __u64 la_atime; + obd_time la_atime; /** change time in seconds since Epoch */ - __u64 la_ctime; + obd_time la_ctime; /** 512-byte blocks allocated to object */ __u64 la_blocks; /** permission bits and file type */ @@ -445,6 +461,8 @@ enum la_valid { LA_NLINK = 1 << 10, LA_RDEV = 1 << 11, LA_BLKSIZE = 1 << 12, + LA_KILL_SUID = 1 << 13, + LA_KILL_SGID = 1 << 14, }; /** @@ -551,6 +569,41 @@ 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; +}; + +enum { + LU_SS_CREATED = 0, + LU_SS_CACHE_HIT, + LU_SS_CACHE_MISS, + LU_SS_CACHE_RACE, + LU_SS_CACHE_DEATH_RACE, + LU_SS_LRU_PURGED, + LU_SS_LAST_STAT +}; + /** * lu_site is a "compartment" within which objects are unique, and LRU * discipline is maintained. @@ -563,107 +616,44 @@ struct fld; */ struct lu_site { /** - * Site-wide lock. - * - * lock protecting: - * - * - lu_site::ls_hash hash table (and its linkages in objects); - * - * - lu_site::ls_lru list (and its linkages in objects); - * - * - 0/1 transitions of object lu_object_header::loh_ref - * reference count; - * - * yes, it's heavy. - */ - cfs_rwlock_t ls_guard; - /** - * Hash-table where objects are indexed by fid. + * objects hash table */ - cfs_hlist_head_t *ls_hash; + cfs_hash_t *ls_obj_hash; /** - * Bit-mask for hash-table size. + * index of bucket on hash table while purging */ - int ls_hash_mask; - /** - * Order of hash-table. - */ - int ls_hash_bits; - /** - * Number of buckets in the hash-table. - */ - int ls_hash_size; - - /** - * LRU list, updated on each access to object. Protected by - * lu_site::ls_guard. - * - * "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 ls_lru; - /** - * Total number of objects in this site. Protected by - * lu_site::ls_guard. - */ - unsigned ls_total; - /** - * Total number of objects in this site with reference counter greater - * than 0. Protected by lu_site::ls_guard. - */ - unsigned ls_busy; - + int ls_purge_start; /** * Top-level device for this stack. */ struct lu_device *ls_top_dev; - /** - * 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. - * - * If having a single wait-queue turns out to be a problem, a - * wait-queue per hash-table bucket can be easily implemented. - * - * \see htable_lookup(). + * Linkage into global list of sites. */ - cfs_waitq_t ls_marche_funebre; - - /** statistical counters. Protected by nothing, races are accepted. */ - struct { - __u32 s_created; - __u32 s_cache_hit; - __u32 s_cache_miss; - /** - * Number of hash-table entry checks made. - * - * ->s_cache_check / (->s_cache_miss + ->s_cache_hit) - * - * is an average number of hash slots inspected during single - * lookup. - */ - __u32 s_cache_check; - /** Races with cache insertions. */ - __u32 s_cache_race; - /** - * Races with object destruction. - * - * \see lu_site::ls_marche_funebre. - */ - __u32 s_cache_death_race; - __u32 s_lru_purged; - } ls_stats; + cfs_list_t ls_linkage; + /** + * List for lu device for this site, protected + * by ls_ld_lock. + **/ + cfs_list_t ls_ld_linkage; + cfs_spinlock_t ls_ld_lock; /** - * Linkage into global list of sites. + * lu_site stats */ - cfs_list_t ls_linkage; + struct lprocfs_stats *ls_stats; struct lprocfs_stats *ls_time_stats; }; +static inline struct lu_site_bkt_data * +lu_site_bkt_from_fid(struct lu_site *site, struct lu_fid *fid) +{ + cfs_hash_bd_t bd; + + cfs_hash_bd_get(site->ls_obj_hash, fid, &bd); + return cfs_hash_bd_extra_get(site->ls_obj_hash, &bd); +} + /** \name ctors * Constructors/destructors. * @{ @@ -785,40 +775,23 @@ lu_object_ops(const struct lu_object *o) struct lu_object *lu_object_locate(struct lu_object_header *h, const struct lu_device_type *dtype); -struct lu_cdebug_print_info { - int lpi_subsys; - int lpi_mask; - const char *lpi_file; - const char *lpi_fn; - int lpi_line; -}; - /** * Printer function emitting messages through libcfs_debug_msg(). */ int lu_cdebug_printer(const struct lu_env *env, void *cookie, const char *format, ...); -#define DECLARE_LU_CDEBUG_PRINT_INFO(var, mask) \ - struct lu_cdebug_print_info var = { \ - .lpi_subsys = DEBUG_SUBSYSTEM, \ - .lpi_mask = (mask), \ - .lpi_file = __FILE__, \ - .lpi_fn = __FUNCTION__, \ - .lpi_line = __LINE__ \ - } - /** * Print object description followed by a user-supplied message. */ -#define LU_OBJECT_DEBUG(mask, env, object, format, ...) \ -do { \ - static DECLARE_LU_CDEBUG_PRINT_INFO(__info, mask); \ - \ - if (cfs_cdebug_show(mask, DEBUG_SUBSYSTEM)) { \ - lu_object_print(env, &__info, lu_cdebug_printer, object); \ - CDEBUG(mask, format , ## __VA_ARGS__); \ - } \ +#define LU_OBJECT_DEBUG(mask, env, object, format, ...) \ +do { \ + LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, mask, NULL); \ + \ + if (cfs_cdebug_show(mask, DEBUG_SUBSYSTEM)) { \ + lu_object_print(env, &msgdata, lu_cdebug_printer, object);\ + CDEBUG(mask, format , ## __VA_ARGS__); \ + } \ } while (0) /** @@ -826,12 +799,12 @@ do { \ */ #define LU_OBJECT_HEADER(mask, env, object, format, ...) \ do { \ - static DECLARE_LU_CDEBUG_PRINT_INFO(__info, mask); \ + LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, mask, NULL); \ \ if (cfs_cdebug_show(mask, DEBUG_SUBSYSTEM)) { \ - lu_object_header_print(env, &__info, lu_cdebug_printer, \ + lu_object_header_print(env, &msgdata, lu_cdebug_printer,\ (object)->lo_header); \ - lu_cdebug_printer(env, &__info, "\n"); \ + lu_cdebug_printer(env, &msgdata, "\n"); \ CDEBUG(mask, format , ## __VA_ARGS__); \ } \ } while (0) @@ -850,6 +823,7 @@ 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. */ static inline int lu_object_exists(const struct lu_object *o) @@ -1023,7 +997,18 @@ enum lu_context_tag { * 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 @@ -1253,6 +1238,14 @@ void lu_context_key_degister_many(struct lu_context_key *k, ...); void lu_context_key_revive_many (struct lu_context_key *k, ...); void lu_context_key_quiesce_many (struct lu_context_key *k, ...); +/* + * update/clear ctx/ses tags. + */ +void lu_context_tags_update(__u32 tags); +void lu_context_tags_clear(__u32 tags); +void lu_session_tags_update(__u32 tags); +void lu_session_tags_clear(__u32 tags); + /** * Environment. */ @@ -1270,6 +1263,7 @@ struct lu_env { int lu_env_init (struct lu_env *env, __u32 tags); void lu_env_fini (struct lu_env *env); int lu_env_refill(struct lu_env *env); +int lu_env_refill_by_tags(struct lu_env *env, __u32 ctags, __u32 stags); /** @} lu_context */ @@ -1294,7 +1288,6 @@ struct lu_name { struct lu_buf { void *lb_buf; ssize_t lb_len; - int lb_vmalloc:1; }; /** null buffer */