aboutsummaryrefslogtreecommitdiffstats
path: root/fs/logfs/logfs.h
diff options
context:
space:
mode:
authorJoern Engel <joern@logfs.org>2010-03-04 15:30:58 -0500
committerJoern Engel <joern@logfs.org>2010-03-04 15:30:58 -0500
commit9421502b4fc894cc477be8fc49776830e37ca157 (patch)
tree9c9b1bfa42b2acdf4b5e080a256c3cd37852a94f /fs/logfs/logfs.h
parent5c564c2a04d4bb6ba79eeb83bd06de584479f362 (diff)
[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.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/logfs/logfs.h b/fs/logfs/logfs.h
index e3082abe9e3b..72592114a28f 100644
--- a/fs/logfs/logfs.h
+++ b/fs/logfs/logfs.h
@@ -151,7 +151,8 @@ struct logfs_device_ops {
151 int (*write_sb)(struct super_block *sb, struct page *page); 151 int (*write_sb)(struct super_block *sb, struct page *page);
152 int (*readpage)(void *_sb, struct page *page); 152 int (*readpage)(void *_sb, struct page *page);
153 void (*writeseg)(struct super_block *sb, u64 ofs, size_t len); 153 void (*writeseg)(struct super_block *sb, u64 ofs, size_t len);
154 int (*erase)(struct super_block *sb, loff_t ofs, size_t len); 154 int (*erase)(struct super_block *sb, loff_t ofs, size_t len,
155 int ensure_write);
155 void (*sync)(struct super_block *sb); 156 void (*sync)(struct super_block *sb);
156 void (*put_device)(struct super_block *sb); 157 void (*put_device)(struct super_block *sb);
157}; 158};
@@ -327,6 +328,7 @@ struct logfs_super {
327 u64 s_feature_compat; 328 u64 s_feature_compat;
328 u64 s_feature_flags; 329 u64 s_feature_flags;
329 u64 s_sb_ofs[2]; 330 u64 s_sb_ofs[2];
331 struct page *s_erase_page; /* for dev_bdev.c */
330 /* alias.c fields */ 332 /* alias.c fields */
331 struct btree_head32 s_segment_alias; /* remapped segments */ 333 struct btree_head32 s_segment_alias; /* remapped segments */
332 int s_no_object_aliases; 334 int s_no_object_aliases;
@@ -572,7 +574,7 @@ int get_page_reserve(struct inode *inode, struct page *page);
572extern struct logfs_block_ops indirect_block_ops; 574extern struct logfs_block_ops indirect_block_ops;
573 575
574/* segment.c */ 576/* segment.c */
575int logfs_erase_segment(struct super_block *sb, u32 ofs); 577int logfs_erase_segment(struct super_block *sb, u32 ofs, int ensure_erase);
576int wbuf_read(struct super_block *sb, u64 ofs, size_t len, void *buf); 578int wbuf_read(struct super_block *sb, u64 ofs, size_t len, void *buf);
577int logfs_segment_read(struct inode *inode, struct page *page, u64 ofs, u64 bix, 579int logfs_segment_read(struct inode *inode, struct page *page, u64 ofs, u64 bix,
578 level_t level); 580 level_t level);