X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_iam.h;h=a782769d04ecc0684e7ab753af7c21bbc99934c8;hb=9ee6e92bcf4a142e76e27d5b8ac8b34684749002;hp=e6c550c05fd53e742209e6a1eb5d21862c78118b;hpb=b79078ebbdcf210225893b4ffb45f2b8e9e51b75;p=fs%2Flustre-release.git diff --git a/lustre/osd-ldiskfs/osd_iam.h b/lustre/osd-ldiskfs/osd_iam.h index e6c550c..a782769 100644 --- a/lustre/osd-ldiskfs/osd_iam.h +++ b/lustre/osd-ldiskfs/osd_iam.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. @@ -28,6 +26,8 @@ /* * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -219,6 +219,9 @@ struct iam_frame { iam_ptr_t curidx; /* (logical) offset of this node. Used to * per-node locking to detect concurrent * splits. */ + unsigned int at_shifted:1; /* The "at" entry has moved to next + * because of shrinking index node + * for recycling empty leaf node. */ }; /* @@ -374,6 +377,8 @@ struct iam_leaf_operations { int (*key_cmp)(const struct iam_leaf *l, const struct iam_key *k); int (*key_eq)(const struct iam_leaf *l, const struct iam_key *k); + int (*rec_eq)(const struct iam_leaf *l, const struct iam_rec *r); + int (*key_size)(const struct iam_leaf *l); /* * Search leaf @l for a record with key @k or for a place @@ -401,6 +406,10 @@ struct iam_leaf_operations { */ void (*split)(struct iam_leaf *l, struct buffer_head **bh, iam_ptr_t newblknr); + /* + * the leaf is empty? + */ + int (*leaf_empty)(struct iam_leaf *l); }; /* @@ -439,6 +448,20 @@ struct iam_descr { struct iam_leaf_operations *id_leaf_ops; }; +enum { + IAM_IDLE_HEADER_MAGIC = 0x7903, +}; + +/* + * Header structure to record idle blocks. + */ +struct iam_idle_head { + __le16 iih_magic; + __le16 iih_count; /* how many idle blocks in this head */ + __le32 iih_next; /* next head for idle blocks */ + __le32 iih_blks[0]; +}; + /* * An instance of iam container. */ @@ -447,15 +470,29 @@ struct iam_container { * Underlying flat file. IO against this object is issued to * read/write nodes. */ - struct inode *ic_object; + struct inode *ic_object; + /* + * BH of root block + */ + struct buffer_head *ic_root_bh; /* * container flavor. */ - struct iam_descr *ic_descr; + struct iam_descr *ic_descr; /* * read-write lock protecting index consistency. */ - cfs_rw_semaphore_t ic_sem; + struct rw_semaphore ic_sem; + struct dynlock ic_tree_lock; + /* + * Protect ic_idle_bh + */ + struct semaphore ic_idle_sem; + /* + * BH for idle blocks + */ + struct buffer_head *ic_idle_bh; + unsigned int ic_idle_failed:1; /* Idle block mechanism failed */ }; /* @@ -813,8 +850,8 @@ struct fake_dirent { }; struct dx_countlimit { - __le16 limit; - __le16 count; + __le16 limit; + __le16 count; }; /* @@ -900,22 +937,16 @@ static inline struct iam_entry *dx_node_get_entries(struct iam_path *path, static inline struct iam_ikey *iam_path_ikey(const struct iam_path *path, int nr) { - assert(0 <= nr && nr < ARRAY_SIZE(path->ip_data->ipd_key_scratch)); + LASSERT(0 <= nr && nr < ARRAY_SIZE(path->ip_data->ipd_key_scratch)); return path->ip_data->ipd_key_scratch[nr]; } - -static inline struct dynlock *path_dynlock(struct iam_path *path) -{ - return &LDISKFS_I(iam_path_obj(path))->i_htree_lock; -} - static inline int iam_leaf_is_locked(const struct iam_leaf *leaf) { int result; - result = dynlock_is_locked(path_dynlock(leaf->il_path), - leaf->il_curidx); + result = dynlock_is_locked(&iam_leaf_container(leaf)->ic_tree_lock, + leaf->il_curidx); if (!result) dump_stack(); return result; @@ -926,7 +957,8 @@ static inline int iam_frame_is_locked(struct iam_path *path, { int result; - result = dynlock_is_locked(path_dynlock(path), frame->curidx); + result = dynlock_is_locked(&path->ip_container->ic_tree_lock, + frame->curidx); if (!result) dump_stack(); return result; @@ -1010,9 +1042,9 @@ static inline void iam_lock_bh(struct buffer_head volatile *bh) { DX_DEVAL(iam_lock_stats.dls_bh_lock++); #ifdef CONFIG_SMP - while (cfs_test_and_set_bit(BH_DXLock, &bh->b_state)) { - DX_DEVAL(iam_lock_stats.dls_bh_busy++); - while (cfs_test_bit(BH_DXLock, &bh->b_state)) + while (test_and_set_bit(BH_DXLock, &bh->b_state)) { + DX_DEVAL(iam_lock_stats.dls_bh_busy++); + while (test_bit(BH_DXLock, &bh->b_state)) cpu_relax(); } #endif