On Dec 12, 2021, at 11:35 PM, Andreas Dilger wrote: > > Don't call into ext2fs_get_pathname() to do a name lookup for a > disconnected directory, since the directory block traversal in > pass1 has already scanned all of the leaf blocks and never finds > the entry, always printing "???". If the name entry had been > found earlier, the directory would not be disconnected in pass3. > > Instead, lookup ".." and print the parent name in the prompt, and > then do not search for the current directory name at all. This > avoids a useless full directory scan for each disconnected entry, > which can potentially be slow if the parent directory is large. > > Separate the recursively looped directory case to a new error code, > since it is a different problem that should use its own descriptive > text, and a proper pathname can be shown in this case. Ping. The current behaviour is O(n^2). With very large directories (10M or more entries) this can cause e2fsck to run for many days as each full-directory scan can be over 1s and is totally unnecessary. Cheers, Andreas > > Lustre-bug-Id: https://jira.whamcloud.com/browse/LU-15330 > Change-Id: If17a92689f24f365ca1fbe5c837e7d5f383ebbe5 > Signed-off-by: Andreas Dilger > --- > e2fsck/pass3.c | 19 ++++++++++++------- > e2fsck/problem.c | 8 +++++++- > e2fsck/problem.h | 3 +++ > tests/f_bad_encryption/expect.1 | 6 +++--- > tests/f_badroot/expect.1 | 2 +- > tests/f_encrypted_lpf/expect.1 | 4 ++-- > tests/f_expand/expect.1.gz | Bin 13462 -> 13461 bytes > tests/f_lpf2/expect.1 | 4 ++-- > tests/f_noroot/expect.1 | 4 ++-- > tests/f_orphan_dotdot_ft/expect.1 | 6 +++--- > tests/f_rebuild_csum_rootdir/expect.1 | 2 +- > tests/f_recnect_bad/expect.1 | 2 +- > tests/f_resize_inode_meta_bg/expect.1 | 2 +- > 13 files changed, 38 insertions(+), 24 deletions(-) > > diff --git a/e2fsck/pass3.c b/e2fsck/pass3.c > index cedaaf5a..d6b8c8b4 100644 > --- a/e2fsck/pass3.c > +++ b/e2fsck/pass3.c > @@ -22,7 +22,7 @@ > * will offer to reconnect it to /lost+found. While it is chasing > * parent pointers up the filesystem tree, if pass3 sees a directory > * twice, then it has detected a filesystem loop, and it will again > - * offer to reconnect the directory to /lost+found in to break the > + * offer to reconnect the directory to /lost+found in order to break the > * filesystem loop. > * > * Pass 3 also contains the subroutine, e2fsck_reconnect_file() to > @@ -304,7 +304,7 @@ static int check_directory(e2fsck_t ctx, ext2_ino_t dir, > * If it was marked done already, then we've reached a > * parent we've already checked. > */ > - if (ext2fs_mark_inode_bitmap2(inode_done_map, ino)) > + if (ext2fs_mark_inode_bitmap2(inode_done_map, ino)) > break; > > if (e2fsck_dir_info_get_parent(ctx, ino, &parent)) { > @@ -319,13 +319,18 @@ static int check_directory(e2fsck_t ctx, ext2_ino_t dir, > */ > if (!parent || > (loop_pass && > - (ext2fs_test_inode_bitmap2(inode_loop_detect, > - parent)))) { > + ext2fs_test_inode_bitmap2(inode_loop_detect, parent))) { > pctx->ino = ino; > - if (fix_problem(ctx, PR_3_UNCONNECTED_DIR, pctx)) { > - if (e2fsck_reconnect_file(ctx, pctx->ino)) > + if (parent) > + pctx->dir = parent; > + else > + ext2fs_lookup(fs, ino, "..", 2, NULL, > + &pctx->dir); > + if (fix_problem(ctx, !parent ? PR_3_UNCONNECTED_DIR : > + PR_3_LOOPED_DIR, pctx)) { > + if (e2fsck_reconnect_file(ctx, pctx->ino)) { > ext2fs_unmark_valid(fs); > - else { > + } else { > fix_dotdot(ctx, pctx->ino, > ctx->lost_and_found); > parent = ctx->lost_and_found; > diff --git a/e2fsck/problem.c b/e2fsck/problem.c > index 757b5d56..66c9ae94 100644 > --- a/e2fsck/problem.c > +++ b/e2fsck/problem.c > @@ -1852,7 +1852,7 @@ static struct e2fsck_problem problem_table[] = { > /* Unconnected directory inode */ > { PR_3_UNCONNECTED_DIR, > /* xgettext:no-c-format */ > - N_("Unconnected @d @i %i (%p)\n"), > + N_("Unconnected @d @i %i (was in %q)\n"), > PROMPT_CONNECT, 0, 0, 0, 0 }, > > /* /lost+found not found */ > @@ -1989,6 +1989,12 @@ static struct e2fsck_problem problem_table[] = { > N_("/@l is encrypted\n"), > PROMPT_CLEAR, 0, 0, 0, 0 }, > > + /* Recursively looped directory inode */ > + { PR_3_LOOPED_DIR, > + /* xgettext:no-c-format */ > + N_("Recursively looped @d @i %i (%p)\n"), > + PROMPT_CONNECT, 0, 0, 0, 0 }, > + > /* Pass 3A Directory Optimization */ > > /* Pass 3A: Optimizing directories */ > diff --git a/e2fsck/problem.h b/e2fsck/problem.h > index 24cdcf9b..e86bc889 100644 > --- a/e2fsck/problem.h > +++ b/e2fsck/problem.h > @@ -1132,6 +1132,9 @@ struct problem_context { > /* Lost+found is encrypted */ > #define PR_3_LPF_ENCRYPTED 0x03001B > > +/* Recursively looped directory inode */ > +#define PR_3_LOOPED_DIR 0x03001D > + > /* > * Pass 3a --- rehashing directories > */ > diff --git a/tests/f_bad_encryption/expect.1 b/tests/f_bad_encryption/expect.1 > index d743e66f..70270959 100644 > --- a/tests/f_bad_encryption/expect.1 > +++ b/tests/f_bad_encryption/expect.1 > @@ -54,13 +54,13 @@ Encrypted entry '\M-ggCeM-/?M-^BM-{(M-^OM-9M-^QQAM-^N=M-c^Mo' in /edir (12) refe > Clear? yes > > Pass 3: Checking directory connectivity > -Unconnected directory inode 18 (/edir/???) > +Unconnected directory inode 18 (was in /edir) > Connect to /lost+found? yes > > -Unconnected directory inode 24 (/edir/???) > +Unconnected directory inode 24 (was in /edir) > Connect to /lost+found? yes > > -Unconnected directory inode 27 (/edir/???) > +Unconnected directory inode 27 (was in /edir) > Connect to /lost+found? yes > > Pass 4: Checking reference counts > diff --git a/tests/f_badroot/expect.1 b/tests/f_badroot/expect.1 > index f9d01e57..ff924268 100644 > --- a/tests/f_badroot/expect.1 > +++ b/tests/f_badroot/expect.1 > @@ -9,7 +9,7 @@ Entry '..' in <2>/<11> (11) has deleted/unused inode 2. Clear? yes > Pass 3: Checking directory connectivity > Root inode not allocated. Allocate? yes > > -Unconnected directory inode 11 (...) > +Unconnected directory inode 11 (was in /) > Connect to /lost+found? yes > > /lost+found not found. Create? yes > diff --git a/tests/f_encrypted_lpf/expect.1 b/tests/f_encrypted_lpf/expect.1 > index 7e215b7d..63ac5f3b 100644 > --- a/tests/f_encrypted_lpf/expect.1 > +++ b/tests/f_encrypted_lpf/expect.1 > @@ -1,7 +1,7 @@ > Pass 1: Checking inodes, blocks, and sizes > Pass 2: Checking directory structure > Pass 3: Checking directory connectivity > -Unconnected directory inode 12 (/???) > +Unconnected directory inode 12 (was in /) > Connect to /lost+found? yes > > /lost+found is encrypted > @@ -13,7 +13,7 @@ Restarting e2fsck from the beginning... > Pass 1: Checking inodes, blocks, and sizes > Pass 2: Checking directory structure > Pass 3: Checking directory connectivity > -Unconnected directory inode 11 (/???) > +Unconnected directory inode 11 (was in /) > Connect to /lost+found? yes > > Pass 3A: Optimizing directories > diff --git a/tests/f_expand/expect.1.gz b/tests/f_expand/expect.1.gz > index 1015e155ca93f1aea0edfad09be6e795c0ab1898..81fe7dd67f81dd64100b5fdfe2884fab129ab721 100644 > GIT binary patch > literal 13461 > zcmeHOdsq{9)`q4;Z6K*dFrt9Ub`=o`VoEloMy;ZsRsjRbCQ1V8R)-L=K!_KT2uiw0 > zBVAAwibyFTkRm81Py>WZ0V|5t5DE7|DjG2mE(w zob&r-o|$)^*q@j_Jrr9I_y%kbD|FAU@MW$h;dLxv!S&et > z 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 > > literal 13462 > zcmeHOYgiNKwuYvOx(SIb5(0A3vRg$3o#;)C}6sk > z6ZCk&f{2KO5agyNQUip5sP)!r5 z)~xx~_vOpXJI{FRA8j+XWgP82gyjC(jGS-d!#hoVoyt z9Xko->UlMokfmFk`qw)XJ{L^N^*uf7;3EH%VeM&;{8Z(%kVAD-Se)eV zC_9ndeLW<6puHzMoKl_KWxO8JVf{hhCQmjsl=)hox5d>YCRqEq)d|*n+NA#PdvdVm > zXFalz@I;R3X?Edrj|WNS27Z~gy8r&Dht{r?8jk6wn^!z)EQO68HGNM!9weHm;Yoct > z*gi-{bIvI2Fvp*f_vym913GP@^_++K>HJ*Zs-%8hnYPAih?6Inda|ck&B{3*axt~< > z>vd&Xu9!w$mHU`t?4UMY@t{8cCfVe(Lfe zjfJ_r_o)d9=1xa$XSXFYPHySRq*1NCKAo8~8a2uMoi_QhHYsu7ww=2+Y3_i+&Z4{7 > z=HZ)YX_!W}05xXfkGYmC`4 zoYaz;Tkig2YDSuTAoa^hsiep}hodB0V)X*0-Js_0S<7#4KP3#Bl_S!RTQ&(GFH{aj > ztrh7%T;>E^T%b(L`t0`hJmHdAgHq#()eDuwGXI{%yuCeN$e49sq{l6r16*9F9E|!x > zr2k+U7D!m2Ov!S;-F;HHXx5 zJo>i2>CmY9N!WavdwMP#0^Cx5T1KiW|C`;QEWUO*$`K|ix > z?q|9PIrG;E)14P=^#6M9M&WVi)Q$dGa{=KQ=Sv&?v*$85R;?khaDK;;p3#vv))2Pi > z{Bn>{(UC1{2ppW>31ohB zS2({@3+K&XlB4n7>3(*XZ`X0oM@;ZeUu@@hr|#JKh{@jR{&tt|)K#93Ab6)QwewTf > zHJy(jd8aS8yR1B=Iycdv8>{@>6NpTw6Hep&ijYx2 zh^(R$%5i>Yke)G-H|T`(IK~%9lm}vF&df@jUnw#_Ch`fLP=)g=L$=054$uj;IKOhF > zXKW;zLAZqTt3XD@M!GTxS8;x4k@>N=+jr7>YYX+qw@3*myz!gtJe&6%loEvAc)%{d > zc~6CuQ0k43we!^Mxh*9~z41)De9fLtDWS$2&)UC&#;#u^Th@mDCT#^%ag2d)!=W#x > z9b_s*4E$ppT9$U3si z@Mc`PJgqZMVH1kCbxN;Io6b^<4aFm!(iLf2Sc(au_%TlDb!inW1tBz4a`(M9x+=`h > zHFo-b?;G{rtvXy6>pG{hfzmR=ojDzQA)U{713gtW!{PYG896hDa`4Mj2byA7yk*|y > ziZQbE`!Py6K6{ zx2)|Am-m{%6st<7xUM1&=c<3vkdhMIVO{E3{qdcZ8z?R7+?meU3&;43%k|zr>5g`? > z_P>FaH2d?T^uldJI`~(oCbr8ys*T$pL5?17-Iu3Ylw@`2wGUYO8$0({+_C+Ax%yy# > z*djx=+t(fJOO#L-Z03#nf=<@ALx2`%_ovZv>n8 zIn2iPesy#H7g4Z#kD>~K-D9vD4ZF=0)gjmw!EOxfYA7lt>{i}vt*rJZuP(w()p^dr > z_T0FM@ZH`OK)X)?qhPlMb~&*7fCA>j?i1Kegk3EKY=zwc*yX`4NC7=b*dFvPgl}qB > zC9~w{E%n7}I(c<5E=D&?q7e#PRm_~MTS2lUfE)nf#QFsijY#OJW)@`KS}Dr`$Sa|v > zV*N@EJ28@2Ox)+ > z7>o5h38P%-aF@)fU62@6!&|T*BEWsKXF@_us8PDiXN*L#bhwd_! > zSpvE&IEEYpu}k#j5{6W$yvx*N2^g~Y7;+qBEYa6W7?nbYMrLc4AXIiFhP(}8m+HTl > zFfIy%8kvu?1Z!oI81fFtSgHplj4I)wMrK!*AWWu?A@73NWqN~zQ6p3~GEG^6a9K|b > znF|@q^fppPt zhit(*S#T_QKg6!k6QqpGLS++ke6}D;79UH_fQ%LTFQtsDLWg@y&uqbZ*^yZCA&7le > zA0TC169(O5PR$l z%X(tTxsdUko+o8|FLY>T&d(NXk~wZB=R@rC`U6tN9br&2b4j+~Z!+R$av@|quRkee > zsDy`_nL*hCKo-22Tnw=#`f@4bu29*`WMm6sWbvEHWhF)l0u#%pH(^K>Za|a|c$F z0`X>Q^4L-YW;37Oj3G(ffEXXJi7k>qylt91BOGAz=`9%2H*UZ-AMg=dq=tCs;EW3h > zOdOy707I&F19tg zZoqyY5Who2e9GI_l4pbiTlw@KF{E$ZfI~ju zc8KDi^19#*IIx{he}p03b_4Q#z{NX6N8lRw^Vk;=n0P+D9Ya#P0mVMx>K!5pT;qP8 > z5e~5V^d}h7JvZQ-54dTENDbG3Gh_(N4nF-UhIHQzkoka|9ikq%2Aly0IDEPRL(;hc > z^*-QN@HjenGaux!s}Pu-eEKsC>7g5N-3L4dkE4UP?LnRq4kYmD-58SI4N&@kB6u7f > zymN3yH3GAXPd8#nkQ<=!0W0Bgbnv?13^ zNIh=AV|YH`alkdSc}6&p%%=}vNPTWV7d#*EIN%y^h8%(6^63@~$?OK0;Q4^Z0oQ;t > z-~f+Lx51KZ-2nsz9L*6q8hA6oJa#Ptvzt$U4@*M219lV;&k+#~ylr5f5f1F()8EIE > z#<&9x6mT*}6l~y~gEJHeObVZl!jkOWf$ z1g@dWW7i=tX?*%$up~!!U@8S%%@Il98oE3q9N5dJqp>7scVH$3+{6*7;Tmv8Jp#k$ > z(=k|*n|o1c_`Jr zYdxDE^-H%VjlWn^68iRNb97~mwd+5qehGc|Gtacu5Web`&Py2oQFY0I2YVOCO+9^K > z;vLOj^qc>r-=&^3j@3)%CD z(CpAA4s=ud+PDJ)*8WqfRpIkdP5W$TujiHEBmRWHYafi;(1x_Q#>vE{0DEa*ioH5w > z>hA^-YH%`<6ksn1O!*_Ad_%`%6zPDiU>y(P42~q&<%&qWry=I6z%Pj;e|yZzly?@o > zVqF_-M$M>Qfo4rW{C?2zC5kf+K{;US-e7}W&s#LT7M{Wt=ohpFjp{XJKFQ?fUZFgh > zHj$dta-G}f5niqHV&vR099~t3rfg7ojXJSa<>ho@>rJnpk2y~M*g~zU@6s#9(*Q+y > ze_-KXDIcr74B}1k!LzES(APTJm+e~>var7RlsfqKFK9&Bz7-)zlh1XUN8$3_PzJz_ > zFy%LUG+9K(QBtbd{0a)8f%#z>JB?gy9=e&sjs7~*ob#|SBdG9w%Eu}%yAx+sUSnwg > z7VobJ^3OT@%1)eW#x^C3j0mZR*vy0Y05!stH#mjVgp19uGHvc_li}sNqo{bDqIlh_ > z>_@ubgYDwQoZ! z`AQQ~GfkbWFfNgVmzx6zr7U})IQ736-<2sLMG8AL7z`NZ5jjU(ssil83Q*I2McZpa > z(1v*^jw7P#fNfZV&9wErkm z)tl)URm2y^Tn4(gv>)abrjj=(f{v0u)_D~z_u}{$1 z`C(nqN|UVyt4^*p&X;(Un**RxvDCpSd4y?+WLW0sd49#zzm6LEYWR80$RkY*$$uLw > z+{D`&Vym zec=UVtu+qU)EUbF>(GrO0)5qH{`6WNnlSEdK#st+<_VM)01!^PpbJn4vEp5YQT4{R > z-K^g@2`_qVfL#8N?mDeZSyH4xs=+{jHJ4a<*d;W;{<8wq?@3=lWUk}c&8RKFgL}{{ > zFI43OMCd--&#u~x5W2Jt4_<#zy2juBGZ88?FvU)+C{TfW0G1cA@}x`XJ4u5aFc8g} > zi>e%l2t8o?S%Zz!dft-hwMgf;K|9Q-U5O@4L@aHv86wP$;!WEn`{anrQV}YsNRbK< > z-dWhXy9ggK4|Qyx?I-JbBMJWW&qujq0rtYclridvDa4TgR|nW14NO6*BfN-1g;x;p > z+TDXLABXt#s?A7(XI^d{UIi$4(+C90Pr7{iu0oI#;e}d#!1m}m9@2S)z{-h;mVLHQ > zUpD!kzdcigx)7K$UaTllfqMbgRAObGOUpY+>p0*lG;2Pp(h<>ez?RuyGiN=IF}>E_ > zd8E+he?EZxALx0+d}5Qo{cKlkY=h1C8MUj>eKioHPjI}2NP > zk5Ex|=*lMP50fZ=qab<(0SjWg(X4R@*Q+)o2_ApBQ#%)+Mu` zj5!k!lzq1DS8X!Z@n97+9}n(E8z!UPK7Hb4r$6_%cNd{D0#o3A!y58#z%ZG}Iq5=q > zCuz9lFD2gBD8K*f^b6hoXHo8V@A)v4z2WJAZ#o*j4;dkf=WDdr7eXj3HV;kJeT~>V > z(r8y~)jr#>t2Slpcuq5Fi}7F@+AsyhnTYu9bPOI$CZKxtttu~D+L-ujdkQ~|_pb{I > z%n39c4lIo2Tw7H*i&CKWLeQM!uk9{$jlY&w_^)pRxUlT>2+E@6u1Z>A5RZ-ze!ptU > zytR(DW%~j`7S zY#fY&#pQzLX-&yRMms6|HewHy2@FcjiRBg>hh<)&=?+G5-}w3m-k9yQrF~JvW84Q$ > z$QQ4V8fuHzse-qF!CQuEJsbr6QFXf^54GiIlLm#WEkid`iTD8fy@4sV>WIn1fCJ8e > zp~IJJwfxPhR%RskweJsyzlGUf7+$r@)I;^Hw)W4F_YK^i<3Y2uLo#imMc1R5lWV>b > zE;s)WLZfocx;eSl)+=0o|9^dxVv;8$^edik>>ouvrqo)Wg!?|HX{!@@y1Qs)30A1_ > z8C6?t=3Kf$>w~6S+dI3fExl^9F&h3>rsHX%b(&&QZ%|oZ=LPH5=l$wjN_Tje+zLL- > zP2%)e>aD%)J!Rq5)}LC-o@f*Mzf;n<#@ys*-OsJ&4(nr@#i*B?`EqW*#`>%^*W4XV > z?d$AF?#~E&roUk2@8W)HxL|#x-<2Ux9C%zfCr?!OS{TV-izjFTr@&2kPoV?b93 > mskP>3zNT-fa*LtcQs3rLlWf&nD|(-B5!=rsOnZC)Ve_ARYc;I^ > > diff --git a/tests/f_lpf2/expect.1 b/tests/f_lpf2/expect.1 > index 633586cc..ab5d9ba3 100644 > --- a/tests/f_lpf2/expect.1 > +++ b/tests/f_lpf2/expect.1 > @@ -1,12 +1,12 @@ > Pass 1: Checking inodes, blocks, and sizes > Pass 2: Checking directory structure > Pass 3: Checking directory connectivity > -Unconnected directory inode 12 (/???) > +Unconnected directory inode 12 (was in /) > Connect to /lost+found? yes > > /lost+found not found. Create? yes > > -Unconnected directory inode 13 (/???) > +Unconnected directory inode 13 (was in /) > Connect to /lost+found? yes > > Pass 4: Checking reference counts > diff --git a/tests/f_noroot/expect.1 b/tests/f_noroot/expect.1 > index 7bdd7cba..f8f652ec 100644 > --- a/tests/f_noroot/expect.1 > +++ b/tests/f_noroot/expect.1 > @@ -11,12 +11,12 @@ Entry '..' in /foo (12) has deleted/unused inode 2. Clear? yes > Pass 3: Checking directory connectivity > Root inode not allocated. Allocate? yes > > -Unconnected directory inode 11 (...) > +Unconnected directory inode 11 (was in /) > Connect to /lost+found? yes > > /lost+found not found. Create? yes > > -Unconnected directory inode 12 (...) > +Unconnected directory inode 12 (was in /lost+found) > Connect to /lost+found? yes > > Pass 4: Checking reference counts > diff --git a/tests/f_orphan_dotdot_ft/expect.1 b/tests/f_orphan_dotdot_ft/expect.1 > index 6a1373f2..60924958 100644 > --- a/tests/f_orphan_dotdot_ft/expect.1 > +++ b/tests/f_orphan_dotdot_ft/expect.1 > @@ -17,13 +17,13 @@ Entry '..' in <12>/<15> (15) has an incorrect filetype (was 2, should be 6). > Fix? yes > > Pass 3: Checking directory connectivity > -Unconnected directory inode 13 (<12>/<13>) > +Unconnected directory inode 13 (was in <12>) > Connect to /lost+found? yes > > -Unconnected directory inode 14 (<12>/<14>) > +Unconnected directory inode 14 (was in <12>) > Connect to /lost+found? yes > > -Unconnected directory inode 15 (<12>/<15>) > +Unconnected directory inode 15 (was in <12>) > Connect to /lost+found? yes > > Pass 4: Checking reference counts > diff --git a/tests/f_rebuild_csum_rootdir/expect.1 b/tests/f_rebuild_csum_rootdir/expect.1 > index 91e6027d..063fb8cc 100644 > --- a/tests/f_rebuild_csum_rootdir/expect.1 > +++ b/tests/f_rebuild_csum_rootdir/expect.1 > @@ -13,7 +13,7 @@ Pass 3: Checking directory connectivity > '..' in / (2) is (0), should be / (2). > Fix? yes > > -Unconnected directory inode 11 (/???) > +Unconnected directory inode 11 (was in /) > Connect to /lost+found? yes > > /lost+found not found. Create? yes > diff --git a/tests/f_recnect_bad/expect.1 b/tests/f_recnect_bad/expect.1 > index 97ffcc52..685eedfe 100644 > --- a/tests/f_recnect_bad/expect.1 > +++ b/tests/f_recnect_bad/expect.1 > @@ -12,7 +12,7 @@ i_faddr for inode 13 (/test/???) is 12, should be zero. > Clear? yes > > Pass 3: Checking directory connectivity > -Unconnected directory inode 13 (/test/???) > +Unconnected directory inode 13 (was in /test) > Connect to /lost+found? yes > > Pass 4: Checking reference counts > diff --git a/tests/f_resize_inode_meta_bg/expect.1 b/tests/f_resize_inode_meta_bg/expect.1 > index 769f71ae..e248083f 100644 > --- a/tests/f_resize_inode_meta_bg/expect.1 > +++ b/tests/f_resize_inode_meta_bg/expect.1 > @@ -45,7 +45,7 @@ Pass 3: Checking directory connectivity > '..' in / (2) is (0), should be / (2). > Fix? yes > > -Unconnected directory inode 11 (/???) > +Unconnected directory inode 11 (was in /) > Connect to /lost+found? yes > > /lost+found not found. Create? yes > -- > 2.25.1 > Cheers, Andreas