1/*
2 * Compatibility header file for e2fsck which should be included
3 * instead of linux/jfs.h
4 *
5 * Copyright (C) 2000 Stephen C. Tweedie
6 *
7 * This file may be redistributed under the terms of the
8 * GNU General Public License version 2 or at your discretion
9 * any later version.
10 */
11#ifndef _JFS_USER_H
12#define _JFS_USER_H
13
14#ifdef DEBUGFS
15#include <stdio.h>
16#include <stdlib.h>
17#if EXT2_FLAT_INCLUDES
18#include "ext2_fs.h"
19#include "ext2fs.h"
20#include "blkid.h"
21#else
22#include "ext2fs/ext2_fs.h"
23#include "ext2fs/ext2fs.h"
24#include "blkid/blkid.h"
25#endif
26#else
27/*
28 * Pull in the definition of the e2fsck context structure
29 */
30#include "e2fsck.h"
31#endif
32
33struct buffer_head {
34#ifdef DEBUGFS
35	ext2_filsys	b_fs;
36#else
37	e2fsck_t	b_ctx;
38#endif
39	io_channel	b_io;
40	int		b_size;
41	int		b_err;
42	unsigned int	b_dirty:1;
43	unsigned int	b_uptodate:1;
44	unsigned long long b_blocknr;
45	char		b_data[1024];
46};
47
48struct inode {
49#ifdef DEBUGFS
50	ext2_filsys	i_fs;
51#else
52	e2fsck_t	i_ctx;
53#endif
54	ext2_ino_t	i_ino;
55	struct ext2_inode i_ext2;
56};
57
58struct kdev_s {
59#ifdef DEBUGFS
60	ext2_filsys	k_fs;
61#else
62	e2fsck_t	k_ctx;
63#endif
64	int		k_dev;
65};
66
67#define K_DEV_FS	1
68#define K_DEV_JOURNAL	2
69
70#define lock_buffer(bh) do {} while (0)
71#define unlock_buffer(bh) do {} while (0)
72#define buffer_req(bh) 1
73#define do_readahead(journal, start) do {} while (0)
74
75typedef struct {
76	int	object_length;
77} lkmem_cache_t;
78
79#define kmem_cache_alloc(cache, flags) malloc((cache)->object_length)
80#define kmem_cache_free(cache, obj) free(obj)
81#define kmem_cache_create(name, len, a, b, c) do_cache_create(len)
82#define kmem_cache_destroy(cache) do_cache_destroy(cache)
83#define kmalloc(len, flags) malloc(len)
84#define kfree(p) free(p)
85
86#define cond_resched()	do { } while (0)
87
88#define __init
89
90/*
91 * Now pull in the real linux/jfs.h definitions.
92 */
93#include <ext2fs/kernel-jbd.h>
94
95/*
96 * We use the standard libext2fs portability tricks for inline
97 * functions.
98 */
99#ifdef NO_INLINE_FUNCS
100extern lkmem_cache_t *do_cache_create(int len);
101extern void do_cache_destroy(lkmem_cache_t *cache);
102extern size_t journal_tag_bytes(journal_t *journal);
103#endif
104
105#if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
106#ifdef E2FSCK_INCLUDE_INLINE_FUNCS
107#if (__STDC_VERSION__ >= 199901L)
108#define _INLINE_ extern inline
109#else
110#define _INLINE_ inline
111#endif
112#else /* !E2FSCK_INCLUDE_INLINE FUNCS */
113#if (__STDC_VERSION__ >= 199901L)
114#define _INLINE_ inline
115#else /* not C99 */
116#ifdef __GNUC__
117#define _INLINE_ extern __inline__
118#else				/* For Watcom C */
119#define _INLINE_ extern inline
120#endif /* __GNUC__ */
121#endif /* __STDC_VERSION__ >= 199901L */
122#endif /* E2FSCK_INCLUDE_INLINE_FUNCS */
123
124
125_INLINE_ lkmem_cache_t *do_cache_create(int len)
126{
127	lkmem_cache_t *new_cache;
128
129	new_cache = malloc(sizeof(*new_cache));
130	if (new_cache)
131		new_cache->object_length = len;
132	return new_cache;
133}
134
135_INLINE_ void do_cache_destroy(lkmem_cache_t *cache)
136{
137	free(cache);
138}
139
140#undef _INLINE_
141#endif
142
143/*
144 * Kernel compatibility functions are defined in journal.c
145 */
146int journal_bmap(journal_t *journal, blk64_t block, unsigned long long *phys);
147struct buffer_head *getblk(kdev_t ctx, blk64_t blocknr, int blocksize);
148int sync_blockdev(kdev_t kdev);
149void ll_rw_block(int rw, int dummy, struct buffer_head *bh[]);
150void mark_buffer_dirty(struct buffer_head *bh);
151void mark_buffer_uptodate(struct buffer_head *bh, int val);
152void brelse(struct buffer_head *bh);
153int buffer_uptodate(struct buffer_head *bh);
154void wait_on_buffer(struct buffer_head *bh);
155
156/*
157 * Define newer 2.5 interfaces
158 */
159#define __getblk(dev, blocknr, blocksize) getblk(dev, blocknr, blocksize)
160#define set_buffer_uptodate(bh) mark_buffer_uptodate(bh, 1)
161
162#ifdef DEBUGFS
163#include <assert.h>
164#undef J_ASSERT
165#define J_ASSERT(x)	assert(x)
166
167#define JSB_HAS_INCOMPAT_FEATURE(jsb, mask)				\
168	((jsb)->s_header.h_blocktype == ext2fs_cpu_to_be32(JFS_SUPERBLOCK_V2) &&	\
169	 ((jsb)->s_feature_incompat & ext2fs_cpu_to_be32((mask))))
170#else  /* !DEBUGFS */
171
172extern e2fsck_t e2fsck_global_ctx;  /* Try your very best not to use this! */
173
174#define J_ASSERT(assert)						\
175	do { if (!(assert)) {						\
176		printf ("Assertion failure in %s() at %s line %d: "	\
177			"\"%s\"\n",					\
178			__FUNCTION__, __FILE__, __LINE__, # assert);	\
179		fatal_error(e2fsck_global_ctx, 0);			\
180	} } while (0)
181
182#endif /* DEBUGFS */
183
184#ifndef EFSBADCRC
185#define EFSBADCRC	EXT2_ET_BAD_CRC
186#endif
187#ifndef EFSCORRUPTED
188#define EFSCORRUPTED	EXT2_ET_FILESYSTEM_CORRUPTED
189#endif
190
191/* recovery.c */
192extern int	journal_recover    (journal_t *journal);
193extern int	journal_skip_recovery (journal_t *);
194
195/* revoke.c */
196extern int	journal_init_revoke(journal_t *, int);
197extern void	journal_destroy_revoke(journal_t *);
198extern void	journal_destroy_revoke_caches(void);
199extern int	journal_init_revoke_caches(void);
200
201extern int	journal_set_revoke(journal_t *, unsigned long long, tid_t);
202extern int	journal_test_revoke(journal_t *, unsigned long long, tid_t);
203extern void	journal_clear_revoke(journal_t *);
204
205#endif /* _JFS_USER_H */
206