Commit ee57aba1 authored by Jan Kara's avatar Jan Kara Committed by Theodore Ts'o

jbd2: simplify code flow in do_get_write_access()

needs_copy is set only in one place in do_get_write_access(), just move
the frozen buffer copying into that place and factor it out to a
separate function to make do_get_write_access() slightly more readable.
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent b4ab9e29
...@@ -755,6 +755,30 @@ static void warn_dirty_buffer(struct buffer_head *bh) ...@@ -755,6 +755,30 @@ static void warn_dirty_buffer(struct buffer_head *bh)
bdevname(bh->b_bdev, b), (unsigned long long)bh->b_blocknr); bdevname(bh->b_bdev, b), (unsigned long long)bh->b_blocknr);
} }
/* Call t_frozen trigger and copy buffer data into jh->b_frozen_data. */
static void jbd2_freeze_jh_data(struct journal_head *jh)
{
struct page *page;
int offset;
char *source;
struct buffer_head *bh = jh2bh(jh);
J_EXPECT_JH(jh, buffer_uptodate(bh), "Possible IO failure.\n");
page = bh->b_page;
offset = offset_in_page(bh->b_data);
source = kmap_atomic(page);
/* Fire data frozen trigger just before we copy the data */
jbd2_buffer_frozen_trigger(jh, source + offset, jh->b_triggers);
memcpy(jh->b_frozen_data, source + offset, bh->b_size);
kunmap_atomic(source);
/*
* Now that the frozen data is saved off, we need to store any matching
* triggers.
*/
jh->b_frozen_triggers = jh->b_triggers;
}
/* /*
* If the buffer is already part of the current transaction, then there * If the buffer is already part of the current transaction, then there
* is nothing we need to do. If it is already part of a prior * is nothing we need to do. If it is already part of a prior
...@@ -774,7 +798,6 @@ do_get_write_access(handle_t *handle, struct journal_head *jh, ...@@ -774,7 +798,6 @@ do_get_write_access(handle_t *handle, struct journal_head *jh,
journal_t *journal; journal_t *journal;
int error; int error;
char *frozen_buffer = NULL; char *frozen_buffer = NULL;
int need_copy = 0;
unsigned long start_lock, time_lock; unsigned long start_lock, time_lock;
if (is_handle_aborted(handle)) if (is_handle_aborted(handle))
...@@ -931,7 +954,7 @@ do_get_write_access(handle_t *handle, struct journal_head *jh, ...@@ -931,7 +954,7 @@ do_get_write_access(handle_t *handle, struct journal_head *jh,
} }
jh->b_frozen_data = frozen_buffer; jh->b_frozen_data = frozen_buffer;
frozen_buffer = NULL; frozen_buffer = NULL;
need_copy = 1; jbd2_freeze_jh_data(jh);
} }
jh->b_next_transaction = transaction; jh->b_next_transaction = transaction;
} }
...@@ -952,28 +975,6 @@ do_get_write_access(handle_t *handle, struct journal_head *jh, ...@@ -952,28 +975,6 @@ do_get_write_access(handle_t *handle, struct journal_head *jh,
} }
done: done:
if (need_copy) {
struct page *page;
int offset;
char *source;
J_EXPECT_JH(jh, buffer_uptodate(jh2bh(jh)),
"Possible IO failure.\n");
page = jh2bh(jh)->b_page;
offset = offset_in_page(jh2bh(jh)->b_data);
source = kmap_atomic(page);
/* Fire data frozen trigger just before we copy the data */
jbd2_buffer_frozen_trigger(jh, source + offset,
jh->b_triggers);
memcpy(jh->b_frozen_data, source+offset, jh2bh(jh)->b_size);
kunmap_atomic(source);
/*
* Now that the frozen data is saved off, we need to store
* any matching triggers.
*/
jh->b_frozen_triggers = jh->b_triggers;
}
jbd_unlock_bh_state(bh); jbd_unlock_bh_state(bh);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment