13 #include <linux/slab.h>
21 err = btree_insert32(head, segno, (
void *)1,
GFP_NOFS);
79 BUG_ON(!len && !use_filler);
83 page = get_mapping_page(area->
a_sb, index, use_filler);
87 SetPageUptodate(page);
90 if (!PagePrivate(page)) {
104 static void pad_partial_page(
struct logfs_area *area)
114 page = get_mapping_page(sb, index, 0);
117 if (!PagePrivate(page)) {
118 SetPagePrivate(page);
125 static void pad_full_pages(
struct logfs_area *area)
136 page = get_mapping_page(sb, index, 0);
138 SetPageUptodate(page);
140 if (!PagePrivate(page)) {
141 SetPagePrivate(page);
154 static void pad_wbuf(
struct logfs_area *area,
int final)
156 pad_partial_page(area);
158 pad_full_pages(area);
172 return btree_lookup128(head, ino, index);
181 return btree_insert128(head, ino, index, val,
GFP_NOFS);
202 .write_alias = btree_write_alias,
216 count /=
sizeof(*oa);
217 for (i = 0; i <
count; i++) {
221 memset(item, 0,
sizeof(*item));
229 level =
LEVEL(oa[i].level);
231 log_aliases(
"logfs_load_object_aliases(%llx, %llx, %x, %x) %llx\n",
234 block = alias_tree_lookup(sb, ino, bix, level);
237 block->
ops = &btree_block_ops;
238 err = alias_tree_insert(sb, ino, bix, level, block);
251 static void kill_alias(
void *_block,
unsigned long ignore0,
252 u64 ignore1,
u64 ignore2,
size_t ignore3)
264 block->
ops->free_block(sb, block);
278 static int obj_len(
struct super_block *sb,
int obj_type)
292 static int __logfs_segment_write(
struct inode *inode,
void *
buf,
304 acc_len = obj_len(sb, type);
306 area = get_area(sb, shadow->
gc_level);
322 h.crc = logfs_crc32(&
h,
sizeof(
h) - 4, 4);
323 h.data_crc = logfs_crc32(buf, len, 0);
325 logfs_buf_write(area, ofs, &
h,
sizeof(
h));
334 static s64 logfs_segment_write_compress(
struct inode *inode,
void *buf,
345 if (compr_len >= 0) {
346 ret = __logfs_segment_write(inode, compressor_buf, shadow,
349 ret = __logfs_segment_write(inode, buf, shadow, type, len,
367 int do_compress,
type, len;
379 type = obj_type(inode, shrink_level(shadow->
gc_level));
380 len = obj_len(sb, type);
383 ret = logfs_segment_write_compress(inode, buf, shadow, type,
386 ret = __logfs_segment_write(inode, buf, shadow, type, len,
390 log_segment(
"logfs_segment_write(%llx, %llx, %x) %llx->%llx %x->%x\n",
403 long offset = ofs & (PAGE_SIZE-1);
407 copylen =
min((
ulong)len, PAGE_SIZE - offset);
409 page = get_mapping_page(sb, index, 1);
411 return PTR_ERR(page);
430 return (pos1 & logfs_block_mask(sb, level)) !=
431 (pos2 & logfs_block_mask(sb, level));
441 err =
wbuf_read(sb, ofs,
sizeof(*sh), sh);
444 crc = logfs_crc32(sh,
sizeof(*sh), 4);
445 if (crc != sh->
crc) {
461 err =
wbuf_read(sb, ofs,
sizeof(*oh), oh);
464 crc = logfs_crc32(oh,
sizeof(*oh) - 4, 4);
465 if (crc != oh->
crc) {
474 static void move_btree_to_page(
struct inode *inode,
struct page *page,
486 block = btree_remove128(head, inode->
i_ino, page->
index);
499 if (!PagePrivate(page)) {
500 SetPagePrivate(page);
502 set_page_private(page, (
unsigned long) block);
513 static unsigned long fnb(
const unsigned long *
addr,
514 unsigned long size,
unsigned long offset)
530 block->
ops->free_block(sb, block);
537 for (pos = 0; ; pos++) {
544 memset(item, 0,
sizeof(*item));
554 if (PagePrivate(page)) {
555 ClearPagePrivate(page);
557 set_page_private(page, 0);
559 block->
ops = &btree_block_ops;
560 err = alias_tree_insert(block->
sb, block->
ino, block->
bix, block->
level,
563 ClearPageUptodate(page);
566 static int __logfs_segment_read(
struct inode *inode,
void *buf,
576 block_len = obj_len(sb, obj_type(inode, level));
577 err = read_obj_header(sb, ofs, &oh);
585 "expected (%lx, %llx), got (%llx, %llx)\n",
586 ofs, inode->
i_ino, bix,
598 crc = logfs_crc32(buf, len, 0);
601 "%llx: expected %x, got %x\n", ofs,
615 crc = logfs_crc32(compressor_buf, len, 0);
618 "%llx: expected %x, got %x\n", ofs,
661 if (PageUptodate(page))
667 err = __logfs_segment_read(inode, buf, ofs, bix, level);
669 move_btree_to_page(inode, page, buf);
670 SetPageUptodate(page);
673 log_segment(
"logfs_segment_read(%lx, %llx, %x) %llx (%d)\n",
674 inode->
i_ino, bix, level, ofs, err);
692 log_segment(
"logfs_segment_delete(%llx, %llx, %x) %llx->%llx %x->%x\n",
696 err = read_obj_header(sb, shadow->
old_ofs, &h);
700 shrink_level(shadow->
gc_level)), sb);
705 len = obj_len(sb, h.
type);
717 start = dev_ofs(sb, segno, 0);
718 end = dev_ofs(sb, segno + 1, 0);
723 if (PagePrivate(page)) {
724 ClearPagePrivate(page);
754 area->
a_ops->get_free_segment(area);
755 area->
a_ops->get_erase_count(area);
758 err = area->
a_ops->erase_segment(area);
762 logfs_mark_segment_bad(sb, area->
a_segno);
781 super->
s_devops->writeseg(sb, ofs, len);
798 static void ostore_get_free_segment(
struct logfs_area *area)
811 static void ostore_get_erase_count(
struct logfs_area *area)
824 static int ostore_erase_segment(
struct logfs_area *area)
841 sh.
crc = logfs_crc32(&sh,
sizeof(sh), 4);
846 ofs = dev_ofs(sb, area->
a_segno, 0);
848 logfs_buf_write(area, ofs, &sh,
sizeof(sh));
853 .get_free_segment = ostore_get_free_segment,
854 .get_erase_count = ostore_get_erase_count,
855 .erase_segment = ostore_erase_segment,
887 static void map_invalidatepage(
struct page *page,
unsigned long l)
892 static int map_releasepage(
struct page *page,
gfp_t g)
899 .invalidatepage = map_invalidatepage,
900 .releasepage = map_releasepage,
912 return PTR_ERR(inode);
915 mapping->
a_ops = &mapping_aops;
917 mapping_set_gfp_mask(mapping,
GFP_NOFS);
936 super->
s_area[
i] = alloc_area(sb);
940 super->
s_area[
i]->a_ops = &ostore_area_ops;
947 for (i--; i >= 0; i--)