mirror of
https://github.com/schoebel/mars
synced 2025-01-17 04:20:59 +00:00
import mars-95.tgz
This commit is contained in:
parent
1b752e4012
commit
cc38199823
@ -81,7 +81,10 @@ static int aio_ref_get(struct aio_output *output, struct mref_object *mref)
|
|||||||
{
|
{
|
||||||
struct file *file = output->filp;
|
struct file *file = output->filp;
|
||||||
|
|
||||||
_CHECK_ATOMIC(&mref->ref_count, !=, 0);
|
if (atomic_read(&mref->ref_count) > 0) {
|
||||||
|
atomic_inc(&mref->ref_count);
|
||||||
|
return mref->ref_len;
|
||||||
|
}
|
||||||
|
|
||||||
if (file) {
|
if (file) {
|
||||||
loff_t total_size = i_size_read(file->f_mapping->host);
|
loff_t total_size = i_size_read(file->f_mapping->host);
|
||||||
@ -126,7 +129,7 @@ static int aio_ref_get(struct aio_output *output, struct mref_object *mref)
|
|||||||
}
|
}
|
||||||
|
|
||||||
atomic_inc(&mref->ref_count);
|
atomic_inc(&mref->ref_count);
|
||||||
return 0;
|
return mref->ref_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void aio_ref_put(struct aio_output *output, struct mref_object *mref)
|
static void aio_ref_put(struct aio_output *output, struct mref_object *mref)
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#define CLEAN_ALL
|
#define CLEAN_ALL
|
||||||
#define WB_MEMLEAK
|
#define WB_MEMLEAK
|
||||||
|
|
||||||
|
//#define WEG
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
@ -317,10 +319,12 @@ struct trans_logger_mref_aspect *hash_find(struct trans_logger_output *output, l
|
|||||||
|
|
||||||
res = _hash_find(&start->hash_anchor, pos, max_len, false);
|
res = _hash_find(&start->hash_anchor, pos, max_len, false);
|
||||||
|
|
||||||
|
#ifdef WEG
|
||||||
if (res) {
|
if (res) {
|
||||||
atomic_inc(&res->object->ref_count); // must be paired with __trans_logger_ref_put()
|
atomic_inc(&res->object->ref_count); // must be paired with __trans_logger_ref_put()
|
||||||
atomic_inc(&output->inner_balance_count);
|
atomic_inc(&output->inner_balance_count);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
traced_readunlock(&start->hash_lock, flags);
|
traced_readunlock(&start->hash_lock, flags);
|
||||||
|
|
||||||
@ -418,8 +422,10 @@ void hash_extend(struct trans_logger_output *output, loff_t *_pos, int *_len, st
|
|||||||
// collect
|
// collect
|
||||||
CHECK_HEAD_EMPTY(&test_a->collect_head);
|
CHECK_HEAD_EMPTY(&test_a->collect_head);
|
||||||
test_a->is_collected = true;
|
test_a->is_collected = true;
|
||||||
|
#ifdef WEG
|
||||||
atomic_inc(&test->ref_count); // must be paired with __trans_logger_ref_put()
|
atomic_inc(&test->ref_count); // must be paired with __trans_logger_ref_put()
|
||||||
atomic_inc(&output->inner_balance_count);
|
atomic_inc(&output->inner_balance_count);
|
||||||
|
#endif
|
||||||
list_add_tail(&test_a->collect_head, collect_list);
|
list_add_tail(&test_a->collect_head, collect_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,8 +521,16 @@ int _make_sshadow(struct trans_logger_output *output, struct trans_logger_mref_a
|
|||||||
mref->ref_flags = mshadow->ref_flags;
|
mref->ref_flags = mshadow->ref_flags;
|
||||||
mref_a->shadow_ref = mshadow_a;
|
mref_a->shadow_ref = mshadow_a;
|
||||||
mref_a->output = output;
|
mref_a->output = output;
|
||||||
atomic_inc(&mref->ref_count);
|
|
||||||
|
if (atomic_read(&mref->ref_count) == 0) {
|
||||||
|
// get an extra internal reference from slave to master
|
||||||
|
atomic_inc(&mshadow->ref_count); // is compensated by master transition in __trans_logger_ref_put()
|
||||||
|
atomic_inc(&output->inner_balance_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic_inc(&mref->ref_count); // must be paired with __trans_logger_ref_put()
|
||||||
atomic_inc(&output->inner_balance_count);
|
atomic_inc(&output->inner_balance_count);
|
||||||
|
|
||||||
atomic_inc(&output->sshadow_count);
|
atomic_inc(&output->sshadow_count);
|
||||||
atomic_inc(&output->total_sshadow_count);
|
atomic_inc(&output->total_sshadow_count);
|
||||||
#if 1
|
#if 1
|
||||||
@ -543,6 +557,7 @@ int _read_ref_get(struct trans_logger_output *output, struct trans_logger_mref_a
|
|||||||
if (!mshadow_a) {
|
if (!mshadow_a) {
|
||||||
return GENERIC_INPUT_CALL(input, mref_get, mref);
|
return GENERIC_INPUT_CALL(input, mref_get, mref);
|
||||||
}
|
}
|
||||||
|
|
||||||
return _make_sshadow(output, mref_a, mshadow_a);
|
return _make_sshadow(output, mref_a, mshadow_a);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -591,8 +606,12 @@ int _write_ref_get(struct trans_logger_output *output, struct trans_logger_mref_
|
|||||||
mref_a->output = output;
|
mref_a->output = output;
|
||||||
mref->ref_flags = 0;
|
mref->ref_flags = 0;
|
||||||
mref_a->shadow_ref = mref_a; // cyclic self-reference => indicates master shadow
|
mref_a->shadow_ref = mref_a; // cyclic self-reference => indicates master shadow
|
||||||
atomic_inc(&mref->ref_count);
|
#ifdef WEG
|
||||||
|
// get an extra internal reference to itself
|
||||||
|
atomic_inc(&mref->ref_count); // is compensated by master transition in __trans_logger_ref_put()
|
||||||
atomic_inc(&output->inner_balance_count);
|
atomic_inc(&output->inner_balance_count);
|
||||||
|
#endif
|
||||||
|
|
||||||
get_lamport(&mref_a->stamp);
|
get_lamport(&mref_a->stamp);
|
||||||
#if 1
|
#if 1
|
||||||
if (unlikely(mref->ref_len <= 0)) {
|
if (unlikely(mref->ref_len <= 0)) {
|
||||||
@ -601,6 +620,9 @@ int _write_ref_get(struct trans_logger_output *output, struct trans_logger_mref_
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
atomic_inc(&mref->ref_count); // must be paired with __trans_logger_ref_put()
|
||||||
|
atomic_inc(&output->inner_balance_count);
|
||||||
|
|
||||||
atomic_inc(&output->mshadow_count);
|
atomic_inc(&output->mshadow_count);
|
||||||
atomic_inc(&output->total_mshadow_count);
|
atomic_inc(&output->total_mshadow_count);
|
||||||
atomic_inc(&global_mshadow_count);
|
atomic_inc(&global_mshadow_count);
|
||||||
@ -667,7 +689,7 @@ restart:
|
|||||||
|
|
||||||
CHECK_PTR(output, err);
|
CHECK_PTR(output, err);
|
||||||
|
|
||||||
// are we a shadow?
|
// are we a shadow (whether master or slave)?
|
||||||
shadow_a = mref_a->shadow_ref;
|
shadow_a = mref_a->shadow_ref;
|
||||||
if (shadow_a) {
|
if (shadow_a) {
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -690,10 +712,12 @@ restart:
|
|||||||
CHECK_HEAD_EMPTY(&mref_a->collect_head);
|
CHECK_HEAD_EMPTY(&mref_a->collect_head);
|
||||||
CHECK_HEAD_EMPTY(&mref_a->sub_list);
|
CHECK_HEAD_EMPTY(&mref_a->sub_list);
|
||||||
CHECK_HEAD_EMPTY(&mref_a->sub_head);
|
CHECK_HEAD_EMPTY(&mref_a->sub_head);
|
||||||
#if 1 // FIXME: do bookkeping here
|
#ifdef WEG // FIXME: do bookkeping here
|
||||||
traced_lock(&output->brick->pos_lock, flags);
|
traced_lock(&output->brick->pos_lock, flags);
|
||||||
list_del_init(&mref_a->pos_head);
|
list_del_init(&mref_a->pos_head);
|
||||||
traced_unlock(&output->brick->pos_lock, flags);
|
traced_unlock(&output->brick->pos_lock, flags);
|
||||||
|
#else
|
||||||
|
CHECK_HEAD_EMPTY(&mref_a->pos_head);
|
||||||
#endif
|
#endif
|
||||||
if (shadow_a != mref_a) { // we are a slave shadow
|
if (shadow_a != mref_a) { // we are a slave shadow
|
||||||
//MARS_DBG("slave\n");
|
//MARS_DBG("slave\n");
|
||||||
@ -816,7 +840,7 @@ void trans_logger_ref_io(struct trans_logger_output *output, struct mref_object
|
|||||||
CHECK_HEAD_EMPTY(&mref_a->q_head);
|
CHECK_HEAD_EMPTY(&mref_a->q_head);
|
||||||
CHECK_HEAD_EMPTY(&mref_a->pos_head);
|
CHECK_HEAD_EMPTY(&mref_a->pos_head);
|
||||||
#endif
|
#endif
|
||||||
atomic_inc(&mref->ref_count);
|
atomic_inc(&mref->ref_count); // must be paired with __trans_logger_ref_put()
|
||||||
atomic_inc(&output->inner_balance_count);
|
atomic_inc(&output->inner_balance_count);
|
||||||
|
|
||||||
q_insert(&output->q_phase1, mref_a);
|
q_insert(&output->q_phase1, mref_a);
|
||||||
@ -1089,8 +1113,10 @@ void phase1_endio(void *private, int error)
|
|||||||
orig_cb->cb_fn(orig_cb);
|
orig_cb->cb_fn(orig_cb);
|
||||||
|
|
||||||
// queue up for the next phase
|
// queue up for the next phase
|
||||||
|
#ifdef WEG
|
||||||
atomic_inc(&orig_mref->ref_count); // must be paired with __trans_logger_ref_put()
|
atomic_inc(&orig_mref->ref_count); // must be paired with __trans_logger_ref_put()
|
||||||
atomic_inc(&output->inner_balance_count);
|
atomic_inc(&output->inner_balance_count);
|
||||||
|
#endif
|
||||||
q_insert(&output->q_phase2, orig_mref_a);
|
q_insert(&output->q_phase2, orig_mref_a);
|
||||||
wake_up_interruptible(&output->event);
|
wake_up_interruptible(&output->event);
|
||||||
return;
|
return;
|
||||||
@ -1318,8 +1344,10 @@ bool phase2_startio(struct trans_logger_mref_aspect *orig_mref_a)
|
|||||||
fire_writeback(wb, &wb->w_sub_write_list);
|
fire_writeback(wb, &wb->w_sub_write_list);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
#ifdef WEG
|
||||||
#ifdef CLEAN_ALL
|
#ifdef CLEAN_ALL
|
||||||
__trans_logger_ref_put(orig_mref_a->output, orig_mref_a);
|
__trans_logger_ref_put(orig_mref_a->output, orig_mref_a);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -84,7 +84,6 @@ struct trans_logger_mref_aspect {
|
|||||||
struct generic_callback cb;
|
struct generic_callback cb;
|
||||||
struct trans_logger_mref_aspect *orig_mref_a;
|
struct trans_logger_mref_aspect *orig_mref_a;
|
||||||
struct writeback_info *wb;
|
struct writeback_info *wb;
|
||||||
//struct trans_logger_mref_aspect *base_mref_a;
|
|
||||||
struct list_head sub_list;
|
struct list_head sub_list;
|
||||||
struct list_head sub_head;
|
struct list_head sub_head;
|
||||||
int total_sub_count;
|
int total_sub_count;
|
||||||
|
Loading…
Reference in New Issue
Block a user