blob: 55081c975ef4a9c89ef895ae1b0fdf4757858723 [file] [log] [blame]
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_KEY_H
#define REISERFS_KEY_H
/* set/get fields of keys on disk with these defines */
#define reiserfs_key_get_did(k) get_le32 (k, k2_dir_id)
#define reiserfs_key_set_did(k,val) set_le32 (k, k2_dir_id, val)
#define reiserfs_key_get_oid(k) get_le32 (k, k2_objectid)
#define reiserfs_key_set_oid(k,val) set_le32 (k, k2_objectid, val)
#define reiserfs_key_get_off1(k) get_le32 (k, u.k2_offset_v1.k_offset)
#define reiserfs_key_set_off1(k,val) set_le32 (k, u.k2_offset_v1.k_offset, val)
#define reiserfs_key_get_uni(k) get_le32 (k, u.k2_offset_v1.k_uniqueness)
#define reiserfs_key_set_uni(k,val) set_le32 (k, u.k2_offset_v1.k_uniqueness, val)
#define REISERFS_KEY_SIZE (sizeof(reiserfs_key_t))
#define REISERFS_KEY_SHSIZE 8
// values for k_uniqueness field of the reiserfs_key_t
#define UNI_SD 0
#define UNI_DE 500
#define UNI_DE 500
#define UNI_DIRECT 0xffffffff
#define UNI_EXT 0xfffffffe
#define UNI_UNKN 555
/* values for k_type field of the reiserfs_key_t */
#define TYPE_STAT_DATA 0x0
#define TYPE_EXTENT 0x1
#define TYPE_DIRECT 0X2
#define TYPE_DIRENTRY 0X3
#define TYPE_LAST 0x4
#define TYPE_UNKNOWN 0xf
#define KEY_FORMAT_1 0
#define KEY_FORMAT_2 1
#define KEY_FORMAT_UNDEFINED 15
/* Our function for comparing keys can compare keys of different lengths.
It takes as a parameter the length of the keys it is to compare. These
defines are used in determining what is to be passed to it as that
parameter. */
#define REISERFS_KEY_LEN 4
#define REISERFS_KEY_SHORT_LEN 2
/* there are 4 types of items: stat data, directory item, extent, direct.
FIXME: This table does not describe new key format
+-------------------+------------+--------------+------------+
| | k_offset | k_uniqueness | mergeable? |
+-------------------+------------+--------------+------------+
| stat data | 0 | 0 | no |
+-------------------+------------+--------------+------------+
| 1st directory item| OFFSET_DOT |DIRENTRY_UNIQU| no |
| non 1st directory | hash value | | yes |
| item | | | |
+-------------------+------------+--------------+------------+
| extent item | offset + 1 |TYPE_EXTENT | if not the first object EXT item
+-------------------+------------+--------------+------------+
| direct item | offset + 1 |TYPE_DIRECT | if not the first object direct item
+-------------------+------------+--------------+------------+
*/
#define reiserfs_key_stat(p_s_key) \
(reiserfs_key_get_type (p_s_key) == TYPE_STAT_DATA )
#define reiserfs_key_dir(p_s_key) \
(reiserfs_key_get_type (p_s_key) == TYPE_DIRENTRY )
#define reiserfs_key_direct(p_s_key) \
(reiserfs_key_get_type (p_s_key) == TYPE_DIRECT )
#define reiserfs_key_ext(p_s_key) \
(reiserfs_key_get_type (p_s_key) == TYPE_EXTENT )
#define reiserfs_key_unkn(p_s_key) \
(reiserfs_key_get_type (p_s_key) >= TYPE_LAST)
#define MAX_KEY1_OFFSET 0xffffffff
#define MAX_KEY2_OFFSET 0xfffffffffffffffLL
/* hash value occupies 24 bits starting from 7 up to 30 */
#define OFFSET_HASH(offset) ((offset) & 0x7fffff80)
/* generation number occupies 7 bits starting from 0 up to 6 */
#define OFFSET_GEN(offset) ((offset) & 0x0000007f)
#define OFFSET_SD 0
#define OFFSET_DOT 1
#define OFFSET_DOT_DOT 2
extern const reiserfs_key_t MIN_KEY;
extern const reiserfs_key_t MAX_KEY;
extern const reiserfs_key_t root_dir_key;
extern const reiserfs_key_t parent_root_dir_key;
extern reiserfs_key_t lost_found_dir_key;
extern void reiserfs_key_copy (reiserfs_key_t * to, const reiserfs_key_t * from);
extern void reiserfs_key_copy2 (reiserfs_key_t * to, const reiserfs_key_t * from);
extern int reiserfs_key_comp (const void * k1, const void * k2);
extern int reiserfs_key_comp3 (const void * k1, const void * k2);
extern int reiserfs_key_comp2 (const void * p_s_key1, const void * p_s_key2);
extern int reiserfs_key_format (const reiserfs_key_t * key);
extern unsigned long long reiserfs_key_get_off (const reiserfs_key_t * key);
extern int reiserfs_key_get_type (const reiserfs_key_t * key);
extern char * reiserfs_key_name (const reiserfs_key_t * key);
extern void reiserfs_key_set_type (int format,
reiserfs_key_t * key,
int type);
extern void reiserfs_key_set_off (int format,
reiserfs_key_t * key,
unsigned long long offset);
extern void reiserfs_key_set_sec (int format,
reiserfs_key_t * key,
unsigned long long offset,
int type);
#endif