ext4: Pass line number to ext4_journal_abort_handle()
This allows the error messages to include the line number Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
e29136f80e
commit
90c7201b97
|
@ -6,29 +6,29 @@
|
||||||
|
|
||||||
#include <trace/events/ext4.h>
|
#include <trace/events/ext4.h>
|
||||||
|
|
||||||
int __ext4_journal_get_undo_access(const char *where, handle_t *handle,
|
int __ext4_journal_get_undo_access(const char *where, unsigned int line,
|
||||||
struct buffer_head *bh)
|
handle_t *handle, struct buffer_head *bh)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (ext4_handle_valid(handle)) {
|
if (ext4_handle_valid(handle)) {
|
||||||
err = jbd2_journal_get_undo_access(handle, bh);
|
err = jbd2_journal_get_undo_access(handle, bh);
|
||||||
if (err)
|
if (err)
|
||||||
ext4_journal_abort_handle(where, __func__, bh,
|
ext4_journal_abort_handle(where, line, __func__, bh,
|
||||||
handle, err);
|
handle, err);
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __ext4_journal_get_write_access(const char *where, handle_t *handle,
|
int __ext4_journal_get_write_access(const char *where, unsigned int line,
|
||||||
struct buffer_head *bh)
|
handle_t *handle, struct buffer_head *bh)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (ext4_handle_valid(handle)) {
|
if (ext4_handle_valid(handle)) {
|
||||||
err = jbd2_journal_get_write_access(handle, bh);
|
err = jbd2_journal_get_write_access(handle, bh);
|
||||||
if (err)
|
if (err)
|
||||||
ext4_journal_abort_handle(where, __func__, bh,
|
ext4_journal_abort_handle(where, line, __func__, bh,
|
||||||
handle, err);
|
handle, err);
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
|
@ -46,9 +46,9 @@ int __ext4_journal_get_write_access(const char *where, handle_t *handle,
|
||||||
* If the handle isn't valid we're not journaling, but we still need to
|
* If the handle isn't valid we're not journaling, but we still need to
|
||||||
* call into ext4_journal_revoke() to put the buffer head.
|
* call into ext4_journal_revoke() to put the buffer head.
|
||||||
*/
|
*/
|
||||||
int __ext4_forget(const char *where, handle_t *handle, int is_metadata,
|
int __ext4_forget(const char *where, unsigned int line, handle_t *handle,
|
||||||
struct inode *inode, struct buffer_head *bh,
|
int is_metadata, struct inode *inode,
|
||||||
ext4_fsblk_t blocknr)
|
struct buffer_head *bh, ext4_fsblk_t blocknr)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -79,8 +79,8 @@ int __ext4_forget(const char *where, handle_t *handle, int is_metadata,
|
||||||
BUFFER_TRACE(bh, "call jbd2_journal_forget");
|
BUFFER_TRACE(bh, "call jbd2_journal_forget");
|
||||||
err = jbd2_journal_forget(handle, bh);
|
err = jbd2_journal_forget(handle, bh);
|
||||||
if (err)
|
if (err)
|
||||||
ext4_journal_abort_handle(where, __func__, bh,
|
ext4_journal_abort_handle(where, line, __func__,
|
||||||
handle, err);
|
bh, handle, err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -92,7 +92,8 @@ int __ext4_forget(const char *where, handle_t *handle, int is_metadata,
|
||||||
BUFFER_TRACE(bh, "call jbd2_journal_revoke");
|
BUFFER_TRACE(bh, "call jbd2_journal_revoke");
|
||||||
err = jbd2_journal_revoke(handle, blocknr, bh);
|
err = jbd2_journal_revoke(handle, blocknr, bh);
|
||||||
if (err) {
|
if (err) {
|
||||||
ext4_journal_abort_handle(where, __func__, bh, handle, err);
|
ext4_journal_abort_handle(where, line, __func__,
|
||||||
|
bh, handle, err);
|
||||||
__ext4_abort(inode->i_sb, where,
|
__ext4_abort(inode->i_sb, where,
|
||||||
"error %d when attempting revoke", err);
|
"error %d when attempting revoke", err);
|
||||||
}
|
}
|
||||||
|
@ -100,7 +101,7 @@ int __ext4_forget(const char *where, handle_t *handle, int is_metadata,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __ext4_journal_get_create_access(const char *where,
|
int __ext4_journal_get_create_access(const char *where, unsigned int line,
|
||||||
handle_t *handle, struct buffer_head *bh)
|
handle_t *handle, struct buffer_head *bh)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
@ -108,22 +109,23 @@ int __ext4_journal_get_create_access(const char *where,
|
||||||
if (ext4_handle_valid(handle)) {
|
if (ext4_handle_valid(handle)) {
|
||||||
err = jbd2_journal_get_create_access(handle, bh);
|
err = jbd2_journal_get_create_access(handle, bh);
|
||||||
if (err)
|
if (err)
|
||||||
ext4_journal_abort_handle(where, __func__, bh,
|
ext4_journal_abort_handle(where, line, __func__,
|
||||||
handle, err);
|
bh, handle, err);
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
|
int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
|
||||||
struct inode *inode, struct buffer_head *bh)
|
handle_t *handle, struct inode *inode,
|
||||||
|
struct buffer_head *bh)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (ext4_handle_valid(handle)) {
|
if (ext4_handle_valid(handle)) {
|
||||||
err = jbd2_journal_dirty_metadata(handle, bh);
|
err = jbd2_journal_dirty_metadata(handle, bh);
|
||||||
if (err)
|
if (err)
|
||||||
ext4_journal_abort_handle(where, __func__, bh,
|
ext4_journal_abort_handle(where, line, __func__,
|
||||||
handle, err);
|
bh, handle, err);
|
||||||
} else {
|
} else {
|
||||||
if (inode)
|
if (inode)
|
||||||
mark_buffer_dirty_inode(bh, inode);
|
mark_buffer_dirty_inode(bh, inode);
|
||||||
|
@ -144,8 +146,8 @@ int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __ext4_handle_dirty_super(const char *where, handle_t *handle,
|
int __ext4_handle_dirty_super(const char *where, unsigned int line,
|
||||||
struct super_block *sb)
|
handle_t *handle, struct super_block *sb)
|
||||||
{
|
{
|
||||||
struct buffer_head *bh = EXT4_SB(sb)->s_sbh;
|
struct buffer_head *bh = EXT4_SB(sb)->s_sbh;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
@ -153,8 +155,8 @@ int __ext4_handle_dirty_super(const char *where, handle_t *handle,
|
||||||
if (ext4_handle_valid(handle)) {
|
if (ext4_handle_valid(handle)) {
|
||||||
err = jbd2_journal_dirty_metadata(handle, bh);
|
err = jbd2_journal_dirty_metadata(handle, bh);
|
||||||
if (err)
|
if (err)
|
||||||
ext4_journal_abort_handle(where, __func__, bh,
|
ext4_journal_abort_handle(where, line, __func__,
|
||||||
handle, err);
|
bh, handle, err);
|
||||||
} else
|
} else
|
||||||
sb->s_dirt = 1;
|
sb->s_dirt = 1;
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -122,41 +122,44 @@ int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode);
|
||||||
/*
|
/*
|
||||||
* Wrapper functions with which ext4 calls into JBD.
|
* Wrapper functions with which ext4 calls into JBD.
|
||||||
*/
|
*/
|
||||||
void ext4_journal_abort_handle(const char *caller, const char *err_fn,
|
void ext4_journal_abort_handle(const char *caller, unsigned int line,
|
||||||
|
const char *err_fn,
|
||||||
struct buffer_head *bh, handle_t *handle, int err);
|
struct buffer_head *bh, handle_t *handle, int err);
|
||||||
|
|
||||||
int __ext4_journal_get_undo_access(const char *where, handle_t *handle,
|
int __ext4_journal_get_undo_access(const char *where, unsigned int line,
|
||||||
struct buffer_head *bh);
|
handle_t *handle, struct buffer_head *bh);
|
||||||
|
|
||||||
int __ext4_journal_get_write_access(const char *where, handle_t *handle,
|
int __ext4_journal_get_write_access(const char *where, unsigned int line,
|
||||||
struct buffer_head *bh);
|
handle_t *handle, struct buffer_head *bh);
|
||||||
|
|
||||||
int __ext4_forget(const char *where, handle_t *handle, int is_metadata,
|
int __ext4_forget(const char *where, unsigned int line, handle_t *handle,
|
||||||
struct inode *inode, struct buffer_head *bh,
|
int is_metadata, struct inode *inode,
|
||||||
ext4_fsblk_t blocknr);
|
struct buffer_head *bh, ext4_fsblk_t blocknr);
|
||||||
|
|
||||||
int __ext4_journal_get_create_access(const char *where,
|
int __ext4_journal_get_create_access(const char *where, unsigned int line,
|
||||||
handle_t *handle, struct buffer_head *bh);
|
handle_t *handle, struct buffer_head *bh);
|
||||||
|
|
||||||
int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
|
int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
|
||||||
struct inode *inode, struct buffer_head *bh);
|
handle_t *handle, struct inode *inode,
|
||||||
|
struct buffer_head *bh);
|
||||||
|
|
||||||
int __ext4_handle_dirty_super(const char *where, handle_t *handle,
|
int __ext4_handle_dirty_super(const char *where, unsigned int line,
|
||||||
struct super_block *sb);
|
handle_t *handle, struct super_block *sb);
|
||||||
|
|
||||||
#define ext4_journal_get_undo_access(handle, bh) \
|
#define ext4_journal_get_undo_access(handle, bh) \
|
||||||
__ext4_journal_get_undo_access(__func__, (handle), (bh))
|
__ext4_journal_get_undo_access(__func__, __LINE__, (handle), (bh))
|
||||||
#define ext4_journal_get_write_access(handle, bh) \
|
#define ext4_journal_get_write_access(handle, bh) \
|
||||||
__ext4_journal_get_write_access(__func__, (handle), (bh))
|
__ext4_journal_get_write_access(__func__, __LINE__, (handle), (bh))
|
||||||
#define ext4_forget(handle, is_metadata, inode, bh, block_nr) \
|
#define ext4_forget(handle, is_metadata, inode, bh, block_nr) \
|
||||||
__ext4_forget(__func__, (handle), (is_metadata), (inode), (bh),\
|
__ext4_forget(__func__, __LINE__, (handle), (is_metadata), (inode), \
|
||||||
(block_nr))
|
(bh), (block_nr))
|
||||||
#define ext4_journal_get_create_access(handle, bh) \
|
#define ext4_journal_get_create_access(handle, bh) \
|
||||||
__ext4_journal_get_create_access(__func__, (handle), (bh))
|
__ext4_journal_get_create_access(__func__, __LINE__, (handle), (bh))
|
||||||
#define ext4_handle_dirty_metadata(handle, inode, bh) \
|
#define ext4_handle_dirty_metadata(handle, inode, bh) \
|
||||||
__ext4_handle_dirty_metadata(__func__, (handle), (inode), (bh))
|
__ext4_handle_dirty_metadata(__func__, __LINE__, (handle), (inode), \
|
||||||
|
(bh))
|
||||||
#define ext4_handle_dirty_super(handle, sb) \
|
#define ext4_handle_dirty_super(handle, sb) \
|
||||||
__ext4_handle_dirty_super(__func__, (handle), (sb))
|
__ext4_handle_dirty_super(__func__, __LINE__, (handle), (sb))
|
||||||
|
|
||||||
handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks);
|
handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks);
|
||||||
int __ext4_journal_stop(const char *where, handle_t *handle);
|
int __ext4_journal_stop(const char *where, handle_t *handle);
|
||||||
|
|
|
@ -283,8 +283,9 @@ int __ext4_journal_stop(const char *where, handle_t *handle)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ext4_journal_abort_handle(const char *caller, const char *err_fn,
|
void ext4_journal_abort_handle(const char *caller, unsigned int line,
|
||||||
struct buffer_head *bh, handle_t *handle, int err)
|
const char *err_fn, struct buffer_head *bh,
|
||||||
|
handle_t *handle, int err)
|
||||||
{
|
{
|
||||||
char nbuf[16];
|
char nbuf[16];
|
||||||
const char *errstr = ext4_decode_error(NULL, err, nbuf);
|
const char *errstr = ext4_decode_error(NULL, err, nbuf);
|
||||||
|
@ -300,8 +301,8 @@ void ext4_journal_abort_handle(const char *caller, const char *err_fn,
|
||||||
if (is_handle_aborted(handle))
|
if (is_handle_aborted(handle))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
printk(KERN_ERR "%s: aborting transaction: %s in %s\n",
|
printk(KERN_ERR "%s:%d: aborting transaction: %s in %s\n",
|
||||||
caller, errstr, err_fn);
|
caller, line, errstr, err_fn);
|
||||||
|
|
||||||
jbd2_journal_abort_handle(handle);
|
jbd2_journal_abort_handle(handle);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue