Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / lustre / lov / lov_internal.h
index aa14445..a8711e0 100644 (file)
@@ -62,6 +62,7 @@ struct lov_async_page {
         int                             lap_stripe;
         obd_off                         lap_sub_offset;
         obd_id                          lap_loi_id;
+        obd_gr                          lap_loi_gr;
         void                            *lap_sub_cookie;
         struct obd_async_page_ops       *lap_caller_ops;
         void                            *lap_caller_data;
@@ -71,6 +72,8 @@ struct lov_async_page {
         (LASSERT(((struct lov_async_page *)(c))->lap_magic == LOV_AP_MAGIC),   \
          (struct lov_async_page *)(c))
 
+extern cfs_mem_cache_t *lov_oinfo_slab;
+
 static inline void lov_llh_addref(void *llhp)
 {
         struct lov_lock_handles *llh = llhp;
@@ -109,9 +112,14 @@ static inline void lov_llh_put(struct lov_lock_handles *llh)
                 atomic_read(&llh->llh_refcount) < 0x5a5a);
         if (atomic_dec_and_test(&llh->llh_refcount)) {
                 class_handle_unhash(&llh->llh_handle);
-                LASSERT(list_empty(&llh->llh_handle.h_link));
-                OBD_FREE(llh, sizeof *llh +
-                         sizeof(*llh->llh_handles) * llh->llh_stripe_count);
+                /* The structure may be held by other threads because RCU. 
+                 *   -jxiong */
+                if (atomic_read(&llh->llh_refcount))
+                        return;
+
+                OBD_FREE_RCU(llh, sizeof *llh +
+                             sizeof(*llh->llh_handles) * llh->llh_stripe_count,
+                             &llh->llh_handle);
         }
 }
 
@@ -139,6 +147,8 @@ int lov_stripe_intersects(struct lov_stripe_md *lsm, int stripeno,
 int lov_stripe_number(struct lov_stripe_md *lsm, obd_off lov_off);
 
 /* lov_qos.c */
+#define LOV_USES_ASSIGNED_STRIPE        0
+#define LOV_USES_DEFAULT_STRIPE         1
 int qos_add_tgt(struct obd_device *obd, __u32 index);
 int qos_del_tgt(struct obd_device *obd, __u32 index);
 void qos_shrink_lsm(struct lov_request_set *set);
@@ -221,8 +231,9 @@ void lov_getref(struct obd_device *obd);
 void lov_putref(struct obd_device *obd);
 
 /* lov_log.c */
-int lov_llog_init(struct obd_device *obd, struct obd_device *tgt,
-                  int count, struct llog_catid *logid, struct obd_uuid *uuid);
+int lov_llog_init(struct obd_device *obd, struct obd_llogs *llogs, 
+                  struct obd_device *tgt, int count, struct llog_catid *logid, 
+                  struct obd_uuid *uuid);
 int lov_llog_finish(struct obd_device *obd, int count);
 
 /* lov_pack.c */
@@ -245,6 +256,8 @@ void lov_dump_lmm_join(int level, struct lov_mds_md_join *lmmj);
 /* lov_ea.c */
 int lov_unpackmd_join(struct lov_obd *lov, struct lov_stripe_md *lsm,
                       struct lov_mds_md *lmm);
+struct lov_stripe_md *lsm_alloc_plain(int stripe_count, int *size);
+void lsm_free_plain(struct lov_stripe_md *lsm);
 
 struct lov_extent *lovea_idx2le(struct lov_stripe_md *lsm, int stripe_no);
 struct lov_extent *lovea_off2le(struct lov_stripe_md *lsm, obd_off lov_off);