Whamcloud - gitweb
LU-3409 llite: silence lockdep warning in ll_md_blocking_ast
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_iam.h
index 293f2e3..a782769 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2009, 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/
@@ -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. */
 };
 
 /*
@@ -403,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);
 };
 
 /*
@@ -441,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.
  */
@@ -461,8 +482,17 @@ struct iam_container {
         /*
          * 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 */
 };
 
 /*
@@ -820,8 +850,8 @@ struct fake_dirent {
 };
 
 struct dx_countlimit {
-        __le16 limit;
-        __le16 count;
+       __le16 limit;
+       __le16 count;
 };
 
 /*
@@ -907,7 +937,7 @@ 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];
 }
 
@@ -1012,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