int logfs_init_journal(struct super_block *sb) { struct logfs_super *super = logfs_super(sb); size_t bufsize = max_t(size_t, sb->s_blocksize, super->s_writesize) + MAX_JOURNAL_HEADER; int ret = -ENOMEM; mutex_init(&super->s_journal_mutex); btree_init_mempool32(&super->s_reserved_segments, super->s_btree_pool); super->s_je = kzalloc(bufsize, GFP_KERNEL); if (!super->s_je) return ret; super->s_compressed_je = kzalloc(bufsize, GFP_KERNEL); if (!super->s_compressed_je) return ret; super->s_master_inode = logfs_new_meta_inode(sb, LOGFS_INO_MASTER); if (IS_ERR(super->s_master_inode)) return PTR_ERR(super->s_master_inode); ret = logfs_read_journal(sb); if (ret) return -EIO; reserve_sb_and_journal(sb); logfs_calc_free(sb); super->s_journal_area->a_ops = &journal_area_ops; return 0; }
static int logfs_read_sb(struct super_block *sb, int read_only) { struct logfs_super *super = logfs_super(sb); int ret; super->s_btree_pool = mempool_create(32, btree_alloc, btree_free, NULL); if (!super->s_btree_pool) return -ENOMEM; btree_init_mempool64(&super->s_shadow_tree.new, super->s_btree_pool); btree_init_mempool64(&super->s_shadow_tree.old, super->s_btree_pool); btree_init_mempool32(&super->s_shadow_tree.segment_map, super->s_btree_pool); ret = logfs_init_mapping(sb); if (ret) return ret; ret = __logfs_read_sb(sb); if (ret) return ret; if (super->s_feature_incompat & ~LOGFS_FEATURES_INCOMPAT) return -EIO; if ((super->s_feature_ro_compat & ~LOGFS_FEATURES_RO_COMPAT) && !read_only) return -EIO; ret = logfs_init_rw(sb); if (ret) return ret; ret = logfs_init_areas(sb); if (ret) return ret; /* ret = logfs_init_gc(sb); if (ret) return ret; */ ret = logfs_init_journal(sb); if (ret) return ret; return 0; }