Viewing: libiam.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
*
* iam user level library
*
* Author: Wang Di <wangdi@clusterfs.com>
* Author: Nikita Danilov <nikita@clusterfs.com>
* Author: Fan Yong <fanyong@clusterfs.com>
*/
/* lustre/libiam.h */
#ifndef __IAM_ULIB_H__
#define __IAM_ULIB_H__
#define DX_FMT_NAME_LEN 16
#define IAM_LFIX_ROOT_MAGIC 0xbedabb1edULL
#define IAM_LVAR_ROOT_MAGIC 0xb01dfaceULL
enum {
IAM_LEAF_HEADER_MAGIC = 0x1976,
IAM_LVAR_LEAF_MAGIC = 0x1973,
IAM_IDLE_HEADER_MAGIC = 0x7903
};
enum iam_fmt_t {
FMT_LFIX = 0,
FMT_LVAR = 1,
};
struct dx_countlimit {
u_int16_t limit;
u_int16_t count;
} __attribute__((packed));
struct iam_lfix_root {
__le64 ilr_magic;
__le16 ilr_keysize;
__le16 ilr_recsize;
__le16 ilr_ptrsize;
__u8 ilr_indirect_levels;
__u8 ilr_padding;
};
struct iam_leaf_head {
u_int16_t ill_magic;
u_int16_t ill_count;
} __attribute__((packed));
struct lvar_leaf_header {
u_int16_t vlh_magic; /* magic number IAM_LVAR_LEAF_MAGIC */
u_int16_t vlh_used; /* used bytes, including header */
} __attribute__((packed));
/*
* Header structure to record idle blocks.
*/
struct iam_idle_head {
__le16 iih_magic;
__le16 iih_count; /* how many idle blocks in this head */
__le32 iih_next; /* next head for idle blocks */
__le32 iih_blks[];
} __attribute__((packed));
struct iam_index_head {
struct dx_countlimit limit;
u_int8_t paddingdd[16];
unsigned char entries[];
} __attribute__((packed));
typedef __u32 lvar_hash_t;
struct lvar_root {
u_int32_t vr_magic;
u_int16_t vr_recsize;
u_int16_t vr_ptrsize;
u_int8_t vr_indirect_levels;
u_int8_t vr_padding0;
u_int16_t vr_padding1;
} __attribute__((packed));
struct lvar_leaf_entry {
u_int32_t vle_hash;
u_int16_t vle_keysize;
u_int8_t vle_key[];
} __attribute__((packed));
struct osd_inode_id {
__u32 oii_ino;
__u32 oii_gen;
} __attribute__ ((packed));
enum {
LVAR_PAD = 4,
LVAR_ROUND = LVAR_PAD - 1
};
static inline unsigned int node_limit(unsigned int node_gap,
unsigned int block_size,
unsigned int size)
{
return (block_size - node_gap) / size;
}
static inline unsigned int root_limit(unsigned int root_gap,
unsigned int node_gap,
unsigned int block_size,
unsigned int size)
{
unsigned int limit;
limit = (block_size - root_gap) / size;
if (limit == node_limit(node_gap, block_size, size))
limit--;
return limit;
}
struct iam_uapi_info {
__u16 iui_keysize;
__u16 iui_recsize;
__u16 iui_ptrsize;
__u16 iui_height;
char iui_fmt_name[DX_FMT_NAME_LEN];
};
/*
* Creat an iam file, but do NOT open it.
* Return 0 if success, else -1.
*/
int iam_creat(char *filename, enum iam_fmt_t fmt,
int blocksize, int keysize, int recsize, int ptrsize);
/*
* Open an iam file, but do NOT creat it if the file doesn't exist.
* Please use iam_creat for creating the file before use iam_open.
* Return file id (fd) if success, else -1.
*/
int iam_open(char *filename, struct iam_uapi_info *ua);
/*
* Close file opened by iam_open.
*/
int iam_close(int fd);
/*
* Please use iam_open before use this function.
*/
int iam_insert(int fd, struct iam_uapi_info *ua, int key_need_convert,
char *keybuf, int rec_need_convert, char *recbuf);
/*
* Please use iam_open before use this function.
*/
int iam_lookup(int fd, struct iam_uapi_info *ua,
int key_need_convert, char *key_buf, int *keysize,
char *save_key, int rec_need_convert, char *rec_buf,
int *recsize, char *save_rec);
/*
* Please use iam_open before use this function.
*/
int iam_delete(int fd, struct iam_uapi_info *ua, int key_need_convert,
char *keybuf, int rec_need_convert, char *recbuf);
/*
* Please use iam_open before use this function.
*/
int iam_it_start(int fd, struct iam_uapi_info *ua, int key_need_convert,
char *key_buf, int *keysize, char *save_key,
int rec_need_convert, char *rec_buf, int *recsize,
char *save_rec);
/*
* Please use iam_open before use this function.
*/
int iam_it_next(int fd, struct iam_uapi_info *ua, int key_need_convert,
char *key_buf, int *keysize, char *save_key,
int rec_need_convert, char *rec_buf, int *recsize,
char *save_rec);
/*
* Please use iam_open before use this function.
*/
int iam_it_stop(int fd, struct iam_uapi_info *ua, int key_need_convert,
char *keybuf, int rec_need_convert, char *recbuf);
/*
* Change iam file mode.
*/
int iam_polymorph(char *filename, unsigned long mode);
#endif