159 lines
5.4 KiB
C
159 lines
5.4 KiB
C
/*
|
|
* Copyright 2000-2004 by Hans Reiser, licensing governed by
|
|
* reiserfsprogs/README
|
|
*/
|
|
|
|
#ifndef REISERFS_DIRENTRY_H
|
|
#define REISERFS_DIRENTRY_H
|
|
|
|
#include "reiserfs/types.h"
|
|
|
|
/***************************************************************************/
|
|
/* DIRECTORY STRUCTURE */
|
|
/***************************************************************************/
|
|
/*
|
|
Picture represents the structure of directory items
|
|
________________________________________________
|
|
| Array of | | | | | |
|
|
| directory |N-1| N-2 | .... | 1st |0th|
|
|
| entry headers | | | | | |
|
|
|_______________|___|_____|________|_______|___|
|
|
<---- directory entries ------>
|
|
|
|
First directory item has k_offset component 1. We store "." and ".."
|
|
in one item, always, we never split "." and ".." into differing
|
|
items. This makes, among other things, the code for removing
|
|
directories simpler. */
|
|
|
|
/* Each directory entry has its header. This header has deh_dir_id and
|
|
deh_objectid fields, those are key of object, entry points to */
|
|
|
|
/* NOT IMPLEMENTED:
|
|
Directory will someday contain stat data of object */
|
|
struct reiserfs_de_head
|
|
{
|
|
__u32 deh2_offset; /* third component of the directory entry key */
|
|
__u32 deh2_dir_id; /* objectid of the parent directory of the object,
|
|
that is referenced by directory entry */
|
|
__u32 deh2_objectid;/* objectid of the object, that is referenced by
|
|
directory entry */
|
|
__u16 deh2_location;/* offset of name in the whole item */
|
|
__u16 deh2_state; /* whether 1) entry contains stat data (for future),
|
|
and 2) whether entry is hidden (unlinked) */
|
|
} __attribute__ ((__packed__));
|
|
|
|
typedef struct reiserfs_de_head reiserfs_deh_t;
|
|
|
|
#define REISERFS_DEH_SIZE sizeof(reiserfs_deh_t)
|
|
|
|
/* set/get fields of dir entry head these defines */
|
|
#define reiserfs_deh_get_off(deh) get_le32 (deh, deh2_offset)
|
|
#define reiserfs_deh_set_off(deh,val) set_le32 (deh, deh2_offset, val)
|
|
|
|
#define reiserfs_deh_get_did(deh) get_le32 (deh, deh2_dir_id)
|
|
#define reiserfs_deh_set_did(deh,val) set_le32 (deh, deh2_dir_id, val)
|
|
|
|
#define reiserfs_deh_get_obid(deh) get_le32 (deh, deh2_objectid)
|
|
#define reiserfs_deh_set_obid(deh,val) set_le32 (deh, deh2_objectid, val)
|
|
|
|
#define reiserfs_deh_get_loc(deh) get_le16 (deh, deh2_location)
|
|
#define reiserfs_deh_set_loc(deh,val) set_le16 (deh, deh2_location, val)
|
|
|
|
#define reiserfs_deh_get_state(deh) get_le16 (deh, deh2_state)
|
|
#define reiserfs_deh_set_state(deh,val) set_le16 (deh, deh2_state, val)
|
|
|
|
#define reiserfs_deh_name(deh, pos) \
|
|
((char *)(deh - pos) + reiserfs_deh_get_loc(deh))
|
|
|
|
/* empty directory contains two entries "." and ".." and their headers */
|
|
#define REISERFS_DIR_MIN \
|
|
(REISERFS_DEH_SIZE * 2 + \
|
|
MISC_ROUND_UP (strlen (".")) + \
|
|
MISC_ROUND_UP (strlen ("..")))
|
|
|
|
/* old format directories have this size when empty */
|
|
#define REISERFS_DIR_MIN_V1 (REISERFS_DEH_SIZE * 2 + 3)
|
|
|
|
#define DEH_Statdata 0 /* not used now */
|
|
#define DEH_Visible2 2
|
|
|
|
#define DEH_Bad_offset 4 /* fsck marks entries to be deleted with this flag */
|
|
#define DEH_Bad_location 5
|
|
|
|
#define reiserfs_deh_state_bit(deh,bit) \
|
|
(reiserfs_deh_get_state (deh) & (1 << bit))
|
|
|
|
#define reiserfs_deh_state_set_bit(deh,bit) \
|
|
{ \
|
|
__u16 state; \
|
|
state = reiserfs_deh_get_state (deh); \
|
|
state |= (1 << bit); \
|
|
reiserfs_deh_set_state(deh, state); \
|
|
}
|
|
|
|
#define reiserfs_deh_state_clear_bit(deh,bit) \
|
|
{ \
|
|
__u16 state; \
|
|
state = reiserfs_deh_get_state (deh); \
|
|
state &= ~(1 << bit); \
|
|
reiserfs_deh_set_state(deh, state); \
|
|
}
|
|
|
|
/* Bad means "hashed unproperly or/and invalid location" */
|
|
#define reiserfs_deh_locbad(deh) \
|
|
reiserfs_deh_state_bit (deh, DEH_Bad_location)
|
|
#define reiserfs_deh_set_locbad(deh) \
|
|
reiserfs_deh_state_set_bit (deh, DEH_Bad_location)
|
|
#define reiserfs_deh_set_locok(deh) \
|
|
reiserfs_deh_state_clear_bit (deh, DEH_Bad_location)
|
|
|
|
#define reiserfs_deh_offbad(deh) \
|
|
reiserfs_deh_state_bit (deh, DEH_Bad_offset)
|
|
#define reiserfs_deh_set_offbad(deh) \
|
|
reiserfs_deh_state_set_bit (deh, DEH_Bad_offset)
|
|
|
|
#define reiserfs_deh_bad(deh) \
|
|
(reiserfs_deh_locbad(deh) || reiserfs_deh_offbad(deh))
|
|
|
|
|
|
/* for directories st_blocks is number of 512 byte units which fit into dir
|
|
size round up to blocksize */
|
|
#define REISERFS_DIR_BLOCKS(size) ((size + 511) / 512)
|
|
|
|
/* array of the entry headers */
|
|
#define reiserfs_deh(bh,ih) ((reiserfs_deh_t *)(reiserfs_item_by_ih(bh,ih)))
|
|
|
|
#define REISERFS_NAME_MAX 256
|
|
/* #define REISERFS_NAME_MAX(block_size) \
|
|
(block_size - REISERFS_NODEH_SIZE - \
|
|
REISERFS_IH_SIZE - REISERFS_DEH_SIZE)
|
|
*/
|
|
|
|
/* -REISERFS_SD_SIZE when entry will contain stat data */
|
|
|
|
extern int reiserfs_direntry_loc_check (reiserfs_deh_t * deh,
|
|
reiserfs_ih_t * ih,
|
|
int first);
|
|
|
|
extern int reiserfs_direntry_entry_len (reiserfs_ih_t * ih,
|
|
reiserfs_deh_t * deh,
|
|
int pos_in_item);
|
|
|
|
extern int reiserfs_direntry_name_len (reiserfs_ih_t * ih,
|
|
reiserfs_deh_t * deh,
|
|
int pos_in_item);
|
|
|
|
extern int reiserfs_direntry_entry_estimate (char * name,
|
|
int key_format);
|
|
|
|
extern int reiserfs_direntry_check (reiserfs_filsys_t * fs,
|
|
reiserfs_ih_t * ih,
|
|
char * item,
|
|
int bad_dir);
|
|
|
|
extern void reiserfs_direntry_print (FILE * fp,
|
|
reiserfs_filsys_t * fs,
|
|
reiserfs_bh_t * bh,
|
|
reiserfs_ih_t * ih);
|
|
#endif
|