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;
(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;
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);
}
}
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);
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 */
/* 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);