From e2622886c329a11b7f9bab6962f710ad22e7e214 Mon Sep 17 00:00:00 2001 From: shaocheng Date: Tue, 10 Feb 2004 09:34:15 +0000 Subject: [PATCH] - ll_dirstripe_verify is used to verify if files are created using parent directories' stripe info - add set/get dir stripe info tests into sanity.sh - create new header file include/lustre/liblustreapi.h and move include/linux/lustre_user.h into include/lustre. pass "make rpms" --- lustre/tests/ll_dirstripe_verify | Bin 0 -> 78559 bytes lustre/tests/ll_dirstripe_verify.c | 201 +++++++++++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100755 lustre/tests/ll_dirstripe_verify create mode 100644 lustre/tests/ll_dirstripe_verify.c diff --git a/lustre/tests/ll_dirstripe_verify b/lustre/tests/ll_dirstripe_verify new file mode 100755 index 0000000000000000000000000000000000000000..480209f348bf2dc145e8f03c7f0c6e1a68086569 GIT binary patch literal 78559 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 z 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

A7^ z{DHg@d-$*e9mrlkF{2D-)>|4&{66fQp*no z>#U*ye1BgYsXW8n|L~_U>6TV%e+cli2LTP#%h@3BR1P#qkC#gRO(&qi`u?Pv-!&Cz z2wB9&)73>mpelWLRLcWCprN`a$MTafW$Cc58mVL*Zx4A&tNX!Lwp-6vK+w|R`fZj5 z?x4d;&(veEDc%jfR;ph9R%37;Zzkc)Z@n$bY-Xir&&T9yyGx;FFBDFr4k*hl_%$Ym_~jp{x08n{19BdOj9+i4L3y|m z@CF03oopCUPb}FpW*M5%@hkN4D`$38G!vQ3d0E8EEJoBM?J7& zAU?yAC(1yaX*e-?F zBVR@+j$dY$EFO6sqC)&~BSk=tqG7b&D3B#D0gw0w(`*E$CJp>_*QU&q^x=OXqvJQZ z$W3?Jz}M5&deMm@Nfq>RFGSB|PGBJV<0<-xR=llw`nKOJF4VbcFM~P=Av#c;&ili2iv2pcG5#DT`Qi+X9R3Kpx46AV9^N4Y z)IlR3-wl0>0~+~R+Ci|~1y6N~C4UpKsyLX6SPm;PKS#o%j|`e96?2`UIRqm0LI0&Y z#2{@wN<9eID=NjiR2by^M3+cm`nT73F#PI{j%?H#b$hDwQ|iQF9kF(#Q+ z8Gi%uqG&Q50)SO{XeiK>4^*Quz6f4ZG*z=IVjTkr-RMo?m6nfL4oN^RT??`8R%Jbv3@Y?;nh8WR%@D{kL&<+iADi_@ob!xJ{A*Q<** zk~p-b!0C&H)-m2&gmuSqMJ2!2j`vY0dLXNot$$-xuV}`>MqXn zhB}BbVQ=j3SUV<*VgSrQH!~d=G1yWnk%jSm9i_*o2*`A`i zbhm9IM&tsj+qP?jL-7qLSUC%WvZy@{#lt;|I+#}jnY@O)C1Bpl!#j>JeNjh4^~m4g z(?y+Z{UWhX4#)zO=AAwK0?3VE?384RS0M!p-$GWi!e7=vEGzug8CYUi;k{V*Y_`Hf z(C61+=W+sqaURlROD^W~5u8d^leQ%DfMTFaw68n-B+OQFsou2r@H{MxO4ewakGCbX zRxh^vd_LAXCF?#_BPPhdz~o+XnWn|~IK-8bjT$95{V(Mu<`*8y`K2V^rgab;zZb=C z>IZan@&@c0xM9iW+}&+)`pu1!SLnWm9;fgMcx}n6^-!Gx3`--UM?hRzavwiL-SAhv{mS?q zFi6RV+GGxYrwZsJ-9>y|E5ub zuWbu-P@B4((^=k_ z`7UbV@7nydxFQ$Cwg75i+J&xu>M}k1lZWZOIWq?eko-lb(+QrocR&Yp(;XVlY4?G4 z4FdN1lB4_r>XYxZ(=y&WALx5M%{bgkUGRfG+3VrgcLX}7ZLpM|B=n;$xso@I1p0}@ zL7cYur;xDZXCh+f7oBwi4W2s$M`=pi^DmHH+Cj5n{5?oj8qk9hKVFP6SK85r(P*2c zO*T-cHz5)oiDK}>~)1F0zOW~>qOEdXVczbC`Gi3a)aIw-X-I&8E zFqCF%H}>&6QMELz4`}-Nm9T$ljz&Sg2a&2&y(dkR{}mWarMbH4e1184rqnD9V*GZD zr&4#n61j+PgGZI->q#-e?|_X<3#gvDGoFc6LTOZc^hXx!_!@#F=6aGo?JIo90#czX zzd8@)3O$M?NEX8S2k>c6X)%8oK3ZC0jK|WlKpJ02q;7mZ;znurR?>8k$}yq>rM>z0 zVUW}#D~iH<1_AY%4LU6z3I_xA)kenePgMe$Uy<{(j<*0pLgMAQ3m*qd&u-_3!<3FB z7izbD7?Pt%h<2Z(AX!VIwkvOkmEMk7DZL=;Gj(lH^(2fIME8fEeKNU+fwMfe?4A5&|sGv`NgK0S7vu{z*FZW=wF3dO?CTY*ke#T@!uC@NR>}+e14isG6&xZr_5sYZ+pQqZ)v|;fDBr*u zd0iG@)Gk!iTG<;NmFQ}ZQgEz%y*pr$y+Oe``NTxPg#EmNljR2_MlV~eB+m8nAbCeW z`z!?;?*IM#fa+`^E>P19fZ^>Kgfv4IN6u#1u zCFCD7>}wUq35caMie}q?Rrq?;CzqIO2QQ}jH(T;Yvi^L#LE$Zy3`_xDXm3z>t0nuB zN1bOsq%a7K zsT@b0z;F?M6PMW4ivElxf2#ssXRlHiCo+De_Aj$qo5&YHy%)97XfBPMgvY?i3k8x|f;zps;+t_PZr4<{Fx zaa$1;#L0~hz~gIlrITnB^Lio3idTXliFZnn$I`;{aBy@oCiTR*{2m%C^LikMg7-`s zEAusS_-zzY7mQOh4=*O?UwEEEKIW%Fdci>RvRW`e1!5f-MWj=!gABr;(Y%E_YAQio z{=Ee00oo*Fr@fDlGd);-C7Ss@+~g_z7-IYre#4{$4gnmn7rd6fe-a4xl5>;Wz1!urlZqvXNNW z;sr<>gpW3`&Dz8jd2`06~je0-9!#^fZx=HUR`1odsnz*@4mGtx7RPq*$0(?wcpx^1%gFK7+ z>sF1jcqihrg&v>MBBR#;pxY`Hmwf(A7ogkervT}Huj1s1cj(Ebh}ZW8y0b==EaP3q z1Km}pP&xO}7~9sMPz8UN;?UjNc$K`}V4!<+4^;CKIBnuyElUkwo({A_|IkD&Uvn1F zeHzvA-&FuTpiw>FO0);{R%H`EM%q54_sHjQ3l5ZcSf8S~-r~=ZvpzN#!l>o{-zcK) zUZmhwi?=2CIBi?d(FQ)T5^zsv^cv6tvCU0f}IewobFJsb$lPjMowSkbmSqG9!lwBG#1mHvnf3T z!4&DKsuuN9x7cy%GFqi|%ViYN-_f@PS-i&(pg(K=5&p*%p!amY ziC3VKrLE>dR{_v$u}A`@Ubv>;;=?d-1C2w_wMm=UDti@832?( z4IiK=3brIulu607EP?9rF#xpm!7++63zPUIVBusKHAg$A2j{HILK;XWNhpHCsPz(^x_lSqJ86c*z#$$Zhnkk zF|+>JuED?VK2xCL|9#m29Cbe=uzgb=PvT&-(7iX~45qLDcMntCZhlX&pueT{yT+I~>TCa(W+`Sv@uvR!A)&z?nZQW;2c>N7 z43URJ{m%)5c7=SS!~KsPqqsX12m5c|Pq8l)kM}oJ+>>z(yTAYWlN7Jbe267el;w3| zN_#UOV%ExYdQMNT3xhn@{};z8?hD0-`~UIH6t54(xAsp8IQ^NY?cHMkZ;SW6(h`-F zYk9Xs{S6^?tkVC~0g5-8pB=bo`agYv@=YO)3C&_0k{x`N0YIFk{|j1|{h2S`sdYlL zxJ~$XbLQvhOmW5jCshAHsQ*>U;+eOEGLgl9C!Y3dgJAc;7c>38FFtlKBlc^N#uN8Z zK4f6ANaK+B&28qNN0aJ`_6aiZ3gN@PV?c}RpW+&UNlP~_HrWTw0)KY!wRU>P;O)uj z9sQpQbMEOYQ2_5H%mVO|VpUd<=@&?LBLm3_CeRoqH z3}tkjW5*~Dg)%zMCxraNp^T1mT97&x%IG*Z{yWCH060$#-jnJ7RkeO!iqZd3V0uG9 zG`1;UP4P`3&#l*jScCV6Al7yLw~LdEh9!MPf1fbxM2L9Z-~aW!6vqMzk4L-aT6`!2 zoEW*|4gF%0gA)OPqyE2^*g6$LB|ZJG6!)48#U1^hRlBD{tmnG^9}(6~rNOc5vJ|I7 z@lgN26gkgi+;M(K|CmT)HVKY#yfcINb;LvO;C!b4CvV{4LOS;yDlR6}9NqYN>Rvz! z+%$ML)Blm{d3Y{Nj^pozuIJO(-w%k#JrqXV+uwVZ;+w#gmE;WdN#P{iwdA9dd;Rxw!2^uI;wa47&h>i-*I)=H>*xc@s^=nJ9O zJE9x^5wE`G4Br(Qd|Rgfqr&%#Da5}fF;+2hlI8bNEx=lMb;_5n8j5pw+_K8kniVZz zy4e4h;^ONW^+1qYIvH0t9^BwmOR)REV8c(p8El40`{_4>tu%h8({BbZhvJT#>IIa_ z&|hD_4r?ELB#8_5>lnkqD}l|t!p;d8e7hw`l3LCQ=k$6XII&~!aZi>ReD9`YnZX}U zdW~-UE$aSwKZ#C*k7fER;-Wv4jIjT*bgp-2q`aVc_SeNwp2+A8#c$;)8vK!PaQuD! zzqUm2eHjn<+~5D~brgRz^LtkLt^IG@P4WF0ka5z4JQC9=Mr`FMlt2Nt>hzcOMTM=NYP8vKilaP!vFd$|8%M#OUK z4T9)jX2c9{U6gG6Z<*K97ZaA7W8bHC8Qc8#jIHNS`1R-fH;`oULm~fQsk*(pM`xS% z$tz(X-19h1?2*83yF`;5#BWl+Z!)cEmE?DE%SR8An!3x8+uZ4sN5fm*Qa^o@noFuF zXNT96F11H{yOZ|brRVZ~w4d|V$8=Y2j`rQeEc@qr^na$0bhXD?eSs@pl}^ohiT3-m zswy@?H z-SYs1FZXipSFMcz9(cob7(!D+MCG3%RVNd3r{4zWK zYOd%}Zo%C>@+0_X(s%bfucqWh>X>4?sniGH?b!(Bj@YALw6T{L`+nrRy{!k{y}f8d zN}J&A4VG?q&x2}1o~oA}f!d(bhgC`btCy{0!wf_Eq-x5w^<8Vy+?Q2J4zG?%?d6gI zw8wr0cyFg>pB!S}yE+XYS55iKyr$u?fzy7yq~T>%mn&^+_4bP|dFM&J^Cz3%QPD_c z&tn?9;K5-2Ts7sG^VX$RZhHP{J)cOQZ^1t+>Z!BHX}i*|02Cd0x4TCN-RD^g`Er5Q%9?566N}WP_;v}@=wk{21;Sm|s*)S_k`*CjSIeedv04$yw)vJaqlXhh1|Wo;VidUD5|e+)=7pZcx$_w?R1J~zo?0WK@!v>TqKJiC}4Je`195$eY()uyf{mk3Fqss7``)K+dURoVqxP{U? zEtK_SG1^ylweTl^^y^=%p+C$*-Db$y@LzMe#pZL*t884oQT9)} z7~rdQ5OcP!%Y%J0}-m0XF?7OycdH9D_;S>Pvdab?otS)cY=L)kw zL^EBlvld>jRlP$a&wfEI9I?hG)WYyRw4U9oyT^2_aP~dAyxZ>nq*}Pg?q03BAJC5f z>~s&8AG9$*dr{Yitipc1_N2A@i@N(0c8S^+b^Vle{L5W z=GD~t`!6({Uw+SfggBo8kl7Cl1izw%$v&)S zpR{WCs-1uNxIpj;z}GvVPpfBt8hY)0qb|3tMVm!+Qx~)Tpr}^ zRrx=&o?hg4->%15XSMEIj#S*UlV%vnbzBpyrjY#{P`s*mtKE1Vzx(dzm%k?c$=;2! zKS&Q({o-k>^`c(GmW;OD8E@nAzv}Y!wy0c1+m73eKE^z^-EHgpv((yl5AR0VzmwxT zY_AjaclSKajeY-igxpA4XP+C2 zwtp3larK4FAF0;2H`mhSLai^JrdBPp{k_yW$S`xnrx``P_vSBGW%g&enTHG%pMm=zV&llZvQwf^mS!aWBWhUb$3Qpwoj`{PeygJe+Ynf zk6g2z%V&3Uc~V(jSw-u1Pxs=q$?i~vxyJ>Ht9fDfTlCHO?0X*IvZ(LOXa5A1bhjm_ zW(7ZvXHkzy3qlFFe7Wo@e>p_ZfaUs_JTwe(~sk<-wflPA zty*JGt8UFM&+G0bYxmob>!HW&?ptQL{84M+VO{>1RruW{5<9L{s3H3+hwv+AZ44h` zHEy!+@n-)FVBch9o&CZxm;0=R=kFtp`AxguCn!dEF|tp*l^Ygk&3=&?-q zE2A%^*%0%JgP=Y5`xzb0z5O=;@4;W{(iVyBpWnmv zP2IQO&Gn~XCI{crt+N;R9p-*!-#iqN$?ErQuXvVGW_7yGZ8sLix%@Va-zmOy_`Xzck0?wHY1vv9EQDI$2=Sne6Rg z-@w7*TamH%ydORKI09=50A3Xh>xlM&_;&7Y>)!F9p5APei4T1C3^#W7Jk0OD$NA;p z9xehw6}d0W|UpT(inMW0-8VCYSfQ5>V>1rt#YM!^w{vo-FJ>0DIYt2*U=M8lT+hI zFI39Qg(JfQ#|DOv3=a+-8yp!N9vnF~>@Qf&Bb9Qs^~ljeqjj`UZ&n8u{wG?ck!WIO z>A>j1f#HFnV*_^&4h#+q9gi}PX7)sVSMAAMo9XVovG>;Az2JD1*^}wJ>RNtx@49i< zt-JPSncUt?W^XooPxf94-8-Z1UAmmytK7Ms49_O_vNX3ulY5U+;i^Ma$Y$Tj<<(sF z`eko_M;qI(_cpfa#cSFPf+^t%t)m3fc-k)?iRs>T6OHcDXw-v`XZP+XYqk6KasM?t z^x~dvjD^o+=n1-gG4nAnM}qJ9}TU%X@^eZ2L{09|KBhPi^2+N zm0yu83m;F^qO`$(0~LGQ=x}4l;($#zg{PsJSEUQev;DT9T-+Sq+2#v+;7(hWTkI~_ z<9A=Jq7`_9PnD!&pm-?7Eef}`M-HR0KA_3hbo4=`!-lL}ytX}jHlbTPVHmFq?SK{8 z?9S|ttl+?5%7*;Rr+xE?UTZ^SAZ>;AkB0UQ(+P!UKrtsDVX8>)ewrQHmSUjrZ@7(+ zDw5ZbfLO(mEW|0L^3H3*TYD(n#R`RWz`j&R?QRZ01jpN5aL}!u52fATvn?9htETU5 zcl@RuqLBL#HqjgQWt^;DLKnypINwoGOy--ruHkovp+uR1fuoHpjbdrNan#sesj?D9 zjb^^ygpsL6w5{t4kN5O;4`c@S58d3@%h#DwYei>SgvNRm)8~z9DK}SuZsPRyCiE!fL+GB?@+qLhLU@$hFn9 zU(L;Xx~}p&-_p`#L$zY@jysOrv%jm0XA8`tEBaZcwt2m6)B$u3`p!Fld+2w*t#uIm z*K74=z5+t|3MFN4Jh_=~ti4=a6Q;I^?d45gsk9o+x-EEmN1~UksY;Afh==9%QhXV# zTDkK7X5qn!WZ}64_sX>tQ#vkr5N?+*G)hgb!K-F@t>kyZ755sYN~xgdtVN@+S}J06spaNH^Yoe)zEu-ZD^ejcOm2EO2GR{ zxuLrtbjzmF9x|OK-SITJgb`Qs>WO=$dc7)0aCve4*dSL|`-C6il8OMtmxdw=w_nGt zMoEN*`WtSPi)s(v1>u!#EgeU#sy`(*F_ z-ba7$124Jxds}OLzW1?TeY*IauG{y#uT|W^~=THkN!;WnPTs6eYy9J z-g@tuFZX_@`1I2s_{UG5SLx|W++V>EERnIjhNxJ8CYA!+1{tc2)AcK8KZz|f5Q)t-`TsPr{@V? ze7Spb)Wdj*1n`fsN~61aAMZM`b6b9(@1cR72L^U54)k44F1mg^xoY29dC9G4F|;Y4 z_8+s_Nt1ffqf_yCZeeVGa&B>Uo>r3EEVIGdTotb-u-g3wowSJkT7p`8;$bY9U>zB(t4r=&|71rT!DRhHSZ<88D_j( zxtP@8GHGfeURkd-LKW}YU|-Ky8!=xD2}5XUUH&JHzc>yH8GxRwqW4;<5mi|12ZC={v6_oq54%*+aL?DpkaA>S<5s%S#V3h`l5 ztJ{igm8oXW_98G} z`eNxy=s2K|13<_@#l|XZJ9eQ!ajjfU@Po!3AGH)9e@RHK0Uoelem5+kEnhL;%u}(} zYAW2-u9>2+zrv@rY&@us%T(7$4LLWs2m?(a(%F0)J60*m2V!Hl9uF8kKFlM zI`amc{6z1`)Of^v)|+8vHjyo8V+dvnw7n28bs?S_U0CE*C!T2JcjPDP>2H zR66ezOp~(+ZL|Zi3`bU21&WBu)b=iCX8A}E(5uu67i}bMx ze(ng1eJ0+dBZOFN!d5ycYZK?~M4$liLb9+v{lK~_316lwyHzk%y?G@n8w+TxmkJU0 z>gxscsKUjl)QU@mWEF#^9Os*$WFy+B)h~h`^%l&pWn4#^6=ST`qY4@%$XkJmhog95 zEFPPh9XlN_YT~Krry7AO0#?`{ETpob1<5xq zdYh+4=i}+gnW$2S92-qqU^o$jAg>W+JTjfr#-}07O-{zM3zN}$wM@jt)e4BBFErZThC)= z%`HyF3-ds5W;~wC%}gwwvca62oy*O{OEZ(_I$?e+LgJS$3kI;~CTH~9U}EU`=c}F}4@P?yG zJU13kkDd!6m9zXCF|y5uvsMFFf>07lGd{!XRV)F6HS1ifUopT=qO6@7of!u-sr6)w z5*PB7%Cf$3P^iOI^hrmo1^Q?fR%5wJU<LB2<_=O`&RI0_5e50u^ zO@dMwHfyX4aH=%|X^C$1BDV6CFk}=m-kxF2bBj#SdToHK&8S+gK~bk0n~3rllzv-69>>Iw=iHe@6;o6n8W-PnA5 z?j)GMF!@jp#MMVVMfIS5^ zN(l-#Jw>dhL05sH4aaA4^9vGrCKH!im5UK5bvcq4OT;HUMIu)c5Sj?E7ckw27SO8V z!-5fl46-vAA0#k)#_-#)V9HQfNT8)(I6pHMEiicWny9%R%hQEEUMY$K=}g}~F*~d& ziBz`*bs6VkWj;4Lr5PJLK`NEjYlYRQj_As-M;H0(2-5~&m*Vx+yc9yi$c3}mre}g*G1_;@rjRq*O5!IUIxY}BCB5c^Y!aNw8>(-E+w!^`WYj|9AkDHMm8Ie&&D;~pSmEd31J z2k%{EHX+AyRf0_FKh?|CRh+X;^M!U`vFnP$t@+WhTx52%^isnalnGW(j1wBGxo&4% z$ZDU)$qGopiVMxv$QYHzjNO{Z1S7XuShDmMscQAo1z13dhytq4a?xOtUj{{Z;u0}} zvDQoQ{l;p5u;fziOm1c|Hgi@(#jKtgop!{~DxNgl#}^p$(IHb<^I|#T=8oY@DEtW; zNjkgA8RL{d@IjB#BG-f+HCDY;fWE7IEJL=BO#xjkA^onb1DbsNf&U0oSK`T9YecaJU^EUZ!-(&$~72nq}4#n;5`PssqTCZO;EB= zz=Y9A{^l=BiB+GY<7XxpX6NP4&`ja>uBt(ik(l#(GrwFZfn~+gBccKE;}wkQ#ws** z8STe~e9XtZrIH)PyF{+??QiL-rn6!HZk-~tJI@GC<;Iub1``otrhZX;pYge>ng}$A zx?Cuk^V`*QQL(Dv6cdX^-oQvJaQ_-I&H7=|IrQSdv_*O#p99haNm}ZF`@-nSTzqnA z#%!B~r~!wDL%Lcgu_iz`VWP^&5O8u^0q>03P?F1_6_O0Y3fHvM3KJ`;VNzwi1hQ1Q zZQ8@4l$y5wppiJoPKGTN+>IbdEl6lBf3ai`h3~+1S&fA2%KCY!dX7y1a2MSisI5!= z5bMHE&_u_97EtVDJXtKjAjb={W212U+)0-XvYDa^RK#$^KHzXrF&rWiqr+)cYMFiQ z+5@Z$H7oLXEklEyel)CzF1 zf`->xH$4*WZ16iZj^Q{uF*(MB%8;QzkDlD-?`XlMH&+UdmmS#68VHq(@p7$rCE5tg zH4!OmExbUiZ>3g_H(;(M0F95#ykHVfYew4e7R?Jjii5ljo8ZBQ;Q6`R5jok*BKpWHcK<7XJ*f$Wbmc}QL>z19EO7cQ6kr7o@#@M?y3G4 zPR%NO*!_is+!GZMf_*~R{dt7WZ4J)MENRo>aN_wLhHm{_L zfO>b2NV$qbTt%^?AWn=YB|{Q7U{zeof}jCXCX>z35NT{4m>J0_U5Hw)8hZW?P%ayXcETFSBu8G;=ooTB`s6>yfmmewNBDk>DWQe8?L2K@B!9IhP zrM5*d2=Kc(KdZzNVkVm;ibiFuC;~B_I~NseI3R#in4UpIDnO+pFxQAijmt01Pas&0 z6ixhzRioR(AUpXr!birNyHZSFZ#z?*hp(-{7^121spBs6*OUxMW9|-b&-)6KQ$cEfCLr5QFnC4kPwnf zC_o?z&1hCyE^AtnPiEBA*h$PwMD5a?03tcD(l8Seicd|YM4>fj*9IzDNqUmwQe~rT z&U!po^ea(>KY%bysRZL}L{jl&B{Gg=0D`GJUor!7tSbb$TB;~aYAzk{S0ttOf*v5q z8)^!F<_!AMHJr~odq%CD#s)q!Ils7sWg(rZ(}3WB-9(BFiDgaAup84h?KesqSjS)CzeH8wsm1-Vm&) zG!wzrq*ljhsoHXjUN9E0kk53w))q|EXut&ZDy#4>2obDsRc{>Hl4rzVLr71Q2j7Q9 z#T$GXk)<^>G>`Jk(sV4p-Sp`E>D;`%V%8ID$a*42jcgTwD3%JBR8#1F#_ zN&jZFFg7_oIwoTdD@Pd&>$OU`a0SE$qN!ejyD8|rj(uRXVIS?7;;-pW&Md?yawqXf zTPH#wlsCE%s3#I-&=w6n%tXR?ZfbGV)=#%jAT<`}QNHYsoIn^O?P!}P1sv7jQMYj? zTtp2_`3<&aVZDVclot(2fG%Jbk_``Eh+JIe@2$E%hle2%gfJH&BgBO3Ms`gQM@$8c zXlbUyyGz(Y`U(6&{$6KNf%3JKvY@?)x3aX{!e4D|+giw5U@RO7zGe%i)dW5OQQE#x z*cf?`Dul-r1;WF}1Ib+p6FIK19c0PCbqqsOBbsVqEGB1B2gEO3>9EG7Dq;WF^cH~g z6skLFd~N{;HTZ3&I7Ggt4#}c0XMBCb43wsbZtT>&EvBMD7+YhebL&k>?7>Z?p~xJk zcsgr^#7;}+<$P!M#CR;`B`?wni)|{jq?tHxGIiW*a+^zYZ{#n-ku0hP6D?e{XoOs2 z@+e6Ml(W$&d9%+$i;vZddtAnDgt6pKSDC^{d1oVwxpTPw5+?`PYAnk}jJ5%K1YUUo zAEmT<2_z{nntkvlTVp79jn-O&NFgki1#^v$0h;F&mn0-@L~NSV{P+;lPt>N(7L4GD zh4193`Juhg8AED2f;t@L5y1k9ZLxl-T*!i1=t-Kb!Wm*IhCC~IY?s9FmQokvyGfjk z(h^PJnA1Txqvpt-HZwupBi+TCBP=mXakAxc7;biT8akUdSERjw_j7c7l8f9t_Jnv% zlkwEdv4K0x7Gbl4C`fHApJrl#B^)YW$6qIXUJ3_hNKkyGFyc6-RdqSNgr6zJZ%eRp z#6Q2Vn46BrM;Av=jKXZ?Y*d8ZIXF{x|DKuRD`=Q&^Ab$mJZ1W6QWljZXLa{jWMS_IEA4x;PGodNW-c?%*=3Lk?9YOP&2_!o^ zzYx#POwCAF3Al|jI)s#@bB`{bGK7|HBKHn_TFQf{--U~0txC%1b$jw)`?U3wHKTvj92w5i5 zx^WyNmnh(=_;gz-XS%2CDtIA&eVmY{f59w9$4(i&2gS#b-b^5nTg*a^#G&*GWj>gy zz5?YMrhHjoN0P!9Pfjf@5R5Z7$+Y>}#hO%33x-~sB+!P_iLgiTYN0k3qo7xTG$)e< zY6s+6RSyBAuunmW%@rWIUNgR7F^g*AhJ)=U98spU3nR$$xS1mqH>O<4KV18eD_*8#xat((UKo4Lq)6Iz&y;@er*yzkyZc6LgRu1ub%V#18yC+BlsEJlm@XKuS zhRu-?Z;;0+97{d&3P#9CTtNjh`6fys`)YB1_I#%wLoqB~tke|@z_bx&2C>ed7=cDy zEvE|`mdxZt;WAlE<;ps6EE`i-L`|5uM)cX)n#(kSF>&~ZAqGQR3{^NcGm9q{Pn50A z5|}Sf2k5Ak8eMSz2=c`oB)T~^bvj&G6|M^ZRI^jFsD}9L73*LIrZj1)!P+w=3qdUpNr=}3e+y9ayn!KOLZm~@ zkTPJyE0#P$WMenVH+F$fiWNuaHu4^u%8kzOg+s;TrG-ey$N{NA>y0o`aPLBi+1gBGDBd+(x|B#V1G z%{6MRI_99bufT++Mv}vZ0{oX+M8<@nAnFQiU81YaUSZHloG$UjK@qienF^-FH7{WG zOYIVCOl$=rDGlkfsE_F0E=362gx7q1CJ1b$E_2k1#N(t@!aYNy9yK;SOuB}pxyiXp zOH>#Ne{tKTQS#K51gIX<-{eJd^hODA$w#MT{O4O0`O+;}+}2Zg4+?-;BP=Q0d!8Od zQUX$~0bZis>Hq?Jc-B$#!FYUrc5V(P?=s(nwQ*?kgUn1u1l`T15M&(tQ@zOIK)7Hp zC=&@d=Hax`U$LkKtLafS?2#zDaS~H*Vj3!dqTRJbDu@D+rNU~>{ba2sIN=c+XSl{T zeI@W@5s1N2*w|pfSR(7%xuDb}2I1a2ML`U|Rw@F&$Hzkc02F7lQ0$4NQqSg{1E#tirw_vZ3e~+N{`+ zY4;uq2fagtA&3F7h}1-tpQ4z*VoI3^@DU+Bz2nml{EC~h>f3C`oJUj{MGG;8<`ytY zZn*{*QGB?8SItWmBr<9DJ0_Y#KKJ`%x| z=o%g)wR3?rk#)gaC;@FVt4%6QO1LbCkwRPasu;Db!*wQ%TM z&cm41U|!@13#DshL%Ej6=T@m>xEo(Jy%DqMyp794X5wEdqP?7osFy52heGdAHe$wA zDL5%3HdxcZ7)%hD^+3w5EvMlMsKTuAoht@4d*T7a!~*_7@nXVqs)E8Hd?K-L8hk|m zBHUn6KvX#6?n>>%(ULgroIIE7u9{mDozY-?(y%PElf(kub7z5FQnbissnj)V@o>Y$^o#BAX*j8woHJH-xLBQ19XTi9GK*b`H^O|gS^ z@C9AU!og^Xi9~|Vgfj}8dgh#h02m*bJ@WZDn=}=}XoC}OBq+rgfW_Dpt(Q0`QsxU-(ojlbIenBJ74<=8@d1mH3ip5Ep zE@>o5Sy~DV!vB*%tOYQWyd--lj&IB=L9kVdN^W}`78tUWKituCGW0sY+mG=oOyI`BF8&#|K2rzk!$5T;k>plHMV&P+6G{@~gWSg@gze zSrnp>ghko$fr4#h`x;XNDK)wV5iz{eip~b263Hr7W6Nupf$*CYAt*d3baPk7*!=mq z#WXxVHbZzKcg|CWEp{g)l*b%{H~4c1ec(vaK{ow#mL!HKOD6NxKv zpAJi3SsLVqY8*o6Sgx+g699ez6hJ9671B~ZVCqsKHzC8OJg-!LM64Kp>R7KU&K;pz z`j<#|#^5SO3R2}8v_T30<(EbhVlm_3lcLB(q>Ssb4LSm1BMB8j)XIm%ElO0BNy#QW zL6pk4fpiGeN+}8o)40hK)Inne^67Z2AF3iWqTr3hVQ2b{TAhYBEY8m0!?L_%>nVuJ zO^E|AF4JWFuMB;9L$9gVLTV*}<>_$~*U~TKa%X<>Xvxo}v=#$5-kXGeO;ZxHlR!7$ zx)VC&QLZ7^l#B^t%g$4F!AxUGDo@6;0SJ+AgL|8A*HA)nP<{H$8#r^ zCUBJ@4`*Q8vvW~3=zm)0pvwfVBN%o1ro;@*VfMBbW}sA39MzV6L6A-h;NBLZ;%=YF zt%&OmOIK-bM)jh-M1eY$gOECu9Ayu&;+GBiX%57fImNKB+RSK8Qg<{|kFwwnN%eDO zK^T3O3c>g6P!O8nvU5FHlQdVTf^@;mEDJB|K}A!<7__-FCJqtMhY(aVL})dS^FqhOv2Jh|@5w!A{(mW9{+hV5>!;(B z3yCSM0i>}B<07d;-k2Eqgp0GY@xru1lxDxVH74?Kk0Nectdx$FK`ooqm>P^4=L)I8 zFfGz?f+FX<)toeQ?NBf&FNOw2?}bwNvLu2tMCpffI5AG8AtTd9#UITb$ppz768tRU zZuS5=C;M)c&)W7fVQPY^$PseY#G71a(<~Qq6J#$SJODVEmu?4On1;ZE1+Ghde>=BmyL8A^Wc!&Xq{SP3SI_+3!X`=3VNR4h)@Q^%p9b;`yX)>3Ed&tg^ zqH9ltY@^eLhnAacm~XLhM}3hh4zFPw6&J^pdaIl=3zHhP!0#kLB>@FLk~k*Ea`^mn zW0NNlc(#qf0uv@w0w2$5jGnk!I5|+6$Y2Vl5lm_Cc(jgJ9NH629bjzF}^KwhDU(46i>FCMN1c0A5x4&NK3}O zG(GH+Bs)Jzc=U>RQ>Bo!)|L_BLf0S~5;ON@bJSj$+1(Uc)@iPc^_MZCwPi|*sWojIU;`}@F_4yBHXpcq$(JB1{*4I z9rz~Dx05L(UlH`CN{LRQJRA#6YOJXE@OP8^2FMQUCdE&H6*ybRni!Bc(If$$^`IPM z0O2XCsGp9zdW7lS)?aNn56qq**$>rwc1lX5r`p&PY~IoHo|R(40AMLD5uaE}BPn=N zeXoOOQcAdL(L$b%z%frNhfyIjPuG9#S1=oC{NEw5*c@d61GddN*L%QSU(ZVVA zYEn8eIzK;2?raoN)a|BM(Z2OD6c-@v9tKSJBvXl=(k`YS^n?>Fq_Gh#n7hrDPMDb2 z0=706h~Wvl!xj|Xo}Q8hqY#8qNN_H@h(ump@hrRVZYi;+#!x_M!M>xXBbX?u0nUzV zJ=+_K0^Y7#(phQ6+*xz;kr~^z!N`qS@nW%>xwG!>HHKiuMCiz@MBlt4`Zc>8;ZQB) z*>`JOfFu~@qbL(bur2&;I<-6)eCy6=|#$nZbhh4haFp=#huU!?#abbo-%9T>~uql6A=NErBE!`HU>_Kz~c1OddP=(}mF{eb!vYOFYd??^67LO7noYGor z+NkR;)+T#`1HORh%2T{j;w*{;TG-g>B?*4uj+6pwaZ-iLR&)VU&Ml70k`s%y7v!xM zJ)T$HRm8dBa9a*g)z*@=YA4i$sllL3hP4923ks#VG&;<>ncP`x)ODB9F>{M*(?P&m z(zd`2pi82dd!2)DNFsMOeo%G!ZNS>71Y`wDWGp8kck&13LjpF$yhSC)tt-tkh@eh| zJhhLd!N~D#Tb-3sh@(+>r>stCNWwIO19NpngauE1Hi4~=&YdD15Y8vRt6~3a{TZF7CaWJVRxPUCX%mO^PL96)lE;BaFPxl$)Q`X>u?jnboClV`9 z-kx+Kw6Yj6scf<+P%_#yoRCD%G?HMNS@cdqnBI2Ol+!<3bwshIWon_?mbc_Surft< zgAEL9LNFhw(lfzF<))*cwF12jixi~eppqa791`9CK4j6DZzji{%Pbgb3N!e3NW~N{@LM8HrwteBm zuU!~3$#5KuFSsR1u%9|eJQH;*sUc}R1NTYDR$knV0JV;Zy zX;LdtETC3TGXMl(D}dqUmW~q!lO+Eb@}Qp0Eaax$GEKJ-rMog@jG7!(s)3n}XirF2 zvxJ;|O_O2@kStq7lvr{j=A>g>tC4Z$Xy zktEV)#NbJ=2!tsOq82%_ZA`9_SLI`N?;hmosZ6HP!NCMdcL;=JFa|zlKwKBk@Gxwu zM1}nC#Adh6N48r8_=}BuCe4VG2^1|@)mu2Sv?WnoEA@{A8{1u$h_Ya9CsKKijjY;9 z0_!6RYGINPl}fydqW_RI$!Q?wU(!NK;kDsP{wjl&wRnm3lyaI_qMNXi?H`2SxAzZX zavNRCmuCu!Hg>VxLNO>w8-YzdbKXCFLW%rleDP4>b=V)+)cI^>Jvwtf>M(ysPmpO3lS;(6MZ!kUOpv&2 zmN)Bb`WKyDA(vId7fyRDr-RNcP-4cQcBW{lWUIqqmC)o0o%XEqSv;77V7aW6UJ+@K*RzlC#8`!qUHISH^ra`>mTOgN9ERs_Mq>iUW% zexyL`a^e|sCUoe>W$~03=`eCqom0N)7nr!OEgse_+Vx!ki&?u-BXXeun0e?^0Ja`H8^bo{-M+2uR~vdS-u_) zp%Hn>wC_yHVmkEe(K7(J?kkcCCJ{9yqdHxsKY>Tr7cr zpzh>?@<^26AtOZK(-@q1O^b$UTWTFcPqSQ7vDA^*EKi3{4Y315MyFUTcdsi-y*a&9 z;#3`pXXCbw$oHzkg^2EnVJ9cU7)Dx5(QMC3vg6S?L*U@Z8ziowiMK8a_Lrs zfPVhRbr!X$NFL!9bGI4YunvY@p6e4l96D12N+}a_QkF$>=BSP)O_4sqHoYA>JDp<> zy*PwmYh-5f$upM#tZk+fma#?%P_$$e9rrMRcH#$tZp}_&WbV7htE&c;pBT$opdN?W z=$A8aT0ba2esBkD*txEP4wn9-z=Z_`K&+7d6OOAQf(<%~S_~P}O^r5a)4vopOVxTg z%mh5y@L~em5uslS6p-b>N0+3SSr`XeB(*}3ctZY~ETkh@g9R|`Ru890kv|b!+$m@X zLBpfLO>ks(28H{pne zY2_%3u7x(IY2JO~aopdMI=nOmsp=2bz%v)zm!qkAJ*J=u>EJ)U~) zau97_@nQ4>P2EGmzBwWZ3%Bnd>kNno%}_Rk5W`q!dt1D1tP@7CUL?!e-c{3zq)2*> zlb*UREMiLHFd{q6hf}u9XNBd)c4>K)Hs`5$a0difHFUt{Hh>eYM}v0;0BWL#1+`2m zqFQgG@TUCN78o+Zs4E~MG2b@s!At=R{$TOd4v&$J+SExDK4B1;Goq!VmL;qlLlOq+ zx~FX@B#dX+hG)j8+RwW)Z4}6}nq=C^Z(zK0lRuLbJrcFVmnDz2{fWT3B#HunP^!J5 zH8OAsl$#tN;}i4vKYU9)wzrx3mil217F&IEPhu75eJC4Pn-g}Dh_nvv3JeMQXc$%3 z1(c=?(^2%?#E@~Sw&5wWV}&zBwEvF_M-EDgm1_sJEMq+`N1 zr~aAsDwQI#-C;@WF&Q+bC_C3%Yin1WZ|X22ZJd;$Kct+JL`rl(bbb*f(x^dnCo4G} zjLkC~%;+a_nKcx$`AGIwHnI+bkxS489Hzxe14*d#U?l`8(Ua5*Ph1yvnrY>tRmkio z2_@<@+MzWrGbM3NB@qyzigG&>ZjsDu*z%UE7BLZ9@HCPLM+4wBLNcnyGMziy8J|vF zBg#!GOMckqesU89EejhZ8zSJ3C4`M>ok=z_2hAFJ`%VE*%WaU-<{DMd)&+6j6yw%U z1sqh^jp>OYief|VmS$&GLeQ~ohnjAR{juQzDpb~~2Vh9MgJEJ+ijsW)O4!|Oi?F^? z)cJyjJ_OqBa2}zYXDp?%xSePyqif4PjNoYFLD&k>Hp=7%=34>A7Z5S2s@;-T7+8v5 z5>rfE72+!)W7QNQ5o_=;2@Y*}V1|~cXPC@z+eWt_&E0l$29rM!DN@kYeUX1SI)$x^ z?C{f}KFUm$v!L8SZzH=~+oI&WL><8YYCO%%+nI%U^rYpl(n~vGv_oo`QSA)hbB*jo zC)$RObHpsG=Lxl-wU&}$T^@2N*EXx=@0GKQWxpc-LCR3jDe=RR;A$icgg<{r-ObCjyB+wmiu zID5R)QEY^gZoo+7i3vfDVp+|vVGo;3G0f*}&RGk=2AwYsLL%hy;^&E5+dV%9M{5SZ zki`y6FkxPU-MD2u&rp!E-O@OU6`7GQ4CFW8N7y{2K$DhNX0iJP10jHnC@9YD7avN! z(59Zj6N0)6Op_gC{T0%mXQur z*9?J>rRE1Vcnydpw1a7>>gfEiqV;I9NI)is))-M!T^YS1Q_W~UpZsc_jybR%|L1!Ciq3vd zEF;a%k7ie9x@`*yDls7w&&6{`?6E|J=KhETvQf2-4+`rz2~T-2eq^t)8y@L=NjEAD zseJ2)i|U{r5rH(1)y8U>xRd$T-Ly;Xg-t#Rk5$OEz(mcGN<;Ml?g?)wD;4)8ZW_xz z3Al~|U>2A!Uk4$fs?4IdYyD*yg?_}hXCBJU&l+wUqZ*yTm=|A897cXAkl)j-57?B`Q17DCV% zprL~K0@S)kC2>PZWL%Oeg|9ngPio-v9C`um2e@imfeihNWzcn5X*_UhafozRn%ZQ3 zpOUNOlK!`PK6qgH~99mhc@A-Y1pAhKFfI}T@uWtUIfk^+z^tgmvtYc}VMZcv zTp}UDwyXw{H7YRolu{9e8Kx%E3jB*z71Tmhd2A^)tX*vw@7NNBCWoeA#Gg7%QYK>g zCB)zGl%|{Y+tJX6}Y}&=AE^!W)1w zwB<((+KHLs#q#+`&~jZfJw+#*RchL~te6sj2nmn)hXXrDAAqp&h6*CCC@A+*{7|;P z7=f8!X^2A-D0ujq(UmeMrv<^GqlbAD7M9q1{zn^05N}?n0NZi0d#)l-iBy^bAw9*qbDYhG>Iq;nB!@nc%{mV zk^M!(93UZPAd!Eag_vjP5vu1G>tuxvSR&VeZR8%%;jBEW87m(sk+jNg4nFYaW!}px zgKwZ@b#ttu^+yDY~QTnGf>fskM{Jw$X`BNn*P}LtSBAiKi^Q($HAiB z$9j5ud2oR1*Trq>i_Hc&zB>u-fvRxH>r0&|Mf0^ ztd71Z#aD9maWbpd^X{JB9tyunIr&jt{Y>zm&uP`v@AK4qo_dG5PWsh-{a@t&cS5}v zsP_W(2D#VSFU6?9e?A0f?;POUT?c4L<4M}nU%ng{RrsIO8>F7T)cYv+^jz~x>b1Dm zSo!!|q>mzgf(LxyI{i^S{jBppsrNkfp65YdGD)7Pp8mh1qn^HY`2{BMIW185N!oji za?+l@(D=+wzG$6P;%`##heJKV=u6c567^1Y^m~B&`uQOLbzAige~|U%tK3N&+)A&1 znrqbqyivqwl?6PlNAi=r^D%A+CaQOsdWWg^Jl9$e{ivSc{Biy#?Y%&~7pSNE$xqVW zKjlVJ?;F(n#&@Zw?t-f+i_eZiWS4`^t^_F^H{P`%lKLJL^v#WU_c}K162k?KWg$zH*v%OpDee0h`(N~j7{7srZ z5b6zvXJ27~CRf`P)t>$XF2||xXz1ol^g2BVKgp&33P+QlXKu|zUxGev;l>&Mt6xyV zXxDI*YyG_cNG4iHkdJcGo;}?1OZ-x|_^_-!5nuGO_bmSBW$!_J&dWY)@iQ-bhvHja zc0h_hdD#hDe8|i8ClbH$vN(|Q6)*FhM}EXVyev)>MdA})=Igush#z7qM&<(BddTgsgrPxbj?e8*3B^s0`Mp6}mMzIjXez?SkYoA9J3 z`ug7pw~`-~JMl>6V)Br`D%ZA@-@c{1_4(HJw?5z6-`4tDpa1v9^S^Bw&mU|l4|X)D z`Mh^ad29WS$2R}J?fAB~_aqJK)5027SF|JgdmSBUJkL;0@G}!#8-0>;f}a^Qp64ki z_@0S&M}MgI13qTJ*RN3S4fvb^|G!H49M4rP1HOKPivxV4GwFX9Ea2ge^49U(!1EW= z_O6XyL-|{2d2cjAxpO=xD0hx$hVm1EUNzsMo`)aJ_rJFuTkC5c$&cRu+pfpf_CC2~ zJfEe!gZYW_1i$}6Ir&bg#{VK^$$yPu5C6VR`3vx`OO(Y;cELi$pTs%$M7yGWl)u9B zgW>sMvDol_ALGB9@;7+?i{be+<({PduD<9Y%8Rr&V$XL(Z=>7`{@fkvzn8M~G>Y_p zP4s@sui*K!07~Qe8NJW?`*^O8K0!I*uh%l4U!i=M`r^c@FMYIge1Ay!5d9C@^BvKj zQcn1v#{XB8lkc;ty>C%IPJ7=B?Y&YRcg**8%E>okRe!kS`2pbl2FeM)zc$(#jZr>D zd;co5w?z3I?>uT$=vZx15#%N_WzS0XfpM_+WHLxvyV z(Fo<|Y44p}YdyxdJdf^^Sw@)XfXu2lwvTCEZV?zddTe;)?mI`0*azoNEO83Z(F=G| z3P*+q_=M#V`+()h;PBwcvEifkg4GNkfA{PhzMXuZ9yO1Yt8a`r?f!^aste!Oo*J#A zY8lg)?qs(P6u#f>hmXF0f4?Pvl;EnqdaWVL#AetE#FMqcHXXdHoD@aBjV9ZgcogF( zB@I)q~@9SNig5AaE{P<_oY^zt1oOBKqPqU?MpwIM48E_^0G6 zxVbgY^w2G(7Ho~dj-MwG$cYB_v4Q*VpCI5ta2W{k`QUh!LvA>qsoGrG^n_Fi{JM6K zmu+>SV>?WCbERUVmbegOqD#xlCh-#=r} zc_&~6GhZogy5BiI$DEDfI$N(7R_pCsgCyDL_>4`rw9TWl3O@33XE`pJcPXBjnmsYf?&*^!^?d|8 zbSwr_OQp?~JqxW_>AcH8s)h9{owxASx91fAg|Bqew`@D7_`v0OJ_MG=aFsXkSjn%t Lxyd%YLM#6d2Npf= literal 0 HcmV?d00001 diff --git a/lustre/tests/ll_dirstripe_verify.c b/lustre/tests/ll_dirstripe_verify.c new file mode 100644 index 0000000..a4ce6d1 --- /dev/null +++ b/lustre/tests/ll_dirstripe_verify.c @@ -0,0 +1,201 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * ll_dirstripe_verify

: + * - to verify if the file has the same lov_user_md setting as the parent dir. + * - if dir's offset is set -1, ll_dirstripe_verify + * is used to further verify if file1 and file2's obdidx is continuous. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + + +#define MAX_LOV_UUID_COUNT 1000 + +int compare(struct lov_user_md *lum_dir, struct lov_user_md *lum_file1, + struct lov_user_md *lum_file2) +{ + int stripe_count; + int stripe_size; + int stripe_offset; + int ost_count; + int fd; + char buf[32]; + int i; + + stripe_count = (int)lum_dir->lmm_stripe_count; + if (stripe_count == 0) { + fd = open("/proc/fs/lustre/lov/lov1/stripecount", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "open proc file error: %s\n", + strerror(errno)); + return -1; + } + if (read(fd, buf, sizeof(buf)) == -1) { + fprintf(stderr, "read proc file error: %s\n", + strerror(errno)); + close(fd); + return -1; + } + + stripe_count = atoi(buf); + stripe_count = stripe_count ? stripe_count : 1; + close(fd); + } + + stripe_size = (int)lum_dir->lmm_stripe_size; + if (stripe_size == 0) { + fd = open("/proc/fs/lustre/lov/lov1/stripesize", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "open proc file error: %s\n", + strerror(errno)); + return -1; + } + if (read(fd, buf, sizeof(buf)) == -1) { + fprintf(stderr, "read proc file error: %s\n", + strerror(errno)); + close(fd); + return -1; + } + + stripe_size = atoi(buf); + close(fd); + } + + fd = open("/proc/fs/lustre/lov/lov1/numobd", O_RDONLY); + if(fd == -1) { + fprintf(stderr, "open proc file error: %s\n", + strerror(errno)); + return -1; + } + if (read(fd, buf, sizeof(buf)) == -1) { + fprintf(stderr, "read proc file error: %s\n", + strerror(errno)); + close(fd); + return -1; + } + + ost_count = atoi(buf); + close(fd); + + if ((lum_file1->lmm_stripe_count != stripe_count) || + (lum_file1->lmm_stripe_size != stripe_size)) + return -1; + + stripe_offset = (short int)lum_dir->lmm_stripe_offset; + if (stripe_offset != -1) { + for (i = 0; i < stripe_count; i++) + if (lum_file1->lmm_objects[i].l_ost_idx != + (stripe_offset + i) % ost_count) + return -1; + } else if (lum_file2 != NULL) { + int next, idx; + next = (lum_file1->lmm_objects[stripe_count-1].l_ost_idx + 1) + % ost_count; + idx = lum_file2->lmm_objects[0].l_ost_idx; + if (idx != next) + return -1; + } + + return 0; +} + +int main(int argc, char **argv) +{ + DIR * dir; + struct lov_user_md *lum_dir, *lum_file1, *lum_file2=NULL; + int rc; + int lum_size; + char *fname; + + if (argc < 3) { + fprintf(stderr, "Usage: %s [filename2]\n", + argv[0]); + exit(1); + } + + dir = opendir(argv[1]); + if (dir == NULL) { + fprintf(stderr, "%s opendir failed\n", argv[1]); + return errno; + } + + lum_size = lov_mds_md_size(MAX_LOV_UUID_COUNT); + if ((lum_dir = (struct lov_user_md *)malloc(lum_size)) == NULL) { + fprintf(stderr, "unable to allocate memory for ioctl's"); + return errno; + } + + rc = ioctl(dirfd(dir), LL_IOC_LOV_GETSTRIPE, lum_dir); + if (rc) { + if (errno == ENODATA) { + lum_dir->lmm_stripe_size = 0; + lum_dir->lmm_stripe_count = 0; + lum_dir->lmm_stripe_offset = -1; + } else { + rc = errno; + goto cleanup; + } + } + + if ((lum_file1 = (struct lov_user_md *)malloc(lum_size)) == NULL) { + fprintf(stderr, "unable to allocate memory for ioctl's"); + rc = errno; + goto cleanup; + } + + fname = strrchr(argv[2], '/'); + fname++; + strncpy((char *)lum_file1, fname, lum_size); + rc = ioctl(dirfd(dir), IOC_MDC_GETSTRIPE, lum_file1); + if (rc) { + rc = errno; + goto cleanup; + } + + if (argc == 4) { + if ((lum_file2 = (struct lov_user_md *)malloc(lum_size)) + == NULL) { + fprintf(stderr, + "unable to allocate memory for ioctl's"); + rc = errno; + goto cleanup; + } + + fname = strrchr(argv[3], '/'); + fname++; + strncpy((char *)lum_file2, fname, lum_size); + rc = ioctl(dirfd(dir), IOC_MDC_GETSTRIPE, lum_file2); + if (rc) { + rc = errno; + goto cleanup; + } + } + + rc = compare(lum_dir, lum_file1, lum_file2); + +cleanup: + if (lum_dir != NULL) + free(lum_dir); + if (lum_file1 != NULL) + free(lum_file1); + if (lum_file2 != NULL) + free(lum_file2); + + return rc; +} -- 1.8.3.1