summaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2019-12-03 10:39:08 +0100
committerJens Axboe <axboe@kernel.dk>2019-12-03 10:18:22 -0700
commit6c6b3549142255c3fe4bab5560efdf8391c8d858 (patch)
tree0a738d6947054942fedcd44f532d6579976c1c28 /block
parentae58954d8734c44298f55ed71e683ea944994fab (diff)
downloadlinux-6c6b3549142255c3fe4bab5560efdf8391c8d858.tar.gz
linux-6c6b3549142255c3fe4bab5560efdf8391c8d858.tar.bz2
linux-6c6b3549142255c3fe4bab5560efdf8391c8d858.zip
block: set the zone size in blk_revalidate_disk_zones atomically
The current zone revalidation code has a major problem in that it doesn't update the zone size and q->nr_zones atomically, leading to a short window where an out of bounds access to the zone arrays is possible. To fix this move the setting of the zone size into the crticial sections blk_revalidate_disk_zones so that it gets updated together with the zone bitmaps and q->nr_zones. This also slightly simplifies the caller as it deducts the zone size from the report_zones. This change also allows to check for a power of two zone size in generic code. Reported-by: Hans Holmberg <hans@owltronix.com> Reviewed-by: Javier González <javier@javigon.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r--block/blk-zoned.c59
1 files changed, 33 insertions, 26 deletions
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 51d427659ce7..d00fcfd71dfe 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -343,6 +343,7 @@ struct blk_revalidate_zone_args {
unsigned long *conv_zones_bitmap;
unsigned long *seq_zones_wlock;
unsigned int nr_zones;
+ sector_t zone_sectors;
sector_t sector;
};
@@ -355,25 +356,33 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
struct blk_revalidate_zone_args *args = data;
struct gendisk *disk = args->disk;
struct request_queue *q = disk->queue;
- sector_t zone_sectors = blk_queue_zone_sectors(q);
sector_t capacity = get_capacity(disk);
/*
* All zones must have the same size, with the exception on an eventual
* smaller last zone.
*/
- if (zone->start + zone_sectors < capacity &&
- zone->len != zone_sectors) {
- pr_warn("%s: Invalid zoned device with non constant zone size\n",
- disk->disk_name);
- return false;
- }
+ if (zone->start == 0) {
+ if (zone->len == 0 || !is_power_of_2(zone->len)) {
+ pr_warn("%s: Invalid zoned device with non power of two zone size (%llu)\n",
+ disk->disk_name, zone->len);
+ return -ENODEV;
+ }
- if (zone->start + zone->len >= capacity &&
- zone->len > zone_sectors) {
- pr_warn("%s: Invalid zoned device with larger last zone size\n",
- disk->disk_name);
- return -ENODEV;
+ args->zone_sectors = zone->len;
+ args->nr_zones = (capacity + zone->len - 1) >> ilog2(zone->len);
+ } else if (zone->start + args->zone_sectors < capacity) {
+ if (zone->len != args->zone_sectors) {
+ pr_warn("%s: Invalid zoned device with non constant zone size\n",
+ disk->disk_name);
+ return -ENODEV;
+ }
+ } else {
+ if (zone->len > args->zone_sectors) {
+ pr_warn("%s: Invalid zoned device with larger last zone size\n",
+ disk->disk_name);
+ return -ENODEV;
+ }
}
/* Check for holes in the zone report */
@@ -428,9 +437,9 @@ int blk_revalidate_disk_zones(struct gendisk *disk)
struct request_queue *q = disk->queue;
struct blk_revalidate_zone_args args = {
.disk = disk,
- .nr_zones = blkdev_nr_zones(disk),
};
- int ret = 0;
+ unsigned int noio_flag;
+ int ret;
if (WARN_ON_ONCE(!blk_queue_is_zoned(q)))
return -EIO;
@@ -438,24 +447,22 @@ int blk_revalidate_disk_zones(struct gendisk *disk)
return -EIO;
/*
- * Ensure that all memory allocations in this context are done as
- * if GFP_NOIO was specified.
+ * Ensure that all memory allocations in this context are done as if
+ * GFP_NOIO was specified.
*/
- if (args.nr_zones) {
- unsigned int noio_flag = memalloc_noio_save();
-
- ret = disk->fops->report_zones(disk, 0, args.nr_zones,
- blk_revalidate_zone_cb, &args);
- memalloc_noio_restore(noio_flag);
- }
+ noio_flag = memalloc_noio_save();
+ ret = disk->fops->report_zones(disk, 0, UINT_MAX,
+ blk_revalidate_zone_cb, &args);
+ memalloc_noio_restore(noio_flag);
/*
- * Install the new bitmaps, making sure the queue is stopped and
- * all I/Os are completed (i.e. a scheduler is not referencing the
- * bitmaps).
+ * Install the new bitmaps and update nr_zones only once the queue is
+ * stopped and all I/Os are completed (i.e. a scheduler is not
+ * referencing the bitmaps).
*/
blk_mq_freeze_queue(q);
if (ret >= 0) {
+ blk_queue_chunk_sectors(q, args.zone_sectors);
q->nr_zones = args.nr_zones;
swap(q->seq_zones_wlock, args.seq_zones_wlock);
swap(q->conv_zones_bitmap, args.conv_zones_bitmap);
aSG\&eW9Hl6@f5+[]dYG*7|{.?a|^m_2όW[Uwc [톃!ܟSz3MGD S/)=π2ls ./N߶J"?۽;o '=+)r{Mc:M'z ި/G\s+IC%Oؽm 5n "^o]zGeA` n%wY+驀Mo%ϫMWG%~υ[cNi[fo&lyG:v(yȽG,rdNo z1n)ჶHLu!%.,:aW:it-d{իL{}i2,`ۤM[t2RWeٹmA2Lxu-ɔgG,ONr/ xq +z_9a~_p~mgȤoTz/K~0_sx?Wf1%,>h>OE/5CJ;xJkOI0ph9t3P=ܾRK>>LgF"?OwIƨV^yGrݦݸʷka u }F.xڑù;0WY;8EOdzSb!%!gݸO$xc$>p/ۦ${ݼx`1z۱˖JmP?M( ? ^7e *rs您PccQrg:q:N@ p˩qGf&>O5kb Ǽk(xMiZ֜/G³*W)w_`>'d)/{"#JI߿Bیדgd' 馝?̀Mqe,hf.h#~l(PmX@7nVh{Hp[}ʥ۟sϳ;\ZZLiibR7Ƭc-DQ; w5l-$ K`C ]r &ƉKZjB==s*PO|)vm[hZPFG5Pl1 H  qrv]r@.h( ?V)Ҳ'*(SZb}DtOcwl81Ĭa3 Myo:=/x6Vߏ~o=څ0z B35]:!/weA8Uߗ˧[(Q} s|R+|= 3_RzQ3A;cH?>zQ!P]6(? :Ųim Í;Y=_ ǐy;`35yb0UXrbO0Aỷy l.~Xߟgh>X.qꞹǒۢou.8xї ͵yv+Osk6PUsL_zxn٪ӱΝzR7_a4]Yҁ=ϫ{ZƎN⸸lكx^{u]ifSamV-x-pkxrOhբvQe͞Zz|jdZ߿6~;_3 jck>g*pp;s7]{:?IVMDovuTOGɃ4A:s%j}tmVO﫯uwΒշF0~F,.fnH9.n juQBk3L~Gϡ8`p;;@!$TM>=wM-S{=^z29iyx7{ތr7Uw]&8֟n]GRf{6GW׺[w;JĆV׃z(-ʺV\_-wOmwe*@߭DFZ_](ՄMh,Zt8#%%=nukN,d(@;؈{Hdda_zitwKٹΰjMhNeJ#D[ lu.RE m~R6_v0R=N@<ن*nsDNb+:6i0c;.R2KVHY\E@6ZˌTEaa8%&.W_c9XGX'b*FSLnAT%`eos9奼+UaȤy%`{OQeR|vZcfJEMg w`K]+{—z=: ךz9 揭)ʋ!/oM͜|FA8O:^"rϚWY3(Srw Ä9϶"9WȁBr>6sp(H6 TKuw-pw>txk m#L7Mw5ybDl]W}|

>xdU5zW\֊UV"I*&/w#nA͛}}l>uNx5"k)98U2!|#?T6&qsFc\':), ZN;@nϕ)I.9-G>kN( H'?]Cgw Hmk3>]ӨrspZD8}2^u* Ŀ~=Ծ wu=t4O;xCho6ݕ~[eE[ta^o2yg 폎rxP6ɽ.pΑg]*yx zgN ܈^ uNdW" Nc˚"gw7u.f4d^$/ovdv1w0#IB>|[oo֎%ac9ş4G9b!۞HO5rMB6 !g n#H?饂Cd#7DU41s fOͮϘ[+_rO#aLUMf0"`;k,k6"-}y$4`bs^O\NmIw\ i NR`BY;at vsyc'?N7?=-|nsxXUQTb,QDB{BΘn̨>G:ftGQ'D.>^k?]Æb{> ƒ,>75xd@?-g|p5*aЧY SУyUE;QN(v̫}WL}x-݆!m@0~o \a?7_C썻te{ޱOâ#Ij|w1uqPpSɄ^1ŝ۔3(;3W#{tQb7m9 V}qVl% Cu2:'Xe} v({QwȐ~=m d7T!9k.@[R.D=lzy<6h, A H$A1ۣYxO3:qޮߩ:ϳWs(Ɂ(.}[#ObO(ԢJ)@cȨI0`1ftDKe#"ZxRD ͑y Q 7尷xnl\)#K2t 0T6zȧHkQKCo'DR k g+ֳU5[/`1b-xÎb%$ϺW'ݣXS Dr,!evz.~m G<8xb4 Bn pxSLP˚럻u)O^v+b52r H>5¦KMEi [masw/:sfcŲHjЁ#(M;6]P"ݼ3>1mA$ubyC-MSb껫30wG F ]_}(z p馤ҙ AV`9징zpqMâQ MdokYtL\9) Kt%NEb,jB (PA!^}C 5XNf?_#LedEtU ]wZt&]С>s^󀉳UD0ܛ6sk" }_dtȈ+{=ok쮴٧0޼H:eۗUA*DB^v[4l6) d^+WL{"N=ˑ=^gӍ`At^Y;v}xz-QT92{H(1Cy7}>r&SwAxqh?jk P?;#;nGA^S̺/ z9q nf="{<}Jxib⫻!Ϛz@ ׽fpQݲ/y m]s_]rl aj~#% H$ 2㲷-Gϵ. EU%GkDrX_0?Р.~\uizwQ >/ ,IJ߻u*esGa1D|LRW't(_ 5^)PgdhK  SꎌQ۸1m8a限 `c/n0UE$ZjФ&p:I"* ũ`Di`6@گv E?> p (TGeIFB'|aTHÅ.0'}R\vb@{@Cb-iKB`X._ioG0' BTz߯t%ܖb&prI@/ m rvg~o?KP Q2\Yq8R"(z&]f@%<=/zJ4.:Xx?-I׆v'yⱽu6 ¯ qD\8}u}ùܺvzu"P Dm#DPCTG^Fx:rO0!1YGco|X~.R>6k:{.\b诇z?'A`1\>/Ԣ >=#9vyGkޚA0헟>e34v\SEn*a(Lߕm> 3 2.!'u>^xut~1a}X"nݴo2Mɭy~ pE_V5%\Pz'}# dEGJ{<7~|Жzm4OpruSq9OJn;#*mܭ^{Zvbͱ`fApdJ#\/3G%s* Y$H63ljϬa6lԵ5;=< A7Co]p'Z @NFb5 DF2K S`#wͮ%VzN[s\0;Yi O} b`P;v`gFH%8,uQI,qU( ENkO1DoR]%3@J:lFh}ll"9v›'j(J@kօEu@>70"~Qk,FDZǰФˑhHCM'z<~qK?'`U!\ϝEa(bi}ΌǕ`wpB qTBd;FS9T~zٴz]0{oa^/$yAƧN"~"<-b04 Tp jݢ;nNmHjF;iU(CHGԍ:pPK_!LA 3!o W^h>^@:4:uvsYCYOcmb?jE-( >#+W< =Z׫oMFNovl÷⽲}nQ(+6%,{5~{E{O>ZBCXtM;Da5VK*Q8tefN[nd׵gk͜S9+!ͤ} ,HF M?wae?׉%Cfs)J6R4G|׍[wFѵh)5,ðiUŕ,:j64p"> FF4ËtiFkU\j MSّ! G9w&;l$O3w!ژ޳fVL. qAGxrLRYM>%Ǧ  D>iX-~S! NEGd@ ^Z\F*aaVxwwXQ^`)smf ^LLMx Զ®PZ^c|:תa\8E2/>-u`lO:K #](/ϙXHI4 [LO${l4ȯwBm!{Ŧ5SI3 ^3,kQ%۸w]B.|UARA+b f_`Ԓcު(1˘ 0l peo덜ü: #IY@J4|p):a!,T9@m)h̄i 0aJd(^-us3Ó:l]fW:Ӆ[M] ԏ<~$+p= x0rv"A" F9asYIPius-mD2I2I7 X,oi~9ݖ9v/ wyRF+N>vV(diYV._l02Z5"fVcp OX]ATZ AtsnV~y2; 4 <]u%x_ ܲ|NC {b֙+lE4waeWh[޴2M)ϵ9O[ö.GPjgPPkO]j|srP/M-INg4|TIG ,|ވpyUG!sG{dо1o|_=Ge(#[*,Uok'KäY_t&@)lz窎Uǯh~ጸse*S_O\Avk"96J}<; m|w ~l7XV6~@\;vȧ?`/&$46q<d?4B?&W:U~\cYͩg9!ZYn6=O\m$H$)7Ngq%I\2ұn2lcF=?;PrՂ\y~pT]C슉'c2#73-a,—PYۅM1VjS-dԙ0Np#jM_{UWm4HU .Sq1 w)n -]iD@׋3$+͏PX<.92|S~CtCwW&(QRa7 U_AbPjo4E2=*!<4pS׃2svo"H\:偌}r" H!hUR珔=]}Ҏe#pmgdz9]f RZ@=6hQtqkIeDrP|?Q.гޥI1wm` ©׶]\B KP>$*ke{g8M16\t$v˞X FSz8^no Ym*&o8޾26Z=k98wA*AM.!I} R)` $C;4H5u]ͥXGx:ErbC}2o7>J O1G"72_d#5H1s9T(.kyc/xo 2@5'a)OϪUiX-ӈ#3m#. 5GM J0 P׼w|hOOn@&Z\MGoF>wk~ ~}CW_lY_Deo\\+}>ČmgцGakwG" ݊}hK-U]{ =~mf8B<},M7nmʶ5`lW"pQ/dSn.U#1pr#-XI+A}w3b(x dgu:FW!{wJ"[Gm-˱[' rݑl Dc m=&|@UDؑ"P+W ;<M)^Cύ 4@ Yx(?Gwڳk<@!?w{ԑg@jӎ<ʶZ/ȹwt%/A,==l ">8nʹo{K3R/9U12#1ckܗP#2=HV䆭b➹vL3gKk[i1W;(鹬j5SİApLbJ@tGvbn o`UD\ctԎS\zyyk"Vǩ*|]Qc--y?O\$fYÏ_B$As}DӖ/ Fqu8j.ڲD o(ciO^1985eDIࠠ4qk^x:}p 4} 7]d=9}D]EEWKH6YѶaw׌l-M.[] `\\O4RS+d(k\%$(HUa@0N#.TksؔiTE14-glp3f!l`M&D(h`@#g8O7D<9g}?؟7@>'Y P n+6nmOǶ1F$ZBlr}g|^{u s<}*(ʵ.2/A4֧MN^Vo1rR"{+FV>v[u׷FWw=Å5m8, Fd<ܰq"(Y";aZ&n(o/r X!VQ$QlxvADࡎ%N+^e y,}6rݼ9|(Yp2ꝕiJz^,xlr ]Ϋ- t:﵆I:ZK" 32=]<89̎A %BnңxB9" _05BX (nv໖\OyDzBqυ.W4J,6xȾ^Gs֟t(Iڢ\fIFGBa8޻g䐯q0D@>Ǝ #)jIgh-2l@7q-3FASIQyj=g1WD'H"p^_,'rG!._q@msWu: ?]ըqBO(X=]̿8Ű)B5(DFR0?8{_}Y^M,-J> xPm}L.3v2;J2iIOG9J|1H:M#m9/ >?PPt6 '1QPHR8T+<-v7W95Wg.G㱋zr"ίu푡SM٦rˡ+uI@h_@B>/W5~jL@@uk$R7X RPW/>'t\lvݪ}p aok$HAo20?}Ӿ^\7A$Wjc'DLwoBނHYuy<[z`l\쯥u6;ë[WmF8ՄYA rh?欹ˏa71>%c]%kWk5C)^[8G:$0R=/!uL)QR0Ӻ^M}E%7}UvR] (*<}Vj<2XXPɘIEXa-c,rYx=+"E( A+;Xqpmﲏ& ;:_W3+:fHauHkq_mIlB'5Pî>8G:( j|4:zqh6K6FbnMUjʆw=a\m7 q# wy|@*`)$͓ NW)Y6§ŝQ=8Q +$D񀢜c^%<(hOo=$@%L}#=M!$;GXYEAv)vwau; <Tf}zGYZíC/\͊E~+N#&Մ[=Ic\,"ࣶ.P&c0dY=[ٟhw(cnIѼc"B'"0jH>gyf׳nVUM*)6$,ɏXPgmB&ڤ)ǣ=ll~9b]D1NX^_=^RIߕXr CGyz^wbH \'7&G8,劻c:7Ud7rqM5mk_-n |8a_&AރҮprx {]ӧ;&"Q &—t ."*O˚6HEZ}V\0B:ː{_1;{2j}\. RňtCG_HFpc;v*! WFV2[FR*R A8jEmUG,F֚zx@P=:܎po3ֺEls3;UOⳣxQSV~J8}' %jʍr`QOdcsj`Mz]),E>zq6CcW"N `=TU(&Rv_TxkwV6,_@~}NbugЕ# @0ƒlU;<7 6%eׯP$#ӢCVo(T{~͗[f/׋"#,y_NWmƧҫ%N "4Us$L1%;ǩj\6eoY\P iS 3WaԎl8Ql4yuqk` E8$nuX ͈rT0!P~.A25Q%,* A-jhU&wBm=;QKmѦZ!ˉZh.S1,DJs۫?q4yTu?rY9=aW$|Z7,z ^/(@f(Q0Gշh^Su@ 2`vpzZpōn 53Fɖq}l_aPS:,͟:QJ;B错Qsq@$$90y|g|Y$Z.`1*HQ+ % _r\ hc5ηU{w֬|W~ËsMv7?WqρKY@eW (:v#bUXMV kSkJ{jp,Dtq|;\g0UcɢE?c>x۸$1wW?ϑ]!G;Q0҇.Gf([Woe03$DD6@їOVza;s߁u3򶑣#\#QԀǏ Ű3\!b.+^dK1h9e/)֐!Vn?f(J3v&A ˶ M-xO0icꠁǥW3#$`ũuTH.%z!$G5wXI(@9L<EHucPAy#| ei 1 qr%JρuiMO_g( !Ffj-juAH[ۏ-cWq1E`|'-Q9:q5EÙA"p)DDTEU_ݵ"[Z1T9.oG٧: 1z/jໝ΂#Eq"ƟJ4M1ރ{~< _L  ?L lpjJs=Q{ A* 5ðȑTr_{By"ESb$ yh1 Qz?x)kE`Hl EqF ">CA}־6\.@<)LAAx6qE@v=_E[^*B:Jezsw%Jx.9L"z@W$|G.eۊ$4F7~UQ2B-B">vS Dcj儠DGohm,E- -{ b&sc8o-\-4륃=߶oD͆βXWqWРk|QPt3?O9 j 8")Peɉ8e|RC/H-9+fҍtt^'gk0BX?3JV~qm'T[B TRJt(WbDXmkȎ`[]}A\V7ӱmk_t젣?d\a(@dp "_G8{NȞ-$Ȇͽf(eaf;.rDpdL73:?NS0۬Q@X'c.]z3lU"hN+,xx𸹼/7,qPe<\;#sQBr/U}4s.LM=7\ת:h C(Sqg&CfjEɀYY?cK2n6zVI;KI| Y.8foc%0_7ͫ5†0`)!TDrPL#A1:]+"hF3{yPٽϞ;N${́5xۇN|_U bľΝ fFay ¡y8DBf`:ԝ2ma;z3נx5GoQsN!@+ƏN5͊:cǨ ]cYbv )TWZ,kA'.x Rz'=F'KrQ@6P A8gzl^D܆k+&S|>J״= x8v|k9{WB) wwq`UQ)hL$)6d߯m?*,8Suۇ +AC'K.6FeHהs#*UR<ܘ7JJSNEjFX5vd_8^Cy׾ Ϙt 5?Qn3bV:'aޒg+F m5,-:*Sq4+}oT;V;xwυ8Lҕ}xQ[ˣ?m, XSBV̠ƶFB YV,tlH[[gRErj fwTص*B㥘p )855C FN}c9^B/eynt F>UwFmh/hIGxJ.o8e^0]}nB?@3ȢxIF=}yg=*,p{@h$h3F/6yep;"xTk1 _s'qJ X%_lK|{ك(Փ CQ\ʠڊ@(ղDZvĹ+Y׃xJ쾻/@C_yŃ\K58Lز^YƱ J$&E,[bZjXF&V<4!όq wË``Kx5y=Qv\lNc/_Gib?448UnN#+b@`aoHh ?uơ{̀n~0CPϰ{ZQߏ_j+Ǟ|caԮ,|zg癈7#?gSǞˑFF" {8  3hz.R5jwp>^<ȱ1VXݦͅ/]5D߸"l,=ۯlS)f̖fƳr&$qQ"F0^~]37o̶S\ ,5M'ꣴIqEڛgf iLnIaV?D75aޚp߾<v 430鋑S0:hfB36zS :;B|P71\î{cx@7تP-jढ़GBkpAUo)iFf!Exq[-Ȝnm`@#u뤐/ﻃE0AX?_H6K 'p8>>=/gf^7k |َ1F 4 di3 g~F@P$lLRKO1 }3{j*׎wI 1Tlɍ ձfhd͉73-zΙ^`:7&} m'/B&{ ˪S ځÂT&& r ".\|$Bd R=JA&bQ\UCL bS bH$6˫p#eXְPV| (W/\#b4VhkM4#$-X hLK i d>;{p{ s>{7!ȍ c "G3~A^GY&K;i&E Qa[K  :- En`ݐ Ak˜fCKGGDnBY opx9|9FAj^8؁3/bP^Y;}}+W~|BWG-ۡAW( ]%! ( q<[/z,2_d8h}#2ͧM_mK$xm1yPZǩ#+ =}5>0N6acDlf .$IEKrC^Z Y095^ _-ru5bX^0gT \{`k^k-eijzi.ivH@#~'W#*(<5Ek7*˨ o-*$!jp?u4&wX qf8Xpt"G-]Gfj:i04JfS`7z3A"KLX7swqz܃q4 []<>r&j2O&֍KAk)@&[F b? ֺ#G lckpn .ωA=q~ ӏc[co DH9XF /Tql"n0"wv$[EU.N yKLϘQ$C\z1ǰx$M[2C$jؠz s+#b<r-Zۗ۽ [B`6C/g10N-_t  E[ eA@!@ጓ{f6At6Eg\:ùyo)0H;ɣ *i{$P|V쩃c?;7>ݗzOj&tk힇# Nkd0 sRO?ifFx%kvϟ_@=9҄Nvh-lI!8=W҅N]\8T º2!7w= tQ elK"4pQE6X˨͡=/3ogǃĎ![a٠ ď-gmRg }2fknb~%z(?+:HlWP2ԚYc/3o#1-z"9qXkTƸg{^ַjE@R5p`Af9Ĉ*yQ7Hr|^&u D|#9Gn~?bU7ukA]Tfi|azmt'"BxWBe!$i` 6 9g\0yu(&D]05^9,adՆj=N}qmfnCPJJ5_Q!WajڦMޤ.V؆'y?FYΙAݪ&G>'B;p sb#6Xr\_#LJCQ f S&-skeIjۭSnAlHJ'.-i[@^,ݴ7- Qތ~;\15/v=cvB @%z:K^utnj,QD -"u]%:楎 uY*M/z`X*kZ()C" TL`#@Z̋-oܿqS@_ aG!ߵß6:Qt+nIkn{=@` [Hf5Ϳ_\;cjv^UxPn„;wl$m·ο;5ܬ^6jx8Yb*? /wv6hvTl BtAbK0 % !,,%#q,2Y>uj*.le]#pj29:zzlea]f31"Mdxs-Oam'=6|~_`rx"!<'}բSrvLه{<{bJo"A=>\4Y0:r- h:hE͟x?d(ٞ}h 0Jp>̶K!d +˰y&8T^ݟcYx^'598V)z'"@^|b0P11tpauKP^j^ Ɗr3P|^vDLmc척nWKa5 J q5p$D>mK<?\L67;']ɞ>LSe탚H)1255Y_/+-72xH0(@ YY.r4Y:2ъ?fxVv9ZwZg_KܱHV ' 3)ȗ",34EH;&2zgQ*BdA"@ֲ`ga8fG}G-&:ZG<'c{_ÿu!c` P#zˈ_❏G@!9(ޭٖi _4ثw>**Qxxpl'1 [sk8kE[j HVrߧP$JdѕPFӡP"҅X7Ȇ_,x-Ɓqh;M/zAPCp QąԷ_ݞ7OCo#r ϣ†JL2+4/[\tz􇑮)2,a'\5z#dH Ŕ=%v`w?]0q\x z+ϑOi ?X a\H1x\X \Ã8:l7zEC痚&pct2 *#"ICHibcč2!2ЁJՏ@I"'c Mk̎1`W&!ȇ#'y99/S5^3fps7wG2澫W*|÷ob[ے("h6w7$9ؚw 8vx26?;$>61or,@`ݠ(MԿH -92 PDڪGn@z0 (ո!ڢl`G pg8 ճ;!v-ip]ߤTr/8Q{SP$}< Z;Oz5b&f@Q1 alX-pL-"9]GD:.0f״Yn2'OBGt54-$2g;Qn15!kuz:{K3xCAfllaǸg3h>DGcȉ"+/wL9мVxi8&X1$iaÚ,$(H!g`nŐO/Pf&s@:}X:8uԜ3hx΃@01~'9ߍVu1b/D8_i6;r6p n2 Шp&SNI)r |!!9Ǝ:O,eca9t"/x `sFT "h0gcV#]qRYc2"arc1B—Nیչeˊ(}@!iFFRKS똉lw9CaVPbZ V)\h;8_0]Ø[D%~AOCHڶAHXyo qaL|#5>7קmm97TUĹZyև1KG@ïTq۵۸wݼ`<;ȅk Ld^fS;\;Uo:ZFcP@h"v9L8qxӇuyC3y'q@s͎1˵p |T!Ct r;(CIbuƏb5 f!o⺞GNz@r9[p߉VO\oq_QRa Ide"f Vc#1:&R,MA$qn3|8j];Ӹ+IN-QPEΐG=܅4E㠱˨ZzCT  n~t-aþ3>Ekg')5#V8.8A LJx9$spy^=.Mƹe&J-pDM>:;Q=B7a[pcC5CE"UM/LT% :8Q$ 9{vi,L>@) <=n^bRN̊x ` >Fd>;SO˼S! -ꀱEPW?-fe1 \IBG팳?8mDt.k_IWVw_u,fWl=y%<Ъ&d$s*;uYj9ϱEhxpW1~:1 7/3*-z` u޸q*QFeEP.o$e/Q$KH`j3͆J+lSYp1)9Ϫ.bri(Td'Yp>=:F#xϩD㎌2c.juif?K0BXӮmH2U ~lT9Sқ &Ԭ`D3Aua33=co`*H}?}:>CodX6]l,_VLS#TPo1Y09&}y("*۠PEzl8v\7;C850x"(}קs97", ćB17b`C?lj_u!>` D ~%<R,3)}/:!d/Z$EN5;^#m6)Csfw$eeA Tn". -ܾ3y Ʋ.atW$1%EG Fe B Ǖ\*֥b>Bb0$]O" ^f0 ?kBh{>Uoj+oGreIדb?&Qq / -HkvVNHr-Xo68 ea'D(ع)g~Q~iwKA Ǝ#5`ʳ*lSTGz) 4Nj!OXNw߿η~@cߏ0pC!edӲ |[ 9)@"gM]ȩי^ԛ 6ۜ+S7dYt5jh  ]`( /:HI䌤_-[MC龞́ͱk|%RsUF S'.Iuz~-KiUڲ}>UEgWT5z%QG.`-8YbeT>ʊ$|m0?!@Mi>#W ma%4^3({l0_g\?*J)h|Ta`d8@dn4 Hur9sa.EsF×M qbi,*&kF&܁KNRЍt7ZNL聊WS ؕ m8Y㙋q#^=f(_Q"3{;'Q|n}咁qeaxҋ&曢NP|WcG²H=ι]qEW+Ko0 }XOV+Sgt0۪dmlE/@8@H2["oLIoeCS/Wq-qؔr3uJ&d9oF1+-|=+|b.ˏ|{}ru6҅Ƀ?>B&h>!$uj!b`o{!*&7Y zX6Ҥ  ^#ǟɼI2()kV(Km3n\diىƁ[s> T;C>M恰VՃA ̥x+zP >1SV>;qU<oUv\;Lj>&ozFёԋ1Qo*HTC @xШA29aD 3|bsff3ؠa\u59>\.b~~d#O1Ȯ /$9 8ڦiמ )Fpf\T7*iPc-HaH$eUqW0ó39Rq r<~O]͋9 VW& ?F+ϮVKY4oK<É,0/G+.IMV@B(ZD78`\DHTg*/B dfTݼv(hbTk$ua4yH3S P0gG_u/X(YAbE{< e1If ՠq= z[#m ¨Uam'Pp\$|=p9[zk[(&*~Q2cr x^(8c  $r/;bN`?P\ ϑ˾^GF[(F`,\T$~.7o.J]0ÙD~*;k8F*91| +D dכÅH`| xH61AY(|ّc\V z\4rK:v釵:ɷλ-[z0j"ڏcHP>~)?rE?~,{=]Tg>_d UCɲ8Q$, Peoqej݌Q ˔^@ IGWdJ!YY DR1/TID'%$ b-Y (1x pzi# +a)>a teC_0 \RadAA 2U?_x CM]#5=:\.E"?|>i̭1<@>۶ve'ramYN:(ˊA| m/y_n_wP<o,{<ۦ ?hA?=):13%{9`l NU`)z.E2]*-~RW~| & @P= DjĐF,}gc@©2 H"j:\@tC¡dP Vni%@?[HAhlz|,FW~;k5.g3$xYi$!! D ??gj: J"<~ #Յ/Z-%ܙ|6z!?`*tTd2K!z0(`PrLJ*{GF~0+KJ4Bd HQB?T *H3( @{ ~7?IwֿL(*?㝟Cx'2Y~Ju]B]4q=ڡ?gs=}Zb-!1t{?W$f=nzqX( 1? :xhp5:)_H(_7߫>s|B!GK};y4BY׷Wrpua$D1z b6}K]C+51-݉V ۹wV!. uq=[}^,1v8ִ6| [\#a8¢>=N΍_PU۹Z8 W{y)]!`V7a?~Ns]209ϰrsGX_?h=&}qd}=V\ }~`'S~xzw'3)>5w\pϣdx)V~+< tMBe9ylv;_gC_u;Di Ғ Faw^Kų&g^roƯ=594ޛ_\.|^uج 1VePxnM?nyn.f;u{ulۗCHzޛvvOyt;}2@GI4ō?(.A3n1ҡ? n8/މ6^l~\Ӱ+8;ic#†_0Dzo.Pu6Oxkĕ ؇^CAD~raA =NS 7&hL=p="*F^u̓BnQAGة|X/+'yYy㤜JbŦK>1)[?_Guߏ3O2'_+-rPá0P^"e:lxk2zv;QcK)$żWW:ts9,B>!Cխ(/ACp(S=fn=^){VۿGMr+@|j@;#&󻪴 jl/~wIE?T݌7stT_w>#, V_Z{u=b!T.ve_@ofM=G8MDxS4ROs m!خO~-VXz%>~<9>7AsRAw.\1~I`^BB1-VׂyV^֬cU$#=cC~F|խwV> #Nپq,XU)/4b\#=;%~,Bmrמ"oPCH|sNP.d53#T ?sxy#G } vGѩȰ<_z!,V 4HrFig5Z<`})Adcfc{#< ޾vacd[KtȿoS:JHV׽h e!<s3tS]QBWq~Z) `lfr`W}#ooGd'dwYFO"ztRt]inS!UfA/Jny{grIYs>kM(0> p|x6IM0}Pb;' #sz"g7>7iDԽSH$rp17qÄՆ`FP¡g,6|wIH--&q8%~uwD/s O}_5@+*A_f0`N~`P@+r> \exn7?r_8$wGCOтs+~TV2du&on&$4A 2ǓPk >5l!=$/g7'+6xbYFȵlhN{pgcmkbPR֗~w2;ˎyrv[`*k~_ty &ۓlDU @J*uz ¹lfQlwRO^({C b+" H<\37QǢ|S̠~7[.~(@o?:߲7ϳ'wM!y!s =9RJ#Yt}"(1Cgz|Ѳ#I@=(..v+;?c 2 v0@⎡@G*ׂ6{,rJ?PbˀgĄ Eߤ׾ip|sN󑨹f"A@r˞]w @$ץ=MC=$?g|@@ٸls JlЉbQ@,5\{fWPz}^@9/CJ7,}ֹ֪vS:Y @.{t(˭ ujiP4!+ E|m/D[5 |b0I9<<%\"k(̂$D :|Qnea=ֆO@:/$y`q4i@$$+)]:֡^eZuE_d_UfvndPn 󦖧 ]3MvJ-wƼ`BG#I؟&Y Wd4eCڂpc"q@ذv\ aph /vy!^#bS 20"m# .Q{0qvrZĆPȤD(AMEԐ]($.DXZy0"AȞEQv0ne#fVpFZ]&숁"I@趸;DzԛSuB8STjHHq8_O$Wz|XQ%qr~ Jg%}ECOOkvՈ,@<@G"8Z97` :F l຤Jܡt@ˊ]> r6n􊌒2UHpj!@`ݓ S w쎯+e3p+Rle3IZn-kAүգ$%8_q dCtィ#鷫ultU 0гJ\\V%AԻ)_DVs ??3Cb7îȹm?PZXaRv(-nUoIЀ{:qY9i@Qm/8 gx=A>z.ͪB!DRi+dZRTt]* bä4}SQX|K'4 ucsޱ#@@ E ڨH8cwia,l܁]^s  1GA5+=,m;qORw2ܪ@θsNF6oP 8=]&^¹6`f6nٚpG.x7꠰`@ʛc jZ^ Q_ a]TI[@"Zd!*Y{賅:/)\G2Q'W6M!4WG_LK~~%;oh>0;Y?B7gPC1>/r_]tQ T 伈N=gcHiwќVu>ꊮ+ojb3޵(T'F1ӎZr?֢X"(K 9c[)c$C !{ѬX \ ()xᾱ7%#[[/Q:z}3~8t<ǧC@!C ]`n3jIJ40aEA1^cDES̸Y4o$*pa:1(@2:T mؓO* :_p-& p#QO)GG-vN#_[`Ϝ|1zqs'VqLGE֜XI{@%;,;" y݋?hopv`)0RD݅a0d%6'B3ig8_J2..{&ޡ)QG4嬷:ѕuH$۲W͇h7י X:Ǘx[X,`7d0o?/88-4G`sH`~Dp"lYN'f}$y` PQtlwwu+M/rAL]Ch>Edylc:mhs|<؈97:YA'(U5::Mw8LisC1 |߭ƦtdL1!Ye@$:|Ms':vz4SpKJ>iCXRlDzP?/3I^7g&2M9\r=P‰iwqׅpHCTpA[*"8G8Ro K`NO䇁(^\ Vaw##c|/ =-U eFQ'bi^n9 <"\ñO7ˋjdNR>Dŵg>W)9ѱ̏BuO Mr^hzPLGT] 4dT̰a Ԟєd]}6Z}`t7lc6 \#80}Ȯe[;#G8 t#g'nASw#LQWX# }@|V 9. ʠ $m <2[@bq`ʗnX9E\+̎9O^/׹ӖDZލ7PU5/X|nX۰oΓS`=|}{/z흣罺fl oͺ6mvj! A\hNg +]-1ӓRϿ5>Fŵ(iAM&vkj~>?6tiM0wb}O`j+gkĎGG2f,ߝ~!1ܯ"{/WD"[.rV(icurjC*+vy 5dLM` A鞐goK c+X,Ffx_[[ZI(/ aѼGt99}}ȯB ;Fz<rn?fOZ\' Wn׼>ȹs;60YzVޥڡPŁ$c{#UZϰ0Ae_{oGP}BڱPPr']{nlͭUBt}xKlH:Q*kxc\.v-}qMyb7tәuh`%t9i>vST>_@nʦ$fi$3#CU\Jjjk(UM6P(qCD]5d. Ocq-Ӻ?c&a{0kRx†ĎcFu%ivV CؙXݯ{G@CM)Y'߇.NGk:Aofpf9d8261'ۚ}-{PqK;Z˨COn'=On1cd^C<9>ڵ}5;u2B1-" E$Kδd9z}Z (ibc@$QV"sV0vrlD;dS03놛Ȅp@;GP3kA` ǐ Z3 P!ِt@IyOyr%Z.E`K2ogo!7=$h7G= 1)Ix <]#0!%ttYΗgU`|_<]lZqg}p (zu ⼁b^n[+@@MH!Cʜ.3Ha|c'msF78͈ʙ 8ÂyНp@8$-x2j㥄6#V{$'A>$  w37.p pǓj:t8%]pDW۵5BH%YWONcS,~ϗsٳ۴|e LӑczHh҄wΘAB`5]K$>ڎ/cf:wo^n$ @%{TLb`@)vk6m߶1ݖ/n6'ٍ kzaߞXPa|uSSBqwޮݓ'qi t[b8 Ho˩n6O|\dZiJ"nƥK=7 Y 'VuȞMG\Ä h$E#F۳*b?>`'5 XMiB\+wFti]J/hP |},({ q!ADDB"VJTusk[m;drʂlG#-s8W=f<m!;kҝ;;} uÞi-oIa l#7ft8a'=zM5-Ou6G3`)zojtvm!ׇn;SR8Ri攭(GlӐqYC#1;Q-Vݖv\0s!rjmxe-x/8lo&Vkqsi[۾cNzvG,Ԇ#>qɻ_2Z^>˿3\so8_S SXKWfZsUoſfWuE<7~=v]m(kQL֫L"p)<˲qT^8_7gbp+48~MnrR"HOiC|=y{6L{9X<|PH]s?^m1#t`@_M/ؿ'~At#~y@8Q)G<<>A AUt~~`ve!?ZE}# 8 ,HJ_~D d)tЦ?@~߿Gkz۟}]bylq]ǯk`BI`C5r Qqqo SBd5X5DBsP KG :݊xI6ɮA(,<.vIgS[ĴTF;%u>_n+556P5@J#d Mg?.<Ї$: lN\0po6NFZJ&J&J@*(j(j(Bh(h(*)jwϯgSBA{΁4^@$ u@TS7R l߉x_匬֎yF!3%X-m}¾ٶ:5Ň㫉H}ez>4$qlÆ>>'*eG@J*r q^`@{  ev5w=O7~lg\M9BZHkNnEQ*Gݛ 휴֎!4{EJ@ (O)0[K&Zk?NIdP&LR8 =B2"9/vY Zxmߟ@ (VH M”h?ܐD T8?+*XH +"&AK -R~]b)BL=<h EP1)%2SEMDUUPUUTI(USZQjPhj H$Z)bJ*EnB VSX`Ly҆*b&JJIX <~ f8Lq{q )4v ф$638[̡ _a@O4 PF6CTOFˠX ߮5o XK4 A<EKGY{űI?=I\u _?5/9l@։n]!ige v\$:N2hD;dauUz©VkkR^wBy쯆ur7w"Iˆ@?d .N0-pݥFܢ sLː~D])U}# jUc{Tpq{t?GH?3NT%^"ph`ӈV;3Sy$tx`OY0#\H#'7{C,$ ~8pJdBd2m;>8Ip!X$(pR26|[r|mG1G YS7#X'buD̋i|p,V֣4Z:"k;0ΔZƒԬ  2 ltr(a.޳XoA<+0Rd=!ݿe"=fC#uo$ZUOZ$s~0awG#-u^̜ w;  GY/; Z  d0# e=,|lyٹ4c? VV.e+OclaXp3 JhuMK&c$cxU1@F6P(Wƍ J:QR'R(} mAn;*mܞ7s@|G\ED?|j+Re߻-~NG>UZyt'.?($X4p q<`r@Α A`FIS#:5b_*TAAT$ +F-)^ֵZ9??_E?qWd@T?4 ItpJ?/3loQ5|cUz?޳οާl;[(rRIvBݕߊb1Zj)ekz qeW6Z)|_k.|s_gMO﷓sz~1Nxt -nHEyQdGdu'Wl?ٌw?s_oRU~}9/Zu J(D_*N??ng7E!ۄ |!zUzᤔ_f$'_h0RBThqf擊6{`J+c@?b@K):#3}xMF8g?3@=B!MBvay^ rnGc=B!qv>eY{u,P4ȍ4r y2 ~ke9bU-Pt(Hr Y^*[*BeN=:eq0bL FX0aB#"WAhzm Wiӌ>K^z;0C@AǪ()sفV0#n$W!IG%?QWtX{MlƝOox3Y4oSg4{{? -eSj,鹳TSn?72!8ml |XK!]i1C >%DCvj V/! =$"O}U}B6kM.p[]\T>ɼEcI<`Ko|4S| Dv-4gWm DY<[,ڴu**E;KKaeA (4Q0L^KO;k^7W\]+q8H|flL?#^FźO!aB_Lvo qw\_HV@?XNDSmgOxQ'OFk4 9G|:oUK:dԀ @.|-J>p#\=eצ~c^ vH