diff options
author | Joern Engel <joern@logfs.org> | 2010-03-04 21:30:58 +0100 |
---|---|---|
committer | Joern Engel <joern@logfs.org> | 2010-03-04 21:30:58 +0100 |
commit | 9421502b4fc894cc477be8fc49776830e37ca157 (patch) | |
tree | 9c9b1bfa42b2acdf4b5e080a256c3cd37852a94f /fs/logfs/logfs.h | |
parent | 5c564c2a04d4bb6ba79eeb83bd06de584479f362 (diff) | |
download | op-kernel-dev-9421502b4fc894cc477be8fc49776830e37ca157.zip op-kernel-dev-9421502b4fc894cc477be8fc49776830e37ca157.tar.gz |
[LogFS] Fix bdev erases
Erases for block devices were always just emulated by writing 0xff.
Some time back the write was removed and only the page cache was
changed to 0xff. Superficialy a good idea with two problems:
1. Touching the page cache isn't necessary either.
2. However, writing out 0xff _is_ necessary for the journal. As the
journal is scanned linearly, an old non-overwritten commit entry
can be used on next mount and cause havoc.
This should fix both aspects.
Diffstat (limited to 'fs/logfs/logfs.h')
-rw-r--r-- | fs/logfs/logfs.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/logfs/logfs.h b/fs/logfs/logfs.h index e3082ab..7259211 100644 --- a/fs/logfs/logfs.h +++ b/fs/logfs/logfs.h @@ -151,7 +151,8 @@ struct logfs_device_ops { int (*write_sb)(struct super_block *sb, struct page *page); int (*readpage)(void *_sb, struct page *page); void (*writeseg)(struct super_block *sb, u64 ofs, size_t len); - int (*erase)(struct super_block *sb, loff_t ofs, size_t len); + int (*erase)(struct super_block *sb, loff_t ofs, size_t len, + int ensure_write); void (*sync)(struct super_block *sb); void (*put_device)(struct super_block *sb); }; @@ -327,6 +328,7 @@ struct logfs_super { u64 s_feature_compat; u64 s_feature_flags; u64 s_sb_ofs[2]; + struct page *s_erase_page; /* for dev_bdev.c */ /* alias.c fields */ struct btree_head32 s_segment_alias; /* remapped segments */ int s_no_object_aliases; @@ -572,7 +574,7 @@ int get_page_reserve(struct inode *inode, struct page *page); extern struct logfs_block_ops indirect_block_ops; /* segment.c */ -int logfs_erase_segment(struct super_block *sb, u32 ofs); +int logfs_erase_segment(struct super_block *sb, u32 ofs, int ensure_erase); int wbuf_read(struct super_block *sb, u64 ofs, size_t len, void *buf); int logfs_segment_read(struct inode *inode, struct page *page, u64 ofs, u64 bix, level_t level); |