|
@@ -954,9 +954,10 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
|
|
journal_t *journal = handle->h_transaction->t_journal;
|
|
journal_t *journal = handle->h_transaction->t_journal;
|
|
int need_brelse = 0;
|
|
int need_brelse = 0;
|
|
struct journal_head *jh;
|
|
struct journal_head *jh;
|
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (is_handle_aborted(handle))
|
|
if (is_handle_aborted(handle))
|
|
- return 0;
|
|
|
|
|
|
+ return ret;
|
|
|
|
|
|
jh = journal_add_journal_head(bh);
|
|
jh = journal_add_journal_head(bh);
|
|
JBUFFER_TRACE(jh, "entry");
|
|
JBUFFER_TRACE(jh, "entry");
|
|
@@ -1067,7 +1068,16 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
|
|
time if it is redirtied */
|
|
time if it is redirtied */
|
|
}
|
|
}
|
|
|
|
|
|
- /* journal_clean_data_list() may have got there first */
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We cannot remove the buffer with io error from the
|
|
|
|
+ * committing transaction, because otherwise it would
|
|
|
|
+ * miss the error and the commit would not abort.
|
|
|
|
+ */
|
|
|
|
+ if (unlikely(!buffer_uptodate(bh))) {
|
|
|
|
+ ret = -EIO;
|
|
|
|
+ goto no_journal;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (jh->b_transaction != NULL) {
|
|
if (jh->b_transaction != NULL) {
|
|
JBUFFER_TRACE(jh, "unfile from commit");
|
|
JBUFFER_TRACE(jh, "unfile from commit");
|
|
__journal_temp_unlink_buffer(jh);
|
|
__journal_temp_unlink_buffer(jh);
|
|
@@ -1108,7 +1118,7 @@ no_journal:
|
|
}
|
|
}
|
|
JBUFFER_TRACE(jh, "exit");
|
|
JBUFFER_TRACE(jh, "exit");
|
|
journal_put_journal_head(jh);
|
|
journal_put_journal_head(jh);
|
|
- return 0;
|
|
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|