summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2023-09-04 12:34:40 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2023-09-13 11:51:11 -0400
commitb193a78ddb5ee7dba074d3f28dc050069ba083c0 (patch)
treee235d2d12cebe2873ba5c2349b02bb45f273b4bb
parent8982f7aff39fb526aba4441fff2525fcedd5e1a3 (diff)
downloadlinux-b193a78ddb5ee7dba074d3f28dc050069ba083c0.tar.gz
linux-b193a78ddb5ee7dba074d3f28dc050069ba083c0.tar.bz2
linux-b193a78ddb5ee7dba074d3f28dc050069ba083c0.zip
NFS: Use the correct commit info in nfs_join_page_group()
Ensure that nfs_clear_request_commit() updates the correct counters when it removes them from the commit list. Fixes: ed5d588fe47f ("NFS: Try to join page groups before an O_DIRECT retransmission") Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
-rw-r--r--fs/nfs/direct.c8
-rw-r--r--fs/nfs/write.c23
-rw-r--r--include/linux/nfs_page.h4
3 files changed, 20 insertions, 15 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index a53e50123499..3391c8b97da5 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -498,7 +498,9 @@ static void nfs_direct_add_page_head(struct list_head *list,
kref_get(&head->wb_kref);
}
-static void nfs_direct_join_group(struct list_head *list, struct inode *inode)
+static void nfs_direct_join_group(struct list_head *list,
+ struct nfs_commit_info *cinfo,
+ struct inode *inode)
{
struct nfs_page *req, *subreq;
@@ -520,7 +522,7 @@ static void nfs_direct_join_group(struct list_head *list, struct inode *inode)
nfs_release_request(subreq);
}
} while ((subreq = subreq->wb_this_page) != req);
- nfs_join_page_group(req, inode);
+ nfs_join_page_group(req, cinfo, inode);
}
}
@@ -545,7 +547,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
nfs_init_cinfo_from_dreq(&cinfo, dreq);
nfs_direct_write_scan_commit_list(dreq->inode, &reqs, &cinfo);
- nfs_direct_join_group(&reqs, dreq->inode);
+ nfs_direct_join_group(&reqs, &cinfo, dreq->inode);
nfs_clear_pnfs_ds_commit_verifiers(&dreq->ds_cinfo);
get_dreq(dreq);
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index f4cca8f00c0c..8c1ee1a1a28f 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -59,7 +59,8 @@ static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops;
static const struct nfs_commit_completion_ops nfs_commit_completion_ops;
static const struct nfs_rw_ops nfs_rw_write_ops;
static void nfs_inode_remove_request(struct nfs_page *req);
-static void nfs_clear_request_commit(struct nfs_page *req);
+static void nfs_clear_request_commit(struct nfs_commit_info *cinfo,
+ struct nfs_page *req);
static void nfs_init_cinfo_from_inode(struct nfs_commit_info *cinfo,
struct inode *inode);
static struct nfs_page *
@@ -502,8 +503,8 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
* the (former) group. All subrequests are removed from any write or commit
* lists, unlinked from the group and destroyed.
*/
-void
-nfs_join_page_group(struct nfs_page *head, struct inode *inode)
+void nfs_join_page_group(struct nfs_page *head, struct nfs_commit_info *cinfo,
+ struct inode *inode)
{
struct nfs_page *subreq;
struct nfs_page *destroy_list = NULL;
@@ -533,7 +534,7 @@ nfs_join_page_group(struct nfs_page *head, struct inode *inode)
* Commit list removal accounting is done after locks are dropped */
subreq = head;
do {
- nfs_clear_request_commit(subreq);
+ nfs_clear_request_commit(cinfo, subreq);
subreq = subreq->wb_this_page;
} while (subreq != head);
@@ -566,8 +567,10 @@ static struct nfs_page *nfs_lock_and_join_requests(struct folio *folio)
{
struct inode *inode = folio_file_mapping(folio)->host;
struct nfs_page *head;
+ struct nfs_commit_info cinfo;
int ret;
+ nfs_init_cinfo_from_inode(&cinfo, inode);
/*
* A reference is taken only on the head request which acts as a
* reference to the whole page group - the group will not be destroyed
@@ -584,7 +587,7 @@ static struct nfs_page *nfs_lock_and_join_requests(struct folio *folio)
return ERR_PTR(ret);
}
- nfs_join_page_group(head, inode);
+ nfs_join_page_group(head, &cinfo, inode);
return head;
}
@@ -955,18 +958,16 @@ static void nfs_folio_clear_commit(struct folio *folio)
}
/* Called holding the request lock on @req */
-static void
-nfs_clear_request_commit(struct nfs_page *req)
+static void nfs_clear_request_commit(struct nfs_commit_info *cinfo,
+ struct nfs_page *req)
{
if (test_bit(PG_CLEAN, &req->wb_flags)) {
struct nfs_open_context *ctx = nfs_req_openctx(req);
struct inode *inode = d_inode(ctx->dentry);
- struct nfs_commit_info cinfo;
- nfs_init_cinfo_from_inode(&cinfo, inode);
mutex_lock(&NFS_I(inode)->commit_mutex);
- if (!pnfs_clear_request_commit(req, &cinfo)) {
- nfs_request_remove_commit_list(req, &cinfo);
+ if (!pnfs_clear_request_commit(req, cinfo)) {
+ nfs_request_remove_commit_list(req, cinfo);
}
mutex_unlock(&NFS_I(inode)->commit_mutex);
nfs_folio_clear_commit(nfs_page_to_folio(req));
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index aa9f4c6ebe26..1c315f854ea8 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -157,7 +157,9 @@ extern void nfs_unlock_request(struct nfs_page *req);
extern void nfs_unlock_and_release_request(struct nfs_page *);
extern struct nfs_page *nfs_page_group_lock_head(struct nfs_page *req);
extern int nfs_page_group_lock_subrequests(struct nfs_page *head);
-extern void nfs_join_page_group(struct nfs_page *head, struct inode *inode);
+extern void nfs_join_page_group(struct nfs_page *head,
+ struct nfs_commit_info *cinfo,
+ struct inode *inode);
extern int nfs_page_group_lock(struct nfs_page *);
extern void nfs_page_group_unlock(struct nfs_page *);
extern bool nfs_page_group_sync_on_bit(struct nfs_page *, unsigned int);
Ԡ$F㟶~k w|%fFקJ;„ ?s#KsMP'GZAazK`}y"(DVz#G7"g٫xQWqݱ q+rtSFYu:=x6VۏhC x`G?i@5u{|vNKeA8Uߗ˧[(9s gx>@W:e"ƯO1y:DF~}Z 4BmQj}tke3rAk8pT}?>4ľcUUhXM!vέ74.`T,kϫh<.q瞹ǒۢo.V8vͣ®m/N29p`^;CK:uBJl:" v;>8rd/?g6wP9KPɽ |y:xр:t2[OGVwq9ubW8C:|1fD|>hC.LМ#^T^N;'oonn;W+ a\^tͲ>YS{/[,]su[dAvlgX5Dql:ͽlDç43j~r3y7.kV־n\:Y"ZaRt^Z~Kj;eL [wap҆yjaH'VȒ-;Ȑ}XJ@ ڢ= dxE3s0srդF2:N G\u]?Q-*mKZN5\g=[EݮWޙw`l=6=ذrcߜyy(%Ap&bI]HA̐!K)|Yr]v ,7b&'eK[v3gʧ}v OUu֟jNGej5 "j?dad]EɃeFH=__;fL#ID}LwК1h  Q $Pc$Aց-NLdH;hց+}Ke@8 a":\Z U7 b52#\3&C0-3w[($Ǹo Ù!0wy$q$qUZ VhK,+B'v@2mD$ `+ǔ<suo-=!+n!+.x:z&5& ? Ü0M;@Id蜓>]V8)i6,1||mwͷix\JE/.kܑ-VSj ^TH`>[j OP;&y#ӏW>s}Mo-QWN"7m}oo7q90NG뒿ofۆZ |V#OtH<௬3 E@`>>Vn~];>~>~;7?֍irS6"^?B@nQo˳%8W / }O.=g(H#ȍfqO'=ӹV採iQ#|U~t "!5AŽrChwd_ʫ2- Rys@ J]ɼ Be)]p"z?%p_ ˆ1!߿8O:,}rjH H6ŀNTp@!>ecc`xmk>w]~2Y[C_Kd! [-wt }7uFX92ի](nn52v[J]֮&9}w p[Ǘ+Q]e.uβ W᱐u;TJ "b+[,u:$:6vI}PlK}j 'g[5  mR}0cT( lU?C‰{Ǎ_)pp;$#ͭթX YܖRikọ(Fm\|P.An=wy|3ɯ=fpd 㭹\\ ;v:jZ /_#ybkPTYXnԲ9E"ґ;VgN!}4ĉjy~<䢁stUS( :vK^]Jp{k@yZ%t?cC+:^6i1$>]fd7&w"mm"0d0[_dh~cfUG1S ,_G~ұPU#O)Ln9T&"_m<NmUA?^ HC $+hXkC.BضY4UџHFu}@1} Qd%蹣5[Wth1R.v_wjs_Gp]9>XQ28ŦCQ^A@q@ϼOo~`&(鎻ZVe\=ZwN6ssn>fb$1}z(* Ŀ~{p™nsrsׯ^5DV,a!&vW5r@e/^o&&Z]҇.|d|V>6 M7'Yps,܏>hϒk-+^OЭG/ta0ܗN*H4HuNdW" N qr~oaEi]|ܭpZkٳaSZU[t8ns<`Ac`.z>?X- V;tmş4G9bȐmy5V&paR+ pTQxrI"JDžng[n翿?]?txd*`cT%EBwn/^TgGd ra'su趧sk3p7mД@' \RKGRn:^ZXIV,**"r#,DeoԐ?M[nP} zG:ҙ2Q%<8!Ԇ j<ZrݞX߲W>܈%// "C}l@ unmvahMBC8m[kX2v) EA`}%"WFwDmĝ,8AO3`攷vg$hn!4ɭGZ|nfw7?VFl%k::C{rff ^K|O?Y3AMeV2v1p\\kpD-ipruOؖ1"qDA*~X"]Օnn4=*rt.y.tOIn'CGe4iNpK 2\'Z(T@ V[."-~`fOX jͮOz+WCVj}oBI~X`!o>џ\ܦ.[R7y!&"yl3ع׎p-S5Fu-OU_ܺ?5qX:K@{; E}"=T]k+vǘۮHH8=7z AW@JkO6Qsx4dah߱?\KGQ~5o0oÚW@{qpv޲ݓѕ+9K鬞;hФ9~,xssNlsLHKr u2:E)0a-ðIQIe#s@fsCP5]r?Ҷ]do^?D\~mT $ Ov0?Tm>V#^'f3*;7񑧱|߇X_ZP5D$RH_@<( By 4aGu-;1gZ TՇKa=:&|{>7Cz"B.VjdP1 WKӯD <ӣrB@-Z‚U|9A߶^Х̈p2޸#80-@av͊9"#luG~/ 3p]1|?wھ=4MR ) m=g/B qW&)@ZP`yno 5zIW e0#;AE1P5 l)L-6i'T^9^h#\S=T-ɐ#t t[[/.aedk4zc%gz;bM%_Qͼ xj}!7_k 1D:L6{:8(^!@?%~7s>ϫ2 +=ok뮴٧ ߽yrxumv/.{E7UhlShȽ~_WT!bl1'nOotchi]込z~}*de(52Qo6c6sb?ghX9%;r\ܒ-B/~ ;#苾_Sr1<;/2+1@r!q  $UG?~CߗDO_QmW͒r< չ^ :c\^7o r0͎m}Ü/#wK-Q.ۄ"Qy]{|؅hZjMQq~#`}~{_@PtL3Ӻ!3׻K룃6e{~&iKn$#S2*6kٿͮ#͇6cd37q͝r;`w(i3 wv}h!2A0;<ؗj|}9q"QsiV@(AR}ܷ/%M\W;a\Ojs$f.+|q|或3p22J0.9싗gfz+z4 ~]LV"(ᑅ9bXJQB&q5[mÌcTy' S:qOn\m8xZf@g7[QI+Dž$4Qy:OG3%*DTS?˃?&*, Hg #9| ~@GʥmjZ&vS|>EEQB&qWREQ_S |iw=5ձʮׁEt;n.b֔%1VϯB]5ΰpFpj z-죖ҹF%-2|v>0 4h<as ;R xhE#%G^{e}.fq@0(,5z)}ճWߥqø*_@2I :p ;~QgFAc]ԯvy5cXGy]i,2xiyG2.E,xu(=iݎE$A` 5nOq 4FTT PRI 0ߔ&_.O 2.|!'u>o#h-k9߻r:ӎM=r+Nk4Ajd͹[ÚDիiuʜȣ;WGݶ4(89bɝႸ+͕"s"^'7#(dJ 敨Y6Wd$#smE^Y& ڡ`zXVaUќیb-` C桨(~ތP5j6ePuA@ n9ufUg5.CZ,S 3|a `Ngoyٍ>ZEIVtQQ":<d why7u(e5B9Ñ1:%3۽FDx6G @9k>O &Se̽/y~ c厣3-I m/Aߊ x}lqӟ4 |:^yp]hЉ99=Ppqsgq:>3Ì؝gy_Mzͻ^hK@ks[BLwriYm[mN9*."R0wAANO.V"cᓳx[#z]"4!Ht%0j\ph"vn{uyP~e!2SCZğ־>Uf28(]_xJ0Py@dZGRx >;9K74qvC._sQX@`*(w8(N4őVAI "22zr| FcɈpjem$ B̀pTf7~ Ms6968pm7eAbR}yǰX@wO#a3ZvqSpH늪[`d|u} u%/h+\巠qf; 7E]{P}03B#Rj'sg[pYt>Y\g\hxut_RDv*xA\z¾nMш}\5myߏ2r|e]f|ߔ_]q G*,Gϊ#<Žv. t6y9C[h=TzxZ$=C6$>ϫĉ 2T&BVHHva9cdՓӷkJ֠aa6 oGZ4)}^XM7J39([9}!e5!ZBM#QE.@gre+G87$p]F#N0k9)z r}S)uAٿ@ζ/E0Hn]bP遅^xޏ~4Y= _u}ƤscZ??Ã"`zDi+JwN#7H <ˑ臟>jr>qG2Hs) H\X{셿R~?LE{{yȜ'?o?96Č8:l\߇D e;ӁG?˿z52aA:U i{89Uj^j'p*^QMT"9&{}ŶNv5>6O֋nuXѢEb.(*m%:) '[+R b'i̭$5zaΎ%-\ _(_Iٽ/LMn'ƶ8̐|<T Z 䃊Mon{d gIx1"ӕA(:y`z0a/&s=ZdjNB Զ[)QiQ>5D|ҸEQ6{0Z.˄jϼt8\vcZz̸V]jԇg򴄵o VZnŭc՗ CAV.BۚtyfGrִkeckV+po3#Ǒ&D5F`i]1^=;5#s c 5\j3NWuNmiF98oacAXaRO㍏F,ҁQX#Yg74)R(#7p cJ2M;Od&j+p2(7_ޯ꼵/}1ehҢwT) 1c`D\9G L85{v0 |}q"5qpq;sM+DHa Q@_mXSP$sˁۻ<5F gsӊg7ű ދ3LaDЁzZ_d8 #A>o:UtQiG 1oX B7&.уwSƔKǡʳ!ó2Qx@7$o Or[CȡDoeQs=<@\gzF,sj~,>PUMdYM8=[Wшت9GxmKZR( V.5T|s8g1?ԏĞy0`|8xӹ DE[X< ~RǂL2Qb,1\F T-*!c5{^L:^"|y΅0*P#Q9s7*O״?@_h\JrͣNL4a)}ST.C\ {4̢z,8cJ֪foLqVG3I2a鴅ؒRCsvкI9Y0ɮnk\:nqm׆h8j.Z\C7<񷌱 H' [:$ 9R`e(DvaMB1)/ԊX/Pg}`ӃKuسU@~>yZr8F`@$ :&COn <0T9-H< /Qt2om~$wwtz0kGc)OϮUiTZE܉-[kőbKj fõ%S/_C&Jutb~_[GTm©"މTWWc74aGm nH -/Gڦ*zu5M ~/˕}M[`MX2yै '̮EQ/dSnQ*89$ϕ# EL|:~~.w‘KD^6ly쥳6%JwC#{|ԘwĈ%sQ9$/C4ԟű/Nn\ml^|zok QBU6t ;@= ՟p6di 0%QV&d$ˠ vg6Edñ'(R(Dj_2 oOv[=?"\<[GsC%&vs!Zg^X~. f2i*O(+r۴qWC:j9:c^{3kR%b@ܨ܄A_P8(jW#e15w7 ƻ%l/Dy* BonrSGfRǓ2Fe09'AtmDtyzsmM%aew=ˍ$-NgF =7kdCBTr4^㨣 Q!C ol3V|$hB[ tG}`ۏlss{_g6T~O9o #jP/d+qve!8oϡa^ pu\ʭNv$׍eoM.GeqG&"Byukfq#(~2x]EGQG+ٯ~a|Q`jdJ ?Yg29ô_? +Y(/@;%z\t El^WО nE:D7Hm%bwHEV[M;RnlϢ5QAP,謙vEݪ c ɓ alPQGP1Ehldz#u{u=gvu=ADܡI|+G|v{t~9G^`n=Jˋ%ʺm,q16eA+`9a"NXbϦ4J>,^+|~?wn"vXCh`v9?w}{`my$/b+&Й\# <+~ 9XyF]TE3,ϊyl_Lek[b@qzHSEO?pv╵[d{<)"p#[+#5$46  8"ue/HB3Qpz"c6Lbyŗ8kٕKr if.|q*+H]5EVM| 囹oۄs&g_Hs+XsƣԀDdh '(j6ql]rY4Gg7N r?X@4kׁ;AokM=@TC#4Z5<*F?p/ 9θߏWW..afw(7@sC"?:q{]/D<%cӟɸ_ߓ\ee'z^M[ӝyAV}JyiJYSM٦ˡ+q?xоg~_n)8ư`9ti-QϻvQ P*@>{2suۜH^3޶H7# >^9'轝ӞZל)u_d є*},u>f BrTo.WvWdjm{wc㔝](V3z-IM<'Ž9:-:-_ϖ%+Mkzۆvzs"h!Go_o?~6ϷN$Ȝ K(IriH ]B's8y sȁX}l  w~~wLy;6!ʨ@I-<ˋDt\7 .Kk :A4d";G 箫؟5PX 'TUwqkbdK_fz[*/ ! ̯3-L-m}NkEH^0pOS ]8GJ\:$B^ ^mJy4dZѷNX/_:nR*<.PP6ɄPp1/:Kfn)Qg*^ǥ}XEig%P)0an<~_%lzdjq? %'$XѪIQL}7[eUY'< 4/ۏqws`YqyM&8|`=wŅq/1yxW4az{ b# Yۄ]DW8'G!edH0"^hO~^̒DFLLwVuEvvELv*φoK)U`<̧n;w=;0:xbxQt'pa!si#>{)+ J._8v:%ZKyǙW>J- >Itj CrqmѸa"?ADI@ ڲ> $FY79k@*]/\OBMdaZY +^% "c40ЅO:Yi$a69[7wf 'Ri#(ݍ2ͨ1_9.QP0|(TL!8NuIT~ɘ̶"7p>S0VJ O4"$pWǛ+D% &˜DːTc$"m.@ ;v6H%Hv ٢".cpϺ`~\}.3^kqwFUb5.Q2BȮc_e*E<}OC)PL3QH@H/o=).YKq nͤa^ A@ !n!FRXoڙ]lM{'NQn4{f49pϘ<(Nu$TQCOl&c7'Q`AP¿pPrCA>С#C#RS9,~>2/k} i@u4xGSm ao}ቭTiՌ#ҭ,QB}|Zo Ӑs0׷ǯUӚPϺj6kOχOv&bRdb~|F$E,ɶXO mAXo@ {?kZrHOͤ?|i>=.kuBj'E5˴6M)5fM{sXvHH\8%$h} Zb5~RadL9~WdQW&wUAϬG#$A s7ߏ |8EͽE)'46/zs?蟫e/˅1깘w:x @C4S@^="DwoLx#ˬa̒}:V("dq#y9pCZ Ǝ}ۢ70 {hJrc #y2dהrXfNSǮ1f@ 1z9ñ8'^z.Yh4p箒Qu`oxu MV.CG:N<ވ D_ls Um{T,M9;y&07&= Q#\[f>@c;)2~Ju/FjІ .4}"YcKf#W|bj9Hj=R®JvS0C%[G*F WiYg~YaDz{NL$ɀjǞGٔ1b}:?ri8 h3n].TPgTjYjT4n.p"dn{eIIC3eDf9X>#沚ǁ(_u7#(Ҿ^`M+kcg[|j߾t=P߁qss%+5ޗy@eW ң:QZxGaicj=}!wMN=]  nfar$es.8:(ZMiOFDZ$H{SB+ CAXu㿞V^΁tO|i"ˆrg2˾.&rc ,RH)2r:¶S< a- JHXbr?S~jrq?I 9GŠ `3/R`jH({s`U :V%IZ_/Ä6~q߽ s;S  @[ڇʳxW G6NʌoPL'oAEX.x6 AF B這p?DGBS-qyK!d(jPLfm%=lϾ:<`b>wH}Ek_XSDVtPQH(nXNP9F$sϰ-!a_<`"+*e,&s fa,$?\@!03 G!P-E Dv5, E" \k/굗 GdE/. V{arN~}3v0kJ9YbT5C$2,^H0XOa#YhfG(x4rI5 /]/Jq gƐGN mс(#$G$km5LPjǝy{$] 0?Td9y~ygs0Fֳ!HxHuJez:hEl X~ .-ym.Q)Z_{k*1"u9OЅ)`Ք[@g'"ƑI -sˉ4O"TDG3a8Bq<\drʇbB#l2H-bDhC*D3x tnPPo3x'u@Փmws= _$NV!-%ǁ \aH0J$q#x4pD(%dKcZU~8;w ect8BkWÓϳ$+K^Q!>RӾsem#nI(J  (ʴ#Jik$\@uc'N2_(ccwQkFJ͢?(2vb ((~k̖Qʶ6Qg1imBY!8#)jCl(7uOL=z9f0))8]KNt i7i裏89½@A @EB~Wzv XU+e I׹&Z  0~Nw*Kaj:⨹dhxo=` rM%KN[ʹKIFHO]~Ooc>Aq`̘QdE1]ijO<'վr.K]TFL_T X{`0!+j<>>;7tw%0y|;ffûcq\]!&A!B07w'ۋΨXg۬ qX+>lhYtDzh$ -ږ}z(+!!b]$[I?B׿R<O"[V b #8ݝ)G{rFWU;Ao]Sږ/諼::5!_xlE%딉 [o5-=@uu.^<bc.&{~jf&< [|6ݽd@r͛L2,jH\9BTD@TXQޖr:r- Sl!̢_Bv47䠍F QD2i qSZ1#_ {f}!C]V 8od*Ts#{ۘ*A0}(EV? a 8獐: a@|v}NnW_&>~q|ߋNL@: Bΰ0DXc;baV1D5 b٦p+mP\)GACr eCѱ@4EGiag@|ab ǭӀю8pͧ#Zwb|Y\xacFHNfh,UP>ӧκp!P NG俽Ҩ]ppfUy\xyFY *ɍ ձfi6$lƤy3Rr0B`D?DU6O_r("jl 3>\8ٸY )vK͘rnImsCı遒jG`"GLLĢGQbT&I$r'1^Sw=x6tSUnZ0kT5ʎgN#H [JME&񝦤uDl%,g]=rN.1L&C?&< EUqLNjs UU ʚO{ه]y0F=k1G M@]޴h\NpR#9Š\u[%s6DttpVF#9j4<.@ "+TtDLIWl\I8-x$P?GQ|d@N,YzHY4kᗬ]3_/n/7g<)A t7aI*# $U)_.pV`czܫ5KɗrAXE8$ -*.%#X߲"[*U<Ќ8I$6mV}s>f?˃DC)[?YH`Ib/`TF;B@C\eO&hs$]Պfq;8OSP#a3;IG?~r l g{;$O*XTTR(q - X$ '/D&{Evc.~k^+uw؊[?k4t>+BFA qx_!3t"(Џ h{ -9a'UG;6B$p炡MRpA@}EƏD'ե=ֶ;B8G5&Z7JM_mH@GDT2bcN &@ &~81"#<]xNSQU Jy U <3 -" A[,^#28?YP# WGPqԌs0g jZxpGC :=4QDme8/݂:|<3эpf}ީʟ"6µfT[J86k? hQ *ȢS;_sPJ2e ԲH3s~J6d1G8'g1EZ;u3 n>n.vB7ӄ#C09/ wX(PAVץN&hRu0/ߏsqKnsbnČJs> 5>0Nl r$ɦs  (|^`5!#pZ-n`J4e0OPBy}wӉ9މ#^3?25uDN삃s\<%]zyxOeWR^  7]Sڄ0| /#W'hEn,"@anƸ5[*ou2ݗ,\?"GX wz@OhQuEDAB a H ad8K|U6Q ,3G矛q('K;yPHG*Mőդ8K.2!%o86=M1${݃|@nP8&F=57\J0/~:2;z' F8쉑uQ(}Dz\Ƙl{HzbE .\GuEҀk9vؤ Cm56H4ŏKnG%QpX -2)Nbߚ5?R)#Z{O/CPrDGR/;U^%U_pz77hͨS3^%v ĕC7_ް,I~a)UG-+-XoAka۴#Y-ȉoEV)CQ 6*db̻5P6X) f0cC((pd Np ڪh.uqLXp:ٙ9RIP$ҍ&yhg=uZ5S9B'`eQ'$fͱpVf/Ӌ~F&W8qB]nPю-?8}T,DÂ+_Dߨ&EDcr)!Sg{BQdB:znB,Biah`"(_|X1#gKl;4&xl#}gmBR!Lz0wc hC RYwyNXh\SČ e;=o"_Fw5uo,ӈQN ίl^a~5@big1vr9UO䳨AɐMog k"H+} t  bYJ;(#y]9e\Zxys:{PMP'%Q6'K"šm `dA+w} Ӆ2?: $J5_(<>260-?(ZvvzxZt&fbzgiV% ^M%X]>:>4χnzhnuK&:0r#LCQ ޯf 30^gke`mq&7In`PpNЂ0~ut Mw`KKA2,̕@#^#9ߎ' 5_~˱lb4)J)Nx?[? Z#SI䳇9x5TP5`(;#W 6^v 3A7jU3 4pJ`Cb@#F,PFNQs[=[=)1k?L8T>"S s}UX<,}Тn 3k6lSyz"`H9JA%[qB>T+L1yhpdE@>j􆷍WV=Б+0=wfj7 ܬ=wm_;⢡nknH{Y>5dߥ"$b#.8tG/w8p5 #Y a`ifybcȶY#7Y+J7*y~wmw {/BjlQ]ZYt&žEsBVneb6싐ɻ.Dox@^*6g?:_ĭ)Huȩ=f{dMϋ*sH=.Cx|w: &auǂ>!>O^P1|IfLD]6KZty,|pAfì 3n&\',"n:~SCX#G-:ޢ|r||- 5QFc9^:%I9"-vux5PsW9U2cZl->v>n!uj4og [OB-ΥPR9=r}g'Izy-䎫ׯ2²tHqw l^t gmh8ZSm 1y-P9ER zH#H ! 3/ow7GwWgv/H2<ZlkEp3\-뚳uI p9l-x 0:il5֮mY *櫔2lsP Kԅ]*zΜK;<iaw?l0/FZXsTI 4#p#e>ucԙdU"$ `{ fl#]G A￴ !8uZgl%X G nكğ@0EBBdcOVX/O7a(A[Iɓpr֎&t"MJEȨ55ˬ];%KvlTƉ LP̌2TvRe>` P=e/#6zhNJ7vel!CW+Űv*mIX} %J0{J 9L^'V#OpqC&Y`*( cdJ;P:v)C {2 U}7+܇#**\ .$jp QąԎaGodwb}:&=XkP:H'l:CQn"rGF?R Ħ1*{5醼u=uAnPɞWg,WM#2g#g9\\2-"bZM>%"h1rf'{yP.,,l@ӒqP\Chۍ9T kk0nsNq8͉3۵[YpJ\PH$V;TSxwW𖾗/x#a5B-ˇ]ߤ'hjT5"I>]<7Uw_bV"b`:t(]\mD7Mu3h)r0fAwOG54I]DH[X[SAqx{wZkU(xsRۅ%xmr1Ec$CYчGhnk=1 ,p$*Ng<юS=ḵ|B.C;*3 zm7(Km:jN$T~2 m1灮lqc%8wS@݅=NtnK;ncIby>ݙҗ* Qw$rɞ522zmٵ10i a06mDŽT; L+8-Aq˖XHvUS{Mo/ztb$p<[@'QQ'<`܉wZh'@c`E<SI[ia9p8-&3f4\q Ieݵim2ݻ9 %b6<-BY3փps8EٺLg.[66w  eUC)lZO% Lո~V rM #om盨Z|Y<4~I鸸\ù@M8<&:/h8waWVNl|5\٠$FӵHYp }n`X!޼cbC$a a wzim9[| ,q%eXS6EUC) 2A'ʦ Kg Nb:yev* oQ*:eġ9ڸUXTx@ef;.EQǽ BT;&XF\XVsa39(֟&cYf<2mTj~r|gD~,MXA85e-;"\2 X}1,ه() D㠳 oK,޵:qP0@%22I `05{[Ç|g8|vhLbM?\:k f`MKj#-2Xēs :q3RdT({ǘHLFs! 凍o-}1nB+L#xKػ-b058yo.uZha//<02Z^c) 9_+܊dߨ?[Ӭw $!{xzx^B'kC!>}ѭeđ :x^;ޛΧhh,RvKYs&ޏ̴GC,ਉ3i%YKndqը^?|K9ù^zjs~ 6 /3*[$?ISHՀ*D/&XU ޒ'$^='fTqCk#?l@p!Q$]8CQp݄1)91hGQIU Eob˸?CΡڐe/!<(UT 6 VWhbXLi%ycygC$ڔDz`WBZ^DaRR n'1IT%ԵXoPUl;!N ܄,H4 CuT7CfN=!\9'sqh4wsXIYbv7)rd`1搏sHt!u-9{}8Txs9KfDC.NءQVY*"pxS\CdTbY'c_ĐsT;}OOC2Y613HF *iN2kCAZ px=<XB^d#?WK7:ʘƎ#5`ʳ=:&p":r(vEaɇ@y-$=BowrXr yJ-}7?%2k.?vWǝKQVx!f0DΜZ3"3UyX HWZƴ 𘕌&@s\z 7nf塾 ;}Iy,HMtM4C|;@`;+-0?TD@甇 ?L` y8.gR6LS,qk\@E.ɯFʴ!pGBR1a$}bݽMsj1nHY3Ӥ^Irjx5 k [OСY]%Pټ[:K::T3c;UCϘQwn驄k<FF 4$L=}=#c$dGxAC; C&uh3P(69%_i @kUc^%/cK6]OF"&%JS' n48uEH=׈܅:^3Y@D|;KoD)irR-}:5tOaj_0'V"Q0KZĪϴFF|49XsĨr|іl_[/F{S&PRn]8כUD''Sɧc`i*DU!d|>9W?,tp4T3B:v@0-Z%Jh|csmJLh# yQZD|( >RUA*9xTk+Ov,tpaEz Лnl@js8߸Urw5}׀w6B31Ƭӈɛ.op1}\ Fu`}+:: r-<9hO4ᡔsfL@h@wm|^an)cbwbi2ש3,bo OpPCx7 v+SR 0BeuF+Ԁs$#7ÏCGM+*2vr9+"dž qIUE[ Lo3h&~|Vg /P~Ar Z]bA68Ϻ^ OÛЀvh=4$uZ!=W0섪m12j\)Qb(gpE :b?/./MRMC*aVpԠa(eM #N?X_4ARiuo\!N&@xFlK^T|]?砛;s t+-WSLvBDDDK=$ٮHQX&H~AUZGZnڮ|I?qkQ:C17R A5\GaxWl>k\Y=l(k]W$WlT }B'Ot#+)1,Y8.zAHPotl`Šҷ^7|c&M7ہ Urs0 Q"07.p72  `yp5Ǽ9a}v?4Qqg$h!x$r`[[>fL}GeXϺz(f*4?O"kacࣶƳT)t~sHr' }c`a0R ^kdxt@l{A61A Y(>blȱȀW.+`9zup!DŽ!IrD/.^<{+sX"I*nY8U㞓 4;G(}?/^Oc)S@y^]\3n~QX/2|*(sZ_-n|s;+P0>{ƀ֜g9UXSwoܺŴF"!5JX*" vЮ"t:l4BmݣIlg 䇤\ zO䝻$_Q}o oYB;"-Uo>SwɅ%ۮXtjs Y]K q}d gUo*Kdȏ}Tw:Л ̇a$tCd@oxӺv G`2QsZX;tygPiߴ+S6bwYNNߝn, ^DŽ^/[')@BO@9JV%;KTAj "Z(:^aŠ110CQb5A udi? jf,  jZhmp x|3qKH??<}ǣη}wjkj?Wȸ&d:_t{8{C'×[#23" F9( ;~IeoƢ-w4PFS$\pn%s2[޽9.ao޸C>dkcͪ}:oBt|ē4~wϣ/r3a2 ePRDthːz=ǃOor <-OuauظD*%)ƭomKH?bKXӈuUbA~+\fI{j0HBBG/'Oo6FY҉$)* FžmJ⨐5 %'JdNu!BHt!iA%XI.2-R#b2?b--+JP(pJzH9}ȸTR U>rC];W9CQRܘ"\  ^CoN7,d7^_<1vǖRg,g2\[Ou?gtsuBc<~Ѯ|Kzf3}}uN,Z N|&=j?|SrsKf#֠)@y;?߾ŪvZLCF 6}K^O?;+7γa;l4oչϊpQN}ޞZ]raqǗshk]￯c[5+g kH ucH߀>Ys鷃M{bn2 xrx)6 ̀7ѹʃ309rpos~nC/ >;l=]RRO=CdOwcpKm=E%=ާ<1ö&3eƗݳWtփs\GڊM{9?kx2٫[?V+-w;Oytڻe}zv{>X^5s8 v~ nvlG~X21l" zZBwtl^,*!w7k 5qLK<<Gj9 m!حqOv&,Zy|mzǻAoY!c2|[\IsW=5`_!QbB6N̗vK;#cRgB>ʇ1}PxzCj]^B}PB4 )pˇ;Zi/B}0JuRl\M<\mN6tuYD}&dl3p$nlX5Q:1! loh;yloE הD2QC7g'Ѝ<Ϭk0#\&`Ȧf\Մrd)Y@ڹUV0  Xl&tȿoC: HV::٢5nͯOw F ^XmWi+0|h՘G.6vsuLN ~^<"#sQFIR%mЂSGR; uj?325ZHcv@bJLE&kÞRX0U}C>0o%hENWz?9eū{﫹;+ը1"qqxz'V>,rq&"mH@C3w_r kFk&R^q'0P=@n7\ 孛n#y0h;.0.ϧ}wndo;@@Bc5 M%S32P]0RE /k`MPd eN2u{Ԑ)%"AR J2fC4 !!!& 8i0DLN'G5]xY;=/'B(F~>I~/'^׫-ôwa8SS0P5kKm$X#~~opѾgWf)Fom |,lەp՞l 9E]mI"mSBڠ @"s ZH!UU[$D(cfP} <8ZyH>>&jAeXx|%> Z"񓼪pw싟1M'UyuӛFg"mHnoZp|'d>a88J $9^afk`!}utq(U7gwum6G .g Y9]H=> dA1H !t.,r[om S,V3w$Pbt@W@l ,VG ;ȍ +<Ĉ(.ȇL>O v؁-mO8*o{O gdHPIB$^D+1\?Bߊ$ER4~= UL݊C\DGxH|xm[P#D&mWβ%|u=q1`}hSw5RMo ݇D&BboK-~w TO-sxg\px $.,?C/1kUfUGb ?$6H+B%Fe,woXsg\P^>gMILR"l(y aǏio br֐0|7h"c@..:y5Vbb' "l"-ӝr禺 0B, BHjHgdu!hʯ`^-ߒ"(q)j]RO&"v)(1>2ܖge'sxN "Ȓ@X6;m7D(v0l'P4W"D.{++ʫ2CX5Ny(oќ08Țgrn E ">)7'籃9HD&.o^9{7L޲?K>=~8gy&J =qؗyxxʖt|Bλf [T lXsg IZ( s-_Dz'3k\S]C`hz?<q]TņszT{ 4Gg;.'+#V)\y7GEÄ_}ʴ]["/Os(qWzHkqgPK.dw>'I``%DJvxЖPc_-~Ue\8gWQ]fMO&+uԴCupN9kKE ~_sB3U襌%x/FtY@.RDžc~kpKG_Vt<c% CEZd5Xlɝ!-H.(dJ,U 5h.˖9ص7c!sUkǥƅQeP@W4Z/o_4 dҍq8!8E:hs`KR ] C:]ی9qAX6 Ok5& r[bvJN*~,oQ/9)#W#嫢'fJN-J6L"8iI{@%ؚ$09v~<8(&@$?=x[v%4;ʎ7y(}ʣU*_͐teu 2]M#8=|>w#*H0n(Ѓ & {2{r#EHHmXy Y` t ^ExMZ*kmy 2bAgpX2I[~7iBdst4k71׹wFݮZJ!D6t7tfM;ODؓQцppqK/6OvK 5V*\mҺb'T'V`{7eklӍ!1\D^lD|\9+8أC5T}|XgEojpE @)7G!N[g^_o} =Hj1:wD#wPly\Nۢ-TjkC9޸]cm?~#@*(f[l(66ms3}f܄Ah,W XGh?U[8^CK4>]{]:=Ͱ]X1Pp [t/KT[6ӥ;:V  -BoO9C3 ~^?-mHwk[nսRpFb??O|jd}O:V3*ŧ>UG!aA$;4H ~=mk qѬMk!u n-@{ 4qd_8C‡@aCJ Ģdd3T (4jScI1 jʣp67\ap8WMqh`Äq?+ - #]&5\(è3 $H78+'!  @9jy8x/||;e ^{~scVPgm}?L6W /zwbA> g(؀t0Ht{ҟ~u$*x0bQиV5Dя&hkdYDfC;Yj!R:lׁk2Tjש5}˻6}'$q5ˬHq{*f_޴ ߔՀη>׵x}ܨ ص\Ѝ s׷>NGk:Ao7,|, 1@n:R]"c6%~Z”:VmG@<:L7Zi[ )Y1b\mV::\_N&Y+pdCB1:i723GyGуw1yp':;wln*irwH^lJҚۚl;49Cg 5&; +`y%ٓ!YB̃&{S@lz`#gy\[ƱCiTzDfiL$jvZu9tPa;Z_#GKH/hF%j ,{qpV߳< bxsN0r)dy<^cUY&;k@0#`?1el9_ϡx}"3#HfeLbUfX%cmu3 ㈐5SN9Ԃ0UfMtʬjH[9PaD(H ׍nub:]P&RF$#`ϵnj߯Jv trf35]>ncS,~ gV@ g TZCF&I"ju/v:"׊"$EP#K-|eh@D@,0Ԩilƀ$pjj7p7epƑAcvcmf)$ק ߄[c 6a|t =|+RP0-MjqK[Mn6O|\dZiJ"nK= Y 'Vφ$N}#SԏY5~h if1i0\&)LN2GF d"Յ!2[83UJ<[$aI j$"(J$4#AD(RQx;#[Z tM]q:yqY#q9Xgrx[ζNy1מ(蟿 |oev_ڞ3Vۀrg<3by[4Op\ T2b1IM0]hZbI5S^Ѐr 4ųm<L0my_z· "/絯U>5%eB:@g/t8sg'Xp=-,^IJڂC5DfӐܜ@]&"LuFxp,舙,$"jF.ƷG^x7n<_L۳Mvҏғ){UjkM3٭W ~4Ry-EeT^8_7gbF+,8}yUnrJ"HOyQ ixi5 OVqsOQWB8F蓑&AE+r9B'v,ZJ OxTI2=\Bl1!l?P[I>I{_q%@+=s sCd(-nDleT/ߝ >?_BB]CTqJ`,b >zMDIWP4Ph}J$_* v X ydd&ܿ '#^Y?$UxM ۆv :6&#:}u?Q'u]{B4!>^4tt`yw|!#VA9%y_<<ϳՖYN~[uC2{Jzl6SԜ`${o9G ?Ft6`2 ѿ{'W@(Oӗ[:@^5]RLtO:Z8p@kXtH %Yp@7C\mvQܹcKH@@$7-ќsQ6ۆD1Ќh3OPO%7[E9UT QWDT \h:}ݧ͉e=-lm a&˹rMb/E&B$(:ACg̯Dpvwv֕,4@bTmGטZb0NٵPCdyT?a<:2xUQ2UQ2URTQCTQCTQBE5E5ESE QE SE QETQKT":H\HhCw۩|CtpМ]d 3SE"Vݭ|~@ ÷(ܹsPꂨHԄϲ$%ώ <{zW7(;(wNIw{A+nF ;/GG -#ը\@%8L*4T 0̄TUUH4T#L %!AAJB)iWNӁDHDLDA DRDJ!R#DHD!DDCDHR!HR-D4L  E@DDS}nupR{{O^Is.N|'J@A~Lz ) q;4 !=ӊ@ >hQ[Oy=~G2gæ4/@U tvj!Ghw sdAmNeQE2w ji&ȗP0ܒpHp̢"9VCa T bIDGhQɲo'8* S-QjQ%꾢iZF&(B'I XK>Gn'ktR `98I5{"q<"45=e +Do%/;V4 |.dM`S/E^g=sԢKAi\</6Ug&~spuCϯd3I$3 pg:OMS8{c/8}xzNV@a<dB8P&X[=wM}샀o#monR^5Sͦx"a;}ugPA4 Z] Somjo'I S8F1/w9A*b}/no×?{~npK"niD0W3ѲLUEų1`xy !?قo~߾%ՒAد;,S|h, P*&HJEgx "9$!䲪E S#tnbO})ҏJXA=^t a3"_K ՇصmTJ& EZi(]J* kd2ݓFf,][y P+3 ]F7;Kv\B+d9a7V+јqx"G)ND# '%I "rG yR@rH"avEG3td8`ǥ@13ci&] ڛLp`8p= =UQ<~K?ۣ˝oZ&m}2:٩GM#) !Ex4@%P+Գ9GU n ]ހkEHNgv^*ejМ~X `X27 x7(pm aYٷc$L#y @ސ.I :ꖔůPk^z9ό-k-?7\ow?Jdl13{O.?˜̰2ϑj\'K~qze'V;y]'sOIʝcrѝ`lS74fلkk]BwYgx>F]*'?{X6t;%IbGl;>Svx5W_ZD339k8 @ٱE5 /߃2:t" Q OF/]:Y20:G+t@@M,8Ю6{[+T[_GbՍh;3R6`|=܃} ^G0?"T|۞FV!!<t_xl ?Q5+.Vgw~,T1'ͮwg $9$B~]cuW96A}3~<kƘЩ"쵤w9[p| u*PEq;S';]{^6 KPضU?z<=CME$!G]gd,ڷܨY 9A ͠_I4~zˠϱG)U_€-`N)%J''qp?-~h}熻D6*-:?gj'Frtb=X˥ , ]u}Ò:I6x}]pf@wH$ *H?F&'3cswW8r xbMsZ6R53+ ЀzW8G1O@QpARGã5-$%@ >i