mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-04 16:15:11 +00:00
ext4: move the jbd2 wrapper functions out of super.c
Move the jbd2 wrapper functions which start and stop handles out of super.c, where they don't really logically belong, and into ext4_jbd2.c. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
343d9c283c
commit
722887ddc8
3 changed files with 105 additions and 105 deletions
|
@ -2149,6 +2149,8 @@ extern void *ext4_kvzalloc(size_t size, gfp_t flags);
|
||||||
extern void ext4_kvfree(void *ptr);
|
extern void ext4_kvfree(void *ptr);
|
||||||
extern int ext4_alloc_flex_bg_array(struct super_block *sb,
|
extern int ext4_alloc_flex_bg_array(struct super_block *sb,
|
||||||
ext4_group_t ngroup);
|
ext4_group_t ngroup);
|
||||||
|
extern const char *ext4_decode_error(struct super_block *sb, int errno,
|
||||||
|
char nbuf[16]);
|
||||||
extern __printf(4, 5)
|
extern __printf(4, 5)
|
||||||
void __ext4_error(struct super_block *, const char *, unsigned int,
|
void __ext4_error(struct super_block *, const char *, unsigned int,
|
||||||
const char *, ...);
|
const char *, ...);
|
||||||
|
|
|
@ -6,6 +6,107 @@
|
||||||
|
|
||||||
#include <trace/events/ext4.h>
|
#include <trace/events/ext4.h>
|
||||||
|
|
||||||
|
/* Just increment the non-pointer handle value */
|
||||||
|
static handle_t *ext4_get_nojournal(void)
|
||||||
|
{
|
||||||
|
handle_t *handle = current->journal_info;
|
||||||
|
unsigned long ref_cnt = (unsigned long)handle;
|
||||||
|
|
||||||
|
BUG_ON(ref_cnt >= EXT4_NOJOURNAL_MAX_REF_COUNT);
|
||||||
|
|
||||||
|
ref_cnt++;
|
||||||
|
handle = (handle_t *)ref_cnt;
|
||||||
|
|
||||||
|
current->journal_info = handle;
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Decrement the non-pointer handle value */
|
||||||
|
static void ext4_put_nojournal(handle_t *handle)
|
||||||
|
{
|
||||||
|
unsigned long ref_cnt = (unsigned long)handle;
|
||||||
|
|
||||||
|
BUG_ON(ref_cnt == 0);
|
||||||
|
|
||||||
|
ref_cnt--;
|
||||||
|
handle = (handle_t *)ref_cnt;
|
||||||
|
|
||||||
|
current->journal_info = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wrappers for jbd2_journal_start/end.
|
||||||
|
*/
|
||||||
|
handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks)
|
||||||
|
{
|
||||||
|
journal_t *journal;
|
||||||
|
|
||||||
|
trace_ext4_journal_start(sb, nblocks, _RET_IP_);
|
||||||
|
if (sb->s_flags & MS_RDONLY)
|
||||||
|
return ERR_PTR(-EROFS);
|
||||||
|
|
||||||
|
WARN_ON(sb->s_writers.frozen == SB_FREEZE_COMPLETE);
|
||||||
|
journal = EXT4_SB(sb)->s_journal;
|
||||||
|
if (!journal)
|
||||||
|
return ext4_get_nojournal();
|
||||||
|
/*
|
||||||
|
* Special case here: if the journal has aborted behind our
|
||||||
|
* backs (eg. EIO in the commit thread), then we still need to
|
||||||
|
* take the FS itself readonly cleanly.
|
||||||
|
*/
|
||||||
|
if (is_journal_aborted(journal)) {
|
||||||
|
ext4_abort(sb, "Detected aborted journal");
|
||||||
|
return ERR_PTR(-EROFS);
|
||||||
|
}
|
||||||
|
return jbd2_journal_start(journal, nblocks);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle)
|
||||||
|
{
|
||||||
|
struct super_block *sb;
|
||||||
|
int err;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (!ext4_handle_valid(handle)) {
|
||||||
|
ext4_put_nojournal(handle);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
sb = handle->h_transaction->t_journal->j_private;
|
||||||
|
err = handle->h_err;
|
||||||
|
rc = jbd2_journal_stop(handle);
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
err = rc;
|
||||||
|
if (err)
|
||||||
|
__ext4_std_error(sb, where, line, err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ext4_journal_abort_handle(const char *caller, unsigned int line,
|
||||||
|
const char *err_fn, struct buffer_head *bh,
|
||||||
|
handle_t *handle, int err)
|
||||||
|
{
|
||||||
|
char nbuf[16];
|
||||||
|
const char *errstr = ext4_decode_error(NULL, err, nbuf);
|
||||||
|
|
||||||
|
BUG_ON(!ext4_handle_valid(handle));
|
||||||
|
|
||||||
|
if (bh)
|
||||||
|
BUFFER_TRACE(bh, "abort");
|
||||||
|
|
||||||
|
if (!handle->h_err)
|
||||||
|
handle->h_err = err;
|
||||||
|
|
||||||
|
if (is_handle_aborted(handle))
|
||||||
|
return;
|
||||||
|
|
||||||
|
printk(KERN_ERR "EXT4-fs: %s:%d: aborting transaction: %s in %s\n",
|
||||||
|
caller, line, errstr, err_fn);
|
||||||
|
|
||||||
|
jbd2_journal_abort_handle(handle);
|
||||||
|
}
|
||||||
|
|
||||||
int __ext4_journal_get_write_access(const char *where, unsigned int line,
|
int __ext4_journal_get_write_access(const char *where, unsigned int line,
|
||||||
handle_t *handle, struct buffer_head *bh)
|
handle_t *handle, struct buffer_head *bh)
|
||||||
{
|
{
|
||||||
|
|
107
fs/ext4/super.c
107
fs/ext4/super.c
|
@ -69,8 +69,6 @@ static void ext4_mark_recovery_complete(struct super_block *sb,
|
||||||
static void ext4_clear_journal_err(struct super_block *sb,
|
static void ext4_clear_journal_err(struct super_block *sb,
|
||||||
struct ext4_super_block *es);
|
struct ext4_super_block *es);
|
||||||
static int ext4_sync_fs(struct super_block *sb, int wait);
|
static int ext4_sync_fs(struct super_block *sb, int wait);
|
||||||
static const char *ext4_decode_error(struct super_block *sb, int errno,
|
|
||||||
char nbuf[16]);
|
|
||||||
static int ext4_remount(struct super_block *sb, int *flags, char *data);
|
static int ext4_remount(struct super_block *sb, int *flags, char *data);
|
||||||
static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf);
|
static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||||
static int ext4_unfreeze(struct super_block *sb);
|
static int ext4_unfreeze(struct super_block *sb);
|
||||||
|
@ -296,107 +294,6 @@ void ext4_itable_unused_set(struct super_block *sb,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Just increment the non-pointer handle value */
|
|
||||||
static handle_t *ext4_get_nojournal(void)
|
|
||||||
{
|
|
||||||
handle_t *handle = current->journal_info;
|
|
||||||
unsigned long ref_cnt = (unsigned long)handle;
|
|
||||||
|
|
||||||
BUG_ON(ref_cnt >= EXT4_NOJOURNAL_MAX_REF_COUNT);
|
|
||||||
|
|
||||||
ref_cnt++;
|
|
||||||
handle = (handle_t *)ref_cnt;
|
|
||||||
|
|
||||||
current->journal_info = handle;
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Decrement the non-pointer handle value */
|
|
||||||
static void ext4_put_nojournal(handle_t *handle)
|
|
||||||
{
|
|
||||||
unsigned long ref_cnt = (unsigned long)handle;
|
|
||||||
|
|
||||||
BUG_ON(ref_cnt == 0);
|
|
||||||
|
|
||||||
ref_cnt--;
|
|
||||||
handle = (handle_t *)ref_cnt;
|
|
||||||
|
|
||||||
current->journal_info = handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wrappers for jbd2_journal_start/end.
|
|
||||||
*/
|
|
||||||
handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks)
|
|
||||||
{
|
|
||||||
journal_t *journal;
|
|
||||||
|
|
||||||
trace_ext4_journal_start(sb, nblocks, _RET_IP_);
|
|
||||||
if (sb->s_flags & MS_RDONLY)
|
|
||||||
return ERR_PTR(-EROFS);
|
|
||||||
|
|
||||||
WARN_ON(sb->s_writers.frozen == SB_FREEZE_COMPLETE);
|
|
||||||
journal = EXT4_SB(sb)->s_journal;
|
|
||||||
if (!journal)
|
|
||||||
return ext4_get_nojournal();
|
|
||||||
/*
|
|
||||||
* Special case here: if the journal has aborted behind our
|
|
||||||
* backs (eg. EIO in the commit thread), then we still need to
|
|
||||||
* take the FS itself readonly cleanly.
|
|
||||||
*/
|
|
||||||
if (is_journal_aborted(journal)) {
|
|
||||||
ext4_abort(sb, "Detected aborted journal");
|
|
||||||
return ERR_PTR(-EROFS);
|
|
||||||
}
|
|
||||||
return jbd2_journal_start(journal, nblocks);
|
|
||||||
}
|
|
||||||
|
|
||||||
int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle)
|
|
||||||
{
|
|
||||||
struct super_block *sb;
|
|
||||||
int err;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
if (!ext4_handle_valid(handle)) {
|
|
||||||
ext4_put_nojournal(handle);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
sb = handle->h_transaction->t_journal->j_private;
|
|
||||||
err = handle->h_err;
|
|
||||||
rc = jbd2_journal_stop(handle);
|
|
||||||
|
|
||||||
if (!err)
|
|
||||||
err = rc;
|
|
||||||
if (err)
|
|
||||||
__ext4_std_error(sb, where, line, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ext4_journal_abort_handle(const char *caller, unsigned int line,
|
|
||||||
const char *err_fn, struct buffer_head *bh,
|
|
||||||
handle_t *handle, int err)
|
|
||||||
{
|
|
||||||
char nbuf[16];
|
|
||||||
const char *errstr = ext4_decode_error(NULL, err, nbuf);
|
|
||||||
|
|
||||||
BUG_ON(!ext4_handle_valid(handle));
|
|
||||||
|
|
||||||
if (bh)
|
|
||||||
BUFFER_TRACE(bh, "abort");
|
|
||||||
|
|
||||||
if (!handle->h_err)
|
|
||||||
handle->h_err = err;
|
|
||||||
|
|
||||||
if (is_handle_aborted(handle))
|
|
||||||
return;
|
|
||||||
|
|
||||||
printk(KERN_ERR "EXT4-fs: %s:%d: aborting transaction: %s in %s\n",
|
|
||||||
caller, line, errstr, err_fn);
|
|
||||||
|
|
||||||
jbd2_journal_abort_handle(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __save_error_info(struct super_block *sb, const char *func,
|
static void __save_error_info(struct super_block *sb, const char *func,
|
||||||
unsigned int line)
|
unsigned int line)
|
||||||
{
|
{
|
||||||
|
@ -582,8 +479,8 @@ void ext4_error_file(struct file *file, const char *function,
|
||||||
ext4_handle_error(inode->i_sb);
|
ext4_handle_error(inode->i_sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *ext4_decode_error(struct super_block *sb, int errno,
|
const char *ext4_decode_error(struct super_block *sb, int errno,
|
||||||
char nbuf[16])
|
char nbuf[16])
|
||||||
{
|
{
|
||||||
char *errstr = NULL;
|
char *errstr = NULL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue