mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
ext2: add ->sync_fs
Add a ->sync_fs method for data integrity syncs, and reimplement ->write_super ontop of it. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
80e09fb942
commit
40f31dd47e
@ -42,6 +42,7 @@ static void ext2_sync_super(struct super_block *sb,
|
||||
struct ext2_super_block *es);
|
||||
static int ext2_remount (struct super_block * sb, int * flags, char * data);
|
||||
static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf);
|
||||
static int ext2_sync_fs(struct super_block *sb, int wait);
|
||||
|
||||
void ext2_error (struct super_block * sb, const char * function,
|
||||
const char * fmt, ...)
|
||||
@ -309,6 +310,7 @@ static const struct super_operations ext2_sops = {
|
||||
.delete_inode = ext2_delete_inode,
|
||||
.put_super = ext2_put_super,
|
||||
.write_super = ext2_write_super,
|
||||
.sync_fs = ext2_sync_fs,
|
||||
.statfs = ext2_statfs,
|
||||
.remount_fs = ext2_remount,
|
||||
.clear_inode = ext2_clear_inode,
|
||||
@ -1132,25 +1134,36 @@ static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es)
|
||||
* set s_state to EXT2_VALID_FS after some corrections.
|
||||
*/
|
||||
|
||||
void ext2_write_super (struct super_block * sb)
|
||||
static int ext2_sync_fs(struct super_block *sb, int wait)
|
||||
{
|
||||
struct ext2_super_block * es;
|
||||
lock_kernel();
|
||||
if (!(sb->s_flags & MS_RDONLY)) {
|
||||
es = EXT2_SB(sb)->s_es;
|
||||
struct ext2_super_block *es = EXT2_SB(sb)->s_es;
|
||||
|
||||
if (es->s_state & cpu_to_le16(EXT2_VALID_FS)) {
|
||||
ext2_debug ("setting valid to 0\n");
|
||||
es->s_state &= cpu_to_le16(~EXT2_VALID_FS);
|
||||
es->s_free_blocks_count = cpu_to_le32(ext2_count_free_blocks(sb));
|
||||
es->s_free_inodes_count = cpu_to_le32(ext2_count_free_inodes(sb));
|
||||
es->s_mtime = cpu_to_le32(get_seconds());
|
||||
ext2_sync_super(sb, es);
|
||||
} else
|
||||
ext2_commit_super (sb, es);
|
||||
lock_kernel();
|
||||
if (es->s_state & cpu_to_le16(EXT2_VALID_FS)) {
|
||||
ext2_debug("setting valid to 0\n");
|
||||
es->s_state &= cpu_to_le16(~EXT2_VALID_FS);
|
||||
es->s_free_blocks_count =
|
||||
cpu_to_le32(ext2_count_free_blocks(sb));
|
||||
es->s_free_inodes_count =
|
||||
cpu_to_le32(ext2_count_free_inodes(sb));
|
||||
es->s_mtime = cpu_to_le32(get_seconds());
|
||||
ext2_sync_super(sb, es);
|
||||
} else {
|
||||
ext2_commit_super(sb, es);
|
||||
}
|
||||
sb->s_dirt = 0;
|
||||
unlock_kernel();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void ext2_write_super(struct super_block *sb)
|
||||
{
|
||||
if (!(sb->s_flags & MS_RDONLY))
|
||||
ext2_sync_fs(sb, 1);
|
||||
else
|
||||
sb->s_dirt = 0;
|
||||
}
|
||||
|
||||
static int ext2_remount (struct super_block * sb, int * flags, char * data)
|
||||
|
Loading…
Reference in New Issue
Block a user