Commit 13723d00 authored by Joel Becker's avatar Joel Becker Committed by Mark Fasheh

ocfs2: Use metadata-specific ocfs2_journal_access_*() functions.

The per-metadata-type ocfs2_journal_access_*() functions hook up jbd2
commit triggers and allow us to compute metadata ecc right before the
buffers are written out.  This commit provides ecc for inodes, extent
blocks, group descriptors, and quota blocks.  It is not safe to use
extened attributes and metaecc at the same time yet.

The ocfs2_extent_tree and ocfs2_path abstractions in alloc.c both hide
the type of block at their root.  Before, it didn't matter, but now the
root block must use the appropriate ocfs2_journal_access_*() function.
To keep this abstract, the structures now have a pointer to the matching
journal_access function and a wrapper call to call it.

A few places use naked ocfs2_write_block() calls instead of adding the
blocks to the journal.  We make sure to calculate their checksum and ecc
before the write.

Since we pass around the journal_access functions.  Let's typedef them
in ocfs2.h.
Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent ffdd7a54
This diff is collapsed.
...@@ -45,7 +45,9 @@ ...@@ -45,7 +45,9 @@
* *
* ocfs2_extent_tree contains info for the root of the b-tree, it must have a * ocfs2_extent_tree contains info for the root of the b-tree, it must have a
* root ocfs2_extent_list and a root_bh so that they can be used in the b-tree * root ocfs2_extent_list and a root_bh so that they can be used in the b-tree
* functions. * functions. With metadata ecc, we now call different journal_access
* functions for each type of metadata, so it must have the
* root_journal_access function.
* ocfs2_extent_tree_operations abstract the normal operations we do for * ocfs2_extent_tree_operations abstract the normal operations we do for
* the root of extent b-tree. * the root of extent b-tree.
*/ */
...@@ -54,6 +56,7 @@ struct ocfs2_extent_tree { ...@@ -54,6 +56,7 @@ struct ocfs2_extent_tree {
struct ocfs2_extent_tree_operations *et_ops; struct ocfs2_extent_tree_operations *et_ops;
struct buffer_head *et_root_bh; struct buffer_head *et_root_bh;
struct ocfs2_extent_list *et_root_el; struct ocfs2_extent_list *et_root_el;
ocfs2_journal_access_func et_root_journal_access;
void *et_object; void *et_object;
unsigned int et_max_leaf_clusters; unsigned int et_max_leaf_clusters;
}; };
......
...@@ -1512,7 +1512,7 @@ static int ocfs2_write_begin_inline(struct address_space *mapping, ...@@ -1512,7 +1512,7 @@ static int ocfs2_write_begin_inline(struct address_space *mapping,
goto out; goto out;
} }
ret = ocfs2_journal_access(handle, inode, wc->w_di_bh, ret = ocfs2_journal_access_di(handle, inode, wc->w_di_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret) { if (ret) {
ocfs2_commit_trans(osb, handle); ocfs2_commit_trans(osb, handle);
...@@ -1740,7 +1740,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, ...@@ -1740,7 +1740,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping,
* We don't want this to fail in ocfs2_write_end(), so do it * We don't want this to fail in ocfs2_write_end(), so do it
* here. * here.
*/ */
ret = ocfs2_journal_access(handle, inode, wc->w_di_bh, ret = ocfs2_journal_access_di(handle, inode, wc->w_di_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret) { if (ret) {
mlog_errno(ret); mlog_errno(ret);
......
...@@ -378,14 +378,18 @@ int ocfs2_update_entry(struct inode *dir, handle_t *handle, ...@@ -378,14 +378,18 @@ int ocfs2_update_entry(struct inode *dir, handle_t *handle,
struct inode *new_entry_inode) struct inode *new_entry_inode)
{ {
int ret; int ret;
ocfs2_journal_access_func access = ocfs2_journal_access_db;
/* /*
* The same code works fine for both inline-data and extent * The same code works fine for both inline-data and extent
* based directories, so no need to split this up. * based directories, so no need to split this up. The only
* difference is the journal_access function.
*/ */
ret = ocfs2_journal_access(handle, dir, de_bh, if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
OCFS2_JOURNAL_ACCESS_WRITE); access = ocfs2_journal_access_di;
ret = access(handle, dir, de_bh, OCFS2_JOURNAL_ACCESS_WRITE);
if (ret) { if (ret) {
mlog_errno(ret); mlog_errno(ret);
goto out; goto out;
...@@ -407,9 +411,13 @@ static int __ocfs2_delete_entry(handle_t *handle, struct inode *dir, ...@@ -407,9 +411,13 @@ static int __ocfs2_delete_entry(handle_t *handle, struct inode *dir,
{ {
struct ocfs2_dir_entry *de, *pde; struct ocfs2_dir_entry *de, *pde;
int i, status = -ENOENT; int i, status = -ENOENT;
ocfs2_journal_access_func access = ocfs2_journal_access_db;
mlog_entry("(0x%p, 0x%p, 0x%p, 0x%p)\n", handle, dir, de_del, bh); mlog_entry("(0x%p, 0x%p, 0x%p, 0x%p)\n", handle, dir, de_del, bh);
if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
access = ocfs2_journal_access_di;
i = 0; i = 0;
pde = NULL; pde = NULL;
de = (struct ocfs2_dir_entry *) first_de; de = (struct ocfs2_dir_entry *) first_de;
...@@ -420,7 +428,7 @@ static int __ocfs2_delete_entry(handle_t *handle, struct inode *dir, ...@@ -420,7 +428,7 @@ static int __ocfs2_delete_entry(handle_t *handle, struct inode *dir,
goto bail; goto bail;
} }
if (de == de_del) { if (de == de_del) {
status = ocfs2_journal_access(handle, dir, bh, status = access(handle, dir, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
status = -EIO; status = -EIO;
...@@ -581,7 +589,13 @@ int __ocfs2_add_entry(handle_t *handle, ...@@ -581,7 +589,13 @@ int __ocfs2_add_entry(handle_t *handle,
goto bail; goto bail;
} }
status = ocfs2_journal_access(handle, dir, insert_bh, if (insert_bh == parent_fe_bh)
status = ocfs2_journal_access_di(handle, dir,
insert_bh,
OCFS2_JOURNAL_ACCESS_WRITE);
else
status = ocfs2_journal_access_db(handle, dir,
insert_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
/* By now the buffer is marked for journaling */ /* By now the buffer is marked for journaling */
offset += le16_to_cpu(de->rec_len); offset += le16_to_cpu(de->rec_len);
...@@ -1081,7 +1095,7 @@ static int ocfs2_fill_new_dir_id(struct ocfs2_super *osb, ...@@ -1081,7 +1095,7 @@ static int ocfs2_fill_new_dir_id(struct ocfs2_super *osb,
struct ocfs2_inline_data *data = &di->id2.i_data; struct ocfs2_inline_data *data = &di->id2.i_data;
unsigned int size = le16_to_cpu(data->id_count); unsigned int size = le16_to_cpu(data->id_count);
ret = ocfs2_journal_access(handle, inode, di_bh, ret = ocfs2_journal_access_di(handle, inode, di_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret) { if (ret) {
mlog_errno(ret); mlog_errno(ret);
...@@ -1129,7 +1143,7 @@ static int ocfs2_fill_new_dir_el(struct ocfs2_super *osb, ...@@ -1129,7 +1143,7 @@ static int ocfs2_fill_new_dir_el(struct ocfs2_super *osb,
ocfs2_set_new_buffer_uptodate(inode, new_bh); ocfs2_set_new_buffer_uptodate(inode, new_bh);
status = ocfs2_journal_access(handle, inode, new_bh, status = ocfs2_journal_access_db(handle, inode, new_bh,
OCFS2_JOURNAL_ACCESS_CREATE); OCFS2_JOURNAL_ACCESS_CREATE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1292,7 +1306,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, ...@@ -1292,7 +1306,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh,
ocfs2_set_new_buffer_uptodate(dir, dirdata_bh); ocfs2_set_new_buffer_uptodate(dir, dirdata_bh);
ret = ocfs2_journal_access(handle, dir, dirdata_bh, ret = ocfs2_journal_access_db(handle, dir, dirdata_bh,
OCFS2_JOURNAL_ACCESS_CREATE); OCFS2_JOURNAL_ACCESS_CREATE);
if (ret) { if (ret) {
mlog_errno(ret); mlog_errno(ret);
...@@ -1319,7 +1333,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, ...@@ -1319,7 +1333,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh,
* We let the later dirent insert modify c/mtime - to the user * We let the later dirent insert modify c/mtime - to the user
* the data hasn't changed. * the data hasn't changed.
*/ */
ret = ocfs2_journal_access(handle, dir, di_bh, ret = ocfs2_journal_access_di(handle, dir, di_bh,
OCFS2_JOURNAL_ACCESS_CREATE); OCFS2_JOURNAL_ACCESS_CREATE);
if (ret) { if (ret) {
mlog_errno(ret); mlog_errno(ret);
...@@ -1583,7 +1597,7 @@ do_extend: ...@@ -1583,7 +1597,7 @@ do_extend:
ocfs2_set_new_buffer_uptodate(dir, new_bh); ocfs2_set_new_buffer_uptodate(dir, new_bh);
status = ocfs2_journal_access(handle, dir, new_bh, status = ocfs2_journal_access_db(handle, dir, new_bh,
OCFS2_JOURNAL_ACCESS_CREATE); OCFS2_JOURNAL_ACCESS_CREATE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
......
...@@ -256,7 +256,7 @@ int ocfs2_update_inode_atime(struct inode *inode, ...@@ -256,7 +256,7 @@ int ocfs2_update_inode_atime(struct inode *inode,
goto out; goto out;
} }
ret = ocfs2_journal_access(handle, inode, bh, ret = ocfs2_journal_access_di(handle, inode, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret) { if (ret) {
mlog_errno(ret); mlog_errno(ret);
...@@ -353,7 +353,7 @@ static int ocfs2_orphan_for_truncate(struct ocfs2_super *osb, ...@@ -353,7 +353,7 @@ static int ocfs2_orphan_for_truncate(struct ocfs2_super *osb,
goto out; goto out;
} }
status = ocfs2_journal_access(handle, inode, fe_bh, status = ocfs2_journal_access_di(handle, inode, fe_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -590,7 +590,7 @@ restarted_transaction: ...@@ -590,7 +590,7 @@ restarted_transaction:
/* reserve a write to the file entry early on - that we if we /* reserve a write to the file entry early on - that we if we
* run out of credits in the allocation path, we can still * run out of credits in the allocation path, we can still
* update i_size. */ * update i_size. */
status = ocfs2_journal_access(handle, inode, bh, status = ocfs2_journal_access_di(handle, inode, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1121,7 +1121,7 @@ static int __ocfs2_write_remove_suid(struct inode *inode, ...@@ -1121,7 +1121,7 @@ static int __ocfs2_write_remove_suid(struct inode *inode,
goto out; goto out;
} }
ret = ocfs2_journal_access(handle, inode, bh, ret = ocfs2_journal_access_di(handle, inode, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret < 0) { if (ret < 0) {
mlog_errno(ret); mlog_errno(ret);
......
...@@ -537,7 +537,7 @@ static int ocfs2_truncate_for_delete(struct ocfs2_super *osb, ...@@ -537,7 +537,7 @@ static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
goto out; goto out;
} }
status = ocfs2_journal_access(handle, inode, fe_bh, status = ocfs2_journal_access_di(handle, inode, fe_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -621,7 +621,7 @@ static int ocfs2_remove_inode(struct inode *inode, ...@@ -621,7 +621,7 @@ static int ocfs2_remove_inode(struct inode *inode,
} }
/* set the inodes dtime */ /* set the inodes dtime */
status = ocfs2_journal_access(handle, inode, di_bh, status = ocfs2_journal_access_di(handle, inode, di_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1190,7 +1190,7 @@ int ocfs2_mark_inode_dirty(handle_t *handle, ...@@ -1190,7 +1190,7 @@ int ocfs2_mark_inode_dirty(handle_t *handle,
mlog_entry("(inode %llu)\n", mlog_entry("(inode %llu)\n",
(unsigned long long)OCFS2_I(inode)->ip_blkno); (unsigned long long)OCFS2_I(inode)->ip_blkno);
status = ocfs2_journal_access(handle, inode, bh, status = ocfs2_journal_access_di(handle, inode, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1277,8 +1277,11 @@ int ocfs2_validate_inode_block(struct super_block *sb, ...@@ -1277,8 +1277,11 @@ int ocfs2_validate_inode_block(struct super_block *sb,
* local to this block. * local to this block.
*/ */
rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &di->i_check); rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &di->i_check);
if (rc) if (rc) {
mlog(ML_ERROR, "Checksum failed for dinode %llu\n",
(unsigned long long)bh->b_blocknr);
goto bail; goto bail;
}
/* /*
* Errors after here are fatal. * Errors after here are fatal.
......
...@@ -752,6 +752,7 @@ static int ocfs2_journal_toggle_dirty(struct ocfs2_super *osb, ...@@ -752,6 +752,7 @@ static int ocfs2_journal_toggle_dirty(struct ocfs2_super *osb,
if (replayed) if (replayed)
ocfs2_bump_recovery_generation(fe); ocfs2_bump_recovery_generation(fe);
ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &fe->i_check);
status = ocfs2_write_block(osb, bh, journal->j_inode); status = ocfs2_write_block(osb, bh, journal->j_inode);
if (status < 0) if (status < 0)
mlog_errno(status); mlog_errno(status);
...@@ -1486,6 +1487,7 @@ static int ocfs2_replay_journal(struct ocfs2_super *osb, ...@@ -1486,6 +1487,7 @@ static int ocfs2_replay_journal(struct ocfs2_super *osb,
osb->slot_recovery_generations[slot_num] = osb->slot_recovery_generations[slot_num] =
ocfs2_get_recovery_generation(fe); ocfs2_get_recovery_generation(fe);
ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &fe->i_check);
status = ocfs2_write_block(osb, bh, inode); status = ocfs2_write_block(osb, bh, inode);
if (status < 0) if (status < 0)
mlog_errno(status); mlog_errno(status);
......
...@@ -247,6 +247,7 @@ int ocfs2_extend_trans(handle_t *handle, int nblocks); ...@@ -247,6 +247,7 @@ int ocfs2_extend_trans(handle_t *handle, int nblocks);
#define OCFS2_JOURNAL_ACCESS_WRITE 1 #define OCFS2_JOURNAL_ACCESS_WRITE 1
#define OCFS2_JOURNAL_ACCESS_UNDO 2 #define OCFS2_JOURNAL_ACCESS_UNDO 2
/* ocfs2_inode */ /* ocfs2_inode */
int ocfs2_journal_access_di(handle_t *handle, struct inode *inode, int ocfs2_journal_access_di(handle_t *handle, struct inode *inode,
struct buffer_head *bh, int type); struct buffer_head *bh, int type);
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include "ocfs2.h" #include "ocfs2.h"
#include "alloc.h" #include "alloc.h"
#include "blockcheck.h"
#include "dlmglue.h" #include "dlmglue.h"
#include "inode.h" #include "inode.h"
#include "journal.h" #include "journal.h"
...@@ -382,7 +383,7 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) ...@@ -382,7 +383,7 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb)
} }
memcpy(alloc_copy, alloc, bh->b_size); memcpy(alloc_copy, alloc, bh->b_size);
status = ocfs2_journal_access(handle, local_alloc_inode, bh, status = ocfs2_journal_access_di(handle, local_alloc_inode, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -476,6 +477,7 @@ int ocfs2_begin_local_alloc_recovery(struct ocfs2_super *osb, ...@@ -476,6 +477,7 @@ int ocfs2_begin_local_alloc_recovery(struct ocfs2_super *osb,
alloc = (struct ocfs2_dinode *) alloc_bh->b_data; alloc = (struct ocfs2_dinode *) alloc_bh->b_data;
ocfs2_clear_local_alloc(alloc); ocfs2_clear_local_alloc(alloc);
ocfs2_compute_meta_ecc(osb->sb, alloc_bh->b_data, &alloc->i_check);
status = ocfs2_write_block(osb, alloc_bh, inode); status = ocfs2_write_block(osb, alloc_bh, inode);
if (status < 0) if (status < 0)
mlog_errno(status); mlog_errno(status);
...@@ -762,7 +764,7 @@ int ocfs2_claim_local_alloc_bits(struct ocfs2_super *osb, ...@@ -762,7 +764,7 @@ int ocfs2_claim_local_alloc_bits(struct ocfs2_super *osb,
* delete bits from it! */ * delete bits from it! */
*num_bits = bits_wanted; *num_bits = bits_wanted;
status = ocfs2_journal_access(handle, local_alloc_inode, status = ocfs2_journal_access_di(handle, local_alloc_inode,
osb->local_alloc_bh, osb->local_alloc_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
...@@ -1240,7 +1242,7 @@ static int ocfs2_local_alloc_slide_window(struct ocfs2_super *osb, ...@@ -1240,7 +1242,7 @@ static int ocfs2_local_alloc_slide_window(struct ocfs2_super *osb,
} }
memcpy(alloc_copy, alloc, osb->local_alloc_bh->b_size); memcpy(alloc_copy, alloc, osb->local_alloc_bh->b_size);
status = ocfs2_journal_access(handle, local_alloc_inode, status = ocfs2_journal_access_di(handle, local_alloc_inode,
osb->local_alloc_bh, osb->local_alloc_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
......
...@@ -361,7 +361,7 @@ static int ocfs2_mknod(struct inode *dir, ...@@ -361,7 +361,7 @@ static int ocfs2_mknod(struct inode *dir,
goto leave; goto leave;
} }
status = ocfs2_journal_access(handle, dir, parent_fe_bh, status = ocfs2_journal_access_di(handle, dir, parent_fe_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -493,7 +493,7 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb, ...@@ -493,7 +493,7 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb,
} }
ocfs2_set_new_buffer_uptodate(inode, *new_fe_bh); ocfs2_set_new_buffer_uptodate(inode, *new_fe_bh);
status = ocfs2_journal_access(handle, inode, *new_fe_bh, status = ocfs2_journal_access_di(handle, inode, *new_fe_bh,
OCFS2_JOURNAL_ACCESS_CREATE); OCFS2_JOURNAL_ACCESS_CREATE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -664,7 +664,7 @@ static int ocfs2_link(struct dentry *old_dentry, ...@@ -664,7 +664,7 @@ static int ocfs2_link(struct dentry *old_dentry,
goto out_unlock_inode; goto out_unlock_inode;
} }
err = ocfs2_journal_access(handle, inode, fe_bh, err = ocfs2_journal_access_di(handle, inode, fe_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (err < 0) { if (err < 0) {
mlog_errno(err); mlog_errno(err);
...@@ -851,7 +851,7 @@ static int ocfs2_unlink(struct inode *dir, ...@@ -851,7 +851,7 @@ static int ocfs2_unlink(struct inode *dir,
goto leave; goto leave;
} }
status = ocfs2_journal_access(handle, inode, fe_bh, status = ocfs2_journal_access_di(handle, inode, fe_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1265,7 +1265,7 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1265,7 +1265,7 @@ static int ocfs2_rename(struct inode *old_dir,
goto bail; goto bail;
} }
} }
status = ocfs2_journal_access(handle, new_inode, newfe_bh, status = ocfs2_journal_access_di(handle, new_inode, newfe_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1312,7 +1312,7 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1312,7 +1312,7 @@ static int ocfs2_rename(struct inode *old_dir,
old_inode->i_ctime = CURRENT_TIME; old_inode->i_ctime = CURRENT_TIME;
mark_inode_dirty(old_inode); mark_inode_dirty(old_inode);
status = ocfs2_journal_access(handle, old_inode, old_inode_bh, status = ocfs2_journal_access_di(handle, old_inode, old_inode_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status >= 0) { if (status >= 0) {
old_di = (struct ocfs2_dinode *) old_inode_bh->b_data; old_di = (struct ocfs2_dinode *) old_inode_bh->b_data;
...@@ -1389,7 +1389,7 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1389,7 +1389,7 @@ static int ocfs2_rename(struct inode *old_dir,
(int)old_dir_nlink, old_dir->i_nlink); (int)old_dir_nlink, old_dir->i_nlink);
} else { } else {
struct ocfs2_dinode *fe; struct ocfs2_dinode *fe;
status = ocfs2_journal_access(handle, old_dir, status = ocfs2_journal_access_di(handle, old_dir,
old_dir_bh, old_dir_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
fe = (struct ocfs2_dinode *) old_dir_bh->b_data; fe = (struct ocfs2_dinode *) old_dir_bh->b_data;
...@@ -1898,7 +1898,7 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb, ...@@ -1898,7 +1898,7 @@ static int ocfs2_orphan_add(struct ocfs2_super *osb,
goto leave; goto leave;
} }
status = ocfs2_journal_access(handle, orphan_dir_inode, orphan_dir_bh, status = ocfs2_journal_access_di(handle, orphan_dir_inode, orphan_dir_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1986,7 +1986,7 @@ int ocfs2_orphan_del(struct ocfs2_super *osb, ...@@ -1986,7 +1986,7 @@ int ocfs2_orphan_del(struct ocfs2_super *osb,
goto leave; goto leave;
} }
status = ocfs2_journal_access(handle,orphan_dir_inode, orphan_dir_bh, status = ocfs2_journal_access_di(handle,orphan_dir_inode, orphan_dir_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
......
...@@ -339,6 +339,10 @@ struct ocfs2_super ...@@ -339,6 +339,10 @@ struct ocfs2_super
#define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info) #define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info)
/* Useful typedef for passing around journal access functions */
typedef int (*ocfs2_journal_access_func)(handle_t *handle, struct inode *inode,
struct buffer_head *bh, int type);
static inline int ocfs2_should_order_data(struct inode *inode) static inline int ocfs2_should_order_data(struct inode *inode)
{ {
if (!S_ISREG(inode->i_mode)) if (!S_ISREG(inode->i_mode))
......
...@@ -244,7 +244,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type, ...@@ -244,7 +244,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type,
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
unlock_buffer(bh); unlock_buffer(bh);
ocfs2_set_buffer_uptodate(gqinode, bh); ocfs2_set_buffer_uptodate(gqinode, bh);
err = ocfs2_journal_access(handle, gqinode, bh, ja_type); err = ocfs2_journal_access_dq(handle, gqinode, bh, ja_type);
if (err < 0) { if (err < 0) {
brelse(bh); brelse(bh);
goto out; goto out;
......
...@@ -106,7 +106,7 @@ static int ocfs2_modify_bh(struct inode *inode, struct buffer_head *bh, ...@@ -106,7 +106,7 @@ static int ocfs2_modify_bh(struct inode *inode, struct buffer_head *bh,
mlog_errno(status); mlog_errno(status);
return status; return status;
} }
status = ocfs2_journal_access(handle, inode, bh, status = ocfs2_journal_access_dq(handle, inode, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -506,7 +506,7 @@ static int ocfs2_recover_local_quota_file(struct inode *lqinode, ...@@ -506,7 +506,7 @@ static int ocfs2_recover_local_quota_file(struct inode *lqinode,
goto out_commit; goto out_commit;
} }
/* Release local quota file entry */ /* Release local quota file entry */
status = ocfs2_journal_access(handle, lqinode, status = ocfs2_journal_access_dq(handle, lqinode,
qbh, OCFS2_JOURNAL_ACCESS_WRITE); qbh, OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -614,7 +614,7 @@ int ocfs2_finish_quota_recovery(struct ocfs2_super *osb, ...@@ -614,7 +614,7 @@ int ocfs2_finish_quota_recovery(struct ocfs2_super *osb,
mlog_errno(status); mlog_errno(status);
goto out_bh; goto out_bh;
} }
status = ocfs2_journal_access(handle, lqinode, bh, status = ocfs2_journal_access_dq(handle, lqinode, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -981,7 +981,7 @@ static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk( ...@@ -981,7 +981,7 @@ static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk(
goto out; goto out;
} }
status = ocfs2_journal_access(handle, lqinode, bh, status = ocfs2_journal_access_dq(handle, lqinode, bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1074,7 +1074,7 @@ static struct ocfs2_quota_chunk *ocfs2_extend_local_quota_file( ...@@ -1074,7 +1074,7 @@ static struct ocfs2_quota_chunk *ocfs2_extend_local_quota_file(
mlog_errno(status); mlog_errno(status);
goto out; goto out;
} }
status = ocfs2_journal_access(handle, lqinode, chunk->qc_headerbh, status = ocfs2_journal_access_dq(handle, lqinode, chunk->qc_headerbh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1207,7 +1207,7 @@ static int ocfs2_local_release_dquot(struct dquot *dquot) ...@@ -1207,7 +1207,7 @@ static int ocfs2_local_release_dquot(struct dquot *dquot)
goto out; goto out;
} }
status = ocfs2_journal_access(handle, sb_dqopt(sb)->files[type], status = ocfs2_journal_access_dq(handle, sb_dqopt(sb)->files[type],
od->dq_chunk->qc_headerbh, OCFS2_JOURNAL_ACCESS_WRITE); od->dq_chunk->qc_headerbh, OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
......
...@@ -106,7 +106,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle, ...@@ -106,7 +106,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle,
mlog_entry("(new_clusters=%d, first_new_cluster = %u)\n", mlog_entry("(new_clusters=%d, first_new_cluster = %u)\n",
new_clusters, first_new_cluster); new_clusters, first_new_cluster);
ret = ocfs2_journal_access(handle, bm_inode, group_bh, ret = ocfs2_journal_access_gd(handle, bm_inode, group_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret < 0) { if (ret < 0) {
mlog_errno(ret); mlog_errno(ret);
...@@ -141,7 +141,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle, ...@@ -141,7 +141,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle,
} }
/* update the inode accordingly. */ /* update the inode accordingly. */
ret = ocfs2_journal_access(handle, bm_inode, bm_bh, ret = ocfs2_journal_access_di(handle, bm_inode, bm_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret < 0) { if (ret < 0) {
mlog_errno(ret); mlog_errno(ret);
...@@ -536,7 +536,7 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input) ...@@ -536,7 +536,7 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input)
cl = &fe->id2.i_chain; cl = &fe->id2.i_chain;
cr = &cl->cl_recs[input->chain]; cr = &cl->cl_recs[input->chain];
ret = ocfs2_journal_access(handle, main_bm_inode, group_bh, ret = ocfs2_journal_access_gd(handle, main_bm_inode, group_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret < 0) { if (ret < 0) {
mlog_errno(ret); mlog_errno(ret);
...@@ -552,7 +552,7 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input) ...@@ -552,7 +552,7 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input)
goto out_commit; goto out_commit;
} }
ret = ocfs2_journal_access(handle, main_bm_inode, main_bm_bh, ret = ocfs2_journal_access_di(handle, main_bm_inode, main_bm_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret < 0) { if (ret < 0) {
mlog_errno(ret); mlog_errno(ret);
......
...@@ -261,7 +261,11 @@ int ocfs2_check_group_descriptor(struct super_block *sb, ...@@ -261,7 +261,11 @@ int ocfs2_check_group_descriptor(struct super_block *sb,
* local to this block. * local to this block.
*/ */
rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &gd->bg_check); rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &gd->bg_check);
if (!rc) if (rc) {
mlog(ML_ERROR,
"Checksum failed for group descriptor %llu\n",
(unsigned long long)bh->b_blocknr);
} else
rc = ocfs2_validate_gd_self(sb, bh, 1); rc = ocfs2_validate_gd_self(sb, bh, 1);
if (!rc) if (!rc)
rc = ocfs2_validate_gd_parent(sb, di, bh, 1); rc = ocfs2_validate_gd_parent(sb, di, bh, 1);
...@@ -343,7 +347,7 @@ static int ocfs2_block_group_fill(handle_t *handle, ...@@ -343,7 +347,7 @@ static int ocfs2_block_group_fill(handle_t *handle,
goto bail; goto bail;
} }
status = ocfs2_journal_access(handle, status = ocfs2_journal_access_gd(handle,
alloc_inode, alloc_inode,
bg_bh, bg_bh,
OCFS2_JOURNAL_ACCESS_CREATE); OCFS2_JOURNAL_ACCESS_CREATE);
...@@ -476,7 +480,7 @@ static int ocfs2_block_group_alloc(struct ocfs2_super *osb, ...@@ -476,7 +480,7 @@ static int ocfs2_block_group_alloc(struct ocfs2_super *osb,
bg = (struct ocfs2_group_desc *) bg_bh->b_data; bg = (struct ocfs2_group_desc *) bg_bh->b_data;
status = ocfs2_journal_access(handle, alloc_inode, status = ocfs2_journal_access_di(handle, alloc_inode,
bh, OCFS2_JOURNAL_ACCESS_WRITE); bh, OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -986,7 +990,7 @@ static inline int ocfs2_block_group_set_bits(handle_t *handle, ...@@ -986,7 +990,7 @@ static inline int ocfs2_block_group_set_bits(handle_t *handle,
if (ocfs2_is_cluster_bitmap(alloc_inode)) if (ocfs2_is_cluster_bitmap(alloc_inode))
journal_type = OCFS2_JOURNAL_ACCESS_UNDO; journal_type = OCFS2_JOURNAL_ACCESS_UNDO;
status = ocfs2_journal_access(handle, status = ocfs2_journal_access_gd(handle,
alloc_inode, alloc_inode,
group_bh, group_bh,
journal_type); journal_type);
...@@ -1060,7 +1064,7 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -1060,7 +1064,7 @@ static int ocfs2_relink_block_group(handle_t *handle,
bg_ptr = le64_to_cpu(bg->bg_next_group); bg_ptr = le64_to_cpu(bg->bg_next_group);
prev_bg_ptr = le64_to_cpu(prev_bg->bg_next_group); prev_bg_ptr = le64_to_cpu(prev_bg->bg_next_group);
status = ocfs2_journal_access(handle, alloc_inode, prev_bg_bh, status = ocfs2_journal_access_gd(handle, alloc_inode, prev_bg_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1075,7 +1079,7 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -1075,7 +1079,7 @@ static int ocfs2_relink_block_group(handle_t *handle,
goto out_rollback; goto out_rollback;
} }
status = ocfs2_journal_access(handle, alloc_inode, bg_bh, status = ocfs2_journal_access_gd(handle, alloc_inode, bg_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1090,7 +1094,7 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -1090,7 +1094,7 @@ static int ocfs2_relink_block_group(handle_t *handle,
goto out_rollback; goto out_rollback;
} }
status = ocfs2_journal_access(handle, alloc_inode, fe_bh, status = ocfs2_journal_access_di(handle, alloc_inode, fe_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1242,7 +1246,7 @@ static int ocfs2_alloc_dinode_update_counts(struct inode *inode, ...@@ -1242,7 +1246,7 @@ static int ocfs2_alloc_dinode_update_counts(struct inode *inode,
struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data;
struct ocfs2_chain_list *cl = (struct ocfs2_chain_list *) &di->id2.i_chain; struct ocfs2_chain_list *cl = (struct ocfs2_chain_list *) &di->id2.i_chain;
ret = ocfs2_journal_access(handle, inode, di_bh, ret = ocfs2_journal_access_di(handle, inode, di_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (ret < 0) { if (ret < 0) {
mlog_errno(ret); mlog_errno(ret);
...@@ -1414,7 +1418,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, ...@@ -1414,7 +1418,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
/* Ok, claim our bits now: set the info on dinode, chainlist /* Ok, claim our bits now: set the info on dinode, chainlist
* and then the group */ * and then the group */
status = ocfs2_journal_access(handle, status = ocfs2_journal_access_di(handle,
alloc_inode, alloc_inode,
ac->ac_bh, ac->ac_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
...@@ -1824,7 +1828,7 @@ static inline int ocfs2_block_group_clear_bits(handle_t *handle, ...@@ -1824,7 +1828,7 @@ static inline int ocfs2_block_group_clear_bits(handle_t *handle,
if (ocfs2_is_cluster_bitmap(alloc_inode)) if (ocfs2_is_cluster_bitmap(alloc_inode))
journal_type = OCFS2_JOURNAL_ACCESS_UNDO; journal_type = OCFS2_JOURNAL_ACCESS_UNDO;
status = ocfs2_journal_access(handle, alloc_inode, group_bh, status = ocfs2_journal_access_gd(handle, alloc_inode, group_bh,
journal_type); journal_type);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
...@@ -1900,7 +1904,7 @@ int ocfs2_free_suballoc_bits(handle_t *handle, ...@@ -1900,7 +1904,7 @@ int ocfs2_free_suballoc_bits(handle_t *handle,
goto bail; goto bail;
} }
status = ocfs2_journal_access(handle, alloc_inode, alloc_bh, status = ocfs2_journal_access_di(handle, alloc_inode, alloc_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
......
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