From 1c9144439ed87c39fd8c8c22426e0eea563e1666 Mon Sep 17 00:00:00 2001 From: nikita Date: Wed, 31 May 2006 20:22:57 +0000 Subject: [PATCH] iam: more UT fixes --- .../kernel_patches/patches/ext3-iam-separate.patch | 51 +++--- lustre/kernel_patches/patches/ext3-iam-uapi.patch | 49 +++-- lustre/tests/iam_ut | Bin 56447 -> 57742 bytes lustre/tests/iam_ut.c | 199 +++++++++++++++++++++ 4 files changed, 255 insertions(+), 44 deletions(-) create mode 100644 lustre/tests/iam_ut.c diff --git a/lustre/kernel_patches/patches/ext3-iam-separate.patch b/lustre/kernel_patches/patches/ext3-iam-separate.patch index 669e8a7..92bdc58 100644 --- a/lustre/kernel_patches/patches/ext3-iam-separate.patch +++ b/lustre/kernel_patches/patches/ext3-iam-separate.patch @@ -1,7 +1,7 @@ Index: iam/fs/ext3/Makefile =================================================================== --- iam.orig/fs/ext3/Makefile 2006-05-31 20:24:32.000000000 +0400 -+++ iam/fs/ext3/Makefile 2006-05-31 20:28:15.000000000 +0400 ++++ iam/fs/ext3/Makefile 2006-05-31 23:32:29.000000000 +0400 @@ -6,7 +6,7 @@ obj-$(CONFIG_EXT3_FS) += ext3.o ext3-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ @@ -14,8 +14,8 @@ Index: iam/fs/ext3/Makefile Index: iam/fs/ext3/iam.c =================================================================== --- iam.orig/fs/ext3/iam.c 2004-04-06 17:27:52.000000000 +0400 -+++ iam/fs/ext3/iam.c 2006-05-31 20:28:37.000000000 +0400 -@@ -0,0 +1,1023 @@ ++++ iam/fs/ext3/iam.c 2006-05-31 22:34:57.000000000 +0400 +@@ -0,0 +1,1016 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * @@ -170,18 +170,15 @@ Index: iam/fs/ext3/iam.c +} + +/* -+ * Initialize container @c, acquires additional reference on @inode. ++ * Initialize container @c. + */ +int iam_container_init(struct iam_container *c, + struct iam_descr *descr, struct inode *inode) +{ + memset(c, 0, sizeof *c); + c->ic_descr = descr; -+ c->ic_object = igrab(inode); -+ if (c->ic_object != NULL) -+ return 0; -+ else -+ return -ENOENT; ++ c->ic_object = inode; ++ return 0; +} +EXPORT_SYMBOL(iam_container_init); + @@ -199,10 +196,6 @@ Index: iam/fs/ext3/iam.c + */ +void iam_container_fini(struct iam_container *c) +{ -+ if (c->ic_object != NULL) { -+ iput(c->ic_object); -+ c->ic_object = NULL; -+ } +} +EXPORT_SYMBOL(iam_container_fini); + @@ -1042,8 +1035,8 @@ Index: iam/fs/ext3/iam.c Index: iam/fs/ext3/iam_lfix.c =================================================================== --- iam.orig/fs/ext3/iam_lfix.c 2004-04-06 17:27:52.000000000 +0400 -+++ iam/fs/ext3/iam_lfix.c 2006-05-31 20:26:49.000000000 +0400 -@@ -0,0 +1,448 @@ ++++ iam/fs/ext3/iam_lfix.c 2006-05-31 23:32:16.000000000 +0400 +@@ -0,0 +1,451 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * @@ -1114,6 +1107,11 @@ Index: iam/fs/ext3/iam_lfix.c + return (struct iam_key *)entry; +} + ++static struct iam_leaf_head *iam_get_head(const struct iam_leaf *l) ++{ ++ return (struct iam_leaf_head *)l->il_bh->b_data; ++} ++ +static struct iam_lentry *iam_entries(const struct buffer_head *bh) +{ + return (void *)bh->b_data + sizeof(struct iam_leaf_head); @@ -1126,14 +1124,12 @@ Index: iam/fs/ext3/iam_lfix.c + +static int lentry_count_get(const struct iam_leaf *leaf) +{ -+ struct iam_lentry *lentry = leaf->il_entries; -+ return le16_to_cpu(((struct iam_leaf_head *)lentry)->ill_count); ++ return le16_to_cpu(iam_get_head(leaf)->ill_count); +} + +static void lentry_count_set(struct iam_leaf *leaf, unsigned count) +{ -+ struct iam_lentry *lentry = leaf->il_entries; -+ ((struct iam_leaf_head *)lentry)->ill_count = cpu_to_le16(count); ++ iam_get_head(leaf)->ill_count = cpu_to_le16(count); +} + +/*This func is for flat key, for those keys, @@ -1223,8 +1219,8 @@ Index: iam/fs/ext3/iam_lfix.c + count = lentry_count_get(l); + c = iam_leaf_container(l); + -+ p = iam_lfix_shift(l, l->il_entries, 1); -+ q = iam_lfix_shift(l, l->il_entries, count - 1); ++ p = l->il_entries; ++ q = iam_lfix_shift(l, p, count - 1); + + while (p <= q) { + m = iam_lfix_shift(l, p, iam_lfix_diff(l, q, p) / 2); @@ -3005,7 +3001,7 @@ Index: iam/fs/ext3/namei.c Index: iam/include/linux/lustre_iam.h =================================================================== --- iam.orig/include/linux/lustre_iam.h 2006-05-31 20:24:32.000000000 +0400 -+++ iam/include/linux/lustre_iam.h 2006-05-31 20:28:15.000000000 +0400 ++++ iam/include/linux/lustre_iam.h 2006-05-31 23:32:29.000000000 +0400 @@ -1,9 +1,68 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: @@ -3313,7 +3309,7 @@ Index: iam/include/linux/lustre_iam.h }; /* -@@ -172,34 +311,238 @@ struct iam_path { +@@ -172,36 +311,240 @@ struct iam_path { /* * Leaf node: a child of ->ip_frame. */ @@ -3371,7 +3367,8 @@ Index: iam/include/linux/lustre_iam.h -int iam_delete(handle_t *h, struct iam_container *c, struct iam_key *k); -int iam_update(handle_t *h, struct iam_container *c, struct iam_key *k, struct iam_rec *r); -int iam_insert(handle_t *handle, struct iam_container *c, struct iam_key *k, struct iam_rec *r); -+/* + /* +- * Initialize container @c, acquires additional reference on @inode. + * Flags controlling iterator functionality. + */ +enum iam_it_flags { @@ -3564,9 +3561,11 @@ Index: iam/include/linux/lustre_iam.h +int iam_insert(handle_t *handle, struct iam_container *c, + const struct iam_key *k, + struct iam_rec *r, struct iam_path_descr *pd); - /* - * Initialize container @c, acquires additional reference on @inode. ++/* ++ * Initialize container @c. */ + int iam_container_init(struct iam_container *c, + struct iam_descr *descr, struct inode *inode); @@ -210,3 +553,170 @@ int iam_container_init(struct iam_contai */ void iam_container_fini(struct iam_container *c); diff --git a/lustre/kernel_patches/patches/ext3-iam-uapi.patch b/lustre/kernel_patches/patches/ext3-iam-uapi.patch index f35a137..5175757 100644 --- a/lustre/kernel_patches/patches/ext3-iam-uapi.patch +++ b/lustre/kernel_patches/patches/ext3-iam-uapi.patch @@ -1,7 +1,7 @@ Index: iam/fs/ext3/Makefile =================================================================== ---- iam.orig/fs/ext3/Makefile 2006-05-30 23:07:25.000000000 +0400 -+++ iam/fs/ext3/Makefile 2006-05-30 23:08:12.000000000 +0400 +--- iam.orig/fs/ext3/Makefile 2006-05-31 23:32:29.000000000 +0400 ++++ iam/fs/ext3/Makefile 2006-05-31 23:32:36.000000000 +0400 @@ -6,7 +6,7 @@ obj-$(CONFIG_EXT3_FS) += ext3.o ext3-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ @@ -13,8 +13,8 @@ Index: iam/fs/ext3/Makefile ext3-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o Index: iam/fs/ext3/file.c =================================================================== ---- iam.orig/fs/ext3/file.c 2006-05-30 23:07:25.000000000 +0400 -+++ iam/fs/ext3/file.c 2006-05-30 23:11:11.000000000 +0400 +--- iam.orig/fs/ext3/file.c 2006-05-31 23:32:29.000000000 +0400 ++++ iam/fs/ext3/file.c 2006-05-31 23:32:36.000000000 +0400 @@ -23,6 +23,7 @@ #include #include @@ -50,8 +50,8 @@ Index: iam/fs/ext3/file.c Index: iam/fs/ext3/iam-uapi.c =================================================================== --- iam.orig/fs/ext3/iam-uapi.c 2004-04-06 17:27:52.000000000 +0400 -+++ iam/fs/ext3/iam-uapi.c 2006-05-31 19:02:37.000000000 +0400 -@@ -0,0 +1,233 @@ ++++ iam/fs/ext3/iam-uapi.c 2006-05-31 23:32:36.000000000 +0400 +@@ -0,0 +1,246 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * @@ -197,20 +197,30 @@ Index: iam/fs/ext3/iam-uapi.c + return 0; +} + -+static int putop(struct iam_uapi_op *op, struct iam_uapi_op *uop, -+ struct iam_descr *des) ++enum outop_t { ++ KEY = 1 << 0, ++ REC = 1 << 1 ++}; ++ ++static int outop(struct iam_uapi_op *op, struct iam_uapi_op *uop, ++ struct iam_descr *des, enum outop_t opt) +{ + int result; + -+ if (uop != NULL && copy_to_user((void __user *)uop->iul_rec, -+ op->iul_rec, des->id_rec_size)) ++ if (((opt & REC) && copy_to_user((void __user *)uop->iul_rec, ++ op->iul_rec, des->id_rec_size)) || ++ ((opt & KEY) && copy_to_user((void __user *)uop->iul_key, ++ op->iul_key, des->id_key_size))) + result = -EFAULT; + else + result = 0; ++ return result; ++} + ++static void putop(struct iam_uapi_op *op) ++{ + kfree(op->iul_key); + kfree(op->iul_rec); -+ return result; +} + +static int getop(struct iam_uapi_op *op, struct iam_uapi_op *uop, @@ -232,7 +242,7 @@ Index: iam/fs/ext3/iam-uapi.c + result = 0; + else { + result = -EFAULT; -+ putop(op, NULL, NULL); ++ putop(op); + } + return result; +} @@ -273,11 +283,14 @@ Index: iam/fs/ext3/iam-uapi.c + } else if (cmd == IAM_IOC_INSERT || cmd == IAM_IOC_LOOKUP) { + result = getop(&u.op, &uop, des, arg); + if (result == 0) { -+ int res2; -+ + result = iam_uapi_op(cmd, inode, filp, &u.op); -+ res2 = putop(&u.op, &uop, des); -+ result = result ? : res2; ++ if (cmd == IAM_IOC_LOOKUP) { ++ int res2; ++ ++ res2 = outop(&u.op, &uop, des, KEY); ++ result = result ? : res2; ++ } ++ putop(&u.op); + } + } else + result = -EINVAL; @@ -287,8 +300,8 @@ Index: iam/fs/ext3/iam-uapi.c +} Index: iam/include/linux/lustre_iam.h =================================================================== ---- iam.orig/include/linux/lustre_iam.h 2006-05-30 23:07:25.000000000 +0400 -+++ iam/include/linux/lustre_iam.h 2006-05-31 18:26:14.000000000 +0400 +--- iam.orig/include/linux/lustre_iam.h 2006-05-31 23:32:29.000000000 +0400 ++++ iam/include/linux/lustre_iam.h 2006-05-31 23:32:36.000000000 +0400 @@ -30,9 +30,6 @@ #ifndef __LINUX_LUSTRE_IAM_H__ #define __LINUX_LUSTRE_IAM_H__ diff --git a/lustre/tests/iam_ut b/lustre/tests/iam_ut index 6105504e7e4aea909bdd6718f36ec5c86548aa38..b83bf4976e3107b46744b6ade99e1988e9fbaa89 100755 GIT binary patch delta 26525 zcmaKVcbF8#)^}A;Pfz!5?e5tLYz}OI1(uwHWDo?&AO=_wQBZO)q64lVS+G%1K>_i4 zRZxNf6%j!&D*`G86jWppR6wsHa^?G-s#&hSe|+;iGhL_Z)X7!dGkZ?$`7MD(I|GX| zlW3OhHWNb3*}J6Zn)Z8Agy44&J%WUgxahu>wz~)Ka&$Dp+ewUDxPAxx?=be=$|XBm zB+URcW1;QNSm;~whD$+1q~RUHI~ni4znFLcZzjSo8*e7e%w4>b@b>Ulc!R1)^*72$ zyc1gd%EUX2cLN6S+Jra5V;R6JA8&@+F@V=Zuw!_*h77lKwEHFCI=J%qf&@G>f!{d+ z*Ei!$#AS(&ou)&yNWg6p@Ey3?3v8FwNf)VNlt0)ikUjlr)}^6|)25CbJz}!|y45PJ zV$|fx<0n*%oiK95)G-sr`@dVQ0+z7+hJohsM=+O7M`Ol7b4&aiZGNqL#C9FnX9HhT zg?Nsyu;wI zqhS_lH0yM1yM|e`(d@)y8#K%!jxJ<))%iGjN?F#?W!$k?Be2Y)8!w~uuMjH`Y%{&D!+!^Eq@=oRyU(HkG-{fCU6 zc#rK?-3-iM7cYht2KKLF{3~bfye&(J`TjYK%-TCOShdzaY-e144#dT@`m4|2I-f9* zv+xDRuiS1w#(n4aUKpBoe0Px1<=Z>w{$}jE`ViL7tnE{4Zs9p-WWH&aa9>qBzkje! zygpnwbLTs-*22nuKb}87*Dk4={nz>P^M{?Adt%tmh0oREd74()++kY3Js4J2}4_&F%Kj~O7# zm&9#WR8kV3msKovs=LEy- z{}00+KS4p3?E=4eN!1O8;oKva4Qc$_z{(S9{vE0+Q*(PhLx|RYP4B+2avV(4_&1jC zVW7AE>yEk$E2px#x}7xMm_OJ}d%>>J-Kc(&F(+xv=|?KxP*)DG7`F2Q3dVwF?8M09 zYyW5B%Z7mc*!g$3RS#jI&D_}%>=8c;H{Z;hrk1#DigqQ;qUt}0lFBoq)9$_!sA=~O z$7ki4Ytm+ApwV&K-uabhv_)H=ncm*7>lDUsP5AaS=2aa5_bpg*V&SM?6QZg4&F zo%$30ysr%N=MUbx#Tt`2gE8Pbx9T!8S((YB;hf_;{2!e<@j2`#Sm`w8GULi83}LX? zz^!gum_}7Ss4;iU6 z2#m*6KRy>{tg04ZUfC*rYU^3QrOjH$OF~D@Yq>DeHZ~sObvouug*IJF)WXVlnIWVe zhl$5-PtfkRW#QoMa|f@xK>p}IWf;nY2d{gHx3jsuK`L5Ob$v4^)_D7|is%67!P$!yZc)V8)06?a$q@(>`EJgl~`E$dqSAQXW{St?1N|K{#JSBrnI})VD|Ct z^K(mfZhkG)UWSH8u=l=m#<#seA-)l>-m}uL@EU|Zz%8rlhClqJUgPBHg?LRDrMHNi z`~zOYj{Q3I?$*8MfNo+y&mr9g3>e%;bnn@xPq&LZ^$}e=b?e%x_uzq|>$Hhu$KVDu zs_@29w-%0{Ftza7QBy~aoI2{-nn}Ks)W+YF9P&FRrTWh#QOzVVX2Qs+W6OGWy0oHa z-!2us`}XZMxL=(%g{5N(%Sy-9N%A`+jYyR_fwsKQv-MY<^FK(cCCB>zNoqTy(cQMo z_whs6Vfp4bdZz92y?*OmxQX!~w&EIx6d z(ssGM-CvTN5nT)jF*bqOpTu=MVE^^xme3^Fm7i14uV2F<&Un1<#Cs9mkKp|b-rMm0 z0PnBx{t55D@UEWoCFc7hRBL~n`q#iivuw95E0TC|%vr+61BvM@oM*fBSd7GrWo7w= z#<>R%6yrvW8LvC4r}`69GUNAxg2A)(>>SWxUJt@3IXOZc#1v_zpk;l`_rt)c02gC`7u&IqPJS-g_FZej|K z^)uowP={$+V``&WcNGt=!XtwfvuXNwxIG1$ ze9ki`z%*{qx*Q4znx5dEqu`BamN=ugWt_P63=|Et<5BA^a0<-*i<|Qh8-aP6;3$@A zzHWZWloqfS)__tp7i!$GC1@_v2&ZAEz`aHe+_?jbM?kZ{RLB7#s}MJVCBN|OZFsN= z+y@PkMeu&0xB=g(?NeHQJYn85jNspiA?sG=w3G>1k07E0_iO(5flS~5&HoveYMEyG z6+$?$T;uLV1Oy(`z26q0`H=2Ss)6PTHl5X%r>)ezt@6=)gnQ#wgEF*NYmCQO;I(ZL z9-eKvtlASA{SN38Sf`tXcx(%-*E(gh%Qk4?8nQ(;YT=e)F$JE}z3*}JdELu5)4+?G z$(A~3zA~ECqq=w)3~YTG43lh4^TxUue08ht*n!W$9l%4RyikPpc0K<$HqTD2XEvzX zug(LWwFLd$Pbs)j>KsorE9)wCE?RQIen5Y$)DFR0>B z*iqlXN+DGigpbrq2o+D=hNwAbnd&qqXQ_8VC|f;)-7iPo1Eq7-gRonk>WuFK`6>tU z7N|357pf*0t*M@a!HU!_d={%QP`yNDK&(>r1Tbr<9-vcOok9ecsqNrWN1cRlb=CE- zMLksr_T{Q>UD&_A8iNT9)J(*3Lp1=RG*b1I5RKJdkZ7V5CNx!xK&Y9bfDp}9XIQ9( zs*Me$rMd+~Td9|zaclK3tldVX!&+_CCs>Z{)E@M-Q-6ZmMQT3!+bbAFbWrnQkL^MY zCh&h(xgxUe&b_?}2Z2hKCqYwsf3H2gmeOst+Vcd6w z>IcKUE7VLt?+JAn)87{=6N~8sp?U)PP^c`3vqz}YnD>!T)8Od6LcN-S_}?c~V+`&W z>Jqr;W1(h&#V10AAmXP&oreYoglY)&KNG4hIzNXLQiv~v`W{CAQmAo==z~Iag;Tx~ zY8W*9TBtAKmP0~SV8UUc+LI99ptF_`-wJgcm+yqi2WI?;P|M(*?}fSHm3 zDi4l6Ce&P*_XnYhuqPfD>J{j8La0G--j70k23P$g)N(w5{4CVnn0`{Ip^*NRP|qTA zP78Gk(*GjVXkh*-R4-8Zk5D7Q{x_kXKv4Dw>a zTI?cl)8kUz4$OZ^)e7=HA=N0v8*b8C3S*owW@Hwd-KtMb%)l6W%Ak|Qey$IyCxg9w7Y?QXeB6~&Q>0%)JBUWI-4yQ(2reC(=u zfIe~6a7g#5t9}Ec1Fni-`e$)hb;IE2K!w&{xT-%)`K7CNfy_ZyErcn*a#bhT{%cot zfbxf2wHmAcFeX64Z(Q{)rhn_I&kzXTxoRM2A92;&u-5mkngshCbyX(jRk>;iLiL!d zrUUZ_SN)7wIqt?qY8nK$x=Fsh2QP*pUFSL{6_PsFz6v{8#UgF;sByv>WguHv`yse< zT@g@&H*5Uy27j!6La4?cXCUD3WBl>Fv0I0+5<|tj^sK?yS3@Q7p4|2zZm9H1ZqDQG zTGw%NCO2#U!p#j3HdOW(H_yWLp*rgzt@ScI9BObs>|lKb2Zx$9=iWi3XtvhPci^Z{ zdyjjshbKZ^3b;8Q4h!|@$jx8*rXRYr7q=Hcz|epwHzTlO=nDOe@&k66P=#)8XU^A7 zVT29LZp;C0D)=ol)n*~a)kSmKMsBu&0YkTEbMp|a@Am$daT}GPc~vR*J`TG0#VOA1 z^(^tSNvz#TmTmbUZZ;`G(>&01ML>sMtK{BMm=M~&ikn#TBJ{d;O9YM%?f9H~pJJVN zb>`;HY@gkl*c1d(=*>pl+k?5ib%LAm5;pNWn#B7c;bm|$*cN-z46guBs4ryY$4d}= zUO@@^tXgO$)#`;N&BF)(Na(sZJMXYsw`dKEh0_@Bc5kirK5YhKI)rwUyKBVci>ndu zg;vQu{$RrtBTSA!-=xMGoP#x()KW(z;vK>y^>KFjS7ztO-+_jgQ_5HUkoD)MyuguHJ+6BQgoeV2h zQE`iKGOdneI8F5z=H^;Yb2hQNrQ~M-w1LKZDo8u>=^6e#FQ%5@2RLx)yhX za7F^ojqczO%S?cU(KncJb^7ixxc6JU9CG$ZHB^Vp}X;zrRb9xaqX zxW+1O7Hz{q7bR3`6`jP$wc-i5T{OhQWpW4%U=??ao`bK#<#Lb?wyx0<>}=usQtybx z-J?&ilnrDfP5R$1N_%!tYTVyg5Q$g7|Ec}?%Sbp2fs;CbgAsQ|bhxR5 z^vX}Yuz);xEOlU0jOi`!6dI|62H-RJ1U^(+zOxZ4J}uX%Eu78}JuQ!EY5Yvw#M1Kb zV*F3>L21QKTu-QJluJw~G80^3rNL}z#hZYeTpM$3s-?yPz<1a@enfhn@5$<6?ELsH zjIg#QPJ%sclflRXc#`iR5;gNGtUNtRU6>kPbIK>uG;?;id8Qi2Qcc z!Fd^1nzk3WMJy)gvzmZzifG7ocEX)>i&;9Z^CITcZ6=D9^F7$n?FJ$z3kIhS12uD&`-f^~#+!g`33YV#AkN7@kFa8ue1s}3HIVJhXK1;Z=Q_Wz zO6K>LV&&9kR zQkn0+QdB5Y{V$7hWwQTAQ5QMYzo@vGeBGa1+(|y_KUZ8&D*sS%VJCv8qSV>B9f3oDzA=FZL`kPD3Q+Q(z_mX-asO6t1EtQw};aa8g3%^yZ zdhvF=r`#mJhnZ^ph7Y})WUz&Wl>=HSS9}VItuP`!WjHsf0(aIE@JeQ6zOxR|7Fn>0 zkr8cah{4E016j_wB0%?<)owe@un;1?ffVjhfbPfhX&e)yf;NHXONhD5$U}za!~dYU z;vY0u{)6Tt|DgG(e&z*9>od0Qm<{Zd53y@R>tvzB8ip+*+G`)!CE1_hb67TirIPw# z65fOTqi?^3o&x^LlZ$m`$BM#R^6+C+F?%w+4d#lK81tM*pvFp10z23R*lw(gb0_Z0 zu}($?;e6n4t6d{+2TT|1VOExK0)>Ej8pw9C{8P1S#PzIx7iM8K#QN)pdpv+;L5A1> zmIhBQB6tRkXl$5aH1r=+F0Y=_9?>4V!mx0i#h4Mh@aB9M9vC;gX!v1aJKU-F#%RFrRv3B!-5w4B>Gu9;^9Kylc zX!c?|6jn^0Dq;g~;@(n3Z*16;+?>w1BU%3N*S=e)Al@4tGh)r0t%#vm^J@DnV*4Z> zIBkdXCSqm{;knI6RK{*(*`SKB?gXva*oOcn*Tw3!V|S_DkhiP)97^7%rlEbi8VavX zS5pwlcc}4D@=o;{92QqE#NjHxP2eH59v&PkdHIpap)n(RZo6KnSRx5zn?-15!cdVLdwPQ%n!3Q&<<6 z7~iO8zM)!zkW`QHDig`?>CX4nUApsLnA%diAZS1&AJ#($)PW%5H)c*EITa-B*kKh1 zDAm0%sii96|A1P>+kzSkWHL{(Lpk$2_ zro_?wHLOshoWCLBfyIeqoz-agDx13aZs`c=Hz>~@unBBbw7HBvh$x7*kW7?qa2hnC zEidSCnD>p=)p`gjfKAUd!5)(lcKRZUG9ui=OlSKKl^1p7?+lcYVa75qj3ERvvIao} z{*v+&0w*KeJbot$nh63Cs7@Jq&PM-Sc@Z*c3hFnicReJ`sKs9ed3hi70M#}SId{Qv z8D$2FI(_`x>gQbF2{bay->QnoI@1}W+^`()M6qr%8s1mPv?e<(s5b5CToBjC|)d`Z8ZTl-DE(^`N=<5f20-8^+z;_wZFT;9r8B6Yr__UTEpBKJq=cSrz{HS5~D{)=V2HxqnClYrcD94 z-UhLU^DivCYUmQ@k}iNQ9f6>-ihDa(_#ZT^74L$T;AZAH9T5tdxrzPGNrl{*dF*_C zc1?a9Q|!!QwH3iDm0gT(L0_VCHH@b+o0{3ps%H;^p)wO2nC;x04yXkODR0=8i)ooH znIcg!Zg-9i0kZO)#R%Q30(1dQI79yi*|;?w1-`Wp7SAf;CS3x&kq8eryS2j)+}Ul6 zu);ZrC6t}`+Kpc(I)Hq3`@uj@vTNcq|2BMVLkQa0SE+UUHw6584nk7hV`;S>!}v59 zg|f#wtpk`mo_{W3nU;fb_Cy0g5g&-z=6U#bXy>-$n@Ft+Or1JTl)HC37PcTa@%$>B z5r{-L@%(B#b$ATVui($IJsb9R=NJ`~lf;V6H4r&fJTdWb8+Fctt2^I}WjYR)ox8w5 zxz1NGn!C_Ih0fz}maG4$X%&|^a~N7;p5@B~&4HMpEBupHQhA^f|`9W zm@{}PZ;f;CkuyX$TfxdXm+^g&_JULoY#l1Mg>x42JTf2{c?w! zn75rTA$o3wq2M~bF*WyUGe!=7gUlUij1qNj@xN}8+n_#+c|!oygG=#Y=Pq^l51F~X zL4&GSVhhb(dItur-~BpGJIIIqF-;qG-2;WCbtNJ?_uoUnG&lm06wQ6kkvx4vwc-!5 z3LD2^jGg$XWUp6gl*Pcg_4l1KG|N2T)A|Irz2(A`zg6^J_V|kSo7-HIZ#lDZi|m$hx|C$jGl# zO{EXC$*-HB;{1VN&ac-Qim>+U?`vKwo(-B(^+H@*Dho|&XDRf;&q0lI`PF;N3s3Qz|ZyY$_!G!gTjnLk!-=WcEL4j5ZoyRjRd$8@65uM zjs)StR^|(-aN@tiJ%z0kzqvR?5>Oihxy}{X`3l<_2x||4UD(dV0XY#+F1#oaJi_V$ zOV@0e2BTX~V$-eJ=vJ`H=>(~ym5ewovb7Di!fQpzm27}-5%WbVu8r|9WGYHs#oaGM z*P=9yJPw8}O4lq7!ly-HjsWXLn5QWAIX6ebCq*?*aI*>qEH2_EEroZwA`TlBcXc9= zqPW}Z_~dPBB!-K-8_0IP$paL>*nqBcIpitsVIbvH!288L4Mffi7^(OY14W%>Jl5+| zO*GSaE(oZ%87p+6@P6^71}br~SgJk-DszT0!@dS87uI7uF+Pi7`VKNr!c!QP-0Hj! zAC%l?_9Nk>gG9;g)xR{HDg-p$SlxAggFYp97)S}qfwey^hL=lbI0MiwnQ4ZEGc5_w zU5|nZKfi2-rX`iet#N##>I&TX@L#lKwsR#sSaMG_^Q|tRIf;3K<^pjyoI<6qrA@f* zI#IgaEM4JT1;3WQZnhxX=>fdb9cIjRhC#v7ory(`n)w5@TtNxaBcRqjsxMG1{c}fK$g=2Zj&txWIOM{E3&15 z9A}%qxOGu{4TN`PTPFaeWxML#+lT$-MF~TS{7SHU9kFlAj_O53`^>$EvF3kA>n^lz zQT;%;a_{OH)75COznfd4tPT7udq~cI@@6Axc5t1OAj6ACUaB8F3BBup1*$UAxA$szG_ZQwYIX)WnkK5c}MGk0*XFX@3l*rE5r-#J2}aZ|Xomi{R~%A9N_ zlf&OHWaFl|XQeFSUwNc#ydMIj+?xOfF|gPGVonPX7I%ZQE!!i`d(9tiyPRxS0}C*z z8E0C6f;D;SEy#G|ND0`OA?(X8L3i-S4w&s-th+De?i;#u_q0~%P9Cniuf?ZR3xs5- z6S(yEUu;_(@6!&1>N1QK?5zNSKs^H~?-~#alpBb=t06|9zJa1%Rv$nO43z1ef((I% z-8Ge5Zzw_{(8xfA-sJXx8XL?KZwvSbni#0edn?`sU^4@jdlMT2YJROI)5z=I8BnV+ z8fxd+uzR45!R+C6XR+Ik*JHiCNOM3JP0`R$udElK4hHjD&u2k9&e3C|y}LRB>by`x z6TLV3!~u3SsJD2pFlx8^^x$-l7i8e#Wq|k#lULORjh>7eC|)YPUTmpe23#(^<4m`= z0ar+m7e%0t0ar<{Cll^#z_rr*xhKGW1}y%!^xCs({SCZMde?OVIKY4#q_@t$?V@_} zl>e`bI>&E@qIO`nP47Y)K|5hRNyj)M=?L47R(1md&4D|DRI4leO$(afR|4bym3q0kRa1h~8KY&jsKs#IqksMf; z0Nt=;(5~05kEoHE0mn=yV7BG%r<%K`^u(NOx%$ z8iF2!?2=+=TeP7!P-zi9ZF;^hn`>2THdh5mhG+wDT-uBtk6uOmCefsZFjt)Z)0FKs z6CO&TvshcHbTNk0=q!vtG!3KabWbm~*H5rrgbtx6N{hfaM!#Id=E~{J<_e)Flg6Sa zi*|xqHl68%hcRjk1#{^H7Iq%RvEcIQOJEjITLfbv#RtIcHEA|XTSQG^@nSlTb_rEL zk5cLambK_7kgH8Uz{zEF1$yexpKx7Wx*jCz(OL*sPR~P#`gAq)Ye0`ffrd03f;OUU zz;8_Ldm#IbV)c>zM#Dg-8T|@-G^f3BXxV~7uyRY1kggSthCr<;06p5!R+z3WooLH{ zj5z?YE~0%HZBN~xO$T}evA12&GD!EjpohU?2X56s+bQT2#D7E3dXV3Rzb(NAy9KoX zgEs}ehLC?t(3Kc_J1*!5uI~uyj&0;!{JjI0_XI71BJT?-!q^8`73lmBPeNe32Y<Te+a4z z3D4qr5dr?Epnd2(CukTh{}psUE`JG{2$jy`u`mt|XGppa7MdxkJuY`i8i7ltBp>YW zmLw4=vm~uTIL(&S2%PSbQ~_Jek<<$TGFQ@NeK_xpZo~4KFKH3R7D%dugbO9@hPM_; znt-^tSJLkoTP*1SXfBb|w*z+T`y{PFRQZy6fZx}IRBDl!Fo?fS^=H@jZQfBNl81Q%u|x?g}0xUG#65=lXNG< zUN5N#?4OZzKRo%Yq^EJ&An9=^x>3@*u-Ya`Zy+u*unBJqYdhO8N<$_5l;oy;yci;i)AQj9cX`#-ySgUsHDd5L6xL~fR0IWVD2B_ zbWA@EC7{a*N%5lyg&!r|0WE%#)DV1shAqMAq@-+&ox%cu+@}%w@Xs%jHiOfz;0u%d z2a%5nzads3%iO=tsDDrbQKi?y~3_7{Ah@P4M>J79GT8mPMJEFx#R4Q0}oP3+(4ubRJv7T#Nc) zYnW%zIK=9Fi@LzD3oLpAfwa(~w=i#!MN^>ty%u$aEf!luU9tX_SkxaDy3e9f!0|2m z9$Umxi#~-;_gmBqetN*7LR^+vbO+R4Zc#4?^Poj9f!aeBy^pbnAt$+GA+X+}#<)BKJHaH+TC@$94HnfwtZuYu45n|g zXgsEGwkU?na~4g4g7N1qs*mdn7A=NqFIx0Ge7MD;rhs0uC>wry*`kp!;wu(ShbyJ$7BzrJ-?k_Uf!~3onDMSfw_@x)i}nM0-=fj5#Ro7qtp1@z$I-b5Zh}ca z0w#>N*P^qKexF4*Vl&tePeO^0Ejk7}ePYp2sQoEWAkzWN1N4~{r`4GFIXnuNd|}aZ zVE?5>>6mfQqC-&aD~lRJ(yuLA1HOkWdKq>;Y|%!HePhv8SQXz|B*FJPi@HIHBNojB z`|mCC;n$-O2H{agGDDG_Hm2iXMuCVqARdEeuVZg@J~R6Fh5(g8yn+E ziyi>#DKG@l(-5XFmZ3#?(EeAL8z}!lBmm_%i!KAo?-red+Gh|?SZaSD9)Wq*qEblz zr$qwVpR=epF8{SeTKwWvc&GtCRF)OFC>IUns$e}!k+vQq4Z*?=^h%-l zDl7~^-$HLmJz*Ni3k3tTAMtC`Ob8SdX>Vdm41r|_u1cY&psS$v5CFuEG8W2U7@1k++*sxf&=r=Q#_G- zx=1h#1-Y&(RKl}@T-Oy3l``)jS9FESmNVi_K$K393%Wvem{^btxdB(?3Ewq60VTHfRS!x7E75zkW08i_iM)Y z!PB7!G-EE|3N6#zxP&XTT;p;HSLi|A`)v`L59wYm;R>zL#^MsL&`RCQC0wCLbT3zM zg;vLPn@hMtYdhmJW(T>1EA)g$=Mt{aI^E#XoD86A)8{O7LH4}LeJ@5 zF5wD2uY0+KEA*mf!X;dxS8ieoDB%*Jt((BFMZnfHxr8h9>Q3|o?6>imYD&0*T*4LF zuIFsM9@wFl2&zP0v1js%e*hmuy=U@@Sq1)kV&)Y<)VU;H zQPvhjg;&h9vpAQ;D`5kOAm@^JrA#q84sq1mRiFf5TO;358Z{l5LAQI6bpl5p{y#jx6pBke%yTlu9 z%p|-v42?<1F0wxY>QwJWooL{-VRg249fBAsqRI^BeHx(N-1GpCbIHzA#FLOR`qOu7jr(oJ%o(gYqNoo+%p-Gp?y z3F&kb(&;Aj0Aj@$-$&Gln{u!0?PLdlNaDntV? z#ubbJ141!Pwqc52cTleyVce63CbxF4pCXdm80NzB{rQ8kb5CKdC$}|yjynnn?W%21 z@67ec>&tVD@ok=I6kV!-dHN~xRHLR&r zQ!~3+^=wW=QHib1_BatmwdiC#DT17cqFOS=Aj(JLBBg{y&K?bFB`Ni?o`eBX>M)eW z^&=^Dd0Q6h7Ig5fQ9r#Eiy)Veq}1z)-smBGWTv$9xO^m~nUPs|Tt1T0oNt&M=3G9K zlGt8dZxlpGX{|Bi2pX;*NoiwH$>aKwl(vRURAeW?SD7gtvN+>6rClZH7!fbx0V862 zBVsl>E{K>Rf-50+N(YuMyDNt5lx}8b7lzEtt`q!wE{o|Rl9XbuqN`C{9$3-M50}PbuaS=(%K;xD|kBdlB1{o?PUTxgD zQU)_rVilK(Yzqc!lybRIbVvousC{u64`kiscNm&;8CR2}T+T9Pw?nU;Qekk0{ZFOg z+89BuCP}Ht15%KyNm52KqoBYlNx7c23a-SLfYbure8t~5G{5dIO|bQ(4$<2{>Scf5 z22zJ6mVgK~$6nLb|6^#wi#gvc^=cFCX5FWbFpydIsn-|?>mEXSRNspF47L6OlT_K!Zf^ z%1#)ZIs~XiLAd6tzCv6jQ*ZHh;)_}8tp-haOX>l-jS)B?J2VA!J1-&jVZ%oFijX>e zndTPt?(2-fJIoe6*4xMv?_3AD0>!A@4A^Uc7A)(I-nePj$L)C;n=-rCR!r_W`@^7&}c>i%nhSvCN83x z3AixKMKjUt1XvR0qM2w;0xS!2(M&Wq0hWikXeJ6T;@)BvHwtsnOtetGrom=mE}DrJ zB~)q^=AxNstpwOE%r!I7GI=e5KZ<6;Tr?9cmnPu4hPh}aT3_-PHmkUM_z67xMjOZ< zH0g`OTr?AHBKd*ID((?ZW?F3}KjdS74Rg^xr8QMdTtXAM z^AmUiB{UwF&_v?rG?eRc2~A{1UR<*%^tgm3a<^eo;&BO0WR`)-JT9S$%r;QD$0an8 zdkoab;}V+4JOefJ_$CusU?Qd!|Ct=jLYwiSt7;-0J+7*W`0r>L@W`OV01;VgK-=T8 zn#giP%k{XdCZfLs^MetW)kIdAG4i?v0IhjU8!M{49eK=nFVj2f|2VucN@xlyxP+!# zMPYs_q9W3_44MY)2KcPe1|Kq`7px?L$$n)8SJu2)!Id@VD!8(y{ncDqbHmkzLv&?L zq_fABHIW;59(#u?Ya%z^sUh3r%9_a7npzmwm|&bSf$|oy662TXF#>!3if6a>4_zHA zJqGS>WWC3QHIZk`i^h&$?q`q4E1MBS-^R0;8nBl|RPn3@49b!X>w6c$)N^GLNq~0}Z`J=Ak5}Wz>{KDUOO+DGp zKX^?}oQr8_C@=gVmzKwh2eQmuS{^ImqdJ0ISsp9BnVVc$9;h z%JeTBTv;BgvzdFjvOLyc1(r;ZE6Za|T5<0?i2Ydm3~q8cd8|vkKDW7^Jl3NRH-Clu zW0zje%?0=!DmH+>&Ih@iJT{c~qu_StaV>w#3UUp3Y|Pi(yoP3Gn} z{E`xzwuPHqP9D3xCO1tvIsYgUY!rw2-K)yE+tib{_bZvE|y4O%O&g z^WzeilgD1;`#_M($z$8K|M5gGVz0Bif?Q4>+o6ACdx~}5rGL`na`M=2O^nOQV{i7p zhDmTedF(CyGaPRqv3Hn6Xd;kx*>{cZ`gfcf7gzs|!)4z!dhh{TdOtn_xiT6v8050= zjFx=AkFLb@85w=NUH+%nnyT-NKC{sm;W1$$gj>K2!*Be*(0_Tt%GuaRPM1TtuAtN#c&F!dyh0 z`Dp^AFc%SL9!P-Ea86IA^;u$aCKl0IP)pCov(zp>^}3AqQ}HuzW|p;He-(9VS5%A? znc0@P@2hYQ9F&=p08=qK0$KW2;vri^s{E1H)sJt11X(Bcum$-5rL14RKr{CUSlHP) zqz_P{;c%~{H{o9Vtp(e5fVv~HZPMo_kv>0(zC%=ps4NJ}lRiI*Zo?8xq6ZKv$wEVAD~3$0HxeEjaiOM=qU6Sqz_OceSi{O4Nd`i z9qzM9pPxjTAmz|22#yfx^OH!QpG5lnB+}<6kv>0(9)g)ur~sI$anc7Ukv>3))`Lqr z=>wEVAD~3~0434~C=tO_HRwYaBZKy{XXtbiEJp8wP&Pe-T{4IC`AMYDPomE7PCn`L zlSrSRL``6ln)Dntiz3qJCsBM1j9x0(_?V4Gq|Z+xeSQ+@^OI;1Zd%PqpPxj0cWgmivfPsN`APIr92&PK zeSi|B!XlKZ(X6pyS9R=?bqPkHj3HL|?)? zhftUa7RVzp2Ply_K#9x&O2h{!A&+DkoP#`)n_(E_k*owYQCjBN>W?f;JP@?-_VC0dUhewe|Vh&Iu zbAS?=1C%I)Ws5u#bAA%_#?F8|l6qjj5mv)~fIJd&eiE7Uljs4gVdRm_1SZl*%=t+) zsSxWAc_dS?og$CK9H2zz043T0_FIv?gVl#T5_5nOWufymq_N;;w;hUt6Y@yR`AKBX zPa<=E5}EUp$ef=JP$F}H5^??GXD*rZlgON(MEzm=FOh19 zjp?9E=KLfw=O>XlKZ#aLENPd_`AKBXPZ~+)03{j-7aT#3CIbI^mnOkLM_n=pDA5qa z>M@th0ZL>JP!ge+n&9vDbz!xffga~A=M4S|8u3H;jokoUnRwFhp7oE6D~g*kFaFz2 zorz7W%e*{O=9PFt@l2Ul^*mGNWgw)fLqB(pfs|*eybMI1sq!*V)H79H2FmmtIM!Xz zy##T?zZHE2LEVLBu+TGQUgim>#GB(kH9k90(3Ofv(BCHzukIQH;Y;yG{2ZU#KtCX+ z^+L0sewa+E_^|EZ7JQ+|y*`V3T3!ly>|l=$=((XD_cTF|vV*M~qDOxtO&^2q zJ`mK+ttV@bop7_jbq{RLPiIf~YbG=(&hH517LpO`-OwB{Ke8)63Ip;K&^YP4*L?q% z38hYFG{?>J^C#Ywu^r9bcsFd&0;v6voH+=Meg2CRUz4T&&6Dbt>!fpAC!M$Eq;p!t z--x7a%}M8UuL0UzbB&PpTbnSmhKb85~F&92gwG_ODju*SjlvxV!7SlY6{kHIKL_ z-?B>REqC&Y8CK(nyW%akZQ$}r0dJB!$tq7DVx?{V_|~)1DxBwkboxZUycgBpLGHUYF&0kM1$nYjk#>uo5C{)<|Uw@o*#!i@Uw#tuY`NS0gC7>?f4D$+BHrWp z&YpaS4?{kb?AP5>riy;`uvqsB=L7mkCt1UVxK%7|(iGO5DO9)A*tft>$Y$|0@bK*jXBe zS@B|b@iic@GvdWQ<7+@`3U|Xr2F4bH7kkgZ*uL>%7aACMY|#}qz0eWme*Lc>_!y=UYXRZcgf-G}pkGtK z{Es3y4#QyBB|%_Qg20dj%ui`da5CWPlfc8464Mjo)&GxV0pRLr3?mxvlX%eM7q1eI zm9;>qjz(tqbb5fd5W!G~mArGyyOd zv+4P;P<%Ezs>3_os)6iR3_WTPScBCJVCdCb4@ m^BxTn|MI0{$BTRS?A)cINrOhB;{W{Xm%oi|-t_tV^8W$Ag~_h~ delta 25291 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 ScT*7DKjZVhn_m6=9r=I9R`>G& diff --git a/lustre/tests/iam_ut.c b/lustre/tests/iam_ut.c new file mode 100644 index 0000000..867e020 --- /dev/null +++ b/lustre/tests/iam_ut.c @@ -0,0 +1,199 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * iam_ut.c + * iam unit-tests + * + * Copyright (c) 2006 Cluster File Systems, Inc. + * Author: Nikita Danilov + * + * This file is part of the Lustre file system, http://www.lustre.org + * Lustre is a trademark of Cluster File Systems, Inc. + * + * You may have signed or agreed to another license before downloading + * this software. If so, you are bound by the terms and conditions + * of that agreement, and the following does not apply to you. See the + * LICENSE file included with this distribution for more information. + * + * If you did not agree to a different license, then this copy of Lustre + * is open source software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * In either case, Lustre is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * license text for more details. + */ + +#include +#include +#include +#include +#include +#include + +#include + +#ifdef HAVE_ENDIAN_H +#include +#endif + +#include + +enum { + /* + * Maximal format name length. + */ + DX_FMT_NAME_LEN = 16 +}; + +struct iam_uapi_info { + __u16 iui_keysize; + __u16 iui_recsize; + __u16 iui_ptrsize; + __u16 iui_height; + char iui_fmt_name[DX_FMT_NAME_LEN]; +}; + +struct iam_uapi_op { + void *iul_key; + void *iul_rec; +}; + +enum iam_ioctl_cmd { + IAM_IOC_INIT = _IOW('i', 1, struct iam_uapi_info), + IAM_IOC_GETINFO = _IOR('i', 2, struct iam_uapi_info), + IAM_IOC_INSERT = _IOWR('i', 3, struct iam_uapi_op), + IAM_IOC_LOOKUP = _IOWR('i', 4, struct iam_uapi_op) +}; + +static void usage(void) +{ + printf("usage: iam_ut [-v] [-h] file\n"); +} + +static int insert(int fd, const void *key, const void *rec) +{ + int result; + + struct iam_uapi_op op = { + .iul_key = key, + .iul_rec = rec + }; + result = ioctl(fd, IAM_IOC_INSERT, &op); + if (result != 0) + fprintf(stderr, "ioctl(IAM_IOC_INSERT): %i (%m)\n", result); + return result; +} + +static int lookup(int fd, const void *key, void *rec) +{ + int result; + + struct iam_uapi_op op = { + .iul_key = key, + .iul_rec = rec + }; + result = ioctl(fd, IAM_IOC_LOOKUP, &op); + if (result != 0) + fprintf(stderr, "ioctl(IAM_IOC_LOOKUP): %i (%m)\n", result); + return result; +} + +static void print_rec(const unsigned char *rec, int nr) +{ + int i; + + for (i = 0; i < nr; ++i) + printf("%c", rec[i]); + printf("| |"); + for (i = 0; i < nr; ++i) + printf("%x", rec[i]); + printf("\n"); +} + +int main(int argc, char **argv) +{ + int rc; + int fd; + int opt; + int blocksize = 4096; + int keysize = 8; + int recsize = 8; + int ptrsize = 4; + int verbose = 0; + + char *name; + char rec[8]; + + struct iam_uapi_info ua; + + do { + opt = getopt(argc, argv, "v"); + switch (opt) { + case 'v': + verbose++; + case -1: + break; + case 'b': + /* blocksize = atoi(optarg); */ + break; + case '?': + default: + fprintf(stderr, "Unable to parse options."); + case 'h': + usage(); + return 0; + } + } while (opt != -1); + + if (optind >= argc) { + fprintf(stderr, "filename missed\n"); + usage(); + return 1; + } + name = argv[optind]; + fd = open(name, O_RDWR); + if (fd == -1) { + fprintf(stderr, "open(%s): (%m)", name); + return 1; + } + rc = ioctl(fd, IAM_IOC_INIT, &ua); + if (rc != 0) { + fprintf(stderr, "ioctl(IAM_IOC_INIT): %i (%m)", rc); + return 1; + } + rc = ioctl(fd, IAM_IOC_GETINFO, &ua); + if (rc != 0) { + fprintf(stderr, "ioctl(IAM_IOC_GETATTR): %i (%m)", rc); + return 1; + } + + printf("keysize: %i, recsize: %i, ptrsize: %i, height: %i, name: %s\n", + ua.iui_keysize, ua.iui_recsize, ua.iui_ptrsize, + ua.iui_height, ua.iui_fmt_name); + + rc = insert(fd, "RIVERRUN", "PALEFIRE"); + if (rc != 0) + return 1; + + rc = insert(fd, "DAEDALUS", "FINNEGAN"); + if (rc != 0) + return 1; + + rc = insert(fd, "DAEDALUS", "FINNEGAN"); + if (errno != EEXIST) { + if (rc == 0) + fprintf(stderr, "Duplicate key not detected!\n"); + return 1; + } + + rc = lookup(fd, "RIVERRUN", rec); + if (rc != 0) + return 1; + + print_rec(rec, 8); + + return 0; +} -- 1.8.3.1