From 012a8e4585885e2fce219f75afc1d1fb32faddfa Mon Sep 17 00:00:00 2001 From: Rmys Date: Sat, 6 Apr 2019 13:19:12 +0300 Subject: [PATCH 1/2] icu4c:rebuild emul32 --- programming/misc/icu4c/actions.py | 3 ++- programming/misc/icu4c/pspec.xml | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/programming/misc/icu4c/actions.py b/programming/misc/icu4c/actions.py index aacf0a0ecd..a175cda3b8 100644 --- a/programming/misc/icu4c/actions.py +++ b/programming/misc/icu4c/actions.py @@ -38,7 +38,8 @@ def install(): pisitools.removeDir("/_emul32") for f in shelltools.ls("%s/usr/lib32/pkgconfig" % get.installDIR()): pisitools.dosed("%s/usr/lib32/pkgconfig/%s" % (get.installDIR(), f), "_emul32", "usr") - pisitools.dosed("%s/usr/lib32/icu/60.2/Makefile.inc" % get.installDIR(), "_emul32", "usr") + pisitools.dosed("%s/usr/lib32/icu/60.2/Makefile.inc" % get.installDIR(), "_emul32", "usr") + pisitools.dosed("%s/usr/bin/icu-config-32" % get.installDIR(), "_emul32", "usr") return pisitools.dohtml("../*.html") diff --git a/programming/misc/icu4c/pspec.xml b/programming/misc/icu4c/pspec.xml index cc171ee920..a15383f10f 100644 --- a/programming/misc/icu4c/pspec.xml +++ b/programming/misc/icu4c/pspec.xml @@ -72,6 +72,13 @@ + + 2019-04-06 + 60.2 + Rebuild + Mustafa Cinasal + muscnsl@gmail.com + 2019-01-23 60.2 From db34991f9606f069ff7a3d273881a83163b6aa4e Mon Sep 17 00:00:00 2001 From: Rmys Date: Sat, 6 Apr 2019 21:55:41 +0300 Subject: [PATCH 2/2] kernel:rebuild --- .../drivers/module-nvidia-current/pspec.xml | 11 +- kernel/drivers/module-nvidia304/pspec.xml | 11 +- kernel/drivers/module-nvidia340/pspec.xml | 11 +- .../perf/files/patches/linux/patch-4.19.34.xz | Bin 0 -> 989456 bytes .../mageia_4_19/fs-aufs-4.19-modular.patch | 404 + .../patches/mageia_4_19/fs-aufs-4.19.patch | 37882 ++++++++++++++++ kernel/tools/perf/pspec.xml | 15 +- 7 files changed, 38324 insertions(+), 10 deletions(-) create mode 100644 kernel/tools/perf/files/patches/linux/patch-4.19.34.xz create mode 100644 kernel/tools/perf/files/patches/mageia_4_19/fs-aufs-4.19-modular.patch create mode 100644 kernel/tools/perf/files/patches/mageia_4_19/fs-aufs-4.19.patch diff --git a/kernel/drivers/module-nvidia-current/pspec.xml b/kernel/drivers/module-nvidia-current/pspec.xml index d277ea4c53..e2e10cdf62 100644 --- a/kernel/drivers/module-nvidia-current/pspec.xml +++ b/kernel/drivers/module-nvidia-current/pspec.xml @@ -18,7 +18,7 @@ NVIDIA-Linux-x86_64-390.87-kernel-4.19.patch - kernel-module-headers + kernel-module-headers libX11-devel gtk2-devel gtk3-devel @@ -30,7 +30,7 @@ driver Kernel module for current NVIDIA graphics driver releases - kernel + kernel @@ -164,6 +164,13 @@ + + 2019-04-06 + 390.87 + Rebuild for new kernel + Mustafa Cinasal + muscnsl@gmail.com + 2019-01-20 390.87 diff --git a/kernel/drivers/module-nvidia304/pspec.xml b/kernel/drivers/module-nvidia304/pspec.xml index 1ecd0fa406..16611077c5 100644 --- a/kernel/drivers/module-nvidia304/pspec.xml +++ b/kernel/drivers/module-nvidia304/pspec.xml @@ -19,7 +19,7 @@ nvidia-304.137-bionic-18.04.patch - kernel-module-headers + kernel-module-headers @@ -27,7 +27,7 @@ module-nvidia304 Kernel module for NVIDIA driver 304.xx releases - kernel + kernel /lib/modules @@ -67,6 +67,13 @@ + + 2019-04-06 + 304.137 + Rebuild for new kernel. + Mustafa Cinasal + muscnsl@gmail.com + 2019-01-25 304.137 diff --git a/kernel/drivers/module-nvidia340/pspec.xml b/kernel/drivers/module-nvidia340/pspec.xml index f34c1116f3..9d1b73dd0b 100644 --- a/kernel/drivers/module-nvidia340/pspec.xml +++ b/kernel/drivers/module-nvidia340/pspec.xml @@ -17,7 +17,7 @@ kernel-4.11.patch - kernel-module-headers + kernel-module-headers @@ -26,7 +26,7 @@ driver Kernel module for NVIDIA driver 340.xx releases - kernel + kernel /lib/modules @@ -97,6 +97,13 @@ + + 2019-04-06 + 340.107 + Rebuild for new kernel. + Mustafa Cinasal + muscnsl@gmail.com + 2019-01-20 340.107 diff --git a/kernel/tools/perf/files/patches/linux/patch-4.19.34.xz b/kernel/tools/perf/files/patches/linux/patch-4.19.34.xz new file mode 100644 index 0000000000000000000000000000000000000000..c56c1aafe536b2e36337879a3d00e77861ff9bc4 GIT binary patch literal 989456 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

?eFPEI6d3eUmH;Hh&Zv717F0A0$4I-|T+hf-} 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≤faK8jrSa7$l`vGEMsmp#+8xWz++P+<(jd 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�=)l?uV_*`c=J7Q3kES8W-Y=vi%AjAPf!UIFW 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̚FP^Ho*V?u?AV z3!*3u7|0eBuCFoyJ~!u@ucsxXVJ%Po-h7N-230@)M2x5mrWyMd6UXVm^(ya1GZ4lpmb55#VlLZV5K8_z)j%cN_9CRVCA=zLg?p4bK+78vZ~uNg>j( zxld(5#1}al7oI-+Q`Os?d~7c~urVZ83y*no)YJ8us=(_xv!uQGkp=ZM+%%kA)U3oe zDFT7JUbl1^i)1S<(j9sw-N;EUsR*HFx?J4}+}jcEP@g+Cs7$LH@M$z&dWi?Bv})0r zpuSF$2(R8oCKO|1h;zOJrREKg!y%lPfFf{fJvB&vR-)!prBZ|E!OJc6PzDK8rz{kcrXl(AXG+||Ze>Z1dm<008#{jSs<+r8SnRB_{^NXK^@3xW54O~2ERXO9r z2X=~z7`1{CFEwR_b^kddhzNHrVM4hFd!pZ$2<VkmJO~vi&zZz}>#Q>CWDO)CJY6OM0~fKQfHn+pcrFHM9z7MU zq>;{)Gv@*hSA!d)fRop58yFC+H5YEagfUtaZ8wS-LOd$B#Dk=QOs6y%-z6vokJA)L zFX?;g>$GDpN^wKQYEeFOu~p7Cd_U`k4tl@dkkv?*6ByBRKhIgpMP4J~*0m67%E+!Du~!G~QEqvwd5t7TzgB z7SYQG42S_??96G*Qlq4=d-m#vbBLxi-C~pm%95RD9MjSPE|4G27o^$9o9d`C6d+5x zHCM^@JvsuzSs{@ z8jxtageBih*~IJHEe-Z>Sz=2kmN0lW@!}MKa}u(F(;J@3grlwmWuU)a7zCPJ&gQ(B znfO%x^$L*l(O;)I4E*h+JedrR@YMzh=!pVH0aoUEiT`@VQyiQ@LSksHQ*jzZXYKK) zbjy!VYTJZys|O<5P_8Aq2Lf!q+Dsdk)Nu^C`bXwN|1 z?F`8OHJ=BIIq1*0)=R`*%8eu@ZDQlv@v>8~4>D^Yp{>*BWSL$gz-JREdJAX@-0uu>1Pj7Hu==y*h6kBn!>u_=MR8$zGuMhi}b_w>Z zX3^`?6&;uYXc%x)gQQv}z;ggKdb&2>U=lhi2}6kB`SCBhdo>t(bpS<4ncZk;J(i~@ zEbfGWogj*z_*+jC&`G3TfHN3qFiwydk3BtkE>awIQwqlCcAHpi65r?%emAVZTke7f zB@x(`1oKSAW~DK<2HlyF+8i}O%!mUEg?fB|)^);<>2s~6f18YPg@Gz$eV^Y{*|~ByR$@76(m1_204|R0yOP-pQ=@nJ01IFCm58kP$|dn|@Bg2tq39DH zmqIi0_$ty5v4rk zusMGa(fRy<4scv}LQL4}doAqOm?t21hC>msZBmwy`}{=#k+EDK)hI!T-Ue#E&zstQ!d}01uqMInYoP9GS21h;f69D- z(-b=c>{P#H9Uk`jZ9H0>yPIb*lV%$^NZZ6U?`);jlohB`0RCR(_n9owgM~)?P+T6y z)BiPBaRiZ=1&2;SrZYM{ZOT~9Fszb3~FmN&qc->7e}k?Jv2t{FPr8h zIjb(}v>*PTG0EvnC_VcJSW9GEYA%6g&Wn!=g&%&)w&hcN)O2F=nOM;gnmd<4e!~dn z-fvwfV8o6~=M} zfTOnLmxVMt6JY77Qv7|8Ok)PP3;vNAn5t!1L@+;S_o6bZH;N&;Psikb|Kx`gq_n?Y zcm0wG!MCCHb*dKixSWcyQp%Li`h`5!1U8AE+gYh``Oo_|;Rherc%yxRmO#Sli3>zg zoHH`tX01tp5JGKY1>~o_iy;u?q3Jsc78Y0%B2Bh@v1u#2=MZJSDo}@m^MBknMWYFI z2~bO!cz!^{abbjE^;?vzTbTP!md%7|F9Nd_i7S&NI&ym;G$$wLc9T33{;wc}Ep5ZO zY`qTm&u|)aW$p~t3gu)iq+cvnCdzg}9hs(d=BXe|KJYT}Q>jt+oA&@~EHy@J0I7VP zhNJ0$g#Iz0$)4iQaH-Tq#h~KR0G<*Dr1EL=a1UIM;v6S~JVaDucvCegCRwK6Y0v^y zOHE4is9|T(L&^5EHS(~QPRq7WRT9MK*32X{V)>l$H6x2|p9spKs-4|a1ShzRa=E8i z65XO54V>v-MK}!1*{JF=Qs-(w8R?Y#x*tIruIUVU*00q%VH) z$k0AWK2+Tg3oNqWa_5?7VWATwG!d>Wiq1l|ZsK{MHae~9ItypD2VL7vSI(ydmun!O zQjq=?x0y&{>k;N4qzGw;{Sr)wVU@k@0iZGcbLp;W#k~tCuYl?54)#W!5qQu3fv3bI~&`cI)xN)^sY~NPG3M$%1Mwau`YYYC8;FSA&$Ygor`4A4iBU7LE-r=dU=c zt@rS7A5r(iHAJkSUyETS3|Ak8e#_w132z;4;-p+Pzzk~f87DH}9Nlw|sXa=06aRX{ zZX^yIRTy~LsUqKOw>cU6uYDq;F zeqEu}ua0fQMAsUmTVZ7o?+>b&0hAHT7c;|kWd6PN=a{T1x?re=wh~e+1*!Jv=MYJy z7{d|C;Fn~1%93r#BM2AxG1Uw zw`~9c6gzHnkG0sABu<=9)>xY$oMYGI%L27?nfH~|K^QhoAMz9l-tE%pX+nrwr)t#M z8S}-iFU(V{`%K?2vJGe`mX=44-&j7V;k=0v^QJH*u^-ub8saoCAPGKItE$9zS&l5F z7>y>R{qG1dcN7e4RD#Yya{+%I73jFlpX?tSX|G^Xt!(%y#`8h;)a&#PHCd&4wJ+IN zHYgp0i`?&ga1vi!#=@$@NOsDjlyG@JlAHeEw8U@7A>_Aukw)?LR2;i@zsKvp|2iqu z9T4P>Y;x&knHy+KmM%g!T5*^p(x9D1Wlm!}*DDOza^);mW!7KV;iM*!-&<`hbJTz% z30xq9x#WKcl>c&&oQ@sIb7}B&^NyvL0K6@MeXcDkrZ`??j0)G?)P>~?eQvy`c7nBK z!Oiookzg#Mpyp!y`Zo1-4B!qZKfAF0nOaoc8$L!7d8tKDR^i;ZfO$$rBLDnN-_;=62X0A7+k=-p<+(!!qj4b6_97AJl9$O{bM{J3RiqC-!O*z~AG;xYu948ZOj|w5+kD z+wKHl5zy1dmZ{>h=mtY~GNzcTrut|JsTM3t9S)a57& zG+i3%kdH7QDy^x``&@lX(G)-Kr0%lbhwlO7Xa7sZ4On(7a3E24fM0@>+pN!4oAi$t zVNfnrQ2G}*GaJ$3xaUB@Sk1cGk$5uYthq!AMgPZFj!WoNU-|G|iprcT#H z=noEtpw9%nIb*e#!o`7-TvgnMJ~AyQRKuL&8RRpC-Rdup383h&QouLVG8h71d-}wM zO-jJb;IZu8&CC{6U0=pYZH##3t9D(fbvAIWwe)*GW0}i~e~f-otY7qROPC~$-sVG2 zvY&m&2OwmI0&k=m+%B5*_W;^L1tHkqRVm=B*>^Di=R|7E7~@Ny@109HIMJrK8T4kK zjR$f-oMEqefxo{pHfDIQtQse4$wnKH;JeypQe^$DfU;;^f5F%DME#9@Hl*$}D}AAt z_4HyD0El7*#oIw5j%1i*nhRuIT~!OYRUp;I8#eb%IEo z_~&++Kd!);ObB1GwX`w_2pGDkojW>_L_Ie71V5Ujv(tsS&(NaIUgN93MGL(;MOQnNMriw-KQ*oo}zn66M%ID^P20>-% zk3eA!2+Q?zV5Eo+9ZOCO$%}tKwrEn^(4P;FBhZ z(@UJ75c-3eh)C(!I)BD@<`9~W#RvCi{t2x+g6CC+7l>cFs%9+~b4prMAdS%q1qKZ~ zfV@Ovh7m6o7s9iUrm78s1i8SeHFGu~yE0^Gb~ot}7y%dvyNFN=_kRI(*e3LfCcul? zXT*95Ki-<>52F!dX_VYm%>=D)GbA^_%@f_3nb$>%^G@zLwY5S@2FMBLh0`}ec4Y0> zQm5x(VzSGUswLlou)DxfAj?*(Tl;!)6G`>sgNwYA|8utt(a7d0(2rTEN0&RJ#ttFR z!V@TIG}4~SBX6`L-SS9^p2 zoIb@o<99tn$Yxu zjz{V?fW^;;GaVVMQRC|ch?`rr?9HwCRsf!G*D%}tDu5;J@ z$3AHhosWt`q~NdxS+YZ3x5^WJLz{kc8tC5{i!a1_sV1Wrwea@~FY@if>V{@~4;zWD zfR5dsp~i_q__GnT+f(30kN?$mD+iZ(OGQHxjX3OrYD=ZLsa!=Y4&41!Ww6O%8-Y#6 z!t)_;q`UgAhcRQ3!3rBP*Y^Q_j2n%zF1K_8IJPrus=e9lnS3Z^kBOHK)agW(N~Td zp5!Drj1RznT_1S@LGiL^2eF1>pK1eN{0sTER$*7(@P6!$);WKX{yUTdBa?6_ z(3GnFWB_Ny=~Kyf%5;Z6U%WSOgG%_lJL-`XGq#b@O6LBlv?aY|fx@l``GNk5dB$As z0vAS8>`2TgsI~BH7zTqYdNA7~x#oV^iN1DPgYK|)K#f!8MUJv8d^wH*PlKDFJBs&A z$8jex1Dn)##itDXZA_himrpQ@WC5bcL@}!KqQ_(H;J@zJiuF{yeB*i z;WSP>*+z)Il=mUh@L`ktGw7I6AAi%QKH2OF!>@gi2uO@NWS+L%TS)>hCVxS!NENFU zD0Ey(lHj?BlUK$G5>y2_VJ?tLZ6I-Ca^PFbD5=z@y_|r24l?9F;c38F?T6uF?4LV6{gXZYR0$j z_4K2R-ZTp$b&UWr``QwxW+NynTfr7!VK58mA8`O@o{#60)$K&KnG;0)H;4VL(8`XH zoAC;&`fi{o0M&Gn|-U1 z$7uISQCN~*ZZO{Dow$6GMAMQqvicg1Rw$PH%PU zq_)M^N!UL!;$-CmcB)_3PTL_3N7ss-Tqtf#y>Ld=Q1dz<X=`~0k zREx~Y;3+~7fYatsV(X>2G>|s{ORbxF5*kPPHtE17LEw}m`!yEdb9AcZMP2^&Q=?=h z=TG=c#!&H`ZEk23{9&dED%(3J**a(T5 z*uvlTnzJx4^xmJNFg`Wy96^$@P)AuRe=eg6{M8H#8G@5NhF5SoqWjcOlYLz7k)78VWqF=1fNg6) zSn_xPl{@-gj*xxgZ#{ig^Q&geBj0_P3dibW==Zw1R z3K^&Sxwe#L-$F;%r7Gnxq(N$93b-$C|NU{yT9t78U8;VAU#=zhI({~@eIIlTyKZ9v zDEb%`P%y}QWTyjIB($xXCnf}|Q-K*Ov^nEJz~DvNv<#z;sV#7%eh#NMRS5uzXDo>_ z+})69&Ged=v29 z0y6w%PZ9Ng_F+zlFoFSG3}W*S&SqQCRU2fY5fDmH>S`CcvIdsP+=hILT@(;Yc=1M2_)8^Dy%}wG`FhO2>;8M8G!{z$EL~La%)p&5cIL9iD-?+7OpDPGY?2ea~g$K9{1Anw-Q>5m2NDkb3(D#^U^FNhR@p{G(haapQYf4 zz=fvG>G8Aa#j%n*09K~;_pEzmCB{B%m@dRl$bC7*fe`|2IBzgT0}dO0oG0sqT1w zKt7ef7xt$feE^8mO;YL&tSTgdIN7nIEJ6*Cw^%mIiu+3k1(34rLXy>)m%|D$Qv{yMwOy*_bAK=CHZIJF8?q)S{~MliUcUJ1E}(8@8Ia)5F>fHsF={^ zPVsEor80zB{0_hYR`&KC z3EvP%t30lu$G^VfX^ZC{t3ltFhtxoYy-4l$1ocuJm+BOovhp?kUp~GLLtrBVUi`RT zZ3QZKpL@!7>WDgbZY2W7zb?-V(F=`AnS*_%5_6nFS~z%KiJNv@+o4;d@g+&3@FHb8 zR-_kQ={y~Ecz+`WMF>VBHV(sylD|8-Rg(JI*zxx-uG9B30K=MDV1Uu#3;3X~3u*P% zzix+A|Z?Mx=xC(Bqt-ppbfwZ$o zj5MC5q%^-ZAGcD{r3y8@@%rB^7n#n0B5tWyOD2d!b~ zS7nrH`OC6toO5!nUP_@ zBVt3Nvpo9pgno6hN><=9XZ05f1BAwksL+Vj{&>WrJ0=BV!xu^J=z{6Py~4Nmz&0w< zA++#8>1mX!1XY_wHsk&LkX>%e#W87RJo%RTt$BBhTDN&W>oG^?;Oy+g^VodWdLCOIg0;cWH0}*68R^3LVQ-yn-b7Bz>YXyKos=+nw zWZhi60d)cdwWv>S^iuGpGm^LBxRCg{2P?x(=pq=!MLy#0MGFqHTK+oX?;wR7$0IOqLRFUsui8_?V)O z035E<5$w+E#VeG~pc-5R%vVFC%c18e2P+gl6AHkA!~0=Zyk23UbxqWhL^qu1h;|Rm z86W%hSPtmJX~QL zC=~x1u&IYmo$9q4kux4Ng!HgbutL!|% zZ?OVWW;9qS(2Xt&P4AbPdM3y3>{R>$g>_?Lb@@VoWgzoq5n<(5s*}~U08F*`-KJQX z7aJLjk{b^%<_k%k8GoOrd<4S1LTbLhMXML}573_6!;KjBJB!&NRgYXF^Yh9C&O0R6 zuU}$)2W{C6_uEp{j1S@DT-FcD$J7PcbC|~^IS@)XJ2QtkNG0$G0j*;ra8I?9jbQ@{ zX?Bt$q!1x{8%Xa<-AUH!2B#t}Qe5^0XYN21S+Cdeo1)%}xrWLemg7B8f7H!mmzN`a zXZbz7oNUDSFQ68$Nz&3 zetZCNr6q4#WqC9|#0VHR=>Hdpe6`)S$t8asQSPXjzxe8`+_+%bbRM7yJI*`Y zM6Y6lw0rJ4ars^A4j2{CPpbJ|N2I_FkZzLa8%Vgk_L|p|Mzk_yD?~`&=3q~zM@@lR z%E~U4@SO@aqd+Uv)_xx7PlaPyN@?I##xX zlS)Cns^uc41R&@+OS+FXHa=%`Bu#P&857M(%?3PAK z#Aann>2!t`4gXyir{BewJLP}0pjD3g&)RtZo;-BCZqO0=SFs1qbOa;& z%azPburuD99rj<(EpNJ$=i6$4s;WSQBB$7UfvCIa^`k;y<+?a*kBKCd$8gK76WKkC zNMJj`Jp;uNcO7?6pXm2v<-q8qn0IDAS>dO~rl%!yKIEhuQ;G#kIBrlkY<;fqxL1KNod`Uaa1dn4AIIaX{7FC0Ed<8A`lY0xa zh4Bc=a^l!6Z((7>_rO=SLja0ZR$my~22C5cDqfQ=pFxzH+~lIC??LL^)b9tCfe~hu zYzS6<7@%2;Huwi+W)5AeBt*vGG-RKgi>F zY1m_PU!RI%opN3~og|xM#gs6QpK;Z->_+j*FE*kV#4_7R9(f||MhT72r{!C*dmI>H z6z7w&5fn+pdG+<5+iW_rbXzF6cK*wN31#K^Jy-m)5T#%pJVvk_0x)$$b)Ph{GHTOR z1b|0Rv+r9&{lOtZL~gB@bi%lY#ZKx7X`%Yvi%8fxsy<%{QhSOe-`LHqogaw)oZBxc9)d%%E0hEecko)gjR2PA zHuhI`^^>W1cK=q+4D-NMzfrHHITy!Y_&dyTdC?7mgE|Cizhujv-+zFCB{rv zj0C1IA>_M+FaHz+Oi51GesK6BA?|vj33iQ2)Sl4>r8qCFzk0wl68E-qD54INpu*v* z2nnJN*X!59DEu(7S#$n`ktL=mxWfNyoZbPI!)U5>NlGcOdtKF_=-__Rx+oe#W(NjUtL<+kZQ|9n*T7m}-$!#&s2yyG1K_%%HdYXuZR%y`<4jVpGOKfd`&6p?l!K3T}OFNuu<$`P}UAP%(k=?C2G;VRuX;q zH^Jy}kCMw!wvOr>vv`YEYf%+qUkC3Ds{3^a-85l>`2M>>Dqs%GGqgb?xWQPZLo6Syei}(hpokq)T-W)3>o2+8E&_? z%Ezjxu`xkYbacBL^Eq65y@U0|!ccV|*Rjv!J0Eu9Z(9lx4^d*;a70mM$_O?p`{;hl z3GUf5Ku!gu_Ovfcc43vx;A?m1hp85<5AlivFY=$ienj|~d4#)7C@>G_bmdPAiQXOa z=UB;`;D`9uVGghn6j~edv1c*NkIAjx{-A0MXjAZ(Mo(FXwhtE<#=UO zTmY7HcuECKVU!UoKD#aEnn-XqE_mJh=QGkJbgyOmBA!~dOg4Uh%RY&D)D@_B%e>m53957t zBph?hvz8i6bW}B(Ag3tk1_drle??K<0a`f24$C1{r@f44_ikue-5Vy(R7r@_FkUHx zsPwzb#11Ok1)H~tj&)Vwnzw671eQ**sMoOE+hPN1U2G+6uc~BsntgtIB(rT`(gV%p z=+)nlNgtJ1WwvZLy5{-iaZDAtg}JZNF&1!K_yOsTpkZ zO-x8zi>j|Tkd*PeK1M#mP|A`8NC0pGpb0ezkN#>ITP_9DifhyT#B?+VQ-f>2zG=mh z#I8;fx!nFg0Q`jR*D~|P)rW(J!-{?Q;qfM0ss!w+U0C@di{T_@P6`p<;*!ygIt7^x zirgA#0rr3VKJ`4+n2u02G4MtQPn8^)>b+A+Ac{Sk7d`CzSa!*s)*An$n1hs=GE z8@RqCE?P`LSASR*#BnGGdgSp+C72B-X&aI{oKl)cEs;3s&S746rJ78%aav2EfFF6~ z3TWblRw^)D3!iOU4JaP+jYUWls2X|Uy83_Ys*2%BqLQYVNKjL31j4+N1x@QSlNcQ& z8>ke&4HMo7<=iu?e+#(|y7%*J5UR{%%|e3%@m_C|x0hNWGRhA0tTH;N&JN+XwUjuG zTc*U4t;&)o4`3$f&60i{lpeE0#4VNh91_7uQmggQi+p{A`*`0tt6ij8k|Q9 zWE5vxqq0Su1GmjLDepugw} z!5UH;U`>&)LCq@SvkAEjz@o;(G=3-()l~%%va66LMnib(ln_BA_~h?<)z9xu4tLCd z>HY>rxs=NiniYx`?vGg|n_o>&Xd+;33`&mFl%j^4GG1FOLX=u)_|PhX@nGA9Ffbp-0l#C;iZHm6KrhZ`!&m}XEvb>qD$vm;gSUr)i*k$dzO2bNl(8wg z6CESptJ_vm>0dMj5&U@n3TPEnhY3quddh|)_iZeU`XTMe z8~$?6SOFPf|D0kJkbm5hmnqx6*4D@=e3g_XmOhQTu{q<$(?y#tSm@##K4D(iSn0nI z={fMrbRuH4*@vh_<+iXR-U%u5G&YlIec-qVc4?FV74A2OL(oUMT$FoVswE~CnCN^= zmxc6AQZ+cpl3IcL#IPwFEe%;o{~EQ0Q-w%!W~kDXU9TpBcLjljdghNd?N{z+^UfmsXB- zmMsGmEKN}_`wL!linxP=3{PEFZ++U-)^{uq(mTleKhZxm6>S3k8knCDlfF@ZZT8_W zAgsLo{^^g>etn47p-^(y=FqyNo5%QS3sWJ6>=@yd{FW(|pu(MtH`2(Cnjo{9A5VyZ zvXT8&k8RKb$Y^)3jAaUf7(!^3>N*u1=Gi_WqOG?>o3y=l**%Cs(q}y~+1gl#=@)K7 z)h_MTF>_R45B+MumPfl;LS<#RfnsP?eN9&+rGy!9G5giX@kQV|SkxIccP3rM0lb3v zf3+29k5@~JC{U^;bQSagoeo2Nk$Ov8p&i~cyquBJ=v7ipq1YMuWaP<>I>^i(N*RxL zzCS}Zq+N0j^IUk_4Qd{25~carCdryPGVfdQCc<9mnY8XJWd)>-jdWLpDFqV8Gw?6^ z|B`UA$q^htF&t2xdk0n0erHWFCiQalEKi~}s?1%j()6j3qrR`x6Yx15RQE|zQnP+} zaUBsznvrSUO_L&|?dA@&JK2!l(?tqpr4KkOYiJ@D;bmreCBDYY9nWc_Kv4 zxMfNAP*hPXsk4G)2CZDUKE{^ihz@)d;wlqJ_wxv+r#SD|t+p3`YV32>PyKbYJ|qk3 z**-pCs4+V2;W#)`%8Lmh05E-WSYGuS&pC#$Y^it?uZ_epx*ZVkUoKUnf*k;Vfsb-^ z%%1|WfCMP2F4Ple3S&h@^3})h=$yBAx>lOD!3_D^e!MK|n^&%AVU!2Fx^%;I;ic=q ze8Ye`FZ71z-7rre(<25ua)r$>6EG7AC>Bb)T^t!6{U!u^pmtISn;j9hjq-FGALO#5 zY1JXpC3i=G+@sowRVIe&Bpomg6#JAzYH^$bT|GOwi()UqRb=7_%?l`#J0Gno9=AzJ z6a_yQ?-5{ga?@R`kVK38Cbl9m@ty6#uuL;5(v|g%0b=DMCZ`B};zh`8uCdCP>aM~g zl3+(*v1bRi%o36Jw`^+-&8-(w(=+%J|EZeg6@8K+h>umtvN=)D`a^Js3Ej&fRhV1$ zMYZZlLL7?+X}mCf7Fi6V&jOg(7b|IM#-St1ivxy--iKRqy#Gt!oHWQJzJ27;rq?Q) z-_82GUaq6zS2OPme2mL3i%kT~;HzemXXXPXC1*dqv9FWwEbby)aevn=a0L4qF#C=D zJM?NkSxiEmEK*U)5XqZq(jA#X^0#Pkp_3Gyq`=y-?%pCuwNgVtk)Y$NVK}%d=j%fq zQU97y{vNb1T1c}6X`wOG`DY`2u$w9+BTgzu{WtHY+RY``Y^Sj=kE3JXKE>z+Pik|9 z&E91NCzefBLU3_-AqfDb{is^vL2QwDMHT@_Nrc4gTuZ}P@1G|5f&dHFQGQ2l9*s0l>{3~+tg!j@BbfbmX{ zDIcx$!6`McQ%OLPERgNRq*zQHEd{@+Plp1&zoOSzlLVyHKtt<_An{RP1%U#S&7n&$ zqWOkqg)tK8_U9nCjeWe=TUL;zk`O6KI>6y70u4f{aShN8g)U>_A^mf+pzvi|H?LG9 z#)c`6Vw3u|JB9|1|DM(&ie{c|0N{1BtRF#2W2ya~&4;s8fm~p)*q~zM_ya~8q7%WJ zfs&RWP5ke+=Ll+U(M4`n8+Z0L=y{YRvb|j$<9-^VWbuaSk)ym_Bn61spBfn*T^zC| zjJ)H^(CWR1v*<`0wH)^wAVZh!x(15U?c8{B_QmG9SCsk8^uN{WuK?cH)jW zWJ0xaH97g#^zeyiSeU(qN=x&&`mt0l$Ek)bn%9`-u^UaG?eSF6@a>HJU44UkwV<&AtD`HO z4|t&12`Cfi3~&I^noJlSdhTZQ{t#&s(6 zJR)Wl{M>lqM^l1E;&Pq+^sL)_&%Z-Fj zR05^JyL=jnDp@QnE9rW55F0L+7#)PM(c}?~`N0jziW1NAz8BkZRZ>RE+5ThJY(Yde6&0(*Kl8t-IxtT$mYfFLFFD5$jFmDg6 zFB{K|3T`h88>vF3A=@gJqTt>tTw7?Xt+K+Mi-@DdiC?TF40z{lrzh5awhoNFn2N0> zNUUrDV=;~Gn|{Ms1mo0zLy}d7)KP^FGh*}3gA*RqyP%LEladIH(^}d^<(5blQb9t& zr=GFu?9e*?97aQl#ccMp$-=0g4*D18rkQdty4Mu#c`HZEte(Z#Jf;563mAIcY?CX@ zHac$zEO&&W?HaYJjKsLcgbo%F-b!B5QqD^ zJ>lvP!A~pACmzo%Mznm{^;!5vB~>Tz&Vi#Z27z z9Nmx>Q*ARh#)(+{xIbkSa-Jva{lI_QyP_ZHzxmkr>&*cS@p>)_xxL{h!_;X-S7W`e zYgc@y=x5Yr-DH}+Auu)GhjK(1QHJvh-oGypgfOwN*l1W5idhJ{m8Q?(Jm~Umo<{REZ5l#*q5GG$b{5F+i07QQWcYL|DXYeClzT#d*(qbIt!~C5y?~JvqhFKni zLPXsNyC;*ydTYA?<3&v;Z_q5>$Ajho5-9UFt+wa3z0*gf{AoDy%UE0B8dru+xb9yH zZ7eG#teoJJ8lk071oXe4;%>R&s<+$SblFPn_Nig%2k$6?o&~Z1oIH*^!|CIRy>Q(# z9H#8U$raH_rkRp2cUB+6Giux>pA{WO;WG9h+^S#y<^5e6lBUm(c2-oL@gS2+d7gSM z@k)dN?;?rf;OLLC3xnNrM$G)YLT9>;DnZ*l`LGG`RB|yc!`@3qR8ZvfJ%oy!4xE*; zXv@p3i?u+4klPfbWoi-p71AVp$G6_7&a6bXtLe#fuB5ISxp8??7rwZj&nVddR;2Bh zR)88?bW{5yt=aG3K<^sRz+RYFvSSY$qKz1SWu?SU*UrQ~(brZ+CE*)UCnw(=Ar-Nm zBv#CnZ@qZ+cB%a`eu&dZ9>4>OdnI+kUHKK=2X&Eg-mA@_i!k)KD_x}8Yjuq?G|_bi zr{pUk-){CW4cHVcM&OvxtM1U)DR`GkUTiLcwo86%ij0$E5r4Z|qap%mnibxI?V3}0 z82!8*cPwp6D{(s?Lz{@BvztyFNtycnNgu@5)uMEdSqX(khO@dsfb>xzqAyY@TLPbgTi1AP7a`z#%CJ-8aNy-p%>C6`07EU>pzsGUTTT1dUEcxOO6) zHWa}}?Xh-0c1#l=0GG_9mSj5~hIi$b%qcIfT+IoT{0* z#`=@OXL=&R!|L+0T(nZOH5^*Ow3`GF3`*$X+{StZ!OzRtrGUKE4d<<#Jt}R!diB5r znRnuU-L^CAL#kqP{B4x5wa}B+2fIRNay~`Wk^D7x9Kz~A!HoCcH28Byx|53W`zNORX_R2;tsKmK|*nq!2|1rBkF~c;D_FK$%Jg@te(K^JP_XMLxfd2;$agf{%L4aZJV-Q%=ge=H%_kx(e zE&u#M8u?qU5;~5ddPwU#LG_k>Yu5V9xtjf?7S7%`<+kcPL{BpfPUC^5-=Z)prZi24 zd2zW8)adgY`>tN4#143RIrkceKho~aT8Mu?F~YBfjRx$lvMmEO2vxEvYn zV( z_A^6nL|C(x>Dr59mLMbcPlr~=j~&9cdv}>WbTjummf_{vh&_2wo17R2KzJWtLA4@@SoT(A;#XnI`kuf@+a96 zOMZuTl1hgS6?4qrs|s{+_R<|`TT_E5f3@f822Km8LRk9Gn62bCtB6~e@MjeEcJn^L z`@2U3NK^LC(fujU;>7b$N}H_1ye0uO?Z~?&qT+7O(-1KsvQtw7tCchO2qni>izU&A z$T5IX6!M$X(!z`oz+Lz+ZzqNeonlCF|K`rr;P`f9uf&>KK6OA&9`qqWjTRC@5Y;QNNDT90)(4-ETm&cOcn*0wq+YL}P za-0F;VT3_0qCn=gD95obr^YzQtd+cJ20uF%0UCl?9)Cfr6za7?VZP3AYQ1&LFrE1+ z6Za7aRf3UsA;_F#fG^q1{_J@OzX%gW&5ZoIHf|dg%v_{w2a^#m$Ol9_jl>=jJ00iq zO3YpAI)LDbCHrz$#xVv=daW5xBSV{)@*lO;Li?+U&9FPOcT~ohJ#K0TP)TKe6C(lG zgxhA$;%PLxigEt)Q-6Ha)fXqar$tN2iM<3{(>$YktzWoMF7Jt<|Jik)oJIe09#sA5 zN;1Z`@+dTiqLrZQ%_pGm*ncDK8b1LGtaW;1iIB;5BOb`fa@0SdR1GzdwHq_+V=Y7J zSlqLJ8N1+!xN>;sWEh&Ob>?GYKDa%287}r0j-$)1kQ{wSOjbB_l%5(9(_M(hmEtOO z*bIE}qL;KtK-}N?vC}cI5Av}&HWt?(Zgs$-)BNCRMI|u=sEN7NUy_}tC0kcg3}MB; zr`bWtM!X#@bDpqh=2NUwfTUIo5SlY)OC9ul^#!w3w$!CYgZMvs2f%6D`fS;3rUV07 zT$~o&{h%*Nke;AMLQL#7`Sm^lRv+5IGI=%I<;T;V5FzQMkJcF;AUTa};|!SYA89Gi z23m`BC~68&Xm-oVy-PPxhzx)G`#K8wa}Lu6%*M>sItU8zE#Bb}NkioV57@DNp7{J~ z!c4c50~yz3V02`JNOliMQ0Gwto=DQ^4Bodmat9||581ryY>(TDdH@fO5&pudZltVS zSUjlZOPp<0Z>}mz`(-1Cq1KU|5<_2^;{c-IPJ7{K7jMfvB?Mn$W^J|T_0d(I^M8@( zJsWXtdt1NBnuZ~d>xYjOtEK&J@->PHEi5m=$y&cF5bU2jfxN;+$x?CgPvc3XMV@cv zxh}25B#EN+v%yqn&B`lfFVR$JP0?};G*$R9vNDkKPt{c$Ked#%0@+K;i*BQvsxCN= zO97j+K~&_l&-}$SJ%lo2ipl>mkHvz|VqZD-*9DFhXZLM}yt97)A~Rgn=In}QAhi5j z9dR8;?n$&};meRG20^_~DVYgJfe$__Q6{QLH&78WU6c$0GdK7VvUI#8o}&R@EGZGd z{+&zc6yywT{L^eO=&}qpzLtZ8(CFHErP_3m;JmNmJ3z5k&rPT&l}xnRHQAEp2{z49 zq*29#P1sM7oUp(kCJ^{53I3!VCdJFbMCfwL`Y&6G*!Xo3n^aQEYU@(A!p6^dn|{0L z7fx4QcT?*Hv_<$29-m8;0=cP7-Am8?4Mj4?ktSJKN|*~h(ht04l8vtE>eWmkNTGU( zM7jMFnoaqnA1dxk)r)n6h?%BaFjT{M8@P|4)xdCrBgBxUbTuPl0A1tqKYCoH9w}CL zUY$*#5mBFox}A)3zV@4NO*p^B*@Ox6VszbjH8jIqMZW{^)Af5~GNPdwjo^oD$QBD* z26QFy1LSYU^eI7~Et0+m&F>R=$x|k1^00%dbG@ z>8SsDnzhoIs=+tRB=2^=PGgzi@1@6S{m_|VP|^JJvceRxUJ=3AiU|{o>p7XEcGb1~ zg@xf{?WJAGC*uHh<}-MZ;$8ni;VPtN+)x=xt={wmWCKBH`3!?YK?w=^V3$O#Y~muE zt92JV8MlD?N!7A5Z#okqy5rHQk|5gQoULWamKmh>2K;0boB@}dU3h$EX&dEx$dqL= z^T^b;OVu`*$VuPtg!3s7r&2s&>5(!U5bc35W1kFUU!2?A{CFrQyzJHuo=R$*8^ut^ zLk58ixIU&d{5NiAA)uAR-K?-Xi6FIXAbLdsSF2PT@0p;v6Q|x6U)28pk~mn=<*TsW zk-1)`UMQD;<4Aq=F;oi|tr>*A&{WsvIY4$l@o61J_WpC{>&}WRIo=|H6_M^O{_;Lm zK$W#(aW*6dnWvRZKJabyJd-2vwgw}|-;x+y+;2Me`H#hGpg_%?141_v{&eWoBblbh zy8Z-TvXiol6|k&ghPbstO3U!Fm{KdaGM*EjS+*g6by`FM$s@6q-BOQ_gR@Si%N_(_ znWjJNz$SC}7YV>D#EJh_#!)Ro^mE&PISdrzjN4k!eq%g&0BB(#M|ci^7Opz@Mp)yX z`6LjxbXbma8Cwv?Cy3dcMCQ7SUO#fRr%asP)9lS-=-=%-X$jZpIon8+_bqiPQ#OXh z{xbC&ziQDtIj1bN0T~E^8Hn z*O@d`23${5;ZPqJi}>&*>l;a?b8guk2kFbJhVV3T-&_5QK)}vCjZ+Yh4=rOGw9vEd>TcxRltxYZ0BnD1gg(PJk7}yL>@<~H?CUG9ijIaokuqv zsciOg$HbdWpj{c9ZH;)j)up_vG*2qC@{HdqZEM%ClSCF&*(`4XWhL`bu^(%qbrPoY z6kY{s4uEZdT_mI&d3@M~V=PDgB#;7u6##hACgU}B!-gMjTCu)f)&YmRT%^9pqyAj!<%Ha74Jk& zXm2bs0MS(NwWCJ%zWN1YiYmhLjv!)Vjce{e^b)u>A~rnFAoYN>`0loA=PT-S%_U zTY;BNG0F5gH=V|^t9;Uz7trE(0sx+YvOvW^Z;bUD?qz`@MmWJ*G_g<48e?QTbe?aN zvU*fGwgubbLp#!1$|Xlean2iyxU0!OP!Zg0T;+wK4FRiYPB34#)zDHu6>xgw@}-z) z&R;{eBp-o>UH)KGUMoNr|MY$`9tHeg;0DazZy6>OkbohUJpRm4hwl%25Z{wn%!|+= z=M+QUJrx;xq0DD;xhXeoZSikwrlj(krn|?{=A{pvK>3IIWp8K7F?hB84t>rl^i&Q- z#h^dAxsZbpo9LRy0XeC8)37{<|MH7~)61U(GrGsDs1rv)UBOCWeyoa>j~d-(#@?|w z^UZhrQQ((U$;hvUa1GlI9XxgQzsQ{6Xr8rgwg=-#5$VKKQPK=e+nI-y%GokS^+K$k!)%$=?+N+i33Fd+f=rzkE-bMbx~UfZZ{&CL z|8nACdDZUyb}k^7i%e`+d`D_-8Wd_W0NkJe7$h2KR4ZQnQp79+wEgS$E7uhJH~?2u z7k;MP&~A468DE3~y1fSC%8u@2g0bF#{`ss$5dn?ih-Md(9e?Nnj9OWl4bN2dED{BP zu-<>mB11Xn zwFrLm^H1|LxRB3XiF|uVAd8WdTH7dv%^( zrOsH8S5^?C9I;ULBW#g#jpG+hdN5z0gXEr7k3k}g#sP(T##J((K2P6VEX3DXr6J^2 zMdH8Gb4VBjebm*p(up=v3+zP4gU2?b`sk_IX-SlD%{oYj&lmdr;3xoXa?JWU>DP zOeLSbQH}Ng@t4$-LC=rDdWaPOlv|HPt)ZI@5Xf1Qgs-&X?RRf^x`k(eTlUy-hedm~ zUX*u6xt&?) zmCr!3d*{;)4jetKRQ;_ZZEun~r*gz(t!205iplw>N_5?{Y@F2s7cy1IyuNJ6p6&I^ zs!g;lE&9BICv${rF@TI0Lcs|i!APuYqs65D`(qd+eX z(2Tb%vZD!>VOpvQT~9O>uUPrzWM==eo7=|RvZoO}yt3>UCp6W0I3KLG`)_ht6&C1ahU!(X)rPHBnWHxittcU>%AfFG)vk}Xb+G|QzG80cygJE zgyfv)I!^EWO&X$O%8&?I#H4nJ_e;W^VK#>OnbR#vA(m*78t3#ov5W1x+h*(X-Lc$k zKj70GzvpvtDK4@4@&0_jA$e$~etcMU_FW#07dydQR%B!vdRXnbE5fKfzrCv8##1gUI|%*vK2`ztG!evJDH3c2(`UYHQl+pb$Gj z0ODa2E9mq#mcNT2fvUNC_Je=1&>;#cCq8GyoRj7-pC=oCS^}uD+oOH({Iny+1+Uwl zC_RYJZu==tqbm1_ym&L-jFTh|3mpdcHhobwi({4s&{bXZ;gssJkc|RTCGbI zsj~L7!HloGCKv$*J%=K`VDkzA@pyy3Dnnm$?B{Hu0fiw5rDbAA&Y}u4s=ls=*+mFe zEm~E461k8UbVp&;&989D$$hN4T12}zL#K#x`1P%yB~o+>mlicwi-U(~T^Zh7crJ3d zSs4}!Zb^&>nt#joD$f^YMKnjDKFlyrX~*j0F0jVe|J=CsPJ>J?(**<-ql1(QnrDdo z3A4uGzM;Ae!Q?%)6~vHXdXI@=(JR@CLKT-~tOYQD9v{w0UyPgZLhKy3M$S-=UWi0Q z)2y%8m;4GAO6I>toKw|2I#M`(lJzW+!%g40cK^jc3#yfF{}XzdKt3i%n(D6;hPbNl zD6OBm6qGuiBi92<9Y-G42|`S;hSw@pYWdT5J6MJAlxI&NA}T7voxf1gE{|Pb^+E16 zwAG*MdQUCBbasTPXOICcs`M_5G%}@65;-!StmI4oMn9)o;qkYXm&3lUVpMf-v|&Pg z(;;Rv{b;+Jv#?_v1?GrqrUa)=x$S>w#P4b=)JFEd&Y3`($D>+R&|WhBBFI=PcatBm zElY?1HQ8$XD$|~<6cbL7#Hh)8Kgylrfgp|C; zwtR8VKL1QJb^ydJ?avsr%ZPw)VN)ZBUVg7 zLy6&&RXoC{2?xUTd}mdwV_Wqd9maVoJIq{?^$hZoi{k#Dq0?FaB4cgC8*`u9dX0%S zL$if1MWu%I9HhI-fq#K>8aB9CFQD!t+lYx0)P7uWa0CwyRjusS$` zChsJLquO4)r_Dfwvwoo{=+G$H?L9BLHXuo1>O2W9_6Gr=s|1XFwTRVZW!D9Y@dBo(rc3_I`uY!y z-#VK1Vl>ceVLfPN5kJ_mM~eae84donplj*+^M|n)maFb8`v0~r{)rjMp48w|Q2ad@ zt42$F;H)^Y>>zyX% z@}DL7U>~}Xaiv=xU3{yFV`B37`_w_k80DBUn{x%ria=lz0Rf)$2lA&4a~8PRvs6%erF!=cf5aQDMNJJM$r z>!S-KuoBx=+j2#!eSH7Jzjc8jIJ&3TYe8D^&V?#`!!9`EP`SoG7CKt-u>NR62~10T zjXP}kP`pH({HiZy5FZVL=?c9(FWZnr)Bs2mxA<&Bn%i^ah?67JWGILEJ$So8t zbz*(8f~bWYtr^XWQ*$}XnH5rMiy~BR)&Bys2d-6nGGEjnaR08pK!dU7Pg{`f^h{(G zHc-&I3crK*2sqjc^y2OMPwtd_-!JegFc7@Y0)5G3P^G`ay3dI8hWKx#sXQAxSj}O) zLo9Tr<8A6f#7We0Qeso&@$Z9amCm#W1dhRPh&$6j0$`r1X+235`Mt%{@J(Q#j2+3- zKx~1SW~pk^W zkzu2Eez@fm?`V3!6f*+yCP16)?abb@U2&LPI{-S3&3ul=Y_1MS-Aoa;9JtB`Q6`f$ zTfzgZO4+zG&eY=`g*CTQj~UG!@L-F+#WL(l%%md6J(V4@eQ8-=*eJWQu}0|w0@j#C z2x{s^KhEj6r7uzXQMK1KkQ5BnW*@h=*E-P;bGq<}VCtaU#0aoF4xKa}OCBhvHSFG} zeSY$o8N_AckjxIKsCDUG#O8;=IB9QqyKO+_YxAUsSElG)A1Ml4#g$?cyj7n#)&{0_ z*tirm&w1CmGMmVj?}7dS3dQ4pCzP zOPSP+mmZy3HOO_~HW>qgCkUPT3?w{E@NjO4n0ku@>Lx>l0Bf;gj1Js>&N%qbq0+rD z%`fXb^+r{M*eySmpCo-q3l!@?<;TqSmr<_p7cse2;x0h!)ttM4CvbF}Hpyg)oBa|YpS3-KDCgASn zmw;mYCaLfug^fsKrZ89vIJLK2Fn0jNK2-$JpCMw@D2Z`YNWcZNo%SF$dHB0@V&kj|;{#hC z`=Mdqa*)y(Bn&=y$#Ay*7G1a`vAa5q9$@(6|Ix0Wq$(~xZl+^Dw5JK-8h_stKo4>B zWhgDYBcU$L2W%2m<^i|ckZ!22XLZ}}`f&BYP8*?VPAYd5ZynV~!Q~WYZuifrF^UA} zx573Pg~Oyo5sMs`?v2>QXGMXrxK=%v#Xf;ww8CYWXvxWN`Hxu9#xj-ei&Wm8FEK;d z8pPwDZ#L@EHN`Eq0-^*iWopx*SzGFB!iKP<$`@SYmBENnirFdcGZA})<@t`){qTjB zZHR_K1VzBV=zH;v5S1EQz^?V{!^2E)oJ*sr;bf#4vf^h%H`lf;t47_zdwIn}`csmH zbvPaB5-VQlN~g$JG+)xc^B~!0)No$O)rrcpq1SPFMdg+l%56+m|8T3D?7WVnR`Y1p z4S*f8?T+Hatu0o$$2~#)}51A|@iyxzfh0Ybi3K(Q_D)W) z*2B#UsFFI9F0=cDo5sSKN^>F5$pyjYXym}&tX^Th8uA{i{j~|L1v9>1EbxSEDq9X+ z{*!oSF6J0`vakL_ZDoDt*$$4qrSEUjLM?o&oAvv4 z<=WL4qCe27I6+%8&KD>7>dk>EDwp`CBbj~c#yV-u%rO!^TIEVUDWj$ofxN7WF3j1V zrUu@=KIDg$m7uVUHx(MEMen>d3530c?HO+aKdpdgH zn^;;^b92jO%j9uBF-SMBHk4vLaV6i@vsu?02x3DJtH)7EltS!m*8aa?HBB6?c^y*e z;OWoa47mJ-zW#mO9FD<`;L26y_edhXwA$|ypV1?bhTgEJ6(Zby`iTVW6i+d}hD^l+ zazQ_0cH`0)b8JI92{B#K)Ua#28>z89o9O#d4504b%tR%)iSvfX;Yf25uTq4fjZG=T z#^r`Ko~~d6lN{*3{@KNi+(hp;_ zf9Wtw-y4Z%bQgHou-*H7lG}ky>AZH~XHH5A1KU8U%2+ogG+IlSYw%32J3C4@5$SGS zH_Fr?2R1^5Ox$147sgsXnilKKvmcQ=|7;emcjj2)=>0PnYbDQi!_y4(QjoNAU5ABMa=YMYd!?4vQ=)#{;p#AKvd zN!TQff<=0jncm_ZK0dlC5G&gAl^#y%-Yb=&0^Gspp+z zziFzsD#{?dI8W^xP{EMz5Y)!H8*~aFhimPe^znH#N5S%@1{WPKXu1&sHBqT*B<=+8 z=u3dzeFq#H(w)8JNhvU5#l)dvY5d)KgX9tLvxDXQRkCzNP?&$BNNfB%R=MJ7Iqs|VTT{qe8h4)z`ZPJx4Kz8 z&gqxFCmQqY*{m|v#cCC%NYGQWn3-k}i`KWMD0$CPNcI1^o6bR&ghca|Mk2PR%UO+L z&05r@E_bW;$00hF{UpJ@i*jqMCs~Fq_aWsBpV#EXO#O-lS0>VeuF<0tj9=+RDbG6| z_gVBKQj6*cVqWy;2#Kv(gjD|{{sWQfdfDK%OlXK8p8!)ptiK4}NMo?}9ECj9L3yT9D_LBw>Yoel z!qpqYbn~G(UY*@%EP3Z;lTfJe@sf3%>ZX=Jag(qfpKCDQ)J< z(KadIC6mhPG78cg%pmE5eWqcG#?RD}Qe11R zQ%i~k%`yg1?39nk;%+pBcq)s;Lu+tog0ZFW$2Wl_!acQTlt=|7v z=hgf-<+{)T|MdHD9UQd=TrJsItkn){W?-;p*I0}uzZOtgIDoo<@#d)!J|Jmllq1b@ z-Sm(nv)-0Pyhw+j2U~F%u2`Y%8thEbUYO2oZN3^S=y219wF~hC476G=VFp^opeQp& zYDUvEupU9?4gnF4Fr)M*;y*_QHVchMs0&mYT_iCD|K(P{>?Dgw_QNw2NipZ$qcAo* zuM`Ei%J=rv@Em9H$^{tq)+Z&hjlk1;Bm-a{KKRJc&v(CNfYxKB+W>b-ry6l@v|9LY zSF}s1nMe@l?3tV2@i$nUt20n0q$+0vj+!H8k^#zy6)hHtWYgo z1H0Zelv@DRL3p*{@#pbNb?rY(NR27``}^UULs#ndod5geY6wu8OcZ$bh$Rb>0M;NK z)?j}wVhy3mrp+CXYJC_liWgeHl8M!pfu=IWkK4HiT@fZNE!_l_eC@>9om%ytv}2bC zo`5N%xnQcy`F}XWKqwlyDek zImYxg71=rmUpA8(P)mG1rJ&_zW&6{rLX+$fl!fnG5Pet?5ABSC9mW3yX{7`ni8f-g zm?m-6?q4QRYp+N0so2bwh!WDm?2V$yBcxpMdLsOjAjpiBT=)vY=dFLLV&gVkGa0|0 zZds*;U(azKx)&*X5rV?#&LU3rW&@WlCwuP2DzFyk3s|m6w74jNW0b*q;eMtcGLm1D z$Z^f14bPI~P{Z<&KKhgpn$xafyRO>24a__4>lgH6z39FkbHAZ8Ko#GBFpJ^otyTlDR%JFCj%!&4gJl`US9ZY`;&)ZF@6hE@q?c zjH0oJBKa4%iY8d0lI!NEKyDTA>?E1sc1|tD-9O;j(>K>i=-lkvS$r$+^nY6joMn&K z87od1cz;K0jwbhL4${fClKNS-3i4ih?Kh;T_kLHHg$CNIu%`RVT?VZq48l18oHjCe zEF8Of8Z@H!@!A73h4Oo~Yl&HY-JQ~Eh>(iZ)>h&bR0@H1zQrvBiBTR07GziRwU4~C zIWsTYLa|eMO3iQe{%FL`(8KJylcVhRv7DF^8DpaM^i_$DFpF&%!i$k4P~_`con7tX z3yJlMJ;S^7V&Gt=`yXM>!3s~d9S)-L=f4Gi&B{6jk8FMr$!NguRkDOb_~6g%eTAjZ zlwky2*HQBZ$P8)u#){=ml8NZ6$Z^wIZnLQ)aNphrl^D>c3AhdMedBwa*B~`iN-sj8 z4{o((_Whf87;}dd#I+4blUItrhhdY3WB8g^EB;KKS*0>}nCk!fqHq;32hvYGN?hg6 zq5l#aV3`>vjVDNHUDCS)K&CM&tZ7FO6+S@RTxL5+3wzx8lmBD^>>RgEl^j7coAX(s zQ&K^XLuu5+j&E!?Hs?`f|E|V^k0B!8OKq-mlwuWoa=hkNrvUCZ!)M^lxrA{9zl1(i@Ow*7Q-{M_t zH!gF{#f1-tZCkXrhEx*Pq~GJ|%5H0IRq*xlj=9euXD3MeDJ*wJ&-%*Rz-929bR~3| zIH}wTW20TGm{~iol!8W_(0S@o>Kmj5$|N!IU5ssGcEI%rI$4YNQZ)9KVKzfy=0gif z+6JwKza_CWc41u)2`RVt5(p!Zq}W7sf(mDJ#)p_5_01A|>^FUOV5fWc~C10h%*oPs}YvDv7iXp64sxY8yLf%#Ih+LdGHBY_QO zLl8-xcj+;wHl|yaF`!Ql%X2&0bBc8sL?@X(bu@#FLi0UM%~k!plZOB6(pOt{N5?{b z&OSaME-_!(%1&w`GJu0%Fi`SQ+g`7DT$9J~U+%|cjV{x4LfUIMLu|oqtth5k{t#sE zsqw9}9ya|kbTfw zct{XlW}POwSDS^u(5i1&XEQ$D;==T|Rp@E*=Jom6>yg|oHR%Yo{16eXLf=l?Q@qZH z2?Hww5~Gz4gbIc*U3I*DE9l1`TQ(UTDa>xuI7lpU#%+GxsC`*ltsZnc;mJG(JF;;a zyLN<@R3nad4>ue#jz^GVtGx893dNJk=ChB zP$d%uhZZ7JPf^S`eI^qn|A`m>(+jGSBd?%F3r`Pf4FoFD!XMMPjyh4x(QhaX_}-@0 z8a4aEz^G`FsSf*H2w5|dy6(pq3G-903-0;X599QRPAgslxlpaO#Pao}Ur=^5%;$AP zSVP6@0@0C~6CmCD@q5|Xg|~mnU}v-aaEp`l6(9G0rGF8ZNRncBh-&LX?aSEt01CWV zUOW=A(em0gZz_y7~lav>;Gm= z!*Z0|3?It7dRUcy>;a&L7ZT;44|*0*Frc70&o zdC~=^c!;|6&kyKuw|Ir}&bl}fzR+0iqJ>RZE#_tn5=t;2F)GQ^qajvl>hpfW#K0QK zUkZgyGHl<61%Z(30u^*9|Gw%e7o}5%>dAxQ;$;uk>PX7;MC)sA7$GI{2cnNCz<{wL zZ3Ji~JaS%tiOYt4P{K^x|C=Q}%4Q=CFST4mi#% z>ZaYND7V5=Q2l0}^5RVudd(`WYmoL1a^>kkLONCC!01MqE!xX1(Jm7QQtO9=Y?g!; zhQ0;EWkAP8X0FhY8tz0okaAFz`lTbUZ3$mi~sQnUv>i}Z7vPDZrO{2e=)lG|M$ zL15M?QL_;BX>oSFS4)7roZ%CU()R@rpYaLyA}$M_?{opuXdr!ZKZ0H0`d3_dm<;- zgOre?MarC@oM14tEHUF`ruA+?4{11Q-q5muu+-UX@O4d0yWao&0sUg77E{rs)Ea3} zcNcQbCQLJRr(16z4PiW+C)A-Y$PvrRF!V;yQXuNtyu92yNnEf%rnEk^R*y2DT9#O5 zYeg&dWk~_!?H;Vf*jT=d1@8)k$up0vU>%Evs$EgNJHii2EHDs%Ci`BBNr@G+l4Wt9`yn=?r6C(0 z(%z`^HU5!Y4{`2P##D|S%;-e|cf7S$8#P)yoUnimBVwGR zOD;3~PR>DS=6bZ_E0QgH;DKNunMsJ6qn*L10NN;_zQlwvjU%wPeYHSb2Q4b{+OgI!~u#+6lUl!~ALLby@KK`+S_;EH(W6 zq@(d0n2xe6Au0J}c{~2_rJagAgcF3@%5Qw`h;ao4B3_N81V+v*?F+M8UdHTNrY2ee zn0Y;9Y&>x-(@U^!$A@HIn{Ne@ow^i9vD2c`#}XZEHM}*~I zLd(s{@&$WgLZdW+AtZF`Z)KwVB1@*JMloRy$Gw@+$?r;)V~9w&4vyd%f}9*9dDUaC zfC19=f%SlQ)vVGO4zHwxC1oTKbtH5#Um>#GWs25^D98vR7W)n{+}t$S@&72o2V)_B z5-fx7T#ThqjPxP@XIZxXyQpbzbWVnh6yuq`$cgL=D?!kX?iS%uCj3uhgAGg z`>SrbX62IgVl`E z<3gmh)?I}05|D*GcNU6u@6p1ZN^JnwnVW9!+%44%I0U#lS)mABbKA}!`LUG1bT?Cf zwW6KA4+T|4D0MaROwctBJUZNKQ{L~D5xHl4Mg_A475wgV&a7g)a-%R~K+4hXA{MEQ zgleF+suAoVt)e%8HI!s<7hH8@E4{ubODXc!bN2_>0Gm`6N^gjzdKFZs<}>1PZcCS| z($r3FY>yj!KsXHuy(Y(woX48{NTQnC+)xTD5Z5e+Ind+|ajWGVW3U=?W16)+_=R2g zn#|382h@QAfvzSzLi_U(-rz-Q2Q1I?TzvIIp4$@S@1ya5a5+mK?nc*O7lDKC1rxSk ziC3y_4!1_vCY9D%XLsc0MOW-mao$mh|F`Nl`*?uaQQ2PPuBi#gP}6S!ZrPd2G@%?M z-b~XVKV=-3D~#70N>-ITFpDmw{&oz7whPp>!QGPJSM6mN-|4r>+l@~ns_1%6MQhog zma~zDF5kYIC9;5`xBp8XEtJ#7)6EMM6-~b=mQRh1cq9M5ihd-I7}EQIBYOSra1$!B zpF@bj97g=*!#=~skl=1V6VVy@R`>EB;lhys^({wqi!{JS#bB1-Rh=wY6I z?BVNElJzSKPLMqu9TM5*KD};oO(ZVbS;`y_=zzUGLMyIju$75qy}|!qrc0adRWe@puy+#szy?tj7=9A~?|QH|9H z-Q5P0t%myUutYos8=fG3L21&M9gpo2Do*KU(UtHfnf=iGaROhZk{H_=H&fs02oN0| zqewF3$J=z=HvsCA@(fd%9sROdRZ0-o1tLZ0$PA_Y8{SSaI)ZwKCkFV}KrhV$1B36D zxc=Y3fya#Hmyes03x-0vv3AL_;GW9OrS6-|oWtQ;^}fMwljc05KJVgJ416G7%pbkeS=iasD90u`wB zdm}kQJHsh4Xd9;%efWFPxDrSPiXQYAUppCz?l=+b)fcG*aD zba+%*jIwEuPB|RE>b}vfnK@fsrH;>6DYx{NnTm;}Mk;p|9P7ojA%({Nx@I}-HoWnV zAmfYqHhxE~&8&)iP-@l^&O{lCeA`jL;6sTZt1l=mxGbD0gp0a-Q#8NRCy<<&z7 z0t7sP&Mz`eDRnB|NMDF;#P4{jJrpF)QpkCT{0v^rydS~<(&QaiTs47X9vt+!VNbY< zCVU6L`>x7;{`+1V!-Mn2r#^HL7I3a1?#b?TZFn&B&VQdSLubR zH-#&H-kvF(T@D9lX2~u8^O-0$q^f` z7(&z-G}LF$t*|b~T4_*|WQN5&aiP|;QP~g49~NG4v)^nA$!oi>>$x*5#w%ux{t@(N;YTsh&=yev3L$>n;o6fKW;adVviBS!pHoWQ+Pvy1S^b*@R%C zpz&`(tuID(^pak0vR#&b!GMSVVM9W=au*!54>7IP6utVbIRjg-$dRQ+8d^SBap+QC z!$7ul2=*%27GsGuLS44tmxU9gXmxP(4m^x`_=vj;kI)W8h`F?e;3q0}$by+E5p;x1 zyUyqHJJU5B0?XR})#Rp4C$1fTX%~7jznR-^`gvA=jS;LInPijX71xS!#Zma42nucySs0} zn!oLQ-YiaVx7_$2Cq8m0v1uL|HJwc;&?A2<2@j8MRvv%~igmHe76e*35d+npUo z6hvtUd)HqIt!-aYBkRC@M4NVRsw&DER2rRXEvEY#uNToeXd~Zr2?73MnS=#qWliZd zcNQkjclFyuusZ=sbV8xSIDCj}m4^+^XRl}z8oxr~7k_8|=gO}ZC(dbN7JzNDFYA7? zv+XkwZmH0=A2bwfw|A~BhzJL8~dBeW330}90jhf_@D&i!D6=R z=)roZ?pJu%hPuDC!ikgJQ)oac>*X%RB1Sf#5(UcwCbx8SoUkj9El_E?7n|dJv5=}A z+#%mcKm%!;>!hh4^%S=(u|Y~CBh>F#vqWX%tA10e!WxrEk^yX-${j4;b&$Qx=nB_T zSY3BfGNZ+V)lI)sFc=v4TlixD!PY1ElIlPQgXfa&0ceHMeA3FCGvpqeSKk5^GMCLO zGNb&@655Yg9%jkh=ZS_u5B0w+KwL7%6bBrW&Kcu>Iro z6^*c?DN^RJ$=LYUPBJ0xw8pIcd(D!{^SQ(RvO3gKA%D)iMqmYMt%9N7wdu932>Bb= z;4}qn^I%0tY3T$e%+^77w{!PTDcjSE>|>wj6aN!(-lVG)e-Dh6AL$l!)<4AEVJP8R zj^QCeTAKGm19GOLT}fRZihXAZOT!T)(HGlCuNp5JdOy$?d+%^(DlP2mH==uZ4?@w7 zlCedCl6y~in7%I)T!rq*E2$6D z1D>TzO9ICel6G#?$5%*hoSMN^Qsa1c}D)gzk z6!GpfX7bYj5b$rOONAF91!$xlmC)nT&MX92P~z57!N*^pF7u9U#UhKljvmpzli;o8Zf`qj(f0ox6HkAO!3uoDqH74mfBM7c6 znMiH3&CZdTG!-LJW(+9@fe#jMpB=4|9!vtf}IHY7!aC#^Lg?B)qn4^Ix0Nn`i8 zFM;q_`p)Xg53e9}MIypnfcQ(~RCfX$i3B@#yo0gb$dWL{`a%14j4}J^CrVTQ#c^mD z`jqaL&C+PVGO|g|B;jl9>A(pd*M7NW`3>50;H7rozU5G{t8o2BH&EO}$>PrCSc=vC z8yQAA-GUEMz0zkf5XU=gAN4Jg#@I=7H5;?I zj?58fTP=hBBD(|;R`MjUh?XJ1BuU z*e5n(;mhUfVmT1e2mPNJ;^*>1tkrAi6Ns>NQwl@N85k>q<+!QAJj= z<$E`GP07i4@E&QDVCKW8({XNIAs#0mca>Vif_oErs5MZ7-F7 zUS*-EbwMq8+aWrr&Sl}locKzb`k1e7i_9`Tzj~w5k(6vWeW$*Z`A3{E4KNI;tO8R(W0d)J0o)u&+rC3? z8xUo2V6AS@g+}()_#cjCT2_NMCT9=ObJ|08x&;ee(_B=IX_Q91#y)~Y0 z_oLZV7CP{(9D0^EqjA=uk%qy_(=wt_SC`+f6$!F0|dVUmZQ)*hkSw!xM&H4+#i#R2D$Zx5ArpmqYocCeu+7r0&*4)9Z$ zTq+fmn)dSQO-uOPWgi;Kg6yNP@mQzxSu|E4SKbCs|0eD-U9YM=Z4x5N`&XyRQ_N;! z3+k%|%e)>1=*hf1_a<+LY31;2_=BW_23e|uPjhif8@Uuq1Qu5|shGG=;&y-jELRzTIA#fWB z;JWHm-mr%KCjxfVDLkmSsI&hRqJc?K#<*{BwXpLwzfHXV$d9>USS)pF0goDQ=*aE( z0q6mQa$$e%Xa6pV#~_HImj9?kbZCkcbf?n#wiW*5;zAih(_X*>-lUBfsvV!_H)f+3&WB=cbM46;4ZwTxHJm@id8P-B)qbX_wYehgr!gG)L zoguNfDUzOlr8y>y51nHJ)U-}5sU`tbCeHb_C9mjN#deQ+kv6zDeI>mGclfP!vT+*h zX)Pg8myxA~4vy*)4)cvsvOI7n@zOLayk>$S3yFF^iYgZUx4?S;W?|C-oM^9;!Kk~T z$$BZXEK~)mTyJ7!6VQY%{$m{gl-G>Evj2H+u3)jHX#gCoxUW?pS3&&D$VuJsE(u&1 zQ>n&|sy|aU`9l0L`WEAksEqqBo-kiIl+^Y?TQr= z{1W@-LMB-D{da&0>!V~vP_R-Y9cwl%=pX~RZWKp?e=uBb8i&2MrYi3kv@ErmL7|(uuvHlJ*wQ@?>5yps z*-uq+D!t|llzqe8fBDtbZh}m4_$UU3*Fg1~{sucWhI%#;vF{bn7oMfc2(bMHCAzSz z`f6)bi|2Cb4>G$y0@+^hiAK=b8?+clsu9eNk}B%ZZq9F*+v^YP?Zz4J>`l^SU!5 z>BnhSH3pgR$EDewtEyigLb`hrDMhaR6WnPoX)MN3w1T=_FzHW@3%$YNosTP-2`|oP zbHU$8R2!AUEmVyUPESIw50jV`0yj9TX1YBSvPD8VjRIG{XP=akh|x8{@UB$~_u$#m z$2DgnVgQg}y9@?Rnswx~vL4d8-b-j;$bn?R6+EU=t?38zIh2Ti9gG!j>t|%l1f$WK z4rJjY{q$G@3fMx;g2WPPieY)Y=;JBgeG&$mpI(D=#aN$sZ|iSa9+G}$1a59#70w_5 zI*%hAb7C%)%Jz64%Z5~WGff|-K6^?oWyt?Ks-TN0j;0-3qJPEZ?Z8&s7vOrOtxen| zi!TQh?RTd~=u-Fl2v!+%-mE1kOPKA%j*gR}wXcZ{`)=W{96_&jT2(xUuVQHWxlv`R zZ5Um$?}CgasVu4sugNO$5$Ep9cvd61xcT1$8dTwqoRj{00J*}@2(r`NX`DtR#HGP0 zW#7FJLD(QPRJ;9KWc}%NTc$>8F>ryz03TtEBs^vWOx~b==G?obG)P(p=s6jSd{Y2W zk=8ZM1Sj7hUD1bvmhnj&1ZR})2k|N7WXu^R!Es3pbn>%**BKH>)3xIf>Q)`N=y=X=&gDIDyWYE2nFea-U8-1*fG(uOM#GIwvNwWS(l2q!@A*}*~`yQ6N#dJCJq-itHZSR z&n#OI3o&_FH%S1rIm)jTKcB@Cv&mLE`maeRR)QFHdwzHKJczKSzdN*P8?3;zB=qGQ zgh`mE1X5^DB&y|}nnATkFCPtp-bI)x z42wMdbMZ(6-K~%O>U0`VuXZ(eYs{t(@2A2Y?S}a7KF@i?@kg0>l2P0pI*R zViqX3#*YFj1CPHb$q~wFcY|Rlg1Vbeeb!Zu;F%<4&nRIlee~wy$hs4T8+{uUvni%f z7Js5geVrb@`1^hgGiaZ`{i-Myg^AS+ z@v(~zIJ;2F+%aPC8{Q!4w-ocJhX^f6XUnx;+TM~hRqmK8dhbkA|4s>n+X5F1Zop6O z|Gu3~tEa}n_rJiz0(w5&gSsW>EGqO*I8}R0A7>x(kJl24R>kR()OZ5T&^jVrhr7H8 zX^qZeAox_;@koE$QwkN${MbqEoeQ_oEYDcoHZxOc5&KoFR(m z!aLP(w%-gHRCRR6!h#E9>wh;+x@#JbHFq67{@o0}6y;9Wxl@j+O|NvAm++R^k-N`5I}m$5>nXf+4oL)`oCqGX%wE z2X=JLu0j9R`8uMcM-H#0?^h91*}OT!%uI?akY9Qe(I*&7d*bzVGu>*fu8=vg@C_W{ zW96H|iRqR#TB&jpL31X4g`9FQC{)5l^FLzk($t1Juw1fL_HzuRi|J=a(tk%0R6zDB zTLy5vOc~Wi>9r%vU<_qZHqu*WOu^pZ8Y44OKXw=AR#W1HTfgAUMEck)gYnh5GEgS1 z6Jfe>_9MVpn$LWt05=RP7*AsDKK&Lz=2nD7@-j!lO~&X)s-D^0of6tQaB?diY%Ffd ztS|XMn-M&uO4+EPd|XsI$|nsJJ>nngDRptyL=;97nhjg`#DUpH`LZgzQlN*VoC(xA zJn)5PC(&?bza^MO$VUx^8Go`8Kgef6E6Z}gs&hd15Y>yzK|%?|p3g1rRG{`4Y#2AW zSMp{ZwBHZGR#$8RKz+Lu3+N|bkJ^F3P5j5j*k{^%c~0PfWntW2tMx5wVs(k9_HWo; zimlq(BR0B^qcw&+0NO^#yElC$#h>y_6GBTn=IhC`q0nj&=ZF0Ik_C?L-Q=bSc|}zb z->nhNM4hi*@3J4DMWrisg1a}qZ5w08Zkd9CZ_LhSPxj>#lx(hEB&4ldw8v^t_>$#7 z2OSrTWIMRld)jmGWsU8?BS90psR+vn@vZL5UJGg;kgOryOE^JHw9p@?f1g|py-vTQ zyco2%oy}=06UIosXS!GFLmymyT*tyQHa@ZEBMxO+=v&w*1izkp(kyffw^M@_8_~4* zloUEJ($d#XOwKCWDPmVJmWtlm41Ga*lijXkZ@md=se~|CZDjFVI#lr~4s|#mY)KLc zW6sv7`@5P8Z(v$i{ZXaRm++84AXD5pzvu3cuguBu0(&f74@(q!^j5|kAk(*2;C>-+f){zUYeC5@d>_QzD?z&Q$)gdT;mlRqu zgoTvc5EW16b<;ImrosyXk*rt5_aL25!*dWDLoMQ#rv%RE4>P(xUbvAiL4Mmw2(isb zGu;JF5F#tmP5L>Ni$pt(tmz$qx#$OA(aU}%gmj}>_j~ZqNQOyUXU~aPohckT7pu+gX?>4Qj zVNrYM(`)bXq+;8!PZro>`TQr6&cuF(zlJSNdS2xe2Y&VEhqgxm*|*4xI}I}=oLN7c za_p0d7tD5Nybc5r+96t1()9pTqvBhQMxfciI&>h*%hrQ@Nzx3=6$lM;e3zN-_4DSF zlo_u$uY{%WxsLK~oL9+jitgv@i$7?t-=aF>Sv&^?{nKT#%%r`97IIV_5F$4B$Z9;g zWHI-AucWZ!lj1qlGoj^9?qM)o_Me_xG}@}ceb^LL@*~~FO1!$Yj+mg!PiX31ltndQ zyw!j^aTHWiH>ATF9;qa(Jc9Uo&ZvyI;3!Lou9NrD={8i^X)Q#>(VM(Y(EU z-Untgs(P|_DeI|c$p=EL+}e1m+SSen{tpFOax<(JkxTwrEhC7BCCRO4hdw5r*-;u1 zrfmARMtrUUFW=22bH@Wr!Q9V2*0RNWtPuk4J!hLYOt9HtT>4vV1%^Pn4^DiqpLGEA zh4^EHcm(7Wz@qENA7LU0_GpzN>~Z-+KqQu?+`ZrXjk%79?e+D^b!O{=E1@dOWG9rr!>BX<2xV5x5i9 zRE9b3CnK8-czY+nQcgcsXj2RAZwWp}l#iV-Nw{th!M-<=3Sfh2mH6myl@YXJVO2-M z%+Z5iq~VVv!b%Vv%0qw|NtuU`#_h7%7-0UJv+7bh((77KP#{(%G#)oSPpc3ZGOUnB zQFrDdpbFqlUTIzxkwd!CF&dKBW~3nG=cIN1=a z!jL4Enc&aNBm-*7(hl_NBnBoJOL;rr{)`2V9S(b#(X@pP^hY#?u7%le#ESVr4~xky z@ONKpJwaOY97ON2E0H;OA$Pl|m}*%)*Po6FqRYSx^@{#$_;-E`+2zAhL2p=B07{A% zVl$y0l1|WwjZcP`!PJo9PJaa250!i`0m*{|3v6ER%I233O7R~AvcE(VOVp}S;yQpwe!ZO@_PTTIjvCB|lH-C%a6OWe<2)jog%5O>UF2Q%@B%6oT^aM4 zA`}|fkdWTj{3?AhZhC_C_E4j9vc*YMq4>)h++YwymmM1$&O!_wsDOCwS2{4aHmf5f zfB4VID5#pe0pJD3V5_@oq$g?=!yB!+qv1#-z=<rzSL?l6mu|AG-pr>67t>ru4 zeI{0~frGz&(QxwQcXzHh+A&|SU<8ypyELW-y{Sn`B)yc6pBT@fufzfbcM0yr)5mL& zQzJFQi^)!D<6D{_KddN$<=8}5fqDK_xTgwxsaSPw3lg4GUPKq_dL2wS(@LPo6!nSj zoffNtBTuCUN3|G=Skt^=k*?*LBT4=h+@R0rP|TzRf%`;;PPQQNcgPK=g6(h!?UfpN zfJm93gR~0@2CLRKAjq0pT{r=d-d`PsWApVKFF5v42PH?TT1dr?VcyT~vZvL1%gf-Vh)nAmP(N*wfL3mle{Pcb?e8Tn$c zfEO@Y-D`{|vW;fbvVUFs?A@uzMz=M(SXqNa9JoTtV*yYl0nG zQK;WOKzgQc{J3$~qIjfP8y}5m!HG*FsSF)VIO^D)FTlaItjZ6o6|lJ5O1^QO?&Pw! z7VJHj>+a@W4u{Z$1EFT5Ju-}+VAZ~|hDdL{bhQ93Ug3QBAluxB>Wn;9k7F6Dfu1ie zEGLx~O(oXh4m8J4QlEop1#kQ`LFSxb{hBIl1!$Se_^r#q9Zywt1X}15FVdO?$o(ro ze`_$Fp#qpy%*DC zPy>VoI*8pfS|rjC-b{_AL$H9W0dJ$~3*n(ia>fi*i0Ag$4l}ZMJEWLvLwvU=Ko^iH zV|P@;(seWOZvF(-+^<|BNvff*xi!Bg#HM02I$PKU^Si*LJ@FIBzBg1eCBixd`n20cDDUAX&nH`)&}dm)KI=DP+3}72COwMHOEbx8>uyyGKb9GAw_)kXcxOc7Q;? z4OLh_mCfEB!;^;ChgDD>(v+=M7Mg^q)v7O3=LQz2BNHOrCO^frBLMciWaX?TcApw895c)k%1pd+ zK$t1ut?#$la*1%3`^jMk6w7gKEms_9^n-gF(p@r#LCm*Jowx&$1}rO>*Gx8IlFy-G zIoz;0IW1i${zexPU?07n4y|!E$sw?=J4%O?jhHYfTm)dLAIx`ptzeI+PKhK_h1=A6&Mw4uJuru=nQ)XewLsg1c zoN_N*yZ(3j0w6+VP8qZRv$bzagQKCe$DMyyJ1^aB73C6IP^@ZSc~D5H{0K_# zf@!%t*64|%HOXVLllr0_N^`)+Kih}#?w(ZH^9a#}1iZ|xp`UHFwz1E#znSn)6N#-L z5v#3~2sV}jgUB|2^AVo;z`-)sV0RJqR>&6;%psc>BHcTwm%ny_mYa1JQUVlOVV9g! z?j_QxgMDxLR6qAhBm`bWq-J5AiAPVu0suVc)ClOGJ&TpxRmB215@2NUzvp5}sEdDt zBBloT$Oi&DNb`ZNSS^$es8>L{`II+?WLW=4Kk&^zwOrX$&0>2_x|LZD)2094oK)Fd zWpLPr5?p>EOhjs5Lc+rc8%6oOdf4l6LT}i?Qg>{e84q+&wvdgrd_#iR!q_;<*vO`s za6iepRL*TlSx>L*&ng3rcu8wn^ilT~K%-LdI*&~=4UHH6t3@RX5@ymA2;r)+SP-Z9 zI<_#VTA&NFb=4^FTVM%)_TjKsd=L)ho|Q!j8l+qm{83(^E8aPqLkJi9Sg(xDJ6OH())qu%(1Tl zaH@S0DbP`oHQcwl2*^Y=p*!tLO3!}zw-Q_IGkKmz>JNg3MSfaMv{{*nIcLSDEe*zm z5%4|j0fV1^RQ1O$w}DBWfgsqJbYwPzppV^sjg zj@Bq`Ij@-ImGnJwe3i8A{R*&Y#5NXl^H*ogKEAcqal;drTbxS6_#RX@Il6{sr|0KL zk{P;sd`nJu!s==GD`*Jg92qd<+wzV7M(rV-Me-a&wXhL+;9!e}gAY~p6|`N=QKgsv z2!#618(w|79MI68dsm!;)OT8@n)HM`NBc*4?m4jFGP=7_9EnH?fnmN<()E&mB*ed+ z%ty`D`wS5j%L3dr(o4!LpjugHQX>q)NotQsPctf`AYwx98nn!>9#bkSBn6GMU50-9 zoKBq4sS3S#KO3cpV4n@3gT~DF(E#Q|wGH36UAyOmlGL-mYYYi6; zJopLIqG=<%m`u61gEa!L8)#fMIuV+RYAY+1@27<%)nIEU_&=*3=9Hwp&-Of?AW=Nd z)Axruk1&$8OggPrG6V^J=7S?Nq^k8srZ4E}cQme)fm*}**PnvSUwB*gUfcgjeEO{) zA~MvaM3+DmncPO&q8s6l5tONJo#CP;nx%K$Hcb{6Zw*$%COS_sWLniucAPXA$v_NI zSS`qR>B>M&EvPqH!12!tRQ`WFp&$NgN1@OB@ejYJX1T+FPp4M%;AS%G+~y63^(6)_@wS|h^0(5*;NDx$a;%7rV|lEWAnW&r zgC1ALTc15tP)4?J?n!86jS4V`G`F_AQ)Pm!8x{zZm}SuZ!=P9l7gBLcz2zFS~u8al4^ARYLz|rYOn0-O^&=EQ@2Bg&vpu=t)aK99dd>|FMPTd?Ok;3xF+A z@&LJO*?oe8(!x3djQ}@5$iM6GN}=G@b`&HRA#G?6I>SSyLoic8w?pV{1K*Ei#c2_6 zDLVcaJ{^Iqr1E!>$#z3|b86irbXj-CeXZ?YR{z`Jv|)*>_k;1fksd;A83#8R zUXILXYaX7UW*Izt!JWgDVOy_?+#oNf8J)~td9q#Mpk17$82=Wg$Pj($3f>d#4;rXbZs-g6$X zdCD=)`@K-K(m}L9Ixv}=0GY`WeC7;m!*$x4qj z{2NWg=WLBZedNdis(6fEAI5!Kr#Cl0Twr5Q@g1pUEPlc0X`|XaDrA2y$};bNq11i4 zi7+{Y$8Nt=NS^l0jGVQPua(iXZL|qK)_5~+eUH=#aJ`HvieXeucLl8H|3m`1PGa%w zVuAelM!wx%&sN^IY8tZu5!MDkJpB*Pa@t*>6ZXIJoq_KsIIn62e|a3a?l%5u89M8D zR%8QV%S3uJ6^u1rvN69$-C*i`-f|4b0xXMbWm|-a6=}ruFT8&v!sV7rGozUf$BKYY1Mq#m7U*ax?lmhzmc-)I; zq}iNZhl_gn2BcYM!SGHbnUZNabxeGtju+aT!`0h{G+NiM!B&0#gPU)XGqn0B*6QU2 z*TVQUKjPTd<=wlwLn195h$;Tt(lg$elXHumm`JBLl#Pmog1gY|3ALs6aNcAXGrSZb zo=a<-j4*_RC<}*1kg0wXw+^ybv#FSneDN*&TB9O!GjuzK;3pKYx@t9PW36Ct&-W`@sXdCNGNnm ze30xZFbzPI3P`bIr&eeL{7USlnov0uP)NO+4>P$SxuwGVP`WF)C$TO@Akjg8zqK?+ z`eANtG6naxVR}G^^PrtJo(BBBKEt)dF z%POu#cT(8eSc-vp(&(}74+Hg`)E=%h4O%Y9nH6ahuEXypg=*Y}E>lJkuAUln&Gdzc zCqah8KzJNIy5By;Tn1Dpu?NI2cYnNnurrK!asVj%2Tq2D4p@%S^VpZO%h2atH?{G) zMcR^guwIqq+eRe~tu$dOU+VG1rrY5e=h|a{hhd$Kz^B* z>vLWYmLtW`FNiV2uwGSTMR#Ntjoilr<>mK?YH(z}@oppG8W&C#OQO3Y!toBG%~Pf6G?mzBm^_)QfD4s?y;bs9i&yt|DWDOdO+=ZKEEebMD~x0mhnYYc?e zOYz~WvJhh~Jfaj>sbYa4C&^HKeM99m^E44*^FH!Qn%*5{uY1?k`PVxeetPt)y=SSi z$nBlYj(#_ju#jA}4E;~$YW~4~Bh5JiT-9qN@gzyb%|4e>gX5oeLTIEp6FeuMd5J;6 zgpdM+Mg3@LN`hhfvwuh*x#u@=?`Yu20CK^j1F{em2uspcC6p&()%vyV!!RzSu#i5E zTY&g-)`m)-MCB$lhkH;1l@v`i;_t!^eOquCk3e8&C?Tr6ohC%JL)Iton~mVw!Q*TG zgyKB2V7JbKn}OLB>U7;iNP_YJao>T>tPBo3YduGvHgV|5LLlOQ0J65VX&faM$~jRc z&ZM!?(t)dAtQx9{nRsyD!45EC(*2@HZZE2iclv;IlDgpQ74hn4QS?)(^0qp<)9{nD z-LU-VB$>MR7=*40Rz*!hHfIv+5GHpa9{&akL4QwfzQwIs5ZW+Y3(G`hML<(p9fP!# z`-tHGg06AgT!~d~d}9g53zBz;C&VovjlVG`U0 z7ZG5HzDgc|1F2wfJfr}+8aMTVQf}J=x(;<%1tIMOcBA@bH>Ogj4+Bm_n| z{Ya4_=D--sn=1<9-}Yc#)Tqy6%z-gKFaTodIW4vxT9HI5zL3Gh1RcA?qqb`>K$uot z)o{PJG`{MXc-bR2#bnNXHa48s4r3j-_7KO!hp#e#Ljvba=zP=;4JO$pYMSPj;c zA$Yn}lpovIr4HUjT5*T-Ky%|Dfz1CBIvRnidV&V%h6E5-Akz=82?RwC-!R}?w-1X~ z*WfYWuAtDFmO7=GV*hBK%h^d-BeqcNu)3cE*rkP&=d=p+*QVPh=0LTw4jlXmPsJ+P zPHQ(h((pzX9n1!Uv%zhe>P9-D(jdpb4ygy48#{AX3o?snFxvh&0_amdqyq9U7S{wUQv!OHbm6>8`@iN=twX&g+BFQ@q-h;0KbyJt z96jF|ZtOs>3v;WcxtKqN_n*Fm3&Qs)gEFRLX)l1oUx@9^54EPKuU&<_NZfTDb42t9 zmiU+wE>+<}@W8?ck?zL4{9B-`1VB>|K>beCgAKWt<8Rg~1Fa0)nz z@z_y3YT%Q6Cdh1)*B?*_{P!D92g~vjj=a{gxGqLt(VB%D7bY>;Y)eFcxOgS z?z8Qd$gjGMC`bW1<#;cUgVn+^AXLqaGdQY<5UY>upSSas&^@x2Ra|$QA8TJSb6l3s zKDovTod-2b9O@3b%0V8-y-iI z!Md3QiXbI`vv$X!Tw==oWy{0iI4ttqU@ZQ@+7&J7AGGXI$b+~ji3EeMO#5e z>h%gRi6KsXlDjR9oA>Y$z;_R`hNDP~;rtRW=P;vKX{t+!#w(zQRe-EY9*s7&^Ooh4 zmk=DSm%LC0_d4(6hqBtn7NhV+a^yeO3p)eY>XDx0S|zv->*u=QJqgXeU){z`;lAtrRlT=cW%{VlW8#A<^cpFz6_c zF83{?I#2n$m^aWjVr(0vYzSa}h8)v|<;eS_<7iC_fFgjElRTTof4w`2Z#-EihvWc@ z**CLl-lx)W6s^1RYdehR=8?9M&g$Vb!!fP3XSsx8wS%0*x+$N+`VT?Q03^?Hgz)_ zK&OrfJ=#g2ov}CV8xx#NkcZkzL41>i4O^0LWEKD4bx0Dw@AmMCX=YasSF=SZx`q^< zO8hqn*858^j%9%V-QPzko(M97F57Jz&*c&>lrVicbqi`)R)X->2ESYosu-mw2B-N( zD`E43WLKt8_wlzgKXRg8kZ6*aBzJlW6M^IjG77e(Gy6)0Xuy3Ajgx7Ydc8hx*+#C< zy*GgPmhWW6loB=)*;`l!{l>T7l(qIlJvCT0>XAJ;72QO>3zY3oogjfb&8-$DXZwNs zBT)tL?vxo9n@{}$P|)X8NU0JY{-Eufp>+O#y_j&RO+Hb;fhmqDq_m&1g{i~SL5e2@ zCCIf_J%@~A&i~)8o;#OgZ{m)`PTm&QO=gtf;QxhZ1fxlo!+N*^|9e->=CLZK0FTIF z=;nI-mjTQtDuSB+X~(6`z8i>Mk;l9qOnY})bugl8-dhWwZFOTs}`}Ba?i$P?Y^=`kI z)&qW7PKPdi&Ow@?H@Vi$U+Z%{Se_A4o*y8ioC($#O-+s&#UW^f#$u@Ojr>bTH{w5F zO7qQ&xqG4Ppe#-5P~%LR-$-d$N~^c#r)f9PE<&bzI*6CpOyijxsMdq+XYdbh8{Vt! z9_(rtLtj73p;85@tFX3Tr1K>wL0zbHjx8kmg=gY2iQ9h@G#Y=xk-PFb%~d#_wy|>} zu)`&qu@MO*6C{9BJ8Cxw!k7y~vU3AootzKE<|gmh=@%0{A86p`{uoQlTY0SK#NCYR zFYUA=2 zrUvdlo?$`Wc_mIMrtEP|cJK<+2fbpd*?4N1`lt-@UC^*CONPNf-5f$ib4K2YRQ9Ht zsPlDDSC&CDXY!6SZPps9gpP;GqZ(^n+W({;rt5z2k`>d>G_}66lGJul15%T=UCrQ3`lG^m<3q5vl)wif+9z;5u17_}~l~fDewNh5?Tb zF`V)HY!qai_?T4mQ8@AQ8Tc9YZspAP`l~bdbIO#?^|EgbG>h}~5UNW9J}*jn{ZH%$ z|5ETknyLQdKyzkaJs1OWywiV`?cYaatUbVqgT__lJDo+i7s<8VsPg3}rop-Xl;;I2D9`u-X&Y)M{jChE?X}$$O-jStJOfAyoqU836*@wkoPcQ4@_}7U$M;CkHn2)y)ne9 zm*Buzj(mt{WLie>FPbWW{<3kEZX8(!Ka8(`#oAS=1>eqi<*xQqvQrR^P~bEtZI7AS zW*GE%e(z`$!8;#EzC)UROaW}A*~>sjQcDm+EvE#85Z5b7YEQO6HpwuXm@t2Uoi`s) zR`)DVsZ3klqJVsxj;zef;ZoK&b18SwacORORW~{0$0m7?#x6?b0vL@lStXY*t<@M~ zwoyyRu7~sUnG=(VJQp+e>>@4M)N!s6?#GxuyT0I z@Y^FWbRNAv()!)mj;28t!PS5^CV~GQMNNGY?fkZ2qz(ALKHfqcPh!v!`D>LFk=<<}h0DE%# zEI>rm!ztjx9sR7-izT?t$z}%%K}O>Fv-21)_Rh-?e~FtBcy_9-qv;;WSeYS(wphf& zcjp$n0J+HN_m5bR4V9l}8~u?YBq}I#u?@`gsNwf5&h`3i#mS)M%eX+XquKK2LdHFP zj31VNGa4dy;nhI2hltVJTh|fFRn#$pvK{&9$&S{@I|_qir@4Knf6VWl76R-~Bk!yg zueIAsbH2gX7D-3|n6ikC1-=&yn~FKlNOG0Tmh2?hfA5vy`zH{+4LJzyktQk~74zRX z*9a{fF4iGymS8M=1TpUKbM=wCTx;v*af=wrLxR>91fqb>N7h|MbpJ3@nK{I=>Kd0Gf8%FeqIXlvmC7@DB|}Y6OKMgqI08@|Zl{n{L>@l)Vm zw{G8VW9iE4(op&v2mVD}r(xMLOck*JNeE;agjdJ47 zFJZ6k3ke7-Jd@r*ACg#p0m5(`_9%Tt-n;os8)k0@Iv?1BK|m!Mt;ZYW7ld#Y$6F_7#$zdmLR|QzFSCXhVq{6A14?iz#elj&c2=j=Q#{89Qe@F1`1S&`CZUVgl;d$%EZ9_&EHR1yq}*sN(f~Fv^zr&M zZ>m>^D6$O6ww9c?A%w1Qkb?k1)x~9Ge(I&+MaeSw2B;jjU3TT>_7UDaJm|F)~Ui&7ska| zx}gMMx3~+$er2!EF;N>?L?>B?$xu#?9Up66lOxZtdt2jX{S5Vot%IHSS)=`D2 za@nR`yKnIg?O**m;=Ea$)F>vSSWd>68%GvteUBgZta%q2zY)tuu(7&Rv`l3E&zmjCkU$apVNfA@mgOA_ay46gd`qS&Nf?^H0&-5|Bs}koN1Hqr(rJ~`?7DW}u21UNAgILS>wml;Q7Y&FO@ zwS>ci87RsTqElK_RDCNMwup%k?|1zuW_9St0_uJLT5&X8G_tdiUP*A_1~sFFqrw^N z`Hm*1RH2)*X#OCnk-?;7EtRA+F#Z{EDUG;x0SR6D5LX3=$~qhp9qyJ$YjUOikuJclN5XnT=`iWmhF0g z3;DeCt1ZdlI20D2>|-6j^9EEB@7u3q7P@3p>uH}pTNThv{{iT?(M;vBzBV$;iPI#? ziv*TUFNa-)cFznI6jLiIoJuumhE1%8yZi&m#PG|bKtSP*Oh&=>zA10-QK$(Ux{E7ZG5h#yk9oUg zTKA|^`)}8rC~7yXJRd#kD8g5%J-I`^;=~CP4+oRjPx_ z#-D$=*p#M9w|YvD;mfTos0EGf2Rg^>xG7#UaluMm&ArD8G=9y1DCt4~*)cFWS|+VD zNe8D1o-#C}hhFJCNo;7`xb!fNid^LA0Q^t(W36hT>WEFdzJ#Eh_%pQy=_KHgdw3|z zNTm+{^Sd44rG^l+FT9N}<+|N9oI>kDbUW7H#;*D{qyZ%-=2OwKgk#fUCF=q|{H?kx zs-2r8P-_-ZHu36_jFw*Uez|G=`Y8{nX4I4G@zgcHV~eccs!paZ?G9ef39hLvXpZ}M zKunlnTEm(#(r3_7BD{aW&`DQs?7Ix2C4Qt>gPwDVcY58zq!5hP`?s!Pb3|iU-?dD8 ze(UCF7{Hxd(=a)dsc|@Q=);!N%synAm8LWB@m%LE%05#{Fih#GQ9qhh*C5C%GL(S+ z669V*RrUwDc{6o5$RpmE! zWA~5I0rr>+(VE4YY$Yc>im|d#Ut@ZT;AKaoiiF7U0xjkdeCnggKez~4J_(9H4gL;YdHR+hKAGAI2VHgB~{5d?qKmqM7m~*KTj)<*89Z-1&BdN|h zC%jY`8lbEN8e%1_ir~&D)~e*X5(AYUK~z@V+|4J;SWK8)OIMXl#0JAfG1q|8?pN=(=) zwT#g@ODH&{{#SHgIi4Jah1=W7k8-Q(L#lg0iOFyKQ57o!zSZDik8sbLhQvXbD5~A*OXG)tyW; zK9pKnYV;`Y>XDgstiRjl_D5+fGt?pMmTFxFv@cxc+U8qv36 z_2u5qY>e71d3kX&ZV)tLb~DG=JQpn%PMN{9*Q-&1`ZoYa-Ac7;Sm#~#jRQ&(cp8O0 zX2F>Ewv+;Uu?H2Gay5|gM(e6Qa=T$Y%gw}2VaHnPga=1X1kiF0QGVJimvK zD_5&}nn?-c;Q>X z?CTL$W8{l1Vin5eLpDZUkTb}Zz3imsQ{2=5p~Jn|!AjYZL(!xht$+ z0;;ra&?n=UtikV--GYP05HW(m$(yT8;KAD3Ki7a67{&CKU>F>%Kq$Y{Tt_J0s3>8_ zsqIrUxl6@NeRSlMF5sv+WJ6B%GH=9fF*F~-c5PKHNkcRxT-M8CB=praKq~RGgcUK& zXN8iuPNl8;-ryNsbsU@=j1m5N2X04anjj-+*D(qw#?Sn*@2Mtpt;Lyt`;1;ceF*_cNa zvke1<=T624slK|%Y+PIi`KbZu1~M|iI~K`^PPkR}a;u=msS&L%3;_`W>2Cb7%Ko+1 zCK!~Jon;o~H>>}zH$VnUX?ANUXI$IS&EQb46@0eWBRIR>@m>aU8ZVH6>0wxo2L}iT zdyR>dnX9?c%jPs$p`nkc`YP*V~NyqaY-0KA5Oka2lGsG;aViFg z93@&fLom?U@62Lcj5yDKM6AGRMM+Qcv-2mj6>%c^A8aJ^&BAGpbPE3cK+Z8dI=EkY z)#W611M9g0ZOsGt$h1@ExogSBpU>Ay5cJ&pxpPkhVKyHFK49h z!mJVNTY-)QQ;g2~W;6NXPUk7rmV{}vZ0Wdr>u`uRvk(XOy8X16ouyb{bJ*1-d78Ys zluBT7_~->NKN20R)L2S3mf=w3#|w(n><_Sme4i`Gl_yTSu1zLW2>Ds_gxL#5($J!? zq3jK1TC!8K*(0E^|BZK(6v8uEIMC&Y;2@m9DVU1&PK2_=tRqgG;$bOKteQ}j{35HJ ztoK@zzv3v&>nO7po>@kl(U5QqpgP_GOJ(`)K5=3D1Ngj1PgJ4Ay%hWiMnq5A5wd7w ziog@qchVKv($M1wV|_hEmni?>x?1dJes}B*nsD^z8BH}0TRY{~t*JwqJk9|SdMw)q z6KdKue0M$0%K(X)5Vqi|K7EXWEcNdYT%YCYM+$Tl(2eI#3&$iD&4q4#Y-!vMAT{*$ z;4GB6zS2+_A(4)$+%YZpjLrw8xjCY-xmMTRV+E}LtGKx+{Ck-)_JC_wjfsZDMa&N! zwHoB4>ly$1Oc83LbEN;EBIT$ONV&y*W-|)>x^(WiY1X_zrDX-1V(?2!eFqjvVlrsl z^QpL}jzRY0wPj?KFks67N2d9+O2cpY(usIPw+Tu58xk$vq%h!Tj^Kr?*%o0f=r>pcY2v@xXQp_K=}jcLhntaX3-^ z#r%G{jE0IQnwDS~K7S;-S9+f01aRtsEUQjiI||ntW3&du0~c zG@1ElFas2B#?mO;s}PAvN0?grz3)4`{|`Hhr@$VTXM3&s1?=I+V4 zmU2cT1`iFZOA{`BH|$ zbg!!yw!-!PSYbU@3FxjTUE~MxJt0{_B6WO%Nn!{T*<`swY6$pWNEI75w8TfRXCuCH zXhop7Je4H5YBd`50p1RlvS-y3H~DJ@4JpTtUIlL`-M5uw{fjWprkS;GX5AY%w`Ixqh8 zlxI?#9PENqn{e=TtV;&p#=Z5*1w38jm4n+Z#ilVzZJGUm0womk7r36jkUYj+L?<%n zkBI>vVI}V<{BppHN_Dn$@q8{(ujY|Y)6M|Ue5>eTMos|ey%E&xSmJogCmX*6s#1ML z2FRnKJg}c%{c@AQ?vY@mOS>qMSG*r+V+!j}d?|1jXVp#lXKue(qY8>^l!ow1W^>O7 zEb22%1_gF-rRLf1=g%WNh}(*2gJz)onr;KUZDSd>yD8CCNP4kWlr;wMQr$+1mYH}_ z?p~YqsQS4ryX4SJ+Os7S%$WI32X|!Slv6fWM66^#TODD-2++(+bwar8*t1!wW|V*i z)=aQ$>ALj?25@vvFVY{WmV~xX={^LZKU-i2_x?qY5VfbQmnIqjj!m-fdAW>S?RAkE z9V+D$cdpy;CTu_?#K#kx^`ULMnRud8I>&pOOOBtkmg(cVd-TOwz%@jq$e_4mqfQFP zVW9R#W)Y+&MCm??aafY{oiKeiLz$fN*2Ahba#2M1xEjgp%_iwVorct@x-faL_AM>d z`5@3$=>?@`ykL5Df^^OglecT(q~rZ0!Ovu(2#_bvL}|Ni&UfEsE8G0u*1=!W-o@+l zqcumd=`Ek1DmllqbDotcjzrcvDk6sp@S@3&RHnzy10Dl|_x5OTI{%oo+Ut1AUzT?4 zXfJwnubrOC-$5_kW$lptpg^QS5t^9jaUC|;)`=ihGHJz_Y_OD0L_WK|7U43m*)H>Hd)rx$8}ayu1r;(_|hJkHoSiFEA1d> z_A?TxsK0B(sV0RhRx}~xYrqvXhf@%wp*<(H>O;lBFhza-YZ*R&I(u^@!p>6JGH(p& zvx|6Eyd1k!w+K?f^y#AmHW-VMQ_636ZZa+#t*1MPv=nJz9g7pk97`w&Gcu?HE=MgD z$Tn__5hq@SS?^Y`^pfnuf*p}V_UC{Ww@VT#`fxU0L}9dLmzErP)R0NYaCPQLNRe8r zG6dxLvPnf1cXDhV*s9?p?|cjyWw|fM4!N&z+RN^xM5eoiQ5a5R5`^|27lMU8jdo2D zdisk=N_Y$IiDx(P?XE4w@!z5nx>O%Qm(RK^ql(h@ed{Fpr2^CLBSxH7F%sb+>mE` zOYwtxbGb~CdCDUvzZNIWN!V#3PMLLa2wD^Xj#15KaX#}0`OYAM0e7n`B!wJ<3Zdc{ z=xu_lzG44aS=ko1z-KW2k5)T$eUmW3ZsZ-vXOsnAf6EOqw?al-Lbv_j1n=5{KyLpc z09kDoxSHIrp~=nZa<9{Y6srEnK@-Ay=!;vCMVOVRDm9Z8I1{@Ek7-A%KA^8Cj3qiF zh2WS$xNt1xe`=kv4go*K;#nV)-Nox%vYIP0s*V_1P+KSK+`nafNynQS?C$CZs?T?QTx)p@CVIiN}JnG(-$=M|9oFYk#30KoDy! z+w*jdwRleCRKW#O1ipYok9BNTFOWiRLp2?9Vq6WO{cS>qTa)K@#GOW}0s{x z2F!%tz>)Pio1i0LSrh%$)wzg&)45GA1StRQBO3q~Ge+{@vGFUxM5YR20F*zl1UmsQ z`VO|GG3s3lI99(hC~O)a<7#@ z+(OrR8=Hr*K4Nzwp6iB|J3@B+1`BSk%iZnJT%BE~zcE46)1r)UKx^ThH!(!cZ;hZx17o_3^MBuk<2 zNNDut<9B)$h_X>dbL@#+-mvOqHyf9uW1$^Rufe(&Tuf9*2tLIO3P&jy(`Fp>@L+^( zD02i5=FlOFm{kDqLn`<05(K$|KN}|CKQe&wSO0%#A7Cm$5hy^)wcvTsDs3|aT4Gym zZoT&8X`b|mw6Puiw>V6x;C6ug*k%THN)@ZM}^VO~3gpN)Kg#n&+u_%+Y>j)09oBJ+<= z)f*j!?2sqrv46aAhnYH%%GR5djv(ui9sB*;NB^dMD{k{$M~!*1V!(SO&#;L-2yQNW z7|@okN1uxZn7%26z`M@lNsR<6Bv!^W8l(YFzaXp(=rkG=O`^$!wf5Q zwoby_o`K1ruX!(7Z9q#NUGnFJ_RF^?I!(%&L`nGWF%ZVDIH?`Hzor4ifdN5@Hb#G5 zaRLv+0WNK1rmDX?E(WTW8r(a}?ClOLWf#9lfcsUXw%0czH?Y6|c|y{L zu4{7g{`o&zWqSv;Un?sgp74fTcIp14mW4W7F1ILz`n-FKoK=EU?>z**j~-uYdBS{203xJ;{i z&!tT9=xKo5mxu#rjk)b(Hj43ZQe2E8el=ofd=s~Jz)`k#(pL#7xTX}}gU!R;%Kw@~8@R+lGALzGFD+r` zlueB|B?$K0ZOx+XL0v(LWfKlD-Dno)22BS7Ndl`df9DBv1=u_8ZD5|~^kw!vGON53 zq}(UiHNw1@(-2kFcucMDK|Jfr00KL2x~+jEEmo?TS#;>0BBK<^|yA5nfBFIE!$)JkOE{iaxz-%V}X7#j6hdaArc^Rm=0Gs1{$WLR$a9>ky4m z#z}XKs`O$BSqZbRAX*){U;zq!0_J^Mz2EKp4Sx8_xWDyyHb7syQ}3_^H9RjR81B(? zv2n?j@Yh+fS$!zn0f1F$tl?C&?-wlfT~bZWXpJk%<4dQs^s-4EukspW3oy5|Sw@?m zRihM>eohwIRQA{R$y^L^lO-j6#FFqL8%@y=p5!r;7nU>7q`KZ*cc1|@4o4?|!_XIG zPC&X0s#}b0Bq3}VTt(|E-o6XL+f1dik~KG>TgIr>`6HUJ(xnU*P4{J;AO7in+;I-> zN`_t_iDHYQA8glIAKmqR=!DtAJ8VkG2PR-z+DnxNnL=VEqr~-IHc=mFmS|sbz>G8Z zxqnR6Cj3cTeduDBe&RRmMuP{0+cRz)>2l9WFhC~1yTD38mfLzpiaxN`XB$)dSfih^ z#YM-agJo!GS@!j=%!_C+A}@|Gy>=M;zQ~}pYhV9iqLgwTLoG^G=)-2mH*l{CWQM$F z8-4G5(+4IOO3BX;H4JoU!JD_RiMwD?thXT|==#!X#goM)5!gf9ZOTfnv7G)ubExoX z2uL|L*soAhil3)a!!?9PMK84Z6ykhD9`+E!wO<6fh+LsX)`93VD+trq1JwJ=p#k+v zMg=saw)Lil^PWgdoMJY9n?=0#P+}WX@@6iKoI5wi6_)Fexq$x&4fq2>$#kA<@D`#S zmGk7Wu&HRkb*AW9TBstTWyolQ)p0hP{xU~M;dDJj^#V44;_#%UNUkblqO%VkLDBOo zti4NFR9Gw;kMh^j0#vVTRj#E2KB)I+u&im%%X$1`RpSrHH4WRP{aH418@>|n`C;oa zgRc>Taz0P)qR6$XpwIUw6-v_WIQw2ETx@VmJ7~#0MY5~+2g&A%=K5U0Oc>5MhEE#{ zA|E@-zzpegwK=4b_Kyu!46Prc0QGw^pqxVvQCaPTOhPi0mTJi?c`A^TSRp#BI>1~j zLm~vp>9~X3d@?qHd+~ZuyvN2E?|5W(35%|GqM?qXFBvzw?D2TAi zr}RTw()=AISuZlbwjTNE2R@6SOxC8S@Rp_ah!VfHH)_6jU*n3FvD!b!b~gtz;wxM7 zv6c63K(UQ_wfJzHMJoOp6a_Sz9M|6c22V@IV$ecrtF``} z(k*#X6)>jW8kpZ8Y(xzmlrvzFx7;G5Y|||mf}AWN5R*1$pseAFgL!tw)mW|=0d=fm zKi`FCnCn1RuNFdfvEx?Hjj~Anr-i?Y2T*2q*z>qA`RK-5_O@OxXrRkg^csH4YLh)4;^P5wn|1+KOLR`YaAk~HTY!zzbRkbxq11iz zqDDosb8}sy|G7Lsaw%i#2QJdw0k|}=!d_ndi)XKFjr9A)$|9ZnPD9 zBb)gWo97W`E#}dGIN8VQu+Iu=eZu;Np)y-sasUth4(R(Lt4hx)p*C7{UPMA3S~)_h zZ340ih0`}FWjNf+7Qx<2CvEsyAF|KP;wc@VUoXm>Y)`?q6K0SgTZ$?$aw!}Iu%^L# zlT4#c8nTXPtpN9|?1CI<{XSQy$%qf%G7qwW!i8?Fi=mu$hd>d7B**!?$*|lGj7p%k zKmP?(nMeKbFd%%)ag&)8lO85VfQA_p%)v2AuTH~s#DD<_7%wDqzX#y;wwbQC*WM3w z;~QKgUD9CA_5W>_SS;@}(x-rpm@twRWWq&%2dvRJIzLXx*m~Ksn_qutRmS_^qQ@D&&L(t-X{SXG zu6FC_bX%O78`DS0%9O2{6qxSG{{CtZ{hXXzh+i3?t8g&C{+tVVx#A(#(aQOu03LTp zJ^r=kb~re8D#)a4xEE9!+}vTEusgC~7a_x}uJ zM*ISnD=A3Fk*%LRGDy9P6+gA7OVdm`LYeFmG5$c6`PU4Re|H!c;^eAjhaipp#f7e3 zN+P7&3lCk*zT62mvA|3D@}B9uyXJ|n%vG`ZAS7@l+W)L?>nZ<%qC(1BX)i*v|8oCz zQ%@DmqPl%xm8%wU2JoOFOa`dkRv#4hw1vavVQ|Eercazw61gJFuTd~ljforw<=J)b zBUnnU!$3AmFMRZ@h6Zf63^L^l1D96(Ez{Pg=sgZJ+;?`#3h8g1POp?Upgd$qxfMA1 z+eMEucz`>Ve}mVw9l3298Z<|J=G!gq^}9@*KkV4yCk8J$fX{2}-D6!2LupE3H}F{( zP0iG6w6`txuD@flnPx|*zm}_JHT8_v*Mr)=sV?4Z-z+S0V>hHSYr;9hPXJ*%r3p;#Ad5jmTxa&r zL8;kvN(3kXt38QaCXrSaTY3GJQ^J~DQtp(25CV)w8xU5^p`om8j!g0GFt3~U-lJ{j z%qf>Nr?f7T?dqXcQoymR#;(bwfN5gU;br3IjjLBzQ|H%;j+QXUk&SUMhzk5ndG%M< zA?vsB_rPZcdbBaF2q8nZ`t4AJFxHct<+@3}b;d(K$uI8{Ay7r=J0?-AB^?<2itOQd z2?ip_`-=RuBQSuD4hw*gIV+id;@HSVvuJ)ciz0oM*oF~$DkxVTXOK`^mgev*0g6my z6NUe4y=*DnI*24R?fkNd&~H2!wy6RzrjxMhE~e;B}_GBxs^4;|*b(?q)@Ryhg7XP!r! z?Ujb#8HI>h(cba1Z^aN`sbXU_qppWCbL4Ra*^tH13A04nck(T{xh_*G(c6Ti#&AY@ z^E64HkFh8^q6;vijM77T6P&XNfNG-OjfX=dbHj+P01pmD;YDj+r!AGh1;3fJOC;x3 zd&io81w8INMgLo7lCu2cOoQKfWPgFMPV+6bY7f0;(IYq3V<7AmNra?-M^q~2fG*Hv z`5^{`21strM9XIX#`p4#tT?@pkFkzKZQxHH`BI^EZ-vC8D`3yI;Isi)QMza@sYuVA zoMkdE7$W!XOr6BHj$pxm=fl~%Cd@yc44VlkE7S3!t;V)k1(f||;wEE!UHGudMlNx1 zF@`Wc^3GNXQBR74Bo?Lr>%`E}(c@OJLNZzmN%enB;~@lQklyI*sN-JL=(tGtl^!Ly znov!t;I}MBWW_6Yk!-wTs8xwPVk|}gur!J<&uw#qn^4*Gms8k{>T$O^qcFs%h^Vsy zdlZNj!s2=oFJ?Sf6V32JU0v;Run94kXxPmz)p8}a9H^Uz2YPq6mQ?~^=q&srAW3AA4!;xjCesX8O{WHb)r768+BzxDVfL-D4OqqZ&JzW~oE@h~ z%f#GeP;ctM>sFxm*-WiGs^g@4^eFOqj@_srreC9z0j(9KVgY34FYwK(UNr#`A&%L%_(acU zgIVf^VK*>u&A0iHjlY&QsUOj$47DDv(&^0&ez{5J>tDEk<0YC8qo32hkPMlH#j=cY zc({_Q6rlzX1bpNUdcb3DlT@kesJ&kqD`?DxKky(uygFM*!ef#cA`3=@!roDNus&kr zRYkIqcLLG;cF4)Pzl-VZ*haLGjA4k)=+wqWP;wOXtq#?vYC+{c+hg%fW9@|gLbx?u z;du9)r4fJr4LX&&^ub6~~z ztYv?H9smTm%x9i*S{v2Nxl`OM7S~`3$QYmGtm+pWU05u$n4AegHTh}hRn4cvR*&ed zj}V%@rG3oG92uc37Co&=M6q11YVY;Z8_EK}?X7Na{%9Wbv)F)!n1BJ#Dp~1uP?NF$y2T8l+1c)5+(Oh^BL(;@LH+sr2*=HH`a$szJ>G8_#-(9 zC@U=&oP)p4bi`?-q0?Fj_u=#56lUQ0r+Z_1m3AU zKk~I6Y1#?fE8n-xUB~&U(?ZM&WC`;fV<`rEGHk_(V%|A$l~~!Oe_RvR+KMj~jB6Na zk|o~$+>%w_s6riEms#{2Y>g>#ZCU(NRPgtk$^m7uRnwHXaM0#JdjoY2_bh`_Xyo;t z{@U)aSItd1VkM)CKilP906!?=qPvVMW%F@ZF<(sq*I+`p82;IZ4iOM&I@>wM!kVA} z>_n4lSVKiL?<`ow@AUidHYI`Lf6gfVt^Fg9aMay-uY?CEzeBwT8X{>DX{H{q#?iE7+VJ} zg{UH0E-3y#v9Pp!DZgLGdzKJZj4V?astpO`W*@!qs6iXyM0ZG)#9%S=nm#f=s_el) z&k=PxWTY$wIO9F_6&!*j*s~BQY56EHW{+;$|3lq=rp-yyj=#41lKN#5rvAVP4%X=1 zWR-mbba0v#SwymE0I*N0n9d3X`^_jiftluY6a`;4ckJJYv{B%5m?<#ii zXlr4a%+@mmL`zWLT7|wwy%4#ki2naC=#71lNiv>v-9>Qr^_%rAebk;rq(xsLu|YE* z*~%1UQ|f2-p>TdbNJOp{iG^JkDySAC8%k%rIo#<2u$oWN*HHwr z)gJ%X$Dmj_A4Zj{+b#w@WWP#)-W+z67XKM=E8-Zo{9|o%sj_8sVX)w^ zBO>x0X3fTDa(EF0mUyCdt9wv{2Z*QSVi;|6L|bio9fG1oGnYJpce}GW* z$W=B<-K2SAoH7XrXIu5F>EPonf}QEe+WkDcly`pR2<*ig^&HPhr*d>IvD|RW^O|1| zp;}SG9{dNb2y?N#<4_yAS~o#xLIc9-)ND~(y(b*r5|*(5LT89y$refALs2ykpj0Ca zq-+F5iPMCdJxYE6$Qz>X?K!Wt3Sgj)7!Ilnh+=FF-+m(Ijp`J_TssZ2!rItPQp_F6 z#eT|Sl9vgCM|5`uGWx(t8LG%&x(|$7`y?7LjHxn6wte@sNxL~lUocbpi{Z9L1t`wenH!~%#l7aQ7tR1B6NazA* zrcPcCki?jvHbgyDRhKPoD||5?c1qLR!_!J0l&8F`9St7K_I}v`d}5(w>kRa}Z0Jbq z&DWQjCw#k7x|u_R)L8U40YA$Z?QY=LO6Leh;ldptfdA}Cn1e$g)%;{W5d5~PwPp=z z!DBkSuwB~+lxuQLo{FLhvBl$Rq!dllJ59CStdyeH=8u_Bm`XS09QmqinDLw}fb@pp zBNyAUZm0D^nIIy17e1FTXBp|a&?0YNYe2^`4bw#q5!LTW-gENzt&7#Z#mX42l{KV1 z;%*jjU(b5Q*R=VZft_Pp=uOV2yyvya(p*l~!c(*M@#8^)6IYDTS1%0hH#r0-!X~Wo2=EF&* z6g~SJXk7LF=hTJ0|NJGN+Mub;cHvP)_y!bSL=-*&`x_Yd$~V7a(R>r}F?2w}b{S%d z*vaxqA)dzWA%vsZ2cAE@p~;`$@f99CnrJcaiJcagriir-EI;K|6Z}UVCzg4wjVs_4 z6Gru+S!(SIeY#FFR)YmEJ#TPH&VPl3z|rWkY7gT^U=iEgaDeg&M$WC*i}^S|+GDc_ zi@1HQJb*Klq7>+TNhBB5m$Wk=S7cd?5RS^?f_s%OjV&}k5nCGF4`5f zrI9T&wJkR716W4v@KUE)92*o=(QQ=?oMoa!Q0hLi#gTd$&~1K$C{ala7Kz{+W2x=n zPZn$0W3`@$iKD2AR4wq1FHe$FgRN)EMtPfX+5t(N_#a(jAsi8&%k|()tk3hm51WnC z-AUl7qfmF)fw6yze-!};sT*VIj&$7)s1F#Xwjx-wzG0?{4GiDR;r%m?5(dFRb7a~e zIlizn<>1b-r0<06^S)TUFSn92HWJ6EBpc(0M}kNqB9AX*L~gA(H{pJX zQ5JZWU_V*#I~mvL=0)u(>916R=yi~IL)Jr6 z!KfasZQc+mpB2AVax!q;)5ilI{eJBh)>@bh*4qS;Th!1=YO^X{T_c#iHb~B(RkEAh zRdEHvpX0ibc8QbDYIXfW)bpAMJ1)B)m?wnzWG)wOR!hG-re0gpV<7Ul=`SnTLRJMS z(SA?PfP83(8D_2Uqo%;?HO4UkvAm2rkPSt}fZCTEE6G!9k#4J~r9qla&(`c$;SWi> z#3!Pq)Rb#Ol=N|E{cg{f)&Bmwy&d)s==+a%V}So6z*O_gvqe#*7E78rnd_l!-q! zrJVk7C}+A8Ek6je))v}#G9ohrwd$PYGq@kK81Yv3E2hxDs}#}Zxux(=dbUJvI-`p2 z4MSUHsuL$|GgpSqcPkf>#V8C=;k&zEk?J7ZZ4~ej@;+({H`B_A+Ce9v$3?6;7rEq8 zTKqd+p3Lk#rW%v%}3gSN4}iK=5$->*?mgS{X1jb{Lm8KHZ*GF5uH7uaEK zaf40mJ*XtHG}v^mKhEdBUF3)2fFAjU8O^5H9-_V~Jgj>KdN=MM!7*wgc9{tPJ^$}W zulK|V^&*Qou02!PE}DLiNF9KT|9r0}XtkhefbC#=1PHmAh5??{4+_9`_qx-<5!v6_ zj{~WuMEuJ010T^$!Lif`^YGy}fwEKQ>%%0k&W74+}vNZqAl=Sr{ z{Zz6Y=X%C>CHksPA_2N#;x;Aj5oruQ^3_e{XZ^gO;QT&%f8ga5o8Ha`+2RqK4dRya zY^y7_{?N@TFFbS?9a9H}zJyf^b-e|_N&QCT?t+nOkCG+26_RnXuHyM}5pc?1#g6MQ zh5;9WEYq`{5+5`;@ClO;mLSJUU~ICX)OmLpzXYCjpp_l8`shgL$>HQz#`ygoCWCwC z^?L}*0NGITxZAaW7a@{Z@RstaW+6yculpI9@OYGjriAK z(!t?D-T?Y(kX=>Wd0A^(h$@3NY|;%kexvEPS=@;n1ISOz`AWVwcaQ0XqNOrNl}9T* zZ(jhf|D6PU)3J-S(>{GA*K~<_I13ncmmOH^iEYQdR{td2^)8&Y6Um0NO77Y`Z{zuu z@EG4K#P1At3ZIMRvK9RQUJ7E7$~+5$CiT}h@oXB|E1J%3Xx$d?UeIQ%oca=QhLP*E zku?M1Eg-e<6gB8Mnq5A8Od7cFkDGR<>nB`!nS}8eh!lp4h3Fk&rEu@|pEwySHnHhW z%kiz-TDaG7)%?l7Y&5TbOGR8=;}y9@P=rTE0B$lKe(#cQ6Zc?V%qshK*+Ue59u zaFq!z_ysEc)NV16Enq0`Cde7+On^%yAEAMyX^jkQfomZw+MMx8%1l04u z8z)B+`aRBi^~(5z=xJqNU+pSIq@fm1T>8&oWJ(>hCEvn07zR!lKfzX|}U9AE$&B zv$nk(fuM?a&i_Z_pFW>BMdb~_0&Zjp9KP%JgU40OfTrcV^ExEqiq!gKj!jz-8)lg# zJ}RQP7E4bB-GWpbRM8DNKY!7g=^AqzceNCsQ3cUTl2eL@of0%VF7T0{v>6Df2})Ep zTng-UnYkcly)&!W%Z;g=nJYr@4j0@A?+2Y5)GBz|9`81Dqxw5<1q{(|I-iVA!#x1@ zkxBUA@VN6AXhuv-eSi#=!HirWEg%!P(M9-S9#%YzrhWK-{iH^_VaXrISy5aPju?dC z<$#3URh%%4fPRSY-lvbNLlG@x35b>=o&TKDoBMeTxuy?{?}G1z)RclQ8sCD|6{X=< zL`8;?7Ts?HPZ9rIIjR&98|I`{4{js!jC~xQCxS>@D_h=95;BBrYE&>2L~e~+EIh-0 z?&vD_sbD4ewj2Zi>t=|nDjmWHM})k^C8-Qf*k3_>dDk+7_9TLc3F95wY-20IKskYD z%LsS>Z*%%ygeT1ExWKcXf&_RgXKwCz*NAf=b(N8?5Yh)Dk;GmCdyP&+IA~9F{+X*5 zqutS!M9w3$XgU(QcPbU?!sueHu|@d3r(E_R@fM6DCI6Tfpl}0CH_@3@DqsLf06%XQ zp(>;(G#C1yGZCUHQbB1uQ1*9qH)#|yy(QVJcT*hdUxZ&-d>(-RkG~#^E&*K^C#rB5 ztke@tg&&G;+>)+1Puj?95KeykUfH()OdrK$enT-`$5jZf8z9?U4@f4<-5AUF#Juo% z#3Pdbdl9gxFyz6{4UW>VTG=EBe z5{!Y4(pwohFYr&EvPd=$Gn6;OOhQlj=%pRi$Pv9m69P1knl!PagSaV%fjc92n3Q}0 zx2gh6=v(=tf1OS6f zjZmN|ec|)ZZeTL8~HVF9LE67@ZL2uu)hZ^yv;; zmVxcc7F#O3g88%h&4VdYv^!0M2Dcn#x#f`-90)E6gc>Z6pL&CN`<5>?Rb&x3l;yCO zMdC1#u#b_cCt`Z}oEX0_6J&M(Z}3diUvGH7)KNhak{RJ95t66E*%!kC1SR^~do@Vg z@t4UXOlE~;IVQ&U4_Q=X!+6i_*pwfq3_f|pH0t+Eqj>sqeRE64qn7rL*F#-@=d&}g z(p^9r9^r{OqPkr`fxcGF?P8#K+SOUFo+s>@J-q6RqC#3WXhc#DN-3=R^Xq<|wqmU* zv8pVMqb+pCQ%r3?N6DVUfa{l2tmJ#Q|7RnYtZT)X1~?)+H^Fm5lw!EiaM(gm>`fm) zMvt7hwl@}94rh>fHYqFKUG?J1leHR6(|N$EaT>Q;(FRQnC$BQNj?7~h_K_$_0r5;M z1D@@o$zq~9qP95H(#c?Qly!CW9dvh60gM~+qh5|@X5$d$`e@RMOK&{Zw%AGR{6tTh zS{5$(;NVRzoSbOc;``B?x2-kmJxLX?6hJQSO#-FP0~1eJ%se*pitVS7IbMjF#d|Q4 zuR$Mr%eoB>4iFiJkHcm~Y_3O^G#!n!^T6JTqD-BipFT8VI>|5leoI+7(jlOr-8}H{ zcvpofg-!DH@ZjBntGzkOcZHKnoL;wpe3U@dA2l<-I?XE38rc>=~fB+e#-X7mKc z9`IEufG4xfo^Aafp7m0U2rIRJ6B0A4dLnk}&Ed z7iTPUhsl%x=c;bbV8Ce;2A;$JoA9M>MMQJaQ@#f+F*5y{?_%~u52zw5=|9uGre8Zq zrnL0XAe_aYSu*I^X>a;xKTHAo&BGwAXKyb89?+J~asBqRL8q;X&{8;`yc``!PeU0} zXCqnjMKy5g%$&=h_8lNJ)o6-1@6n}Sj}Dz+*`~c4EW@P|Syd?ZNt#>#^!ysiDLAI$ zbu{S%<*UXLWc`7Umk=&=kU^+SLe9Hj-JGqq(_#YUoWa?~gB4Nd3QPuCXS;vEfv>!T z3dWA%0`m}|XD*++>5g@r8}Ax0tgLrCn`2=SPgQCSeh_Y8ZAid!h(#jUzA*EB4ZJy% z=^3f8{j_0`$Ssbrz$I}Envu$sql9(CK}uxKIST~bUTi<58tf^bbMVd3pAk$PYmAnbMo$G}7xv!(D)L)*oZaHW$4}P}rC1aLM2L3@Fzd$X0p7Elj^t z8wpWFwYw}LU?U*YeGe_j1Of#Be*JAfvUuuK75Nx#&|SBg-}z6TR55K~hoP4ZugbA- za}zhBL;POhDa@lFBH5sek3xra7fUE=(2;cj0>!;0EI7{7FY-%hiH%xgWLig_+tJcWEl(2y6o%|kDntoNzaSo;3 zt3t_Cr}B!4|B{XnmgAyirwfp#HO<&}#NsEQz51(BEnS?U`T{5^xT-12(RutG;^uLL z+M7e3fO)bn4zg=;?(94K`c6O)RN_&pW{nC=n||5lcPVM1f;SI1v4QCfX_1}n&dEEo zXHZH*5P5f|BD9!cGtSo|A5Ssc{o%Ri3)T5R{9`y4>%{920GrbmOO==~rnuD-Aw;J)!qh{i2ux2EzE#bGpu~`johJSa zx(dyNzKj#eK!=pXRJC*>37{r&)d+bS_Bygm`)_he`c3?PG6_O?ThC|b(yI~yR_Jhq z1nsr24D(WxWA+VY)D9AO zf8e!g?yGv+`hCOECKeyC?DVTaR~%jViQ=5`fX(uFO>J%EY22COClg9}SC!Ap znPv>uwPCBrpdZF*E5{&HSnTn70u3K1Jq^8W8K6S{oVt8AGD^ghb9Ta_I z2r19^9f*y;8f1vkw1=WVcrlX~m`2~W)ZLVJh`q&)J?<>f5Q4JZ{_BYSb;d%2Z9!!| z7q}-G$~L>IP+BNZUUlI2z2L(9TDA~qtS(&HrD(BzP`OA;$b7(i@M*6efufQrN#rSH0)>V zZ)1fW1DbjQ1f*e+au)=C6C_ub0HIMb!yg+8)V<*kuj)3IE9~(m>w5uYc7*3xk#F;O zhQoU06pYRs-FFG4)w1D>EYVnvI`>t`?E(bcGonsc;myC5dT=Do9NfWZ45 zf6r(wq3AAzdHw#AOyai7Zr~X!lcI!n2s~avCrHyIm*@-&HG07FqSL(eDvjprFZ`61 zoyn2(f}tss$j?C}V&$mK#bzLh=-Tm)HAidnM)Jlbr?D+1{c7JsGt5f*0@XLXlJv|_ zs1L`h%ODj_;MsxQQ*j(zj+F4yg>sdvpy)y##-FH9RxwqI6c`!kUTU8=q1kAExk&B& zl|`kpK-so)48&nxecYa>-gcN{9c9dEuLT9h=&eT2_+7FKhALr`yF|l8@;kAJ-F3Dr zq5+{u5{Js;zT#E*C|spQ_;E3mJHp?lVaMy3gFitipKavo*}p1RAw(1K(^+n}1jd1E z7&C96j+mRN2+5x-2t^4%9F2dCQ zC%g|PAG?fx=Qr}-odSg)CJ53f7ogy}awAWqKA7|MRuP)srL9I#^$5Qq=Cy&QhY#ao zTPG{$x?)CRmk8@n`wgnRW!XVRMw&uowdGslP!R~7Ax6rHB*>_ms_=soE$)OxS!1ukHJr`@J4FA z_*nlQWhP)!pE$_IFrT;z?k~(P9<^_@IWQ=0Ubzqz0yn3k#!k(%;+1h>>gx2-JR(o@ zf`kFzRJpMPf$pyawpr5g;&XQ-IzPb+gy=Gd0W56gubDC28&pm5Ah@i%Rzb8FWtScP z(?_vA_h%q?!aSl`FT<*`TQPZ|fS0|=8{dD@8l($t(i%W^fP+`X14`Ytf@?k1?iDfA z&iZ3wrnIqxk4pD>E(`82%>`NdI?W1^T{+nzW2~&I{89=)W!FzhNN2M$Wjs9lt!Exo zYy=~M!_fM!^{odY70E)LmT&U=z?J4vdZUjW!{`+rZlRxS`XF{tIzFk&xeVyfr)xyD zzn>s4wuweVveU}drc<|Iw*(Jr{p%vQc3YxOD{)3gc$M+H*MTEBxFvqoy>s0xO9ZE~ zxX6$CZVGisVejCNXZpq)-wl?wwXYr$NyI;QAu84|h91liTtRZxkEGj!E_Ks2F%GSP zfoh0ZPJ-nR;wW zII(9I0+&ShDzE_KL2NJ#lxTt1pfmYMAicwp)kj#y;sOe|>zZlU$H>(1*y!}JRUtjc zwHxOD*vzxggZdzy1xX8F`Cfe1kzZlkWwr9s3+h5nW;u(GP|6;fH$ZRYB^$e4o+a^1 z+$QbYeOf+(GO7jjzE%igK!g8@%1^$RjqlJ{p4w4NnW5_UO6Z>RYF`3#QSXkG4;goe zjFw!Hu<`V$komVAmsa9%uDGK6AKL>U+0F#xol6T_?8=Fr6VO>B&SZ~+RT$j&I8%1& zMz-s)nyW||kM142OP`iOnFSt22Xk7wpJ%i(&wh)B)W@ffQDV%1>RmwMmM$Z{WNy{m4RQ^r|G}a33&vf|iJ*Pm+H>sb{R4z}HMQ?3A?5 zoB|#bXDPFZdt-{PJkEzvaR?)i;>c7@vFGnMsG#TMO{4~TG-0ebmA}=TsQ4vRmUBVx z9KaM{xkuN^&(P=O2_`mPh8Xv=xoO?-mpY!jcvE0X_|9mYpiYf?qA<-4b2e52!#>od z0uSn+7B|s=CdnuYOfC&= zp;5(B8Qb@VtbaN4|0|HG{wdgD5|xadMBe--!;`%i4~MT~-SKvUBQEjjYfoiDF^xrJ zSZLTiXF))g0zii$_2(>I~2qmJ|DOn7tZQI!Mmm<^JNQ)$ex+3 z*}k1B?eB1Q3(6|}Jw$Bu@b(BvBzI6q^P$3J$X)-6f{r@h76o3+PK7um8kS&(;^Lix)swJ@e(@5fOdQ4ICz3 z#3P#Q5A0L=AK;?9q472DFoE$x|1`tipUa;&1j*e`)_ZS&Nv$sxk-U&5?u@#Te|J3Q zALRnJ9Z%mS&34t7{GD!RbhcLT2pW{$@J(YHd~uZ|M&{k zP566mo*rf%o~!;{LW+#*8n-53Th4Opft5xFiO-;FIhZzpQ%-K_sp1Km8Ym5 zd<=u$h5FD4J&+O_!yyKKt`*ey1ov;y3Ih)o5)7# zuBF5QjcyX)3|%e4a3)+)4hbK2f@HMCKGs5GZGSN15K_d8uj6&i=0h=2HLb3GHIdi5 zu(wPqz5!P8gJC7AE%f1@vh`ts0dOp|+B!ZLMh!BI$A>w|2ZYb}%8oI}1FhokhRBr!8^4L*h#tgFX_j8o0img=UCy)E+d56^RYEP%??4E=CRD}}B4O_PB zTv@D@Xa?0h;*G3ZObt8pnjar)h%kke(QL`!;#KhS7^EKCO?+Xp2^X~(DTpviDI`(?=Vyx*xbODVF|`^%S+xCg2Q3CkMjn4 z*m#?o!Sa}s2Ke9bceTzS2UAboB9SAk@>oY4+lGC;+f;8TS4; zB1IE!FQ@ore232a^M{aiCFy9BF^Q}WZNIZeB;JGDRQtL&2f6K*JZn8fFUTw3w^G~+ zHR+Nzzc22KgUdpB|NTCEQy#DbA!uU}jDwbc=?fkFXK#Vmn5hOouI3e*p?#hge2r3@ z1O+}EqI0!eE)|Z|jD1FUyB>4QPk&-VPFT)|kU8)#gQ70QnS%?Jpfag4r{-rJnP4M9 zmR4>gWHZIRk3D=KX!3)Vu;0jFp&OYNZEwU|JNK_qHQs_YxtP}Nwd2Wmrv4hHd*@k% zC-l~-pq&gxzrrOMHduCeHob39IUhy z(LtA-^qi-c^kx`!p+YdfR@W27aY(r(EtepA?^&BCyYdchJ}nqtMPsY{vrIa(ka`L< zTaa53)+TXa#&327h~W6$oVO)|O zS($lAO{*7*1O;1Xh5#~JsVRbE_*LZdQQdc`MXHn^zR{32@ANLuGf++*hWVnmsn*?> z#>7cym9*e&xVm@A^}Ak9j5xW@DKqwkH#T zNiQn++q;}(8zrA<_^yUPNaf|Q0ipA!hl0-2sj?*1Fn6kjadmMnV;%waY6&u0QRq#z zb_S+O1uW7V37by^^D7l%bj+kHvETUz1lPN+Xx<*yzln#)VOjIWvXHjUSyk^d6@0g( zh~~r?js8B0l={U`7>d}gccW1it?ihReUZR8ws@+qAf9e8NqU#{_tj1X-PcUf zcz?3!7Sq)=VqxZcG}&HgUB>$0*Cu5aC2CR8sa8cGpCA(8SJ&_7oE9Kxi%71}atEkF z8!_Zfn1GF?164hJp>hDdKZS9LPL&Q2z5<82)gT6y3zYf|iMC)*rN3(qr+B`kOhm~y7{U zww}560m3{KyICA{^faA+I9|mBcC%lFCIqt30`1Rvd;j-po`n}_e|$V zDgDcKLv@Jue~sp_HVhRQ$;1q_2mtW7Zv2umEzFMTk>Rr;6Dl+GF0VcKHwi_hlqcKVFZjRHj4P z?npWVtH(R;6;UV4p%)n4-LD!5Ita{0yL~<2WjT|qZSTm^lF%wgEeju0*ekg>4Lr*R zQ*uSz1~T{~pttUfH&G95bwhg^ZWeuc-V(ge*y}NN&|#bhr4bFQO=eOO)uQoF@YPo* z#3o7468Wlxib90xX5uNrsfE;gY2YHtF!drZ3Byh2Pk>WEqb_=-+Zu=EpflnLKZ@;t zz)P5iQkCQoy4muu=g}HFfJ*h}Qx*n|T?}jCZv-Kn72R4($9~bV7rIt-=q~xI({fa4 z(gunx{}>-JCuA>>^rcj03r(feUa7tWlNu69DMgLTAq)hkX#kns@q0f|A7q5}YGp;- zVy;M})f9sJy5dKUi=BlC?^Fj001KeC{e&xcfwzbDE(v9?*$LE0Ms4{&s!9RdAy;eI z0BFswdLB##ailV9+qHtF0NeSHeBRJ=Rqr*Qj2h=0mFf(^Q=uXE%E8ln63H0q&+F*8 z5pAENO>+4}N+F@kzP-C7^^T^k(?&E4HdTE5%hgN(Z%|Cn*s;yGEKA(UGL;vT^^?6O zxd?Fay{rsLvYx)Lf$?_gM}tB}Y%@o5HmfM=BJ`*V)(3h&g+^{-r^Y6wwA;d3%4J`2 z?n&O3bJ-JYeLg(C<;RwY_DFARDP!sftUoi66jZvc10+;ejrDh*o$E2xZQPg__%4@E z6;=AdOS89=Iv+8F-ZY8W;q$;msnp-;E@rtb&nGb`4cg0jW(;O4o4MN!2;gY%$AfBm z(seo0|B@GhvQ`H-diI9hC?X~FAzhSQ0=SoeiPQG3cg`&=iWTp;q&#vL@ zs>dxb>;jC;T!R_BxVQv7SwmE5-)A9Y8@n~f@Mrt!9gze9X05((!j9_52EouZ#C_UXTY4TLb`YZ9WhWaTI9+z z%a2*AP9WK0ir@Vj;YgyI|I^ZE&CtE-r}xX432PWS;vEq=!<}6*W9QOyK2390sc#U_ zL}^aJ7b{{V9|=RvcaKy5piGu?K@an@tbUl^D4jDeo9Yq!&Q2sHO4%!zwv7P!lqG2| zl(_@eCm@GrP-Nm&S{LXw|5$9|$oV_=rRK%b$91^$vnEzlC=b%-CYGs=x_?8eR)qAL zw|C%cM%8FN2nTDSiiT2a<1i7Wni6yc+cl}z_2#8x^?mq(2Zdn^VM2%ln{^DF&)6)Sat%Dx%;dd@!~XEn)sYzkZ|Q_xoFY52Tw@F2N&rW z-3C`se;JWNu3V&bYQg3_K0Nj89Mir#5~rjDs_HVfmESedXL)U(r(&F47c~8)nT=Jb zQ-Zq6AcGjIHV08HXX$%uM_VV6i`PKV^MFDfN+_ar^#ksZ1&*7!OO2Dbb7qJ(VGLdm zeT%BPZK!`HyfjJrVr`wWbZt!{KbK-9ZZmRuer^ytO?2d)lf> zn@h_?gXQ^pE$lc@00EST8;{N?G%?FZ&{9=)>t`jdf+$3SKu`(^*jqOzUA?ub`Xnv; zhT^^r79@^X#9>}77eMDtqON>z2>4?(RigS@Q;9JzKV@fwusR)YlazZRG9s>Y6{?pQ z6Ep(OA$CrKZe;5v@v$}fB~u~W-PWC4tOXZdi4x~es{3CrOXI96!$yx+Coi*P$0;#V zY9YC;FyJrzvjR>|Oy|Yodu7zIyz4*rJ7#AzU)O;Hn!EAk2$TdJ#^VsC*Z9lzO$zm} zADu!U2Hx{?*h+3`OrP$Y{cQy25@PrLo68)a%849`9s33VgEYuxi`B7r@L5k;SrGr z$aJO+*Rm>l9Y8;J399g<`=EVdSU*ULuzm_|AC(S0u(Pohh)^GyD-{ z%(EP9J@m4{P#BV$D&BtGq4#!gda+^-3mG|OlC_upu>6ET!ttPtxn|~yxH)jLSgGB^$wy8<^#lmb zWc*2_5MMh%*4^|SggQk67kNUh^S+jQrH4G`Ko#Jgz|6(eUT|FmAnqgKI(5#G3UK<1KbZ?x{JgOr#}Np|FU)Q3|lVDrHtqNA$?P-WU&ZFqfu2sn<~l%q5U<{4)|s z4s+|FV6oL7<`E`dNCpfE3#0nqx00rZj7>2aHp9-Y~Nb33vY6sgIc5oH3Bv*XY z13~fIwa9{SLd($aqHzG@BXfs7tkonX9W3UEX(mX+D>}0owO^ZLE{B@yyn;Jb?xWxx z{L|;OUsX#Mta*i>{h`NMwDVmPP_p6f$=gbs%pdFXaPkwg7#ebb@k0_Ls&yYL(5-js zHyxymUm9vm^kMpd>RklPSN>tsqt%C54&)XmM41_tdpE>%!Bkpt9KxSljzP4y`4u_y z1IX#NZ!drrFd>71;KPz5&pa6|2UCI4=3by+D7K<}4~S#C7DC-K==6g@%=f3NIBw7> z?K@2f$pX!D;8;gb%LOGr80)@z8M%4wZY8r)%tv%g`qw@+dtSyf%mRZt_fjPaeO~zg zN*8-9v{cWrn+SWRiF;fn*odsy%u$OUY4&(5ep0IR-XH@Q;9O~c4RblrnL{QaIdB7N ztGn8bLe^nun(@79fz5t01iQ00ww^lp)YcSg5-rzi%EUf(ll?$h4G*U=njbeh`*Oy66W_eFOZ= zmJN*NUmED%V&st=J(W$9@qCJ3#>7D*5{xSmR@SxyMbc|^W`p-t8wS?3b*idPF6D}G@q8GCP4@L!K;9QrYa0<%p-=#kcvL4^ zqVm(q(UG;lUz_xuyZ%|#gnp1jU@c6A2+NA;N>ZCAa@WW$rW5n%Wjawpa+LwSEKfzd zcx7bH@_PJP6#}l*Y&YR3$wKfct*#~8z$vXStkmx;HFGU);m?NZBJ z=Ua?aux>XinTEkR+sRc^CMePyo+W>E?NTq;Hw|BWN^Zgw2{vxYGy#j_F z$@vH;VC!5A-Y4CI*-_yY6Y^0eWPNmi;6strxTHRXjXi<6Y=&X$_0D*^y^J(``+D4F zo*w_{@p#LmBhG*Hff3zWHkX?$rpDuE!+Yn)xR7qdgcV>X-|k(Jl2yoH z4RB%v95%hgya@bNE@P!Go%63U8JXzqn-r(1ckuDiQo5X*RspJ@r%0LCshHz~ zLPYsjIO!D~9WgYz0`ZT-cpd@1k&v<%Sk)IIyizW-59x@kT??31-}b2jzfPH|Jo|-u zeS0HhVthU@G`i_WWCsj0M$GH70$69!|1JE9vGCrFHQ!0dK0|)CpKHvICg(z0t-W&M zQjSHxqF2Td%j`k-b97lHXBvUoi#k~#p;(MIM+105yv<`NFsvWw5^Vo2MVQ;!ze$oO z^$A}h8}{DROMGXG)boSp2X!?)40_johX9MW#c3z9lc(NYl_kM>Y{9Z6^k-Z-0H+c5 zvg&gH-;*m#JOwu(Yf3f_zfyAvtMkxHdJFpa7*`^%o8ic zLHYy%EooxX$J5sJO2#1oP{xwp-kJjmA3)h+`chvJqUxw2pV;N~;1#JKoH-63KQJi$ zMhX696&t?}Jdh9n@aX8(_ zjTN@LE?1D~S9iVatYhtwtHXMq7#_+6>L;fabw^aH#>~$NUn~&zPuoHqQ5+CoRrcGG zCsoyA{1cC(46d&wDYVIQbhXAO`M=b|I^2Ni{Wn?cl0m;%fV{zcK*o8pTYbBwH4h$J zx7^VdzGs%3D3CtKTg*~o5r0AaSQ3;zu4i#jbxiM>==}pD7fRkR*mS!Ij7rs$3h#VS z7jc>%a=QsO9b!ve=V9nlmx_kTc*%B6|JU!FWvk$XjgN9^{15X3P53KXoJ6gwYgbHb zMM=4I?k1)b-d7BV@$47?x_#|JkHxN5(+ra3SL}f(x3F2^75+!jhp{<0A*1p)<2M~= z7HvqLY#%UX$p2iovPB7ZhR}!7`_}&R9-B@z%q(qftSRall}w@EQMF3|*i`&@@yMl3^nYz+eCg#UsnWUB4nfx& z8+-Ki|BNCXD%whTET31TZq%y2r*$+S69+UO^kC=*XH++TSD)Q*NRTwkbObOo(Xc= z0^ouR4(Oip(o}?)I>Uj;GFoD%R|X%hlQoPRR1(5aO}(c`*)E~F(FxT(Rm2%sVIPx5 z_>sWLx^ABO%rOw@is*oeM{HtZ;(x?#H};j?piTHenlmok>oV$AcRn0OGI+S(*9>OS z6#zv*y1(|(KM|QtOwwU&MjL>N8Vs4EtZv2G79>+N-21vRxkQV^If0}8`%<%Hy`)2N zFDp9fXLCublVAM*iPUCUqHYsb!g00U!aqtUjC$IG#Zhde#HUl>=i6xh^vTirEO9H^ zd8SHzyNd^y0!b$j(0AA>-fm@}*jeP2Ga+{Axy-6dG@B~EoAwAk=)wkk2kwu25OVto zBj0Syhr*fr(QarMaXQH>Zi`otZVEpB7E%?`c(YMahVe%;6-aLEfx(M<+bpAhC~PL|eutR&WM-A;k-k)yaYnrOGW z$WW2bXOerzKnL6F&AUy&61={1?riE?fWXUf*4&{0#zpknE?DFM0*wlN^HI6wf=-C| zFrGDR{Sh7;<%yY6ljDO`O@x5Hbp7SwK3kp7Tpbn(H7dm_pRXXjSC@O6?DvBEtDqQeHu zRtmpL<)#34qrjz4P!Jv-8^{X-BT0((z>Y=0ttS`wGPGDy!TSo!b}pZR4_DAW29|8tU$Dy!-S<@Bt2Awhq z`r?prf<&q)7aq9XE5G$v2yOV-7^l^{XWc~mX~}QIwGC}=ang_AGV=G?pu*__<83W0 ziI?{~Xiw&PrKb-OJG%O#$hXl1T8C(1(<6WLxQcPbi5-O?PkJ(zJ?z{P!WHx znpCE}FE%+4Etl5>QN7=Gy39hCgK_@^)YEvGpHILo{A!uZgEF)Oj(=t>?&E5@wX8!` zxFnsdu-R@>hL<%HNxk$=Q`qlb+~hhvlH-IF+QA>N9RM61-@pV(nhW&mAAd^h#D%xo zq+UE@ZSfY{+)+TEbuywi)?j2ej=$r>pFJ;c06gDW?X`51w@qNGvP77|%^y7$z^KEC~ zTCkfv$U*quCiscGwR?7Z+5e61Sm@XXX7g)H0iG%#?MU~#y}YQXnD@C&_WPrp0Hm&< zmW+`YBxS6~71w3rbm-!#owh~k)MtgYL%z0NPjli;LSn=MPuoSRjyoJsSts}7#M`uIm8{P<9bQQ)C`Za9oxOkNo$Sy zWLb_2H$-=j7Gyk2xQluw=m^E!DfJ!$XF*;nhq|;*T0XnJxsAu!H4^hSYiD=tM1D8U zh!=2P`LS9o+btRBE4-!@l?4-N83oLK3bD(oLbvOMdaD79Pf|F34G-h7)NMvgqBO^~ z^SRg50)Zw;CFc?5hWw!3gB#4;{y&LE<_KjBm_n5+Htfe`=!BX@`TU^XzpRXbBdgfrZnTRrrKIk zJp=ZPnoF435=|hDa^s>9_n3Q57UdNmF_7=(z?xUg#k(*w@f9G8TlK6j`oiUF@;5cV z?z&O9p0g4WiQ_-wao-%|kQe=z^EmuG=OkP%VsX|1@yeAxEsTDX$}F}*WwLst1TC8s zUgV;CUdBKU>R!ND)Y7%S5OcA)A6bbfS3XKhptBe9}2Ai?4XI zjU25;kzVH1xUsQ4(DQe#pxMWmDIw)$2$B9jpr8)6ZT(;blG#C}_te_iMRn%?q4|}} ze(c-|I-7Sw*&Gu*3TWRl6*lxeQ0I^8?KrQUMvlZ;a9^#HLzYJr$xB|wQqg&6fDZj5 z>jHCoqo>C(1+hpZz}C|qpTfV@)N*rGsv3WN1Ap%Y<>_8*T{fYzp+q+YmI|!0QMRE` zUPHt3bI+|XO0}o(y$m}g*0u3GiV2BMmr2T$4t56?Aez4(Fv%H^f;tcyLKBs^(m1X8 znyhC4fy#IL&u#bs1z;6fn`XcyQE~l-t9WN30QZx9)BZXzrmJDV(6NXv20S!yn5SE8 zU*b~P31&F5FZHLjI^XbyrO!T)#QKwQBI?MVvue&a)^b|_IK|K=X%Mudh_l66-OGj|7^ZB2LVC|vycQ7JYH($z{;Yn@t);ON!$y+!x zpk;$t6VeqnfM+?u9Wsz8aT&Mc_OUMxo{lDq2OR49-&F>y^Az#q=mwJY17)UW?R`(& z`;s!kSHW!2b32mrI#|liP*4NPP{5Mlq%5?z^H;R{yh~HJzrFKGR3v}RTWL-@v*gHC zIuy~btRj9ZJWlrKPabtCFzV5Y*IS+B+BaITPNAjVllVGXqz*9j_;dsfb7-`Le*z2k za5S&b+T#Hw|Fyr_+M7ucNa~)l6feNe)SRbDcr&tPJJbC-wOGLl7y?JWLL6JO0P{Ut z3Kzykx4t`5xh8w!h3U!Kc_Wij4l90z;t^q?`mGT16aGw@aeWJk>^}tHGEUtsw=s!u zWig1oELld@X1XK*DVl=5Dt9l6bY-TO;j8!0HC|_-j(FSwjALG}<>eRzrB?#a>gfiV z8gM?!_n?uQ7LEI(>%0#r40hI*tk*@*lopM|n#1|nZC<_4Doz(<%*9`OX599vZEKm` zm^k^DPsa81ivTd~&Pa<2yas>aYdI~P?HahKVn`$v@)Bcr>Nd*Woqk(B+FUx2l%lVo zq_X!gg7-0@04yHZdiuG5PImkOfnB{CnfoRO-GGJ{vfIuOH=zg04v=5l`0Y|jcFMo9 z8w93#m6+{I?fp<>uXI-cY|2^xBjpaXvf^;PQoMcQ`tqz99Jg%ejwApTB9w70bgrRs z1R~0ozV~WQUukX(JH?$0j66$1u;XV-@+RHBjU13NaJomXSk`<24|P3Iez&d7r7fhskg*6;$J3?@1I~ zEsw+iTJr!WQp+Q|BWvwpTcExVS-FdyVXdap>v|maWZk#tXbqicOGYJywJ^X$<%l$t zT*;=bJG4kTF45h)UDPFnNB!o6N019{%z)3OgPU#UOhra@xSUj>xb7syIfyGMCxS>O z9{#KE;32tMf|!qLz==>RidY~Dc1(5oTB=XD4(YU-hZpf*>`JXF_WRgO03Q`Uh@P`NkL?unW$ZCZ(W)6>)W;G&3%0ndRbewu~Uth zvlKDsOXZ?vY|m*Edy)OvBzx=^@}ph`0Gc9EepS0sCXv2R3*_X1!I_*M1csLs9DVJz zt+x(a+OTE78wC-w$+O?3P?vdPfFe4ZOAmT-qGo%``Kv=`g%^z77z2% z@JoYKE|x2!w-BWZHpDx5dxm#8g?Z4PV}bDbRIB7N4aP#b{HOacnZJ)#3jRJlrP z8H0A5tvT}6JKo7I2I3K<@^_?lrDWVK?S=4*Q$vwrh*xwfiJ|nXtLD?iFaIz%z;w8-4eJEeaWbc)g2G1+~ZdQkLSpR3kq^ncEOe3dABnn^FOE2bS_mrLVC z0otaJ1HVQJ!uIQe4o4L2EKTOaWW$N)yFTVkn%>~x-Aq9_W&4dP%jCU}LLwb_V<+x7 zsJ@1?S0PTyozfK*QAJ)&>5`ebme(NEX9HJ z+%NQ5h1GKDp@`r}yT3Fh`3x;#i4&3?EA^sWa3MmW#BpiwNxGUx_3-cj6-gENa^@XP zVGz(BVq*(=i|`YSpctlb$Y6-A_3$O&Uid4kfOEd-Z6U|_Fn9U=w6hs+tzwAr^BU>P z3oPNqH;SYS*7knd{j`AEMzETk&S>Y9<-6bkLVfpImY4HU z`b~z!@tiYm#Cna-ah{DevYp6TbKNb~&*Y0wQutf%Blb2`PGvFP8{S?~X^2{p-7tIx zD5R%BZ5o`~`IMw{hM%$bF47@D;O_nf22DceKeE3zcB;LcTq7oU=3TgXXs`Ey>8t9s z$sxaR><*_COqr%pndqZq=Kkb*ej*oIGv?dvUp`w2F`Q-QSuYvuqZ#JZeZ%gbcv1QX zXHUsxCd~yz1a>cLx6A_4;I2umzl}TJj>lOco>XFPK*RvLLncUAxsYsVTB4MfRCSVA zo;S(TI}00B>K-FH+$$!8 z_i(5%r0YRbeA7!-+m^>OQ8`T~gg!kp29K;A+@rX<=Y=(^ULr>+a+B(O6z~dn99aeR zjrRLcL*$f3d-F3so>pwGb3^O;|C1L`hxMlWrcpAmf0_Ec7s)%f=N;K>Va(8fveexR z00CW8?Z4&(ixy7R33ufrvT)La|h6g+EgMed;J=`G1Jo^%3GQllFXPs6_XAS$7*Y4 zC_&&+&hGk>uy9ADlLO?SPl=0t^1~B*e0u^&a_V_X{)b|;Mu~r)%NX&X#COTRu*$`T;|Wsx*?6#v$%uIaW5xPN=~_V0m1#OAb#KF|{; zSY5}W=4u{^YTBs0njM{0563Ry1(xAKoogMf+UNQ24ORyNY*1kCG<2!ip~U>I)5S+U zbBJmN|N2bnu9B(or-^1XsX@@}MG#HNyCMJqR|ZFdmtJvEQf}>#U{H?AN!Rz;ZQrC=AJI1eGzv-TZu^ss%ZAa0S>>Ddgo{Av zQh3c%G<+MXSYS`-e9##u9+B@j<@}F!eQMzd9|XgaK9p3L8{*8SSN}4L!Vn@FWJQa9 z<(b^XBL^BEh-b_3>}eaI?!*%I@Q#FLG;$DMu#V>DOb`K;?cs4~*Ks*7To!<@i`3lK z1x~vm>wx8zIkwr~U2&c2ddw^miv|F&bW>V0lha0)Fg|CQZQy8Bd*yD&*uX02k{3FK8nm0Xzd+*6 zbbHPC?pHaLDu=|CD%QnQ%`9IqGZlhEKBgv!N&O8c&IIH~;)26w!I-T6d7pk~7fn@F zwwYAm%O3EDUko%h8wJNz8~&zD&IjdBbHaik5%5kV0tCAnuC|rF&*x6y%4U94ca93* zrSE~)O7N^<1)%m%091I`bt#9-mHr?jnuw`{jP#ajKRdk1hK>?NQVZjZwhzwnb&>N_^Zzjh)dVozm}_6(_;OFX#5v3Qi#{b;~ubDq65>Wi9hW}yORu;LtAmzXy6wl6V^ z!4G}{thg4_csw!5a&`;v>i=>12wPP)swK!w$+!cqZ4|uco!0G*Rs|~a8oZ)Z>)4& ztDl&b{gkUqon5q-tg6nOmV11mG#rFYUpgbJockVbjfXyiX|^ir#a|}e=N^MvdKE_5 zxx^BzhVE(j9zd0jyR;?-v2Z$8_gGd!IrP0^RCtCXj!{v1&wI*LS;0XRjtceul_+#| z^hR2ZNFT29px>g*%2SL|dx}gVh3g1v2bI>TB0eV=tdY~cET8LU zz=Tay=3~nhkU@Iil+*o_FC&6!$2fb35APQXe>%%W0_k%wzjV>@6lZ`ZN3z6LO^tA> zg^P{j&3!3JaJ&90YSeaWF1{JYV_Bd5+B*;UG+jeROB?C4t@uiJ$FN3;a?>2*alz>=rC)pkF`{C)^{0Me|vWko<6w&!FB@HV(G&b0`i@7*bZB$ta?BiV9+VAa<)yc zAF%B9XwY`^mH+>X(X-e{s5#k~Y%X;7+?Ud}o$~m+-zKYuH-JSN$sW^{y3RQg#MlWi z?%x6Z!YpC2rTrq<^; zX@b4`SZc?rDeYj~>bh#tH)sH#?v`JkyT_1SNKzde%P~3{7~KQIVGFFLIPs(*mhuCd zQ1aP}@WAd0usA{U3(W2FYosl{dS{1EeyShEOoFQjx3Rc*zJ~gS)yUMFZT*xe5NEk- zp%m(Mn|TVyyeTj_?0c1iDEdJMYc2|QjycF<9HV5{wFVTzydr(nWwu!^I}E!PXc{q{ z28mH}GOuC*S#T=x@lx{VZWapR#zq%01}>Qs4+;;)1Y6AX)r9OKs^x>TJEfxFl^O)# z`^hg0s&8fS^H9=g$6Ec5h3~KtCAZXgqQS3Bn$Ultg-v2UktZ+1gm8Y%zrCSyK0=!{ z@((33f&wtY0>+{Mas)2$iU#k{Gy-eBy{7)UBUF0Q0h!sT440WJmSr>dBF`Ls#Y=26 zC1}F05dST|^mP*EAD-rzZ_x?GJwH!_v4B**dZ8Amb_TW~Xo92uG~+?2_DbPMdC?a( zm58c;@TT#y=S7{SVlt#j8#Y~(#16K3w*45Ho0&H>il6fRH>2KYz<{ed!P#k(AIRvY zzv15x2}`7Mw1Vh}f4_+}?P{NAbh=OQ6hRGy6d$8h*1!_N{6o72Lf$U7X&uvpyqoS@ zcB8Ghmh@M^P5*C=(2UpOB-{Tj&2$rW$sZ_h+`+bg+T{Ck6jB0UWiSA4)Xn7%dS=h@ z>aI%MSw5~Hg=;In*9jQ3{6q%MVB(mO=0@!R^y_M-^d3%rP2wBOYfgE&BIM3}O!E(% z(15esLb`{14Yvq!Dt&Zm=|vWNBzQaF-wQ!NWf}kyS{%FvYJg@eaH9*%#*fY;t?opz zR+AMvTy8^DgVKIqVpeb*4etZgkZWMzAO$}5E)#+tItRmPCzXBgmZV{dPIDU|hIWq! z&q!1x6*;iR^(+36>8l`>7*8R{3ciG^|{uu;n(2oBLY zCUnKga~*VjPk5Q(L~0 zfNW;*u44%02<643{DZ>xi9}|K0g-}Wbm5gMW_lxa1;?G~x00=<+l1+Glni}r1G&zI zxP-8G;e!HGO@T6bzXoObP~$M$u;EfcL#0$i^z6#!*n~nXO(Brcp}MzTw&pMy)q9RS zC>H-`lt|q0BrDFX$GI_ef@)kh;k~aMX#Es7`{RWN%8I#y-B*zI4jV+0MP4}X6Zc@( z7z^T6Qdf8zOfI7ULqCDvWfkw9KTqpbV&7S8ag06T+<*Y7G1!an+EKv{9?_3M%>c)J zUtzxgHSdqtbuOO*h83>A-S8k~CaSNkO)#xw%7xsM1M%avlJ=^%3Q4&a-#cy38mi^% zR>M6in3!_`sP$=ZzcMn1tbkJaV?vxAaq7NX1vEd}0bKJ79o!V&t~Ve%7{suz%#V~Q z`d&1xv#}vh($&!ZGP(_!cNZn5zbt*YA2)kt2=on1bO!P%s0~P8bogUW2<*;d`T#%2 z(C&Jtmi3{TwrXkZ%9eF2cQ|UL%^Kzx^-KBX|8*25ulnj2lG{rKDt^?_1!OlA7up_8 zo^QH41Y$cc@`%lY#;SUiCb4E(eW6&>yw{A|8I*!b^XJfIAGW9jp%mW;pLm!l-W8UA zFx#N+o91F>#rHGYjGM@~SE}q_2@y>ITk0?N)sW4<9=>W4(C12E272u#!!smJClH&T8)l6N?10VAYMRW? zVo2&xyV-3)it!0FYUHY;^PVPn6}~O>Js51zAKGtP##&Bh6A5u}WvXu>N@A%u9AkEL zJ9uh%^UKgqDP#ptQ`t~}dFjwI;UC0Lkn2TlmOXxoKO&BJW~FH0>}C3fc|R6|N`-Qv z&t$L297BOObsbp$J$BO|kiK~C%axjDXcJ(JOEIN!uM#Lqml zS=x|U*VT2yX2Pgop=3+!vH12j)alulv-#z%*zi8yF;L4A9^J)#&hhl)wyul-vY4o0 zKz${akF6?DF;cjgEv#ZBn(KE6ry~qAialDec~$Ia)0qSPie-rx)8Qp_ZQi<>Obu{j zMeZ(IEu{?Ex55}XAefxhi2}#x>2US!_Y;f!qhkPbyOEs?aRUBL)({8SRKP1K0pAag z&#duQ&!it5nNgQi;yhO5iQSpKJ{)J0xQeVhblLr-;{8FW{1Pm3|8*R(JnPrbQ$o4q z`vc)b8_1ySZ{?S#i(1*lNH?wBvt{WBx0!hWmLptp!Qg0#94c;`PH+>h zt8LA>r$;L=ki-1!fR~N!2=YN5VHS&mf^tC7GT)E+7WC*1&SNkMt;ABChk+-xW3g#a zHol9`jW}e+h3@v=ao>Zxt@tfir`=78o3_|aR#{`r z)DLNhFF!wigL5hjViK&NVvPtK>o2LE+z_)BJ-|JfL?dSYc!zCynHkS9CZ>jw?u|(r z*K=Cz0JS;iL82Q2+L_f5ADBEmbpi?YfB1s<#@X01#pYD8Rf@{ToCs~n;?`i2}WXi=(x<@Y(Mqjv9Z)k*V2EJYIr#bb)Z>z?kR)y zx7NBphH8J{ry~*fx%}rxt9L+gwd|UXP;WfAaPwr;0?R0mscn0adgbHIPYc=-Hj;dE ztE=Bf688`q4$@zi)B)i1ON-QpcM$B>i_PBJS|Su_VfdDZ@qId?Ap6GZ(_2new7l`j zwQ(jI3{VO&gT1{O!qU(z*-zDv?}`-@O(eixVHfp5k=XGUM>lz0`cqWzQJ;Kx<~_SV zCV0e^ToOL#l|{u`dSM32jNDMd3GB1!$L4x5$1AWX9&0AWYL*>t7fvEuZcyy!$k8rbPM=CM@ccZala!X

    tC+Bfo2tu8prv3wIX7XD zfVP>=Ms{H2vN2BYN8oJi8F5>${&Z4NVmR_(;bJyB#AbIf;RincJrT^>&qgGm!*Y{3 zuI(ys38A7KW7!Ht8w8!7UVCHw(mfj3>s4gK+i0=cC#&63u_qFV#heZFAjGJ#MRwVu z{JDD$$HTD@-wA-u6TX%t^wUjIsSwDf&Q{&SjW^(IN0TB4Rs*(pvIN z7{v?kcs`HCuq~J=YOVCXb!il7ZUieNo^uV$7KbO`0g66ea2G7qIrZm!u!}$VRiZKhys?d(O=`mK?`e zFJ<#b27c#QetU$uKxuMCiwtly4&hWyeGfO~!Kcytk zqx@egQalQ6SggqfKEC^aDb&R^lysVoow)2KqSEKz+2+~Upc^m|BN^$pbx+A&z{4W+ zqTXR*N$M6K>^tG7olcmCOl|~0V;cDXE1UkUb z``D4ex`Zglc6KgWDwMDRpztK*srYRjVAv?jw5!_1&rc^T3&v==P{8+s8>w(Z!i;C8{i}A5gBp zGa1s(4&DhjdYh^<=% z@!Ra;s_ycjtz^V*tFT8&C5ZUI?^KIu`cZxKGHKADor2C}*X9&wZ5Z3iK?HHFj+?lh zJ(fq1gHA3H4n54CYH#PJ0Xp{XObu;6b%s6RR@o}=NY4Zn;B5O;#uCqX8SXE$ z#%|CB>b;h9udHSUa|9$f4$wP@3}Qm6WnC7(a6s44W;YK) z>4^g@9e}>5iT}vSnlVf6rarliynD8Rt-5UOUwKg5zG@HD<%3e?CR!u=%sKt+67tuk z7Al*`+tLcOtngM%#p4zptsTr{nz6hFNroZ7d#pMQFrq$ZE`@Q>P)1R|^Dnrm;n*9hY@QvC-0q8-a`0K1K z>fI#F=xX(HFX;Q_Q&P?m{%s};m`Kt?&QqRJa%6oU?NvCfS^a?*d3v+C~ zeqwBDlqz#CusTOuQ0_cYvKncUq*Aan_k2XhB4nYg)<9anluak{54>k+`+pt z%L)_@2^)l26EO5lZ|ufBlSBG<>wijYl0^UO*>S9xcmu-Fu=?IGms@#zOECr~p!{2V z#>H&SHZd>KI0N8XYb+|25>^Yy%dop`0eCIE4s5o$@|P=i);SCZ2IDDCD_j81GB-wh zXNTPKtLkMsoX@1N(O5J}w~;C!1W}VhZ3ou{($C=a+nNKq$<(QQgNZTux)3D~&XlAk zwPtV~AAPqwx|~y)q{Y>c`aE}=7#FEQ8Z0`fgVoI0F#JeeF))rI_gA^6df2gplCOAP zp{}`?!5BP>oqQDRqmaqA6NnN{wW}RT8b)dRLLDoD&9rsCU7TVGf+%T zrV&W!9B8hTKAbZhsogEHtq8U#7wY@CSql|c5MM+FGF=JTJ1(bJL(E@=N?g*&;>$)> zxjH#Td$7=ZXN092EgvB4&%P0Ty$M7^f9+ne(qpktb9sP57QznWx!k`-9+wzNPi|#) zk}EO=(TE2%VZy*aY@UOs&{`>YY)&I%r!NwtZ%X>&pbZGQv1S831bVE2&Bcqh%6!PE zXFL-!`ebvaWR|ks_l!cNg;FUNVNR;vA}l4++B!xVJi;D}zsXGd zyYS0+mhbi#lMwfixcO}^=R96QYSVFNat`y#rqZzK>3X7mOL{CiT@D0I>m(}48>wV@ zQ{_*8eFZqJ?N$=|GrkSTB^)oAO{p#KkUSw$kVHqoHwegjq=JtlcAb8a&shx{v?F@m zb(JUwml8;mmRg=1fP7g=0hE0!i~*}OEOVsAT8gwfo>yX)0Fywzj28wD0I$=l-^biw zsH%T1{u$M}!Z_#fE8)8e$t2i5*Ia%|qq?IzaoD=Tayl8lQaUnaLr+V14bDNXUi-pB zhuEn}+E6#e>G_!OYo&H9j{!@4K!CIaB(`%Z%Np$b7#}~@B4XZb_Yo;uBJvMmB=M=? zg?sY1KR9Z>nC;>62p+n)9}jABZW{NWUyS&*OJ6&tGg7P@m@MOEj^UGR+#*UoArU)! zWf9M!{<2KZ)492+Gde+l(zNB(BTQ>Wo|Prnz*iOV5>Bz)BOfHf;oxe1!qAxxw-}7s z-@7f9h0kfv6E3@rSc60FMJ&pghYHa)xl?vJ3yrM3k;dE&^Y~5}{0y?>K$3r1Dn|Y- zgsBtk5esox#r(mDFCmhZtU7?Rp>7FHL5D;_d?;sg4@RwuwWMX|(yRbJ_&1<*wZRLK z3xOkZ^P}oI>|j5>ln|;<3xJJGS)EMa9xhhX`@yf!5S}0?TST?{0#Z_-A%S-c`g3bw z<903>_l#mt_SNKm21Y%VOCG77^ zP!%b7bJjjMR~RxtA$UwGis;Hy9j4^t5yj7FuXUJ#cf?xol0TrH zUow35EAE1Y8Av3_5)07Mc|l97-$@|L;lG@`H*izUaMe1imN?c$VtEMLK$xeE7 zKD+H8BjW0Bn6zH9I^9z|nk4nmPdGZbR3_I)g-NY&8)QY>%wxGjp8*vE44;U+LU z$6D}tL@61R7mSSE&@X;T{op02Wuac@c53{E+YlPLl*1D9NeDFu15-BDqLP#cO~Olm zs^W!=!$aV?d+k!ea&RBEp;xbNzzfoBt9kcYzYW^S)-^=-+gckud)KUp?Zn}c?AgJf z8MapL3);WN}W z_S0`YDWdY#K8ePhVjy1)B!Bjt78A^iy+A*>Nu|lE`k8GcYhexD=mc_Ro0@}Z&+iG% zkp&W7rkMKHj%?~SW#sMt+wAq$Ba>FQXPzt-JjH(E`mCQW^HjD0NmB(j#BUxT0<->W z-IBupa%a;CGVbUX_FD;N&G4+`f9WtUuvW`xTb=~`Wsj>d7Hd7iZAZkal5Fsn;JM#u zy+xI*;m9|LVHE%!wpP7cDM>fLpp!qmZ2+DObIS3B!?&OmIp}t+c|$>rv;^j7t=0V4 zr%+wK*yofI!~SdF+ze{$g&3d+G)N)FT(*6ShC`u?jVJ2tg0`ogNTOgJM+S>%V^Ea# zP){&wo|)tADLb9e95M;3%W07B*eDthz(cOwCj~;wvME!y)flSA=N}&H|6G&E~RRoyo4j=d*>Ei z%~e|^RcE#Smv5t|%}OHE3h=YlN!KL3lLKeo8b9tw>PS{?TL-DxK*jTcNPqh2Cu{Nv z&>7I>%ZdDK;oFT&30b+^Y!=amur3BwXFWBdXp5Ay#$-f+zP^%F)74}$W00%W^*eyg zK2@K|2_{diOg14HN4aR4LN9kP!_&zj9j7(kG1$}oDptfNQk1Ugd%NSP@*S<%C={vd zNt_VFBVtsvIff>Q-+Ra6fI33oRn{|goUok~DkG{{;=@3$;=OwzcV1nU`%)aYbvKnV zn@aDN)<3MCb{1R|{vAAp_sO(X`DCb3A$F<0+JIiNNpvch9B^YhfyYIaE%mV$Ras?< zQKHeMpy)zjYxM1iof(muT3)C->?u#1Q=T`vS47a=8~l-L%>~$$&3j4nXp!aJZNX}# z2J;LKQ)`xSE+GjGTpz%vI5TTC6geFHW&a9C4xmDlfU5Iew`V~oLfS`#15LLKC#l9J z1sx;i$whfltTrX*W+>3@dK9r(7-feG0QSPyV3rx|mWX#VUx?wg)#&YlPy88WIbsbQ zhQ!sgs_W3;XGTOW;4RP=E)yv#9g}rK(zqZOEa3?sd_1?Zw$@#Je%;!s9skC04E?%y z&K*^p)@io(8fG_nUJFPargv?pkJROCOixlerIf1^LfQ09z$RX8$9C`Q;~wa_g@>eE zk;^f7NOB{q7b;Y@X0MsLjb8|DonPU7JH6f96$C4U<#?NYdQ>z1o8?*TbjY9i7p2ab zo9DMRZe|Hyj>(Dolu}{>@8Wy$S>JSe=gWhh@%^Q{+0J?@8cPEcmm2sY55I}5rhMeP z*qJgMPnXR@XBP9Mkja+!mNU~`q{PB(-?r;T*=YNdu?>@m9QoW6FVbduUAgJo#Y-xx zYjSWFdusyi7mfo|;aO4S^?D`Nsn_?^mx*>BD!WF0Dj|@TX*c0_2FHU-Bv8W>Q@>>Y zWE>Memz^rR$ZQDIp`Au+`X0OjgIoj-n200QyI%BT(6D==tvN)|r|Pel;8Nasly*YJ zM@fkmMn+)Z#*|qp+9>-1W+oFR)*JBC>z@)JQ_|z?u{;#v1j{F$ucECsgtuw{Y#?83N2HaJ z2!5n@N?yuqS9JRm4q+HwB^aIDXAc{o%r{l=XMst^J}J*rj^=s-Hyk;YH$~<+$0aR* zduOTqLfJUAw$lT+7F^(B(fuEs{kM+2GFM09u6R@Ej$pHo{ceZpAAvzvfSc2r_b09m z=O&jhUU(&!8;fRfX;ZLqF&_ov5}!Qe@JLYHe*JcVc$yt8>-7_Ls)U4+Pc!_W9=O3Z zQ2fKl6FQO2@r3!z;LK25&C7YB*8_;m=lafa7wP__!D>Jb%k^a(Wga9Y4G?eIa+zUY znuPsmt0vllN&;C4;o`5)#xy!0(GX~Ip;vpIfy=Si36ND1B z!EH~CvExrO(Uc>7y~s(|%4-|_gUwnzjiJwWj1N7DwJ>qo z)4&1nSAd0~hQ|`ojVisVMEV~z z$+t?nS4AWWzq%Myz-GsqQ0!D+3PZn5of(i>SFP1Rk<_BC53ily$X>N62vspkLT2-8 zJo`>#jwT@gWA)maj^tMGmbU+VHE+7Bn6Ix7>h&+!qHfN(1U+6_qDoq{};Wv`QemQo=xu z$T^pRVqvWC14BCs;mXi6L_w2ko$t^PLoVRni4A?Oo7IX(PzxH9f-Aa$ODYb+O$Y`J z7zHQsr2D_d-dmFcGgPu3_Y<$E)5&CC*cn`e`6zZ&LADzVW(ilMf22HX#0{g1NwDIc zAKQj1a|*-aIP$KfbwXPsW!yIE4_zDF;Z=Fr?V!=vGh0}{gNA8&EYwa;HP!9Fl!>04 z*$9%^duV#eQPSfGr%mpBqEy`ovk3*P;+s3;;;wK@g-35W167}0O8zaLcwt7DS zu$e6Rv|?@u+ShaNH0hQZ2L9Wz5XRSJPkR|;?9W0-h0ufCnGX!M8w1o?=shy`g&NP; zzeJ26nv{};#vuiH+KiM!W%k8YNI?4rt##kPZ{k`?TbS9}jx<>B9cc3}o1V61I3lf-O}BaUop5hg*D6J5>EE6~ zf~u^lwZ5U;A`Js^4)lFa4mynWdqn1Qb~B7x&UkBjyKLL1Q>)X1BBttFOOZUR^0;#% zVZ8py?YwGqq-%XX6cj)>QmyoyNzYDKAy=~nV+(pGxJHA{-2U?3Xu_y{+{P%kCHY4U zi$2NPzrLsQsnb7^@EOaoM9&#Qpgrur>DmV5N#xOMkWBMt45%Xxe$L}KMeNYVZk_+E zM#dt57RAGF_(SaJ_t5{u(7YtepcQ+@K~ap?O?kH8OBGPsx3STU0h&Ki9O$3N4(sO_ zxdo~~$FK3eMMOP{C&&wWoID+ClAdQ6HC4loht_E_(gR_-BWnA^KXyk#WRmsRAI^vB zxq_cBRK_dq6fFJR@hEHu>elNbu@i$zd8-uK^oq#7*&b&dP`|(YjtI@4NF`mBSgKxV0Q>^-M;Y9-eF-^7sO=jiL2j6JfD%_T^|Jo9(%)=V>6YWcqj^Dqd z;h&nm1=R@7mP3c%6lO!Ak-<1p2!l4nzE_a6E2NRd;Gw;{KA{z5W9!XgcpX3lOZZ!y zj2L6Q;g*PWJod``zZi*c zmwHkI`w{%i8k}xPk>iUTnuGr%v&_Z-_yo#!iEvq{z~#(f&LQwYi)EKg8=kR&3SBeUKnXiuNV^Jh)U{ham2% zwP@7)E^r^UcDs1Gl3fZ(EEY~{o#Z1EaTFcYIA~c<47gr&;#cfs$rPP8`!Z;W{kVM; z6_jyyr+W(}GlcFt3|QPoy9&5B`AC4r$KGQhf=4LG<*@TA1qz*;{Wtnkz<-sZp`U4v3)nP>c zP+-;oj^<22FPe072*1H}178Hf^?VW7mnrsEYNw>L75Dse+Ra&)TStnM@_30-_H4_D zt6fR(ucGyhENW!bpcS|l2&;(ve2Z4J_1UOG3y}?+j988jYicP75lYjD(~?@UmMH`3 z!NH5)N=8n9Z8r)5B<9~@Am9&dQxEiHSOZlx3_G&EXSDRLIasxBiXDv4?w)i zslD|P3dO98q%ak zCst8OT=w?U)rK-X0XF4i>zbiCc$O;Nqs8@UxHh@yT|sV(xI5By5#y4{DC6)PK0D`|Vm9TDUVc-QHt+Yp=kIs;AMz=$i^d=l$t^eu3dlagtq3pA8%gx`8qVrmnk|t!K!YX#2g6C+6yPA@e}uMT_k(j z=Z?N77-lxeh!wfDd+u5Ps^V5D=MktI6!c-~tPFekAox8XY9w`afr*-**A7;rXN==0 zkXJG0*qN6U_FC^7{|<06t;{9+g6%aUX!~=`-dnM+JsVzpjTYhQ8o~D=!0VyY% zc*nCfyzbKf2xy-~)k77)v;jacqIS({L^5y*TFi`8>Tl|u^ z%A{5S{<{VyWX8U@zYrEWO75=h*f7vFEk_T;B}J822oricJg8;MFiPB;N<0JU`*RD+ z)IN0g7fAMn6JGfTX6dJ-TSOm-{F;?Ho^ zc4xJ*Om$-W+_Km$%Ce(aAKX5z zpN!M6auyMRPnv@<9P&&Ppe}l~i9}W93?}vm+V0_)Gk-#b2XJQ8NsM|?;G%H@s48kp3RPPI5#iD~qTxMY;Sa^RjPHamWMDHOtp zMU9&154ctCrG~0B-a++Fq(h`)cMf)XACd3LiN4byN@aO>o86i!|Np3P6 z$@^bz$vs>lXHUC#Zav_X$<#HROTsimPaj-J?#)zz%5y9k;Jsdam^m0o##?P}`Mc~H z$}{EhA#X3?^w)qRE%!#RMS88TMa~f4R<%jI52T8t{+>kSi+X7bh66$x*@B=bTUw@L z5CliR2@Ag>1eCOB)9o<8j<@*ICTutORyiq*QF6n{y7e%UMDIU)KIEz1mF07x)WZTP z5oSMU&(te4u-w7AE+Uy12#78{fXf=~%Ka2&9~)ZO(V=OeN7?uV%Hy4rnjCwkHeQbHN3zkMg*;fm@rxRfcpo&vfI6Pv6x9kVBO`B0s1bTvY8Y z0#_4+wkExEg*ha@ZY;h&=Qi$+Q9K+lZO?gOsyV>uG*OvhAG~z#+=eg!U@J`^jf6U^ z`v=Xuv>NAmyL8|V=kdT<4uDRbmBtewJzZEryB31}ht-y9Oq>M7s*R`?{aQ^GJ1gYI z)PI0ovTLWSKrdY_^!h#3WyR%*Dj>~zSOXMsn!;*Z-6;CNzNrf&X0Xftx|;9Kth~7f zPph>Dxt)CgIaA2)akA}Mw#x$vzgO(C>2=jlS=(Carhhq8xOUs2ZmYRnYr{BHnBt3` zmaiK7V**w}gRDSc+wddXvN*imFA)~Qy_)^Zg{9h|quQ|_=^OD6@MaM1k3jmEOO~>* zyIau0`Y0|5JWQ7WAJZ@f6`FF9%d(j&0qs%4(^+vd+F(k1J?SLDYib?WJyhy>Jx*RV zGjSfzSAY8mMy}_;wf^T&Mr{JDR+~)UX@)&?5nsNqG-@&rPym%OL_KtZ!Uv{#k*Jc& z@$+^5R+P_W-J85Lh8AZ*v#>*X)XgLGeXb0aA6rvIY&Sqjcnx!MQ%&|Ysv`XkP?a9c z)Tn!@<2lE0-b>w0oE<0Q?PS{z-4Ec;2&_vH1FfbYvJ>;K+)g=@HYjpBA#(aoxG**! zh*Ad3c4!(*S;^6}Tl#4IV*{4g-RQm})>nfhGknZ?&_Cew#!98N=ET!NIPFVDZMUdU zXoi~5vhQx>R3{a^4l5Uu;RZYX086LKQh0Kx#$;}iw*pT~_)u7jKH^>fhJ0b26|-3p zCImcr42CfEq zm_r2C=V~=$Yn)9jLoMh4M zbcbXq(7+A96w0OkOSSp;#oKAQmW=d!>*L;+T`;Q|h%)-ByERwp1U|eWfuU=}LGVSu zo@F+|B(vMe`bM%=ldeiaH1A&^`0X@Prvq_U6!GH6y4m3YfbIp< z>GXAv3d=kkt4(U^%>oN0(%Wbd7B#dXD@8MYXWldYaQSiDx&}nC1Z1GM%Bay{qg@QjZyNhrERRt0 zSVEAk@&!I=BHnG_pf*3 zE)V^m6B~DJ4f;U%!r)K_I6q+!34`votO0q!uCxVvtMhnV&N~@zFs;r~k}2MiR;ml=qSW{=_>BG5b_VJl z=B?o|?Ql23`d8=D!aXc2DaQ%n9>Zh8wRh1B*$83=h5AS<+5=u~4oAb9L`I-v$Q!Wo z@Mno@_6#G+)rti=y2%C7(bRLEQ^ghS!jLQ_R}{iWv5g#bGB*$rT+8dIoQkMl_Z%J{ z6!-L!L%hoaxOuH2^~1%eZPrKi#iM2O>FR)?yHlSd?pm`){o2gyY0;UlMv3H@yw8ye z*09Dc`7;@waiNgAQw@|1q!qNyEkhKF4Jk>h@S)cr#$D#bI_gs_7ZM?BV{-YWHyCX+ zrXL&3WQT0dLe|DB_oJZuDv~) zE3(=;+Hv8`%T>?WASPYH4jW0T@i7h?}o{WKj-8Z^0x~N6G;# z;d-zSf{2C$4Fyw~gcjokj{#~>7o!fJA_l7Daplt_xH{=Q|4zEoof zpm@ny0_d3|Z3_4*sx+5zL6!%Ma=PH^Qemg_MR<1(XhTxEv|)M?<9o5Z5Mg(gl?`7Q|EKHGl&S^zc>+UdbX zciZc6ko|vMD6DJ{#U+=zh;cD?J16{SWg4sU{{cK)m#!5;`|f%?IBMWPoe>9D`9=%* z22>FQS)w}Yo?hx%3_Z{`>jf2NiG>_*Ai?9c1w9)T^#{eXUl&^bxC>}l-o{jbcaTU1 z=)`R`06GsoT`qt)J5LN@p=s$f_r}sUI5kwYd*Sa<#~6flS}hfXMM9G^sA=-Ek&wnv z+oS9PTsFm{nnpSf5I&^5X-T3Itear7 zp9cF~+|2l4SL$b_1MYASzp2Rr(cM35TM@45N3yULgtbrsv-)1uDp@uzbrMT(hr7V& zh+sN=GI32`!#;7OcdP}xW9hu4-#}CMgXrfgbJsh5L)~mh*Fo!}ha_-HgXh@8l#@WYSs#WMh1o!%VN$uhxYUpbNw=*$onmnW-(KVy9JzPCClzD|8~E0xG!xxsEk z+|N^$;y)Q*SSdO?n*m(A_pTu)rg~_=!$;C$LbEiy z0poM5bvA_n9&aJr+!%#8t#38M#zD;1LGF^q|G2Ko+vYloeB>W4M6*Gn&IlL}gm+f( z)^-a?M1O^@<3fQku6fY=m=e0_zgUaz`XB%&{0BW~DSlb^=C<1Gvk56Nn{+Zr`P&ZsPc|Jc`GTLoB6x8sq6c;fLn zZ`m$7S&$?@q3-exF{V>2#p-CKhw;mq{l?#4Sr#Zb#|}ZJ7~wh~u7tYiLa(1$$2JDc z)#;U3tG5npwLw&F>l^e&!bv~xi+YDcIdHwFUv6UFo`}k)2GNG{^N6~tgk$~xC{RnL zIR|t5|k5_SXk_xCGbcRW#luK?tP2|u%xhz<+2AJp5 z(<@RXMT5$gr`q|)_9p(J#vsH<$O(2Z_&PN3R~ve(7(j^CGb)G0BS zHs9Q5)l4e(;DMR!?_SeTq%C9d!+@>rO7$m0^u8_-86JK@=gw>~R2Qfm1Sg29{J=DV zRTCIbfO@I~sg9dq`p#go#ZJYDCADUQyOJN{<*IC#Wv46shZhTL)Sts^WgWd zag4Od`+4Sr;rW;tv>>opeF{?RjdtKx*GQ?%@9}2Aw{mYb~*xE8#y#n(iQxiVno9*@i1zywxrGD*6&M zA};!p9}7_O#$@rt@5FFQ{7_fbbMrPI%?2iDH#7Yu;p$2hg>2p9bhY(Me`e-t|;~S zZ)Z@SOWy$N9r;2iwcIosL;kLFfkx8hk6sx;M+KQzIL$9^&v|LEOif1O(De)eAezws zqHHFh$gEN{eAq+>OxAi?I+mHF9EO{COzi!}l*3)HNEt?dbz}~^R^SUH4651~l&vUu zPy(uwfV`iHgpAaUJ1MU+(W}H|^}O)HV{H%2IH~!xKuN`V^s>F!aT{_z%$j16xH!+o z$xLwkPg&8mJOn7CI2b$w!}gLF7r|*COn$8AGQS7{@$d&jCH)dIiuIlCqa z!I)&tncbgJZiojPVO%~MV0@i*>FG|S@R1CUNQfPT+3X6)F;8a@Z)j3R2b&wJh}t(|W5eBQ-0%+5$-&U}`&-00Yzz-!QPn z)H>-G&nt+)^-BIu9@B3Ezn}4+TcOZk4&^+TnmhPosXP&9&~c>meL2QdJf>_0*}^7ET3 z`9pijCWZtJnjopqn0zd2nr{%G6VCeU9^cL$T*3?EXIXHtpSY95kXvG{wL%qM=Ur4| z0@bI+Md^|Q;HRmU(>KIfNtDDM%cmZnom%?l{{mPb)Ue2Py5|>1P7~F@``0G7F@&gu z6KH~10oPD$BQKzGVv%|Zw`=ZdRw`nx=i^l4>J^#aeIF6Qd4uxydSZ3lb zHG^lCY&%uDOQe6QadEzTKvpwwx8u;S+CDSO&`|klBwP-Z+!X)s;D$=gYr}j(TcxXq z{D1K#m_nz!xd{Qw2f2f4Ov$0&0VVqlxRCU&816LG(U}cc6=7(T971ivEESmNf?t3? z(mH% zb7AViEkhMT0}w#6SrrDKf>CSWPz#}D9NMhOu)=Jtwgv{G!AaS_E^W=zffo@he-?Z3 zwXqXuqU<&sdYIlRPqZBAT}J~SCconh=$An0Xsz~s>7w#{A&ZLFFR+ozavMpBSeV$E zV8EpRTLD00tbX_?_gYU%%!^*JT?8VobdMMnco9T~%KmcTr8l=w?N1Y5bhI5eXXAnt zmy<~>-NzG?ht*f4^EZac@1I5gy3V_o-P2ZIkXCuke3fFI>4R$A*Evl>M)V%V?-kqa z`C%cXl=Tke^4a?2v)_6OPr=E16Ch#tq3$iiX>3lDR{>Q#Ef`?ovoGrrnS)hc%m z?|k&Y%*IqIH^i-HA3f{5eYTmK0@iabrVI!QcgFYWSeYPxU)2nsx|K-yde|>gz!sb2 z=5GY_$e_{V=S4+pCyDUUZ$b$R%aaXrOfa=d0vFRZ!FA3C8007#6{zwpXeR7Ck@uq2 z!8GFkIhZRjO^a+UW}fr*8S=Ed2Lk-tB1x3E12?Wz+6s8&2x+bt{ z-*b}GF}7#*w5F_b)O}IU?1bPsjt{vkDjlk9&_aUHu5(%MtIrIkDK}|p$sRk9fgK_# zI{*rW-lD3|s{KzPPpv4)1{RX*ClmXI!6VnxDV6ez;kN`#!Dg$zL7GoUYW$+HXN^B?rE3Yh6-eR;3GaO_>Q8e6EE1?Z{nto+WRFAjQuC4S5MZepUHWbXopA{AfnLTY_N4vY&p2b?z}9pgKk+PUA9aovXJR;# zB~%olI+Oq;kaV8!3+nhdV@bf!$(qUK=`WC*^NL)K_t1Mm9=^~Q{$r8qVu-!-OUS*= zpnueRiBav3J7c)3HZcg+9j0$+g{e=V@ACh>h#nCH}UQ^crLT)Txt}M1Y^)P zvX0}z{Am!^rvzBBYYx+(5mn_^_7)0SJ-cYbuDq#<9Q zmK!wsfU@{cIbo;tL@Q7OwCMN39shtq(-34uQ9x5P@htM+vWwlIg!r&6jEZ$+K+B&% z6^2O8U-D@7J}K)!KXjeSBT)C}7_}7vC}Djru>1?`Q(eAf$9#8F#d%lfj1jDsH;WwO z@xm(S_?HQ5qbIEtA^{>8)=M|qD=6lC5<<5oj*1qrP?2-lfjp5Nluko-sbyao$8*|o zol}^mbjz(aD!6McM$mxvEY*u#b^D(YFf_Dw$0D!I@(0qon`CfQGn(8^82Be&T<|q* zlfSNKG>fP5yZs z`;=^kNwz8oYn$QH9#Y@JKwj5nX`+{(WG!aDN_RitQWkhm$Cu@^g02=iHMHl)fQC86 z)Pm=)`YX#$M3XjpstpR~`n$-^5E%5GpJ3nev<-l{yhnB}Z305uHC-arW<8Pbh4zmq(VB(ra9V5yA&aZs zudt_h0=q~jV46$42oQatGJF)KD664?AqORgl}$#p_otS~XN21;z!J6v(V49&mD-}x ziIq)Nq%Lb+y`emz;kZvl`0YLalvS0{MjWWnmEKEGpIiXsYa0toF%YTC(WKq%emtQ`VVDnx;K~L@()Z3?UxR&BW1Q>=t`TZQD%Oxi;MSu5 zmAAZIA~i&1?`aN20?TN;p4^DQcL?h{BMwK8K;IN7%I*P)?@>{Klu*K#**(utumGaa zcez{rYWdh;c9fg~3EVV)V*E*0wtAbnyhA{=&UV6=r^`7De8 zj9fjzMIo>E92=htEMyQU3w6o_GmkP5xFn1&Os571!@{@>ZA-U_?hXaBhKgEtq~{Ul zgi}6GYpKO9;dzX9<|1S?pY3L9j>tR~)~0CY)luJNL>|92WtC(BUHzw(&o)zRnUDCu zYmEXWcavN=6Gvq@CuCUEu)R9#y{bE(P8ZGC$gf=`hp0!Stj{>C(Pfao$?V@B)kyj$r-xn zmYl%T96b3mULJwbSHCN7zAQS&jhEHUTp&Lf81f*l-Cl6@>$ZdZ8tkrjf)aIG32v>! z=wOSM=(Ak5T_C*c9UHDlH)|N1Bg+9^3lnIM1`(VeNS>WEBfDi|h9V+XB&bKXfuu0m zi0P{2Q=5WBf$B+56@_+B_}bplI$ao|^*v7}%NRpKxDu+qy`1gOL`85gGKQkbOkRwE zp$5o(B(7)Ft-sp}i(%Fg$?IX;`p4Np`jZ-zy1mJRhRW$SFrFak)Rh1C3zQGbusy-NKn{XIl{UUV$(`aiTE zBU6O1aNJD?tw*8a50UHpc%ij0^D6hsee>UHDEaOytbw?i26a6mc5FL8P0ae}p8N}` z-2qDo^^p`w!=r_gHy|mV}H;@BRRafu#o{qJOK2Xf0;qLOpF5a(nWk z*MoAQ;dVK*Bi65mU3fPZZKHZ2rNk>+GoFRn_2G$i&m7QThh-6C219XfV=TbBS;@V- z!m*)Jz}5*`+J~$4P1Ck#0Q4_I zc{%HWrW7EczbTqR0S-_9NEoguZC)S7ygBHsZmhypzl~7+-vcMA9V6PYOJ{w2ly3lW z?L&C^wOspNZJJ3Wc|y?-LcI_0ia=S)!L*0VVyIiAf7@`)T${!#Ad~b2It3?;2=p(C zWhW1HiPLP&B0{V`mlpc2S`9y^Tcz<}L(LHCi{F71@pZXQsYpASWtGv?496D>$Xb!I zuz*F^&bXo3NP}3XCA6goc`URf!O$$67zbiengEZi3Ic}`PpKNB-U%NBG`!FbZC-Gr z(>#D<$bl6#ko!!cY%W%NQWd(uSV)wzmMR+IgE-X~>>MRo4KQIpe%zr|Q)7zwhbP{6 z|H5qE^mvqeQ<}KLxX<5*Ym9JH9My6~6+XTJS8}1iJ&_r*iUXmdOKLL2H9;@y+`J$;A%%S1qz^qRo9p?!XUMNA3L|t>Ude_QlN~9cpiuDpFi`gckr$=oqF+Dza$07s zG8mj>9bIR80ck3dHDKGDBl>;O@q*XH_#_1J8!Y*URtTV(R2aOlG@^~7fS>(U#gPLC zQzZj->F8D0jv=ukJFIHd3#rP8lo5mfik~BFO>|Ql9t1(FN+ev#&O{1PV7w29$I$?3 zO_+z5z@bd3KPy>=>U@{AbOZC={vfWdV4s6 z%5ZK1%rK@uwVOf@?^|^kA0)h-TqR(8DNd%^)v6Ryr&c+`@j?%P1g;2DR!VqCnQ8_P zp%q{ziCOC64vEZZ#R7;Np%Et21`a^=>$F8t>noXY(Pm6rR`6N~jB}wv+IPY&y%lo# zvIeps;~B~Ep`-Yh@7<79geq@9{5xoBm~&HDtpupTZcOEFH?T8<)O6uPJU#TbB<2yM ziK5^SFVz13+j9c4+{-!YjA|YtIKre3`>202aAa%g<~@rDM>F)MI}L4eL#RjqCuki3 z>VwZok#4eU`ByZJK&AV7Ihy_*qcx5X`Z3$SeB~3oxf?~D`d?0LY!>^xj~P5HqIT(K zPBCh9=ZA|1c6ubjC1otbJqqJD|vj)w{( zk6A-=1D1IzI4WMl;v?tw$JgwHg9_0cZ)>W;DyTKfX*3td|UJ5^us!9FtE6-oIB0WaKXwp-LHl+k$Om2OwW zjF4EHp-w5W4KdNp(eh!?AuS2WB~SJ+@AK;bkIY}%4Mjoy>&cb5{~Ygwtke5Y7gG*N z{5ZOS#^SrY14WWIYb>y_k)zibOeuD%$-b8=)f7$=F0f4bEr+63_>LLM{UE+gKRe*5 z!LJ$OO%JGUSlxb}a(MF-C@`Ox`8ax+#fx+TtzT>|1zq8;xs4+iA-0JIPwLzX!#yup zAhe4B^954e?Y_X>b^z>r_$VD^3GbzTh=Y=$76y_Sw|N9Ckj}Zb-g)6rg^`|fSJ|_5 z$Jcv%yPzG=XP>Z44HY-pZ_ekq}7sg=bQ7T;7YT5v|_ z@{+>Bo+7J}7W#LxrE#qDr}>C6tAtI!>zS=>$e8F@c6Q@8IL+;{HqfScKVE*ogqQCU znxxAU0z)8Qb%Ww>w^6Z5?xqFN`7ByUpLL*?{(V?#XgEek z&PN%AIo0t$fcDxC!cb1Uo6NeA{_;sdcBAeCW1mTQ-sm8vNt=&9Ft*)W)Ra|kt|FIm zcPkYe#Ph{Gl}@3B)>;kZ?l+%rW~j`$BB&^uK-a8sb2kuNgC#=P&j4msQYN-2tSF%~ z+FoZscxxnRls)<$@~+35{As?YzCJl&faa%?)Zp>qvU0;q0q9ivHlwkIk7V8r%187j zY4{8pDbFRv1dHd7c4AA24D$z|&7LZYByjO7&mIV}$23$h=ZAK7vx=8NNkRr4cS!;! z=c(r~8j;mK>)1Uki7Rd3@_p^JbQ$^NdWZoi%>38xsjD5o;eh}9!$b3Fs-^!5Yo=|p zIlTv09)6f5nMzL|djra&3j~|&3stCdzi^QeOM%<&)`z-AC+^U z6s7Kg{gRZY(*N?O8!TD-*twFmsS8ZAejD>QyOcAVeHgcpY(q~3?t&|^6;7Yyb#*`( z8TOPESyambo&b(7TA)HHyOH|w6w_$ zOp!^tvcO|l*S%#S7sA|G-}0qmF$|)%Q9i?b81G$+l(GT1Kbs?jD=+_hWcg*OJGBXZ=WEvRbJJhrzvM6D0tK$3q?cDtzE0IPWBP_2?;#x8^Uka;upq$d)hv5N?jV z9SHPkxEIdrrVEX$9fHAY_W|7mWMJqyR<}@@Y&mjX$2g$yz73&ZUe#>Yt8lL4T*k4N z#lPm}26-MWr!JN`@Yaq?OG&pY)@WAW<8WLO+yq@^RtRlNO@q-O&FxM7-#Ec+Y(Fjk zPAc?kdl`XZpGkhl_%F?*W-JSj9P;loIwwtrw_FEN;Qo0BXQ1ij%FLpRb7!|>6)JUm z`1u*|;KIjz9DGpw%>1_dY9i`5)0u7ZcJdS_r8zF;tuO3=t(bExs@&DHGqMzobeZ&T z1V!vtG?YKG)k-~H3DEbKVRhNe$|!`G|<~V_}Yq+!~^(vpq-Xm<6CD!pmBl% zR{NdO1SH@e0km8=LEDvS{DG-Pk8*LHF4Pv$fpUd~9%u^Ho!af2y=BZ=xxC~p9PYfs zQSaEhwVatoFwa!JObJZu9GJcTb4*7H`v*vi!= z2s2RUCVjTnO@LuxPbAlY6eq$F-i5gi0zNq<3K)!LoP`s+lHu|Y;_s^7MeWrmWn(U*)F``=6fUhB*Vi_0j2(23O3->aErI)#X>%;(I9#A`0uBJ4 zeze?I#)peL3!>Svsj;Jj;K9psr!mEap$i$T13#Inct26CgCN5W14pUz#lh!xLd^~!sgV~E5-CR0mG zdy%i3dY2!8K3%5e8Gtp}SZ;JNJ)UN|d**;uNv$%zNvq94W5bfxmtBSWf1fXnm?2Qe z{+eW>K7B>Rn050?+7A)Wu#_Q1UyCdzB_KZTR(*l0c~Y`hf(Tr>|HTNU2@*t1DAZ*Lr278Lyq2UU8^TL%OkNN(I~Q6JH8UtW#Q)X$lX4K?}aa6fO6y9TbQn zd4DSd&NOutWiLNAF?*XF+FhrR=4V;z+OV1YW3KB{*Fd7aLQ7?Df4HD&MmG^NpS)d8 z%j*Uy6YYJAdt^N$f~gPEvBHW^2ql2>a-jqp;QNp=7{ob$U%DP_dAi2I^hUo83pcX#jXjxtRsiStEPos~(sOB&;#;7?!QeP#*%A)(PP?VA#YojUy@x55x{ zwh0b{82URqIBaD;cEOtSec0-6>Htg6Mp)KJJDJggZH^K!Q2tnFu;DXU`120Wfj8{^ z)o~6~V_dl4re&Gw1mr{kLjmwE4!&GHE(^FeLGZ4<^1*>9qUnJI1Vz0E?BR*)%##zk zYsLM?iDBC-RMw2I|E8jdv~!TlGZ!MC^$j!go7Nz6dq$Nt3Ks@WdkDa&zCN6(9sFl< z<%7`if8r>=Ht&FYFUL1TDdJ}CSsHUcDdy{uvWT$QCMv*_6lO0{BlDsjJ#D_@Q z3`Z++h2XIdaa5hZ?sfvSgj#x_r(!xoK5y_TtZC;m_3|NO9fm8Ea_J@l5^=vEI?5c zKOq*0-QoCquB$&h_CU}B;no3aJ`>i*6|ChgRU42w%b_pJy;<_|YrL0J*vtNojcsVr}2F_wU zu}mIzmdcM07?Lh!myo{VQ{;Nz{`` zs#N0a^1Gn!{i`!&Go-1kN@syS87POH4A_f9J;XpU`+pBE3?(5@8?NA{cQz)S)4l9% zzEuRH>>Q74{+?l9?NS}tjPTRg0<1eJ$vh9Gm4dZ}7S8ApV`mk~^s*9_!0HA01BO^( z&MTkE1jH0iZ63LXx4rK&w2G9E&i-dP81ov2=P5i=#+UGZ2IJF%CQ`fV4hqR4AwHQOotwy z$^W%0y^r{ngZt~IYDS7^9KVYjBMwCUbb4(IEboamV(YVmOgglUV}|XckjBbDMi2V< zbxYZu>Li@_@tg}YRmA&27!b$qAJMoHEIdH!|5nSXBP)p=hi!Zq`2aYto?S2$lNI>W={aQzBL~1UB!PZN$c|-MkauyI3C1^#NGq# z?T0_v#cSS(jU&~Tqx)H}{!lR)F719t{yufYP5_c|{T&o@UXuHxttQ;G@YF|nX@JUy zd+$_FD0aN3HKIv!xwf8Ig+4LIHd>iZ_w8|6eiTu~4*l!;Uv`slI!9Y(-O85E3LUFo4SUW!m7H<*LWni0pt@RC9V6`2ru zC~kEMW)^(`7{S<|#X;Ip?FwXX&5ADVTDBw{9s{?VSZ}n{YWNV zeBs_e0vqPjq8cA8gb_{lVZbmG{ydUE=7h8mz26!lIdc|*bE16#;Vw<1*#f!i3c+Fy z$0JCj#$a^sh4-OCk?RE+QrFW+;S%oxYVH)QS^2Fbhh`u-;i?Wn`;KCJs?Mb;t(!*; zO}}K>g&nxsMiRHDs&M7`XD+Jj%LAsZe*Nb)D)tDX3D+5v51Hb;T^Wvo+u+zD9=;q7 zR0Y`tOV8V)CP9dtaaED=mL8Qu(SR9CgJYiNg#;FDM#52RL~?7(0Orea8OjMDT2DyK z9~fVZ?E{gM@_e)J$Ey2=7CKWe36E+pOR)~mWf!_uyxrVUVTJ7zKT$%5y!Au(@@D@c zJCumQ*5rT4rJ-HGl0ia7gU0Mj=K;Qb7eM|Kz)i`u2%R_lO>fz-1X|9fRB@-s7XH$S zj~elWPT?k|z0ui4``r4!VVsKY@T{F_%M)nf8W5b+A2W1Ei#AlL?>TF3PYZ$l&=4?* zSSIo!H+YVVBBe~Ma2#7q6raRx#H&Gp*jP|%DuSyiO&z)kQ#>ig0pNB71QhcY7<2G` z@A`osPEZ`uic*zmFMoPVkyhwqjZg^(zmXyQ=0g(Ck%k?F%-e*C%PBD`@`o?rZ>yg{ z*@FZlf*w#Ukiz9ZxCZ)}s_A?ot~`*S&y~u*O>;vR&`UCluCQG)BIp2mROcgc6Yhc1 zDo>#{m&rksj0Vr3PcX#4A#csl4hCn18jlNV%g6j#fx0(=QZeGPaQlX(Nt|PpyWW|W zl|l)TNuV^`H`aN1)5Q;q!qG3OR^XPYs~PNgON-3 zsLUw(@psZ`vXrgHNQ>)N<7I5Sf4x2Wr*jbGktE}vqqtzmdl2Z$G$IddI{2pPr2Ds4 zBJ;36@AKKvV6FK1*q=__XI6Ln$CCRNjL0Lr2KRLs-9=K&9|g&Bj2pvP zcp-v@9;ys|pZ-+Pix^{4kxX;?W132_SNtzGmHv&EodI8to8AXO{!4 zItH%i5``WHeMZ+k7@63w61%z5B_;{e8syFYViZNwn*Qn}xMezNB zmM{LZxQak9CX@<9cFP>DhavonNjm3PV<=6LJ}5|fV)^cgDPE`-Uq++WOGlYgV6(JY zF*5mD7QvALS5|#-7szO>DXbQb57&m=Xzdj^BJ;i9{~6{dzwuz3#eu>6Yj_*W{4oe>$kFG_n@6mb?MtC6QxJ{itutysfMc@Y>r zCINyIOl$g>AzI{+B^(zfm3#YDwsW70hjPNr@9VXzN!sd~(DMfC&w=H4WhrwRMDU{@ zG3E7Qtq|j-ap^2hebkp#lf28pPm;Hg2n03G|5xY#8J3ca1eyv)oX+_ONM4Sr$WFVh zIZQ^R<_%6=`Mfdb?6C9UipCpg9+mK-NEHEV>6i^n#9gt_L2Ts?O%U!+ZCs0X_R$0Z zXGy5{F>t8|%_F&{OAzaCUzKobk|8OxV#< zOik5Zlo>-0$jS%abSMBt2^PO`L7ip4JoGp6!No}7^J*RJC=G{n+RZ`oSbTSf7r_n_ z+1Ob)W+&+;25QSLOzpT~=mI1{!n|qijr(l}GLGxqNZodfa0t|-tw3w_-@pAUkgZw8 zWK%rMpF_GTQc2x_6f+mYUwGdVNu4nl>X(J=zBssJH1$Dxllz@0i=Vlh1UfoTx`qJsiGAO?mpsQxQ?2 z5$o9;%XoF(1WY+K7zT_4XzLDZaShM?Q`?WR7wR{>@p8k~Rahse^)>ROg^kP4Ca?oi zObaj>>DAPnasX+anUBirQziKLYFiBu`yNmQ3{hPq4dmIy@)C?#29os5lshcuLVix6 z6xEx^`7OFya{kzvM3!(lKDDzx+!ws&3uo(f6O&QuQ%|oh+p!ipV*3%KNXH{gh-eTR zprsGT4HSm%lFjJ?R)V-|0O2wvosS;?xpuP+JC1BXV9^;)RoK%u>G)P;}#|hy`V1 z0_U_iiW~B;F+ShAP=XC;UAzGIaHe+qXaX)4MuiN^GMNGYVc3P-QYExv(baALWb`nU zaBQ~*bz9{C51bK>bSMyYzQBK9k_P&D!&t_OOxRT@@V~#B%jHrD2(1m!ZPE*4Y8Z+R zcq5>H3C$(iTY;u$a{zL=;DaymjmaXQKG19oIZDH(?L`O<_ms)_(=R2&u8x?dCSCll zDY|EFAou9Cqm~-@KvO(a1RMk>9KTta!+eCEOqpROoYJ5Qtkhz!({PPi9Nl1koJFpJ z=#UT=`;WLh4&knQ#q-fF^3J-q3hgY^TQ%PI=^X_zo|L}RxcQpM)2@}@22jOWUe(HH6v;cFB=C!+UP^P7ga?bIuX97P6j)W3IMuwaAcjsONV+_(B? zxbxAL@_kcJF?QP*$Qp)@E|1!9FbfhbY_)l{2EO$*BH5L}qZsk+4xP$J6K(4x1TLKU z9cZ_$OH@ll0y}q7La6sg{%cW=8?5bbVJ$<{;L0wCXX_jxPB#+xE)|PuDnzSp#` z!1U;A3CpJU%-WYt8Vg-pLrLO~GxlLJ-J=;j34ZN!9ZiufIcsjw*L{`AK&T7KYHu_Y zBav?&lMn^y3&(pk91T$Yko}Ln`mg%MmnM<&W-yo+Ou$(WXvEwp)H2qjbm6OW82rB+ zvO>*~-6W1KS@aP*$KQK;heC*Vc|@o50nTkdIGhz4Ly{bD4?EQtch5Oh%`!$)CeQ1b z_nll(YIDMbOohOUURRa^4laz-5c$EXei)wI-&6o_V6?SoX3;)pY53p+sqT(ff#-o1 zO&=ij672(R8pj=kT7f|~BZvLAGMol&%7ms#QPeGT#3Ep%;ge~G_L;v|^rOb_ozux7 z9SEF;r~YiYv?@xGFhkps`8#joS9wsTF`31uXGE%8}C_%qLtSY1b z3cwsmW3It1p5BfG#w&0Dkpg_r3$VmrA3y* z^ThzpX&LkX5pdv$`UeBdQvMF%8{-&7`#btt+XYXDcQ8NzzGi~6x`E=bXJ2yH^PeHJ zq-5CWNX?{^2Nb?m$5BU2*q!719MQn6LW?61lb%j?=<14}=-6@yL5hBx#yN=94S`tl ztv+k)0Z&PIT)J`0f&VTY7$f);QI6fqVR7j^JpQPxvJw7o$4gAQCa$bgm~7HXviku&P@yUYfLROFbK&+gNG zC~8CwGgxm8kTidCSfmox-U-}y=ALNJF2iOOI{!;?J?&={BD|J3B3dN}8_-h~sO$wq zmctN((+NMRM5)k}X}^H+{~&iCwhtX6Q#pIY?f0Y!@We_voG&Zl_4XZXi<&V$i2lgnL9 z=i-U^Z;iFSNtS*up+o66bAV(T5O9TNInJzVn`ZAb2Li#e36&H&;FH28Zdgy{NhrA%ZiMVrve^0eAJyf4)i(Fr%~Sg#<|0$sjxV;x(oL|^{>%d!DxsQM`2PZeD>xQ za$>`u9I+0p!mgDbN<;rkB0+*2Pkn7v5xG9OvIVYZlbde-L1kLpwN63lkUy26N5SWLB=be4F4=tvi_%d||m-E0K6Hw&&o_&TqS2!Z?*1r*Lmf zK=7bhfL;s9K$-r;bofT)+6M|N{g$QlcPEux7IxbxUB)t z{_Gr3%10theda5%{+iUiqPF967f4!ZR1_ zzxtt?V<`%TCZ9=vZoSk#eT~J0ga}XjMyho1J=Ktu2$w%1v0Mx%KMb-I?wff+yD~h= zW$9Nwl{hxI4K;0kJ6OuPe~@2FRQ<3+G;z?Dy|psmDpd?AkcX8j-jgP{=XePe6Oi?$ zHYA8;taAsYj_7#Ihi8s;wRtxG0hP}f0nMitQWr_1^2Wo|9;JcuiqoXGJ)fK4sm^22A14_Z? z93LLG&~$rxF$)fh>ZWD!5;_Q)GPYOS8^CvL4AW*yrw~c-4y>x;R9{}H%NyfJ<&R0n zu-v%rOZO%|b>bIVGZMA_)j_(Eh_$`Q2wA~4VPBu{@N^(+tcuay2ZLBq1PbYPR-$%9 zO0KO%X;cHIYex}@-8Cn;ARHi4GnkEmo6^i!xl}yYgS^8TOo~_5>*#Z|CtMG6gCLSr zIkO$w@i4rWW7`7@<&Qhjzn7eRmxC}GB1OPh6 z*+u#D#1q;a+DDn@Mlzdp%A;TVv+q`ywX^?8Jc66Yfpm#I<0q&)Tn-p*@CqC2Uo{hd z|3G0BavsDYB84|b=~iKJmT$+Qel&4LC80v5P&WUK|ZA8)ebIkowXo$UmB*SZ% zo*aTGB{8a!C9<-Blfnjy-JhhhY0eJGNz4~VML&JPs!7G*+Kz!(U0lb!r>LW<3D)pX zFj;dt5@sxM1^{qG5q9~egr?>QI22YCGG2Z>oPntLdM9`SuZTtIl=_dap z!O1m1c?EJMv!E?^4K`a8JKUc;u%yfh(4aGz?TJ$(k^HL!LmbZU=(aWw@E;*Vf}3`c zhhf>n+HO?{y$^Mc;9h(B}k8PuKeLH2l>l+h`fCZs(#z>o}Kqq~-c>WZiU zITOkSRRXd5UMtJ~4WMv1L1uMSZ#nf>sQs%>b z66!2hzaFU(h=Z*m-E7!laqA_Vw=Jn(%DtjnpTUENri~C?N+#&((O3g1=6F@xOAJddM~PNvgo@ zw{?Z#(V-+`woZ)yBLj4L4Bsf?)7(6=@s2CVq&cQ=ziSJ2%@ZdB?7hx9V9QQQAW)Q| zXjp&i0iBdO%ZM_CMwS&N)#HT)NRDkj7VatrVq z8J$_XUwRfzZukR%CseuJGGb~iL~0R^w1*$@qwx@izvM*XXJO@P^{Z(lAo=R7iP>_^Zp%z z8Av=7Feg<-B^w}R@+e^TcsCj8soghAJvMX97(I2`5DEr^yS6aQFOMLwOHvR08gk{R z7naS-cVBTpEe^C24^RWCETcRGA&q@?q%coVsfZTwjTzDuRd+V!*LSbLD$3}-27Ui` zN}RYn`lQ!{uHh0e#;-2_OVREuz)Aw{J3C;J>d8L-fVAY>zFgSY-MfZrXh}35i@!=a zaeD+-oR4x+f}!e0zSx_wE^^|`njdqMDQM$m0*`Ry8Ed?Vlw`{Ryq|u+^axFP>O?(BvLi(GN4f&YowUT0dV_Av#jIgG6 zfOH`&532VKOOaNGe2&Q$`A*Q&TVau9{p8_ze##~QkRbm=+aljB^0_T7lH`H5*rUoY z`3tBVJ9<+FvvD1Xu&Rfc1h*XiK2IrdXqsmx94W#d$Rs4KN47f6#Sry&o`4Sr{4v|Y7Gb@aSuU<~$_un>lGyhBQ~r52Wh$(@^2#zVFLiNAA3nu`va0u_ z+EMiuOJFXX+EO%iqeS)RGEgi*`PW$nRIIaTv=mBKu1kpia4Zzb7)sMLMpxyAcInooT2FUv(a% zFY)(Z6NH2|`|(Dq#ER@eAIPx~n&$_P{_8HA{Yl_@*pzX@c@lRa7#0j=a9)Q0tmR25 z-ilPoJX(avUM_rW3nudedj5M8X|Y!R`^Z zf#E&|$KRB;Y)c8I3nn6JBAhvHYEY7)q_@0I99#%3BJO}pn`_7Vr8ikP7$=CxqeeUfo*dj;p@C+7Mf-8LxKD_c zw@vaxJD^e#P!NH(wMCK5l54+JHWTf z5WFaJ!!nrTmUrQP>hSeUPy?x<bgIiaA?ff_2Zny27;JwMOkquD7 z8m_C@vi-HcIq$3r>j0@NzKskzV<=qIonTVKI*JMtP zC_*^gU_vB3*7y$kgd*nL4l3wyH(`N!$JzMvPfV4%Iu{Kn>@P{;pJP z#&(^Zk65AiBdf89b|?Ho^L7}w`N!cZ>v6lyPr8w?A4>=*{ZC%D4B1-=a&7_)22QM- z{S_y3;q1~C3CYXUx*C{6L79c*%p?$7k-Fc6I}y1}g#icCk|g(4-UX_q4lR8=2xpg8 zrIi@eZTaEw6|QMg11dE=nYphyUMPZ879I|CpJ%50ivC_#GnNjwcsCDSk-n{LYY_?) z>h;oGLVXWzaO=|aAYGv}4`KW=0Asdh964)q4A)s26?|-fv2C@KF&$XOvPyO*8JM-~ z*yFkSFzil;yd;K*vZ(Q<;(dUQhQ9XB@%(%A@We#gb{n%<$amvLZUU&*M{_Ej?#V_a zZ5i)7pE?=%)1deEJzbA`{@(R5rd1UqEip#SXGH7^`IGqL=2qEbF3QTD<$YT&9WHPJ z?Bl7Z)Uv5s%dT#fqv9khu~no3#1rLU8nz^J9mc8(dgtLj*hLgD9=gwnyQV)iL#wre3_@BSCOnieMkl@Smtwn<;>3)>b76HG&jP<)a>ENwI8+k{&BJfFzn9u=oV4$H((idy$oRZwJ2Ez}^IPL}q`@+0!+>E{w&oaUy|`Df3y zh5m=5QtV&;HzTq&-%2WOx@FGQV>>p`H@1YUs(ra7E5NiojE6~D$&BXL@=a;)Fayz& zjtV$liEI36K_C#8Ero(iUGSOBa`4|C4!y(+u_$%LNM{;t$9k^y|@QtiIzz+I!MudGQ!q6en?y zQj<*=M;lQ%%`q1z0FZj1>l2pKfEnoSvpJ)Y>&yJ|j$-$02U?&aKz>w}SM~OkV#=Mq zVU)8jtGdlhSBIX!XL=`|r90nMn~>fQ|p6}6vjCzGkx0%1lZWmbIcW)y&@^A z_eWIedSNOp;L=G*0E)?Yi|i25MAnJH-(*vTn9_E^rL`{H!re zYPYU%Ela!+8>9}O|A?!ftq?~)FMNf~O_SsMwBi#{Ajp25E)W)rxcgLn%E>kMSN2>B z94xLA!}@>FuYj9nfA>8DL-ql5H*^0e)9_+VschW{Yrm2$gX4szNH@ZI**l%ZKI`ka zm@HvrVm@LftON#tN#vlfL7@4wo&7aP>_F8YK<;w*#3*t;!K;-Nuam?o10ot9!Kc;( zd(&!2whH>d1WD-vr?Md|Mr#p5`{;>zY&*@S^`z>$Dtz@nanIA&8Y(hW0q3*&`9?mN z?q`e`4?dpr`V=;V(}}J^j#^>)1-n)?w#2PaPIQ++0P^;Ku5E@D*|1X*X$&<1y*vRj z+2w>-YeI4HJ`UK=7Pzqwn;v;16;DAm#C?2O29{`Vr^E{K@*%|l&=G|61&=)sc;YKt zZ-x*Nw|yQDdSo- zKV`2c9f*fqh(~O)_wklY=S(QJ*(rgZiJ%2zg7pd`A(4xne_1d3$s=0x1EF4MM&!g+ z)O#yJ#ps0KPH`Mx(Na|Jhn)J4EQ}r<+VE>6=;4_=jWmRguh32OU-R*Iu-;3Iu4)lw zyNohFgU@h8baxvl3o^07H{a%f)OcjYwf%}2ZJ+LwXSj~mpqf?nor!B|CWz8;)fcmL zI^&_gjw;iQ=)GJFJ03lSX#Ll@lz;fE>EEMD#5%sWh6TQOUfeEN>)!D|yT^Q2&#^s7 zNR?ZKVI=G_KH2y~8g+b0@0@DUiuRxuch6)yT2{a`%C~Y zyn}jH)oF^CtU< zECo!t17I}n*Z24umPbC3rCq#!0>3O1T8Paz4GsUrh#r&zoNX(VD=ZBp<^2HR(9`&@f%S0vEh|o!@H4{ za-=NVyC$wYlfkPo(I=45OyV!q8P3o@_({u0lL~qwxo%Js4nMgy5uU-pZRF(wxuALc zTHZ;g^Q^O9yYdW!z3K!5sU?0Szh^z)ZzMs#;t1lt6j}3Yt8ksS)FoIFLz$gGW);i5 zx1ycnW+fSY4VVz))XM4BV-OkMEyfpg4qoa@vCbdk)G=I~SwA>y0 zM?h>m^|Z6YoDjQk$v5W;4{!C9OcqlruOB$2Ib_#S0;9W!!e^rZaW+dGR7>fE&NHg7 zZLy1uB+UiPN{%?T(^RA7bqA^~uYDhmX>Yt=f?x+~uL%^!Ir%=acP-o$4Ecf&*X~XqVP0YYULCX}P zX@b3* z-7l-kt`gpPX#lg1AE$Mn|I$hct?hOAt^D`a>twu5Fv@gk8A8jFj;}u+Gc)+(@!?VD zwWC@8{yM6nX>fwPz;=cOaZMx~vOgnWWc%EOv|p9jbtambc!5JeE?a4>Xnik<8F>PF z9A1*44Nj_MA6b9aRLCip61s)%Q1a1pQeUiL9-{lXEBqTao)dy8`XtFK7CA{#oa^yW z6{0+)O;~L5PZZcDw>vDlVZb|vxDw0%MJ8ZsS3~<=ng^{XE6x8YPc!=$`)4d&Dw_M@ zDS&jM&=*%Xr;&;_D3P#s-%;=R1qu67u6u@VQK;l4cyTMkQp~$w6{tPvImSHi#n|MJ zpG@eI8v=dm?>`#ZxP204lh5~D6^dbFD96g&7zm^@i1dN%^;^pL!LddAg`H6f`y>fR zRf_7exBRkJC9<+bf|{XGuV{RmT?KzF2i2V9pG zpmq-djtLD7N_+^-P$Y^x2~!*>-e2`U7=j%MgJwkShA3ZX)zm0xDL^x z;~#DG0Tnk4HKCmj`UaQsa}3Etbw8JV-pNkUhzMQDV)o5YzYGMDpial+%YPXn;IN}O z-s<>FzU@mg^ATf7ENsZfBhwwvQx7-l?p~nD^6ylnb!)R!MGpj$Hd{qk2h} zo0!864z;$;#b3B>Yp1^xi~m?%nRHX8}KR)KIdv))J~V~=Pnl0V$v0s2(60Iz|P&FjOP zu`DHTILJRKoPp4YFOI2xNP6!jq{lddkUpcq+0JlVC+tcVJY}RX?H6A0B!1NQo3A80 zMn`cT2ERiG!wUY{B6NUNQu}-qXx34Ql_^Xns0q}aW>_LwW3#$7P;I2X#u>^sdu7DzPI#$+ zcD@mp*h=;DTNa4=z3EXN$yQumZkSG#NV}oLru@`)mJr>TDBwsbp$OQJPXzNpTDG>h z3`R2o$XD=T-XeDkb5C~#u4lG=`Fr6mVtE1QIe_3eF;tT!dJ2e;H4Dfa1BXf~mPGdU zrK#L0auXZnZ`3>49u(acm*gS{6=I7ydM6}JHEx$LoIo{x{QOP@W>?Og*XEca4Zrvb z4H3Ww4qTp0KjF4hO!{i&vEsHnH

    `mh+!Ou*-Ynf77^I!hA1=;A$pK%^C#1>(YfK`OC5ZvRr(Ubyu6l=*lodBePBEE={s78{@u8D5vwnP<@8=+;- zHFa9Hrv(_HJ_)`i+SYu-WKpG27-kyO*fs0=Y z^{qEVTIOKB;52taMuq?yF`x#h1V16C# zepZfV2CN0ZNx&)@&qowk~fO(L)6 zy{uWptN;=e535HiX843XeB;>KlL|ZwSnKjHn`yf2)XQnujD5U_YCXU`DWB%X^^_+_(N-Te+d{< zsls6}YL@>x=tPcz8?3f|vy@p{q3JOS@-;PCeci5k`Wj(V8K5crk!xec={JSC z(OV0}T#wA3CE~CA27uJZqURqKtH=mKw7K_QT($ZU= zTwC@EVaSmbPw$ZYH(uuWmZ=bB!y>TsBNG8FwgD80&^tOm#p=*Ccr9IJ0=tTVvoB#_0wYW^vk^uAu3Ma1E5Nr0K) z@NxO!A6D{YTXgto+1STcXB5=s3Hh+j)D=-lWLNA>7OFXv>}cG4mGJEFke0O{ji(s#`Ys8| zlF<&a_RAb@7}dUFHHZO^w#oV6rg1Z%ixT9G0lK@P&YR(GN+?uq!on}ooLmue1mwi~ zkI&NR^K5(~zW~PoD>XiTNVZM_n0r}v6o%wF75i~E=FGjWQ^0XjFOv3HIa)kNHx-fC z1PtbH(aO5s_*u8-Fbncj755RsNat!l63m+Aj9pA3!A~tKDmLf7v~K&2Dty^&eQ$zS z{)RhzLG1Qy@-{6M-zBj-Q4;Kpc;XsAL_6E*dY-TNvi+Y0`nr{;p!BUY*(^w01+4hF z7dWc8fOL!C^J-52cDU8$Qi>XU5lK!C&NT#p;K9v)rPix8IT~k7{M9R6m>s6(M#UM(yKd^_Gx2KLhbknuWO{#tV*6SQzDB9smRkM zZy9vGlVCS?KY}t3z;D5z%B9Yrb@N0Cn(=Co<;p5g%fF)J(Li&0mqgbs2yIdLDs(e~ zA(3?`mgX~*!kP3`ey?v!zK@bzEQ?{E4wxRUHnqDhf@<9p`&mCtjaKPX%7r4YPV&;z zvk?-vlV(JCTX-MKvarB-m_M?X?Mn~l*riSL7Yheb#q&=~A+3WqyGpz}t!!D?5&Bi%v-r(csChbHZ4xK%i)N-{8;(qJBL>*EMkkpw-nWXnH zyLLr;`pX_Y?yp>4&?kaB6oC%M*JqSRt(OLmqnEogq0cS^c_eB^_GN(4?i%fltN;`&x zZWScwucjRaE_CZ%;jCR>uSL(Yn?N3 zk*Rc{#cZ07--^ApWNQF@%+V`}wH9|c9F+Qdpy90l1n#=sb|FqtAzM!#8n^rtUvCz- zwZKxsd@Y6Izb{{S#!CDM??Z3v38Cx zZ4og5QS8IEDoJ2trV?@>uQ9G3EF-TEzp+|d@YJ9UFw)G4eL44V&5dD`dDu>>(TTW= zKkXhP=h7ewm=qwo2dH>D4c7`X@(L0htXYI#k5F@!L_gEr(meruJZlns)4TA_B#>#4f)|Tg)$4!OyG03{Y8|jwJeRZM@(fJ(COPl{ig6SU)If37 znF$V!8o1+ek-WuW9%hsvcFB0gN@jqyS>Z}I{aBDMTTt7PY3(rh>jY9=um<~9Iy2Z< zheP;+`0);H$T zEjL|j9%!$o3Dk<@&)v4`-L{jK)HC|rhm;EUy@mAyzQ;NyiwT0IXiQNMBa>8)bviFq zccerLU;7NApXR3v%7$|=zMnR~zqQQru3;hBG5oh7(JEmWxLE#|!+i0pnH(ol8)FIe zXfj%Z3xs(Yjgf?674-V&fQR5LBSQxp9bkJou~ij}I{Q22JUH=e1r+-dNM8dmeC7rq z>r}MdY)47NR=D)(N&*EW-D)vUs5QZ2Aw++jugW6wTY4^0b9)QIy zX5a6SHmv}u8Jtr|gXUzz%Cjw<{}ev_@*^}6UZQoc1v3KXGtQb`X~QN~$EB$zvU9A5 zSKn+&NJs8d^Zq>CM86Z~srZ)!GCqrHl#!|A#}=*{J`wc>>PKAla(RtYGWlwNg`Ea1 z)G3y(PnvU&0=!<4_l~!+{9wdP7>LP&l%SAJUY~jJGAI*4kDOH|9{CZL-BM4Tp#WnZ zq1HD-?0IP~0N}2wEpe2$2Z}+HS`RIzw`7-=?&@uILQ;!k1k56?ww29QsWihoo(PX5 z1p!Q1V}F%bSfKOCnsqDM3EPDUsumma3(4c9#URV*;*w^20o+i2c-8Vi4tgk-Yh>F# z`ZQr_LBIr4HeTKQa_wxM$qJTbAYc1DC>Vzg+vIN7%$%%!8)`v=T0FA#ay==#j8m=dF@K@MW_F8)ese zw7&MT4yA4kpul*?81ZtWrURtoFqqe7b%-g2ic{1CVmOG~+8i7@<`FHi=jCj~I(^*!$zP9#Vzr2Pyr-g9dm%hES<=AIhlxT92a(9n%@k_VXUI;YErpW0(m?Rt^HV59MWZOAn<1 z`96NZTQjiL5kDjGNGHDLnDD9~w&Fc&9{>al_fiQ{gRt`R%m3U|FCMQ%biZp4cjMRm zcYX~qLNc(NF&yd=3gtk&_7nMPh-mJb@CXl`HiMYSYeG=-y$z4Cd5gZVt4bp9I*dL| zM(!X|M&xfDZZj6enRnCmGBM~E+bIAj6tX>!B^Q`ZhLKnG3PLi3A}y%#NB*#S+jQn$ z<^0rJd>%*~_2{5L;OTW7Ok08TeXkWw4I&|1$9^!aA_QO#CSkMpd9f&=RkV?t+xW8B2dXmkIx)3UP z?##5sABQH(@=aDUmX)!zufTkdfQk|7VE^ak)Jt@s^uV<)mFclCFsUT^NHAuu)8Cdd zEHqrA$6_uEGo8|Ce+r=aE`XWmI;wr4`)ihS9betwee#x_e(UkD*vvVPnG9h%*lh2( z<561UCU6Y083iRx;mh9VW5qYt1_iGRWdabM5Sw&LA~-hE1~+F9HjBkm&V4GXT&pD3jZp$2I!jB zM=@)km?{Ekbu}siJ9^-UJ0ANygO*(R>N#A8E%s0YX8sNd7{0*%|3KU}mT_sLberqk zjgfT9@5o9bo+{6pP(k<};WHw+^}=+=W5|moe=H^B1xnk&Mgn+`b9f1c8Ze@03hmL5 z-v$NKvoB4nIV^az$kH_v0|?Nu`nwP|nBi5<;mbSS|Umrx06>o>p45s_J_Sz>7|pH}+Qz7%p#| zTnlS~yJAl4&`?+$xCWl^TUFRFX_Jp^8V|PHx5ut^8;)N5vxNw@>B;>1L8eZpd=D-j zbq3hCsyJ*Pchj5|m|UQ-!$3=;Es2q&&!&9hkqdjH3xNs z`wYy~Hhs%{&8E}R*Zw&MiE5n`+O3f8--T-BqI4|6)VWHKM4nvK^*N~9o1mPY^4vPG zs3(ax`qQ%d6Pdq7Z6Vr01H$RUVhO}Ns7WmQhn!&{R_6y4CbGuS$(oEr3)y3n=Ysh@ zT4tiacu+Ju79+UWRMm8xAj?^FcQ}Z^jKo3z@2m)p#_|Pg6KoGdzv)Xe?92@y{K9fc zO`{qbIfzuY(Cl5k*B{b7+e{QBs=n?eClE&y!chz!7Fc-Q^%;Z*o*?rjZsmAJT~)xH z`b;)VDMRf0+hycXS2mf9juUWw83>optM0T?x8`O3k=M$3sQcx;kKm8 zFIKz1%Dp-mrgbl?|nCzqjWwLj+Bx0@-Rig~a6Ea&3iPZHjv{vaD zX2ilcMNux&GvyLU_39k#s2s25O<2G=&&Jg6aZ@?k_$fVP7y)B4&j?Dl918ikO9hPav)*c!);C*v-0 z%9E4BVY(idAg@GsQmIA|L+#9U6Y(M-IibrOJQ27!ery~NzcN0eEeFiAtj*YiB+wOU zq{XmB?Uj?p(EMYix1(2d86i&-u^XOWxRF%aKj;Gq)V0K`=|@;(3Bl@r5$Ep zZgJl^UZv2?CiO|Yr~ZCy-Cyb>QahG9ye?{D)mx(C+2{)`*?1mi0G0la?qaTm?T!5C z*8*1B5_WbRuDZpHZW2|a3o~O+A^n714JU=kVPQDMEf8Z2cNTukeD61X#Z7| z3i~vwU|MrCk?4~>`d+|l9mLe@V0zdq1dIW1|8D=h&ff0cAVFWhf?r>Xp7D5@~ z?kGwR&e${jxWy&Cxjf?Z4{?gAjM&-s)UpIt`qrQUz$pIP(56G*)rpveLmooo8VxJP zyHQpvpi!lJ?C1fuNMU;;br}q1PiSZuZG>BU-Ih{jU+DGUyjYOom7_&*0P_|}s|N_X z8v)RB|Ar#6!sX4e96nmjjy4Y~}wQp00ir))Z)k33h%G)Smb8v=-e&sEMo%}z~ z8>}`!DPfT~UVk9e9CY|5yX^4wK}O`Jthqo#{45qyCuq#vLnkVp`@eJx4!gky9@CZY zL7ZNe#nZb&>{4WyBXL?fT9_dU-+67yJ(-a{4asVQ*iTh6)Y=)7o8F`5{k04}@dB!p zqzsPHm$=iQrChzHpI^rGTRsza5SF1MfBsY+uoLZ_7WY7tlqsFPC_lJXUDRk@Y&63} zgsbsf9zx_5CvVkK55~9D`FWvJ z{QY)rS3yGt!d`eRft~6xj_M>oV~^eb9wXX7RE=n?1;5$tD_rCtah`(`l?}@o z%Ktt|6ak--3$FkoF>6}-d`X>we&jcrA!|WJ@giI;CaV(%t|Bg+S}R~a8jic)3Pf_$ zKnW5fgoxo?$dKwaK(+<@y`LZ@kQ)2*WMZkikxoWc0}{nHD`k}HR=9B-ENdiiG0_Gr z?DS_#A&~_N_ z9TDTlTNlNQF3P8b0|$AVpilk4$?ut6V*NsKJA{SUA5`~dvoH*LkLGKg=3jttLPjq8 z$_XG~Mrf%&F(3F0I#l+6E=G<+egrPwi%lmJ1#&79Eu+FNV-BBEQ8`aYIUqLflL%T5Y1S;tD+zN(NRiyM?BFPThg)Sv25=wMKJ|p&W?$Rs= z;($k*+Wp(NnXys}v;i?2LBj_yiv3edC84r$phQzm*aw{&pc#D2xf#ZMJNj0TTVo8% zE2xH(^~8&to*cDneB$@N=mb zv#b6)Q1(udTT1G15sk*M+GIuG=Ar9NmyVymhO?O8^!Lj~eXH`f5=4O_;WqQs zrK_+C?&Xb zFG6`ywr)0APA&jy`AIEhAk&f86V}VuoDBQLf6q)V^vd5K@mds1)Mzf0!b>f8Fi&fh z8_Zbe&m@$J#xsE9FXFHZ`!YClqSbn|%Z6AQHqV3~lhP=eznZk(reRRds-6?<`_Uf2 zRoiL)GLgl$zRWLbLZ+iio1y{;ukBWq`9G29nSlKFn87-Po z5SU(#PbX}1%3b3_cGGsAS#}=cENnV}KPk2~qK!Kt0RA&l z2{*DKBaa%>5?i=I-}a#;eQrZ;fKcSL7KcbQaF6G7Ux&x2e(@YA{ymU9DZIj(2=y_1 zDCs-EC~g=W#rWwpPs^?@E6!dxuK~60As_3m3B%ncyo-eqABGYg`?kvZZ2sp^O z)ZJn7!^S|}`OD;%mq@cahv`(Ie&$%q-x)em1Mvxf2n@+>rc({mSH*0`Hm@LFZ?<%` zgEQ_c`)|Kr{`0!fC4|24!IA_`>*$_GviUjWaT*bl=i-=fnA=yQNY`y$wZodBP@T&+ zCx^>mJc~Z|+wZ-%R=of7(|~Sfx%$7Q$ZiUZU>?SyFcHjqo4V z~X19f{bFKb5XQXDlMg>te5WAQ3hkSIDr{Sx@)gEkT{n3>m^qJ?=W` zwN{o9(N;Vw--= zSf;sTXEC4g@B!{s9S?jQ)prXVypVp2^iWO2Gd};~V)??IE2;O1e37qu1i6NY0am2_ zG5MA@2~tL*2ZaO>6*<=YEa<tzXa8_y)BFik-My@@rr2;d^LqVPvzqF(e|Hohg_f>v~V-X zTg=+d^#ih^toje}JHwXeBT}aALhy?ap(C6~fYRYhg2zjWY)e_VV(-Hq zdoeOr)J?Rq><16*jKQosEP)_AYN-_|F~EADb$-Uci{*{D!iW^ZwS7a4S)Ng29^5O) z*S?aO&j-pg^r$Jd3OvR2q{j8#7s&n4c#pbtF7}-3kJZP9fk2oRt+=ZfY{09KTF&jfq}6mB{*dD>7G^Fe+eyD;yc;u@Fzkv>S|y z3mwTjEsgPCgtro#!bZj=*~}^8NYvj7RflVxah3D`n=ipfziCH2dCqhn9hSUD+A=-V zFQ{XJy-HH^ww*Sj$a8MGU%~qef0G$dn9zb}pQd7CMWcd!9})@%$)38OBqI)x1hg?% zyZcyq+W*s3WeIj0;MRBhkSqXvAgk4B768qC42nUMyx1O87k(B!TaypYSx~H=U;b2H z8lWyYA9+^pe78`i!$(SDZ6>jR0+OH}GRMdNZeQxQ9eE}+>4SRXAva_B-+D$#R{V&5 zzpT{n?1$bP-F!A@i?|h+!c{}N|WcBbGjg$EN2maN{ zmslpmJ1wZ1#<;mLQ3v<_eNX#l+M#qKUuo9MeOq)-kd8m2d&wY3V|Ww=lj&JL$z?s% zjqWhO4X|RvAszlDBvtkQJ9HL%VrMr$%kXo;XNy_@_xm&!Hd?KWL|L&63Gu^_EtO01 z#TdEceLdKlP@|LmIWT+nLWuN`zG43XudE0p3D4SZF+OBrWD&ePGN0IN0GH>?BrXcW zvemiurp?km`km*RtyLAVFHVdATS2~8Wziv&J3~D3(;kbzj^$CpaObC=UYM17py-3` zvDY6xMoHFs6c*=i$kr6W=72#qQz(F=J(*kZp`)`LmSXK2hFM5bj1YB7ddChxuaTO< z!!h~6Y+$-8jPTZb29F1wEZL=$Jb=z5f_(LSBExyt>@afn9zV>=5lO0{AYm{}P`c6p z8v?=1D#4-llCJ|uY%|@@x=)1@n{Y?@L)Ya2wJ~o1GhmOyPXlL!L?zr2mrenk%OfRr zqa&PVL7pIIRdZ5!Dfc(TcBE<{jc(xbLX;s5*SyX|2!!;Q0I{t;k${#1s)*cPEEUZj z^u{$&^S;!n7ak4tK}I0~&Tq}+b-MDdsi6(?En;!fY}t~&RT0rD&k=DcpXd}4iMUte zu<)V&jUV%MiM1cH|0w+@;edP$5r5Zz*K;J6&9>^%NnCzILKM?jm*R%mb0-D9>h1ac znNrZ_M4F>Nocf|_Gn>)a2xx_<4IK{+5r7#615Sn%D)EE3OC1w_8KUOgwslGHzV6Xd zmz_%?6Rh0BscRn*QzESF=w>ATL9vZ*v}<2-FW0ms#(C||vbsv<5a);%VNaA(a1~1+ zgmtA^&(n{XTV8{j{V32034i{ZbIPujGZbk|X?J>V(v$~@Tnz4m)>MXLELPIt7$VGB zA|xxlblME5X4U&`L*q_JLHX zCxj61 zD?P3o31#s>7RgY%nfp`(ssCBEuuV6AnqG4RNK3qqo2jh#db>=;{9(NTy!3gue4m6? zUi#bozOkVu&o3(nN`0{`m9X+{DNL|(V$;sn){+SOG1>MD7EO;88>Q$K{7t_#f^DJ+ z_^aK~$vn?T`W|bvDrN0eEM;&pP`6x#@jSkxc*YuP&vX9}0H~L^IEVW7cCJzxm3kV# z4jsW8vH~<}W^bN0Q(;VnWrAjKMeHf<$1DfzZd*uGgJe+mY2zV(-hVCviHQW2edaux z!K`jEIl$dSSdUI7`B#h){*LOxPTR|FEZOP9aNq%CO*o9Ap=g4XGUC1Ds8Dk`17GpR z&>agGu@r;9GwP@>G`92X%cmUP$n6OQrT>4P&;7PbZ4a@yoQZ6Gqr$J{q_)_gQ?61i zrZp3Xw+`fRCI<}|EqeH6o-NPN4EqbZDatd|eP@+@^qOzsLvC$BwxY-+Q+|6N3QD!( z6_t7%sihuS;%h(uSmrrjBM6Z+Yt@K$hu6-Jkh+G3;4rW61btnMAWSF#dt$xo{az5F zD4k&_-{VM~xgy)(Yb3cSjv?0&hDr4?KPf+|`~Xitu)hN*2kI`9a11qLggp%^uDXc~ zMBNf3)gyX6MteaU0YujX32Gi?)E%i~m1A$}ePhE17z!Z+E&3QFVI}TUuhx+a&a6X^ zePe0r9pL5>8WG0eAVP`kC%MBq!C)0$LN8|wbG9sD|E;#0LDLMOp@ZX+=j|PJP@)## zLpi%>e*;Kiml|tmjWil!8U{x3-MF-IYT%@pbK-?E)<0a_y>L4Q@*q(=wjXY`JeVoP3T5gXnGe10lJr-1Uk>zl$C_x_PVq_m zV6uOL{@5>0t8JAmI%@{@;`@o=h`S&lD_d4lNPs;?x&%SR_wzUBF#>fh;y!MmSaZZY zU>_2E5s)#7)V;z7yLf`;g5Jk)fO%J20b8R}^(vrYg&LdQ&uXik308QwlPbIV%Dzxi z=caO`Ja z*AJ=U{SrzDYZa?cbX_f8sv_LfMGV-hA`V5SlI6de@i6ytOAoK$^=6d&HPj_z!Ccf1 zMq#&$9kr!@){9s!UYx3eje5ev62IuVSI!m;i}>_ueJSv5Dc1$vnLMz z1jcqsen@8H@ym+0E&}U%WqA8+abK^BvR)KcQ<%Xhj`AThYqhsvS`Y`Sw_jyNf3PI1 zs7pxMzEHhnD~ETjIKoP($ciSFXrv=QarCk1xwG44N19{dBl!rh3wu*a5>I_LPy6Z^ z_sTc;G8#WS@6wB~08#PHJNzQ0y$44KL(Spq*H&LzRA%p-YeyKa4IPngOIs2dfQ$`@Dge3})s z$?t>SXK@#4{qBwPD|;M5R7K)4z16(;!@7!lxoreM$hGa`&u!^yh2K*s{fU|z)ZsbH z4F{>M*zDHCHd>b;alIys?Ul5i;QT`QH>RmKUUBu|2VyaY>f@pJ8VA}RBAgUyw zSN!fk)No50r)<8K!vw-#U%+@+#-fs9yU5IZKrfj&%MrCWo?;oNFmSKyr?`gsDworc zEDHQ!*B^;57O88G4=}h@!noNLGkeo{)+iHx?fpqQ6&E&$1dJJFoo~R(h)FYXY`?LI zj;|(1@{yn@Kf^xWpe?j9I?|L9k&c4f!{)43tKvw%3%mY269GlKM8X}j7e35Xgc zhYq{)Z9B-OXPWRcCeHvoW<8n6CYW|{f7#J?*}YajKWe-U2(|L#VK2d83OIxoE##)R z<3eTm(nz?=q|FHIJN2H~`j*U)*EpI+(}dkLSek%rgN2pCl{e7IK%pm#QB!< z=)`xifqT8U@{BHP$<#tSqetnL54Cfu#mN0Bgf|CuX^9@gg}-q_O!saCe#~quj&5g$ z{6FxjUkak}$tIs;snuKdtbt$J?(a%i+$A>UK%27{FC`_gr&@1=e^}rovy7}}G zUs(}t$$5wE7*qat#)N8uFb>#kEhhWz1WKhdo!-JAN+ZHyQEF+6$D<{Zu{(Abe|!}H z2|lBT-3f;c+qfx&RUz;x_-ghvcjkxT?^In5DUD||Z7)0bI^<(}xZWAQ@*cWI%o}<6 z-8Ko>_;eqR-(-#R*6G84sgKY|OK*D;I9jgR-CvGUBQp7_i-6;SWnaq>Tx-%}$)^8bP8mowdy2^xXDQ){~y|L$6Zt{DG) zl+}(T;iEag6*`imfPb^$vr5FimG!sM^;B7=8Epi7Z^{dQg5l_mTb;b{gcSBOX?k*K zr}>FUv><%Sp5(L3jS(lX)Clui--U+Xu<4SpIz9j7wwuq(5EH}*r?Oj+oNZ$u$|fhu zdBlq^^2`GPu8@sZa{)~6E3C0Cmu!)jo)79SQ$^~6)GQH8o1QZ)S~t?hCKF9Yn4k>D zOp_KJjaIPKMasx*oqCGmU*NdvOEUh1puo+?2na*cw+;{weegPu$dCzs!zy8}tu&Z2 zTA;L!q@b(J$0%5WR(laC?dyOR$DxANH0PyQckz<6IaVz;R%z!9Gb@osvuOU7x zyx6SErUyL_K2FjmOGltqL$t8jrK+bHr(vtV`4QJgxov#8Lnk*7dL8QKmX!+xePT7I zAGka-li-w#LsXzJMNSfp>6=&RRo$MY}8Pf#_dVmkT?7MHvgD z3$#x_S8CppH6gi{ujZnT;rlp+`O65FOeU*<%3 z?c+)n6H7jq>d*f-9cHG9S}#vwc~-qQrNIkoxd?el!F$z*+IMN)vCLj75&~G zNqlxZ(TB%%TgYEYn8mUa_ctd7bVy7D)O0)%x2Cte@0sA~Io11FQU2y{5Gd)D0o(xD zSVnak!WNi+YMG{z^t}24(Xf=rlUSZ0U{HDs1Pb_(ROVF+utW%IZ-%BwB*7wW&&8`j&G`Bijz_-3H;B)G`j=JoM za0x1xLC#^x8baBrvQ$~r(_Kx1wLG4hBRD}X4K9700^crww=Ei?P|I#Vd?H);kugkySm0O-tO8zRom2 zR~m-gPl{jnX+n8KzT_9p^m+9~BHhb9+Nzg+FNY;W%gvKtfL`Uq1=5$>{M~yR)6{Os zGvVMR3c6FIdLRb+O%!3n*ZX>G%Ah&Qdf)MVR|TZjDJug?AR%`PK30KfIyL{?%BVe{ z?NUz=;B#>Ta&FhA&cw{T``&2_A~gRsVq13K)jHOL<>!{GiMi4~)y|+;503b*t=mA0 zl0=$l?USgZ024t1>&C42$_GQ;y`}|E6=92~$%Knm+k&0#PU9qqh2c+8*n8$N+B$R& zqVbjoRf%BIcUMR6**UUAQG)O=49{TDoFW);PY+50*C6C1mRT?*@P|mShu@7>!|wt; z&bm-sFRj?~eCD+#=HhM9W`>}>+@74J?Jj@Njyg7l#wINV(FEwgPklUv7n<$i_wdeqjjz>eAq-WdZNE|x_p1MyJ?CAizl$BbaO0{@mcgfln`#+>(xoC%xCrv z-GK)GZkeZw@NR~-<^yMx2n16ZJmP4aXky;Hy(K#nPnxCvCZ!Iv^9nAEZKADn$Rx=R z(7ODBsj^0-s-jSe?zuBMvUhJ13{*-=`~c~QUaiH}1}(+Q1*=ykZgJhYz-&o}$xRD2?P za19YqIjq1vWdBr*>2zfY-{e=G*`1HSfwJ)43Z%Tv(17qa)8Y1#CauW+IT0Y-Yo$?oz2%Cf8zl!H_J~0SegzZ8x?9b3 zzunoYuS>TSOlY#=5b)sWg@YZHleV;tTg6cNvZO$P-QsTanN_FYX`QU-S%l|2Q12*u zkOav{wVu`Wkmvk}b1BEeL zO-``&4GXdj7`exEho^bc6D42(86_<}lC|_~4`@f0EWcu-Y?dC_na#I&^!Ll}_+y@D zU>+!JWY%XFvf#u11Ek+RmL>cvph=V2j40bW@_ZJzM-kldjA<10OZ5oty_gxkoMM6% zpq?E0>}sSo7QEj-Aa;xs&@jzL2UrC7fK zCLMhH98oFfpr3_~iGXR51JUOvX6cu%D24cBsQ1S|yLy*aS{T4KSTp+o0RW}*&tQLl zQddW>K!pq61Fg7e0p6&dhRn9NX4@gR(mKe5cgo-o5e}33`&sfa_r|xHyd~<6hW^pE z>Px6AR+#dnu(V+jg30cdTS`{CBI1EE)Md;v z1_c=1yvvMY(t|PbyZ8J8sG^mnxC-Y5?Cu6AZ%eiqtER>_I|1Q6E_4>EkX+Ob0fTIZ zuqF@dx%~9!UvqzsqZs8+%>5~(F8=XoxdSXEEYyhmT$K-&BG(N30rK3Xo0Vn${k79} zg_bg2FQG>6^aXEs80OvWGNo`6hu22!+(S~wFX0rNqWsd@caG=IlZ+}ClW^4zFz4F! z+KGd8|EzU)e@_sLlf^-N8X_5z3x%er_DL#nipd(_TJNUHpP8K1KF!w>1}QPben93O zyl}!*ePV?Hi;Ade8@|wS?trYaV6$N{$#fR)I zE={cmu{JUwS>G54k^cU^N2!)8&oJ<(svmLM%Buh|M8Eh2%w)7{u!pLib$$pP$FFo*&Z~$pTmpX2R)$WNS-pRN zZm_2*JOJ%v1sswpQtginF-AP*GG~_8Ab#!c$VXm?qn5dbDIf9cd%cI-vL+g~-Kz;} zWD6Pp8yn8rPX*|qNO{hG$8V#yyN3Zf0#u6ODx8)?#o$1K2b;qEm$M%(u#E%Hxz!_0tKHa1mzr}IxT@r%|og>~o8KCpioFo9# zmN9Y_Da2Pvy>3eLy7i)ke*r zsM*s^^*ZcX(7W}+Kc#rBSRUB|=6Sa+*(W|HzgmqJGLtQ7dcalGQ32 z<9p<9aMz-%X-FLp5tH9QJHE>*<0&w{lYUHOqM!_hC3IS{g{deRNKJ=TrOyvHN%yNP z(qk<>vyFlBWb(JLxxNG?vIcjZG1TxmOIRfun|@@}3&!!SEH{Vemnj_(wHOV7Y88zFqKu>QYw!Fa z#SGdo+^i1n>6zU1EXePVXHn$49C?tXDUtiqelQ4Pq6l&LS*pCqD&fPT8A2J6E$wuA z7^{C*Djnz9;z0u<{ryYz3U+&TQnKA>RWv}Ag3;V$n|oaQgrX%6z0VAe=FmqVgGYyH zrp4zkKW)hv0e*RiiQLbn{t>ElAMBGr^D)fj^(!=^-+z>WiT zUJQ^d?)VcA?mbJW{AGg7Kk#l_Cg!q?(^Qme^$?{2SZw?w#dW@6n;C zG=`o4#R&huu=X_DGQ}W$6XnL17+6qTBP?31QN>XU0|5al5%|Q=QAa~DGQ21xS!QXR z!@JO_jm;%t*|Ft)?V$}><~1>{6k^D=@Hn0>B#V4nX@-2j+dY3)wWW628JaPzgZ3ce zz+V1Mx3!I>6+f%mA*{{ifLh$4FCbG@fz)DJB{EMHuK8) z288^(0EC-e4Z+948^VGvE}iGFr?!Q2nSapv2Cc$RK#dNl zuwXp?)Izo&Z_z7>Geg4@sdRY#l2L6%sL2e#AH~ub@vbRHas&r3I@)4{zMcm8o^P0u z%5;CA3)$+tFS?OpknCyla~$1oSbRe1%tE9H^47y3UX!acdHr`!{%L0$M4MC@6+CWL zn7+|G!j+z)&%k~lw7Rkjq2 z*C%n?$V27n+3iM%2HHWPr1&z83BK5P?Ig%kg`jCoPYi^jV`I=N5zslEMZT~2tPXa` zvE_5Z#a%s%m-XaPbnWly9drST0Xeu(wSx;7r@GS9=M%v4?4KGJDKEkx+xpiI@{<1Ghz{vSQ+0$W*HG2QH-)WExm#jn{ryonElfYRra8Dape@?p{u=yd7%znpOG~AXgSCIUZ5K+DOeM0owG>Y)uE`ev z3ZzR2%Vv@nuxl2l@)0!ayhn{p_n9+XzuZpj!@Pec*7K{(-F0mxaTxlGc25Z620k^1 zTWqodP6=w$S0UyU^xyo~e5CuG$s*F7%Fv;3BzxPc9jeTJ@mV0Cc%|PA^XYnit=3E) zN9;ej>gFw=_@?eAdo6F(z?Z554d2_BC&!}l;OwGSh|wNhqoW+9(4a>|-sw84+>Krh zjzdUi(8bO5*bT7h1@9c5>dUk9cfShJgOSPSlnI|t>+$rU}|K7l$WT!L+YK&5i!_C#7&j`FO( z?evEFXgI+yzfSJGxhU%X_#~5m);?NqVfs`lHJ!mYjl2_F5#?@1Oq${jS(~pgcLRu! zBzflO=Z>v?V>-PSo_hbw*ZAi^^uLr!lxPK zf{?P5-8t2dQmS|wt_LD44zx`Az&3gAn2MC(_!Lqm_##U?kgJK)fsr*oKr2rvm>>ND zzcPI&r8z<&eWArFfcMCMestv>U)*p$y`OTlr8qW$XWQp|KOR3?XC38!D#6aUT=?JafVA5NteA&ql!MZNvrv^hmY9~h4 zrvbmbZwBlZJe;bKnqM2xQ9bVZWCf%ISGgv2*v1*kF&5+Z=DVpW{&~E=$fpsVM);TNiPNs-DJ^eQ-mUr8<~3(QQI zF>B{ysrL6e2?zyY#8fVFWh;Qpd5Y&9KI_gt4Z^D-CoRTA69OYYKpR3Y!kJi$lBx@BXcXD?- zd;|$VT_=vAp{+YP6pN_vFdpxzQT)ObKo#fwApZ1ie~3v92K--i=MLW}Wey1~useJV zc3T_aEwut$(zY4n5)@pjlzp!ynZ(_+chw4MwXmW##{I#z(RNy4q|($@JTM*tIz{03-eZ>W`6fjA9dYE5uTlq`Q@pGz9vZZ+JRdc_H5sdj^nX6wmvO~Bx2<Lx7vBs^ z@gq)&yy>SRNL-t%EHb*# zx8J^h!j?{wyFZo1lnYvDu`kcWO7h1!ed-)#MFq5_K?LEnp2OdOu@Ts(IKJGTJ*ORd zLR_yYxzuRm20$V`8^k(wnv{ZZay2@u;Zv#ZX;8#Pdmu2O#vei0Z+)P%olPzJ%Tx$< zwmV7HrST>$DeFi~)a&g`*CeY&HWlHZf!a5e=9nnsk^Bg(CnA&^ zf;sm&ou+3a{coh>Cc>a1y`}(KCXM`G~ zNP#W)%7qNb>CBf!A^eyOEi5%HY(Qv`nBga0djf-}&r$^kY;0wrC@~|YZr+8PCU27V zuJ(>1)aTJOf$=#_X7I*8hW}Qi1t;>MK(yj|H-JPby(t?oLirT%tmPIku`U8-B58O9 zLs5WYD|`z*Hkn@a(C>_{jghNMuM4%USTghnYL87YM~uS3=?bc;IZkJKXK}$VT22hE zjC^q&bnhYROhgONilDeKDKKB#{R5@$a6}Bi^eU7xw^TsXI85CAJNvty$$GgEGavBX z%)d%_%jzv(8NfHgnwkJ`)r^-Ykzm${5Utz$Gr~-F+#)_{!2>cd))U%s1i#aNfuCQ} zBypobqzicat6-r|N%A?48j}M)=*Q?$>IPq)&UuOtZYp072}(D7CzIyS*}`kUQGhce z=5xvoH}6qF-XQgkQM6zE794iVSR#=U20T+yGcei6HD*QR{JZ|Y+~~exB8OhgDGu#q z+}_`#QUa8Cbf`aSiefFrWpckPD+^my+$HiVibR_Oci~t>j!a*<4j#9?fnJ*&l1YC_ zPF`xWwuOg0mW!CKvFp-Fj-b2?jgxr=W3{(%HCvXJsNmeprA7ORAoCn2`=%Hp?Kna^VuuBR z&}96b_GE^t>62%5_M$)7s@tqU7Rqo#kQXr}rQa&J)A7HeX?y%K$8bdoAuL>P6vz-G z$e2Ytw5NLwQM@L?se8{5DsaYa{&C+x5=9fH8dExXAe?TS-(c0Ki0~z4;)lQd4GVU|DbDD5tkD-^?YFUAB%l|H@19)&cQruyVK-2hM8==8{IbCK=3< zlr#UNo({$yh_4mxni%Sh>7;VX1&Dl|Mgj{<>ear5qQ~oJ7)N)ys~Ok=_7o5ovkg~( z7(5EKM-c?^VB;B&#=0<>8!Gr)J?IK*aoC*tfXLPupoqJW;?N;{BL=vu)xK8s~@g`Ttu0z_0P z$+ECHfvX9A!`y^|%Ph*(Q~@gDsXW4Xm}ZwsU}jIvQOE*j*CY3O^!V;L9)}cg!XxVb zaH{6OfnB9<>5lG!|DginyQgIv~+0H3N}sV;05RZPIA^^-S#2uc;P+H~c$46ivUUZW>Sk zeN&8O!_}qw3;>8Q4|f9f!&c)P2Ut>Z1!Kbh2&FYm$0#eHN@uh{@>HfR168L)LarfI zg1p~?La!9|f2~rjNTR@gogyl55RQ9maDwQ$5ONt5Tj&XMX{+=GI(7ETZAB~v@D#O# zf>&bGQ1_W}TSpS!=tG6Zt4vx_YovAw)(W)*jvC%Qqq@5BzYt^gIes&+6Q`l3<=E@x zlvVi2zA>}&VB=+s8KB;;>#X;UBn%3EEY}5gIa%;{iEgbnn@$^nG|+J2i|58hlzpT zdb;t@)GHJUe0`789TpJ1#&t1qOGHZT_y0+oceY(aLn&8}!UBnPST=S`IF^)=i|zERBG?%O5jks@D!j`LpE!@{LdI>pBRuT zpN)ScMlCYN$GIi1V$Tg7)Arh36zhm`@RfwVuU=hMyoLW(_iOmXiU!Yenm=m`Oo9X; z3I}>qF}5NyP!*5g#ZjGZ5a*8xh!e`S%y4 za~+o-sb*wZN{$knIuCl~1>iwk!BJ)bioI^wO~Wp3gk^vLEPHRiDPL|AjDhcs3)LqF zNo&+}%mwueVmd5PVIj01x5dsLrVh^kuems*i8;*@*1WFH(lHQ)wW?q7$38OkE-T(8 z_71SRtC>ou2iNtX_4KdAA4we7Ttsp*vC^XXb3vFtsf84XrdFhf_3HFg7uR59kL06b z#uNRHA1j&|`l|QuuEigbt%CLf?3}HrB}``l5nvnt%>!zw(?{5$BxFVjrKrsTmU|!t zPXu~Hn0j9d)os1yUJr6kDHDH8T{QC*_WW7-OQe@exSqxKx9Br9Idz z2pxxO^^Kb=!56gO1ie$UN{{W2u76^l+IrN#rDvH4Rb0u7!ivBHNg0>AD1wN6*?5#K ziMzB3naw4s)_FJ2of-vn!T^)@z-34qwURwICVvdoH%co$jmJYTg}I1Vkd)XDG)W!1 zO>D6Lx{|9|iZB00gu>uAS%wu{!hc|et>n2FS@wf%*RavI9F76Gq{euN^Svn7)cc$g82Adw%l7!unhFnQ zth_fm;+7v}+xiW99)64N3$lQNqB&pcD8u4C)t2PlluQl=VJHSItd?tz8mFOP|AHbj zyGNMHi<+K!&KM&kJL z&XB3ws1*4TDJH@@d-(gglM?kDSF_y*v;1O94X%%;f zU$ww*?Rp<5e8gMpk6Sxs!{;f9FnBf=P21z!=ahu}JuW*WUq*|pn$Q09;0=$*sTkMD zHx%~H5ihlntFjfup=~a`jtJ$6Ve{ynz~>mM`bYrE9Ml7@OaW|-@H)ZVTXo`8z76vRMe_idC3btc2Y;Q1&^+(QP0vpV<^b{xTdEs0LD?0wgsts9IA zqsS%L5=LEg(cd`unS~tZWsaphZN_1L!c#E+d36XiL>37fXsry|?t?DEV1D2(3yu{M z@AidkN9NEBs*#WC9nPrwCB!?e#UZlRfQ<*piR3b7Rfa)jHc1I+ zhM{0m<>UI(X5vDTKXIyn>5{zsiFW@9cGnz?#I>QWj~TBp7fsG~bO4!t`!i4MaFzZg zj6YC5$zx5<%i1XoVelw$qeHZmgaoU+MwMMny=!#S380i82s>&JYPJCi>|%PqE&F_ z#YjM}DfG@5K91@6Nh6{r=We*dTgx-lP;u??eC5kcoY!nepkvJ4P_nF50Wo^CC zHoMe#VnPiiE<8dM-}m}xFGo|iiqaR4rZRqgRynnz4|*wRDnIQ8 zW|kO^iOIQ zV&I;^+D&Rs5xc?yGRS~?#H5gWgL27l<)wm3mp~$)zSv+@172|T^`p@)_ak)SDW8=J zOAQg;S{MZ^vV~_)E8qz$=UNsD%52#3YgA3D!wHzt!oc@$)`p!$bgknraD&AlZ(zmO z#5}{_)lX>TTy_RztQ)5!rln=#M{$aStYSK$P?6QCMe6=+3tp}&Nt`mHax7VYYl^eX zGH%thg z%H6vJdCl1R6gHAxd)>A{lw{H|%51U-v|})`&4P#a)YrP%v7l5p7v%KiYQ9ROZ9eA5 z@`|iSC+}sJz`(>b7g3@9o%9>a;NdYN_KIffFc7j5(6H#lY#UQ>`WH386}B-VR)7lR z535%1>dENkQZuA$=gj_!KIljG|2y62uNuP@%12D8#?D~Db-=;0h+dLbClw#=W%)rq zMpK@g{pl0oZ*H*90{1s#)W?d+2l&*~nrR-w?R-??hS`op1W>zsX1L4LOiENLdqTCd zD;E!ASK)Sp-b-*q1GlTi?n^TrI(^X1B!mpyEre2eS}Tq}Z3a4v%(C?@?$z`=$MM#!|KL3^}DD^|lDFkuB@BJ&o@aYF%HaN00vmRY@N*>i%l0*zYOus41&0 zu&NP2vDymNHA|J^Cem?NgPtIVPiVIxrw687SGPymlJg9D#n3=ZK@cwHVv-OGv1rso zFb6s#n=_ONdcyrIX`G{{yb+Q2l0l}mv1CQlM%)K(#xsd*^pNdKNg2%B@M(Xx0Opw} z5=tT$7t$iR9ohS;!N||W)l3>x5Vyr8O1K8!_g5JaEK3@DNI8X4V-B9|Q~4_qt7Y14 z)D(r3k?>WrmGg=T%%KLq zL+P)=E-`R~aDS(noj z47r9r9E(n>H+h7wS2jfN+O$BiXsj)&l^o7L^hhs@TKdnI1X<#2E)K-L6Pv-{4Wz}gx4 ztyn>c+py%k;+CeRDQ zYkiDt%Z$QEY|QuDz~);m#II#vI%!9UPj~Oux$&AhJ%iaW;ZSLfM6_FwlN2X(DYu&E z`Yi0&zT-D&Qd}=610s9kB7kRv0c6LZ&@MHUc8~O(KiIegwrQQsrJudINJ$Z~kSik+2#pa%O)_9qg9N`Tk9E1J9X(uVp0V z%Q&4>1`oCU%S>q-FR#n>Mc{Lp(j&y=6En?P#q_#Wve}gT4B=adnSm!sPyl}bQi^J- zU$j>yWX~U2@HX{o9e#`3;*&d<3I0ePT7DmEp zpcIA+6zDF3&XKzB%mtBdFMdNv&}igIm&UAT>H#Rw0!!&hGnULc`*NEVK4GZTNioR4G?Cj{VHwNni3On`V>ooyERacr z+xHm>H=Qlp)kw?|?~Wdm5o6%ZD8>~}`dm%j-+}9GxTWTXqvO#uaTdexf1)jZTeeO+ z8YfQzkc%jZx|xYKQ8ekR0jw%yN(MI-q3bWzY&rVv8vQmCgLMS%aEC))>jH)~etii- z7@91(DWX0O&R!C!=eK@2<$G60;w)I^M5H*APXHFhX(d8K#xk3g{Mhkl&Tr*r6 zT>(Wb00b<}4P^z!iog-)E|pjyiVVS(X@#;9-v&sNS8r6$*i|j#kU+YzFf&DOyQNX` z{=H?o@Ro1_cMU?l?m5_z`lYuudavw0wpd=;8-h(nRecg~IWo8BuVLEi=?0+kr&z=* zsw;!GWJx-n!5~$o#xeBhYp?gNNbO9tDS8#dR4NT{bL{vuX)Oo9q7=DjiG9ZGp+OzN zY~NDDwdQlcm)^OWG`2KJ3usg8FE6yKwuDb2s|Ljfz4HC6ytSY6p4ezU>y^2Uq8HPC zQku{2of$e_SoPSD>)slvsS8bSrAQXSXe`k4-=m7W(v6FRGCN^Y1x;~U2P1p%{^n^H zjHSL!yiuw@?bGvvODLU0$d6g5nO)?hX=^jG?0o!LlB+TTL;QBcv)z@imrz%! zJl%VvzXpJfk7=DByV-V(g{X8H3{H_iYE$QB-?PShx9l^UTMeI8ufN`yWI-6OkjDgL zr$W$}%V|rcY(Dg97QqS#Oum}c8U5ukIKPW0z#uaRstgS9p_sQ$VJc>;Mcs+wWB86i z%=8TcSzbC~QVvz)pVV}j_Ek~Y!D%`JL%!#xCyNAC60GxqnF^mbC8 z;`Z5y!O!${B`2cNA~zt_(xBIc;Z73#4v4mw-Rp2U*S$F|FePv<^b606q|3x()}ln) zF9pMIbzRbB05hp~M1ABb1VdLsk+1a$d(7hiK3Q)|+r8kk%N@-dsYgjP723h?Ck~!j zg++sJC=AQllF$Iw=P`hd*$KPYCLiRRaPhXg%Gul4p*YSBe6nJ-ZzVTL4d|0-$^yb? z!c~2}^cV_`b~$yp+xDllNi1ZND(81nAR>Etp!~x}s|xcs&cfLhr4i!y2^*nQl^*={ zeT3Z0M`z$3B}lq1GLh%1dJXb9DYDr}m0pS>+Pl8_5Fs#2@qi zXsc-T-OC9b!n8XT8LLf>@<4&a{Apjzn3Lr3(=*Q^z&hmBjv#s8Y- z*hZqCD2crC$(YwdMI<0}ab-K83E4Oa98iL_qA2&{-#;Gfnd^Q$u1dW0dk>2T{)w(v zH)w%~Bj^G^bPAhNUjRcuyuTQ0N9y9bwY&Vo3H(8 zOYyH__K6CPYuBNcSfk$%mi`ddbo06g6>PIQWl7kQak zvI$3J1%LDbHjL&9AR4jo2J0Tr9t@s;2#(Y0XkanWfK;_|ZJ|{!1H#r;kk@wb6-`Gz zv6QQ9{sHD4$>+WH-YG*GL61>DNuGXxyeQkqbd{S+xkUxRN;<6I4;CJuDFZyU4!vf8 zF&1(6_ka06mP>Fx23PB=lx64#nw%M8YxGwq?Gokn1D$J7L%Q1uJ*Kj3Ir3{<(MExa zW-qy6{Mal;&%3-M2*R6hHPVzLx_xn>&)ZQ<9K(B_f=sjk-~eo`ohK@e!`W zdcs?cR(u2j{cXs($~y{65#ZdT_OPO*D5{aRx#uC0Vxyh{*~3IpQ$9IWf*!?#f$Cp7 z+@{%5ev91E+{(&GFwD82twwf+EMZWkO` z&76A%HZ?Yap5&Jd;fiZYmVc6PIkhvVO|iS)#K=63BTys{Eem&wf0cx8?jFl2BZ>bT z{e~6a{2-SKs`kfy4rV4+D(oR~?CU*^k!)Ygi$57|?2R<~hBsLsYihQ@>-;bb3-`a24UAV$r>l$g3gD(d2Ei z&00Y}X;{gH+dV#X_^sd#vzGnA$@})=>5KuaWV+=v+38kHWCam=W=ZFCR$TrlwRfBE zc)g;y>$QZ|e6>cvS_?qtgmD53sHj2?W}OMV)|1%&#nXy2VBKb}>+~*9eLN&Tm9^S+ z?AXn~n}^+!)7>h~QJ3J8Egu9c(N__Drm0O-Yg7TTJS=(DeAUr8XzVffk}^tJs)TWE z*nYV0_%aOeiL3ztf(F|9OY5hWIA=0&D|73)m zG4bu4whosiDWmSK-5_62vF0B5q3)vxWc_zVV>&bLo3O^UGjptH?MMv~JDiCf!1+Rr zVmudn5S-Z@d}1pYP*BzjPsM~-eyfR2|HDqm=#w&|ow@VQ$_!u<`3{4$p!SP1+egOb z!O#Pd-LOn{COqvo{J(2;5XkR@=>bP<{<(RuDDxsqVOXixS=Hqvkh#brFa3-imjae} z_#=p(3_N%z(!G(@dWzKs`pD?<^Lwpo)W_&c=z4CO@w&A|r1In*Gw`3Ihi=6|&s4to z{LG}XjHQviFh;&=+E2cDjnKT7hj)*l$D6$f-BOUxAN0}e_8&YpuCH^C_~5dsewUPo zx;g!S2lu5ZbwLtldHWL?`PfK@Oc@xWWmo=Rg1ZJN7QPG6;ArRwz=+)vE#X#>s{G4# z(H&oq<|gS6iC?jg>$zy$2rS0!vV`tZ9`RuILm|JOOg)#N?z3&na7a7p?J7^CWLJqb z?z7O%sY>gU54`vj1ofv^*K4;yHv{jymkcpwSxern7m!6P5Qhxe}Z2alv@5mPHPNHXslxo5P$tz4KhD2{IeX-rR_cq8KesivUe z)K)WHG5!5IBz)V1cfs;_Bq_Qvvntsi`CJ;aY4Z&Ao=+_QRV%txXZX$b1%?JfhR?5U zXp~CW(~-85Ba6DBqAk)I^JK$c$l!w@?vjhe8yvpqcxWYJ7stVR98p)*H}sHdey7$7O26|)-o2`P==$tWjf59eoWW+iw(zLW zI-U1>iRv-nbpa|5e`+2Yy+qeuAa3D+o1@o}HXnYSF7o&kza4o*R4kPwAzFFh zfY}sR`LHBwdN%F590z;I0Ka}78CD~pWo!Fy{gLDsUKkrGZTyTk?W#}w4MM*%g?5Jd&*zKwaT_8B}?Ti1S&+$vFVjaH$;`Jo#>HgsK-(OZOfYQGS{ zl0Qb3Tr4J)C8*t~YEqm#<-);9a6|5zA&E#O8Vc{?az>7hg1h@{09*-KDiLeUnOOp_ zFXEN*HP{f~UEiO+exM$9TPU(Q0!0OFuYvD?e+FtA6L_o~jX3%deLsIQ89}(Wy_c~i zGSI$OM8~?OTkwaPipTa?_uvN_1fki|s)oCckS|~ge6S;RYsi{3`h7LPd#mDeM;pB; zIl$Ce5uw~*aYaR?eGTKXcn;{Pjdy(zo{FL&ENo)tN7*oe*)vL0GzwBPJc&*ZhH0}P ztuHjvlI9zIr=uOEApj!h{Ptz_K}%H(IjqE{uxPr&iPA33W`@CbJR}=!1kSRf^Xz+5 zf(NxczA7!K(e`XZal$aUU(-N5u8LxvA)`*&B8-t5!aUgH)XBt)VoB>wEq)hJ$!*DC z0#JzxUlbr;I|{Fxy=~z30FoGx%_L0vMXFK=9Gt)TtF<(Qm?NiYa^W}0FKwNpM(K4{ zD|BB-Rk)}gd4{d508rfs)%o|mAp6{d;i22QHZGNhQbTOZ2V@;eCoeO{`*$kam&KkL z_usc>%b_$F=7P>gCD#&cVW_8dmEPv}B5(-rKF>M+1^P`P8uEb$CLP6#a-6&Ax%C|Jr9{r8x)`+^B|3-XNKeuHtX@G z<|c)|=t>oUvb2W`W!EFI3x@G8L_GC6bysutSxL~z)o8RhD*yCEum2)99I)72MoI9s z;!Yk(c(P34>hPU{k{;f3V)McJ7W?@d4J)yva;3S3k6JiaB>KGTj%RlPKGkipRX#TdSFO?G9@(0M%}VQ;cz`CtidP9;+**$%zb%hSaAoHh0QjG(MT3~{KM74 zF~bWmm`|UAANtaoSIkOB2vPIvR4-H`gn9W6-^z21z>x@HQT?g{4Uoo=G@qgIg1%~+ z#hm2zz;@0+N=Zq^c3S<3Pt26_j7y`^Dyc-+&gTlt06-o2@$<9f3tzsR~M{bsf4O01+#UecbX5PgKF$ zV){*p$SdIRJ#1yH(x)#(=fA;G-C<)a^+EBVM6MzTN$j(861jfJw-7nWASD{**aIS066Xs5+ z+!2GkI|I?a{vS+zWH6}3{QAF!e%sE61X@Of2kl6Stno*MpSdi`b+^kDUGOqeoB~A4 zR#n2EZ}lggj}W_D$x3VQ!nh~r*n-DT8Ot5H4%-hYRS*KOS{KPNP6xQDZl$SboY{3< zs}UW@L(lqO7suYr@$lzu!!jfoVC+Y{bs6c(Y)eeBK~EqaI?e@X6YiyYMeJ9zx}3`N zskAk)!rA~JTiN5w zlkYuh-6X~xbk^!~#kh-^5ZP5HazNk6(V+r}rWJyRpxUYBeGV;j$)K6^m+J1UUd$OJ zCw{FDXp8^)q`%!@?l~vcj|X%r%EATIRT{=Dj24hqH`lLEFIMQ39E<{gFdGwgMIm;> ztE%1oS1Vao7i;d}l4>#k^D>v@2(=|SGm+q?GPltKN$kc~JDWbTL2{*>h$8s-q8Lr$ zotme+qL^jx%RBc$%G%Sfy*BS5&VXsdwaz|Ji(jCYYqlGwzo`;&J#V!_Exg?Uox5N)9UObf5>vb*_>O8gWuZl%xGccsL8Kh(K_cDzI zMP0{W|DA?1_B|P&OwzDrc^9IiHBJ%?fR1XDfK_Ng>hLXZbp?t=-=zctXv{>H#Pk0& zF;$|eJD|VnnCWU7bdUnA`? zMRKW_G=9iH1xBV}lraCpyL|;`cT$Uz5Jp8aYKu4y(_QV-$CkV%e5y8K`;91qi>W@; zd{NXX6mGcp1Sz-(IoIHkcXI)U)?@=Jg;N7)^HP6x(xe=eA-%3ohef{q`lYP;Z)U8( zs!DbD%^-%<&~(0uy7rB0mMYYY{30N90R?)MlpyL>K=7G|stUd3(FOK{4_mauYq^3$ zS7z*$+dZ5v>-N#F6|%q$h;SQzgmFD=0luLEFdezT zg^=o_XktnZ4{oP(7v0{0Q;(Z6>$=XxlUHFfDDx$MXBr6sZ^>ak;2_Q(X4!+Zt2el${2~h40}E%tKs3uJIOH?uV!6Qb2E? zZn=7&-VqDH$Z#rln>8Ac)3eL1A0u~Kt|#GTd)eVCw*!ENzqO9OkujXf+ryJu=wjd*$Y(Jc2za4v7`quqz%2%5f7s`sXDVljt4q|C>zSweMJ_+yt@w#S*NbQ6NF@RuN&EBAB8} z{?$xN`T*P#-Vct3U{YAR`oLBn5bHk;NRMzsqpll5sqE*We;L>;O)dq{?seN<@zGF& zLV=m6A*5yps?E8GWQM{VhQn@BA%Qe#B$%T z<&;%arLt`X>KhU`$ZC|B?l{isX=ibcheN$R2WqAXBTA4k0@tyVGds`XDJo<)_a^s+pk68CoeE}DBDnZ1AdrwRT(QIne z0w_B9Ef!VJrERAn1SNhh>ObH<*$^VXCJvxlglC2BO(Nafl_rUDfv<_!x;16uLrc%u zU7WA$ZqAGe_oYbKwA7^*=2z9j5$%fM8Y>(UMC6Zd1tShJij&isN3|_JeB2Eq2jZiLAehw=}ZdJ1|9~upkHwBq^hw~IH#wuERgm+9&c)fCFE<67voT~ z@4kd_-MIjD%lHcu;^x5qg>vws)byE!mqeOpv~@JHoag5GzxJW%FB)q!XaNB$wOlwX z&w+ujKAp?gralA8ScvCYS8~3v!-R0s591`X@9V>MlGEm)&_wX&Rw$G8ES`auRWKZ5 zl`eXVFY&43xzn?X2jr z_1Ppb=VE*rAD=QH-WQmHIlc>1ot%90t z5Ps&B$+fE01Z9k)XV^o;w-tU6JEifyyd%6yQp(}CBF=6(HA2j5;sju1(tyYS2$VuC zVr()on^_v{VpCm71|DCdFyQ#>H@dPw<`Ty~HxM1gk}QN1?x!r}n4kHfj}In^q-U?_wrw!kcWNw#t8cGu!?qp04I#Nj^qq`y843i zb3s*D6oQ4HFnoOsJtIl2+IS5aNi1vU2HW>;@yniEDR)rIM+Q-a$5&n+mnOP7qlgku z4n!TkIEjNS`s6yUR==gJ9aW_B|HU}c&{a`jU+HWDPAE?W0K^w8js0Hx)(6lenf}A$ z*Z??X-n3J=TpqvLM+<-ZVx+7Ezqad_h>v6sEin`nq%_w5%e70nzd9u)z+mdo#`)N! z4$tZ6dNhOPP34?oZq>M;o0$qa!iav_QOhi;o7`v6CvcvOUvzF-4`w$aDMKiNZ)v0J z*Cw<-O6%S2Z&bik-MSsS2(U(eM%VMk{L~!c6_U8YZAVg>e!GI({a2r|4YZbXDiUoW zOO>sW3s&;c7l%S5y}fIY?*YSnLYU{kwX?}+(^S58Qsr$!GSj1Rh0O{q(o2J`LNHp1 z)HaZKx`^)@-es$f_MR2*1pdqDpTpt}z{2yL!r9@3=cU~RJw<7c$l7>~j8Vxrp@Pb7 zCk)mGT_yGrhJ-gfm9?$ANrOC*ewNr4*){>~f-rqQDthq1c5et#HhOLYN8dg~iB1G{ z?UW5Bd{AT_^+`U@1|N2jChM3c2)tlmrb36RYuHG_JmRFS5@|7@Kk{f* zsP`JxH3a`jZ#86~{j>s^B6QSQ!f&^v4E@r!OKjB&`|ywr{{4V)H7*E0%5M>Ie0tfK zxh5T4Q=}V`$ z`G(b+{Sfq+E*;D!^ju;xXMF+B&px{A1`)&=BpK+Pp%=$Ee z1Kr9!a}EE=SMtw2H>{O_#yV1+&qjs(7FNRL(18o9#Q}KbNw)}GH!~fmA#hdP($B9y zT-aO2!dko2*%7NG$>btnB(rQ9Q4FbE-1%*4S~R6x+@1gZyBiYRn_{=}&87K63PqVD zZ<&Q%P$o17kExNnM&~Zi2$HgYfw)oCMcGFF9Whbh(a9OGH z`9(bLyHo}Fy9I~jsl(^70V$ng)NL5a(~q@k!9AK5SCoPfj+dagX?x@myMw=SZ0A>}|336|l z3;w#LsQtqfavWkMdg51{^phM9axUJWU>J~I3?s9)YW+>lif6IHM|geHe{XqS1UP^h zEIZ)N`6w?>l@T{ZjV^*%Zd+h#RsIXsi_eM9oyqk~y{OH~Wc|WhHS)N1I#VV%20B2hQb|_&j6d0uG*o{o1i9F%u>|O-jWj}CB$#M0(ITeX&@?3wAm|Aj6uD=ictf}D}IkDe0 z1lcr@C=#>PGWd-YPTs3Uo(4!H>>`BRltbS@>ZcEN3;s}!bKS}8C)uRMONB?2#gA>l zN&w@E0DSmn?p`(VreF#zwwt@^{>)blCd&FA(p zu8BTuaan6TBI?YXe1%MaOC9}Jh1`WJLDR)gT6nCHQ4p9En%!12YRX`p)-3ou9`U{B zp4Ev_oy5y1V0mdIQXeh1eDjZz;1-#2(s7h>2iH)v9Jc?dRqSQG5m_bc`=W8JQAI7l zzAn8Kgmtm>A-*d?;00>9t)PyVvttdGWM9q%R+ZdF5=(~(>nj-X*FED^B*tRaS(l{CpY;8QhqD(00#sU1HI$vW;zN6+f)> z(nsoNqeJA0NtG$5Zig0`R`T9ee)^qzC1UFr(HYCHGJCxc+O7@odq^Y7vc2(E|FND9 z8`xKrdER%ca`~}G@r?f^;8BKhl=Yg1!k<<{WVnohDj6KVEndAi(5p6~$<-4D#&#&WtAcd%idG_11YF>=i-?{OcIUJ6%GzbP-Dwr}n?n zE{`r9oFI7dTq#arEUm4$w+W+2Prs;%Y?**)^h=JC)*iET(hNfQY^LXAmfRq zb(WKyXC}+WJ23fQ-uWuYhvLYEc#p$_qLqgjGb~jz>5-VDZpo$ZKDH;Ud{OmXE&^d# zhdqI&UTs|UN69@LaA7#+tAT4Y?z8YF?YAN?bA~u9_{IkCi(q3r@V1TJfD5J!G43F+ z9t(aBZi;XJsXQ>)Bx=D;)&qv-3C|<}bZy0^asfxU{b~LdiZiner!a7PAlQM(3`uJ& zaxi1(%$oe;?jU@q4(hbnXhBGD@n(kl#}&?XfIPSauv|>rQQhatiqAPT!L>C1uT;7r zkISUsW=Q+nN%KMq#G4pdctEoy06%wdJNz8go0Sc3TP1boPs=G;j0B7!y7{8&1kPCx zl*AMukL4qIJShB)=mli6&t5aTaCQ$HnvM$SJmbaKnGO&ii8I>`F1NU*DzgTn4a^Lj z%*lQ`iFyfgGfuYr0GJj?<|njaoEmS3GAGphzEce`%ZuO=xBGm|jRo zc4tAXn0HSWuSKOp9;hDN8+z=6QK|0_|DaKyR!6|Ml z_7o1OKl*(553qmEMqs{JG)B!N4>nLs7#1}A=SELX@xSPeWbwfV;j-QM#;ohY7rf05 zt&r;d9kdGv%+-BR8|ZhPKFL{CiG5GkRLet9>hz%Wfgu&<`gSmnS|7J&%iUC7BR$Lu zxtG+9y)mKy-)vs};XPulz~nMb={&0PJ4e0aJJGe9mzP5`x6jv)d68CNJRb1k|IM+FCq8G5e5 z&LwjrwWk`P#o7Hr$^-xHlp`~E4@)Ko3$>)_)`K$8O0mLQ*~EQEts zYeEO$NG_Lf_T<0YUX6+$_rQJNEn;Z<4`bt?-ZAYmisYp8sb5Z!yEG!%xP*jwJ4LBK zn8(vNXZwJ@!Q2A+@YJAFVsknH5`?ip(_Ss{PP;pG^!FJ#;{Dq_Soj_!AuOo0CvfaL zl<cKbk(fd=icI`(104ncGB=8IYT2Fq|Z<@w%?QeS~VC zah6A}JvE#tB{86RIpAewme_}iJ_5lgn-mELDi$>IOg99E{P`3ROtMSHCI_M)DgA>C zpi;*!@00(~cnYN2jPV(J9F{?G0d8e2VfE{?%o}|XrT#{%iddr7r}Rjj$bh~PGpYEV zlBe^M;wCVH8-1j8x(*wm;l&-Gp+1q6%c-pPcp zV=to4C~SX|SzS$*ok*GyOu`0a;pS!k(s$SY{xtal&nbxee^+asUoZL@S?kszgrLQk z(DS0fMh8bxutWhPdW+tN4M3Czi1tC9%_YAS+U8sb?7|VWVynmQ?|bulT7dY-#4dn~ zHFivGr38xwvXN5a)X9s9aA{sA$vI+5*DtEqhS9_0&7)J2(%0opYDlmzdpM zeLQhs*A!zAf(Xj!fN{gAu^p`$Iap4uOW%isKDYp%Bai#MS>Z{K;W`$?WF z8f9k4Vbot|QWh}M6}ynHmoSk4SXA$URio7`}eg#>bG?j9|9v5bU^J~_c6b1#4{3=l#B$Y4dY70Eb>c00#P2xut zOHWC(fz76sF!CWZ_>1WMeS6;`gW4lxgzGxajQa17c7ew8B)YB~okj)?u>)ghheO2~ z|0U2p8%LSEF%}EOw+lZ~3Lc<{^QB(5ZPho4*2uBBk--~i_rT8+t4ndsY_d?%KC%0T zQ?%+a=IqS^u-4}7fZQiyY2jKSR6kfcjYcL=1+!tcn65Q<>m>jR0sS>qW8;Y5of#7o zlWsB?VI1G+gs@oxhK{NZZ}ibT3cWTVr4#lG7o)A6)h=UO0QuFaFfb7fJa~T3z}sai zK8W&4+hU%H^i>Wetiv#^4K#R_yf?aHy;3>k0z z?edXOF~|#Q@StanLich0r+o=~5?PX@-EMZ=$|M?&mCb*{3HcJ=Z&j8{o@Wf3;=sCi z{dCj5wv7(vE?tP!(IuqP5VB#P&Q_&-X)B#X$=}GnOP>T+vXWU9t5h=X-|C+^Gj>Flz zrhFzLPY^2z19v=We;&pbfGw=man5GMP+OHLMQZMG4vpMArcyPeMaZ^ky_U%2_?MInT+YCkEPZ(lTUs{CX za(IPiT&Jz2X(>$^I8ggvv>)waLG{>8ot{K-h(Qp#=^e>kOTj$~xFB?XAt^%pc1p>@ z*aXsN?HNC=3xV*Y7G3#5JU~*-{0eKOUVa{An5A_&JZ;YO#6ApgvCx)zAr?M}qIA|(*rZA)H&c!%gBcR#x$@!uo!%O)M zq~<)OpOAc#Y-LoJ)9S?0gyz#{qI!a@dVaR3RH6-NLGqzYT+vy^2GFwE+<;Bh#qoy3 z&|@A9Eg3vS&4CT(|sn^3;!3LRD7 zt;e`gl2M4ZocY^;s2dDVg9)B$;BAt>U!OOJ*_!)o>ziZMG>$hBaSbyY`!$!F->hYI zFjiLSrbHY$=|OIU+2A<6NdW`%h9skZ?WC0x_A6?iO-K6{Yp0t{pe|iU;(gD=WU3ih zABC?pfKZvPIL0=&;s_!&KQzNmVaUmYWy7Z%(Rjj6Rw?Td_p2!Q_spSER8KPR5E>(w zD(VNWaE)TQ+UT&kM>=0G*KEu)FxSn@^*zuOQxL!ZYgG&N7+(|Xd8sS{7Z7)Ko+Rwv zV0)6`A}|zm>}9gW%<))yWAb>y$f7e>Nr@x!wA3_*v^=bJjmMX3<}3_St}?P&&2 zbXNxFdE0zBOs^g&piXgZ!3o0sn_h^BT~meH8ks`2XzHG}70_`cgW6(h;lvI2gUtg7 z(eXhK)o%I7vbljlW?N1X%BEZuXYP0$w30M~&xHRCOn$VKu9BO?x@I)}X=3(Sa_Q6Q z$xao@Y8%32wpZ7NPFT2dp=LQD9b*yyacpbks}d|AN8gTNj#$z+%?ng-J|X3lcR9eR z+RN9H!Y@F>{Rgd1eAmPqWDH^GhhbmafPVH)<@(qQd!*r4M9P9Kl_}5*;hI>Lf?}Vz z?4Ieq^d4|Sqe~{Oh+K<=&l9_PxZJ6ZsGny3v0^T0;Tj;*(x_8 z(cu$#)05q@IA-h>f(B$8g;S|Gl&}o*vYKFfyEvn2=I?5ssy;CodY5b}$TiGOWbURg2)J9jY!>H84Cu;OA$-d4*V@Di z$X8_{>!%A6onzBcVf?vNMn|kM8-n5KYl8KPLlo zyh*fQrtlj9lC-i(t~(`@g`B49Kj4aPn;s$fh{o9nW&)ch+7gyxMU{Tk?=at}r56a{pFT&NZlrp2Lm zXZgxAJ3JcG@tp|#*!anl{h<EhbQ1bZvf0<1KR^N{YZW`)P*En^b#Y)g?GM24$LJwO*WE zsob;)yE2Q<8~^9V@i6lAg7chtLza(&vC((9=zoGp%%0{48A2E}`w5V@R77;*7*yT~ zlZt26_kJsw=Pzf!+2FPfP=Pp>iK=S$!7T33`8dwP^IRM}qEg-zf6*T&q8UJ7>4iY@ z{5FNjEU<|9#>3Z zcwLBR0$Xq=4ka)*;p^K!!acghxr_EQLNb=ww8Zy_Tabpu5ms%vfpnp1(c&su+ehpE zy<>>zn-r8y`^Lethn4sLU_GVHh^ooNK5;A-$<`x+f23g$!3FGyUGX{?cidqZ5-Cj? zL7ciZ3yD%A({y_u<+6LG{B&_xXsahWN$iF|ADlaVfG8#d?9!071@xlkg?ad!z0lKj zoMwv9ob(0ir?gXa!zdyj0yQ^eJE|$MUE;X#xzC6+_O(0CpoCN*xWr(u!V?(ofPHj% za^VycuShly4r}o4bpLXZjO7(cSg?NConcvX?#f{<;|k@1e4F&pY7MgE`!6tr;L$0d zk>FKNE4nj+(CG*%h#)g!U7Cx)~WUMJoI@WA9doR|WNA3b89=$yqHIPzXO9UVf zQB&+<_!3|tRqC)u{QjzjMdzc3e_7YkK)W-7Sbn;ET75jxSMp{<8^z zr1A*maS5W1)PNTu+tJa>(jNqRf#)c)j@w$(R_pSmtx+YMqT_A(FbPCj>vkd{VRvIpn8lOU9J?w)h5g1H$Gwc4;k*Ze~+)&1C>m=chD~WR}l4GG>_MgGDg|tOu;_)qnMCk7o0E!Sbe` z$h=DR>_%2vPxZ(-u;`!wFh2+ztNTdbMzh0!<24 z<=DCDW-z|*cXSV)`QK<p(JU-1azdyU`*cK26v~luO?Cqqu295GIp>vtY)%i`ZwVdYQ zKDj)P|3Rx9uthsWmB+P|jR!WVEX-=)Xh!Xx_Z!IFcjLY$fyzfcQ^!3+-S~dUqY&B0 z;|xu&7o&o}fwN~!-+QrCVDs8v@NaZG)e1{a@7`Z?rMhN@&38XwCIX#?lKZkg4yn<5`ZL3Gk#zg@%Ruh)J^SZ9 zCzWX@*o!_NOq#fpwq1Kt;HBTafq9x-DUE6%v<5 z247-llwe8+MVwy8x?AZ9%a5+Gmx5@%SSHFOyT;86f)NR$O}jd`(b+a7cNtIbe82Nl z9z9M!{qVup9oHJasjtD8;N~JK`{AX&#u{lU!o)~m6=ds=8h&$skt+c$+)^J=)F7ie z(pI8o%pZZ$GQ}=OU!R$mm-acQy8WKk%D(DGh)8g(5tg?zuJicqpVS-k{urh9bY&Z% znc5#+lM89K{3Fp(&=l;$C*w#*!=gq0kp6L@xCU$v{ z1X0kHV}n=del>BxK1O<0^1)pphX_d*{wxNltChI1T7dSZTXrg$l69W8Ah_Rx>X-<0 zeT7T(_9!~<`eM50)t#1hL%i@jBf-@;%LBr*2a#9%x|i8K)%WOV^iqjeG#KJpLAn6rZyFbdap-OX3DM9T_)| zI}~zFhGeNkD~A(_$BC39+h$4Ne%Yh0>6Bw&ei)DyBecJIH&CkUX2cJBrShe~$Y-Mw zAR`N0r1E?lR9|q)*OrUG`Hjh<#~>;H`>aw+Ef~7sTNf=hW*Zyuc4!etqeEcOE<)5f z+EO_eUB7R`P0HIvLnQ|*3FS^F-?!0FJA1D)z2coQ!1f)$zEXzAFkHi$4KK80-9~F0 zzf^MJhC{6<|AxOGHSDmXH^2fK1zE!K`uv%m+s=0c=*=z-1lXtZkV6d(JoM&@Bg9 zQR#v1%k9a2M|CFXsy=w%*hf$TwsV8@`^9U$IULGfx}glPEy>s_92fH^??)SXy;44C z)oTkcV@+ZK15MLPLRAUtXr&&mWYui256^8YI^MbUs0cHOz$p%7+nO&c@jU-+Kds`u zdxzrcc|L+GdKkwZ*hI&OQ)jw8P_aEVUkT31p;{M(;_Vw$#D+!F>cITgYIu zA*FudN|z+X#bC?emIZ7dESjsW2`JJT*U~1J!1CMz`hFJ-xV(dlNpmYj1!Gwtv4icrRxJ77Vx`VtXX}YYuLAN;KAQt`x+mkf~g0NfQT(I4I+m` z>L5M!CitCtXK#RoY2U)~45{au>xS}vK@1y9nPJUrh*ucvRGkY605zfoGJC95@g#WdGnS6 zzebLbvGh{(@>(OG9iDK+YM<+u-R<73^N1h)jcLTt%O? zGdU2CMb23ksZc7dwv4+)Zf~q4s?m;csbo?ZCvXmGT2fob?EphSyuVG;XjQwJ(ZmFP z^s=+|lZgFGZv(7mfuJqMk87f6K#pTugu%fddEFZ*+i8jPp7MztjMl(i$64iUE@wNe1iRRqLYXk@Dbf?(=TX@C z?jj(Z8Z}8e)W~-BrL8KqpNixxes3o+PW6nVJ0Ps)Kq#4;juQ<@kUzG^ znl(YngyD4Xy8P~?5a0qDu*NmOQ6K->K-MYR>f%Wq@~mB#Vo8|=xQdtkRF^2d-X**2 zur=>3p#YEK*uA}=c%UACRemP0&^1+LL0EL`}xylsmkS_gzC-Xk;VSKDafGzs$K9gDg z{^R!HWJ?}%Uc=teqY_q*hMdn-`<(^hFF1Gu*gYUC^8D@Chy6Q86+Wk&Lo{k0WMuT) zqzn80odH0==a;$WI2TnU#P(|1ghy@*kyx@xBM=Xsd@N+`I^Q4<BicZvwnTIt4uzH#o~J7*BS?rd!iu3K$gv29{@pqo zfL+qd54ZJ+if@>c5ATX@NPX{QHnI$ShYb9Biyw7v3v%GR(;Ei^-99q8YPP9`oYT1| z(KOAWagm66ZSlFuLCZh%B=gI&fg;_PBU{+E$;0q(M?wr#I3kUFxk4RMmZAIhba1HyJ?F#wg;cc?fE+}6JWlwNxrfU3?+owCwU3jjMCl8nNqewm%wg0o zQtfaCQH$%Paqo@*QxuYskMO4_+J~LEJKS?I@QOq7|0jAAZbr$heRi=XjKxwJUDST; zh4#2s=Gx)N24`$VQpfiArdArR`bjgg`GJJ-My}>q9r#OH5XS!P+J;Zetuk3tQUj`) ziP>g++w&jXDcaHHEyNxA#I?vJpT<{&K3L9t32`LPLKBt&*S-PxoneEVjw@Ste#SE~ zr-z;sYm49<3=m zuVubH9X*53*NpdljTT>C$chAW2~>gRB(6%T>ccKd&$(>tFvH2|U^Ggd%ZIUPkAp4) z6SR5v^Bwxd4P`qB>{>HqY6+hI_Gq2m{VZHgTrt#@kjo;@I8Y5{f;4x1uB(alh6x+a z6f?GX3>A~T`P=)l4J6liCza)W9=DsliI}^^7cdYE(cB0E>Pzh+bt!m2IEb#LYb9p@%gM&3Op=83q&~t=LyQSC_W@CtPdg`O*A$3~n&0`dgM%N! zr{W<}32^P959}+a){A<-NT?zlc;IiFvt&IM>m@qWc=;XYc>L0$kfl9bLmOa;k8xB= zE*YoS^zA1;MRE4GnzAn1Xu+#cX++b&WJL5~!!h1Sh#MgNfU_WgOe2Zj+aGxW%G^O0T+`{9wNe1jyVpmdJ(n@PM)0tT4Pzd@sUIjjUNJSVe?4yg`xA*YCq-jPA zX&~`THALaMrlN@(7N%f{C$WkohsYRTnldWA_Ht1^6@{~s>)*iJPSdz?7Hl)Ry~QDl z>|EIREJm3o$z_8yT?8p+@79Ik=bB6%hTWV?!+5Iil?N=*lu2Vs@k7s15w7JY&gDTA z8Yvv2Z~UDdS}_;*BMdV66o?bC3#jtiJ%dhEapCL>(x?4mOwY9w<$}{crY+DZM5-m< zriwu$z>;$!2#3Wk>4)3%U6+7ALR^6-!DkChlx>R*uD&&YD-A00>!b9u)w348M722Q zSvT&Nt|n2b;vvK&+fqb8AER#8^5p^ez73Srka^!#I=cDSCf!40^DC{R083n$jb{V? zy6BvwR5O8ipVQ*nruJs-5*1P)e(CXMgGo60tGtxz(MqP2N)|wQ^D&6tdb>Y_75@fN zad?zaiISvZJjt~Wt~TfLWwM}~pbx${7Sw0_FN{B4x3n(%rA@W*d~XMWL#5R&W-5I% zVCEzHBex=j7@Gu5XGVCLU9F@K-hULE5Q77E@W181N+h(k#LZI>pk4N&tyoOPTaS%v zMM2_UeNL|0P09QQCg8aI(Hiazg;{F=BW;Ipa;)>4k-1@747UE)IVrJ#&4A%asKG4b zRRk$uAiS1|@%QK>%VgU7tsvNd6>P8IPISl%bN9SvohjF6bk; z1$V&(P=IziW_J8wQ6R;m2|Y(Nnf%h^3*6~5{o|J=(%QwJEwwZ*3fJnYc+)X202bkr zn=u~~Z#;X2A4d4G?>I2GJt|76Aie*_w+=U{*V_k$xS9oz+sJi4lV}5l z)Kv^)rYQRKZMY5oSKZhl)b24LNLsoB^Gz0{T-EzLVyf3;Rry@_m(E7rx+rm}LW1s; z4Fbw4gE*nlKM=dBl$u%|-A=uDcHMnxP;wCIZ)Ng7y!GUzFqKJa0Zw9S0#h%5eg>MB z3K;Ek@fOCNi`TyBIvn@LWOZ!nZRx5{A@BRR0Ru|jH{m-EFMb#@HL8YJ+nqAzi zWn`YF^2t2`Y5kum^x*q_`iJrl_w|Z_KeEiswY28>YJ_R&tc$(d9H0tViIwh$eXrui zow7lgr!z28v1Ay5I7|Mv>dOO*2F0LNen84SyPF3j^A(~8YA`T(C~F9bm|DNH|GFCo zKxszNu{i7}4d$&(VTCRswhB-2_PC$x0>2BPND(RlAKbPlW>L8lL6Lz!hDv7+lOna$ z31F>ddsAz)+JmEoVb}yKnp=0-C#ygAn`2M?GVVy|rZV~0aRo8MFK8(?nD8c35pfv3(%fUM51ts+ z--tKJz;~pZBJdCWQR_7}2zL-34=1UJk0BY5et8BOBp%=nCXQNJ9YW{k++xm;3|QyMLoo~`CCT>w z{8j)nPbb_ZmXoKT0*QbQD=BK}Sq`K4X~#htmIFiF1Dl}$VAFwkv`j&Lv3X>Nd2q?T zjlPGhc#}^2Jd%oAZQuPPhiopw`%|N@`Ah?@xgDfwcyFVnQ8^@hS!|Y?$dfk#R&0h7 z=92F4DTs5gMAqsAO_zyE<<{)IapP?*^y0xd3FE(@lo$iFpRu@QU|Y_c`7k#W65fs! zQt{?@7iD7A`v$+8Am!5s%?mYn=e9m;9n4c2E zEh_(-0n5Aj2Kd4FB1TicNr%_*n5|R>#`zQFa4yA@h;axE(nS@?>zeFn3iW5xF1dM5 z3)<7Njyt=`0`6D_AFGj~KK<8!+e`BePvL{vEAU|#lj~QxSBb+oqgm>_TQ5zE!76;) z3Phiq`UGxv(6lnE-512|1g9p)+DnM7Z^oPfJ9q3Q#=N15&rb1W4HSkg$jBpUzHJnN zgjRhW_`Bc3iBnzNFQw?i>8;hsd>ymG`}Pj=p_b6lR2cB=HB5&--%5Tn`U{)7BnYiy z=}yrSN*9p(T`#ll3Pm&By&SCVUhK35bg5ZF{alG58}R{@SKRHkyB_w%-h=Q z{i(|AJsBpJcKYnEFZAJw?;tibL#j~{oNZe~pcP?17_l%U6L0?^@KVzYfZr8RYIjmH ze%jvQz;Er*7qmKPWGL3P1^rtP4~l$va0*HKO%J2V)+JrDRI z!z4f^FW5vdzz)AyO$f#2xiTEpZQ$Dvy$f&>ZWAsnEN(0Q+EBZKIA3GKSu*}n)9Cd& zu^X(q1??Q2n`K)kJ{%})5jT{le;Ki%lAY(Y)Zx!D)5Mh8{0x`$CsT|Sv=b;9*oy|` zpyK_d8Q`4^T3pTM#)u0s4Ju`-wl#zFH&5&JY`=&x7X@{N!<}0Tp`ZSY5zZ3-KJh^O zaQA|>)7L^G?!I(DZcU(b&_2<)+G?rn;3=#UTlu?ub`mn>ErR&;9p>&eulLE1MM-&v^$BksJ` z+cU%v3U-bLJ+Sr-x2d7?ZCpXMcL(u1w1E7B$-ETqSY0I|Fp=J<2UpmU5<~uhnjIK6 ze+HmBIyZHnV||q3c1vCMMm)yWk*9G85aYERFajzhF@M?LHEvSCWb*HYbBc#wBiJs% z+tdG!YkWa&CDv2a(3nNdE_DLFKR>Us^9@;7g2B6(bC&f>Nw!G!Ww{HB9UUXR&;PE> z()Nhvs{17**w}npVIeLO%-%szuFPPFd${cFtnbV)(weO&-qQbkaz@f9%~v)OR&JGKTK!DcEuRQJ33Co_0P8P#_P?5ux0+AvQIwOt}?aR_2i4A z?sXyz+zw=tBhU<+=X$&T#bNr!aE=KIYyv2B*LR&>dk`(2U*gzR!h%Fdb_LFhAJz!L z?VAa5cz%2#geYvPs}%zEO06oz1nw}f-drOOUJFw@vsh6kQ{^zx?^?AwRP-1#v9d;b zC5H>l(CPQ!dfHPbZgl`NILh`BKMB@=26W-W2ad1J_arPJWs}H?iJ}%rRrN{tjDmG4 zviNMk1WwtM6-DUsHV>_7XI+d5N(8Ok)mVuYX^}17LI&cyh5&Go_vFY{GMtj`n=Vnt zqX+MtWiXRijw`X!t)lGWZTXOAeRY>e2X25A3fMxM+HQ&{x^&_?UFRmYC!4)-`iMU# z5+EdOQOWm3#M+;mkUZ)j)95D!r!1O~CBo2GcHlV_@z!XYqp`q+BmCw#Xu}#G?WTL4 zH*!hWWie;=aq_#C(c3!C`+V9csZW;h%U5BD>;h+QlwIxl^5$dTi?YoZ(5KOUf;~QT z`(ir)qnk)H-&`U_36^`z1RIA{FV{ zYiw@k@&f$yXD>SIVV!$zF7FVvx#z;mqP*}8bA)&JeYOcKyC}&j_&sj5P-(mMF(V2V zP=H*ocmN9g=~1l3AXxYEA***2qSg1T$vmXNP(Yx5Jy-TX(IIfI_^xwLhu|%lcfl7k zvT~PYS=l7jPTp202plvm011(c`QlK65G?dDGIIAdf=81xQZpa|>#m)l1t3*cHnvHSXrOsCrBq0(m58cR-PR9HWokma4oA6XD6vSQ6^92d8B2^L_pG%>m^Q(vCeO zfK$FYDBT{=tn65mUiSYY=o}p$tM2S2u!bpyLlZRGwP@m7!22<-52KcXpwzul#@Uit zUxVAcXS9Jnfaj|?Lmk#mvgv}Yr1<#z6m_uOK8)fonE}P6Q*xhK{IvsR;}>v)^BoY{ zvRP1hyN?WgX^n%*$1B(Yo#{jO^n$VuT(?R9@z6;B=H-ql>^IU{{1N3V^loZc6tf-0 z!kZAA+VlsL!4medw_PD60Ss6{tcG^BDyF~KmY%CIA9i&Gx-_okuTLeOUl=n5mO%)| zQTwk8*R<5Or!Cx;62b1HW+_*#B6jp3WPK2T4(8!OLPYqB4cAVdMWiDls!b*cGFWB+YihY1J>ff);;9AlhhJR2jpu>?|0J0B=Es?;SSCNcjz z;d|%zx}=&0vO~%+6uMgUgvr*)f#DifxYBub0J%*}`H_gKSid`;BCTO@s%8=+JiLV0 z1kk>_bi$AmSm3Vdn#b=FQKTb*0qwkkHp6k4CbttXlVIb6)}R^fF!TwOzzWHB@(X&I%37d~`p z9#HQR1t#o};$&=+>E$D)x+szQ7b$Y|-tuFpJi7J^qI?E90s{w_7Glii$*+2pQu4_$bs!gD-e(sj*V=_7#Ne-wH+kIyU{jvtR_+M35j33f zZ?G^Nl^=aw)8FM<7ioWXzSmnZ(Fvy=sAO)U7f|bz#w<#!Ps?*SkqA&k0pbH&O)T`G zUF8$DxN(dOZ2{u*s>wuGHDWQBX_!XpjL(hNd-s|e+9Oo4x>eH-84&`gUv;fEI0Jm% zRIb=n`kG-fO^{f$WvO}yIJT3%?bW{h2PQFj(s?yJ3)2<>Gu+G8n;Rh#ll&$b%c!NO zK9<^Av07RA#~0-o;xMA5tE5`#XfvRU={f~IE8V5-)4pmr$T37iukzI`M>eN+B&7<- z6XOfJ|^Dlj=F(<>wBBY?lTiPEVPd)7rf09Gz2D|0eU z$pT?iWXijeTQ~?h!2`#(=B!9SzTM>oS@}L(JVh6|Loq)x2=I6%lukQN!mXf^%@#NH zjEg2!klQePoYVXJ^v8m6Em1zRUyu`?cJ&JW3zEnAs0fq_r8CrkqA4eS({qXgw$L8v zM=%znL{MAd?Pf-O<;mcc_@CQwRnOAx)Ct<;jRpKCzG z%m#)}%W&OBJF}+ab;f2XRaN-qcmgd?bUZjlYz>4q(9A|<$RJb^SuSNsdct-r9d zg!k+MHxH8oJve+;TwV(!QAL1Tuy;1r(0{0zg<)M3Eug}Mi&GB^=U6m#+$jpa5p@>H zUrkla^b>M|Y^T3Nc-go6o1E+t#6uDJu&KIsa5S@Z`75fgPvcUbFlVR4WCE6{v8M93mV28#iOv+hLIF;zEYMd=Yo z&>wollf*+Gow<}(r&U$k5qb~)S*hCtTu)3UM;rJ3$Gc>fIqTJn8)*uXVMRdyj7W#b zq_ZFIm_O;umUE>A-N9w>iYf+(>8Z#P;AlRE-;Z?8M8*kDo-D?AU;ql%aMcDlH`iD! zoZGBAXwg$UM567E?XsS8d04KZLUPYB=|6zAvn2*d68DW|{EznkmxtpuAE6kuWW8eH zJjC^B6kJVoWE)LmtWEfkY1G1gl7oyIZ1WE0Q?|>ZooJFEca3mPLwuk;{?~ECS10#0 z2Kz4?0v95pI^huky*7OnE($2+yYcSH6NuhIfpp9$-~?c}Peozxyd$8!=kiC>GR9dMda>=4lJR7B=Ath7tA`OvRM zGo#Z}N)8(27HDWNTCP!@JW@=izUU9;%Uz>{X<^o8NDmm_a_5ZlXxt=b?aiRNV2OIk z>8<#)vj})}{&r&pkVh#&JNnh;!c1P1y^kqG$!C4=cFyuG{4Ui?)IUHg_4-6(W9^D+ ztsIvMLleWn)RZn!qK?~}({5n;=rPF(;P`qE1QB}&H%F~IqCPbKlH5hKYhE{oXJ0Up%0G;J<9w8I zj^a)2H&%i=4e(j{DreS}oN%o6Lq3mWz}dA9Cx+%*RwbV{t`3fR8rw!$3uE~+iK}Rk-a{aUOZ?YNu$2&A)ceo-GE%jt;DVg&iQ~tUPqat6 zo&phq7JsI{46V~~dXLeFZnMUeA_v63e&|xsFnH#7#%NG;hQxI0K#wfSrz+s8!6{w! zLZy)~NR^R_wpM?mdEI2T*MW+~iZrGF=ag;O`2<>{IpIH=&)ba_e(xoQyVaW)GwF;yJzKx_V+A1c>8 zev+snnEV|nYuYz=Jb;)zZVG}wfL}nRCc-55uD>t+a~zg6t3v@1`Y_*-IvokpudGyE zb`O<;CwPAx_>4>TR=JBiYp8x_sp&yQEV= z&8XB*W{Omx;-*phu_0l1h{IJ6`zNWHYNAmu))GE1O(Hw?=S(9-T;|PKjTvuF0Y2Mt zOubgbl=tdNGor&`Kd`zUehd@=Rbkn)4nU@S4_{`5(hC|p^0B=x4-{oxIdqk?(KY(Z zdqK*m=Z0pG+8i^=u}7gwyz8fUOQG}w#_TKN18xJA#Ev{k2^uB5-VxglWjFik}+qVOA60g{v5l*S4yMIXqBhmD2aG^~WD35Kx* zB#mGdYl8|Qs(rby=PwJsZ`$L3A*^_L6hL-X@YaxJUOvt6{8-9vKeONkzy^TAo=1zH z;RgYB+Xm!@pYjXo_p(DNk4xn^G#P|U1XDvUj%AiG(xo_g)enR+*Q3DWCt4+-Da5Ke{J5 zTbr_ml;6%Qi+jSho@? z?z206rR!pyFI5*nOV|2)J-{kd040#?tbQ^sjct%-hACM9Fj={joxmVmE$Tl&yOBg- zBDPY(za$vbPda6wsISsvIB#IYna%hwgCt-r#|DJ6x|QdpYi6y$V*dyFXgL?kxHBtF2VXXXX`S7Q=|DIS-yu*1#z!QYu-bg_k1$e zPOC@j>0%Yw1rJ1g6XOv``~!Jb8K}M!9YMiF@6)XhcZT})$I=Ed*-Q+`VC(_@&GXi1 zOwGbCmZg3Rz#`pJ&=SlokVmHJT9Mvd5-&k6C1q8-yk(rtd+y}0{Xx=o58*7k_ac*Y zC}&#-LiCABUYD*dB(0@@$tw52nJP=elKV)B@`aBtDRGjr7GcPtgwQXvGX*V_F(#;B z!jU?hXH=U)9c|)l1mUSEXc4^n?-Jv_SQ9rU3_MmGRdj03=C#nSEzW4&{Iib(wSJ_^ zoo6}kOLavC7?m61nc94O{qvFeRGf}3=|DVN4XHY-z%#KMYTm>w`}*|#+nb!=@sB8+ z$k3MU(`h0sZz5KOxz)_|NfMmMQ&^?b@EH_Y=w9WSQwTM72xRqGFdkF()hPr1)!r`m zUoG)CIa{@d20huLtnnrrPShI=mdk^--BJs49rreH3Us5I-=m*nQE1OlTqK;g$TdcG ztSG~#L2!<}qaN+WwykMdaQd@&`GI|)d1Q}h7sb=j)omZhj{CWNbvBOe!4Ojg-Y`T?V zjS>tT&c&!MST+@zP^m_}K#~T`T#OsL1VNSll`FP+RXcSd;|^>}2?+)#!YoB&1{{95-mX%Z1v>``2<-C1%dZ7`%7!FG28|b(^Kz~Xxf{6uyUmBrl=rfa^hX!;Ha`f1Lx!#7L!-T*8D(6jkF9}Y ziafJc45q6q2?Y^0>`6d_jfD+zV{yV%e!aG0soRm=h2J#Yq*L@|vmA$bX$7q~TOuBO5Nolzc}DyFh0p&%?~t z>F%&lxthGxx+9bUcov6VW^}cF63*In?rDA#XUWU`PDa`j{Hy(RzK5An0UZok+h@m$ z^PHM$z~J=%dbr0J!^0>g_gSScfMch>jlus# z?e5-P^FPFOxeZUicjIdQTYK@)F!_R(Gl%bw%Nr{Lsc5FjOLZ0j3m1UDV;L>_G{;FI zb$qcemJIA>7NXmzn(4In6eQOEAs^z(S$n`}T7Y%l=2r$>psCIvzZ=VO0>b#N(&!$1ban(HjPI;80_(@51F^YHpM~w$h)*U; zv{&e(pK;^>=CbIzfMo#1jw6hybM=W3!$U{RgB#fF`eFs6@#4E< zfMn0)PM{|-vByEYUS>5?tjK=B0kO!B!wIRdXMz3a#3b3_Y66!wHzcXwpUfJ{RmC<4# zNuy79SN{AH6xYOMU}p}J`l-+A=WZwDT#8W4;pm2G4~kRk$}|WX-Bakq(%29EGUs~? zb~ocMFO#G82quoL>)k3PXW%XTXMId<%ug(0jeM0ry)EYzT2O(HA7SDb3@bIfom8p+ z#YuJNin%WP$ZuII*M3540y8$4TukcBx=`9=snydrJ>Hq$@Vi3=jV{psU3O~3&NnA~ zHzdYFhe$>ym#uc`U10TeyL0QyJjIl+nL<%+O~9yMD=R`z&KklJfoc zMw*UT-u*0^sXaM=`k3o2#t?Hi(z)D=w)5h(YxOOWbSCf!5dO207XiqnR9=PxGwe^cB@>XJ2#6Gms z%>vBq#QJM-ilMx8{bzzx*vBLrhzxREU3=Ni&a?{lZAl)Ls41G=H`X=V_y*KXG}%eI zRX81#+ZuyoA@Ze<&)Fx6vLMCd0(LPtGpNKw21*TH!HOOlW=$m%;}<^U=Q9ffUN)@? zRL!Q9Scj)`T*Rgky$rc@f+#FedPXS)TFJ=JlKX$4Wt0J1YdGx=2R{ID>eYSR4IZs9 z5{`2#cnN7R7rAHvQ#LILHtN)bo;0u()ayFyFFeqfOiLBf<>d7MIt?@mix2%{jBF^h z@7KHeDoe{qbg{zPxdSU+X)O8Ij4U-k@V54XZqHn;_~g!&U_%q2I4&`crLn}b{@CED z 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�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 E0QpX6R+`OY!LCxnlNvhJw1qzN;m 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

  1. Qess*0F3EJIjE}ik}=#a0e&otNR^K6uUR% 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 %?9)T=C3B8LcOSS@fL-Di=n>Tb3-20 z?a@Ud#+Nl|N2kX*b9OlQL$oza*wpQC(~v|8a#VwLWH7L(P?4{}tBrw;vTFge!YtG;O(FxE z%sRTI(lpL^4oxD1KNuF$#%czIIQc*dcR}na{I<%~t-FBeN(WXe)jyp``I8}mt^a+E zh4#5=(d9+t+={BdAKz`469)^wM0J={?kjU z;X7A;yPW`6KRRPI$EmX~tc)}2N;j~FskPb7Pn~U@zSOZ@dEe9twuf&|n2QrGC`J@x zH{g(&z7Oh+dGe-a6TZ>k2xc7aAk}qJCO5To= z+nx1EPnCvi+A<`D8OU}l%mI{AB6k9{38xM;;Ama2vT;hqAZeqF?}J>yhj7tlg!*a{ z`}sWV=PnMKz}-Ds*PPF9+*GskeE?>_`1y?S$X}7fj)L;*T|vt5VKY!gi8= z_(*gW}(M%521`z={?slyHI!DCfD(L-TXmn0(_A6?uD!fmW_XQ$n`%#_$Xq!*y~uSv)82GqolHlSxIhLJsjB+v|5>?5ic}%&Moto7-{~!P z%%~(x4SzA?7cMoM6|BG(`T3{kexIRN@}BoSvSq)e@*T_ajJX+KZta*G^U_qR*p}<< zm2chgoGXkdW@}dX|A}OPo=DEerv^lcB#Tv~_#MZHqV=lStR72pko)AM1l~DCbe?DL zu_w`v!8+#CTFx@6661^fx#35a?hy2s=YlH2I3Q;B4J$>R?xPBW(nANvl6S`r0{Wq+ zfdklvtCjNywB?m4GHbA1udnpN?FW-^z2<6sCQH-f#0 zI@3K+x}o0#j|I<%cSPi8^Szyg?}!s_p~cB!m>qIcU!m_&wD~6@9{jXG<|ho!404Vm z?IHrt-gD?J^?3sCDxx8&yVut{@^y*^)7T5uyAU)m6qTw0#$8DP$<3V*A4KK|+|pt< zM_}qPAB56C^EyyK-Uzg)>VEan(3dWteh$L0P z%GN814d7zRc8C#bq<_JFX_lDTSX=Ap^0m>CRm!W#n^#TU!WY5*evZE3fdLk)w6^@O zTQ+;iVr*q%!G2%Bpwp7MXN!UGVavHl@kwq({D$xXT2g-LL)n^ea;m(;Xh45Xfu#pZ zh2-`h4WzEQ{nEwCKbIHVPc%$Fz_t7>`eoNtOXuRi@;1YA1HSZfp-*fbv=Jd{IL^W2cv@}ei$ObJ~d=+6T8_229NPsk~*fp9}5w^ zi=#wI`f#91Z)@$*w1fjYVco$gH5beY@tScU3Q?=$2}&{#M8?`P>&3>M=FKF{4addh z>=*OjjKj;EMX4HXuX?^?4z^%D#ZAd`DUjV=;6dsP+v@@=i_bAy@e)=d97aJ>hpm;= zL-WmqCfYurcVl+QKRVjp$eOPv%k2P}GI0Aok{$&82uy6`vGkUL>Mey3TTK$_@Dx%1 z@vR}(9M~F|i=DTNuht<3j)FFP0h^DXZTQ&MmtmCFEZGxS_CXb8@Tf~bcT702varK> z*Y>DZNqBqV-P88~MbCd)7jrcVm2?|wk1nKBPVQ{l%jr^~~#A0f#3E-Qt`oAJG z!5NiHcHag@&*997m6oFW?xe$gxQ`?!{>6PH^Pj|0_D0`oG6KPiOxx|sdPhcNN$%2s zNv!znTs$3!>Y=ece#m7GZ#7lgexSQWiSMOonCyRO7L{oY4V;>OEARNc>*8K@eevFY z!xNBAf(UqH2?p9_iGIzKeHsXNPZ@2X3B6xjCti2pHA-->T|g510$m_3W=#KQjAqon zqXt3g=t4|4q%9=U+;7%pC0F_XP(+cw^DP$g4T$k!m?g9ONGtzbD7W<&1`M!`D6Lqz z+J+yj)EqKh21tAEwxSepDH5Qw*bmhy#et^XF?+)uEtz=9~u`aW3=53+b$d51wHBMmSAtUuXCbvVkC#1%nEn$ zBZly%%YR?fqN}-Xd`iW+Y(xCW=H_;C6cf8W?&#jl_{th55>8QIeB?}>OjskDmv+X= zfnbP)3S2D-Ew=u@nlimO(j=ZW$7j$T+I@cGoH0V#dm)FqckMhp7X3`~W9E1$L(e7P zNZ!hOrk^cnzK^?P0^dctHc|{%1dS`XrS2^K6rWU7Ob+-4aKie5^ z0dXF^Hus|rjNbWbA?1@c8` z!$t-vxW`(*@8yw6hV&r=-c*4n)tZl_anR(3h!@dyGekw7}R zskKkrtT8IqmiYHihb({IF{{qR3-tE%V

    cux1uS_!oZiEanmn_!5|&w=Tab8fglK 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 & MNT_NOEXEC) || + (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC); + } ++EXPORT_SYMBOL_GPL(path_noexec); + + #ifdef CONFIG_USELIB + /* +diff -Nurp linux-4.19.1-aufs/fs/fcntl.c linux-4.19.1-aufs-mod/fs/fcntl.c +--- linux-4.19.1-aufs/fs/fcntl.c 2018-11-05 20:06:43.409301971 +0200 ++++ linux-4.19.1-aufs-mod/fs/fcntl.c 2018-11-05 20:08:19.015106720 +0200 +@@ -85,6 +85,7 @@ int setfl(int fd, struct file * filp, un + out: + return error; + } ++EXPORT_SYMBOL_GPL(setfl); + + static void f_modown(struct file *filp, struct pid *pid, enum pid_type type, + int force) +diff -Nurp linux-4.19.1-aufs/fs/file_table.c linux-4.19.1-aufs-mod/fs/file_table.c +--- linux-4.19.1-aufs/fs/file_table.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/fs/file_table.c 2018-11-05 21:04:47.298905524 +0200 +@@ -161,6 +161,7 @@ over: + } + return ERR_PTR(-ENFILE); + } ++EXPORT_SYMBOL_GPL(alloc_empty_file); + + /* + * Variant of alloc_empty_file() that doesn't check and modify nr_files. +@@ -323,6 +324,7 @@ void flush_delayed_fput(void) + { + delayed_fput(NULL); + } ++EXPORT_SYMBOL_GPL(flush_delayed_fput); + + static DECLARE_DELAYED_WORK(delayed_fput_work, delayed_fput); + +@@ -365,6 +367,7 @@ void __fput_sync(struct file *file) + } + + EXPORT_SYMBOL(fput); ++EXPORT_SYMBOL_GPL(__fput_sync); + + void __init files_init(void) + { +diff -Nurp linux-4.19.1-aufs/fs/inode.c linux-4.19.1-aufs-mod/fs/inode.c +--- linux-4.19.1-aufs/fs/inode.c 2018-11-05 20:06:43.409301971 +0200 ++++ linux-4.19.1-aufs-mod/fs/inode.c 2018-11-05 20:08:19.015106720 +0200 +@@ -1666,6 +1666,7 @@ int update_time(struct inode *inode, str + + return update_time(inode, time, flags); + } ++EXPORT_SYMBOL_GPL(update_time); + + /** + * touch_atime - update the access time +diff -Nurp linux-4.19.1-aufs/fs/namespace.c linux-4.19.1-aufs-mod/fs/namespace.c +--- linux-4.19.1-aufs/fs/namespace.c 2018-11-05 20:06:43.410301989 +0200 ++++ linux-4.19.1-aufs-mod/fs/namespace.c 2018-11-05 20:08:19.015106720 +0200 +@@ -437,6 +437,7 @@ void __mnt_drop_write(struct vfsmount *m + mnt_dec_writers(real_mount(mnt)); + preempt_enable(); + } ++EXPORT_SYMBOL_GPL(__mnt_drop_write); + + /** + * mnt_drop_write - give up write access to a mount +@@ -1832,6 +1833,7 @@ int iterate_mounts(int (*f)(struct vfsmo + } + return 0; + } ++EXPORT_SYMBOL_GPL(iterate_mounts); + + static void cleanup_group_ids(struct mount *mnt, struct mount *end) + { +diff -Nurp linux-4.19.1-aufs/fs/notify/group.c linux-4.19.1-aufs-mod/fs/notify/group.c +--- linux-4.19.1-aufs/fs/notify/group.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/fs/notify/group.c 2018-11-05 20:09:24.538349333 +0200 +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + #include + #include "fsnotify.h" +@@ -112,6 +113,7 @@ void fsnotify_get_group(struct fsnotify_ + { + refcount_inc(&group->refcnt); + } ++EXPORT_SYMBOL_GPL(fsnotify_get_group); + + /* + * Drop a reference to a group. Free it if it's through. +@@ -121,6 +123,7 @@ void fsnotify_put_group(struct fsnotify_ + if (refcount_dec_and_test(&group->refcnt)) + fsnotify_final_destroy_group(group); + } ++EXPORT_SYMBOL_GPL(fsnotify_put_group); + + /* + * Create a new fsnotify_group and hold a reference for the group returned. +@@ -150,6 +153,7 @@ struct fsnotify_group *fsnotify_alloc_gr + + return group; + } ++EXPORT_SYMBOL_GPL(fsnotify_alloc_group); + + int fsnotify_fasync(int fd, struct file *file, int on) + { +diff -Nurp linux-4.19.1-aufs/fs/notify/mark.c linux-4.19.1-aufs-mod/fs/notify/mark.c +--- linux-4.19.1-aufs/fs/notify/mark.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/fs/notify/mark.c 2018-11-05 20:53:39.635340341 +0200 +@@ -125,6 +125,7 @@ __u32 fsnotify_conn_mask(struct fsnotify + + return *fsnotify_conn_mask_p(conn); + } ++EXPORT_SYMBOL_GPL(fsnotify_put_mark); + + static void __fsnotify_recalc_mask(struct fsnotify_mark_connector *conn) + { +@@ -289,6 +290,7 @@ static bool fsnotify_get_mark_safe(struc + } + return false; + } ++EXPORT_SYMBOL_GPL(fsnotify_destroy_mark); + + /* + * Puts marks and wakes up group destruction if necessary. +@@ -572,6 +574,7 @@ out_err: + spin_unlock(&mark->lock); + return err; + } ++EXPORT_SYMBOL_GPL(fsnotify_init_mark); + + /* + * Attach an initialized mark to a given group and fs object. +diff -Nurp linux-4.19.1-aufs/fs/open.c linux-4.19.1-aufs-mod/fs/open.c +--- linux-4.19.1-aufs/fs/open.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/fs/open.c 2018-11-05 20:55:37.785556160 +0200 +@@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, l + inode_unlock(dentry->d_inode); + return ret; + } ++EXPORT_SYMBOL_GPL(do_truncate); + + long vfs_truncate(const struct path *path, loff_t length) + { +diff -Nurp linux-4.19.1-aufs/fs/read_write.c linux-4.19.1-aufs-mod/fs/read_write.c +--- linux-4.19.1-aufs/fs/read_write.c 2018-11-05 20:06:43.410301989 +0200 ++++ linux-4.19.1-aufs-mod/fs/read_write.c 2018-11-05 20:08:19.016106739 +0200 +@@ -459,6 +459,7 @@ ssize_t vfs_read(struct file *file, char + + return ret; + } ++EXPORT_SYMBOL_GPL(vfs_read); + + static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) + { +@@ -499,6 +500,7 @@ vfs_readf_t vfs_readf(struct file *file) + return new_sync_read; + return ERR_PTR(-ENOSYS); + } ++EXPORT_SYMBOL_GPL(vfs_readf); + + vfs_writef_t vfs_writef(struct file *file) + { +@@ -510,6 +512,7 @@ vfs_writef_t vfs_writef(struct file *fil + return new_sync_write; + return ERR_PTR(-ENOSYS); + } ++EXPORT_SYMBOL_GPL(vfs_writef); + + ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos) + { +@@ -579,6 +582,7 @@ ssize_t vfs_write(struct file *file, con + + return ret; + } ++EXPORT_SYMBOL_GPL(vfs_write); + + static inline loff_t file_pos_read(struct file *file) + { +diff -Nurp linux-4.19.1-aufs/fs/splice.c linux-4.19.1-aufs-mod/fs/splice.c +--- linux-4.19.1-aufs/fs/splice.c 2018-11-05 20:06:43.410301989 +0200 ++++ linux-4.19.1-aufs-mod/fs/splice.c 2018-11-05 20:08:19.016106739 +0200 +@@ -851,6 +851,7 @@ long do_splice_from(struct pipe_inode_in + + return splice_write(pipe, out, ppos, len, flags); + } ++EXPORT_SYMBOL_GPL(do_splice_from); + + /* + * Attempt to initiate a splice from a file to a pipe. +@@ -880,6 +881,7 @@ long do_splice_to(struct file *in, loff_ + + return splice_read(in, ppos, pipe, len, flags); + } ++EXPORT_SYMBOL_GPL(do_splice_to); + + /** + * splice_direct_to_actor - splices data directly between two non-pipes +diff -Nurp linux-4.19.1-aufs/fs/sync.c linux-4.19.1-aufs-mod/fs/sync.c +--- linux-4.19.1-aufs/fs/sync.c 2018-11-05 20:06:43.410301989 +0200 ++++ linux-4.19.1-aufs-mod/fs/sync.c 2018-11-05 20:08:19.016106739 +0200 +@@ -39,6 +39,7 @@ int __sync_filesystem(struct super_block + sb->s_op->sync_fs(sb, wait); + return __sync_blockdev(sb->s_bdev, wait); + } ++EXPORT_SYMBOL_GPL(__sync_filesystem); + + /* + * Write out and wait upon all dirty data associated with this +diff -Nurp linux-4.19.1-aufs/fs/xattr.c linux-4.19.1-aufs-mod/fs/xattr.c +--- linux-4.19.1-aufs/fs/xattr.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/fs/xattr.c 2018-11-05 20:08:19.016106739 +0200 +@@ -295,6 +295,7 @@ vfs_getxattr_alloc(struct dentry *dentry + *xattr_value = value; + return error; + } ++EXPORT_SYMBOL_GPL(vfs_getxattr_alloc); + + ssize_t + __vfs_getxattr(struct dentry *dentry, struct inode *inode, const char *name, +diff -Nurp linux-4.19.1-aufs/kernel/task_work.c linux-4.19.1-aufs-mod/kernel/task_work.c +--- linux-4.19.1-aufs/kernel/task_work.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/kernel/task_work.c 2018-11-05 20:08:19.017106758 +0200 +@@ -116,3 +116,4 @@ void task_work_run(void) + } while (work); + } + } ++EXPORT_SYMBOL_GPL(task_work_run); +diff -Nurp linux-4.19.1-aufs/security/commoncap.c linux-4.19.1-aufs-mod/security/commoncap.c +--- linux-4.19.1-aufs/security/commoncap.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/security/commoncap.c 2018-11-05 20:08:19.017106758 +0200 +@@ -1336,12 +1336,14 @@ int cap_mmap_addr(unsigned long addr) + } + return ret; + } ++EXPORT_SYMBOL_GPL(cap_mmap_addr); + + int cap_mmap_file(struct file *file, unsigned long reqprot, + unsigned long prot, unsigned long flags) + { + return 0; + } ++EXPORT_SYMBOL_GPL(cap_mmap_file); + + #ifdef CONFIG_SECURITY + +diff -Nurp linux-4.19.1-aufs/security/device_cgroup.c linux-4.19.1-aufs-mod/security/device_cgroup.c +--- linux-4.19.1-aufs/security/device_cgroup.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/security/device_cgroup.c 2018-11-05 20:08:19.017106758 +0200 +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -824,3 +825,4 @@ int __devcgroup_check_permission(short t + + return 0; + } ++EXPORT_SYMBOL_GPL(__devcgroup_check_permission); +diff -Nurp linux-4.19.1-aufs/security/security.c linux-4.19.1-aufs-mod/security/security.c +--- linux-4.19.1-aufs/security/security.c 2018-10-22 09:37:37.000000000 +0300 ++++ linux-4.19.1-aufs-mod/security/security.c 2018-11-05 20:08:19.017106758 +0200 +@@ -542,6 +542,7 @@ int security_path_rmdir(const struct pat + return 0; + return call_int_hook(path_rmdir, 0, dir, dentry); + } ++EXPORT_SYMBOL_GPL(security_path_rmdir); + + int security_path_unlink(const struct path *dir, struct dentry *dentry) + { +@@ -558,6 +559,7 @@ int security_path_symlink(const struct p + return 0; + return call_int_hook(path_symlink, 0, dir, dentry, old_name); + } ++EXPORT_SYMBOL_GPL(security_path_symlink); + + int security_path_link(struct dentry *old_dentry, const struct path *new_dir, + struct dentry *new_dentry) +@@ -566,6 +568,7 @@ int security_path_link(struct dentry *ol + return 0; + return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry); + } ++EXPORT_SYMBOL_GPL(security_path_link); + + int security_path_rename(const struct path *old_dir, struct dentry *old_dentry, + const struct path *new_dir, struct dentry *new_dentry, +@@ -593,6 +596,7 @@ int security_path_truncate(const struct + return 0; + return call_int_hook(path_truncate, 0, path); + } ++EXPORT_SYMBOL_GPL(security_path_truncate); + + int security_path_chmod(const struct path *path, umode_t mode) + { +@@ -600,6 +604,7 @@ int security_path_chmod(const struct pat + return 0; + return call_int_hook(path_chmod, 0, path, mode); + } ++EXPORT_SYMBOL_GPL(security_path_chmod); + + int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) + { +@@ -607,6 +612,7 @@ int security_path_chown(const struct pat + return 0; + return call_int_hook(path_chown, 0, path, uid, gid); + } ++EXPORT_SYMBOL_GPL(security_path_chown); + + int security_path_chroot(const struct path *path) + { +@@ -692,6 +698,7 @@ int security_inode_readlink(struct dentr + return 0; + return call_int_hook(inode_readlink, 0, dentry); + } ++EXPORT_SYMBOL_GPL(security_inode_readlink); + + int security_inode_follow_link(struct dentry *dentry, struct inode *inode, + bool rcu) +@@ -707,6 +714,7 @@ int security_inode_permission(struct ino + return 0; + return call_int_hook(inode_permission, 0, inode, mask); + } ++EXPORT_SYMBOL_GPL(security_inode_permission); + + int security_inode_setattr(struct dentry *dentry, struct iattr *attr) + { +@@ -878,6 +886,7 @@ int security_file_permission(struct file + + return fsnotify_perm(file, mask); + } ++EXPORT_SYMBOL_GPL(security_file_permission); + + int security_file_alloc(struct file *file) + { +@@ -937,6 +946,7 @@ int security_mmap_file(struct file *file + return ret; + return ima_file_mmap(file, prot); + } ++EXPORT_SYMBOL_GPL(security_mmap_file); + + int security_mmap_addr(unsigned long addr) + { diff --git a/kernel/tools/perf/files/patches/mageia_4_19/fs-aufs-4.19.patch b/kernel/tools/perf/files/patches/mageia_4_19/fs-aufs-4.19.patch new file mode 100644 index 0000000000..5f947e7194 --- /dev/null +++ b/kernel/tools/perf/files/patches/mageia_4_19/fs-aufs-4.19.patch @@ -0,0 +1,37882 @@ + Documentation/ABI/testing/debugfs-aufs | 55 + + Documentation/ABI/testing/sysfs-aufs | 31 + + Documentation/filesystems/aufs/README | 394 ++++ + Documentation/filesystems/aufs/design/01intro.txt | 158 ++ + Documentation/filesystems/aufs/design/02struct.txt | 245 +++ + .../filesystems/aufs/design/03atomic_open.txt | 72 + + Documentation/filesystems/aufs/design/03lookup.txt | 100 ++ + Documentation/filesystems/aufs/design/04branch.txt | 61 + + .../filesystems/aufs/design/05wbr_policy.txt | 51 + + Documentation/filesystems/aufs/design/06dirren.dot | 31 + + Documentation/filesystems/aufs/design/06dirren.txt | 89 + + Documentation/filesystems/aufs/design/06fhsm.txt | 105 ++ + Documentation/filesystems/aufs/design/06mmap.txt | 59 + + Documentation/filesystems/aufs/design/06xattr.txt | 81 + + Documentation/filesystems/aufs/design/07export.txt | 45 + + Documentation/filesystems/aufs/design/08shwh.txt | 39 + + Documentation/filesystems/aufs/design/10dynop.txt | 34 + + MAINTAINERS | 13 + + drivers/block/loop.c | 18 + + fs/Kconfig | 1 + + fs/Makefile | 1 + + fs/aufs/Kconfig | 199 +++ + fs/aufs/Makefile | 38 + + fs/aufs/aufs.h | 49 + + fs/aufs/branch.c | 1409 +++++++++++++++ + fs/aufs/branch.h | 354 ++++ + fs/aufs/cpup.c | 1431 +++++++++++++++ + fs/aufs/cpup.h | 87 + + fs/aufs/dbgaufs.c | 506 ++++++ + fs/aufs/dbgaufs.h | 40 + + fs/aufs/dcsub.c | 212 +++ + fs/aufs/dcsub.h | 124 ++ + fs/aufs/debug.c | 427 +++++ + fs/aufs/debug.h | 213 +++ + fs/aufs/dentry.c | 1140 ++++++++++++ + fs/aufs/dentry.h | 254 +++ + fs/aufs/dinfo.c | 541 ++++++ + fs/aufs/dir.c | 749 ++++++++ + fs/aufs/dir.h | 119 ++ + fs/aufs/dirren.c | 1303 ++++++++++++++ + fs/aufs/dirren.h | 127 ++ + fs/aufs/dynop.c | 357 ++++ + fs/aufs/dynop.h | 62 + + fs/aufs/export.c | 825 +++++++++ + fs/aufs/f_op.c | 806 +++++++++ + fs/aufs/fhsm.c | 413 +++++ + fs/aufs/file.c | 850 +++++++++ + fs/aufs/file.h | 328 ++++ + fs/aufs/finfo.c | 136 ++ + fs/aufs/fstype.h | 388 ++++ + fs/aufs/hbl.h | 52 + + fs/aufs/hfsnotify.c | 276 +++ + fs/aufs/hfsplus.c | 47 + + fs/aufs/hnotify.c | 707 ++++++++ + fs/aufs/i_op.c | 1493 ++++++++++++++++ + fs/aufs/i_op_add.c | 922 ++++++++++ + fs/aufs/i_op_del.c | 499 ++++++ + fs/aufs/i_op_ren.c | 1236 +++++++++++++ + fs/aufs/iinfo.c | 273 +++ + fs/aufs/inode.c | 515 ++++++ + fs/aufs/inode.h | 683 +++++++ + fs/aufs/ioctl.c | 207 +++ + fs/aufs/lcnt.h | 173 ++ + fs/aufs/loop.c | 135 ++ + fs/aufs/loop.h | 40 + + fs/aufs/magic.mk | 31 + + fs/aufs/module.c | 259 +++ + fs/aufs/module.h | 89 + + fs/aufs/mvdown.c | 692 ++++++++ + fs/aufs/opts.c | 1864 +++++++++++++++++++ + fs/aufs/opts.h | 212 +++ + fs/aufs/plink.c | 503 ++++++ + fs/aufs/poll.c | 38 + + fs/aufs/posix_acl.c | 90 + + fs/aufs/procfs.c | 158 ++ + fs/aufs/rdu.c | 369 ++++ + fs/aufs/rwsem.h | 60 + + fs/aufs/sbinfo.c | 300 ++++ + fs/aufs/super.c | 1035 +++++++++++ + fs/aufs/super.h | 576 ++++++ + fs/aufs/sysaufs.c | 80 + + fs/aufs/sysaufs.h | 89 + + fs/aufs/sysfs.c | 337 ++++ + fs/aufs/sysrq.c | 147 ++ + fs/aufs/vdir.c | 882 +++++++++ + fs/aufs/vfsub.c | 889 +++++++++ + fs/aufs/vfsub.h | 342 ++++ + fs/aufs/wbr_policy.c | 817 +++++++++ + fs/aufs/whout.c | 1049 +++++++++++ + fs/aufs/whout.h | 73 + + fs/aufs/wkq.c | 379 ++++ + fs/aufs/wkq.h | 76 + + fs/aufs/xattr.c | 343 ++++ + fs/aufs/xino.c | 1877 ++++++++++++++++++++ + fs/dcache.c | 2 +- + fs/fcntl.c | 4 +- + fs/inode.c | 2 +- + fs/namespace.c | 6 + + fs/proc/base.c | 2 +- + fs/proc/nommu.c | 5 +- + fs/proc/task_mmu.c | 7 +- + fs/proc/task_nommu.c | 5 +- + fs/read_write.c | 22 + + fs/splice.c | 10 +- + fs/sync.c | 2 +- + include/linux/fs.h | 10 + + include/linux/lockdep.h | 3 + + include/linux/mm.h | 22 + + include/linux/mm_types.h | 2 + + include/linux/mnt_namespace.h | 3 + + include/linux/splice.h | 6 + + include/uapi/linux/aufs_type.h | 435 +++++ + kernel/fork.c | 2 +- + kernel/locking/lockdep.c | 3 +- + mm/Makefile | 2 +- + mm/filemap.c | 2 +- + mm/mmap.c | 33 +- + mm/nommu.c | 8 +- + mm/prfile.c | 86 + + 119 files changed, 36738 insertions(+), 30 deletions(-) + +diff --git a/Documentation/ABI/testing/debugfs-aufs b/Documentation/ABI/testing/debugfs-aufs +new file mode 100644 +index 000000000000..4a6694194ba6 +--- /dev/null ++++ b/Documentation/ABI/testing/debugfs-aufs +@@ -0,0 +1,55 @@ ++What: /debug/aufs/si_/ ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ Under /debug/aufs, a directory named si_ is created ++ per aufs mount, where is a unique id generated ++ internally. ++ ++What: /debug/aufs/si_/plink ++Date: Apr 2013 ++Contact: J. R. Okajima ++Description: ++ It has three lines and shows the information about the ++ pseudo-link. The first line is a single number ++ representing a number of buckets. The second line is a ++ number of pseudo-links per buckets (separated by a ++ blank). The last line is a single number representing a ++ total number of psedo-links. ++ When the aufs mount option 'noplink' is specified, it ++ will show "1\n0\n0\n". ++ ++What: /debug/aufs/si_/xib ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the consumed blocks by xib (External Inode Number ++ Bitmap), its block size and file size. ++ When the aufs mount option 'noxino' is specified, it ++ will be empty. About XINO files, see the aufs manual. ++ ++What: /debug/aufs/si_/xi0, xi1 ... xiN and xiN-N ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the consumed blocks by xino (External Inode Number ++ Translation Table), its link count, block size and file ++ size. ++ Due to the file size limit, there may exist multiple ++ xino files per branch. In this case, "-N" is added to ++ the filename and it corresponds to the index of the ++ internal xino array. "-0" is omitted. ++ When the aufs mount option 'noxino' is specified, Those ++ entries won't exist. About XINO files, see the aufs ++ manual. ++ ++What: /debug/aufs/si_/xigen ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the consumed blocks by xigen (External Inode ++ Generation Table), its block size and file size. ++ If CONFIG_AUFS_EXPORT is disabled, this entry will not ++ be created. ++ When the aufs mount option 'noxino' is specified, it ++ will be empty. About XINO files, see the aufs manual. +diff --git a/Documentation/ABI/testing/sysfs-aufs b/Documentation/ABI/testing/sysfs-aufs +new file mode 100644 +index 000000000000..82f9518495ea +--- /dev/null ++++ b/Documentation/ABI/testing/sysfs-aufs +@@ -0,0 +1,31 @@ ++What: /sys/fs/aufs/si_/ ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ Under /sys/fs/aufs, a directory named si_ is created ++ per aufs mount, where is a unique id generated ++ internally. ++ ++What: /sys/fs/aufs/si_/br0, br1 ... brN ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the abolute path of a member directory (which ++ is called branch) in aufs, and its permission. ++ ++What: /sys/fs/aufs/si_/brid0, brid1 ... bridN ++Date: July 2013 ++Contact: J. R. Okajima ++Description: ++ It shows the id of a member directory (which is called ++ branch) in aufs. ++ ++What: /sys/fs/aufs/si_/xi_path ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the abolute path of XINO (External Inode Number ++ Bitmap, Translation Table and Generation Table) file ++ even if it is the default path. ++ When the aufs mount option 'noxino' is specified, it ++ will be empty. About XINO files, see the aufs manual. +diff --git a/Documentation/filesystems/aufs/README b/Documentation/filesystems/aufs/README +new file mode 100644 +index 000000000000..79eb50ae06bd +--- /dev/null ++++ b/Documentation/filesystems/aufs/README +@@ -0,0 +1,394 @@ ++ ++Aufs4 -- advanced multi layered unification filesystem version 4.x ++http://aufs.sf.net ++Junjiro R. Okajima ++ ++ ++0. Introduction ++---------------------------------------- ++In the early days, aufs was entirely re-designed and re-implemented ++Unionfs Version 1.x series. Adding many original ideas, approaches, ++improvements and implementations, it becomes totally different from ++Unionfs while keeping the basic features. ++Recently, Unionfs Version 2.x series begin taking some of the same ++approaches to aufs1's. ++Unionfs is being developed by Professor Erez Zadok at Stony Brook ++University and his team. ++ ++Aufs4 supports linux-4.0 and later, and for linux-3.x series try aufs3. ++If you want older kernel version support, try aufs2-2.6.git or ++aufs2-standalone.git repository, aufs1 from CVS on SourceForge. ++ ++Note: it becomes clear that "Aufs was rejected. Let's give it up." ++ According to Christoph Hellwig, linux rejects all union-type ++ filesystems but UnionMount. ++ ++ ++PS. Al Viro seems have a plan to merge aufs as well as overlayfs and ++ UnionMount, and he pointed out an issue around a directory mutex ++ lock and aufs addressed it. But it is still unsure whether aufs will ++ be merged (or any other union solution). ++ ++ ++ ++1. Features ++---------------------------------------- ++- unite several directories into a single virtual filesystem. The member ++ directory is called as a branch. ++- you can specify the permission flags to the branch, which are 'readonly', ++ 'readwrite' and 'whiteout-able.' ++- by upper writable branch, internal copyup and whiteout, files/dirs on ++ readonly branch are modifiable logically. ++- dynamic branch manipulation, add, del. ++- etc... ++ ++Also there are many enhancements in aufs, such as: ++- test only the highest one for the directory permission (dirperm1) ++- copyup on open (coo=) ++- 'move' policy for copy-up between two writable branches, after ++ checking free space. ++- xattr, acl ++- readdir(3) in userspace. ++- keep inode number by external inode number table ++- keep the timestamps of file/dir in internal copyup operation ++- seekable directory, supporting NFS readdir. ++- whiteout is hardlinked in order to reduce the consumption of inodes ++ on branch ++- do not copyup, nor create a whiteout when it is unnecessary ++- revert a single systemcall when an error occurs in aufs ++- remount interface instead of ioctl ++- maintain /etc/mtab by an external command, /sbin/mount.aufs. ++- loopback mounted filesystem as a branch ++- kernel thread for removing the dir who has a plenty of whiteouts ++- support copyup sparse file (a file which has a 'hole' in it) ++- default permission flags for branches ++- selectable permission flags for ro branch, whether whiteout can ++ exist or not ++- export via NFS. ++- support /fs/aufs and /aufs. ++- support multiple writable branches, some policies to select one ++ among multiple writable branches. ++- a new semantics for link(2) and rename(2) to support multiple ++ writable branches. ++- no glibc changes are required. ++- pseudo hardlink (hardlink over branches) ++- allow a direct access manually to a file on branch, e.g. bypassing aufs. ++ including NFS or remote filesystem branch. ++- userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX. ++- and more... ++ ++Currently these features are dropped temporary from aufs4. ++See design/08plan.txt in detail. ++- nested mount, i.e. aufs as readonly no-whiteout branch of another aufs ++ (robr) ++- statistics of aufs thread (/sys/fs/aufs/stat) ++ ++Features or just an idea in the future (see also design/*.txt), ++- reorder the branch index without del/re-add. ++- permanent xino files for NFSD ++- an option for refreshing the opened files after add/del branches ++- light version, without branch manipulation. (unnecessary?) ++- copyup in userspace ++- inotify in userspace ++- readv/writev ++ ++ ++2. Download ++---------------------------------------- ++There are three GIT trees for aufs4, aufs4-linux.git, ++aufs4-standalone.git, and aufs-util.git. Note that there is no "4" in ++"aufs-util.git." ++While the aufs-util is always necessary, you need either of aufs4-linux ++or aufs4-standalone. ++ ++The aufs4-linux tree includes the whole linux mainline GIT tree, ++git://git.kernel.org/.../torvalds/linux.git. ++And you cannot select CONFIG_AUFS_FS=m for this version, eg. you cannot ++build aufs4 as an external kernel module. ++Several extra patches are not included in this tree. Only ++aufs4-standalone tree contains them. They are described in the later ++section "Configuration and Compilation." ++ ++On the other hand, the aufs4-standalone tree has only aufs source files ++and necessary patches, and you can select CONFIG_AUFS_FS=m. ++But you need to apply all aufs patches manually. ++ ++You will find GIT branches whose name is in form of "aufs4.x" where "x" ++represents the linux kernel version, "linux-4.x". For instance, ++"aufs4.0" is for linux-4.0. For latest "linux-4.x-rcN", use ++"aufs4.x-rcN" branch. ++ ++o aufs4-linux tree ++$ git clone --reference /your/linux/git/tree \ ++ git://github.com/sfjro/aufs4-linux.git aufs4-linux.git ++- if you don't have linux GIT tree, then remove "--reference ..." ++$ cd aufs4-linux.git ++$ git checkout origin/aufs4.0 ++ ++Or You may want to directly git-pull aufs into your linux GIT tree, and ++leave the patch-work to GIT. ++$ cd /your/linux/git/tree ++$ git remote add aufs4 git://github.com/sfjro/aufs4-linux.git ++$ git fetch aufs4 ++$ git checkout -b my4.0 v4.0 ++$ (add your local change...) ++$ git pull aufs4 aufs4.0 ++- now you have v4.0 + your_changes + aufs4.0 in you my4.0 branch. ++- you may need to solve some conflicts between your_changes and ++ aufs4.0. in this case, git-rerere is recommended so that you can ++ solve the similar conflicts automatically when you upgrade to 4.1 or ++ later in the future. ++ ++o aufs4-standalone tree ++$ git clone git://github.com/sfjro/aufs4-standalone.git aufs4-standalone.git ++$ cd aufs4-standalone.git ++$ git checkout origin/aufs4.0 ++ ++o aufs-util tree ++$ git clone git://git.code.sf.net/p/aufs/aufs-util aufs-util.git ++- note that the public aufs-util.git is on SourceForge instead of ++ GitHUB. ++$ cd aufs-util.git ++$ git checkout origin/aufs4.0 ++ ++Note: The 4.x-rcN branch is to be used with `rc' kernel versions ONLY. ++The minor version number, 'x' in '4.x', of aufs may not always ++follow the minor version number of the kernel. ++Because changes in the kernel that cause the use of a new ++minor version number do not always require changes to aufs-util. ++ ++Since aufs-util has its own minor version number, you may not be ++able to find a GIT branch in aufs-util for your kernel's ++exact minor version number. ++In this case, you should git-checkout the branch for the ++nearest lower number. ++ ++For (an unreleased) example: ++If you are using "linux-4.10" and the "aufs4.10" branch ++does not exist in aufs-util repository, then "aufs4.9", "aufs4.8" ++or something numerically smaller is the branch for your kernel. ++ ++Also you can view all branches by ++ $ git branch -a ++ ++ ++3. Configuration and Compilation ++---------------------------------------- ++Make sure you have git-checkout'ed the correct branch. ++ ++For aufs4-linux tree, ++- enable CONFIG_AUFS_FS. ++- set other aufs configurations if necessary. ++ ++For aufs4-standalone tree, ++There are several ways to build. ++ ++1. ++- apply ./aufs4-kbuild.patch to your kernel source files. ++- apply ./aufs4-base.patch too. ++- apply ./aufs4-mmap.patch too. ++- apply ./aufs4-standalone.patch too, if you have a plan to set ++ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs4-standalone.patch. ++- copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your ++ kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild. ++- enable CONFIG_AUFS_FS, you can select either ++ =m or =y. ++- and build your kernel as usual. ++- install the built kernel. ++ Note: Since linux-3.9, every filesystem module requires an alias ++ "fs-". You should make sure that "fs-aufs" is listed in your ++ modules.aliases file if you set CONFIG_AUFS_FS=m. ++- install the header files too by "make headers_install" to the ++ directory where you specify. By default, it is $PWD/usr. ++ "make help" shows a brief note for headers_install. ++- and reboot your system. ++ ++2. ++- module only (CONFIG_AUFS_FS=m). ++- apply ./aufs4-base.patch to your kernel source files. ++- apply ./aufs4-mmap.patch too. ++- apply ./aufs4-standalone.patch too. ++- build your kernel, don't forget "make headers_install", and reboot. ++- edit ./config.mk and set other aufs configurations if necessary. ++ Note: You should read $PWD/fs/aufs/Kconfig carefully which describes ++ every aufs configurations. ++- build the module by simple "make". ++ Note: Since linux-3.9, every filesystem module requires an alias ++ "fs-". You should make sure that "fs-aufs" is listed in your ++ modules.aliases file. ++- you can specify ${KDIR} make variable which points to your kernel ++ source tree. ++- install the files ++ + run "make install" to install the aufs module, or copy the built ++ $PWD/aufs.ko to /lib/modules/... and run depmod -a (or reboot simply). ++ + run "make install_headers" (instead of headers_install) to install ++ the modified aufs header file (you can specify DESTDIR which is ++ available in aufs standalone version's Makefile only), or copy ++ $PWD/usr/include/linux/aufs_type.h to /usr/include/linux or wherever ++ you like manually. By default, the target directory is $PWD/usr. ++- no need to apply aufs4-kbuild.patch, nor copying source files to your ++ kernel source tree. ++ ++Note: The header file aufs_type.h is necessary to build aufs-util ++ as well as "make headers_install" in the kernel source tree. ++ headers_install is subject to be forgotten, but it is essentially ++ necessary, not only for building aufs-util. ++ You may not meet problems without headers_install in some older ++ version though. ++ ++And then, ++- read README in aufs-util, build and install it ++- note that your distribution may contain an obsoleted version of ++ aufs_type.h in /usr/include/linux or something. When you build aufs ++ utilities, make sure that your compiler refers the correct aufs header ++ file which is built by "make headers_install." ++- if you want to use readdir(3) in userspace or pathconf(3) wrapper, ++ then run "make install_ulib" too. And refer to the aufs manual in ++ detail. ++ ++There several other patches in aufs4-standalone.git. They are all ++optional. When you meet some problems, they will help you. ++- aufs4-loopback.patch ++ Supports a nested loopback mount in a branch-fs. This patch is ++ unnecessary until aufs produces a message like "you may want to try ++ another patch for loopback file". ++- vfs-ino.patch ++ Modifies a system global kernel internal function get_next_ino() in ++ order to stop assigning 0 for an inode-number. Not directly related to ++ aufs, but recommended generally. ++- tmpfs-idr.patch ++ Keeps the tmpfs inode number as the lowest value. Effective to reduce ++ the size of aufs XINO files for tmpfs branch. Also it prevents the ++ duplication of inode number, which is important for backup tools and ++ other utilities. When you find aufs XINO files for tmpfs branch ++ growing too much, try this patch. ++- lockdep-debug.patch ++ Because aufs is not only an ordinary filesystem (callee of VFS), but ++ also a caller of VFS functions for branch filesystems, subclassing of ++ the internal locks for LOCKDEP is necessary. LOCKDEP is a debugging ++ feature of linux kernel. If you enable CONFIG_LOCKDEP, then you will ++ need to apply this debug patch to expand several constant values. ++ If don't know what LOCKDEP, then you don't have apply this patch. ++ ++ ++4. Usage ++---------------------------------------- ++At first, make sure aufs-util are installed, and please read the aufs ++manual, aufs.5 in aufs-util.git tree. ++$ man -l aufs.5 ++ ++And then, ++$ mkdir /tmp/rw /tmp/aufs ++# mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs ++ ++Here is another example. The result is equivalent. ++# mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs ++ Or ++# mount -t aufs -o br:/tmp/rw none /tmp/aufs ++# mount -o remount,append:${HOME} /tmp/aufs ++ ++Then, you can see whole tree of your home dir through /tmp/aufs. If ++you modify a file under /tmp/aufs, the one on your home directory is ++not affected, instead the same named file will be newly created under ++/tmp/rw. And all of your modification to a file will be applied to ++the one under /tmp/rw. This is called the file based Copy on Write ++(COW) method. ++Aufs mount options are described in aufs.5. ++If you run chroot or something and make your aufs as a root directory, ++then you need to customize the shutdown script. See the aufs manual in ++detail. ++ ++Additionally, there are some sample usages of aufs which are a ++diskless system with network booting, and LiveCD over NFS. ++See sample dir in CVS tree on SourceForge. ++ ++ ++5. Contact ++---------------------------------------- ++When you have any problems or strange behaviour in aufs, please let me ++know with: ++- /proc/mounts (instead of the output of mount(8)) ++- /sys/module/aufs/* ++- /sys/fs/aufs/* (if you have them) ++- /debug/aufs/* (if you have them) ++- linux kernel version ++ if your kernel is not plain, for example modified by distributor, ++ the url where i can download its source is necessary too. ++- aufs version which was printed at loading the module or booting the ++ system, instead of the date you downloaded. ++- configuration (define/undefine CONFIG_AUFS_xxx) ++- kernel configuration or /proc/config.gz (if you have it) ++- behaviour which you think to be incorrect ++- actual operation, reproducible one is better ++- mailto: aufs-users at lists.sourceforge.net ++ ++Usually, I don't watch the Public Areas(Bugs, Support Requests, Patches, ++and Feature Requests) on SourceForge. Please join and write to ++aufs-users ML. ++ ++ ++6. Acknowledgements ++---------------------------------------- ++Thanks to everyone who have tried and are using aufs, whoever ++have reported a bug or any feedback. ++ ++Especially donators: ++Tomas Matejicek(slax.org) made a donation (much more than once). ++ Since Apr 2010, Tomas M (the author of Slax and Linux Live ++ scripts) is making "doubling" donations. ++ Unfortunately I cannot list all of the donators, but I really ++ appreciate. ++ It ends Aug 2010, but the ordinary donation URL is still available. ++ ++Dai Itasaka made a donation (2007/8). ++Chuck Smith made a donation (2008/4, 10 and 12). ++Henk Schoneveld made a donation (2008/9). ++Chih-Wei Huang, ASUS, CTC donated Eee PC 4G (2008/10). ++Francois Dupoux made a donation (2008/11). ++Bruno Cesar Ribas and Luis Carlos Erpen de Bona, C3SL serves public ++ aufs2 GIT tree (2009/2). ++William Grant made a donation (2009/3). ++Patrick Lane made a donation (2009/4). ++The Mail Archive (mail-archive.com) made donations (2009/5). ++Nippy Networks (Ed Wildgoose) made a donation (2009/7). ++New Dream Network, LLC (www.dreamhost.com) made a donation (2009/11). ++Pavel Pronskiy made a donation (2011/2). ++Iridium and Inmarsat satellite phone retailer (www.mailasail.com), Nippy ++ Networks (Ed Wildgoose) made a donation for hardware (2011/3). ++Max Lekomcev (DOM-TV project) made a donation (2011/7, 12, 2012/3, 6 and ++11). ++Sam Liddicott made a donation (2011/9). ++Era Scarecrow made a donation (2013/4). ++Bor Ratajc made a donation (2013/4). ++Alessandro Gorreta made a donation (2013/4). ++POIRETTE Marc made a donation (2013/4). ++Alessandro Gorreta made a donation (2013/4). ++lauri kasvandik made a donation (2013/5). ++"pemasu from Finland" made a donation (2013/7). ++The Parted Magic Project made a donation (2013/9 and 11). ++Pavel Barta made a donation (2013/10). ++Nikolay Pertsev made a donation (2014/5). ++James B made a donation (2014/7 and 2015/7). ++Stefano Di Biase made a donation (2014/8). ++Daniel Epellei made a donation (2015/1). ++OmegaPhil made a donation (2016/1, 2018/4). ++Tomasz Szewczyk made a donation (2016/4). ++James Burry made a donation (2016/12). ++Carsten Rose made a donation (2018/9). ++ ++Thank you very much. ++Donations are always, including future donations, very important and ++helpful for me to keep on developing aufs. ++ ++ ++7. ++---------------------------------------- ++If you are an experienced user, no explanation is needed. Aufs is ++just a linux filesystem. ++ ++ ++Enjoy! ++ ++# Local variables: ; ++# mode: text; ++# End: ; +diff --git a/Documentation/filesystems/aufs/design/01intro.txt b/Documentation/filesystems/aufs/design/01intro.txt +new file mode 100644 +index 000000000000..0e06d99eac9c +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/01intro.txt +@@ -0,0 +1,158 @@ ++ ++# Copyright (C) 2005-2018 Junjiro R. Okajima ++ ++Introduction ++---------------------------------------- ++ ++aufs [ei ju: ef es] | /ey-yoo-ef-es/ | [a u f s] ++1. abbrev. for "advanced multi-layered unification filesystem". ++2. abbrev. for "another unionfs". ++3. abbrev. for "auf das" in German which means "on the" in English. ++ Ex. "Butter aufs Brot"(G) means "butter onto bread"(E). ++ But "Filesystem aufs Filesystem" is hard to understand. ++4. abbrev. for "African Urban Fashion Show". ++ ++AUFS is a filesystem with features: ++- multi layered stackable unification filesystem, the member directory ++ is called as a branch. ++- branch permission and attribute, 'readonly', 'real-readonly', ++ 'readwrite', 'whiteout-able', 'link-able whiteout', etc. and their ++ combination. ++- internal "file copy-on-write". ++- logical deletion, whiteout. ++- dynamic branch manipulation, adding, deleting and changing permission. ++- allow bypassing aufs, user's direct branch access. ++- external inode number translation table and bitmap which maintains the ++ persistent aufs inode number. ++- seekable directory, including NFS readdir. ++- file mapping, mmap and sharing pages. ++- pseudo-link, hardlink over branches. ++- loopback mounted filesystem as a branch. ++- several policies to select one among multiple writable branches. ++- revert a single systemcall when an error occurs in aufs. ++- and more... ++ ++ ++Multi Layered Stackable Unification Filesystem ++---------------------------------------------------------------------- ++Most people already knows what it is. ++It is a filesystem which unifies several directories and provides a ++merged single directory. When users access a file, the access will be ++passed/re-directed/converted (sorry, I am not sure which English word is ++correct) to the real file on the member filesystem. The member ++filesystem is called 'lower filesystem' or 'branch' and has a mode ++'readonly' and 'readwrite.' And the deletion for a file on the lower ++readonly branch is handled by creating 'whiteout' on the upper writable ++branch. ++ ++On LKML, there have been discussions about UnionMount (Jan Blunck, ++Bharata B Rao and Valerie Aurora) and Unionfs (Erez Zadok). They took ++different approaches to implement the merged-view. ++The former tries putting it into VFS, and the latter implements as a ++separate filesystem. ++(If I misunderstand about these implementations, please let me know and ++I shall correct it. Because it is a long time ago when I read their ++source files last time). ++ ++UnionMount's approach will be able to small, but may be hard to share ++branches between several UnionMount since the whiteout in it is ++implemented in the inode on branch filesystem and always ++shared. According to Bharata's post, readdir does not seems to be ++finished yet. ++There are several missing features known in this implementations such as ++- for users, the inode number may change silently. eg. copy-up. ++- link(2) may break by copy-up. ++- read(2) may get an obsoleted filedata (fstat(2) too). ++- fcntl(F_SETLK) may be broken by copy-up. ++- unnecessary copy-up may happen, for example mmap(MAP_PRIVATE) after ++ open(O_RDWR). ++ ++In linux-3.18, "overlay" filesystem (formerly known as "overlayfs") was ++merged into mainline. This is another implementation of UnionMount as a ++separated filesystem. All the limitations and known problems which ++UnionMount are equally inherited to "overlay" filesystem. ++ ++Unionfs has a longer history. When I started implementing a stackable ++filesystem (Aug 2005), it already existed. It has virtual super_block, ++inode, dentry and file objects and they have an array pointing lower ++same kind objects. After contributing many patches for Unionfs, I ++re-started my project AUFS (Jun 2006). ++ ++In AUFS, the structure of filesystem resembles to Unionfs, but I ++implemented my own ideas, approaches and enhancements and it became ++totally different one. ++ ++Comparing DM snapshot and fs based implementation ++- the number of bytes to be copied between devices is much smaller. ++- the type of filesystem must be one and only. ++- the fs must be writable, no readonly fs, even for the lower original ++ device. so the compression fs will not be usable. but if we use ++ loopback mount, we may address this issue. ++ for instance, ++ mount /cdrom/squashfs.img /sq ++ losetup /sq/ext2.img ++ losetup /somewhere/cow ++ dmsetup "snapshot /dev/loop0 /dev/loop1 ..." ++- it will be difficult (or needs more operations) to extract the ++ difference between the original device and COW. ++- DM snapshot-merge may help a lot when users try merging. in the ++ fs-layer union, users will use rsync(1). ++ ++You may want to read my old paper "Filesystems in LiveCD" ++(http://aufs.sourceforge.net/aufs2/report/sq/sq.pdf). ++ ++ ++Several characters/aspects/persona of aufs ++---------------------------------------------------------------------- ++ ++Aufs has several characters, aspects or persona. ++1. a filesystem, callee of VFS helper ++2. sub-VFS, caller of VFS helper for branches ++3. a virtual filesystem which maintains persistent inode number ++4. reader/writer of files on branches such like an application ++ ++1. Callee of VFS Helper ++As an ordinary linux filesystem, aufs is a callee of VFS. For instance, ++unlink(2) from an application reaches sys_unlink() kernel function and ++then vfs_unlink() is called. vfs_unlink() is one of VFS helper and it ++calls filesystem specific unlink operation. Actually aufs implements the ++unlink operation but it behaves like a redirector. ++ ++2. Caller of VFS Helper for Branches ++aufs_unlink() passes the unlink request to the branch filesystem as if ++it were called from VFS. So the called unlink operation of the branch ++filesystem acts as usual. As a caller of VFS helper, aufs should handle ++every necessary pre/post operation for the branch filesystem. ++- acquire the lock for the parent dir on a branch ++- lookup in a branch ++- revalidate dentry on a branch ++- mnt_want_write() for a branch ++- vfs_unlink() for a branch ++- mnt_drop_write() for a branch ++- release the lock on a branch ++ ++3. Persistent Inode Number ++One of the most important issue for a filesystem is to maintain inode ++numbers. This is particularly important to support exporting a ++filesystem via NFS. Aufs is a virtual filesystem which doesn't have a ++backend block device for its own. But some storage is necessary to ++keep and maintain the inode numbers. It may be a large space and may not ++suit to keep in memory. Aufs rents some space from its first writable ++branch filesystem (by default) and creates file(s) on it. These files ++are created by aufs internally and removed soon (currently) keeping ++opened. ++Note: Because these files are removed, they are totally gone after ++ unmounting aufs. It means the inode numbers are not persistent ++ across unmount or reboot. I have a plan to make them really ++ persistent which will be important for aufs on NFS server. ++ ++4. Read/Write Files Internally (copy-on-write) ++Because a branch can be readonly, when you write a file on it, aufs will ++"copy-up" it to the upper writable branch internally. And then write the ++originally requested thing to the file. Generally kernel doesn't ++open/read/write file actively. In aufs, even a single write may cause a ++internal "file copy". This behaviour is very similar to cp(1) command. ++ ++Some people may think it is better to pass such work to user space ++helper, instead of doing in kernel space. Actually I am still thinking ++about it. But currently I have implemented it in kernel space. +diff --git a/Documentation/filesystems/aufs/design/02struct.txt b/Documentation/filesystems/aufs/design/02struct.txt +new file mode 100644 +index 000000000000..080c3777b37f +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/02struct.txt +@@ -0,0 +1,245 @@ ++ ++# Copyright (C) 2005-2018 Junjiro R. Okajima ++ ++Basic Aufs Internal Structure ++ ++Superblock/Inode/Dentry/File Objects ++---------------------------------------------------------------------- ++As like an ordinary filesystem, aufs has its own ++superblock/inode/dentry/file objects. All these objects have a ++dynamically allocated array and store the same kind of pointers to the ++lower filesystem, branch. ++For example, when you build a union with one readwrite branch and one ++readonly, mounted /au, /rw and /ro respectively. ++- /au = /rw + /ro ++- /ro/fileA exists but /rw/fileA ++ ++Aufs lookup operation finds /ro/fileA and gets dentry for that. These ++pointers are stored in a aufs dentry. The array in aufs dentry will be, ++- [0] = NULL (because /rw/fileA doesn't exist) ++- [1] = /ro/fileA ++ ++This style of an array is essentially same to the aufs ++superblock/inode/dentry/file objects. ++ ++Because aufs supports manipulating branches, ie. add/delete/change ++branches dynamically, these objects has its own generation. When ++branches are changed, the generation in aufs superblock is ++incremented. And a generation in other object are compared when it is ++accessed. When a generation in other objects are obsoleted, aufs ++refreshes the internal array. ++ ++ ++Superblock ++---------------------------------------------------------------------- ++Additionally aufs superblock has some data for policies to select one ++among multiple writable branches, XIB files, pseudo-links and kobject. ++See below in detail. ++About the policies which supports copy-down a directory, see ++wbr_policy.txt too. ++ ++ ++Branch and XINO(External Inode Number Translation Table) ++---------------------------------------------------------------------- ++Every branch has its own xino (external inode number translation table) ++file. The xino file is created and unlinked by aufs internally. When two ++members of a union exist on the same filesystem, they share the single ++xino file. ++The struct of a xino file is simple, just a sequence of aufs inode ++numbers which is indexed by the lower inode number. ++In the above sample, assume the inode number of /ro/fileA is i111 and ++aufs assigns the inode number i999 for fileA. Then aufs writes 999 as ++4(8) bytes at 111 * 4(8) bytes offset in the xino file. ++ ++When the inode numbers are not contiguous, the xino file will be sparse ++which has a hole in it and doesn't consume as much disk space as it ++might appear. If your branch filesystem consumes disk space for such ++holes, then you should specify 'xino=' option at mounting aufs. ++ ++Aufs has a mount option to free the disk blocks for such holes in XINO ++files on tmpfs or ramdisk. But it is not so effective actually. If you ++meet a problem of disk shortage due to XINO files, then you should try ++"tmpfs-ino.patch" (and "vfs-ino.patch" too) in aufs4-standalone.git. ++The patch localizes the assignment inumbers per tmpfs-mount and avoid ++the holes in XINO files. ++ ++Also a writable branch has three kinds of "whiteout bases". All these ++are existed when the branch is joined to aufs, and their names are ++whiteout-ed doubly, so that users will never see their names in aufs ++hierarchy. ++1. a regular file which will be hardlinked to all whiteouts. ++2. a directory to store a pseudo-link. ++3. a directory to store an "orphan"-ed file temporary. ++ ++1. Whiteout Base ++ When you remove a file on a readonly branch, aufs handles it as a ++ logical deletion and creates a whiteout on the upper writable branch ++ as a hardlink of this file in order not to consume inode on the ++ writable branch. ++2. Pseudo-link Dir ++ See below, Pseudo-link. ++3. Step-Parent Dir ++ When "fileC" exists on the lower readonly branch only and it is ++ opened and removed with its parent dir, and then user writes ++ something into it, then aufs copies-up fileC to this ++ directory. Because there is no other dir to store fileC. After ++ creating a file under this dir, the file is unlinked. ++ ++Because aufs supports manipulating branches, ie. add/delete/change ++dynamically, a branch has its own id. When the branch order changes, ++aufs finds the new index by searching the branch id. ++ ++ ++Pseudo-link ++---------------------------------------------------------------------- ++Assume "fileA" exists on the lower readonly branch only and it is ++hardlinked to "fileB" on the branch. When you write something to fileA, ++aufs copies-up it to the upper writable branch. Additionally aufs ++creates a hardlink under the Pseudo-link Directory of the writable ++branch. The inode of a pseudo-link is kept in aufs super_block as a ++simple list. If fileB is read after unlinking fileA, aufs returns ++filedata from the pseudo-link instead of the lower readonly ++branch. Because the pseudo-link is based upon the inode, to keep the ++inode number by xino (see above) is essentially necessary. ++ ++All the hardlinks under the Pseudo-link Directory of the writable branch ++should be restored in a proper location later. Aufs provides a utility ++to do this. The userspace helpers executed at remounting and unmounting ++aufs by default. ++During this utility is running, it puts aufs into the pseudo-link ++maintenance mode. In this mode, only the process which began the ++maintenance mode (and its child processes) is allowed to operate in ++aufs. Some other processes which are not related to the pseudo-link will ++be allowed to run too, but the rest have to return an error or wait ++until the maintenance mode ends. If a process already acquires an inode ++mutex (in VFS), it has to return an error. ++ ++ ++XIB(external inode number bitmap) ++---------------------------------------------------------------------- ++Addition to the xino file per a branch, aufs has an external inode number ++bitmap in a superblock object. It is also an internal file such like a ++xino file. ++It is a simple bitmap to mark whether the aufs inode number is in-use or ++not. ++To reduce the file I/O, aufs prepares a single memory page to cache xib. ++ ++As well as XINO files, aufs has a feature to truncate/refresh XIB to ++reduce the number of consumed disk blocks for these files. ++ ++ ++Virtual or Vertical Dir, and Readdir in Userspace ++---------------------------------------------------------------------- ++In order to support multiple layers (branches), aufs readdir operation ++constructs a virtual dir block on memory. For readdir, aufs calls ++vfs_readdir() internally for each dir on branches, merges their entries ++with eliminating the whiteout-ed ones, and sets it to file (dir) ++object. So the file object has its entry list until it is closed. The ++entry list will be updated when the file position is zero and becomes ++obsoleted. This decision is made in aufs automatically. ++ ++The dynamically allocated memory block for the name of entries has a ++unit of 512 bytes (by default) and stores the names contiguously (no ++padding). Another block for each entry is handled by kmem_cache too. ++During building dir blocks, aufs creates hash list and judging whether ++the entry is whiteouted by its upper branch or already listed. ++The merged result is cached in the corresponding inode object and ++maintained by a customizable life-time option. ++ ++Some people may call it can be a security hole or invite DoS attack ++since the opened and once readdir-ed dir (file object) holds its entry ++list and becomes a pressure for system memory. But I'd say it is similar ++to files under /proc or /sys. The virtual files in them also holds a ++memory page (generally) while they are opened. When an idea to reduce ++memory for them is introduced, it will be applied to aufs too. ++For those who really hate this situation, I've developed readdir(3) ++library which operates this merging in userspace. You just need to set ++LD_PRELOAD environment variable, and aufs will not consume no memory in ++kernel space for readdir(3). ++ ++ ++Workqueue ++---------------------------------------------------------------------- ++Aufs sometimes requires privilege access to a branch. For instance, ++in copy-up/down operation. When a user process is going to make changes ++to a file which exists in the lower readonly branch only, and the mode ++of one of ancestor directories may not be writable by a user ++process. Here aufs copy-up the file with its ancestors and they may ++require privilege to set its owner/group/mode/etc. ++This is a typical case of a application character of aufs (see ++Introduction). ++ ++Aufs uses workqueue synchronously for this case. It creates its own ++workqueue. The workqueue is a kernel thread and has privilege. Aufs ++passes the request to call mkdir or write (for example), and wait for ++its completion. This approach solves a problem of a signal handler ++simply. ++If aufs didn't adopt the workqueue and changed the privilege of the ++process, then the process may receive the unexpected SIGXFSZ or other ++signals. ++ ++Also aufs uses the system global workqueue ("events" kernel thread) too ++for asynchronous tasks, such like handling inotify/fsnotify, re-creating a ++whiteout base and etc. This is unrelated to a privilege. ++Most of aufs operation tries acquiring a rw_semaphore for aufs ++superblock at the beginning, at the same time waits for the completion ++of all queued asynchronous tasks. ++ ++ ++Whiteout ++---------------------------------------------------------------------- ++The whiteout in aufs is very similar to Unionfs's. That is represented ++by its filename. UnionMount takes an approach of a file mode, but I am ++afraid several utilities (find(1) or something) will have to support it. ++ ++Basically the whiteout represents "logical deletion" which stops aufs to ++lookup further, but also it represents "dir is opaque" which also stop ++further lookup. ++ ++In aufs, rmdir(2) and rename(2) for dir uses whiteout alternatively. ++In order to make several functions in a single systemcall to be ++revertible, aufs adopts an approach to rename a directory to a temporary ++unique whiteouted name. ++For example, in rename(2) dir where the target dir already existed, aufs ++renames the target dir to a temporary unique whiteouted name before the ++actual rename on a branch, and then handles other actions (make it opaque, ++update the attributes, etc). If an error happens in these actions, aufs ++simply renames the whiteouted name back and returns an error. If all are ++succeeded, aufs registers a function to remove the whiteouted unique ++temporary name completely and asynchronously to the system global ++workqueue. ++ ++ ++Copy-up ++---------------------------------------------------------------------- ++It is a well-known feature or concept. ++When user modifies a file on a readonly branch, aufs operate "copy-up" ++internally and makes change to the new file on the upper writable branch. ++When the trigger systemcall does not update the timestamps of the parent ++dir, aufs reverts it after copy-up. ++ ++ ++Move-down (aufs3.9 and later) ++---------------------------------------------------------------------- ++"Copy-up" is one of the essential feature in aufs. It copies a file from ++the lower readonly branch to the upper writable branch when a user ++changes something about the file. ++"Move-down" is an opposite action of copy-up. Basically this action is ++ran manually instead of automatically and internally. ++For desgin and implementation, aufs has to consider these issues. ++- whiteout for the file may exist on the lower branch. ++- ancestor directories may not exist on the lower branch. ++- diropq for the ancestor directories may exist on the upper branch. ++- free space on the lower branch will reduce. ++- another access to the file may happen during moving-down, including ++ UDBA (see "Revalidate Dentry and UDBA"). ++- the file should not be hard-linked nor pseudo-linked. they should be ++ handled by auplink utility later. ++ ++Sometimes users want to move-down a file from the upper writable branch ++to the lower readonly or writable branch. For instance, ++- the free space of the upper writable branch is going to run out. ++- create a new intermediate branch between the upper and lower branch. ++- etc. ++ ++For this purpose, use "aumvdown" command in aufs-util.git. +diff --git a/Documentation/filesystems/aufs/design/03atomic_open.txt b/Documentation/filesystems/aufs/design/03atomic_open.txt +new file mode 100644 +index 000000000000..2d69d1d293ac +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/03atomic_open.txt +@@ -0,0 +1,72 @@ ++ ++# Copyright (C) 2015-2018 Junjiro R. Okajima ++ ++Support for a branch who has its ->atomic_open() ++---------------------------------------------------------------------- ++The filesystems who implement its ->atomic_open() are not majority. For ++example NFSv4 does, and aufs should call NFSv4 ->atomic_open, ++particularly for open(O_CREAT|O_EXCL, 0400) case. Other than ++->atomic_open(), NFSv4 returns an error for this open(2). While I am not ++sure whether all filesystems who have ->atomic_open() behave like this, ++but NFSv4 surely returns the error. ++ ++In order to support ->atomic_open() for aufs, there are a few ++approaches. ++ ++A. Introduce aufs_atomic_open() ++ - calls one of VFS:do_last(), lookup_open() or atomic_open() for ++ branch fs. ++B. Introduce aufs_atomic_open() calling create, open and chmod. this is ++ an aufs user Pip Cet's approach ++ - calls aufs_create(), VFS finish_open() and notify_change(). ++ - pass fake-mode to finish_open(), and then correct the mode by ++ notify_change(). ++C. Extend aufs_open() to call branch fs's ->atomic_open() ++ - no aufs_atomic_open(). ++ - aufs_lookup() registers the TID to an aufs internal object. ++ - aufs_create() does nothing when the matching TID is registered, but ++ registers the mode. ++ - aufs_open() calls branch fs's ->atomic_open() when the matching ++ TID is registered. ++D. Extend aufs_open() to re-try branch fs's ->open() with superuser's ++ credential ++ - no aufs_atomic_open(). ++ - aufs_create() registers the TID to an internal object. this info ++ represents "this process created this file just now." ++ - when aufs gets EACCES from branch fs's ->open(), then confirm the ++ registered TID and re-try open() with superuser's credential. ++ ++Pros and cons for each approach. ++ ++A. ++ - straightforward but highly depends upon VFS internal. ++ - the atomic behavaiour is kept. ++ - some of parameters such as nameidata are hard to reproduce for ++ branch fs. ++ - large overhead. ++B. ++ - easy to implement. ++ - the atomic behavaiour is lost. ++C. ++ - the atomic behavaiour is kept. ++ - dirty and tricky. ++ - VFS checks whether the file is created correctly after calling ++ ->create(), which means this approach doesn't work. ++D. ++ - easy to implement. ++ - the atomic behavaiour is lost. ++ - to open a file with superuser's credential and give it to a user ++ process is a bad idea, since the file object keeps the credential ++ in it. It may affect LSM or something. This approach doesn't work ++ either. ++ ++The approach A is ideal, but it hard to implement. So here is a ++variation of A, which is to be implemented. ++ ++A-1. Introduce aufs_atomic_open() ++ - calls branch fs ->atomic_open() if exists. otherwise calls ++ vfs_create() and finish_open(). ++ - the demerit is that the several checks after branch fs ++ ->atomic_open() are lost. in the ordinary case, the checks are ++ done by VFS:do_last(), lookup_open() and atomic_open(). some can ++ be implemented in aufs, but not all I am afraid. +diff --git a/Documentation/filesystems/aufs/design/03lookup.txt b/Documentation/filesystems/aufs/design/03lookup.txt +new file mode 100644 +index 000000000000..d6d4432a6a36 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/03lookup.txt +@@ -0,0 +1,100 @@ ++ ++# Copyright (C) 2005-2018 Junjiro R. Okajima ++ ++Lookup in a Branch ++---------------------------------------------------------------------- ++Since aufs has a character of sub-VFS (see Introduction), it operates ++lookup for branches as VFS does. It may be a heavy work. But almost all ++lookup operation in aufs is the simplest case, ie. lookup only an entry ++directly connected to its parent. Digging down the directory hierarchy ++is unnecessary. VFS has a function lookup_one_len() for that use, and ++aufs calls it. ++ ++When a branch is a remote filesystem, aufs basically relies upon its ++->d_revalidate(), also aufs forces the hardest revalidate tests for ++them. ++For d_revalidate, aufs implements three levels of revalidate tests. See ++"Revalidate Dentry and UDBA" in detail. ++ ++ ++Test Only the Highest One for the Directory Permission (dirperm1 option) ++---------------------------------------------------------------------- ++Let's try case study. ++- aufs has two branches, upper readwrite and lower readonly. ++ /au = /rw + /ro ++- "dirA" exists under /ro, but /rw. and its mode is 0700. ++- user invoked "chmod a+rx /au/dirA" ++- the internal copy-up is activated and "/rw/dirA" is created and its ++ permission bits are set to world readable. ++- then "/au/dirA" becomes world readable? ++ ++In this case, /ro/dirA is still 0700 since it exists in readonly branch, ++or it may be a natively readonly filesystem. If aufs respects the lower ++branch, it should not respond readdir request from other users. But user ++allowed it by chmod. Should really aufs rejects showing the entries ++under /ro/dirA? ++ ++To be honest, I don't have a good solution for this case. So aufs ++implements 'dirperm1' and 'nodirperm1' mount options, and leave it to ++users. ++When dirperm1 is specified, aufs checks only the highest one for the ++directory permission, and shows the entries. Otherwise, as usual, checks ++every dir existing on all branches and rejects the request. ++ ++As a side effect, dirperm1 option improves the performance of aufs ++because the number of permission check is reduced when the number of ++branch is many. ++ ++ ++Revalidate Dentry and UDBA (User's Direct Branch Access) ++---------------------------------------------------------------------- ++Generally VFS helpers re-validate a dentry as a part of lookup. ++0. digging down the directory hierarchy. ++1. lock the parent dir by its i_mutex. ++2. lookup the final (child) entry. ++3. revalidate it. ++4. call the actual operation (create, unlink, etc.) ++5. unlock the parent dir ++ ++If the filesystem implements its ->d_revalidate() (step 3), then it is ++called. Actually aufs implements it and checks the dentry on a branch is ++still valid. ++But it is not enough. Because aufs has to release the lock for the ++parent dir on a branch at the end of ->lookup() (step 2) and ++->d_revalidate() (step 3) while the i_mutex of the aufs dir is still ++held by VFS. ++If the file on a branch is changed directly, eg. bypassing aufs, after ++aufs released the lock, then the subsequent operation may cause ++something unpleasant result. ++ ++This situation is a result of VFS architecture, ->lookup() and ++->d_revalidate() is separated. But I never say it is wrong. It is a good ++design from VFS's point of view. It is just not suitable for sub-VFS ++character in aufs. ++ ++Aufs supports such case by three level of revalidation which is ++selectable by user. ++1. Simple Revalidate ++ Addition to the native flow in VFS's, confirm the child-parent ++ relationship on the branch just after locking the parent dir on the ++ branch in the "actual operation" (step 4). When this validation ++ fails, aufs returns EBUSY. ->d_revalidate() (step 3) in aufs still ++ checks the validation of the dentry on branches. ++2. Monitor Changes Internally by Inotify/Fsnotify ++ Addition to above, in the "actual operation" (step 4) aufs re-lookup ++ the dentry on the branch, and returns EBUSY if it finds different ++ dentry. ++ Additionally, aufs sets the inotify/fsnotify watch for every dir on branches ++ during it is in cache. When the event is notified, aufs registers a ++ function to kernel 'events' thread by schedule_work(). And the ++ function sets some special status to the cached aufs dentry and inode ++ private data. If they are not cached, then aufs has nothing to ++ do. When the same file is accessed through aufs (step 0-3) later, ++ aufs will detect the status and refresh all necessary data. ++ In this mode, aufs has to ignore the event which is fired by aufs ++ itself. ++3. No Extra Validation ++ This is the simplest test and doesn't add any additional revalidation ++ test, and skip the revalidation in step 4. It is useful and improves ++ aufs performance when system surely hide the aufs branches from user, ++ by over-mounting something (or another method). +diff --git a/Documentation/filesystems/aufs/design/04branch.txt b/Documentation/filesystems/aufs/design/04branch.txt +new file mode 100644 +index 000000000000..49400cb27dd0 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/04branch.txt +@@ -0,0 +1,61 @@ ++ ++# Copyright (C) 2005-2018 Junjiro R. Okajima ++ ++Branch Manipulation ++ ++Since aufs supports dynamic branch manipulation, ie. add/remove a branch ++and changing its permission/attribute, there are a lot of works to do. ++ ++ ++Add a Branch ++---------------------------------------------------------------------- ++o Confirm the adding dir exists outside of aufs, including loopback ++ mount, and its various attributes. ++o Initialize the xino file and whiteout bases if necessary. ++ See struct.txt. ++ ++o Check the owner/group/mode of the directory ++ When the owner/group/mode of the adding directory differs from the ++ existing branch, aufs issues a warning because it may impose a ++ security risk. ++ For example, when a upper writable branch has a world writable empty ++ top directory, a malicious user can create any files on the writable ++ branch directly, like copy-up and modify manually. If something like ++ /etc/{passwd,shadow} exists on the lower readonly branch but the upper ++ writable branch, and the writable branch is world-writable, then a ++ malicious guy may create /etc/passwd on the writable branch directly ++ and the infected file will be valid in aufs. ++ I am afraid it can be a security issue, but aufs can do nothing except ++ producing a warning. ++ ++ ++Delete a Branch ++---------------------------------------------------------------------- ++o Confirm the deleting branch is not busy ++ To be general, there is one merit to adopt "remount" interface to ++ manipulate branches. It is to discard caches. At deleting a branch, ++ aufs checks the still cached (and connected) dentries and inodes. If ++ there are any, then they are all in-use. An inode without its ++ corresponding dentry can be alive alone (for example, inotify/fsnotify case). ++ ++ For the cached one, aufs checks whether the same named entry exists on ++ other branches. ++ If the cached one is a directory, because aufs provides a merged view ++ to users, as long as one dir is left on any branch aufs can show the ++ dir to users. In this case, the branch can be removed from aufs. ++ Otherwise aufs rejects deleting the branch. ++ ++ If any file on the deleting branch is opened by aufs, then aufs ++ rejects deleting. ++ ++ ++Modify the Permission of a Branch ++---------------------------------------------------------------------- ++o Re-initialize or remove the xino file and whiteout bases if necessary. ++ See struct.txt. ++ ++o rw --> ro: Confirm the modifying branch is not busy ++ Aufs rejects the request if any of these conditions are true. ++ - a file on the branch is mmap-ed. ++ - a regular file on the branch is opened for write and there is no ++ same named entry on the upper branch. +diff --git a/Documentation/filesystems/aufs/design/05wbr_policy.txt b/Documentation/filesystems/aufs/design/05wbr_policy.txt +new file mode 100644 +index 000000000000..f0eda9704407 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/05wbr_policy.txt +@@ -0,0 +1,51 @@ ++ ++# Copyright (C) 2005-2018 Junjiro R. Okajima ++ ++Policies to Select One among Multiple Writable Branches ++---------------------------------------------------------------------- ++When the number of writable branch is more than one, aufs has to decide ++the target branch for file creation or copy-up. By default, the highest ++writable branch which has the parent (or ancestor) dir of the target ++file is chosen (top-down-parent policy). ++By user's request, aufs implements some other policies to select the ++writable branch, for file creation several policies, round-robin, ++most-free-space, and other policies. For copy-up, top-down-parent, ++bottom-up-parent, bottom-up and others. ++ ++As expected, the round-robin policy selects the branch in circular. When ++you have two writable branches and creates 10 new files, 5 files will be ++created for each branch. mkdir(2) systemcall is an exception. When you ++create 10 new directories, all will be created on the same branch. ++And the most-free-space policy selects the one which has most free ++space among the writable branches. The amount of free space will be ++checked by aufs internally, and users can specify its time interval. ++ ++The policies for copy-up is more simple, ++top-down-parent is equivalent to the same named on in create policy, ++bottom-up-parent selects the writable branch where the parent dir ++exists and the nearest upper one from the copyup-source, ++bottom-up selects the nearest upper writable branch from the ++copyup-source, regardless the existence of the parent dir. ++ ++There are some rules or exceptions to apply these policies. ++- If there is a readonly branch above the policy-selected branch and ++ the parent dir is marked as opaque (a variation of whiteout), or the ++ target (creating) file is whiteout-ed on the upper readonly branch, ++ then the result of the policy is ignored and the target file will be ++ created on the nearest upper writable branch than the readonly branch. ++- If there is a writable branch above the policy-selected branch and ++ the parent dir is marked as opaque or the target file is whiteouted ++ on the branch, then the result of the policy is ignored and the target ++ file will be created on the highest one among the upper writable ++ branches who has diropq or whiteout. In case of whiteout, aufs removes ++ it as usual. ++- link(2) and rename(2) systemcalls are exceptions in every policy. ++ They try selecting the branch where the source exists as possible ++ since copyup a large file will take long time. If it can't be, ++ ie. the branch where the source exists is readonly, then they will ++ follow the copyup policy. ++- There is an exception for rename(2) when the target exists. ++ If the rename target exists, aufs compares the index of the branches ++ where the source and the target exists and selects the higher ++ one. If the selected branch is readonly, then aufs follows the ++ copyup policy. +diff --git a/Documentation/filesystems/aufs/design/06dirren.dot b/Documentation/filesystems/aufs/design/06dirren.dot +new file mode 100644 +index 000000000000..2d62bb6dd55f +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/06dirren.dot +@@ -0,0 +1,31 @@ ++ ++// to view this graph, run dot(1) command in GRAPHVIZ. ++ ++digraph G { ++node [shape=box]; ++whinfo [label="detailed info file\n(lower_brid_root-hinum, h_inum, namelen, old name)"]; ++ ++node [shape=oval]; ++ ++aufs_rename -> whinfo [label="store/remove"]; ++ ++node [shape=oval]; ++inode_list [label="h_inum list in branch\ncache"]; ++ ++node [shape=box]; ++whinode [label="h_inum list file"]; ++ ++node [shape=oval]; ++brmgmt [label="br_add/del/mod/umount"]; ++ ++brmgmt -> inode_list [label="create/remove"]; ++brmgmt -> whinode [label="load/store"]; ++ ++inode_list -> whinode [style=dashed,dir=both]; ++ ++aufs_rename -> inode_list [label="add/del"]; ++ ++aufs_lookup -> inode_list [label="search"]; ++ ++aufs_lookup -> whinfo [label="load/remove"]; ++} +diff --git a/Documentation/filesystems/aufs/design/06dirren.txt b/Documentation/filesystems/aufs/design/06dirren.txt +new file mode 100644 +index 000000000000..70e8c57b7221 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/06dirren.txt +@@ -0,0 +1,89 @@ ++ ++# Copyright (C) 2017-2018 Junjiro R. Okajima ++ ++Special handling for renaming a directory (DIRREN) ++---------------------------------------------------------------------- ++First, let's assume we have a simple usecase. ++ ++- /u = /rw + /ro ++- /rw/dirA exists ++- /ro/dirA and /ro/dirA/file exist too ++- there is no dirB on both branches ++- a user issues rename("dirA", "dirB") ++ ++Now, what should aufs behave against this rename(2)? ++There are a few possible cases. ++ ++A. returns EROFS. ++ since dirA exists on a readonly branch which cannot be renamed. ++B. returns EXDEV. ++ it is possible to copy-up dirA (only the dir itself), but the child ++ entries ("file" in this case) should not be. it must be a bad ++ approach to copy-up recursively. ++C. returns a success. ++ even the branch /ro is readonly, aufs tries renaming it. Obviously it ++ is a violation of aufs' policy. ++D. construct an extra information which indicates that /ro/dirA should ++ be handled as the name of dirB. ++ overlayfs has a similar feature called REDIRECT. ++ ++Until now, aufs implements the case B only which returns EXDEV, and ++expects the userspace application behaves like mv(1) which tries ++issueing rename(2) recursively. ++ ++A new aufs feature called DIRREN is introduced which implements the case ++D. There are several "extra information" added. ++ ++1. detailed info per renamed directory ++ path: /rw/dirB/$AUFS_WH_DR_INFO_PFX. ++2. the inode-number list of directories on a branch ++ path: /rw/dirB/$AUFS_WH_DR_BRHINO ++ ++The filename of "detailed info per directory" represents the lower ++branch, and its format is ++- a type of the branch id ++ one of these. ++ + uuid (not implemented yet) ++ + fsid ++ + dev ++- the inode-number of the branch root dir ++ ++And it contains these info in a single regular file. ++- magic number ++- branch's inode-number of the logically renamed dir ++- the name of the before-renamed dir ++ ++The "detailed info per directory" file is created in aufs rename(2), and ++loaded in any lookup. ++The info is considered in lookup for the matching case only. Here ++"matching" means that the root of branch (in the info filename) is same ++to the current looking-up branch. After looking-up the before-renamed ++name, the inode-number is compared. And the matched dentry is used. ++ ++The "inode-number list of directories" is a regular file which contains ++simply the inode-numbers on the branch. The file is created or updated ++in removing the branch, and loaded in adding the branch. Its lifetime is ++equal to the branch. ++The list is refered in lookup, and when the current target inode is ++found in the list, the aufs tries loading the "detailed info per ++directory" and get the changed and valid name of the dir. ++ ++Theoretically these "extra informaiton" may be able to be put into XATTR ++in the dir inode. But aufs doesn't choose this way because ++1. XATTR may not be supported by the branch (or its configuration) ++2. XATTR may have its size limit. ++3. XATTR may be less easy to convert than a regular file, when the ++ format of the info is changed in the future. ++At the same time, I agree that the regular file approach is much slower ++than XATTR approach. So, in the future, aufs may take the XATTR or other ++better approach. ++ ++This DIRREN feature is enabled by aufs configuration, and is activated ++by a new mount option. ++ ++For the more complicated case, there is a work with UDBA option, which ++is to dected the direct access to the branches (by-passing aufs) and to ++maintain the cashes in aufs. Since a single cached aufs dentry may ++contains two names, before- and after-rename, the name comparision in ++UDBA handler may not work correctly. In this case, the behaviour will be ++equivalen to udba=reval case. +diff --git a/Documentation/filesystems/aufs/design/06fhsm.txt b/Documentation/filesystems/aufs/design/06fhsm.txt +new file mode 100644 +index 000000000000..c92c80225fa8 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/06fhsm.txt +@@ -0,0 +1,105 @@ ++ ++# Copyright (C) 2011-2018 Junjiro R. Okajima ++ ++File-based Hierarchical Storage Management (FHSM) ++---------------------------------------------------------------------- ++Hierarchical Storage Management (or HSM) is a well-known feature in the ++storage world. Aufs provides this feature as file-based with multiple ++writable branches, based upon the principle of "Colder, the Lower". ++Here the word "colder" means that the less used files, and "lower" means ++that the position in the order of the stacked branches vertically. ++These multiple writable branches are prioritized, ie. the topmost one ++should be the fastest drive and be used heavily. ++ ++o Characters in aufs FHSM story ++- aufs itself and a new branch attribute. ++- a new ioctl interface to move-down and to establish a connection with ++ the daemon ("move-down" is a converse of "copy-up"). ++- userspace tool and daemon. ++ ++The userspace daemon establishes a connection with aufs and waits for ++the notification. The notified information is very similar to struct ++statfs containing the number of consumed blocks and inodes. ++When the consumed blocks/inodes of a branch exceeds the user-specified ++upper watermark, the daemon activates its move-down process until the ++consumed blocks/inodes reaches the user-specified lower watermark. ++ ++The actual move-down is done by aufs based upon the request from ++user-space since we need to maintain the inode number and the internal ++pointer arrays in aufs. ++ ++Currently aufs FHSM handles the regular files only. Additionally they ++must not be hard-linked nor pseudo-linked. ++ ++ ++o Cowork of aufs and the user-space daemon ++ During the userspace daemon established the connection, aufs sends a ++ small notification to it whenever aufs writes something into the ++ writable branch. But it may cost high since aufs issues statfs(2) ++ internally. So user can specify a new option to cache the ++ info. Actually the notification is controlled by these factors. ++ + the specified cache time. ++ + classified as "force" by aufs internally. ++ Until the specified time expires, aufs doesn't send the info ++ except the forced cases. When aufs decide forcing, the info is always ++ notified to userspace. ++ For example, the number of free inodes is generally large enough and ++ the shortage of it happens rarely. So aufs doesn't force the ++ notification when creating a new file, directory and others. This is ++ the typical case which aufs doesn't force. ++ When aufs writes the actual filedata and the files consumes any of new ++ blocks, the aufs forces notifying. ++ ++ ++o Interfaces in aufs ++- New branch attribute. ++ + fhsm ++ Specifies that the branch is managed by FHSM feature. In other word, ++ participant in the FHSM. ++ When nofhsm is set to the branch, it will not be the source/target ++ branch of the move-down operation. This attribute is set ++ independently from coo and moo attributes, and if you want full ++ FHSM, you should specify them as well. ++- New mount option. ++ + fhsm_sec ++ Specifies a second to suppress many less important info to be ++ notified. ++- New ioctl. ++ + AUFS_CTL_FHSM_FD ++ create a new file descriptor which userspace can read the notification ++ (a subset of struct statfs) from aufs. ++- Module parameter 'brs' ++ It has to be set to 1. Otherwise the new mount option 'fhsm' will not ++ be set. ++- mount helpers /sbin/mount.aufs and /sbin/umount.aufs ++ When there are two or more branches with fhsm attributes, ++ /sbin/mount.aufs invokes the user-space daemon and /sbin/umount.aufs ++ terminates it. As a result of remounting and branch-manipulation, the ++ number of branches with fhsm attribute can be one. In this case, ++ /sbin/mount.aufs will terminate the user-space daemon. ++ ++ ++Finally the operation is done as these steps in kernel-space. ++- make sure that, ++ + no one else is using the file. ++ + the file is not hard-linked. ++ + the file is not pseudo-linked. ++ + the file is a regular file. ++ + the parent dir is not opaqued. ++- find the target writable branch. ++- make sure the file is not whiteout-ed by the upper (than the target) ++ branch. ++- make the parent dir on the target branch. ++- mutex lock the inode on the branch. ++- unlink the whiteout on the target branch (if exists). ++- lookup and create the whiteout-ed temporary name on the target branch. ++- copy the file as the whiteout-ed temporary name on the target branch. ++- rename the whiteout-ed temporary name to the original name. ++- unlink the file on the source branch. ++- maintain the internal pointer array and the external inode number ++ table (XINO). ++- maintain the timestamps and other attributes of the parent dir and the ++ file. ++ ++And of course, in every step, an error may happen. So the operation ++should restore the original file state after an error happens. +diff --git a/Documentation/filesystems/aufs/design/06mmap.txt b/Documentation/filesystems/aufs/design/06mmap.txt +new file mode 100644 +index 000000000000..75447670f919 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/06mmap.txt +@@ -0,0 +1,59 @@ ++ ++# Copyright (C) 2005-2018 Junjiro R. Okajima ++ ++mmap(2) -- File Memory Mapping ++---------------------------------------------------------------------- ++In aufs, the file-mapped pages are handled by a branch fs directly, no ++interaction with aufs. It means aufs_mmap() calls the branch fs's ++->mmap(). ++This approach is simple and good, but there is one problem. ++Under /proc, several entries show the mmapped files by its path (with ++device and inode number), and the printed path will be the path on the ++branch fs's instead of virtual aufs's. ++This is not a problem in most cases, but some utilities lsof(1) (and its ++user) may expect the path on aufs. ++ ++To address this issue, aufs adds a new member called vm_prfile in struct ++vm_area_struct (and struct vm_region). The original vm_file points to ++the file on the branch fs in order to handle everything correctly as ++usual. The new vm_prfile points to a virtual file in aufs, and the ++show-functions in procfs refers to vm_prfile if it is set. ++Also we need to maintain several other places where touching vm_file ++such like ++- fork()/clone() copies vma and the reference count of vm_file is ++ incremented. ++- merging vma maintains the ref count too. ++ ++This is not a good approach. It just fakes the printed path. But it ++leaves all behaviour around f_mapping unchanged. This is surely an ++advantage. ++Actually aufs had adopted another complicated approach which calls ++generic_file_mmap() and handles struct vm_operations_struct. In this ++approach, aufs met a hard problem and I could not solve it without ++switching the approach. ++ ++There may be one more another approach which is ++- bind-mount the branch-root onto the aufs-root internally ++- grab the new vfsmount (ie. struct mount) ++- lazy-umount the branch-root internally ++- in open(2) the aufs-file, open the branch-file with the hidden ++ vfsmount (instead of the original branch's vfsmount) ++- ideally this "bind-mount and lazy-umount" should be done atomically, ++ but it may be possible from userspace by the mount helper. ++ ++Adding the internal hidden vfsmount and using it in opening a file, the ++file path under /proc will be printed correctly. This approach looks ++smarter, but is not possible I am afraid. ++- aufs-root may be bind-mount later. when it happens, another hidden ++ vfsmount will be required. ++- it is hard to get the chance to bind-mount and lazy-umount ++ + in kernel-space, FS can have vfsmount in open(2) via ++ file->f_path, and aufs can know its vfsmount. But several locks are ++ already acquired, and if aufs tries to bind-mount and lazy-umount ++ here, then it may cause a deadlock. ++ + in user-space, bind-mount doesn't invoke the mount helper. ++- since /proc shows dev and ino, aufs has to give vma these info. it ++ means a new member vm_prinode will be necessary. this is essentially ++ equivalent to vm_prfile described above. ++ ++I have to give up this "looks-smater" approach. +diff --git a/Documentation/filesystems/aufs/design/06xattr.txt b/Documentation/filesystems/aufs/design/06xattr.txt +new file mode 100644 +index 000000000000..1d9ae60e3979 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/06xattr.txt +@@ -0,0 +1,81 @@ ++ ++# Copyright (C) 2014-2018 Junjiro R. Okajima ++ ++Listing XATTR/EA and getting the value ++---------------------------------------------------------------------- ++For the inode standard attributes (owner, group, timestamps, etc.), aufs ++shows the values from the topmost existing file. This behaviour is good ++for the non-dir entries since the bahaviour exactly matches the shown ++information. But for the directories, aufs considers all the same named ++entries on the lower branches. Which means, if one of the lower entry ++rejects readdir call, then aufs returns an error even if the topmost ++entry allows it. This behaviour is necessary to respect the branch fs's ++security, but can make users confused since the user-visible standard ++attributes don't match the behaviour. ++To address this issue, aufs has a mount option called dirperm1 which ++checks the permission for the topmost entry only, and ignores the lower ++entry's permission. ++ ++A similar issue can happen around XATTR. ++getxattr(2) and listxattr(2) families behave as if dirperm1 option is ++always set. Otherwise these very unpleasant situation would happen. ++- listxattr(2) may return the duplicated entries. ++- users may not be able to remove or reset the XATTR forever, ++ ++ ++XATTR/EA support in the internal (copy,move)-(up,down) ++---------------------------------------------------------------------- ++Generally the extended attributes of inode are categorized as these. ++- "security" for LSM and capability. ++- "system" for posix ACL, 'acl' mount option is required for the branch ++ fs generally. ++- "trusted" for userspace, CAP_SYS_ADMIN is required. ++- "user" for userspace, 'user_xattr' mount option is required for the ++ branch fs generally. ++ ++Moreover there are some other categories. Aufs handles these rather ++unpopular categories as the ordinary ones, ie. there is no special ++condition nor exception. ++ ++In copy-up, the support for XATTR on the dst branch may differ from the ++src branch. In this case, the copy-up operation will get an error and ++the original user operation which triggered the copy-up will fail. It ++can happen that even all copy-up will fail. ++When both of src and dst branches support XATTR and if an error occurs ++during copying XATTR, then the copy-up should fail obviously. That is a ++good reason and aufs should return an error to userspace. But when only ++the src branch support that XATTR, aufs should not return an error. ++For example, the src branch supports ACL but the dst branch doesn't ++because the dst branch may natively un-support it or temporary ++un-support it due to "noacl" mount option. Of course, the dst branch fs ++may NOT return an error even if the XATTR is not supported. It is ++totally up to the branch fs. ++ ++Anyway when the aufs internal copy-up gets an error from the dst branch ++fs, then aufs tries removing the just copied entry and returns the error ++to the userspace. The worst case of this situation will be all copy-up ++will fail. ++ ++For the copy-up operation, there two basic approaches. ++- copy the specified XATTR only (by category above), and return the ++ error unconditionally if it happens. ++- copy all XATTR, and ignore the error on the specified category only. ++ ++In order to support XATTR and to implement the correct behaviour, aufs ++chooses the latter approach and introduces some new branch attributes, ++"icexsec", "icexsys", "icextr", "icexusr", and "icexoth". ++They correspond to the XATTR namespaces (see above). Additionally, to be ++convenient, "icex" is also provided which means all "icex*" attributes ++are set (here the word "icex" stands for "ignore copy-error on XATTR"). ++ ++The meaning of these attributes is to ignore the error from setting ++XATTR on that branch. ++Note that aufs tries copying all XATTR unconditionally, and ignores the ++error from the dst branch according to the specified attributes. ++ ++Some XATTR may have its default value. The default value may come from ++the parent dir or the environment. If the default value is set at the ++file creating-time, it will be overwritten by copy-up. ++Some contradiction may happen I am afraid. ++Do we need another attribute to stop copying XATTR? I am unsure. For ++now, aufs implements the branch attributes to ignore the error. +diff --git a/Documentation/filesystems/aufs/design/07export.txt b/Documentation/filesystems/aufs/design/07export.txt +new file mode 100644 +index 000000000000..f949089f7dd1 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/07export.txt +@@ -0,0 +1,45 @@ ++ ++# Copyright (C) 2005-2018 Junjiro R. Okajima ++ ++Export Aufs via NFS ++---------------------------------------------------------------------- ++Here is an approach. ++- like xino/xib, add a new file 'xigen' which stores aufs inode ++ generation. ++- iget_locked(): initialize aufs inode generation for a new inode, and ++ store it in xigen file. ++- destroy_inode(): increment aufs inode generation and store it in xigen ++ file. it is necessary even if it is not unlinked, because any data of ++ inode may be changed by UDBA. ++- encode_fh(): for a root dir, simply return FILEID_ROOT. otherwise ++ build file handle by ++ + branch id (4 bytes) ++ + superblock generation (4 bytes) ++ + inode number (4 or 8 bytes) ++ + parent dir inode number (4 or 8 bytes) ++ + inode generation (4 bytes)) ++ + return value of exportfs_encode_fh() for the parent on a branch (4 ++ bytes) ++ + file handle for a branch (by exportfs_encode_fh()) ++- fh_to_dentry(): ++ + find the index of a branch from its id in handle, and check it is ++ still exist in aufs. ++ + 1st level: get the inode number from handle and search it in cache. ++ + 2nd level: if not found in cache, get the parent inode number from ++ the handle and search it in cache. and then open the found parent ++ dir, find the matching inode number by vfs_readdir() and get its ++ name, and call lookup_one_len() for the target dentry. ++ + 3rd level: if the parent dir is not cached, call ++ exportfs_decode_fh() for a branch and get the parent on a branch, ++ build a pathname of it, convert it a pathname in aufs, call ++ path_lookup(). now aufs gets a parent dir dentry, then handle it as ++ the 2nd level. ++ + to open the dir, aufs needs struct vfsmount. aufs keeps vfsmount ++ for every branch, but not itself. to get this, (currently) aufs ++ searches in current->nsproxy->mnt_ns list. it may not be a good ++ idea, but I didn't get other approach. ++ + test the generation of the gotten inode. ++- every inode operation: they may get EBUSY due to UDBA. in this case, ++ convert it into ESTALE for NFSD. ++- readdir(): call lockdep_on/off() because filldir in NFSD calls ++ lookup_one_len(), vfs_getattr(), encode_fh() and others. +diff --git a/Documentation/filesystems/aufs/design/08shwh.txt b/Documentation/filesystems/aufs/design/08shwh.txt +new file mode 100644 +index 000000000000..770cb009238a +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/08shwh.txt +@@ -0,0 +1,39 @@ ++ ++# Copyright (C) 2005-2018 Junjiro R. Okajima ++ ++Show Whiteout Mode (shwh) ++---------------------------------------------------------------------- ++Generally aufs hides the name of whiteouts. But in some cases, to show ++them is very useful for users. For instance, creating a new middle layer ++(branch) by merging existing layers. ++ ++(borrowing aufs1 HOW-TO from a user, Michael Towers) ++When you have three branches, ++- Bottom: 'system', squashfs (underlying base system), read-only ++- Middle: 'mods', squashfs, read-only ++- Top: 'overlay', ram (tmpfs), read-write ++ ++The top layer is loaded at boot time and saved at shutdown, to preserve ++the changes made to the system during the session. ++When larger changes have been made, or smaller changes have accumulated, ++the size of the saved top layer data grows. At this point, it would be ++nice to be able to merge the two overlay branches ('mods' and 'overlay') ++and rewrite the 'mods' squashfs, clearing the top layer and thus ++restoring save and load speed. ++ ++This merging is simplified by the use of another aufs mount, of just the ++two overlay branches using the 'shwh' option. ++# mount -t aufs -o ro,shwh,br:/livesys/overlay=ro+wh:/livesys/mods=rr+wh \ ++ aufs /livesys/merge_union ++ ++A merged view of these two branches is then available at ++/livesys/merge_union, and the new feature is that the whiteouts are ++visible! ++Note that in 'shwh' mode the aufs mount must be 'ro', which will disable ++writing to all branches. Also the default mode for all branches is 'ro'. ++It is now possible to save the combined contents of the two overlay ++branches to a new squashfs, e.g.: ++# mksquashfs /livesys/merge_union /path/to/newmods.squash ++ ++This new squashfs archive can be stored on the boot device and the ++initramfs will use it to replace the old one at the next boot. +diff --git a/Documentation/filesystems/aufs/design/10dynop.txt b/Documentation/filesystems/aufs/design/10dynop.txt +new file mode 100644 +index 000000000000..0da5f58da0a6 +--- /dev/null ++++ b/Documentation/filesystems/aufs/design/10dynop.txt +@@ -0,0 +1,34 @@ ++ ++# Copyright (C) 2010-2018 Junjiro R. Okajima ++ ++Dynamically customizable FS operations ++---------------------------------------------------------------------- ++Generally FS operations (struct inode_operations, struct ++address_space_operations, struct file_operations, etc.) are defined as ++"static const", but it never means that FS have only one set of ++operation. Some FS have multiple sets of them. For instance, ext2 has ++three sets, one for XIP, for NOBH, and for normal. ++Since aufs overrides and redirects these operations, sometimes aufs has ++to change its behaviour according to the branch FS type. More importantly ++VFS acts differently if a function (member in the struct) is set or ++not. It means aufs should have several sets of operations and select one ++among them according to the branch FS definition. ++ ++In order to solve this problem and not to affect the behaviour of VFS, ++aufs defines these operations dynamically. For instance, aufs defines ++dummy direct_IO function for struct address_space_operations, but it may ++not be set to the address_space_operations actually. When the branch FS ++doesn't have it, aufs doesn't set it to its address_space_operations ++while the function definition itself is still alive. So the behaviour ++itself will not change, and it will return an error when direct_IO is ++not set. ++ ++The lifetime of these dynamically generated operation object is ++maintained by aufs branch object. When the branch is removed from aufs, ++the reference counter of the object is decremented. When it reaches ++zero, the dynamically generated operation object will be freed. ++ ++This approach is designed to support AIO (io_submit), Direct I/O and ++XIP (DAX) mainly. ++Currently this approach is applied to address_space_operations for ++regular files only. +diff --git a/MAINTAINERS b/MAINTAINERS +index b2f710eee67a..d21161917b56 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -2605,6 +2605,19 @@ F: include/linux/audit.h + F: include/uapi/linux/audit.h + F: kernel/audit* + ++AUFS (advanced multi layered unification filesystem) FILESYSTEM ++M: "J. R. Okajima" ++L: linux-unionfs@vger.kernel.org ++L: aufs-users@lists.sourceforge.net (members only) ++W: http://aufs.sourceforge.net ++T: git://github.com/sfjro/aufs4-linux.git ++S: Supported ++F: Documentation/filesystems/aufs/ ++F: Documentation/ABI/testing/debugfs-aufs ++F: Documentation/ABI/testing/sysfs-aufs ++F: fs/aufs/ ++F: include/uapi/linux/aufs_type.h ++ + AUXILIARY DISPLAY DRIVERS + M: Miguel Ojeda Sandonis + S: Maintained +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index ea9debf59b22..9e534a36c594 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -739,6 +739,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, + return error; + } + ++/* ++ * for AUFS ++ * no get/put for file. ++ */ ++struct file *loop_backing_file(struct super_block *sb) ++{ ++ struct file *ret; ++ struct loop_device *l; ++ ++ ret = NULL; ++ if (MAJOR(sb->s_dev) == LOOP_MAJOR) { ++ l = sb->s_bdev->bd_disk->private_data; ++ ret = l->lo_backing_file; ++ } ++ return ret; ++} ++EXPORT_SYMBOL_GPL(loop_backing_file); ++ + /* loop sysfs attributes */ + + static ssize_t loop_attr_show(struct device *dev, char *page, +diff --git a/fs/Kconfig b/fs/Kconfig +index ac474a61be37..284cee954591 100644 +--- a/fs/Kconfig ++++ b/fs/Kconfig +@@ -255,6 +255,7 @@ source "fs/pstore/Kconfig" + source "fs/sysv/Kconfig" + source "fs/ufs/Kconfig" + source "fs/exofs/Kconfig" ++source "fs/aufs/Kconfig" + + endif # MISC_FILESYSTEMS + +diff --git a/fs/Makefile b/fs/Makefile +index 293733f61594..12d19d0de07a 100644 +--- a/fs/Makefile ++++ b/fs/Makefile +@@ -128,3 +128,4 @@ obj-y += exofs/ # Multiple modules + obj-$(CONFIG_CEPH_FS) += ceph/ + obj-$(CONFIG_PSTORE) += pstore/ + obj-$(CONFIG_EFIVAR_FS) += efivarfs/ ++obj-$(CONFIG_AUFS_FS) += aufs/ +diff --git a/fs/aufs/Kconfig b/fs/aufs/Kconfig +new file mode 100644 +index 000000000000..0b442aeb7b45 +--- /dev/null ++++ b/fs/aufs/Kconfig +@@ -0,0 +1,199 @@ ++# SPDX-License-Identifier: GPL-2.0 ++config AUFS_FS ++ bool "Aufs (Advanced multi layered unification filesystem) support" ++ help ++ Aufs is a stackable unification filesystem such as Unionfs, ++ which unifies several directories and provides a merged single ++ directory. ++ In the early days, aufs was entirely re-designed and ++ re-implemented Unionfs Version 1.x series. Introducing many ++ original ideas, approaches and improvements, it becomes totally ++ different from Unionfs while keeping the basic features. ++ ++if AUFS_FS ++choice ++ prompt "Maximum number of branches" ++ default AUFS_BRANCH_MAX_127 ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++config AUFS_BRANCH_MAX_127 ++ bool "127" ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++config AUFS_BRANCH_MAX_511 ++ bool "511" ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++config AUFS_BRANCH_MAX_1023 ++ bool "1023" ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++config AUFS_BRANCH_MAX_32767 ++ bool "32767" ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++endchoice ++ ++config AUFS_SBILIST ++ bool ++ depends on AUFS_MAGIC_SYSRQ || PROC_FS ++ default y ++ help ++ Automatic configuration for internal use. ++ When aufs supports Magic SysRq or /proc, enabled automatically. ++ ++config AUFS_HNOTIFY ++ bool "Detect direct branch access (bypassing aufs)" ++ help ++ If you want to modify files on branches directly, eg. bypassing aufs, ++ and want aufs to detect the changes of them fully, then enable this ++ option and use 'udba=notify' mount option. ++ Currently there is only one available configuration, "fsnotify". ++ It will have a negative impact to the performance. ++ See detail in aufs.5. ++ ++choice ++ prompt "method" if AUFS_HNOTIFY ++ default AUFS_HFSNOTIFY ++config AUFS_HFSNOTIFY ++ bool "fsnotify" ++ select FSNOTIFY ++endchoice ++ ++config AUFS_EXPORT ++ bool "NFS-exportable aufs" ++ depends on EXPORTFS = y ++ help ++ If you want to export your mounted aufs via NFS, then enable this ++ option. There are several requirements for this configuration. ++ See detail in aufs.5. ++ ++config AUFS_INO_T_64 ++ bool ++ depends on AUFS_EXPORT ++ depends on 64BIT && !(ALPHA || S390) ++ default y ++ help ++ Automatic configuration for internal use. ++ /* typedef unsigned long/int __kernel_ino_t */ ++ /* alpha and s390x are int */ ++ ++config AUFS_XATTR ++ bool "support for XATTR/EA (including Security Labels)" ++ help ++ If your branch fs supports XATTR/EA and you want to make them ++ available in aufs too, then enable this opsion and specify the ++ branch attributes for EA. ++ See detail in aufs.5. ++ ++config AUFS_FHSM ++ bool "File-based Hierarchical Storage Management" ++ help ++ Hierarchical Storage Management (or HSM) is a well-known feature ++ in the storage world. Aufs provides this feature as file-based. ++ with multiple branches. ++ These multiple branches are prioritized, ie. the topmost one ++ should be the fastest drive and be used heavily. ++ ++config AUFS_RDU ++ bool "Readdir in userspace" ++ help ++ Aufs has two methods to provide a merged view for a directory, ++ by a user-space library and by kernel-space natively. The latter ++ is always enabled but sometimes large and slow. ++ If you enable this option, install the library in aufs2-util ++ package, and set some environment variables for your readdir(3), ++ then the work will be handled in user-space which generally ++ shows better performance in most cases. ++ See detail in aufs.5. ++ ++config AUFS_DIRREN ++ bool "Workaround for rename(2)-ing a directory" ++ help ++ By default, aufs returns EXDEV error in renameing a dir who has ++ his child on the lower branch, since it is a bad idea to issue ++ rename(2) internally for every lower branch. But user may not ++ accept this behaviour. So here is a workaround to allow such ++ rename(2) and store some extra infromation on the writable ++ branch. Obviously this costs high (and I don't like it). ++ To use this feature, you need to enable this configuration AND ++ to specify the mount option `dirren.' ++ See details in aufs.5 and the design documents. ++ ++config AUFS_SHWH ++ bool "Show whiteouts" ++ help ++ If you want to make the whiteouts in aufs visible, then enable ++ this option and specify 'shwh' mount option. Although it may ++ sounds like philosophy or something, but in technically it ++ simply shows the name of whiteout with keeping its behaviour. ++ ++config AUFS_BR_RAMFS ++ bool "Ramfs (initramfs/rootfs) as an aufs branch" ++ help ++ If you want to use ramfs as an aufs branch fs, then enable this ++ option. Generally tmpfs is recommended. ++ Aufs prohibited them to be a branch fs by default, because ++ initramfs becomes unusable after switch_root or something ++ generally. If you sets initramfs as an aufs branch and boot your ++ system by switch_root, you will meet a problem easily since the ++ files in initramfs may be inaccessible. ++ Unless you are going to use ramfs as an aufs branch fs without ++ switch_root or something, leave it N. ++ ++config AUFS_BR_FUSE ++ bool "Fuse fs as an aufs branch" ++ depends on FUSE_FS ++ select AUFS_POLL ++ help ++ If you want to use fuse-based userspace filesystem as an aufs ++ branch fs, then enable this option. ++ It implements the internal poll(2) operation which is ++ implemented by fuse only (curretnly). ++ ++config AUFS_POLL ++ bool ++ help ++ Automatic configuration for internal use. ++ ++config AUFS_BR_HFSPLUS ++ bool "Hfsplus as an aufs branch" ++ depends on HFSPLUS_FS ++ default y ++ help ++ If you want to use hfsplus fs as an aufs branch fs, then enable ++ this option. This option introduces a small overhead at ++ copying-up a file on hfsplus. ++ ++config AUFS_BDEV_LOOP ++ bool ++ depends on BLK_DEV_LOOP ++ default y ++ help ++ Automatic configuration for internal use. ++ Convert =[ym] into =y. ++ ++config AUFS_DEBUG ++ bool "Debug aufs" ++ help ++ Enable this to compile aufs internal debug code. ++ It will have a negative impact to the performance. ++ ++config AUFS_MAGIC_SYSRQ ++ bool ++ depends on AUFS_DEBUG && MAGIC_SYSRQ ++ default y ++ help ++ Automatic configuration for internal use. ++ When aufs supports Magic SysRq, enabled automatically. ++endif +diff --git a/fs/aufs/Makefile b/fs/aufs/Makefile +new file mode 100644 +index 000000000000..aa43f916b5ef +--- /dev/null ++++ b/fs/aufs/Makefile +@@ -0,0 +1,38 @@ ++# SPDX-License-Identifier: GPL-2.0 ++ ++include ${srctree}/${src}/magic.mk ++ ++# cf. include/linux/kernel.h ++# enable pr_debug ++ccflags-y += -DDEBUG ++# sparse requires the full pathname ++ccflags-y += -include ${srctree}/include/uapi/linux/aufs_type.h ++ ++obj-$(CONFIG_AUFS_FS) += aufs.o ++aufs-y := module.o sbinfo.o super.o branch.o xino.o sysaufs.o opts.o \ ++ wkq.o vfsub.o dcsub.o \ ++ cpup.o whout.o wbr_policy.o \ ++ dinfo.o dentry.o \ ++ dynop.o \ ++ finfo.o file.o f_op.o \ ++ dir.o vdir.o \ ++ iinfo.o inode.o i_op.o i_op_add.o i_op_del.o i_op_ren.o \ ++ mvdown.o ioctl.o ++ ++# all are boolean ++aufs-$(CONFIG_PROC_FS) += procfs.o plink.o ++aufs-$(CONFIG_SYSFS) += sysfs.o ++aufs-$(CONFIG_DEBUG_FS) += dbgaufs.o ++aufs-$(CONFIG_AUFS_BDEV_LOOP) += loop.o ++aufs-$(CONFIG_AUFS_HNOTIFY) += hnotify.o ++aufs-$(CONFIG_AUFS_HFSNOTIFY) += hfsnotify.o ++aufs-$(CONFIG_AUFS_EXPORT) += export.o ++aufs-$(CONFIG_AUFS_XATTR) += xattr.o ++aufs-$(CONFIG_FS_POSIX_ACL) += posix_acl.o ++aufs-$(CONFIG_AUFS_DIRREN) += dirren.o ++aufs-$(CONFIG_AUFS_FHSM) += fhsm.o ++aufs-$(CONFIG_AUFS_POLL) += poll.o ++aufs-$(CONFIG_AUFS_RDU) += rdu.o ++aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o ++aufs-$(CONFIG_AUFS_DEBUG) += debug.o ++aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o +diff --git a/fs/aufs/aufs.h b/fs/aufs/aufs.h +new file mode 100644 +index 000000000000..dea04e2ba37c +--- /dev/null ++++ b/fs/aufs/aufs.h +@@ -0,0 +1,49 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * all header files ++ */ ++ ++#ifndef __AUFS_H__ ++#define __AUFS_H__ ++ ++#ifdef __KERNEL__ ++ ++#define AuStub(type, name, body, ...) \ ++ static inline type name(__VA_ARGS__) { body; } ++ ++#define AuStubVoid(name, ...) \ ++ AuStub(void, name, , __VA_ARGS__) ++#define AuStubInt0(name, ...) \ ++ AuStub(int, name, return 0, __VA_ARGS__) ++ ++#include "debug.h" ++ ++#include "branch.h" ++#include "cpup.h" ++#include "dcsub.h" ++#include "dbgaufs.h" ++#include "dentry.h" ++#include "dir.h" ++#include "dirren.h" ++#include "dynop.h" ++#include "file.h" ++#include "fstype.h" ++#include "hbl.h" ++#include "inode.h" ++#include "lcnt.h" ++#include "loop.h" ++#include "module.h" ++#include "opts.h" ++#include "rwsem.h" ++#include "super.h" ++#include "sysaufs.h" ++#include "vfsub.h" ++#include "whout.h" ++#include "wkq.h" ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_H__ */ +diff --git a/fs/aufs/branch.c b/fs/aufs/branch.c +new file mode 100644 +index 000000000000..1451b4418950 +--- /dev/null ++++ b/fs/aufs/branch.c +@@ -0,0 +1,1409 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * branch management ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++/* ++ * free a single branch ++ */ ++static void au_br_do_free(struct au_branch *br) ++{ ++ int i; ++ struct au_wbr *wbr; ++ struct au_dykey **key; ++ ++ au_hnotify_fin_br(br); ++ /* always, regardless the mount option */ ++ au_dr_hino_free(&br->br_dirren); ++ au_xino_put(br); ++ ++ AuLCntZero(au_lcnt_read(&br->br_nfiles, /*do_rev*/0)); ++ au_lcnt_fin(&br->br_nfiles, /*do_sync*/0); ++ AuLCntZero(au_lcnt_read(&br->br_count, /*do_rev*/0)); ++ au_lcnt_fin(&br->br_count, /*do_sync*/0); ++ ++ wbr = br->br_wbr; ++ if (wbr) { ++ for (i = 0; i < AuBrWh_Last; i++) ++ dput(wbr->wbr_wh[i]); ++ AuDebugOn(atomic_read(&wbr->wbr_wh_running)); ++ AuRwDestroy(&wbr->wbr_wh_rwsem); ++ } ++ ++ if (br->br_fhsm) { ++ au_br_fhsm_fin(br->br_fhsm); ++ kfree(br->br_fhsm); ++ } ++ ++ key = br->br_dykey; ++ for (i = 0; i < AuBrDynOp; i++, key++) ++ if (*key) ++ au_dy_put(*key); ++ else ++ break; ++ ++ /* recursive lock, s_umount of branch's */ ++ /* synchronize_rcu(); */ /* why? */ ++ lockdep_off(); ++ path_put(&br->br_path); ++ lockdep_on(); ++ kfree(wbr); ++ au_lcnt_wait_for_fin(&br->br_nfiles); ++ au_lcnt_wait_for_fin(&br->br_count); ++ /* I don't know why, but percpu_refcount requires this */ ++ /* synchronize_rcu(); */ ++ kfree(br); ++} ++ ++/* ++ * frees all branches ++ */ ++void au_br_free(struct au_sbinfo *sbinfo) ++{ ++ aufs_bindex_t bmax; ++ struct au_branch **br; ++ ++ AuRwMustWriteLock(&sbinfo->si_rwsem); ++ ++ bmax = sbinfo->si_bbot + 1; ++ br = sbinfo->si_branch; ++ while (bmax--) ++ au_br_do_free(*br++); ++} ++ ++/* ++ * find the index of a branch which is specified by @br_id. ++ */ ++int au_br_index(struct super_block *sb, aufs_bindex_t br_id) ++{ ++ aufs_bindex_t bindex, bbot; ++ ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) ++ if (au_sbr_id(sb, bindex) == br_id) ++ return bindex; ++ return -1; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * add a branch ++ */ ++ ++static int test_overlap(struct super_block *sb, struct dentry *h_adding, ++ struct dentry *h_root) ++{ ++ if (unlikely(h_adding == h_root ++ || au_test_loopback_overlap(sb, h_adding))) ++ return 1; ++ if (h_adding->d_sb != h_root->d_sb) ++ return 0; ++ return au_test_subdir(h_adding, h_root) ++ || au_test_subdir(h_root, h_adding); ++} ++ ++/* ++ * returns a newly allocated branch. @new_nbranch is a number of branches ++ * after adding a branch. ++ */ ++static struct au_branch *au_br_alloc(struct super_block *sb, int new_nbranch, ++ int perm) ++{ ++ struct au_branch *add_branch; ++ struct dentry *root; ++ struct inode *inode; ++ int err; ++ ++ err = -ENOMEM; ++ add_branch = kzalloc(sizeof(*add_branch), GFP_NOFS); ++ if (unlikely(!add_branch)) ++ goto out; ++ add_branch->br_xino = au_xino_alloc(/*nfile*/1); ++ if (unlikely(!add_branch->br_xino)) ++ goto out_br; ++ err = au_hnotify_init_br(add_branch, perm); ++ if (unlikely(err)) ++ goto out_xino; ++ ++ if (au_br_writable(perm)) { ++ /* may be freed separately at changing the branch permission */ ++ add_branch->br_wbr = kzalloc(sizeof(*add_branch->br_wbr), ++ GFP_NOFS); ++ if (unlikely(!add_branch->br_wbr)) ++ goto out_hnotify; ++ } ++ ++ if (au_br_fhsm(perm)) { ++ err = au_fhsm_br_alloc(add_branch); ++ if (unlikely(err)) ++ goto out_wbr; ++ } ++ ++ root = sb->s_root; ++ err = au_sbr_realloc(au_sbi(sb), new_nbranch, /*may_shrink*/0); ++ if (!err) ++ err = au_di_realloc(au_di(root), new_nbranch, /*may_shrink*/0); ++ if (!err) { ++ inode = d_inode(root); ++ err = au_hinode_realloc(au_ii(inode), new_nbranch, ++ /*may_shrink*/0); ++ } ++ if (!err) ++ return add_branch; /* success */ ++ ++out_wbr: ++ kfree(add_branch->br_wbr); ++out_hnotify: ++ au_hnotify_fin_br(add_branch); ++out_xino: ++ au_xino_put(add_branch); ++out_br: ++ kfree(add_branch); ++out: ++ return ERR_PTR(err); ++} ++ ++/* ++ * test if the branch permission is legal or not. ++ */ ++static int test_br(struct inode *inode, int brperm, char *path) ++{ ++ int err; ++ ++ err = (au_br_writable(brperm) && IS_RDONLY(inode)); ++ if (!err) ++ goto out; ++ ++ err = -EINVAL; ++ pr_err("write permission for readonly mount or inode, %s\n", path); ++ ++out: ++ return err; ++} ++ ++/* ++ * returns: ++ * 0: success, the caller will add it ++ * plus: success, it is already unified, the caller should ignore it ++ * minus: error ++ */ ++static int test_add(struct super_block *sb, struct au_opt_add *add, int remount) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct dentry *root, *h_dentry; ++ struct inode *inode, *h_inode; ++ ++ root = sb->s_root; ++ bbot = au_sbbot(sb); ++ if (unlikely(bbot >= 0 ++ && au_find_dbindex(root, add->path.dentry) >= 0)) { ++ err = 1; ++ if (!remount) { ++ err = -EINVAL; ++ pr_err("%s duplicated\n", add->pathname); ++ } ++ goto out; ++ } ++ ++ err = -ENOSPC; /* -E2BIG; */ ++ if (unlikely(AUFS_BRANCH_MAX <= add->bindex ++ || AUFS_BRANCH_MAX - 1 <= bbot)) { ++ pr_err("number of branches exceeded %s\n", add->pathname); ++ goto out; ++ } ++ ++ err = -EDOM; ++ if (unlikely(add->bindex < 0 || bbot + 1 < add->bindex)) { ++ pr_err("bad index %d\n", add->bindex); ++ goto out; ++ } ++ ++ inode = d_inode(add->path.dentry); ++ err = -ENOENT; ++ if (unlikely(!inode->i_nlink)) { ++ pr_err("no existence %s\n", add->pathname); ++ goto out; ++ } ++ ++ err = -EINVAL; ++ if (unlikely(inode->i_sb == sb)) { ++ pr_err("%s must be outside\n", add->pathname); ++ goto out; ++ } ++ ++ if (unlikely(au_test_fs_unsuppoted(inode->i_sb))) { ++ pr_err("unsupported filesystem, %s (%s)\n", ++ add->pathname, au_sbtype(inode->i_sb)); ++ goto out; ++ } ++ ++ if (unlikely(inode->i_sb->s_stack_depth)) { ++ pr_err("already stacked, %s (%s)\n", ++ add->pathname, au_sbtype(inode->i_sb)); ++ goto out; ++ } ++ ++ err = test_br(d_inode(add->path.dentry), add->perm, add->pathname); ++ if (unlikely(err)) ++ goto out; ++ ++ if (bbot < 0) ++ return 0; /* success */ ++ ++ err = -EINVAL; ++ for (bindex = 0; bindex <= bbot; bindex++) ++ if (unlikely(test_overlap(sb, add->path.dentry, ++ au_h_dptr(root, bindex)))) { ++ pr_err("%s is overlapped\n", add->pathname); ++ goto out; ++ } ++ ++ err = 0; ++ if (au_opt_test(au_mntflags(sb), WARN_PERM)) { ++ h_dentry = au_h_dptr(root, 0); ++ h_inode = d_inode(h_dentry); ++ if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO) ++ || !uid_eq(h_inode->i_uid, inode->i_uid) ++ || !gid_eq(h_inode->i_gid, inode->i_gid)) ++ pr_warn("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n", ++ add->pathname, ++ i_uid_read(inode), i_gid_read(inode), ++ (inode->i_mode & S_IALLUGO), ++ i_uid_read(h_inode), i_gid_read(h_inode), ++ (h_inode->i_mode & S_IALLUGO)); ++ } ++ ++out: ++ return err; ++} ++ ++/* ++ * initialize or clean the whiteouts for an adding branch ++ */ ++static int au_br_init_wh(struct super_block *sb, struct au_branch *br, ++ int new_perm) ++{ ++ int err, old_perm; ++ aufs_bindex_t bindex; ++ struct inode *h_inode; ++ struct au_wbr *wbr; ++ struct au_hinode *hdir; ++ struct dentry *h_dentry; ++ ++ err = vfsub_mnt_want_write(au_br_mnt(br)); ++ if (unlikely(err)) ++ goto out; ++ ++ wbr = br->br_wbr; ++ old_perm = br->br_perm; ++ br->br_perm = new_perm; ++ hdir = NULL; ++ h_inode = NULL; ++ bindex = au_br_index(sb, br->br_id); ++ if (0 <= bindex) { ++ hdir = au_hi(d_inode(sb->s_root), bindex); ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ } else { ++ h_dentry = au_br_dentry(br); ++ h_inode = d_inode(h_dentry); ++ inode_lock_nested(h_inode, AuLsc_I_PARENT); ++ } ++ if (!wbr) ++ err = au_wh_init(br, sb); ++ else { ++ wbr_wh_write_lock(wbr); ++ err = au_wh_init(br, sb); ++ wbr_wh_write_unlock(wbr); ++ } ++ if (hdir) ++ au_hn_inode_unlock(hdir); ++ else ++ inode_unlock(h_inode); ++ vfsub_mnt_drop_write(au_br_mnt(br)); ++ br->br_perm = old_perm; ++ ++ if (!err && wbr && !au_br_writable(new_perm)) { ++ kfree(wbr); ++ br->br_wbr = NULL; ++ } ++ ++out: ++ return err; ++} ++ ++static int au_wbr_init(struct au_branch *br, struct super_block *sb, ++ int perm) ++{ ++ int err; ++ struct kstatfs kst; ++ struct au_wbr *wbr; ++ ++ wbr = br->br_wbr; ++ au_rw_init(&wbr->wbr_wh_rwsem); ++ atomic_set(&wbr->wbr_wh_running, 0); ++ ++ /* ++ * a limit for rmdir/rename a dir ++ * cf. AUFS_MAX_NAMELEN in include/uapi/linux/aufs_type.h ++ */ ++ err = vfs_statfs(&br->br_path, &kst); ++ if (unlikely(err)) ++ goto out; ++ err = -EINVAL; ++ if (kst.f_namelen >= NAME_MAX) ++ err = au_br_init_wh(sb, br, perm); ++ else ++ pr_err("%pd(%s), unsupported namelen %ld\n", ++ au_br_dentry(br), ++ au_sbtype(au_br_dentry(br)->d_sb), kst.f_namelen); ++ ++out: ++ return err; ++} ++ ++/* initialize a new branch */ ++static int au_br_init(struct au_branch *br, struct super_block *sb, ++ struct au_opt_add *add) ++{ ++ int err; ++ struct au_branch *brbase; ++ struct file *xf; ++ struct inode *h_inode; ++ ++ err = 0; ++ br->br_perm = add->perm; ++ br->br_path = add->path; /* set first, path_get() later */ ++ spin_lock_init(&br->br_dykey_lock); ++ au_lcnt_init(&br->br_nfiles, /*release*/NULL); ++ au_lcnt_init(&br->br_count, /*release*/NULL); ++ br->br_id = au_new_br_id(sb); ++ AuDebugOn(br->br_id < 0); ++ ++ /* always, regardless the given option */ ++ err = au_dr_br_init(sb, br, &add->path); ++ if (unlikely(err)) ++ goto out_err; ++ ++ if (au_br_writable(add->perm)) { ++ err = au_wbr_init(br, sb, add->perm); ++ if (unlikely(err)) ++ goto out_err; ++ } ++ ++ if (au_opt_test(au_mntflags(sb), XINO)) { ++ brbase = au_sbr(sb, 0); ++ xf = au_xino_file(brbase->br_xino, /*idx*/-1); ++ AuDebugOn(!xf); ++ h_inode = d_inode(add->path.dentry); ++ err = au_xino_init_br(sb, br, h_inode->i_ino, &xf->f_path); ++ if (unlikely(err)) { ++ AuDebugOn(au_xino_file(br->br_xino, /*idx*/-1)); ++ goto out_err; ++ } ++ } ++ ++ sysaufs_br_init(br); ++ path_get(&br->br_path); ++ goto out; /* success */ ++ ++out_err: ++ memset(&br->br_path, 0, sizeof(br->br_path)); ++out: ++ return err; ++} ++ ++static void au_br_do_add_brp(struct au_sbinfo *sbinfo, aufs_bindex_t bindex, ++ struct au_branch *br, aufs_bindex_t bbot, ++ aufs_bindex_t amount) ++{ ++ struct au_branch **brp; ++ ++ AuRwMustWriteLock(&sbinfo->si_rwsem); ++ ++ brp = sbinfo->si_branch + bindex; ++ memmove(brp + 1, brp, sizeof(*brp) * amount); ++ *brp = br; ++ sbinfo->si_bbot++; ++ if (unlikely(bbot < 0)) ++ sbinfo->si_bbot = 0; ++} ++ ++static void au_br_do_add_hdp(struct au_dinfo *dinfo, aufs_bindex_t bindex, ++ aufs_bindex_t bbot, aufs_bindex_t amount) ++{ ++ struct au_hdentry *hdp; ++ ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ hdp = au_hdentry(dinfo, bindex); ++ memmove(hdp + 1, hdp, sizeof(*hdp) * amount); ++ au_h_dentry_init(hdp); ++ dinfo->di_bbot++; ++ if (unlikely(bbot < 0)) ++ dinfo->di_btop = 0; ++} ++ ++static void au_br_do_add_hip(struct au_iinfo *iinfo, aufs_bindex_t bindex, ++ aufs_bindex_t bbot, aufs_bindex_t amount) ++{ ++ struct au_hinode *hip; ++ ++ AuRwMustWriteLock(&iinfo->ii_rwsem); ++ ++ hip = au_hinode(iinfo, bindex); ++ memmove(hip + 1, hip, sizeof(*hip) * amount); ++ au_hinode_init(hip); ++ iinfo->ii_bbot++; ++ if (unlikely(bbot < 0)) ++ iinfo->ii_btop = 0; ++} ++ ++static void au_br_do_add(struct super_block *sb, struct au_branch *br, ++ aufs_bindex_t bindex) ++{ ++ struct dentry *root, *h_dentry; ++ struct inode *root_inode, *h_inode; ++ aufs_bindex_t bbot, amount; ++ ++ root = sb->s_root; ++ root_inode = d_inode(root); ++ bbot = au_sbbot(sb); ++ amount = bbot + 1 - bindex; ++ h_dentry = au_br_dentry(br); ++ au_sbilist_lock(); ++ au_br_do_add_brp(au_sbi(sb), bindex, br, bbot, amount); ++ au_br_do_add_hdp(au_di(root), bindex, bbot, amount); ++ au_br_do_add_hip(au_ii(root_inode), bindex, bbot, amount); ++ au_set_h_dptr(root, bindex, dget(h_dentry)); ++ h_inode = d_inode(h_dentry); ++ au_set_h_iptr(root_inode, bindex, au_igrab(h_inode), /*flags*/0); ++ au_sbilist_unlock(); ++} ++ ++int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount) ++{ ++ int err; ++ aufs_bindex_t bbot, add_bindex; ++ struct dentry *root, *h_dentry; ++ struct inode *root_inode; ++ struct au_branch *add_branch; ++ ++ root = sb->s_root; ++ root_inode = d_inode(root); ++ IMustLock(root_inode); ++ IiMustWriteLock(root_inode); ++ err = test_add(sb, add, remount); ++ if (unlikely(err < 0)) ++ goto out; ++ if (err) { ++ err = 0; ++ goto out; /* success */ ++ } ++ ++ bbot = au_sbbot(sb); ++ add_branch = au_br_alloc(sb, bbot + 2, add->perm); ++ err = PTR_ERR(add_branch); ++ if (IS_ERR(add_branch)) ++ goto out; ++ ++ err = au_br_init(add_branch, sb, add); ++ if (unlikely(err)) { ++ au_br_do_free(add_branch); ++ goto out; ++ } ++ ++ add_bindex = add->bindex; ++ sysaufs_brs_del(sb, add_bindex); /* remove successors */ ++ au_br_do_add(sb, add_branch, add_bindex); ++ sysaufs_brs_add(sb, add_bindex); /* append successors */ ++ dbgaufs_brs_add(sb, add_bindex, /*topdown*/0); /* rename successors */ ++ ++ h_dentry = add->path.dentry; ++ if (!add_bindex) { ++ au_cpup_attr_all(root_inode, /*force*/1); ++ sb->s_maxbytes = h_dentry->d_sb->s_maxbytes; ++ } else ++ au_add_nlink(root_inode, d_inode(h_dentry)); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static unsigned long long au_farray_cb(struct super_block *sb, void *a, ++ unsigned long long max __maybe_unused, ++ void *arg) ++{ ++ unsigned long long n; ++ struct file **p, *f; ++ struct hlist_bl_head *files; ++ struct hlist_bl_node *pos; ++ struct au_finfo *finfo; ++ ++ n = 0; ++ p = a; ++ files = &au_sbi(sb)->si_files; ++ hlist_bl_lock(files); ++ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { ++ f = finfo->fi_file; ++ if (file_count(f) ++ && !special_file(file_inode(f)->i_mode)) { ++ get_file(f); ++ *p++ = f; ++ n++; ++ AuDebugOn(n > max); ++ } ++ } ++ hlist_bl_unlock(files); ++ ++ return n; ++} ++ ++static struct file **au_farray_alloc(struct super_block *sb, ++ unsigned long long *max) ++{ ++ struct au_sbinfo *sbi; ++ ++ sbi = au_sbi(sb); ++ *max = au_lcnt_read(&sbi->si_nfiles, /*do_rev*/1); ++ return au_array_alloc(max, au_farray_cb, sb, /*arg*/NULL); ++} ++ ++static void au_farray_free(struct file **a, unsigned long long max) ++{ ++ unsigned long long ull; ++ ++ for (ull = 0; ull < max; ull++) ++ if (a[ull]) ++ fput(a[ull]); ++ kvfree(a); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * delete a branch ++ */ ++ ++/* to show the line number, do not make it inlined function */ ++#define AuVerbose(do_info, fmt, ...) do { \ ++ if (do_info) \ ++ pr_info(fmt, ##__VA_ARGS__); \ ++} while (0) ++ ++static int au_test_ibusy(struct inode *inode, aufs_bindex_t btop, ++ aufs_bindex_t bbot) ++{ ++ return (inode && !S_ISDIR(inode->i_mode)) || btop == bbot; ++} ++ ++static int au_test_dbusy(struct dentry *dentry, aufs_bindex_t btop, ++ aufs_bindex_t bbot) ++{ ++ return au_test_ibusy(d_inode(dentry), btop, bbot); ++} ++ ++/* ++ * test if the branch is deletable or not. ++ */ ++static int test_dentry_busy(struct dentry *root, aufs_bindex_t bindex, ++ unsigned int sigen, const unsigned int verbose) ++{ ++ int err, i, j, ndentry; ++ aufs_bindex_t btop, bbot; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry *d; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_dcsub_pages(&dpages, root, NULL, NULL); ++ if (unlikely(err)) ++ goto out_dpages; ++ ++ for (i = 0; !err && i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ ndentry = dpage->ndentry; ++ for (j = 0; !err && j < ndentry; j++) { ++ d = dpage->dentries[j]; ++ AuDebugOn(au_dcount(d) <= 0); ++ if (!au_digen_test(d, sigen)) { ++ di_read_lock_child(d, AuLock_IR); ++ if (unlikely(au_dbrange_test(d))) { ++ di_read_unlock(d, AuLock_IR); ++ continue; ++ } ++ } else { ++ di_write_lock_child(d); ++ if (unlikely(au_dbrange_test(d))) { ++ di_write_unlock(d); ++ continue; ++ } ++ err = au_reval_dpath(d, sigen); ++ if (!err) ++ di_downgrade_lock(d, AuLock_IR); ++ else { ++ di_write_unlock(d); ++ break; ++ } ++ } ++ ++ /* AuDbgDentry(d); */ ++ btop = au_dbtop(d); ++ bbot = au_dbbot(d); ++ if (btop <= bindex ++ && bindex <= bbot ++ && au_h_dptr(d, bindex) ++ && au_test_dbusy(d, btop, bbot)) { ++ err = -EBUSY; ++ AuVerbose(verbose, "busy %pd\n", d); ++ AuDbgDentry(d); ++ } ++ di_read_unlock(d, AuLock_IR); ++ } ++ } ++ ++out_dpages: ++ au_dpages_free(&dpages); ++out: ++ return err; ++} ++ ++static int test_inode_busy(struct super_block *sb, aufs_bindex_t bindex, ++ unsigned int sigen, const unsigned int verbose) ++{ ++ int err; ++ unsigned long long max, ull; ++ struct inode *i, **array; ++ aufs_bindex_t btop, bbot; ++ ++ array = au_iarray_alloc(sb, &max); ++ err = PTR_ERR(array); ++ if (IS_ERR(array)) ++ goto out; ++ ++ err = 0; ++ AuDbg("b%d\n", bindex); ++ for (ull = 0; !err && ull < max; ull++) { ++ i = array[ull]; ++ if (unlikely(!i)) ++ break; ++ if (i->i_ino == AUFS_ROOT_INO) ++ continue; ++ ++ /* AuDbgInode(i); */ ++ if (au_iigen(i, NULL) == sigen) ++ ii_read_lock_child(i); ++ else { ++ ii_write_lock_child(i); ++ err = au_refresh_hinode_self(i); ++ au_iigen_dec(i); ++ if (!err) ++ ii_downgrade_lock(i); ++ else { ++ ii_write_unlock(i); ++ break; ++ } ++ } ++ ++ btop = au_ibtop(i); ++ bbot = au_ibbot(i); ++ if (btop <= bindex ++ && bindex <= bbot ++ && au_h_iptr(i, bindex) ++ && au_test_ibusy(i, btop, bbot)) { ++ err = -EBUSY; ++ AuVerbose(verbose, "busy i%lu\n", i->i_ino); ++ AuDbgInode(i); ++ } ++ ii_read_unlock(i); ++ } ++ au_iarray_free(array, max); ++ ++out: ++ return err; ++} ++ ++static int test_children_busy(struct dentry *root, aufs_bindex_t bindex, ++ const unsigned int verbose) ++{ ++ int err; ++ unsigned int sigen; ++ ++ sigen = au_sigen(root->d_sb); ++ DiMustNoWaiters(root); ++ IiMustNoWaiters(d_inode(root)); ++ di_write_unlock(root); ++ err = test_dentry_busy(root, bindex, sigen, verbose); ++ if (!err) ++ err = test_inode_busy(root->d_sb, bindex, sigen, verbose); ++ di_write_lock_child(root); /* aufs_write_lock() calls ..._child() */ ++ ++ return err; ++} ++ ++static int test_dir_busy(struct file *file, aufs_bindex_t br_id, ++ struct file **to_free, int *idx) ++{ ++ int err; ++ unsigned char matched, root; ++ aufs_bindex_t bindex, bbot; ++ struct au_fidir *fidir; ++ struct au_hfile *hfile; ++ ++ err = 0; ++ root = IS_ROOT(file->f_path.dentry); ++ if (root) { ++ get_file(file); ++ to_free[*idx] = file; ++ (*idx)++; ++ goto out; ++ } ++ ++ matched = 0; ++ fidir = au_fi(file)->fi_hdir; ++ AuDebugOn(!fidir); ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) { ++ hfile = fidir->fd_hfile + bindex; ++ if (!hfile->hf_file) ++ continue; ++ ++ if (hfile->hf_br->br_id == br_id) { ++ matched = 1; ++ break; ++ } ++ } ++ if (matched) ++ err = -EBUSY; ++ ++out: ++ return err; ++} ++ ++static int test_file_busy(struct super_block *sb, aufs_bindex_t br_id, ++ struct file **to_free, int opened) ++{ ++ int err, idx; ++ unsigned long long ull, max; ++ aufs_bindex_t btop; ++ struct file *file, **array; ++ struct dentry *root; ++ struct au_hfile *hfile; ++ ++ array = au_farray_alloc(sb, &max); ++ err = PTR_ERR(array); ++ if (IS_ERR(array)) ++ goto out; ++ ++ err = 0; ++ idx = 0; ++ root = sb->s_root; ++ di_write_unlock(root); ++ for (ull = 0; ull < max; ull++) { ++ file = array[ull]; ++ if (unlikely(!file)) ++ break; ++ ++ /* AuDbg("%pD\n", file); */ ++ fi_read_lock(file); ++ btop = au_fbtop(file); ++ if (!d_is_dir(file->f_path.dentry)) { ++ hfile = &au_fi(file)->fi_htop; ++ if (hfile->hf_br->br_id == br_id) ++ err = -EBUSY; ++ } else ++ err = test_dir_busy(file, br_id, to_free, &idx); ++ fi_read_unlock(file); ++ if (unlikely(err)) ++ break; ++ } ++ di_write_lock_child(root); ++ au_farray_free(array, max); ++ AuDebugOn(idx > opened); ++ ++out: ++ return err; ++} ++ ++static void br_del_file(struct file **to_free, unsigned long long opened, ++ aufs_bindex_t br_id) ++{ ++ unsigned long long ull; ++ aufs_bindex_t bindex, btop, bbot, bfound; ++ struct file *file; ++ struct au_fidir *fidir; ++ struct au_hfile *hfile; ++ ++ for (ull = 0; ull < opened; ull++) { ++ file = to_free[ull]; ++ if (unlikely(!file)) ++ break; ++ ++ /* AuDbg("%pD\n", file); */ ++ AuDebugOn(!d_is_dir(file->f_path.dentry)); ++ bfound = -1; ++ fidir = au_fi(file)->fi_hdir; ++ AuDebugOn(!fidir); ++ fi_write_lock(file); ++ btop = au_fbtop(file); ++ bbot = au_fbbot_dir(file); ++ for (bindex = btop; bindex <= bbot; bindex++) { ++ hfile = fidir->fd_hfile + bindex; ++ if (!hfile->hf_file) ++ continue; ++ ++ if (hfile->hf_br->br_id == br_id) { ++ bfound = bindex; ++ break; ++ } ++ } ++ AuDebugOn(bfound < 0); ++ au_set_h_fptr(file, bfound, NULL); ++ if (bfound == btop) { ++ for (btop++; btop <= bbot; btop++) ++ if (au_hf_dir(file, btop)) { ++ au_set_fbtop(file, btop); ++ break; ++ } ++ } ++ fi_write_unlock(file); ++ } ++} ++ ++static void au_br_do_del_brp(struct au_sbinfo *sbinfo, ++ const aufs_bindex_t bindex, ++ const aufs_bindex_t bbot) ++{ ++ struct au_branch **brp, **p; ++ ++ AuRwMustWriteLock(&sbinfo->si_rwsem); ++ ++ brp = sbinfo->si_branch + bindex; ++ if (bindex < bbot) ++ memmove(brp, brp + 1, sizeof(*brp) * (bbot - bindex)); ++ sbinfo->si_branch[0 + bbot] = NULL; ++ sbinfo->si_bbot--; ++ ++ p = au_krealloc(sbinfo->si_branch, sizeof(*p) * bbot, AuGFP_SBILIST, ++ /*may_shrink*/1); ++ if (p) ++ sbinfo->si_branch = p; ++ /* harmless error */ ++} ++ ++static void au_br_do_del_hdp(struct au_dinfo *dinfo, const aufs_bindex_t bindex, ++ const aufs_bindex_t bbot) ++{ ++ struct au_hdentry *hdp, *p; ++ ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ hdp = au_hdentry(dinfo, bindex); ++ if (bindex < bbot) ++ memmove(hdp, hdp + 1, sizeof(*hdp) * (bbot - bindex)); ++ /* au_h_dentry_init(au_hdentry(dinfo, bbot); */ ++ dinfo->di_bbot--; ++ ++ p = au_krealloc(dinfo->di_hdentry, sizeof(*p) * bbot, AuGFP_SBILIST, ++ /*may_shrink*/1); ++ if (p) ++ dinfo->di_hdentry = p; ++ /* harmless error */ ++} ++ ++static void au_br_do_del_hip(struct au_iinfo *iinfo, const aufs_bindex_t bindex, ++ const aufs_bindex_t bbot) ++{ ++ struct au_hinode *hip, *p; ++ ++ AuRwMustWriteLock(&iinfo->ii_rwsem); ++ ++ hip = au_hinode(iinfo, bindex); ++ if (bindex < bbot) ++ memmove(hip, hip + 1, sizeof(*hip) * (bbot - bindex)); ++ /* au_hinode_init(au_hinode(iinfo, bbot)); */ ++ iinfo->ii_bbot--; ++ ++ p = au_krealloc(iinfo->ii_hinode, sizeof(*p) * bbot, AuGFP_SBILIST, ++ /*may_shrink*/1); ++ if (p) ++ iinfo->ii_hinode = p; ++ /* harmless error */ ++} ++ ++static void au_br_do_del(struct super_block *sb, aufs_bindex_t bindex, ++ struct au_branch *br) ++{ ++ aufs_bindex_t bbot; ++ struct au_sbinfo *sbinfo; ++ struct dentry *root, *h_root; ++ struct inode *inode, *h_inode; ++ struct au_hinode *hinode; ++ ++ SiMustWriteLock(sb); ++ ++ root = sb->s_root; ++ inode = d_inode(root); ++ sbinfo = au_sbi(sb); ++ bbot = sbinfo->si_bbot; ++ ++ h_root = au_h_dptr(root, bindex); ++ hinode = au_hi(inode, bindex); ++ h_inode = au_igrab(hinode->hi_inode); ++ au_hiput(hinode); ++ ++ au_sbilist_lock(); ++ au_br_do_del_brp(sbinfo, bindex, bbot); ++ au_br_do_del_hdp(au_di(root), bindex, bbot); ++ au_br_do_del_hip(au_ii(inode), bindex, bbot); ++ au_sbilist_unlock(); ++ ++ /* ignore an error */ ++ au_dr_br_fin(sb, br); /* always, regardless the mount option */ ++ ++ dput(h_root); ++ iput(h_inode); ++ au_br_do_free(br); ++} ++ ++static unsigned long long empty_cb(struct super_block *sb, void *array, ++ unsigned long long max, void *arg) ++{ ++ return max; ++} ++ ++int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount) ++{ ++ int err, rerr, i; ++ unsigned long long opened; ++ unsigned int mnt_flags; ++ aufs_bindex_t bindex, bbot, br_id; ++ unsigned char do_wh, verbose; ++ struct au_branch *br; ++ struct au_wbr *wbr; ++ struct dentry *root; ++ struct file **to_free; ++ ++ err = 0; ++ opened = 0; ++ to_free = NULL; ++ root = sb->s_root; ++ bindex = au_find_dbindex(root, del->h_path.dentry); ++ if (bindex < 0) { ++ if (remount) ++ goto out; /* success */ ++ err = -ENOENT; ++ pr_err("%s no such branch\n", del->pathname); ++ goto out; ++ } ++ AuDbg("bindex b%d\n", bindex); ++ ++ err = -EBUSY; ++ mnt_flags = au_mntflags(sb); ++ verbose = !!au_opt_test(mnt_flags, VERBOSE); ++ bbot = au_sbbot(sb); ++ if (unlikely(!bbot)) { ++ AuVerbose(verbose, "no more branches left\n"); ++ goto out; ++ } ++ ++ br = au_sbr(sb, bindex); ++ AuDebugOn(!path_equal(&br->br_path, &del->h_path)); ++ if (unlikely(au_lcnt_read(&br->br_count, /*do_rev*/1))) { ++ AuVerbose(verbose, "br %pd2 is busy now\n", del->h_path.dentry); ++ goto out; ++ } ++ ++ br_id = br->br_id; ++ opened = au_lcnt_read(&br->br_nfiles, /*do_rev*/1); ++ if (unlikely(opened)) { ++ to_free = au_array_alloc(&opened, empty_cb, sb, NULL); ++ err = PTR_ERR(to_free); ++ if (IS_ERR(to_free)) ++ goto out; ++ ++ err = test_file_busy(sb, br_id, to_free, opened); ++ if (unlikely(err)) { ++ AuVerbose(verbose, "%llu file(s) opened\n", opened); ++ goto out; ++ } ++ } ++ ++ wbr = br->br_wbr; ++ do_wh = wbr && (wbr->wbr_whbase || wbr->wbr_plink || wbr->wbr_orph); ++ if (do_wh) { ++ /* instead of WbrWhMustWriteLock(wbr) */ ++ SiMustWriteLock(sb); ++ for (i = 0; i < AuBrWh_Last; i++) { ++ dput(wbr->wbr_wh[i]); ++ wbr->wbr_wh[i] = NULL; ++ } ++ } ++ ++ err = test_children_busy(root, bindex, verbose); ++ if (unlikely(err)) { ++ if (do_wh) ++ goto out_wh; ++ goto out; ++ } ++ ++ err = 0; ++ if (to_free) { ++ /* ++ * now we confirmed the branch is deletable. ++ * let's free the remaining opened dirs on the branch. ++ */ ++ di_write_unlock(root); ++ br_del_file(to_free, opened, br_id); ++ di_write_lock_child(root); ++ } ++ ++ sysaufs_brs_del(sb, bindex); /* remove successors */ ++ dbgaufs_xino_del(br); /* remove one */ ++ au_br_do_del(sb, bindex, br); ++ sysaufs_brs_add(sb, bindex); /* append successors */ ++ dbgaufs_brs_add(sb, bindex, /*topdown*/1); /* rename successors */ ++ ++ if (!bindex) { ++ au_cpup_attr_all(d_inode(root), /*force*/1); ++ sb->s_maxbytes = au_sbr_sb(sb, 0)->s_maxbytes; ++ } else ++ au_sub_nlink(d_inode(root), d_inode(del->h_path.dentry)); ++ if (au_opt_test(mnt_flags, PLINK)) ++ au_plink_half_refresh(sb, br_id); ++ ++ goto out; /* success */ ++ ++out_wh: ++ /* revert */ ++ rerr = au_br_init_wh(sb, br, br->br_perm); ++ if (rerr) ++ pr_warn("failed re-creating base whiteout, %s. (%d)\n", ++ del->pathname, rerr); ++out: ++ if (to_free) ++ au_farray_free(to_free, opened); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_ibusy(struct super_block *sb, struct aufs_ibusy __user *arg) ++{ ++ int err; ++ aufs_bindex_t btop, bbot; ++ struct aufs_ibusy ibusy; ++ struct inode *inode, *h_inode; ++ ++ err = -EPERM; ++ if (unlikely(!capable(CAP_SYS_ADMIN))) ++ goto out; ++ ++ err = copy_from_user(&ibusy, arg, sizeof(ibusy)); ++ if (!err) ++ err = !access_ok(VERIFY_WRITE, &arg->h_ino, sizeof(arg->h_ino)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out; ++ } ++ ++ err = -EINVAL; ++ si_read_lock(sb, AuLock_FLUSH); ++ if (unlikely(ibusy.bindex < 0 || ibusy.bindex > au_sbbot(sb))) ++ goto out_unlock; ++ ++ err = 0; ++ ibusy.h_ino = 0; /* invalid */ ++ inode = ilookup(sb, ibusy.ino); ++ if (!inode ++ || inode->i_ino == AUFS_ROOT_INO ++ || au_is_bad_inode(inode)) ++ goto out_unlock; ++ ++ ii_read_lock_child(inode); ++ btop = au_ibtop(inode); ++ bbot = au_ibbot(inode); ++ if (btop <= ibusy.bindex && ibusy.bindex <= bbot) { ++ h_inode = au_h_iptr(inode, ibusy.bindex); ++ if (h_inode && au_test_ibusy(inode, btop, bbot)) ++ ibusy.h_ino = h_inode->i_ino; ++ } ++ ii_read_unlock(inode); ++ iput(inode); ++ ++out_unlock: ++ si_read_unlock(sb); ++ if (!err) { ++ err = __put_user(ibusy.h_ino, &arg->h_ino); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ } ++ } ++out: ++ return err; ++} ++ ++long au_ibusy_ioctl(struct file *file, unsigned long arg) ++{ ++ return au_ibusy(file->f_path.dentry->d_sb, (void __user *)arg); ++} ++ ++#ifdef CONFIG_COMPAT ++long au_ibusy_compat_ioctl(struct file *file, unsigned long arg) ++{ ++ return au_ibusy(file->f_path.dentry->d_sb, compat_ptr(arg)); ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * change a branch permission ++ */ ++ ++static void au_warn_ima(void) ++{ ++#ifdef CONFIG_IMA ++ /* since it doesn't support mark_files_ro() */ ++ AuWarn1("RW -> RO makes IMA to produce wrong message\n"); ++#endif ++} ++ ++static int do_need_sigen_inc(int a, int b) ++{ ++ return au_br_whable(a) && !au_br_whable(b); ++} ++ ++static int need_sigen_inc(int old, int new) ++{ ++ return do_need_sigen_inc(old, new) ++ || do_need_sigen_inc(new, old); ++} ++ ++static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ int err, do_warn; ++ unsigned int mnt_flags; ++ unsigned long long ull, max; ++ aufs_bindex_t br_id; ++ unsigned char verbose, writer; ++ struct file *file, *hf, **array; ++ struct au_hfile *hfile; ++ ++ mnt_flags = au_mntflags(sb); ++ verbose = !!au_opt_test(mnt_flags, VERBOSE); ++ ++ array = au_farray_alloc(sb, &max); ++ err = PTR_ERR(array); ++ if (IS_ERR(array)) ++ goto out; ++ ++ do_warn = 0; ++ br_id = au_sbr_id(sb, bindex); ++ for (ull = 0; ull < max; ull++) { ++ file = array[ull]; ++ if (unlikely(!file)) ++ break; ++ ++ /* AuDbg("%pD\n", file); */ ++ fi_read_lock(file); ++ if (unlikely(au_test_mmapped(file))) { ++ err = -EBUSY; ++ AuVerbose(verbose, "mmapped %pD\n", file); ++ AuDbgFile(file); ++ FiMustNoWaiters(file); ++ fi_read_unlock(file); ++ goto out_array; ++ } ++ ++ hfile = &au_fi(file)->fi_htop; ++ hf = hfile->hf_file; ++ if (!d_is_reg(file->f_path.dentry) ++ || !(file->f_mode & FMODE_WRITE) ++ || hfile->hf_br->br_id != br_id ++ || !(hf->f_mode & FMODE_WRITE)) ++ array[ull] = NULL; ++ else { ++ do_warn = 1; ++ get_file(file); ++ } ++ ++ FiMustNoWaiters(file); ++ fi_read_unlock(file); ++ fput(file); ++ } ++ ++ err = 0; ++ if (do_warn) ++ au_warn_ima(); ++ ++ for (ull = 0; ull < max; ull++) { ++ file = array[ull]; ++ if (!file) ++ continue; ++ ++ /* todo: already flushed? */ ++ /* ++ * fs/super.c:mark_files_ro() is gone, but aufs keeps its ++ * approach which resets f_mode and calls mnt_drop_write() and ++ * file_release_write() for each file, because the branch ++ * attribute in aufs world is totally different from the native ++ * fs rw/ro mode. ++ */ ++ /* fi_read_lock(file); */ ++ hfile = &au_fi(file)->fi_htop; ++ hf = hfile->hf_file; ++ /* fi_read_unlock(file); */ ++ spin_lock(&hf->f_lock); ++ writer = !!(hf->f_mode & FMODE_WRITER); ++ hf->f_mode &= ~(FMODE_WRITE | FMODE_WRITER); ++ spin_unlock(&hf->f_lock); ++ if (writer) { ++ put_write_access(file_inode(hf)); ++ __mnt_drop_write(hf->f_path.mnt); ++ } ++ } ++ ++out_array: ++ au_farray_free(array, max); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, ++ int *do_refresh) ++{ ++ int err, rerr; ++ aufs_bindex_t bindex; ++ struct dentry *root; ++ struct au_branch *br; ++ struct au_br_fhsm *bf; ++ ++ root = sb->s_root; ++ bindex = au_find_dbindex(root, mod->h_root); ++ if (bindex < 0) { ++ if (remount) ++ return 0; /* success */ ++ err = -ENOENT; ++ pr_err("%s no such branch\n", mod->path); ++ goto out; ++ } ++ AuDbg("bindex b%d\n", bindex); ++ ++ err = test_br(d_inode(mod->h_root), mod->perm, mod->path); ++ if (unlikely(err)) ++ goto out; ++ ++ br = au_sbr(sb, bindex); ++ AuDebugOn(mod->h_root != au_br_dentry(br)); ++ if (br->br_perm == mod->perm) ++ return 0; /* success */ ++ ++ /* pre-allocate for non-fhsm --> fhsm */ ++ bf = NULL; ++ if (!au_br_fhsm(br->br_perm) && au_br_fhsm(mod->perm)) { ++ err = au_fhsm_br_alloc(br); ++ if (unlikely(err)) ++ goto out; ++ bf = br->br_fhsm; ++ br->br_fhsm = NULL; ++ } ++ ++ if (au_br_writable(br->br_perm)) { ++ /* remove whiteout base */ ++ err = au_br_init_wh(sb, br, mod->perm); ++ if (unlikely(err)) ++ goto out_bf; ++ ++ if (!au_br_writable(mod->perm)) { ++ /* rw --> ro, file might be mmapped */ ++ DiMustNoWaiters(root); ++ IiMustNoWaiters(d_inode(root)); ++ di_write_unlock(root); ++ err = au_br_mod_files_ro(sb, bindex); ++ /* aufs_write_lock() calls ..._child() */ ++ di_write_lock_child(root); ++ ++ if (unlikely(err)) { ++ rerr = -ENOMEM; ++ br->br_wbr = kzalloc(sizeof(*br->br_wbr), ++ GFP_NOFS); ++ if (br->br_wbr) ++ rerr = au_wbr_init(br, sb, br->br_perm); ++ if (unlikely(rerr)) { ++ AuIOErr("nested error %d (%d)\n", ++ rerr, err); ++ br->br_perm = mod->perm; ++ } ++ } ++ } ++ } else if (au_br_writable(mod->perm)) { ++ /* ro --> rw */ ++ err = -ENOMEM; ++ br->br_wbr = kzalloc(sizeof(*br->br_wbr), GFP_NOFS); ++ if (br->br_wbr) { ++ err = au_wbr_init(br, sb, mod->perm); ++ if (unlikely(err)) { ++ kfree(br->br_wbr); ++ br->br_wbr = NULL; ++ } ++ } ++ } ++ if (unlikely(err)) ++ goto out_bf; ++ ++ if (au_br_fhsm(br->br_perm)) { ++ if (!au_br_fhsm(mod->perm)) { ++ /* fhsm --> non-fhsm */ ++ au_br_fhsm_fin(br->br_fhsm); ++ kfree(br->br_fhsm); ++ br->br_fhsm = NULL; ++ } ++ } else if (au_br_fhsm(mod->perm)) ++ /* non-fhsm --> fhsm */ ++ br->br_fhsm = bf; ++ ++ *do_refresh |= need_sigen_inc(br->br_perm, mod->perm); ++ br->br_perm = mod->perm; ++ goto out; /* success */ ++ ++out_bf: ++ kfree(bf); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs) ++{ ++ int err; ++ struct kstatfs kstfs; ++ ++ err = vfs_statfs(&br->br_path, &kstfs); ++ if (!err) { ++ stfs->f_blocks = kstfs.f_blocks; ++ stfs->f_bavail = kstfs.f_bavail; ++ stfs->f_files = kstfs.f_files; ++ stfs->f_ffree = kstfs.f_ffree; ++ } ++ ++ return err; ++} +diff --git a/fs/aufs/branch.h b/fs/aufs/branch.h +new file mode 100644 +index 000000000000..3ef09d71b44f +--- /dev/null ++++ b/fs/aufs/branch.h +@@ -0,0 +1,354 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * branch filesystems and xino for them ++ */ ++ ++#ifndef __AUFS_BRANCH_H__ ++#define __AUFS_BRANCH_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include "dirren.h" ++#include "dynop.h" ++#include "lcnt.h" ++#include "rwsem.h" ++#include "super.h" ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* a xino file */ ++struct au_xino { ++ struct file **xi_file; ++ unsigned int xi_nfile; ++ ++ struct { ++ spinlock_t spin; ++ ino_t *array; ++ int total; ++ /* reserved for future use */ ++ /* unsigned long *bitmap; */ ++ wait_queue_head_t wqh; ++ } xi_nondir; ++ ++ struct mutex xi_mtx; /* protects xi_file array */ ++ /* reserved for future use */ ++ /* wait_queue_head_t xi_wq; */ ++ /* atomic_t xi_pending; */ ++ ++ atomic_t xi_truncating; ++ ++ struct kref xi_kref; ++}; ++ ++/* File-based Hierarchical Storage Management */ ++struct au_br_fhsm { ++#ifdef CONFIG_AUFS_FHSM ++ struct mutex bf_lock; ++ unsigned long bf_jiffy; ++ struct aufs_stfs bf_stfs; ++ int bf_readable; ++#endif ++}; ++ ++/* members for writable branch only */ ++enum {AuBrWh_BASE, AuBrWh_PLINK, AuBrWh_ORPH, AuBrWh_Last}; ++struct au_wbr { ++ struct au_rwsem wbr_wh_rwsem; ++ struct dentry *wbr_wh[AuBrWh_Last]; ++ atomic_t wbr_wh_running; ++#define wbr_whbase wbr_wh[AuBrWh_BASE] /* whiteout base */ ++#define wbr_plink wbr_wh[AuBrWh_PLINK] /* pseudo-link dir */ ++#define wbr_orph wbr_wh[AuBrWh_ORPH] /* dir for orphans */ ++ ++ /* mfs mode */ ++ unsigned long long wbr_bytes; ++}; ++ ++/* ext2 has 3 types of operations at least, ext3 has 4 */ ++#define AuBrDynOp (AuDyLast * 4) ++ ++#ifdef CONFIG_AUFS_HFSNOTIFY ++/* support for asynchronous destruction */ ++struct au_br_hfsnotify { ++ struct fsnotify_group *hfsn_group; ++}; ++#endif ++ ++/* sysfs entries */ ++struct au_brsysfs { ++ char name[16]; ++ struct attribute attr; ++}; ++ ++enum { ++ AuBrSysfs_BR, ++ AuBrSysfs_BRID, ++ AuBrSysfs_Last ++}; ++ ++/* protected by superblock rwsem */ ++struct au_branch { ++ struct au_xino *br_xino; ++ ++ aufs_bindex_t br_id; ++ ++ int br_perm; ++ struct path br_path; ++ spinlock_t br_dykey_lock; ++ struct au_dykey *br_dykey[AuBrDynOp]; ++ au_lcnt_t br_nfiles; /* opened files */ ++ au_lcnt_t br_count; /* in-use for other */ ++ ++ struct au_wbr *br_wbr; ++ struct au_br_fhsm *br_fhsm; ++ ++#ifdef CONFIG_AUFS_HFSNOTIFY ++ struct au_br_hfsnotify *br_hfsn; ++#endif ++ ++#ifdef CONFIG_SYSFS ++ /* entries under sysfs per mount-point */ ++ struct au_brsysfs br_sysfs[AuBrSysfs_Last]; ++#endif ++ ++#ifdef CONFIG_DEBUG_FS ++ struct dentry *br_dbgaufs; /* xino */ ++#endif ++ ++ struct au_dr_br br_dirren; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct vfsmount *au_br_mnt(struct au_branch *br) ++{ ++ return br->br_path.mnt; ++} ++ ++static inline struct dentry *au_br_dentry(struct au_branch *br) ++{ ++ return br->br_path.dentry; ++} ++ ++static inline struct super_block *au_br_sb(struct au_branch *br) ++{ ++ return au_br_mnt(br)->mnt_sb; ++} ++ ++static inline int au_br_rdonly(struct au_branch *br) ++{ ++ return (sb_rdonly(au_br_sb(br)) ++ || !au_br_writable(br->br_perm)) ++ ? -EROFS : 0; ++} ++ ++static inline int au_br_hnotifyable(int brperm __maybe_unused) ++{ ++#ifdef CONFIG_AUFS_HNOTIFY ++ return !(brperm & AuBrPerm_RR); ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_br_test_oflag(int oflag, struct au_branch *br) ++{ ++ int err, exec_flag; ++ ++ err = 0; ++ exec_flag = oflag & __FMODE_EXEC; ++ if (unlikely(exec_flag && path_noexec(&br->br_path))) ++ err = -EACCES; ++ ++ return err; ++} ++ ++static inline void au_xino_get(struct au_branch *br) ++{ ++ struct au_xino *xi; ++ ++ xi = br->br_xino; ++ if (xi) ++ kref_get(&xi->xi_kref); ++} ++ ++static inline int au_xino_count(struct au_branch *br) ++{ ++ int v; ++ struct au_xino *xi; ++ ++ v = 0; ++ xi = br->br_xino; ++ if (xi) ++ v = kref_read(&xi->xi_kref); ++ ++ return v; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* branch.c */ ++struct au_sbinfo; ++void au_br_free(struct au_sbinfo *sinfo); ++int au_br_index(struct super_block *sb, aufs_bindex_t br_id); ++struct au_opt_add; ++int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount); ++struct au_opt_del; ++int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount); ++long au_ibusy_ioctl(struct file *file, unsigned long arg); ++#ifdef CONFIG_COMPAT ++long au_ibusy_compat_ioctl(struct file *file, unsigned long arg); ++#endif ++struct au_opt_mod; ++int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, ++ int *do_refresh); ++struct aufs_stfs; ++int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs); ++ ++/* xino.c */ ++static const loff_t au_loff_max = LLONG_MAX; ++ ++aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry); ++struct file *au_xino_create(struct super_block *sb, char *fpath, int silent); ++struct file *au_xino_create2(struct super_block *sb, struct path *base, ++ struct file *copy_src); ++struct au_xi_new { ++ struct au_xino *xi; /* switch between xino and xigen */ ++ int idx; ++ struct path *base; ++ struct file *copy_src; ++}; ++struct file *au_xi_new(struct super_block *sb, struct au_xi_new *xinew); ++ ++int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ ino_t *ino); ++int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ ino_t ino); ++ssize_t xino_fread(vfs_readf_t func, struct file *file, void *buf, size_t size, ++ loff_t *pos); ++ssize_t xino_fwrite(vfs_writef_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos); ++ ++int au_xib_trunc(struct super_block *sb); ++int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin); ++ ++struct au_xino *au_xino_alloc(unsigned int nfile); ++int au_xino_put(struct au_branch *br); ++struct file *au_xino_file1(struct au_xino *xi); ++ ++struct au_opt_xino; ++void au_xino_clr(struct super_block *sb); ++int au_xino_set(struct super_block *sb, struct au_opt_xino *xiopt, int remount); ++struct file *au_xino_def(struct super_block *sb); ++int au_xino_init_br(struct super_block *sb, struct au_branch *br, ino_t hino, ++ struct path *base); ++ ++ino_t au_xino_new_ino(struct super_block *sb); ++void au_xino_delete_inode(struct inode *inode, const int unlinked); ++ ++void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, ++ ino_t h_ino, int idx); ++int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ int *idx); ++ ++int au_xino_path(struct seq_file *seq, struct file *file); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* @idx is signed to accept -1 meaning the first file */ ++static inline struct file *au_xino_file(struct au_xino *xi, int idx) ++{ ++ struct file *file; ++ ++ file = NULL; ++ if (!xi) ++ goto out; ++ ++ if (idx >= 0) { ++ if (idx < xi->xi_nfile) ++ file = xi->xi_file[idx]; ++ } else ++ file = au_xino_file1(xi); ++ ++out: ++ return file; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* Superblock to branch */ ++static inline ++aufs_bindex_t au_sbr_id(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_sbr(sb, bindex)->br_id; ++} ++ ++static inline ++struct vfsmount *au_sbr_mnt(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_br_mnt(au_sbr(sb, bindex)); ++} ++ ++static inline ++struct super_block *au_sbr_sb(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_br_sb(au_sbr(sb, bindex)); ++} ++ ++static inline int au_sbr_perm(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_sbr(sb, bindex)->br_perm; ++} ++ ++static inline int au_sbr_whable(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_br_whable(au_sbr_perm(sb, bindex)); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define wbr_wh_read_lock(wbr) au_rw_read_lock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_write_lock(wbr) au_rw_write_lock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_read_trylock(wbr) au_rw_read_trylock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_write_trylock(wbr) au_rw_write_trylock(&(wbr)->wbr_wh_rwsem) ++/* ++#define wbr_wh_read_trylock_nested(wbr) \ ++ au_rw_read_trylock_nested(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_write_trylock_nested(wbr) \ ++ au_rw_write_trylock_nested(&(wbr)->wbr_wh_rwsem) ++*/ ++ ++#define wbr_wh_read_unlock(wbr) au_rw_read_unlock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_write_unlock(wbr) au_rw_write_unlock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_downgrade_lock(wbr) au_rw_dgrade_lock(&(wbr)->wbr_wh_rwsem) ++ ++#define WbrWhMustNoWaiters(wbr) AuRwMustNoWaiters(&(wbr)->wbr_wh_rwsem) ++#define WbrWhMustAnyLock(wbr) AuRwMustAnyLock(&(wbr)->wbr_wh_rwsem) ++#define WbrWhMustWriteLock(wbr) AuRwMustWriteLock(&(wbr)->wbr_wh_rwsem) ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_FHSM ++static inline void au_br_fhsm_init(struct au_br_fhsm *brfhsm) ++{ ++ mutex_init(&brfhsm->bf_lock); ++ brfhsm->bf_jiffy = 0; ++ brfhsm->bf_readable = 0; ++} ++ ++static inline void au_br_fhsm_fin(struct au_br_fhsm *brfhsm) ++{ ++ mutex_destroy(&brfhsm->bf_lock); ++} ++#else ++AuStubVoid(au_br_fhsm_init, struct au_br_fhsm *brfhsm) ++AuStubVoid(au_br_fhsm_fin, struct au_br_fhsm *brfhsm) ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_BRANCH_H__ */ +diff --git a/fs/aufs/cpup.c b/fs/aufs/cpup.c +new file mode 100644 +index 000000000000..9309866b1a15 +--- /dev/null ++++ b/fs/aufs/cpup.c +@@ -0,0 +1,1431 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * copy-up functions, see wbr_policy.c for copy-down ++ */ ++ ++#include ++#include ++#include ++#include "aufs.h" ++ ++void au_cpup_attr_flags(struct inode *dst, unsigned int iflags) ++{ ++ const unsigned int mask = S_DEAD | S_SWAPFILE | S_PRIVATE ++ | S_NOATIME | S_NOCMTIME | S_AUTOMOUNT; ++ ++ BUILD_BUG_ON(sizeof(iflags) != sizeof(dst->i_flags)); ++ ++ dst->i_flags |= iflags & ~mask; ++ if (au_test_fs_notime(dst->i_sb)) ++ dst->i_flags |= S_NOATIME | S_NOCMTIME; ++} ++ ++void au_cpup_attr_timesizes(struct inode *inode) ++{ ++ struct inode *h_inode; ++ ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ fsstack_copy_attr_times(inode, h_inode); ++ fsstack_copy_inode_size(inode, h_inode); ++} ++ ++void au_cpup_attr_nlink(struct inode *inode, int force) ++{ ++ struct inode *h_inode; ++ struct super_block *sb; ++ aufs_bindex_t bindex, bbot; ++ ++ sb = inode->i_sb; ++ bindex = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, bindex); ++ if (!force ++ && !S_ISDIR(h_inode->i_mode) ++ && au_opt_test(au_mntflags(sb), PLINK) ++ && au_plink_test(inode)) ++ return; ++ ++ /* ++ * 0 can happen in revalidating. ++ * h_inode->i_mutex may not be held here, but it is harmless since once ++ * i_nlink reaches 0, it will never become positive except O_TMPFILE ++ * case. ++ * todo: O_TMPFILE+linkat(AT_SYMLINK_FOLLOW) bypassing aufs may cause ++ * the incorrect link count. ++ */ ++ set_nlink(inode, h_inode->i_nlink); ++ ++ /* ++ * fewer nlink makes find(1) noisy, but larger nlink doesn't. ++ * it may includes whplink directory. ++ */ ++ if (S_ISDIR(h_inode->i_mode)) { ++ bbot = au_ibbot(inode); ++ for (bindex++; bindex <= bbot; bindex++) { ++ h_inode = au_h_iptr(inode, bindex); ++ if (h_inode) ++ au_add_nlink(inode, h_inode); ++ } ++ } ++} ++ ++void au_cpup_attr_changeable(struct inode *inode) ++{ ++ struct inode *h_inode; ++ ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ inode->i_mode = h_inode->i_mode; ++ inode->i_uid = h_inode->i_uid; ++ inode->i_gid = h_inode->i_gid; ++ au_cpup_attr_timesizes(inode); ++ au_cpup_attr_flags(inode, h_inode->i_flags); ++} ++ ++void au_cpup_igen(struct inode *inode, struct inode *h_inode) ++{ ++ struct au_iinfo *iinfo = au_ii(inode); ++ ++ IiMustWriteLock(inode); ++ ++ iinfo->ii_higen = h_inode->i_generation; ++ iinfo->ii_hsb1 = h_inode->i_sb; ++} ++ ++void au_cpup_attr_all(struct inode *inode, int force) ++{ ++ struct inode *h_inode; ++ ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ au_cpup_attr_changeable(inode); ++ if (inode->i_nlink > 0) ++ au_cpup_attr_nlink(inode, force); ++ inode->i_rdev = h_inode->i_rdev; ++ inode->i_blkbits = h_inode->i_blkbits; ++ au_cpup_igen(inode, h_inode); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* Note: dt_dentry and dt_h_dentry are not dget/dput-ed */ ++ ++/* keep the timestamps of the parent dir when cpup */ ++void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, ++ struct path *h_path) ++{ ++ struct inode *h_inode; ++ ++ dt->dt_dentry = dentry; ++ dt->dt_h_path = *h_path; ++ h_inode = d_inode(h_path->dentry); ++ dt->dt_atime = h_inode->i_atime; ++ dt->dt_mtime = h_inode->i_mtime; ++ /* smp_mb(); */ ++} ++ ++void au_dtime_revert(struct au_dtime *dt) ++{ ++ struct iattr attr; ++ int err; ++ ++ attr.ia_atime = dt->dt_atime; ++ attr.ia_mtime = dt->dt_mtime; ++ attr.ia_valid = ATTR_FORCE | ATTR_MTIME | ATTR_MTIME_SET ++ | ATTR_ATIME | ATTR_ATIME_SET; ++ ++ /* no delegation since this is a directory */ ++ err = vfsub_notify_change(&dt->dt_h_path, &attr, /*delegated*/NULL); ++ if (unlikely(err)) ++ pr_warn("restoring timestamps failed(%d). ignored\n", err); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* internal use only */ ++struct au_cpup_reg_attr { ++ int valid; ++ struct kstat st; ++ unsigned int iflags; /* inode->i_flags */ ++}; ++ ++static noinline_for_stack ++int cpup_iattr(struct dentry *dst, aufs_bindex_t bindex, struct dentry *h_src, ++ struct au_cpup_reg_attr *h_src_attr) ++{ ++ int err, sbits, icex; ++ unsigned int mnt_flags; ++ unsigned char verbose; ++ struct iattr ia; ++ struct path h_path; ++ struct inode *h_isrc, *h_idst; ++ struct kstat *h_st; ++ struct au_branch *br; ++ ++ h_path.dentry = au_h_dptr(dst, bindex); ++ h_idst = d_inode(h_path.dentry); ++ br = au_sbr(dst->d_sb, bindex); ++ h_path.mnt = au_br_mnt(br); ++ h_isrc = d_inode(h_src); ++ ia.ia_valid = ATTR_FORCE | ATTR_UID | ATTR_GID ++ | ATTR_ATIME | ATTR_MTIME ++ | ATTR_ATIME_SET | ATTR_MTIME_SET; ++ if (h_src_attr && h_src_attr->valid) { ++ h_st = &h_src_attr->st; ++ ia.ia_uid = h_st->uid; ++ ia.ia_gid = h_st->gid; ++ ia.ia_atime = h_st->atime; ++ ia.ia_mtime = h_st->mtime; ++ if (h_idst->i_mode != h_st->mode ++ && !S_ISLNK(h_idst->i_mode)) { ++ ia.ia_valid |= ATTR_MODE; ++ ia.ia_mode = h_st->mode; ++ } ++ sbits = !!(h_st->mode & (S_ISUID | S_ISGID)); ++ au_cpup_attr_flags(h_idst, h_src_attr->iflags); ++ } else { ++ ia.ia_uid = h_isrc->i_uid; ++ ia.ia_gid = h_isrc->i_gid; ++ ia.ia_atime = h_isrc->i_atime; ++ ia.ia_mtime = h_isrc->i_mtime; ++ if (h_idst->i_mode != h_isrc->i_mode ++ && !S_ISLNK(h_idst->i_mode)) { ++ ia.ia_valid |= ATTR_MODE; ++ ia.ia_mode = h_isrc->i_mode; ++ } ++ sbits = !!(h_isrc->i_mode & (S_ISUID | S_ISGID)); ++ au_cpup_attr_flags(h_idst, h_isrc->i_flags); ++ } ++ /* no delegation since it is just created */ ++ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); ++ ++ /* is this nfs only? */ ++ if (!err && sbits && au_test_nfs(h_path.dentry->d_sb)) { ++ ia.ia_valid = ATTR_FORCE | ATTR_MODE; ++ ia.ia_mode = h_isrc->i_mode; ++ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); ++ } ++ ++ icex = br->br_perm & AuBrAttr_ICEX; ++ if (!err) { ++ mnt_flags = au_mntflags(dst->d_sb); ++ verbose = !!au_opt_test(mnt_flags, VERBOSE); ++ err = au_cpup_xattr(h_path.dentry, h_src, icex, verbose); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_copy_file(struct file *dst, struct file *src, loff_t len, ++ char *buf, unsigned long blksize) ++{ ++ int err; ++ size_t sz, rbytes, wbytes; ++ unsigned char all_zero; ++ char *p, *zp; ++ struct inode *h_inode; ++ /* reduce stack usage */ ++ struct iattr *ia; ++ ++ zp = page_address(ZERO_PAGE(0)); ++ if (unlikely(!zp)) ++ return -ENOMEM; /* possible? */ ++ ++ err = 0; ++ all_zero = 0; ++ while (len) { ++ AuDbg("len %lld\n", len); ++ sz = blksize; ++ if (len < blksize) ++ sz = len; ++ ++ rbytes = 0; ++ /* todo: signal_pending? */ ++ while (!rbytes || err == -EAGAIN || err == -EINTR) { ++ rbytes = vfsub_read_k(src, buf, sz, &src->f_pos); ++ err = rbytes; ++ } ++ if (unlikely(err < 0)) ++ break; ++ ++ all_zero = 0; ++ if (len >= rbytes && rbytes == blksize) ++ all_zero = !memcmp(buf, zp, rbytes); ++ if (!all_zero) { ++ wbytes = rbytes; ++ p = buf; ++ while (wbytes) { ++ size_t b; ++ ++ b = vfsub_write_k(dst, p, wbytes, &dst->f_pos); ++ err = b; ++ /* todo: signal_pending? */ ++ if (unlikely(err == -EAGAIN || err == -EINTR)) ++ continue; ++ if (unlikely(err < 0)) ++ break; ++ wbytes -= b; ++ p += b; ++ } ++ if (unlikely(err < 0)) ++ break; ++ } else { ++ loff_t res; ++ ++ AuLabel(hole); ++ res = vfsub_llseek(dst, rbytes, SEEK_CUR); ++ err = res; ++ if (unlikely(res < 0)) ++ break; ++ } ++ len -= rbytes; ++ err = 0; ++ } ++ ++ /* the last block may be a hole */ ++ if (!err && all_zero) { ++ AuLabel(last hole); ++ ++ err = 1; ++ if (au_test_nfs(dst->f_path.dentry->d_sb)) { ++ /* nfs requires this step to make last hole */ ++ /* is this only nfs? */ ++ do { ++ /* todo: signal_pending? */ ++ err = vfsub_write_k(dst, "\0", 1, &dst->f_pos); ++ } while (err == -EAGAIN || err == -EINTR); ++ if (err == 1) ++ dst->f_pos--; ++ } ++ ++ if (err == 1) { ++ ia = (void *)buf; ++ ia->ia_size = dst->f_pos; ++ ia->ia_valid = ATTR_SIZE | ATTR_FILE; ++ ia->ia_file = dst; ++ h_inode = file_inode(dst); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD2); ++ /* no delegation since it is just created */ ++ err = vfsub_notify_change(&dst->f_path, ia, ++ /*delegated*/NULL); ++ inode_unlock(h_inode); ++ } ++ } ++ ++ return err; ++} ++ ++int au_copy_file(struct file *dst, struct file *src, loff_t len) ++{ ++ int err; ++ unsigned long blksize; ++ unsigned char do_kfree; ++ char *buf; ++ ++ err = -ENOMEM; ++ blksize = dst->f_path.dentry->d_sb->s_blocksize; ++ if (!blksize || PAGE_SIZE < blksize) ++ blksize = PAGE_SIZE; ++ AuDbg("blksize %lu\n", blksize); ++ do_kfree = (blksize != PAGE_SIZE && blksize >= sizeof(struct iattr *)); ++ if (do_kfree) ++ buf = kmalloc(blksize, GFP_NOFS); ++ else ++ buf = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!buf)) ++ goto out; ++ ++ if (len > (1 << 22)) ++ AuDbg("copying a large file %lld\n", (long long)len); ++ ++ src->f_pos = 0; ++ dst->f_pos = 0; ++ err = au_do_copy_file(dst, src, len, buf, blksize); ++ if (do_kfree) ++ kfree(buf); ++ else ++ free_page((unsigned long)buf); ++ ++out: ++ return err; ++} ++ ++static int au_do_copy(struct file *dst, struct file *src, loff_t len) ++{ ++ int err; ++ struct super_block *h_src_sb; ++ struct inode *h_src_inode; ++ ++ h_src_inode = file_inode(src); ++ h_src_sb = h_src_inode->i_sb; ++ ++ /* XFS acquires inode_lock */ ++ if (!au_test_xfs(h_src_sb)) ++ err = au_copy_file(dst, src, len); ++ else { ++ inode_unlock_shared(h_src_inode); ++ err = au_copy_file(dst, src, len); ++ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); ++ } ++ ++ return err; ++} ++ ++static int au_clone_or_copy(struct file *dst, struct file *src, loff_t len) ++{ ++ int err; ++ struct super_block *h_src_sb; ++ struct inode *h_src_inode; ++ ++ h_src_inode = file_inode(src); ++ h_src_sb = h_src_inode->i_sb; ++ if (h_src_sb != file_inode(dst)->i_sb ++ || !dst->f_op->clone_file_range) { ++ err = au_do_copy(dst, src, len); ++ goto out; ++ } ++ ++ if (!au_test_nfs(h_src_sb)) { ++ inode_unlock_shared(h_src_inode); ++ err = vfsub_clone_file_range(src, dst, len); ++ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); ++ } else ++ err = vfsub_clone_file_range(src, dst, len); ++ /* older XFS has a condition in cloning */ ++ if (unlikely(err != -EOPNOTSUPP)) ++ goto out; ++ ++ /* the backend fs on NFS may not support cloning */ ++ err = au_do_copy(dst, src, len); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * to support a sparse file which is opened with O_APPEND, ++ * we need to close the file. ++ */ ++static int au_cp_regular(struct au_cp_generic *cpg) ++{ ++ int err, i; ++ enum { SRC, DST }; ++ struct { ++ aufs_bindex_t bindex; ++ unsigned int flags; ++ struct dentry *dentry; ++ int force_wr; ++ struct file *file; ++ void *label; ++ } *f, file[] = { ++ { ++ .bindex = cpg->bsrc, ++ .flags = O_RDONLY | O_NOATIME | O_LARGEFILE, ++ .label = &&out ++ }, ++ { ++ .bindex = cpg->bdst, ++ .flags = O_WRONLY | O_NOATIME | O_LARGEFILE, ++ .force_wr = !!au_ftest_cpup(cpg->flags, RWDST), ++ .label = &&out_src ++ } ++ }; ++ struct au_branch *br; ++ struct super_block *sb, *h_src_sb; ++ struct inode *h_src_inode; ++ struct task_struct *tsk = current; ++ ++ /* bsrc branch can be ro/rw. */ ++ sb = cpg->dentry->d_sb; ++ f = file; ++ for (i = 0; i < 2; i++, f++) { ++ f->dentry = au_h_dptr(cpg->dentry, f->bindex); ++ f->file = au_h_open(cpg->dentry, f->bindex, f->flags, ++ /*file*/NULL, f->force_wr); ++ err = PTR_ERR(f->file); ++ if (IS_ERR(f->file)) ++ goto *f->label; ++ } ++ ++ /* try stopping to update while we copyup */ ++ h_src_inode = d_inode(file[SRC].dentry); ++ h_src_sb = h_src_inode->i_sb; ++ if (!au_test_nfs(h_src_sb)) ++ IMustLock(h_src_inode); ++ err = au_clone_or_copy(file[DST].file, file[SRC].file, cpg->len); ++ ++ /* i wonder if we had O_NO_DELAY_FPUT flag */ ++ if (tsk->flags & PF_KTHREAD) ++ __fput_sync(file[DST].file); ++ else { ++ /* it happened actually */ ++ fput(file[DST].file); ++ /* ++ * too bad. ++ * we have to call both since we don't know which place the file ++ * was added to. ++ */ ++ task_work_run(); ++ flush_delayed_fput(); ++ } ++ br = au_sbr(sb, file[DST].bindex); ++ au_lcnt_dec(&br->br_nfiles); ++ ++out_src: ++ fput(file[SRC].file); ++ br = au_sbr(sb, file[SRC].bindex); ++ au_lcnt_dec(&br->br_nfiles); ++out: ++ return err; ++} ++ ++static int au_do_cpup_regular(struct au_cp_generic *cpg, ++ struct au_cpup_reg_attr *h_src_attr) ++{ ++ int err, rerr; ++ loff_t l; ++ struct path h_path; ++ struct inode *h_src_inode, *h_dst_inode; ++ ++ err = 0; ++ h_src_inode = au_h_iptr(d_inode(cpg->dentry), cpg->bsrc); ++ l = i_size_read(h_src_inode); ++ if (cpg->len == -1 || l < cpg->len) ++ cpg->len = l; ++ if (cpg->len) { ++ /* try stopping to update while we are referencing */ ++ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); ++ au_pin_hdir_unlock(cpg->pin); ++ ++ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bsrc); ++ h_path.mnt = au_sbr_mnt(cpg->dentry->d_sb, cpg->bsrc); ++ h_src_attr->iflags = h_src_inode->i_flags; ++ if (!au_test_nfs(h_src_inode->i_sb)) ++ err = vfsub_getattr(&h_path, &h_src_attr->st); ++ else { ++ inode_unlock_shared(h_src_inode); ++ err = vfsub_getattr(&h_path, &h_src_attr->st); ++ inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); ++ } ++ if (unlikely(err)) { ++ inode_unlock_shared(h_src_inode); ++ goto out; ++ } ++ h_src_attr->valid = 1; ++ if (!au_test_nfs(h_src_inode->i_sb)) { ++ err = au_cp_regular(cpg); ++ inode_unlock_shared(h_src_inode); ++ } else { ++ inode_unlock_shared(h_src_inode); ++ err = au_cp_regular(cpg); ++ } ++ rerr = au_pin_hdir_relock(cpg->pin); ++ if (!err && rerr) ++ err = rerr; ++ } ++ if (!err && (h_src_inode->i_state & I_LINKABLE)) { ++ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bdst); ++ h_dst_inode = d_inode(h_path.dentry); ++ spin_lock(&h_dst_inode->i_lock); ++ h_dst_inode->i_state |= I_LINKABLE; ++ spin_unlock(&h_dst_inode->i_lock); ++ } ++ ++out: ++ return err; ++} ++ ++static int au_do_cpup_symlink(struct path *h_path, struct dentry *h_src, ++ struct inode *h_dir) ++{ ++ int err, symlen; ++ mm_segment_t old_fs; ++ union { ++ char *k; ++ char __user *u; ++ } sym; ++ ++ err = -ENOMEM; ++ sym.k = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!sym.k)) ++ goto out; ++ ++ /* unnecessary to support mmap_sem since symlink is not mmap-able */ ++ old_fs = get_fs(); ++ set_fs(KERNEL_DS); ++ symlen = vfs_readlink(h_src, sym.u, PATH_MAX); ++ err = symlen; ++ set_fs(old_fs); ++ ++ if (symlen > 0) { ++ sym.k[symlen] = 0; ++ err = vfsub_symlink(h_dir, h_path, sym.k); ++ } ++ free_page((unsigned long)sym.k); ++ ++out: ++ return err; ++} ++ ++/* ++ * regardless 'acl' option, reset all ACL. ++ * All ACL will be copied up later from the original entry on the lower branch. ++ */ ++static int au_reset_acl(struct inode *h_dir, struct path *h_path, umode_t mode) ++{ ++ int err; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ ++ h_dentry = h_path->dentry; ++ h_inode = d_inode(h_dentry); ++ /* forget_all_cached_acls(h_inode)); */ ++ err = vfsub_removexattr(h_dentry, XATTR_NAME_POSIX_ACL_ACCESS); ++ AuTraceErr(err); ++ if (err == -EOPNOTSUPP) ++ err = 0; ++ if (!err) ++ err = vfsub_acl_chmod(h_inode, mode); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_do_cpup_dir(struct au_cp_generic *cpg, struct dentry *dst_parent, ++ struct inode *h_dir, struct path *h_path) ++{ ++ int err; ++ struct inode *dir, *inode; ++ ++ err = vfsub_removexattr(h_path->dentry, XATTR_NAME_POSIX_ACL_DEFAULT); ++ AuTraceErr(err); ++ if (err == -EOPNOTSUPP) ++ err = 0; ++ if (unlikely(err)) ++ goto out; ++ ++ /* ++ * strange behaviour from the users view, ++ * particularly setattr case ++ */ ++ dir = d_inode(dst_parent); ++ if (au_ibtop(dir) == cpg->bdst) ++ au_cpup_attr_nlink(dir, /*force*/1); ++ inode = d_inode(cpg->dentry); ++ au_cpup_attr_nlink(inode, /*force*/1); ++ ++out: ++ return err; ++} ++ ++static noinline_for_stack ++int cpup_entry(struct au_cp_generic *cpg, struct dentry *dst_parent, ++ struct au_cpup_reg_attr *h_src_attr) ++{ ++ int err; ++ umode_t mode; ++ unsigned int mnt_flags; ++ unsigned char isdir, isreg, force; ++ const unsigned char do_dt = !!au_ftest_cpup(cpg->flags, DTIME); ++ struct au_dtime dt; ++ struct path h_path; ++ struct dentry *h_src, *h_dst, *h_parent; ++ struct inode *h_inode, *h_dir; ++ struct super_block *sb; ++ ++ /* bsrc branch can be ro/rw. */ ++ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); ++ h_inode = d_inode(h_src); ++ AuDebugOn(h_inode != au_h_iptr(d_inode(cpg->dentry), cpg->bsrc)); ++ ++ /* try stopping to be referenced while we are creating */ ++ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); ++ if (au_ftest_cpup(cpg->flags, RENAME)) ++ AuDebugOn(strncmp(h_dst->d_name.name, AUFS_WH_PFX, ++ AUFS_WH_PFX_LEN)); ++ h_parent = h_dst->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ AuDebugOn(h_parent != h_dst->d_parent); ++ ++ sb = cpg->dentry->d_sb; ++ h_path.mnt = au_sbr_mnt(sb, cpg->bdst); ++ if (do_dt) { ++ h_path.dentry = h_parent; ++ au_dtime_store(&dt, dst_parent, &h_path); ++ } ++ h_path.dentry = h_dst; ++ ++ isreg = 0; ++ isdir = 0; ++ mode = h_inode->i_mode; ++ switch (mode & S_IFMT) { ++ case S_IFREG: ++ isreg = 1; ++ err = vfsub_create(h_dir, &h_path, 0600, /*want_excl*/true); ++ if (!err) ++ err = au_do_cpup_regular(cpg, h_src_attr); ++ break; ++ case S_IFDIR: ++ isdir = 1; ++ err = vfsub_mkdir(h_dir, &h_path, mode); ++ if (!err) ++ err = au_do_cpup_dir(cpg, dst_parent, h_dir, &h_path); ++ break; ++ case S_IFLNK: ++ err = au_do_cpup_symlink(&h_path, h_src, h_dir); ++ break; ++ case S_IFCHR: ++ case S_IFBLK: ++ AuDebugOn(!capable(CAP_MKNOD)); ++ /*FALLTHROUGH*/ ++ case S_IFIFO: ++ case S_IFSOCK: ++ err = vfsub_mknod(h_dir, &h_path, mode, h_inode->i_rdev); ++ break; ++ default: ++ AuIOErr("Unknown inode type 0%o\n", mode); ++ err = -EIO; ++ } ++ if (!err) ++ err = au_reset_acl(h_dir, &h_path, mode); ++ ++ mnt_flags = au_mntflags(sb); ++ if (!au_opt_test(mnt_flags, UDBA_NONE) ++ && !isdir ++ && au_opt_test(mnt_flags, XINO) ++ && (h_inode->i_nlink == 1 ++ || (h_inode->i_state & I_LINKABLE)) ++ /* todo: unnecessary? */ ++ /* && d_inode(cpg->dentry)->i_nlink == 1 */ ++ && cpg->bdst < cpg->bsrc ++ && !au_ftest_cpup(cpg->flags, KEEPLINO)) ++ au_xino_write(sb, cpg->bsrc, h_inode->i_ino, /*ino*/0); ++ /* ignore this error */ ++ ++ if (!err) { ++ force = 0; ++ if (isreg) { ++ force = !!cpg->len; ++ if (cpg->len == -1) ++ force = !!i_size_read(h_inode); ++ } ++ au_fhsm_wrote(sb, cpg->bdst, force); ++ } ++ ++ if (do_dt) ++ au_dtime_revert(&dt); ++ return err; ++} ++ ++static int au_do_ren_after_cpup(struct au_cp_generic *cpg, struct path *h_path) ++{ ++ int err; ++ struct dentry *dentry, *h_dentry, *h_parent, *parent; ++ struct inode *h_dir; ++ aufs_bindex_t bdst; ++ ++ dentry = cpg->dentry; ++ bdst = cpg->bdst; ++ h_dentry = au_h_dptr(dentry, bdst); ++ if (!au_ftest_cpup(cpg->flags, OVERWRITE)) { ++ dget(h_dentry); ++ au_set_h_dptr(dentry, bdst, NULL); ++ err = au_lkup_neg(dentry, bdst, /*wh*/0); ++ if (!err) ++ h_path->dentry = dget(au_h_dptr(dentry, bdst)); ++ au_set_h_dptr(dentry, bdst, h_dentry); ++ } else { ++ err = 0; ++ parent = dget_parent(dentry); ++ h_parent = au_h_dptr(parent, bdst); ++ dput(parent); ++ h_path->dentry = vfsub_lkup_one(&dentry->d_name, h_parent); ++ if (IS_ERR(h_path->dentry)) ++ err = PTR_ERR(h_path->dentry); ++ } ++ if (unlikely(err)) ++ goto out; ++ ++ h_parent = h_dentry->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ AuDbg("%pd %pd\n", h_dentry, h_path->dentry); ++ /* no delegation since it is just created */ ++ err = vfsub_rename(h_dir, h_dentry, h_dir, h_path, /*delegated*/NULL, ++ /*flags*/0); ++ dput(h_path->dentry); ++ ++out: ++ return err; ++} ++ ++/* ++ * copyup the @dentry from @bsrc to @bdst. ++ * the caller must set the both of lower dentries. ++ * @len is for truncating when it is -1 copyup the entire file. ++ * in link/rename cases, @dst_parent may be different from the real one. ++ * basic->bsrc can be larger than basic->bdst. ++ * aufs doesn't touch the credential so ++ * security_inode_copy_up{,_xattr}() are unnecessary. ++ */ ++static int au_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) ++{ ++ int err, rerr; ++ aufs_bindex_t old_ibtop; ++ unsigned char isdir, plink; ++ struct dentry *h_src, *h_dst, *h_parent; ++ struct inode *dst_inode, *h_dir, *inode, *delegated, *src_inode; ++ struct super_block *sb; ++ struct au_branch *br; ++ /* to reduce stack size */ ++ struct { ++ struct au_dtime dt; ++ struct path h_path; ++ struct au_cpup_reg_attr h_src_attr; ++ } *a; ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ a->h_src_attr.valid = 0; ++ ++ sb = cpg->dentry->d_sb; ++ br = au_sbr(sb, cpg->bdst); ++ a->h_path.mnt = au_br_mnt(br); ++ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); ++ h_parent = h_dst->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ ++ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); ++ inode = d_inode(cpg->dentry); ++ ++ if (!dst_parent) ++ dst_parent = dget_parent(cpg->dentry); ++ else ++ dget(dst_parent); ++ ++ plink = !!au_opt_test(au_mntflags(sb), PLINK); ++ dst_inode = au_h_iptr(inode, cpg->bdst); ++ if (dst_inode) { ++ if (unlikely(!plink)) { ++ err = -EIO; ++ AuIOErr("hi%lu(i%lu) exists on b%d " ++ "but plink is disabled\n", ++ dst_inode->i_ino, inode->i_ino, cpg->bdst); ++ goto out_parent; ++ } ++ ++ if (dst_inode->i_nlink) { ++ const int do_dt = au_ftest_cpup(cpg->flags, DTIME); ++ ++ h_src = au_plink_lkup(inode, cpg->bdst); ++ err = PTR_ERR(h_src); ++ if (IS_ERR(h_src)) ++ goto out_parent; ++ if (unlikely(d_is_negative(h_src))) { ++ err = -EIO; ++ AuIOErr("i%lu exists on b%d " ++ "but not pseudo-linked\n", ++ inode->i_ino, cpg->bdst); ++ dput(h_src); ++ goto out_parent; ++ } ++ ++ if (do_dt) { ++ a->h_path.dentry = h_parent; ++ au_dtime_store(&a->dt, dst_parent, &a->h_path); ++ } ++ ++ a->h_path.dentry = h_dst; ++ delegated = NULL; ++ err = vfsub_link(h_src, h_dir, &a->h_path, &delegated); ++ if (!err && au_ftest_cpup(cpg->flags, RENAME)) ++ err = au_do_ren_after_cpup(cpg, &a->h_path); ++ if (do_dt) ++ au_dtime_revert(&a->dt); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ dput(h_src); ++ goto out_parent; ++ } else ++ /* todo: cpup_wh_file? */ ++ /* udba work */ ++ au_update_ibrange(inode, /*do_put_zero*/1); ++ } ++ ++ isdir = S_ISDIR(inode->i_mode); ++ old_ibtop = au_ibtop(inode); ++ err = cpup_entry(cpg, dst_parent, &a->h_src_attr); ++ if (unlikely(err)) ++ goto out_rev; ++ dst_inode = d_inode(h_dst); ++ inode_lock_nested(dst_inode, AuLsc_I_CHILD2); ++ /* todo: necessary? */ ++ /* au_pin_hdir_unlock(cpg->pin); */ ++ ++ err = cpup_iattr(cpg->dentry, cpg->bdst, h_src, &a->h_src_attr); ++ if (unlikely(err)) { ++ /* todo: necessary? */ ++ /* au_pin_hdir_relock(cpg->pin); */ /* ignore an error */ ++ inode_unlock(dst_inode); ++ goto out_rev; ++ } ++ ++ if (cpg->bdst < old_ibtop) { ++ if (S_ISREG(inode->i_mode)) { ++ err = au_dy_iaop(inode, cpg->bdst, dst_inode); ++ if (unlikely(err)) { ++ /* ignore an error */ ++ /* au_pin_hdir_relock(cpg->pin); */ ++ inode_unlock(dst_inode); ++ goto out_rev; ++ } ++ } ++ au_set_ibtop(inode, cpg->bdst); ++ } else ++ au_set_ibbot(inode, cpg->bdst); ++ au_set_h_iptr(inode, cpg->bdst, au_igrab(dst_inode), ++ au_hi_flags(inode, isdir)); ++ ++ /* todo: necessary? */ ++ /* err = au_pin_hdir_relock(cpg->pin); */ ++ inode_unlock(dst_inode); ++ if (unlikely(err)) ++ goto out_rev; ++ ++ src_inode = d_inode(h_src); ++ if (!isdir ++ && (src_inode->i_nlink > 1 ++ || src_inode->i_state & I_LINKABLE) ++ && plink) ++ au_plink_append(inode, cpg->bdst, h_dst); ++ ++ if (au_ftest_cpup(cpg->flags, RENAME)) { ++ a->h_path.dentry = h_dst; ++ err = au_do_ren_after_cpup(cpg, &a->h_path); ++ } ++ if (!err) ++ goto out_parent; /* success */ ++ ++ /* revert */ ++out_rev: ++ a->h_path.dentry = h_parent; ++ au_dtime_store(&a->dt, dst_parent, &a->h_path); ++ a->h_path.dentry = h_dst; ++ rerr = 0; ++ if (d_is_positive(h_dst)) { ++ if (!isdir) { ++ /* no delegation since it is just created */ ++ rerr = vfsub_unlink(h_dir, &a->h_path, ++ /*delegated*/NULL, /*force*/0); ++ } else ++ rerr = vfsub_rmdir(h_dir, &a->h_path); ++ } ++ au_dtime_revert(&a->dt); ++ if (rerr) { ++ AuIOErr("failed removing broken entry(%d, %d)\n", err, rerr); ++ err = -EIO; ++ } ++out_parent: ++ dput(dst_parent); ++ kfree(a); ++out: ++ return err; ++} ++ ++#if 0 /* reserved */ ++struct au_cpup_single_args { ++ int *errp; ++ struct au_cp_generic *cpg; ++ struct dentry *dst_parent; ++}; ++ ++static void au_call_cpup_single(void *args) ++{ ++ struct au_cpup_single_args *a = args; ++ ++ au_pin_hdir_acquire_nest(a->cpg->pin); ++ *a->errp = au_cpup_single(a->cpg, a->dst_parent); ++ au_pin_hdir_release(a->cpg->pin); ++} ++#endif ++ ++/* ++ * prevent SIGXFSZ in copy-up. ++ * testing CAP_MKNOD is for generic fs, ++ * but CAP_FSETID is for xfs only, currently. ++ */ ++static int au_cpup_sio_test(struct au_pin *pin, umode_t mode) ++{ ++ int do_sio; ++ struct super_block *sb; ++ struct inode *h_dir; ++ ++ do_sio = 0; ++ sb = au_pinned_parent(pin)->d_sb; ++ if (!au_wkq_test() ++ && (!au_sbi(sb)->si_plink_maint_pid ++ || au_plink_maint(sb, AuLock_NOPLM))) { ++ switch (mode & S_IFMT) { ++ case S_IFREG: ++ /* no condition about RLIMIT_FSIZE and the file size */ ++ do_sio = 1; ++ break; ++ case S_IFCHR: ++ case S_IFBLK: ++ do_sio = !capable(CAP_MKNOD); ++ break; ++ } ++ if (!do_sio) ++ do_sio = ((mode & (S_ISUID | S_ISGID)) ++ && !capable(CAP_FSETID)); ++ /* this workaround may be removed in the future */ ++ if (!do_sio) { ++ h_dir = au_pinned_h_dir(pin); ++ do_sio = h_dir->i_mode & S_ISVTX; ++ } ++ } ++ ++ return do_sio; ++} ++ ++#if 0 /* reserved */ ++int au_sio_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) ++{ ++ int err, wkq_err; ++ struct dentry *h_dentry; ++ ++ h_dentry = au_h_dptr(cpg->dentry, cpg->bsrc); ++ if (!au_cpup_sio_test(pin, d_inode(h_dentry)->i_mode)) ++ err = au_cpup_single(cpg, dst_parent); ++ else { ++ struct au_cpup_single_args args = { ++ .errp = &err, ++ .cpg = cpg, ++ .dst_parent = dst_parent ++ }; ++ wkq_err = au_wkq_wait(au_call_cpup_single, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ return err; ++} ++#endif ++ ++/* ++ * copyup the @dentry from the first active lower branch to @bdst, ++ * using au_cpup_single(). ++ */ ++static int au_cpup_simple(struct au_cp_generic *cpg) ++{ ++ int err; ++ unsigned int flags_orig; ++ struct dentry *dentry; ++ ++ AuDebugOn(cpg->bsrc < 0); ++ ++ dentry = cpg->dentry; ++ DiMustWriteLock(dentry); ++ ++ err = au_lkup_neg(dentry, cpg->bdst, /*wh*/1); ++ if (!err) { ++ flags_orig = cpg->flags; ++ au_fset_cpup(cpg->flags, RENAME); ++ err = au_cpup_single(cpg, NULL); ++ cpg->flags = flags_orig; ++ if (!err) ++ return 0; /* success */ ++ ++ /* revert */ ++ au_set_h_dptr(dentry, cpg->bdst, NULL); ++ au_set_dbtop(dentry, cpg->bsrc); ++ } ++ ++ return err; ++} ++ ++struct au_cpup_simple_args { ++ int *errp; ++ struct au_cp_generic *cpg; ++}; ++ ++static void au_call_cpup_simple(void *args) ++{ ++ struct au_cpup_simple_args *a = args; ++ ++ au_pin_hdir_acquire_nest(a->cpg->pin); ++ *a->errp = au_cpup_simple(a->cpg); ++ au_pin_hdir_release(a->cpg->pin); ++} ++ ++static int au_do_sio_cpup_simple(struct au_cp_generic *cpg) ++{ ++ int err, wkq_err; ++ struct dentry *dentry, *parent; ++ struct file *h_file; ++ struct inode *h_dir; ++ ++ dentry = cpg->dentry; ++ h_file = NULL; ++ if (au_ftest_cpup(cpg->flags, HOPEN)) { ++ AuDebugOn(cpg->bsrc < 0); ++ h_file = au_h_open_pre(dentry, cpg->bsrc, /*force_wr*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ } ++ ++ parent = dget_parent(dentry); ++ h_dir = au_h_iptr(d_inode(parent), cpg->bdst); ++ if (!au_test_h_perm_sio(h_dir, MAY_EXEC | MAY_WRITE) ++ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) ++ err = au_cpup_simple(cpg); ++ else { ++ struct au_cpup_simple_args args = { ++ .errp = &err, ++ .cpg = cpg ++ }; ++ wkq_err = au_wkq_wait(au_call_cpup_simple, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ dput(parent); ++ if (h_file) ++ au_h_open_post(dentry, cpg->bsrc, h_file); ++ ++out: ++ return err; ++} ++ ++int au_sio_cpup_simple(struct au_cp_generic *cpg) ++{ ++ aufs_bindex_t bsrc, bbot; ++ struct dentry *dentry, *h_dentry; ++ ++ if (cpg->bsrc < 0) { ++ dentry = cpg->dentry; ++ bbot = au_dbbot(dentry); ++ for (bsrc = cpg->bdst + 1; bsrc <= bbot; bsrc++) { ++ h_dentry = au_h_dptr(dentry, bsrc); ++ if (h_dentry) { ++ AuDebugOn(d_is_negative(h_dentry)); ++ break; ++ } ++ } ++ AuDebugOn(bsrc > bbot); ++ cpg->bsrc = bsrc; ++ } ++ AuDebugOn(cpg->bsrc <= cpg->bdst); ++ return au_do_sio_cpup_simple(cpg); ++} ++ ++int au_sio_cpdown_simple(struct au_cp_generic *cpg) ++{ ++ AuDebugOn(cpg->bdst <= cpg->bsrc); ++ return au_do_sio_cpup_simple(cpg); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * copyup the deleted file for writing. ++ */ ++static int au_do_cpup_wh(struct au_cp_generic *cpg, struct dentry *wh_dentry, ++ struct file *file) ++{ ++ int err; ++ unsigned int flags_orig; ++ aufs_bindex_t bsrc_orig; ++ struct au_dinfo *dinfo; ++ struct { ++ struct au_hdentry *hd; ++ struct dentry *h_dentry; ++ } hdst, hsrc; ++ ++ dinfo = au_di(cpg->dentry); ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ bsrc_orig = cpg->bsrc; ++ cpg->bsrc = dinfo->di_btop; ++ hdst.hd = au_hdentry(dinfo, cpg->bdst); ++ hdst.h_dentry = hdst.hd->hd_dentry; ++ hdst.hd->hd_dentry = wh_dentry; ++ dinfo->di_btop = cpg->bdst; ++ ++ hsrc.h_dentry = NULL; ++ if (file) { ++ hsrc.hd = au_hdentry(dinfo, cpg->bsrc); ++ hsrc.h_dentry = hsrc.hd->hd_dentry; ++ hsrc.hd->hd_dentry = au_hf_top(file)->f_path.dentry; ++ } ++ flags_orig = cpg->flags; ++ cpg->flags = !AuCpup_DTIME; ++ err = au_cpup_single(cpg, /*h_parent*/NULL); ++ cpg->flags = flags_orig; ++ if (file) { ++ if (!err) ++ err = au_reopen_nondir(file); ++ hsrc.hd->hd_dentry = hsrc.h_dentry; ++ } ++ hdst.hd->hd_dentry = hdst.h_dentry; ++ dinfo->di_btop = cpg->bsrc; ++ cpg->bsrc = bsrc_orig; ++ ++ return err; ++} ++ ++static int au_cpup_wh(struct au_cp_generic *cpg, struct file *file) ++{ ++ int err; ++ aufs_bindex_t bdst; ++ struct au_dtime dt; ++ struct dentry *dentry, *parent, *h_parent, *wh_dentry; ++ struct au_branch *br; ++ struct path h_path; ++ ++ dentry = cpg->dentry; ++ bdst = cpg->bdst; ++ br = au_sbr(dentry->d_sb, bdst); ++ parent = dget_parent(dentry); ++ h_parent = au_h_dptr(parent, bdst); ++ wh_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out; ++ ++ h_path.dentry = h_parent; ++ h_path.mnt = au_br_mnt(br); ++ au_dtime_store(&dt, parent, &h_path); ++ err = au_do_cpup_wh(cpg, wh_dentry, file); ++ if (unlikely(err)) ++ goto out_wh; ++ ++ dget(wh_dentry); ++ h_path.dentry = wh_dentry; ++ if (!d_is_dir(wh_dentry)) { ++ /* no delegation since it is just created */ ++ err = vfsub_unlink(d_inode(h_parent), &h_path, ++ /*delegated*/NULL, /*force*/0); ++ } else ++ err = vfsub_rmdir(d_inode(h_parent), &h_path); ++ if (unlikely(err)) { ++ AuIOErr("failed remove copied-up tmp file %pd(%d)\n", ++ wh_dentry, err); ++ err = -EIO; ++ } ++ au_dtime_revert(&dt); ++ au_set_hi_wh(d_inode(dentry), bdst, wh_dentry); ++ ++out_wh: ++ dput(wh_dentry); ++out: ++ dput(parent); ++ return err; ++} ++ ++struct au_cpup_wh_args { ++ int *errp; ++ struct au_cp_generic *cpg; ++ struct file *file; ++}; ++ ++static void au_call_cpup_wh(void *args) ++{ ++ struct au_cpup_wh_args *a = args; ++ ++ au_pin_hdir_acquire_nest(a->cpg->pin); ++ *a->errp = au_cpup_wh(a->cpg, a->file); ++ au_pin_hdir_release(a->cpg->pin); ++} ++ ++int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file) ++{ ++ int err, wkq_err; ++ aufs_bindex_t bdst; ++ struct dentry *dentry, *parent, *h_orph, *h_parent; ++ struct inode *dir, *h_dir, *h_tmpdir; ++ struct au_wbr *wbr; ++ struct au_pin wh_pin, *pin_orig; ++ ++ dentry = cpg->dentry; ++ bdst = cpg->bdst; ++ parent = dget_parent(dentry); ++ dir = d_inode(parent); ++ h_orph = NULL; ++ h_parent = NULL; ++ h_dir = au_igrab(au_h_iptr(dir, bdst)); ++ h_tmpdir = h_dir; ++ pin_orig = NULL; ++ if (!h_dir->i_nlink) { ++ wbr = au_sbr(dentry->d_sb, bdst)->br_wbr; ++ h_orph = wbr->wbr_orph; ++ ++ h_parent = dget(au_h_dptr(parent, bdst)); ++ au_set_h_dptr(parent, bdst, dget(h_orph)); ++ h_tmpdir = d_inode(h_orph); ++ au_set_h_iptr(dir, bdst, au_igrab(h_tmpdir), /*flags*/0); ++ ++ inode_lock_nested(h_tmpdir, AuLsc_I_PARENT3); ++ /* todo: au_h_open_pre()? */ ++ ++ pin_orig = cpg->pin; ++ au_pin_init(&wh_pin, dentry, bdst, AuLsc_DI_PARENT, ++ AuLsc_I_PARENT3, cpg->pin->udba, AuPin_DI_LOCKED); ++ cpg->pin = &wh_pin; ++ } ++ ++ if (!au_test_h_perm_sio(h_tmpdir, MAY_EXEC | MAY_WRITE) ++ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) ++ err = au_cpup_wh(cpg, file); ++ else { ++ struct au_cpup_wh_args args = { ++ .errp = &err, ++ .cpg = cpg, ++ .file = file ++ }; ++ wkq_err = au_wkq_wait(au_call_cpup_wh, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ if (h_orph) { ++ inode_unlock(h_tmpdir); ++ /* todo: au_h_open_post()? */ ++ au_set_h_iptr(dir, bdst, au_igrab(h_dir), /*flags*/0); ++ au_set_h_dptr(parent, bdst, h_parent); ++ AuDebugOn(!pin_orig); ++ cpg->pin = pin_orig; ++ } ++ iput(h_dir); ++ dput(parent); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * generic routine for both of copy-up and copy-down. ++ */ ++/* cf. revalidate function in file.c */ ++int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, ++ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, ++ struct au_pin *pin, ++ struct dentry *h_parent, void *arg), ++ void *arg) ++{ ++ int err; ++ struct au_pin pin; ++ struct dentry *d, *parent, *h_parent, *real_parent, *h_dentry; ++ ++ err = 0; ++ parent = dget_parent(dentry); ++ if (IS_ROOT(parent)) ++ goto out; ++ ++ au_pin_init(&pin, dentry, bdst, AuLsc_DI_PARENT2, AuLsc_I_PARENT2, ++ au_opt_udba(dentry->d_sb), AuPin_MNT_WRITE); ++ ++ /* do not use au_dpage */ ++ real_parent = parent; ++ while (1) { ++ dput(parent); ++ parent = dget_parent(dentry); ++ h_parent = au_h_dptr(parent, bdst); ++ if (h_parent) ++ goto out; /* success */ ++ ++ /* find top dir which is necessary to cpup */ ++ do { ++ d = parent; ++ dput(parent); ++ parent = dget_parent(d); ++ di_read_lock_parent3(parent, !AuLock_IR); ++ h_parent = au_h_dptr(parent, bdst); ++ di_read_unlock(parent, !AuLock_IR); ++ } while (!h_parent); ++ ++ if (d != real_parent) ++ di_write_lock_child3(d); ++ ++ /* somebody else might create while we were sleeping */ ++ h_dentry = au_h_dptr(d, bdst); ++ if (!h_dentry || d_is_negative(h_dentry)) { ++ if (h_dentry) ++ au_update_dbtop(d); ++ ++ au_pin_set_dentry(&pin, d); ++ err = au_do_pin(&pin); ++ if (!err) { ++ err = cp(d, bdst, &pin, h_parent, arg); ++ au_unpin(&pin); ++ } ++ } ++ ++ if (d != real_parent) ++ di_write_unlock(d); ++ if (unlikely(err)) ++ break; ++ } ++ ++out: ++ dput(parent); ++ return err; ++} ++ ++static int au_cpup_dir(struct dentry *dentry, aufs_bindex_t bdst, ++ struct au_pin *pin, ++ struct dentry *h_parent __maybe_unused, ++ void *arg __maybe_unused) ++{ ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = bdst, ++ .bsrc = -1, ++ .len = 0, ++ .pin = pin, ++ .flags = AuCpup_DTIME ++ }; ++ return au_sio_cpup_simple(&cpg); ++} ++ ++int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) ++{ ++ return au_cp_dirs(dentry, bdst, au_cpup_dir, NULL); ++} ++ ++int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) ++{ ++ int err; ++ struct dentry *parent; ++ struct inode *dir; ++ ++ parent = dget_parent(dentry); ++ dir = d_inode(parent); ++ err = 0; ++ if (au_h_iptr(dir, bdst)) ++ goto out; ++ ++ di_read_unlock(parent, AuLock_IR); ++ di_write_lock_parent(parent); ++ /* someone else might change our inode while we were sleeping */ ++ if (!au_h_iptr(dir, bdst)) ++ err = au_cpup_dirs(dentry, bdst); ++ di_downgrade_lock(parent, AuLock_IR); ++ ++out: ++ dput(parent); ++ return err; ++} +diff --git a/fs/aufs/cpup.h b/fs/aufs/cpup.h +new file mode 100644 +index 000000000000..34a0907dddda +--- /dev/null ++++ b/fs/aufs/cpup.h +@@ -0,0 +1,87 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * copy-up/down functions ++ */ ++ ++#ifndef __AUFS_CPUP_H__ ++#define __AUFS_CPUP_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++struct inode; ++struct file; ++struct au_pin; ++ ++void au_cpup_attr_flags(struct inode *dst, unsigned int iflags); ++void au_cpup_attr_timesizes(struct inode *inode); ++void au_cpup_attr_nlink(struct inode *inode, int force); ++void au_cpup_attr_changeable(struct inode *inode); ++void au_cpup_igen(struct inode *inode, struct inode *h_inode); ++void au_cpup_attr_all(struct inode *inode, int force); ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_cp_generic { ++ struct dentry *dentry; ++ aufs_bindex_t bdst, bsrc; ++ loff_t len; ++ struct au_pin *pin; ++ unsigned int flags; ++}; ++ ++/* cpup flags */ ++#define AuCpup_DTIME 1 /* do dtime_store/revert */ ++#define AuCpup_KEEPLINO (1 << 1) /* do not clear the lower xino, ++ for link(2) */ ++#define AuCpup_RENAME (1 << 2) /* rename after cpup */ ++#define AuCpup_HOPEN (1 << 3) /* call h_open_pre/post() in ++ cpup */ ++#define AuCpup_OVERWRITE (1 << 4) /* allow overwriting the ++ existing entry */ ++#define AuCpup_RWDST (1 << 5) /* force write target even if ++ the branch is marked as RO */ ++ ++#ifndef CONFIG_AUFS_BR_HFSPLUS ++#undef AuCpup_HOPEN ++#define AuCpup_HOPEN 0 ++#endif ++ ++#define au_ftest_cpup(flags, name) ((flags) & AuCpup_##name) ++#define au_fset_cpup(flags, name) \ ++ do { (flags) |= AuCpup_##name; } while (0) ++#define au_fclr_cpup(flags, name) \ ++ do { (flags) &= ~AuCpup_##name; } while (0) ++ ++int au_copy_file(struct file *dst, struct file *src, loff_t len); ++int au_sio_cpup_simple(struct au_cp_generic *cpg); ++int au_sio_cpdown_simple(struct au_cp_generic *cpg); ++int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file); ++ ++int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, ++ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, ++ struct au_pin *pin, ++ struct dentry *h_parent, void *arg), ++ void *arg); ++int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); ++int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* keep timestamps when copyup */ ++struct au_dtime { ++ struct dentry *dt_dentry; ++ struct path dt_h_path; ++ struct timespec64 dt_atime, dt_mtime; ++}; ++void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, ++ struct path *h_path); ++void au_dtime_revert(struct au_dtime *dt); ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_CPUP_H__ */ +diff --git a/fs/aufs/dbgaufs.c b/fs/aufs/dbgaufs.c +new file mode 100644 +index 000000000000..6bb8843b7430 +--- /dev/null ++++ b/fs/aufs/dbgaufs.c +@@ -0,0 +1,506 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * debugfs interface ++ */ ++ ++#include ++#include "aufs.h" ++ ++#ifndef CONFIG_SYSFS ++#error DEBUG_FS depends upon SYSFS ++#endif ++ ++static struct dentry *dbgaufs; ++static const mode_t dbgaufs_mode = 0444; ++ ++/* 20 is max digits length of ulong 64 */ ++struct dbgaufs_arg { ++ int n; ++ char a[20 * 4]; ++}; ++ ++/* ++ * common function for all XINO files ++ */ ++static int dbgaufs_xi_release(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ kfree(file->private_data); ++ return 0; ++} ++ ++static int dbgaufs_xi_open(struct file *xf, struct file *file, int do_fcnt, ++ int cnt) ++{ ++ int err; ++ struct kstat st; ++ struct dbgaufs_arg *p; ++ ++ err = -ENOMEM; ++ p = kmalloc(sizeof(*p), GFP_NOFS); ++ if (unlikely(!p)) ++ goto out; ++ ++ err = 0; ++ p->n = 0; ++ file->private_data = p; ++ if (!xf) ++ goto out; ++ ++ err = vfsub_getattr(&xf->f_path, &st); ++ if (!err) { ++ if (do_fcnt) ++ p->n = snprintf ++ (p->a, sizeof(p->a), "%d, %llux%u %lld\n", ++ cnt, st.blocks, st.blksize, ++ (long long)st.size); ++ else ++ p->n = snprintf(p->a, sizeof(p->a), "%llux%u %lld\n", ++ st.blocks, st.blksize, ++ (long long)st.size); ++ AuDebugOn(p->n >= sizeof(p->a)); ++ } else { ++ p->n = snprintf(p->a, sizeof(p->a), "err %d\n", err); ++ err = 0; ++ } ++ ++out: ++ return err; ++} ++ ++static ssize_t dbgaufs_xi_read(struct file *file, char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ struct dbgaufs_arg *p; ++ ++ p = file->private_data; ++ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct dbgaufs_plink_arg { ++ int n; ++ char a[]; ++}; ++ ++static int dbgaufs_plink_release(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ free_page((unsigned long)file->private_data); ++ return 0; ++} ++ ++static int dbgaufs_plink_open(struct inode *inode, struct file *file) ++{ ++ int err, i, limit; ++ unsigned long n, sum; ++ struct dbgaufs_plink_arg *p; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ struct hlist_bl_head *hbl; ++ ++ err = -ENOMEM; ++ p = (void *)get_zeroed_page(GFP_NOFS); ++ if (unlikely(!p)) ++ goto out; ++ ++ err = -EFBIG; ++ sbinfo = inode->i_private; ++ sb = sbinfo->si_sb; ++ si_noflush_read_lock(sb); ++ if (au_opt_test(au_mntflags(sb), PLINK)) { ++ limit = PAGE_SIZE - sizeof(p->n); ++ ++ /* the number of buckets */ ++ n = snprintf(p->a + p->n, limit, "%d\n", AuPlink_NHASH); ++ p->n += n; ++ limit -= n; ++ ++ sum = 0; ++ for (i = 0, hbl = sbinfo->si_plink; i < AuPlink_NHASH; ++ i++, hbl++) { ++ n = au_hbl_count(hbl); ++ sum += n; ++ ++ n = snprintf(p->a + p->n, limit, "%lu ", n); ++ p->n += n; ++ limit -= n; ++ if (unlikely(limit <= 0)) ++ goto out_free; ++ } ++ p->a[p->n - 1] = '\n'; ++ ++ /* the sum of plinks */ ++ n = snprintf(p->a + p->n, limit, "%lu\n", sum); ++ p->n += n; ++ limit -= n; ++ if (unlikely(limit <= 0)) ++ goto out_free; ++ } else { ++#define str "1\n0\n0\n" ++ p->n = sizeof(str) - 1; ++ strcpy(p->a, str); ++#undef str ++ } ++ si_read_unlock(sb); ++ ++ err = 0; ++ file->private_data = p; ++ goto out; /* success */ ++ ++out_free: ++ free_page((unsigned long)p); ++out: ++ return err; ++} ++ ++static ssize_t dbgaufs_plink_read(struct file *file, char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ struct dbgaufs_plink_arg *p; ++ ++ p = file->private_data; ++ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); ++} ++ ++static const struct file_operations dbgaufs_plink_fop = { ++ .owner = THIS_MODULE, ++ .open = dbgaufs_plink_open, ++ .release = dbgaufs_plink_release, ++ .read = dbgaufs_plink_read ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int dbgaufs_xib_open(struct inode *inode, struct file *file) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ ++ sbinfo = inode->i_private; ++ sb = sbinfo->si_sb; ++ si_noflush_read_lock(sb); ++ err = dbgaufs_xi_open(sbinfo->si_xib, file, /*do_fcnt*/0, /*cnt*/0); ++ si_read_unlock(sb); ++ return err; ++} ++ ++static const struct file_operations dbgaufs_xib_fop = { ++ .owner = THIS_MODULE, ++ .open = dbgaufs_xib_open, ++ .release = dbgaufs_xi_release, ++ .read = dbgaufs_xi_read ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define DbgaufsXi_PREFIX "xi" ++ ++static int dbgaufs_xino_open(struct inode *inode, struct file *file) ++{ ++ int err, idx; ++ long l; ++ aufs_bindex_t bindex; ++ char *p, a[sizeof(DbgaufsXi_PREFIX) + 8]; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ struct au_xino *xi; ++ struct file *xf; ++ struct qstr *name; ++ struct au_branch *br; ++ ++ err = -ENOENT; ++ name = &file->f_path.dentry->d_name; ++ if (unlikely(name->len < sizeof(DbgaufsXi_PREFIX) ++ || memcmp(name->name, DbgaufsXi_PREFIX, ++ sizeof(DbgaufsXi_PREFIX) - 1))) ++ goto out; ++ ++ AuDebugOn(name->len >= sizeof(a)); ++ memcpy(a, name->name, name->len); ++ a[name->len] = '\0'; ++ p = strchr(a, '-'); ++ if (p) ++ *p = '\0'; ++ err = kstrtol(a + sizeof(DbgaufsXi_PREFIX) - 1, 10, &l); ++ if (unlikely(err)) ++ goto out; ++ bindex = l; ++ idx = 0; ++ if (p) { ++ err = kstrtol(p + 1, 10, &l); ++ if (unlikely(err)) ++ goto out; ++ idx = l; ++ } ++ ++ err = -ENOENT; ++ sbinfo = inode->i_private; ++ sb = sbinfo->si_sb; ++ si_noflush_read_lock(sb); ++ if (unlikely(bindex < 0 || bindex > au_sbbot(sb))) ++ goto out_si; ++ br = au_sbr(sb, bindex); ++ xi = br->br_xino; ++ if (unlikely(idx >= xi->xi_nfile)) ++ goto out_si; ++ xf = au_xino_file(xi, idx); ++ if (xf) ++ err = dbgaufs_xi_open(xf, file, /*do_fcnt*/1, ++ au_xino_count(br)); ++ ++out_si: ++ si_read_unlock(sb); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static const struct file_operations dbgaufs_xino_fop = { ++ .owner = THIS_MODULE, ++ .open = dbgaufs_xino_open, ++ .release = dbgaufs_xi_release, ++ .read = dbgaufs_xi_read ++}; ++ ++void dbgaufs_xino_del(struct au_branch *br) ++{ ++ struct dentry *dbgaufs; ++ ++ dbgaufs = br->br_dbgaufs; ++ if (!dbgaufs) ++ return; ++ ++ br->br_dbgaufs = NULL; ++ /* debugfs acquires the parent i_mutex */ ++ lockdep_off(); ++ debugfs_remove(dbgaufs); ++ lockdep_on(); ++} ++ ++void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ aufs_bindex_t bbot; ++ struct au_branch *br; ++ ++ if (!au_sbi(sb)->si_dbgaufs) ++ return; ++ ++ bbot = au_sbbot(sb); ++ for (; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ dbgaufs_xino_del(br); ++ } ++} ++ ++static void dbgaufs_br_do_add(struct super_block *sb, aufs_bindex_t bindex, ++ unsigned int idx, struct dentry *parent, ++ struct au_sbinfo *sbinfo) ++{ ++ struct au_branch *br; ++ struct dentry *d; ++ /* "xi" bindex(5) "-" idx(2) NULL */ ++ char name[sizeof(DbgaufsXi_PREFIX) + 8]; ++ ++ if (!idx) ++ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d", bindex); ++ else ++ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d-%u", ++ bindex, idx); ++ br = au_sbr(sb, bindex); ++ if (br->br_dbgaufs) { ++ struct qstr qstr = QSTR_INIT(name, strlen(name)); ++ ++ if (!au_qstreq(&br->br_dbgaufs->d_name, &qstr)) { ++ /* debugfs acquires the parent i_mutex */ ++ lockdep_off(); ++ d = debugfs_rename(parent, br->br_dbgaufs, parent, ++ name); ++ lockdep_on(); ++ if (unlikely(!d)) ++ pr_warn("failed renaming %pd/%s, ignored.\n", ++ parent, name); ++ } ++ } else { ++ lockdep_off(); ++ br->br_dbgaufs = debugfs_create_file(name, dbgaufs_mode, parent, ++ sbinfo, &dbgaufs_xino_fop); ++ lockdep_on(); ++ if (unlikely(!br->br_dbgaufs)) ++ pr_warn("failed creating %pd/%s, ignored.\n", ++ parent, name); ++ } ++} ++ ++static void dbgaufs_br_add(struct super_block *sb, aufs_bindex_t bindex, ++ struct dentry *parent, struct au_sbinfo *sbinfo) ++{ ++ struct au_branch *br; ++ struct au_xino *xi; ++ unsigned int u; ++ ++ br = au_sbr(sb, bindex); ++ xi = br->br_xino; ++ for (u = 0; u < xi->xi_nfile; u++) ++ dbgaufs_br_do_add(sb, bindex, u, parent, sbinfo); ++} ++ ++void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex, int topdown) ++{ ++ struct au_sbinfo *sbinfo; ++ struct dentry *parent; ++ aufs_bindex_t bbot; ++ ++ if (!au_opt_test(au_mntflags(sb), XINO)) ++ return; ++ ++ sbinfo = au_sbi(sb); ++ parent = sbinfo->si_dbgaufs; ++ if (!parent) ++ return; ++ ++ bbot = au_sbbot(sb); ++ if (topdown) ++ for (; bindex <= bbot; bindex++) ++ dbgaufs_br_add(sb, bindex, parent, sbinfo); ++ else ++ for (; bbot >= bindex; bbot--) ++ dbgaufs_br_add(sb, bbot, parent, sbinfo); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_EXPORT ++static int dbgaufs_xigen_open(struct inode *inode, struct file *file) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ ++ sbinfo = inode->i_private; ++ sb = sbinfo->si_sb; ++ si_noflush_read_lock(sb); ++ err = dbgaufs_xi_open(sbinfo->si_xigen, file, /*do_fcnt*/0, /*cnt*/0); ++ si_read_unlock(sb); ++ return err; ++} ++ ++static const struct file_operations dbgaufs_xigen_fop = { ++ .owner = THIS_MODULE, ++ .open = dbgaufs_xigen_open, ++ .release = dbgaufs_xi_release, ++ .read = dbgaufs_xi_read ++}; ++ ++static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) ++{ ++ int err; ++ ++ /* ++ * This function is a dynamic '__init' function actually, ++ * so the tiny check for si_rwsem is unnecessary. ++ */ ++ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ ++ ++ err = -EIO; ++ sbinfo->si_dbgaufs_xigen = debugfs_create_file ++ ("xigen", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, ++ &dbgaufs_xigen_fop); ++ if (sbinfo->si_dbgaufs_xigen) ++ err = 0; ++ ++ return err; ++} ++#else ++static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) ++{ ++ return 0; ++} ++#endif /* CONFIG_AUFS_EXPORT */ ++ ++/* ---------------------------------------------------------------------- */ ++ ++void dbgaufs_si_fin(struct au_sbinfo *sbinfo) ++{ ++ /* ++ * This function is a dynamic '__fin' function actually, ++ * so the tiny check for si_rwsem is unnecessary. ++ */ ++ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ ++ ++ debugfs_remove_recursive(sbinfo->si_dbgaufs); ++ sbinfo->si_dbgaufs = NULL; ++} ++ ++int dbgaufs_si_init(struct au_sbinfo *sbinfo) ++{ ++ int err; ++ char name[SysaufsSiNameLen]; ++ ++ /* ++ * This function is a dynamic '__init' function actually, ++ * so the tiny check for si_rwsem is unnecessary. ++ */ ++ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ ++ ++ err = -ENOENT; ++ if (!dbgaufs) { ++ AuErr1("/debug/aufs is uninitialized\n"); ++ goto out; ++ } ++ ++ err = -EIO; ++ sysaufs_name(sbinfo, name); ++ sbinfo->si_dbgaufs = debugfs_create_dir(name, dbgaufs); ++ if (unlikely(!sbinfo->si_dbgaufs)) ++ goto out; ++ ++ /* regardless plink/noplink option */ ++ sbinfo->si_dbgaufs_plink = debugfs_create_file ++ ("plink", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, ++ &dbgaufs_plink_fop); ++ if (unlikely(!sbinfo->si_dbgaufs_plink)) ++ goto out_dir; ++ ++ /* regardless xino/noxino option */ ++ sbinfo->si_dbgaufs_xib = debugfs_create_file ++ ("xib", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, ++ &dbgaufs_xib_fop); ++ if (unlikely(!sbinfo->si_dbgaufs_xib)) ++ goto out_dir; ++ ++ err = dbgaufs_xigen_init(sbinfo); ++ if (!err) ++ goto out; /* success */ ++ ++out_dir: ++ dbgaufs_si_fin(sbinfo); ++out: ++ if (unlikely(err)) ++ pr_err("debugfs/aufs failed\n"); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void dbgaufs_fin(void) ++{ ++ debugfs_remove(dbgaufs); ++} ++ ++int __init dbgaufs_init(void) ++{ ++ int err; ++ ++ err = -EIO; ++ dbgaufs = debugfs_create_dir(AUFS_NAME, NULL); ++ if (dbgaufs) ++ err = 0; ++ return err; ++} +diff --git a/fs/aufs/dbgaufs.h b/fs/aufs/dbgaufs.h +new file mode 100644 +index 000000000000..e7ebe5125b30 +--- /dev/null ++++ b/fs/aufs/dbgaufs.h +@@ -0,0 +1,40 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * debugfs interface ++ */ ++ ++#ifndef __DBGAUFS_H__ ++#define __DBGAUFS_H__ ++ ++#ifdef __KERNEL__ ++ ++struct super_block; ++struct au_sbinfo; ++struct au_branch; ++ ++#ifdef CONFIG_DEBUG_FS ++/* dbgaufs.c */ ++void dbgaufs_xino_del(struct au_branch *br); ++void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); ++void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex, int topdown); ++void dbgaufs_si_fin(struct au_sbinfo *sbinfo); ++int dbgaufs_si_init(struct au_sbinfo *sbinfo); ++void dbgaufs_fin(void); ++int __init dbgaufs_init(void); ++#else ++AuStubVoid(dbgaufs_xino_del, struct au_branch *br) ++AuStubVoid(dbgaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) ++AuStubVoid(dbgaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex, ++ int topdown) ++AuStubVoid(dbgaufs_si_fin, struct au_sbinfo *sbinfo) ++AuStubInt0(dbgaufs_si_init, struct au_sbinfo *sbinfo) ++AuStubVoid(dbgaufs_fin, void) ++AuStubInt0(__init dbgaufs_init, void) ++#endif /* CONFIG_DEBUG_FS */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __DBGAUFS_H__ */ +diff --git a/fs/aufs/dcsub.c b/fs/aufs/dcsub.c +new file mode 100644 +index 000000000000..5b060df99f33 +--- /dev/null ++++ b/fs/aufs/dcsub.c +@@ -0,0 +1,212 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * sub-routines for dentry cache ++ */ ++ ++#include "aufs.h" ++ ++static void au_dpage_free(struct au_dpage *dpage) ++{ ++ int i; ++ struct dentry **p; ++ ++ p = dpage->dentries; ++ for (i = 0; i < dpage->ndentry; i++) ++ dput(*p++); ++ free_page((unsigned long)dpage->dentries); ++} ++ ++int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp) ++{ ++ int err; ++ void *p; ++ ++ err = -ENOMEM; ++ dpages->dpages = kmalloc(sizeof(*dpages->dpages), gfp); ++ if (unlikely(!dpages->dpages)) ++ goto out; ++ ++ p = (void *)__get_free_page(gfp); ++ if (unlikely(!p)) ++ goto out_dpages; ++ ++ dpages->dpages[0].ndentry = 0; ++ dpages->dpages[0].dentries = p; ++ dpages->ndpage = 1; ++ return 0; /* success */ ++ ++out_dpages: ++ kfree(dpages->dpages); ++out: ++ return err; ++} ++ ++void au_dpages_free(struct au_dcsub_pages *dpages) ++{ ++ int i; ++ struct au_dpage *p; ++ ++ p = dpages->dpages; ++ for (i = 0; i < dpages->ndpage; i++) ++ au_dpage_free(p++); ++ kfree(dpages->dpages); ++} ++ ++static int au_dpages_append(struct au_dcsub_pages *dpages, ++ struct dentry *dentry, gfp_t gfp) ++{ ++ int err, sz; ++ struct au_dpage *dpage; ++ void *p; ++ ++ dpage = dpages->dpages + dpages->ndpage - 1; ++ sz = PAGE_SIZE / sizeof(dentry); ++ if (unlikely(dpage->ndentry >= sz)) { ++ AuLabel(new dpage); ++ err = -ENOMEM; ++ sz = dpages->ndpage * sizeof(*dpages->dpages); ++ p = au_kzrealloc(dpages->dpages, sz, ++ sz + sizeof(*dpages->dpages), gfp, ++ /*may_shrink*/0); ++ if (unlikely(!p)) ++ goto out; ++ ++ dpages->dpages = p; ++ dpage = dpages->dpages + dpages->ndpage; ++ p = (void *)__get_free_page(gfp); ++ if (unlikely(!p)) ++ goto out; ++ ++ dpage->ndentry = 0; ++ dpage->dentries = p; ++ dpages->ndpage++; ++ } ++ ++ AuDebugOn(au_dcount(dentry) <= 0); ++ dpage->dentries[dpage->ndentry++] = dget_dlock(dentry); ++ return 0; /* success */ ++ ++out: ++ return err; ++} ++ ++/* todo: BAD approach */ ++/* copied from linux/fs/dcache.c */ ++enum d_walk_ret { ++ D_WALK_CONTINUE, ++ D_WALK_QUIT, ++ D_WALK_NORETRY, ++ D_WALK_SKIP, ++}; ++ ++extern void d_walk(struct dentry *parent, void *data, ++ enum d_walk_ret (*enter)(void *, struct dentry *)); ++ ++struct ac_dpages_arg { ++ int err; ++ struct au_dcsub_pages *dpages; ++ struct super_block *sb; ++ au_dpages_test test; ++ void *arg; ++}; ++ ++static enum d_walk_ret au_call_dpages_append(void *_arg, struct dentry *dentry) ++{ ++ enum d_walk_ret ret; ++ struct ac_dpages_arg *arg = _arg; ++ ++ ret = D_WALK_CONTINUE; ++ if (dentry->d_sb == arg->sb ++ && !IS_ROOT(dentry) ++ && au_dcount(dentry) > 0 ++ && au_di(dentry) ++ && (!arg->test || arg->test(dentry, arg->arg))) { ++ arg->err = au_dpages_append(arg->dpages, dentry, GFP_ATOMIC); ++ if (unlikely(arg->err)) ++ ret = D_WALK_QUIT; ++ } ++ ++ return ret; ++} ++ ++int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, ++ au_dpages_test test, void *arg) ++{ ++ struct ac_dpages_arg args = { ++ .err = 0, ++ .dpages = dpages, ++ .sb = root->d_sb, ++ .test = test, ++ .arg = arg ++ }; ++ ++ d_walk(root, &args, au_call_dpages_append); ++ ++ return args.err; ++} ++ ++int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, ++ int do_include, au_dpages_test test, void *arg) ++{ ++ int err; ++ ++ err = 0; ++ write_seqlock(&rename_lock); ++ spin_lock(&dentry->d_lock); ++ if (do_include ++ && au_dcount(dentry) > 0 ++ && (!test || test(dentry, arg))) ++ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); ++ spin_unlock(&dentry->d_lock); ++ if (unlikely(err)) ++ goto out; ++ ++ /* ++ * RCU for vfsmount is unnecessary since this is a traverse in a single ++ * mount ++ */ ++ while (!IS_ROOT(dentry)) { ++ dentry = dentry->d_parent; /* rename_lock is locked */ ++ spin_lock(&dentry->d_lock); ++ if (au_dcount(dentry) > 0 ++ && (!test || test(dentry, arg))) ++ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); ++ spin_unlock(&dentry->d_lock); ++ if (unlikely(err)) ++ break; ++ } ++ ++out: ++ write_sequnlock(&rename_lock); ++ return err; ++} ++ ++static inline int au_dcsub_dpages_aufs(struct dentry *dentry, void *arg) ++{ ++ return au_di(dentry) && dentry->d_sb == arg; ++} ++ ++int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, ++ struct dentry *dentry, int do_include) ++{ ++ return au_dcsub_pages_rev(dpages, dentry, do_include, ++ au_dcsub_dpages_aufs, dentry->d_sb); ++} ++ ++int au_test_subdir(struct dentry *d1, struct dentry *d2) ++{ ++ struct path path[2] = { ++ { ++ .dentry = d1 ++ }, ++ { ++ .dentry = d2 ++ } ++ }; ++ ++ return path_is_under(path + 0, path + 1); ++} +diff --git a/fs/aufs/dcsub.h b/fs/aufs/dcsub.h +new file mode 100644 +index 000000000000..f00f4a1ed89d +--- /dev/null ++++ b/fs/aufs/dcsub.h +@@ -0,0 +1,124 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * sub-routines for dentry cache ++ */ ++ ++#ifndef __AUFS_DCSUB_H__ ++#define __AUFS_DCSUB_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++ ++struct au_dpage { ++ int ndentry; ++ struct dentry **dentries; ++}; ++ ++struct au_dcsub_pages { ++ int ndpage; ++ struct au_dpage *dpages; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dcsub.c */ ++int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp); ++void au_dpages_free(struct au_dcsub_pages *dpages); ++typedef int (*au_dpages_test)(struct dentry *dentry, void *arg); ++int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, ++ au_dpages_test test, void *arg); ++int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, ++ int do_include, au_dpages_test test, void *arg); ++int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, ++ struct dentry *dentry, int do_include); ++int au_test_subdir(struct dentry *d1, struct dentry *d2); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * todo: in linux-3.13, several similar (but faster) helpers are added to ++ * include/linux/dcache.h. Try them (in the future). ++ */ ++ ++static inline int au_d_hashed_positive(struct dentry *d) ++{ ++ int err; ++ struct inode *inode = d_inode(d); ++ ++ err = 0; ++ if (unlikely(d_unhashed(d) ++ || d_is_negative(d) ++ || !inode->i_nlink)) ++ err = -ENOENT; ++ return err; ++} ++ ++static inline int au_d_linkable(struct dentry *d) ++{ ++ int err; ++ struct inode *inode = d_inode(d); ++ ++ err = au_d_hashed_positive(d); ++ if (err ++ && d_is_positive(d) ++ && (inode->i_state & I_LINKABLE)) ++ err = 0; ++ return err; ++} ++ ++static inline int au_d_alive(struct dentry *d) ++{ ++ int err; ++ struct inode *inode; ++ ++ err = 0; ++ if (!IS_ROOT(d)) ++ err = au_d_hashed_positive(d); ++ else { ++ inode = d_inode(d); ++ if (unlikely(d_unlinked(d) ++ || d_is_negative(d) ++ || !inode->i_nlink)) ++ err = -ENOENT; ++ } ++ return err; ++} ++ ++static inline int au_alive_dir(struct dentry *d) ++{ ++ int err; ++ ++ err = au_d_alive(d); ++ if (unlikely(err || IS_DEADDIR(d_inode(d)))) ++ err = -ENOENT; ++ return err; ++} ++ ++static inline int au_qstreq(struct qstr *a, struct qstr *b) ++{ ++ return a->len == b->len ++ && !memcmp(a->name, b->name, a->len); ++} ++ ++/* ++ * by the commit ++ * 360f547 2015-01-25 dcache: let the dentry count go down to zero without ++ * taking d_lock ++ * the type of d_lockref.count became int, but the inlined function d_count() ++ * still returns unsigned int. ++ * I don't know why. Maybe it is for every d_count() users? ++ * Anyway au_dcount() lives on. ++ */ ++static inline int au_dcount(struct dentry *d) ++{ ++ return (int)d_count(d); ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DCSUB_H__ */ +diff --git a/fs/aufs/debug.c b/fs/aufs/debug.c +new file mode 100644 +index 000000000000..3a3b9ef48da3 +--- /dev/null ++++ b/fs/aufs/debug.c +@@ -0,0 +1,427 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * debug print functions ++ */ ++ ++#include "aufs.h" ++ ++/* Returns 0, or -errno. arg is in kp->arg. */ ++static int param_atomic_t_set(const char *val, const struct kernel_param *kp) ++{ ++ int err, n; ++ ++ err = kstrtoint(val, 0, &n); ++ if (!err) { ++ if (n > 0) ++ au_debug_on(); ++ else ++ au_debug_off(); ++ } ++ return err; ++} ++ ++/* Returns length written or -errno. Buffer is 4k (ie. be short!) */ ++static int param_atomic_t_get(char *buffer, const struct kernel_param *kp) ++{ ++ atomic_t *a; ++ ++ a = kp->arg; ++ return sprintf(buffer, "%d", atomic_read(a)); ++} ++ ++static struct kernel_param_ops param_ops_atomic_t = { ++ .set = param_atomic_t_set, ++ .get = param_atomic_t_get ++ /* void (*free)(void *arg) */ ++}; ++ ++atomic_t aufs_debug = ATOMIC_INIT(0); ++MODULE_PARM_DESC(debug, "debug print"); ++module_param_named(debug, aufs_debug, atomic_t, 0664); ++ ++DEFINE_MUTEX(au_dbg_mtx); /* just to serialize the dbg msgs */ ++char *au_plevel = KERN_DEBUG; ++#define dpri(fmt, ...) do { \ ++ if ((au_plevel \ ++ && strcmp(au_plevel, KERN_DEBUG)) \ ++ || au_debug_test()) \ ++ printk("%s" fmt, au_plevel, ##__VA_ARGS__); \ ++} while (0) ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_dpri_whlist(struct au_nhash *whlist) ++{ ++ unsigned long ul, n; ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ ++ n = whlist->nh_num; ++ head = whlist->nh_head; ++ for (ul = 0; ul < n; ul++) { ++ hlist_for_each_entry(pos, head, wh_hash) ++ dpri("b%d, %.*s, %d\n", ++ pos->wh_bindex, ++ pos->wh_str.len, pos->wh_str.name, ++ pos->wh_str.len); ++ head++; ++ } ++} ++ ++void au_dpri_vdir(struct au_vdir *vdir) ++{ ++ unsigned long ul; ++ union au_vdir_deblk_p p; ++ unsigned char *o; ++ ++ if (!vdir || IS_ERR(vdir)) { ++ dpri("err %ld\n", PTR_ERR(vdir)); ++ return; ++ } ++ ++ dpri("deblk %u, nblk %lu, deblk %p, last{%lu, %p}, ver %llu\n", ++ vdir->vd_deblk_sz, vdir->vd_nblk, vdir->vd_deblk, ++ vdir->vd_last.ul, vdir->vd_last.p.deblk, vdir->vd_version); ++ for (ul = 0; ul < vdir->vd_nblk; ul++) { ++ p.deblk = vdir->vd_deblk[ul]; ++ o = p.deblk; ++ dpri("[%lu]: %p\n", ul, o); ++ } ++} ++ ++static int do_pri_inode(aufs_bindex_t bindex, struct inode *inode, int hn, ++ struct dentry *wh) ++{ ++ char *n = NULL; ++ int l = 0; ++ ++ if (!inode || IS_ERR(inode)) { ++ dpri("i%d: err %ld\n", bindex, PTR_ERR(inode)); ++ return -1; ++ } ++ ++ /* the type of i_blocks depends upon CONFIG_LBDAF */ ++ BUILD_BUG_ON(sizeof(inode->i_blocks) != sizeof(unsigned long) ++ && sizeof(inode->i_blocks) != sizeof(u64)); ++ if (wh) { ++ n = (void *)wh->d_name.name; ++ l = wh->d_name.len; ++ } ++ ++ dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu," ++ " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n", ++ bindex, inode, ++ inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", ++ atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, ++ i_size_read(inode), (unsigned long long)inode->i_blocks, ++ hn, (long long)timespec64_to_ns(&inode->i_ctime) & 0x0ffff, ++ inode->i_mapping ? inode->i_mapping->nrpages : 0, ++ inode->i_state, inode->i_flags, inode_peek_iversion(inode), ++ inode->i_generation, ++ l ? ", wh " : "", l, n); ++ return 0; ++} ++ ++void au_dpri_inode(struct inode *inode) ++{ ++ struct au_iinfo *iinfo; ++ struct au_hinode *hi; ++ aufs_bindex_t bindex; ++ int err, hn; ++ ++ err = do_pri_inode(-1, inode, -1, NULL); ++ if (err || !au_test_aufs(inode->i_sb) || au_is_bad_inode(inode)) ++ return; ++ ++ iinfo = au_ii(inode); ++ dpri("i-1: btop %d, bbot %d, gen %d\n", ++ iinfo->ii_btop, iinfo->ii_bbot, au_iigen(inode, NULL)); ++ if (iinfo->ii_btop < 0) ++ return; ++ hn = 0; ++ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; bindex++) { ++ hi = au_hinode(iinfo, bindex); ++ hn = !!au_hn(hi); ++ do_pri_inode(bindex, hi->hi_inode, hn, hi->hi_whdentry); ++ } ++} ++ ++void au_dpri_dalias(struct inode *inode) ++{ ++ struct dentry *d; ++ ++ spin_lock(&inode->i_lock); ++ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) ++ au_dpri_dentry(d); ++ spin_unlock(&inode->i_lock); ++} ++ ++static int do_pri_dentry(aufs_bindex_t bindex, struct dentry *dentry) ++{ ++ struct dentry *wh = NULL; ++ int hn; ++ struct inode *inode; ++ struct au_iinfo *iinfo; ++ struct au_hinode *hi; ++ ++ if (!dentry || IS_ERR(dentry)) { ++ dpri("d%d: err %ld\n", bindex, PTR_ERR(dentry)); ++ return -1; ++ } ++ /* do not call dget_parent() here */ ++ /* note: access d_xxx without d_lock */ ++ dpri("d%d: %p, %pd2?, %s, cnt %d, flags 0x%x, %shashed\n", ++ bindex, dentry, dentry, ++ dentry->d_sb ? au_sbtype(dentry->d_sb) : "??", ++ au_dcount(dentry), dentry->d_flags, ++ d_unhashed(dentry) ? "un" : ""); ++ hn = -1; ++ inode = NULL; ++ if (d_is_positive(dentry)) ++ inode = d_inode(dentry); ++ if (inode ++ && au_test_aufs(dentry->d_sb) ++ && bindex >= 0 ++ && !au_is_bad_inode(inode)) { ++ iinfo = au_ii(inode); ++ hi = au_hinode(iinfo, bindex); ++ hn = !!au_hn(hi); ++ wh = hi->hi_whdentry; ++ } ++ do_pri_inode(bindex, inode, hn, wh); ++ return 0; ++} ++ ++void au_dpri_dentry(struct dentry *dentry) ++{ ++ struct au_dinfo *dinfo; ++ aufs_bindex_t bindex; ++ int err; ++ ++ err = do_pri_dentry(-1, dentry); ++ if (err || !au_test_aufs(dentry->d_sb)) ++ return; ++ ++ dinfo = au_di(dentry); ++ if (!dinfo) ++ return; ++ dpri("d-1: btop %d, bbot %d, bwh %d, bdiropq %d, gen %d, tmp %d\n", ++ dinfo->di_btop, dinfo->di_bbot, ++ dinfo->di_bwh, dinfo->di_bdiropq, au_digen(dentry), ++ dinfo->di_tmpfile); ++ if (dinfo->di_btop < 0) ++ return; ++ for (bindex = dinfo->di_btop; bindex <= dinfo->di_bbot; bindex++) ++ do_pri_dentry(bindex, au_hdentry(dinfo, bindex)->hd_dentry); ++} ++ ++static int do_pri_file(aufs_bindex_t bindex, struct file *file) ++{ ++ char a[32]; ++ ++ if (!file || IS_ERR(file)) { ++ dpri("f%d: err %ld\n", bindex, PTR_ERR(file)); ++ return -1; ++ } ++ a[0] = 0; ++ if (bindex < 0 ++ && !IS_ERR_OR_NULL(file->f_path.dentry) ++ && au_test_aufs(file->f_path.dentry->d_sb) ++ && au_fi(file)) ++ snprintf(a, sizeof(a), ", gen %d, mmapped %d", ++ au_figen(file), atomic_read(&au_fi(file)->fi_mmapped)); ++ dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, v %llu, pos %llu%s\n", ++ bindex, file->f_mode, file->f_flags, (long)file_count(file), ++ file->f_version, file->f_pos, a); ++ if (!IS_ERR_OR_NULL(file->f_path.dentry)) ++ do_pri_dentry(bindex, file->f_path.dentry); ++ return 0; ++} ++ ++void au_dpri_file(struct file *file) ++{ ++ struct au_finfo *finfo; ++ struct au_fidir *fidir; ++ struct au_hfile *hfile; ++ aufs_bindex_t bindex; ++ int err; ++ ++ err = do_pri_file(-1, file); ++ if (err ++ || IS_ERR_OR_NULL(file->f_path.dentry) ++ || !au_test_aufs(file->f_path.dentry->d_sb)) ++ return; ++ ++ finfo = au_fi(file); ++ if (!finfo) ++ return; ++ if (finfo->fi_btop < 0) ++ return; ++ fidir = finfo->fi_hdir; ++ if (!fidir) ++ do_pri_file(finfo->fi_btop, finfo->fi_htop.hf_file); ++ else ++ for (bindex = finfo->fi_btop; ++ bindex >= 0 && bindex <= fidir->fd_bbot; ++ bindex++) { ++ hfile = fidir->fd_hfile + bindex; ++ do_pri_file(bindex, hfile ? hfile->hf_file : NULL); ++ } ++} ++ ++static int do_pri_br(aufs_bindex_t bindex, struct au_branch *br) ++{ ++ struct vfsmount *mnt; ++ struct super_block *sb; ++ ++ if (!br || IS_ERR(br)) ++ goto out; ++ mnt = au_br_mnt(br); ++ if (!mnt || IS_ERR(mnt)) ++ goto out; ++ sb = mnt->mnt_sb; ++ if (!sb || IS_ERR(sb)) ++ goto out; ++ ++ dpri("s%d: {perm 0x%x, id %d, wbr %p}, " ++ "%s, dev 0x%02x%02x, flags 0x%lx, cnt %d, active %d, " ++ "xino %d\n", ++ bindex, br->br_perm, br->br_id, br->br_wbr, ++ au_sbtype(sb), MAJOR(sb->s_dev), MINOR(sb->s_dev), ++ sb->s_flags, sb->s_count, ++ atomic_read(&sb->s_active), ++ !!au_xino_file(br->br_xino, /*idx*/-1)); ++ return 0; ++ ++out: ++ dpri("s%d: err %ld\n", bindex, PTR_ERR(br)); ++ return -1; ++} ++ ++void au_dpri_sb(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ aufs_bindex_t bindex; ++ int err; ++ /* to reduce stack size */ ++ struct { ++ struct vfsmount mnt; ++ struct au_branch fake; ++ } *a; ++ ++ /* this function can be called from magic sysrq */ ++ a = kzalloc(sizeof(*a), GFP_ATOMIC); ++ if (unlikely(!a)) { ++ dpri("no memory\n"); ++ return; ++ } ++ ++ a->mnt.mnt_sb = sb; ++ a->fake.br_path.mnt = &a->mnt; ++ err = do_pri_br(-1, &a->fake); ++ kfree(a); ++ dpri("dev 0x%x\n", sb->s_dev); ++ if (err || !au_test_aufs(sb)) ++ return; ++ ++ sbinfo = au_sbi(sb); ++ if (!sbinfo) ++ return; ++ dpri("nw %d, gen %u, kobj %d\n", ++ atomic_read(&sbinfo->si_nowait.nw_len), sbinfo->si_generation, ++ kref_read(&sbinfo->si_kobj.kref)); ++ for (bindex = 0; bindex <= sbinfo->si_bbot; bindex++) ++ do_pri_br(bindex, sbinfo->si_branch[0 + bindex]); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line) ++{ ++ struct inode *h_inode, *inode = d_inode(dentry); ++ struct dentry *h_dentry; ++ aufs_bindex_t bindex, bbot, bi; ++ ++ if (!inode /* || au_di(dentry)->di_lsc == AuLsc_DI_TMP */) ++ return; ++ ++ bbot = au_dbbot(dentry); ++ bi = au_ibbot(inode); ++ if (bi < bbot) ++ bbot = bi; ++ bindex = au_dbtop(dentry); ++ bi = au_ibtop(inode); ++ if (bi > bindex) ++ bindex = bi; ++ ++ for (; bindex <= bbot; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ h_inode = au_h_iptr(inode, bindex); ++ if (unlikely(h_inode != d_inode(h_dentry))) { ++ au_debug_on(); ++ AuDbg("b%d, %s:%d\n", bindex, func, line); ++ AuDbgDentry(dentry); ++ AuDbgInode(inode); ++ au_debug_off(); ++ BUG(); ++ } ++ } ++} ++ ++void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen) ++{ ++ int err, i, j; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry **dentries; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ AuDebugOn(err); ++ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/1); ++ AuDebugOn(err); ++ for (i = dpages.ndpage - 1; !err && i >= 0; i--) { ++ dpage = dpages.dpages + i; ++ dentries = dpage->dentries; ++ for (j = dpage->ndentry - 1; !err && j >= 0; j--) ++ AuDebugOn(au_digen_test(dentries[j], sigen)); ++ } ++ au_dpages_free(&dpages); ++} ++ ++void au_dbg_verify_kthread(void) ++{ ++ if (au_wkq_test()) { ++ au_dbg_blocked(); ++ /* ++ * It may be recursive, but udba=notify between two aufs mounts, ++ * where a single ro branch is shared, is not a problem. ++ */ ++ /* WARN_ON(1); */ ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int __init au_debug_init(void) ++{ ++ aufs_bindex_t bindex; ++ struct au_vdir_destr destr; ++ ++ bindex = -1; ++ AuDebugOn(bindex >= 0); ++ ++ destr.len = -1; ++ AuDebugOn(destr.len < NAME_MAX); ++ ++#ifdef CONFIG_4KSTACKS ++ pr_warn("CONFIG_4KSTACKS is defined.\n"); ++#endif ++ ++ return 0; ++} +diff --git a/fs/aufs/debug.h b/fs/aufs/debug.h +new file mode 100644 +index 000000000000..11b486d4a3e8 +--- /dev/null ++++ b/fs/aufs/debug.h +@@ -0,0 +1,213 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * debug print functions ++ */ ++ ++#ifndef __AUFS_DEBUG_H__ ++#define __AUFS_DEBUG_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++ ++#ifdef CONFIG_AUFS_DEBUG ++#define AuDebugOn(a) BUG_ON(a) ++ ++/* module parameter */ ++extern atomic_t aufs_debug; ++static inline void au_debug_on(void) ++{ ++ atomic_inc(&aufs_debug); ++} ++static inline void au_debug_off(void) ++{ ++ atomic_dec_if_positive(&aufs_debug); ++} ++ ++static inline int au_debug_test(void) ++{ ++ return atomic_read(&aufs_debug) > 0; ++} ++#else ++#define AuDebugOn(a) do {} while (0) ++AuStubVoid(au_debug_on, void) ++AuStubVoid(au_debug_off, void) ++AuStubInt0(au_debug_test, void) ++#endif /* CONFIG_AUFS_DEBUG */ ++ ++#define param_check_atomic_t(name, p) __param_check(name, p, atomic_t) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* debug print */ ++ ++#define AuDbg(fmt, ...) do { \ ++ if (au_debug_test()) \ ++ pr_debug("DEBUG: " fmt, ##__VA_ARGS__); \ ++} while (0) ++#define AuLabel(l) AuDbg(#l "\n") ++#define AuIOErr(fmt, ...) pr_err("I/O Error, " fmt, ##__VA_ARGS__) ++#define AuWarn1(fmt, ...) do { \ ++ static unsigned char _c; \ ++ if (!_c++) \ ++ pr_warn(fmt, ##__VA_ARGS__); \ ++} while (0) ++ ++#define AuErr1(fmt, ...) do { \ ++ static unsigned char _c; \ ++ if (!_c++) \ ++ pr_err(fmt, ##__VA_ARGS__); \ ++} while (0) ++ ++#define AuIOErr1(fmt, ...) do { \ ++ static unsigned char _c; \ ++ if (!_c++) \ ++ AuIOErr(fmt, ##__VA_ARGS__); \ ++} while (0) ++ ++#define AuUnsupportMsg "This operation is not supported." \ ++ " Please report this application to aufs-users ML." ++#define AuUnsupport(fmt, ...) do { \ ++ pr_err(AuUnsupportMsg "\n" fmt, ##__VA_ARGS__); \ ++ dump_stack(); \ ++} while (0) ++ ++#define AuTraceErr(e) do { \ ++ if (unlikely((e) < 0)) \ ++ AuDbg("err %d\n", (int)(e)); \ ++} while (0) ++ ++#define AuTraceErrPtr(p) do { \ ++ if (IS_ERR(p)) \ ++ AuDbg("err %ld\n", PTR_ERR(p)); \ ++} while (0) ++ ++/* dirty macros for debug print, use with "%.*s" and caution */ ++#define AuLNPair(qstr) (qstr)->len, (qstr)->name ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct dentry; ++#ifdef CONFIG_AUFS_DEBUG ++extern struct mutex au_dbg_mtx; ++extern char *au_plevel; ++struct au_nhash; ++void au_dpri_whlist(struct au_nhash *whlist); ++struct au_vdir; ++void au_dpri_vdir(struct au_vdir *vdir); ++struct inode; ++void au_dpri_inode(struct inode *inode); ++void au_dpri_dalias(struct inode *inode); ++void au_dpri_dentry(struct dentry *dentry); ++struct file; ++void au_dpri_file(struct file *filp); ++struct super_block; ++void au_dpri_sb(struct super_block *sb); ++ ++#define au_dbg_verify_dinode(d) __au_dbg_verify_dinode(d, __func__, __LINE__) ++void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line); ++void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen); ++void au_dbg_verify_kthread(void); ++ ++int __init au_debug_init(void); ++ ++#define AuDbgWhlist(w) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#w "\n"); \ ++ au_dpri_whlist(w); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgVdir(v) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#v "\n"); \ ++ au_dpri_vdir(v); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgInode(i) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#i "\n"); \ ++ au_dpri_inode(i); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgDAlias(i) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#i "\n"); \ ++ au_dpri_dalias(i); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgDentry(d) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#d "\n"); \ ++ au_dpri_dentry(d); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgFile(f) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#f "\n"); \ ++ au_dpri_file(f); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgSb(sb) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#sb "\n"); \ ++ au_dpri_sb(sb); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgSym(addr) do { \ ++ char sym[KSYM_SYMBOL_LEN]; \ ++ sprint_symbol(sym, (unsigned long)addr); \ ++ AuDbg("%s\n", sym); \ ++} while (0) ++#else ++AuStubVoid(au_dbg_verify_dinode, struct dentry *dentry) ++AuStubVoid(au_dbg_verify_gen, struct dentry *parent, unsigned int sigen) ++AuStubVoid(au_dbg_verify_kthread, void) ++AuStubInt0(__init au_debug_init, void) ++ ++#define AuDbgWhlist(w) do {} while (0) ++#define AuDbgVdir(v) do {} while (0) ++#define AuDbgInode(i) do {} while (0) ++#define AuDbgDAlias(i) do {} while (0) ++#define AuDbgDentry(d) do {} while (0) ++#define AuDbgFile(f) do {} while (0) ++#define AuDbgSb(sb) do {} while (0) ++#define AuDbgSym(addr) do {} while (0) ++#endif /* CONFIG_AUFS_DEBUG */ ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_MAGIC_SYSRQ ++int __init au_sysrq_init(void); ++void au_sysrq_fin(void); ++ ++#ifdef CONFIG_HW_CONSOLE ++#define au_dbg_blocked() do { \ ++ WARN_ON(1); \ ++ handle_sysrq('w'); \ ++} while (0) ++#else ++AuStubVoid(au_dbg_blocked, void) ++#endif ++ ++#else ++AuStubInt0(__init au_sysrq_init, void) ++AuStubVoid(au_sysrq_fin, void) ++AuStubVoid(au_dbg_blocked, void) ++#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DEBUG_H__ */ +diff --git a/fs/aufs/dentry.c b/fs/aufs/dentry.c +new file mode 100644 +index 000000000000..e502a90670ff +--- /dev/null ++++ b/fs/aufs/dentry.c +@@ -0,0 +1,1140 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * lookup and dentry operations ++ */ ++ ++#include ++#include "aufs.h" ++ ++/* ++ * returns positive/negative dentry, NULL or an error. ++ * NULL means whiteout-ed or not-found. ++ */ ++static struct dentry* ++au_do_lookup(struct dentry *h_parent, struct dentry *dentry, ++ aufs_bindex_t bindex, struct au_do_lookup_args *args) ++{ ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ struct au_branch *br; ++ int wh_found, opq; ++ unsigned char wh_able; ++ const unsigned char allow_neg = !!au_ftest_lkup(args->flags, ALLOW_NEG); ++ const unsigned char ignore_perm = !!au_ftest_lkup(args->flags, ++ IGNORE_PERM); ++ ++ wh_found = 0; ++ br = au_sbr(dentry->d_sb, bindex); ++ wh_able = !!au_br_whable(br->br_perm); ++ if (wh_able) ++ wh_found = au_wh_test(h_parent, &args->whname, ignore_perm); ++ h_dentry = ERR_PTR(wh_found); ++ if (!wh_found) ++ goto real_lookup; ++ if (unlikely(wh_found < 0)) ++ goto out; ++ ++ /* We found a whiteout */ ++ /* au_set_dbbot(dentry, bindex); */ ++ au_set_dbwh(dentry, bindex); ++ if (!allow_neg) ++ return NULL; /* success */ ++ ++real_lookup: ++ if (!ignore_perm) ++ h_dentry = vfsub_lkup_one(args->name, h_parent); ++ else ++ h_dentry = au_sio_lkup_one(args->name, h_parent); ++ if (IS_ERR(h_dentry)) { ++ if (PTR_ERR(h_dentry) == -ENAMETOOLONG ++ && !allow_neg) ++ h_dentry = NULL; ++ goto out; ++ } ++ ++ h_inode = d_inode(h_dentry); ++ if (d_is_negative(h_dentry)) { ++ if (!allow_neg) ++ goto out_neg; ++ } else if (wh_found ++ || (args->type && args->type != (h_inode->i_mode & S_IFMT))) ++ goto out_neg; ++ else if (au_ftest_lkup(args->flags, DIRREN) ++ /* && h_inode */ ++ && !au_dr_lkup_h_ino(args, bindex, h_inode->i_ino)) { ++ AuDbg("b%d %pd ignored hi%llu\n", bindex, h_dentry, ++ (unsigned long long)h_inode->i_ino); ++ goto out_neg; ++ } ++ ++ if (au_dbbot(dentry) <= bindex) ++ au_set_dbbot(dentry, bindex); ++ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) ++ au_set_dbtop(dentry, bindex); ++ au_set_h_dptr(dentry, bindex, h_dentry); ++ ++ if (!d_is_dir(h_dentry) ++ || !wh_able ++ || (d_really_is_positive(dentry) && !d_is_dir(dentry))) ++ goto out; /* success */ ++ ++ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); ++ opq = au_diropq_test(h_dentry); ++ inode_unlock_shared(h_inode); ++ if (opq > 0) ++ au_set_dbdiropq(dentry, bindex); ++ else if (unlikely(opq < 0)) { ++ au_set_h_dptr(dentry, bindex, NULL); ++ h_dentry = ERR_PTR(opq); ++ } ++ goto out; ++ ++out_neg: ++ dput(h_dentry); ++ h_dentry = NULL; ++out: ++ return h_dentry; ++} ++ ++static int au_test_shwh(struct super_block *sb, const struct qstr *name) ++{ ++ if (unlikely(!au_opt_test(au_mntflags(sb), SHWH) ++ && !strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN))) ++ return -EPERM; ++ return 0; ++} ++ ++/* ++ * returns the number of lower positive dentries, ++ * otherwise an error. ++ * can be called at unlinking with @type is zero. ++ */ ++int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, ++ unsigned int flags) ++{ ++ int npositive, err; ++ aufs_bindex_t bindex, btail, bdiropq; ++ unsigned char isdir, dirperm1, dirren; ++ struct au_do_lookup_args args = { ++ .flags = flags, ++ .name = &dentry->d_name ++ }; ++ struct dentry *parent; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ err = au_test_shwh(sb, args.name); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_wh_name_alloc(&args.whname, args.name); ++ if (unlikely(err)) ++ goto out; ++ ++ isdir = !!d_is_dir(dentry); ++ dirperm1 = !!au_opt_test(au_mntflags(sb), DIRPERM1); ++ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); ++ if (dirren) ++ au_fset_lkup(args.flags, DIRREN); ++ ++ npositive = 0; ++ parent = dget_parent(dentry); ++ btail = au_dbtaildir(parent); ++ for (bindex = btop; bindex <= btail; bindex++) { ++ struct dentry *h_parent, *h_dentry; ++ struct inode *h_inode, *h_dir; ++ struct au_branch *br; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry) { ++ if (d_is_positive(h_dentry)) ++ npositive++; ++ break; ++ } ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || !d_is_dir(h_parent)) ++ continue; ++ ++ if (dirren) { ++ /* if the inum matches, then use the prepared name */ ++ err = au_dr_lkup_name(&args, bindex); ++ if (unlikely(err)) ++ goto out_parent; ++ } ++ ++ h_dir = d_inode(h_parent); ++ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); ++ h_dentry = au_do_lookup(h_parent, dentry, bindex, &args); ++ inode_unlock_shared(h_dir); ++ err = PTR_ERR(h_dentry); ++ if (IS_ERR(h_dentry)) ++ goto out_parent; ++ if (h_dentry) ++ au_fclr_lkup(args.flags, ALLOW_NEG); ++ if (dirperm1) ++ au_fset_lkup(args.flags, IGNORE_PERM); ++ ++ if (au_dbwh(dentry) == bindex) ++ break; ++ if (!h_dentry) ++ continue; ++ if (d_is_negative(h_dentry)) ++ continue; ++ h_inode = d_inode(h_dentry); ++ npositive++; ++ if (!args.type) ++ args.type = h_inode->i_mode & S_IFMT; ++ if (args.type != S_IFDIR) ++ break; ++ else if (isdir) { ++ /* the type of lower may be different */ ++ bdiropq = au_dbdiropq(dentry); ++ if (bdiropq >= 0 && bdiropq <= bindex) ++ break; ++ } ++ br = au_sbr(sb, bindex); ++ if (dirren ++ && au_dr_hino_test_add(&br->br_dirren, h_inode->i_ino, ++ /*add_ent*/NULL)) { ++ /* prepare next name to lookup */ ++ err = au_dr_lkup(&args, dentry, bindex); ++ if (unlikely(err)) ++ goto out_parent; ++ } ++ } ++ ++ if (npositive) { ++ AuLabel(positive); ++ au_update_dbtop(dentry); ++ } ++ err = npositive; ++ if (unlikely(!au_opt_test(au_mntflags(sb), UDBA_NONE) ++ && au_dbtop(dentry) < 0)) { ++ err = -EIO; ++ AuIOErr("both of real entry and whiteout found, %pd, err %d\n", ++ dentry, err); ++ } ++ ++out_parent: ++ dput(parent); ++ kfree(args.whname.name); ++ if (dirren) ++ au_dr_lkup_fin(&args); ++out: ++ return err; ++} ++ ++struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent) ++{ ++ struct dentry *dentry; ++ int wkq_err; ++ ++ if (!au_test_h_perm_sio(d_inode(parent), MAY_EXEC)) ++ dentry = vfsub_lkup_one(name, parent); ++ else { ++ struct vfsub_lkup_one_args args = { ++ .errp = &dentry, ++ .name = name, ++ .parent = parent ++ }; ++ ++ wkq_err = au_wkq_wait(vfsub_call_lkup_one, &args); ++ if (unlikely(wkq_err)) ++ dentry = ERR_PTR(wkq_err); ++ } ++ ++ return dentry; ++} ++ ++/* ++ * lookup @dentry on @bindex which should be negative. ++ */ ++int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh) ++{ ++ int err; ++ struct dentry *parent, *h_parent, *h_dentry; ++ struct au_branch *br; ++ ++ parent = dget_parent(dentry); ++ h_parent = au_h_dptr(parent, bindex); ++ br = au_sbr(dentry->d_sb, bindex); ++ if (wh) ++ h_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); ++ else ++ h_dentry = au_sio_lkup_one(&dentry->d_name, h_parent); ++ err = PTR_ERR(h_dentry); ++ if (IS_ERR(h_dentry)) ++ goto out; ++ if (unlikely(d_is_positive(h_dentry))) { ++ err = -EIO; ++ AuIOErr("%pd should be negative on b%d.\n", h_dentry, bindex); ++ dput(h_dentry); ++ goto out; ++ } ++ ++ err = 0; ++ if (bindex < au_dbtop(dentry)) ++ au_set_dbtop(dentry, bindex); ++ if (au_dbbot(dentry) < bindex) ++ au_set_dbbot(dentry, bindex); ++ au_set_h_dptr(dentry, bindex, h_dentry); ++ ++out: ++ dput(parent); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* subset of struct inode */ ++struct au_iattr { ++ unsigned long i_ino; ++ /* unsigned int i_nlink; */ ++ kuid_t i_uid; ++ kgid_t i_gid; ++ u64 i_version; ++/* ++ loff_t i_size; ++ blkcnt_t i_blocks; ++*/ ++ umode_t i_mode; ++}; ++ ++static void au_iattr_save(struct au_iattr *ia, struct inode *h_inode) ++{ ++ ia->i_ino = h_inode->i_ino; ++ /* ia->i_nlink = h_inode->i_nlink; */ ++ ia->i_uid = h_inode->i_uid; ++ ia->i_gid = h_inode->i_gid; ++ ia->i_version = inode_query_iversion(h_inode); ++/* ++ ia->i_size = h_inode->i_size; ++ ia->i_blocks = h_inode->i_blocks; ++*/ ++ ia->i_mode = (h_inode->i_mode & S_IFMT); ++} ++ ++static int au_iattr_test(struct au_iattr *ia, struct inode *h_inode) ++{ ++ return ia->i_ino != h_inode->i_ino ++ /* || ia->i_nlink != h_inode->i_nlink */ ++ || !uid_eq(ia->i_uid, h_inode->i_uid) ++ || !gid_eq(ia->i_gid, h_inode->i_gid) ++ || !inode_eq_iversion(h_inode, ia->i_version) ++/* ++ || ia->i_size != h_inode->i_size ++ || ia->i_blocks != h_inode->i_blocks ++*/ ++ || ia->i_mode != (h_inode->i_mode & S_IFMT); ++} ++ ++static int au_h_verify_dentry(struct dentry *h_dentry, struct dentry *h_parent, ++ struct au_branch *br) ++{ ++ int err; ++ struct au_iattr ia; ++ struct inode *h_inode; ++ struct dentry *h_d; ++ struct super_block *h_sb; ++ ++ err = 0; ++ memset(&ia, -1, sizeof(ia)); ++ h_sb = h_dentry->d_sb; ++ h_inode = NULL; ++ if (d_is_positive(h_dentry)) { ++ h_inode = d_inode(h_dentry); ++ au_iattr_save(&ia, h_inode); ++ } else if (au_test_nfs(h_sb) || au_test_fuse(h_sb)) ++ /* nfs d_revalidate may return 0 for negative dentry */ ++ /* fuse d_revalidate always return 0 for negative dentry */ ++ goto out; ++ ++ /* main purpose is namei.c:cached_lookup() and d_revalidate */ ++ h_d = vfsub_lkup_one(&h_dentry->d_name, h_parent); ++ err = PTR_ERR(h_d); ++ if (IS_ERR(h_d)) ++ goto out; ++ ++ err = 0; ++ if (unlikely(h_d != h_dentry ++ || d_inode(h_d) != h_inode ++ || (h_inode && au_iattr_test(&ia, h_inode)))) ++ err = au_busy_or_stale(); ++ dput(h_d); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, ++ struct dentry *h_parent, struct au_branch *br) ++{ ++ int err; ++ ++ err = 0; ++ if (udba == AuOpt_UDBA_REVAL ++ && !au_test_fs_remote(h_dentry->d_sb)) { ++ IMustLock(h_dir); ++ err = (d_inode(h_dentry->d_parent) != h_dir); ++ } else if (udba != AuOpt_UDBA_NONE) ++ err = au_h_verify_dentry(h_dentry, h_parent, br); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_refresh_hdentry(struct dentry *dentry, struct dentry *parent) ++{ ++ int err; ++ aufs_bindex_t new_bindex, bindex, bbot, bwh, bdiropq; ++ struct au_hdentry tmp, *p, *q; ++ struct au_dinfo *dinfo; ++ struct super_block *sb; ++ ++ DiMustWriteLock(dentry); ++ ++ sb = dentry->d_sb; ++ dinfo = au_di(dentry); ++ bbot = dinfo->di_bbot; ++ bwh = dinfo->di_bwh; ++ bdiropq = dinfo->di_bdiropq; ++ bindex = dinfo->di_btop; ++ p = au_hdentry(dinfo, bindex); ++ for (; bindex <= bbot; bindex++, p++) { ++ if (!p->hd_dentry) ++ continue; ++ ++ new_bindex = au_br_index(sb, p->hd_id); ++ if (new_bindex == bindex) ++ continue; ++ ++ if (dinfo->di_bwh == bindex) ++ bwh = new_bindex; ++ if (dinfo->di_bdiropq == bindex) ++ bdiropq = new_bindex; ++ if (new_bindex < 0) { ++ au_hdput(p); ++ p->hd_dentry = NULL; ++ continue; ++ } ++ ++ /* swap two lower dentries, and loop again */ ++ q = au_hdentry(dinfo, new_bindex); ++ tmp = *q; ++ *q = *p; ++ *p = tmp; ++ if (tmp.hd_dentry) { ++ bindex--; ++ p--; ++ } ++ } ++ ++ dinfo->di_bwh = -1; ++ if (bwh >= 0 && bwh <= au_sbbot(sb) && au_sbr_whable(sb, bwh)) ++ dinfo->di_bwh = bwh; ++ ++ dinfo->di_bdiropq = -1; ++ if (bdiropq >= 0 ++ && bdiropq <= au_sbbot(sb) ++ && au_sbr_whable(sb, bdiropq)) ++ dinfo->di_bdiropq = bdiropq; ++ ++ err = -EIO; ++ dinfo->di_btop = -1; ++ dinfo->di_bbot = -1; ++ bbot = au_dbbot(parent); ++ bindex = 0; ++ p = au_hdentry(dinfo, bindex); ++ for (; bindex <= bbot; bindex++, p++) ++ if (p->hd_dentry) { ++ dinfo->di_btop = bindex; ++ break; ++ } ++ ++ if (dinfo->di_btop >= 0) { ++ bindex = bbot; ++ p = au_hdentry(dinfo, bindex); ++ for (; bindex >= 0; bindex--, p--) ++ if (p->hd_dentry) { ++ dinfo->di_bbot = bindex; ++ err = 0; ++ break; ++ } ++ } ++ ++ return err; ++} ++ ++static void au_do_hide(struct dentry *dentry) ++{ ++ struct inode *inode; ++ ++ if (d_really_is_positive(dentry)) { ++ inode = d_inode(dentry); ++ if (!d_is_dir(dentry)) { ++ if (inode->i_nlink && !d_unhashed(dentry)) ++ drop_nlink(inode); ++ } else { ++ clear_nlink(inode); ++ /* stop next lookup */ ++ inode->i_flags |= S_DEAD; ++ } ++ smp_mb(); /* necessary? */ ++ } ++ d_drop(dentry); ++} ++ ++static int au_hide_children(struct dentry *parent) ++{ ++ int err, i, j, ndentry; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry *dentry; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_dcsub_pages(&dpages, parent, NULL, NULL); ++ if (unlikely(err)) ++ goto out_dpages; ++ ++ /* in reverse order */ ++ for (i = dpages.ndpage - 1; i >= 0; i--) { ++ dpage = dpages.dpages + i; ++ ndentry = dpage->ndentry; ++ for (j = ndentry - 1; j >= 0; j--) { ++ dentry = dpage->dentries[j]; ++ if (dentry != parent) ++ au_do_hide(dentry); ++ } ++ } ++ ++out_dpages: ++ au_dpages_free(&dpages); ++out: ++ return err; ++} ++ ++static void au_hide(struct dentry *dentry) ++{ ++ int err; ++ ++ AuDbgDentry(dentry); ++ if (d_is_dir(dentry)) { ++ /* shrink_dcache_parent(dentry); */ ++ err = au_hide_children(dentry); ++ if (unlikely(err)) ++ AuIOErr("%pd, failed hiding children, ignored %d\n", ++ dentry, err); ++ } ++ au_do_hide(dentry); ++} ++ ++/* ++ * By adding a dirty branch, a cached dentry may be affected in various ways. ++ * ++ * a dirty branch is added ++ * - on the top of layers ++ * - in the middle of layers ++ * - to the bottom of layers ++ * ++ * on the added branch there exists ++ * - a whiteout ++ * - a diropq ++ * - a same named entry ++ * + exist ++ * * negative --> positive ++ * * positive --> positive ++ * - type is unchanged ++ * - type is changed ++ * + doesn't exist ++ * * negative --> negative ++ * * positive --> negative (rejected by au_br_del() for non-dir case) ++ * - none ++ */ ++static int au_refresh_by_dinfo(struct dentry *dentry, struct au_dinfo *dinfo, ++ struct au_dinfo *tmp) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct { ++ struct dentry *dentry; ++ struct inode *inode; ++ mode_t mode; ++ } orig_h, tmp_h = { ++ .dentry = NULL ++ }; ++ struct au_hdentry *hd; ++ struct inode *inode, *h_inode; ++ struct dentry *h_dentry; ++ ++ err = 0; ++ AuDebugOn(dinfo->di_btop < 0); ++ orig_h.mode = 0; ++ orig_h.dentry = au_hdentry(dinfo, dinfo->di_btop)->hd_dentry; ++ orig_h.inode = NULL; ++ if (d_is_positive(orig_h.dentry)) { ++ orig_h.inode = d_inode(orig_h.dentry); ++ orig_h.mode = orig_h.inode->i_mode & S_IFMT; ++ } ++ if (tmp->di_btop >= 0) { ++ tmp_h.dentry = au_hdentry(tmp, tmp->di_btop)->hd_dentry; ++ if (d_is_positive(tmp_h.dentry)) { ++ tmp_h.inode = d_inode(tmp_h.dentry); ++ tmp_h.mode = tmp_h.inode->i_mode & S_IFMT; ++ } ++ } ++ ++ inode = NULL; ++ if (d_really_is_positive(dentry)) ++ inode = d_inode(dentry); ++ if (!orig_h.inode) { ++ AuDbg("negative originally\n"); ++ if (inode) { ++ au_hide(dentry); ++ goto out; ++ } ++ AuDebugOn(inode); ++ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); ++ AuDebugOn(dinfo->di_bdiropq != -1); ++ ++ if (!tmp_h.inode) { ++ AuDbg("negative --> negative\n"); ++ /* should have only one negative lower */ ++ if (tmp->di_btop >= 0 ++ && tmp->di_btop < dinfo->di_btop) { ++ AuDebugOn(tmp->di_btop != tmp->di_bbot); ++ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); ++ au_set_h_dptr(dentry, dinfo->di_btop, NULL); ++ au_di_cp(dinfo, tmp); ++ hd = au_hdentry(tmp, tmp->di_btop); ++ au_set_h_dptr(dentry, tmp->di_btop, ++ dget(hd->hd_dentry)); ++ } ++ au_dbg_verify_dinode(dentry); ++ } else { ++ AuDbg("negative --> positive\n"); ++ /* ++ * similar to the behaviour of creating with bypassing ++ * aufs. ++ * unhash it in order to force an error in the ++ * succeeding create operation. ++ * we should not set S_DEAD here. ++ */ ++ d_drop(dentry); ++ /* au_di_swap(tmp, dinfo); */ ++ au_dbg_verify_dinode(dentry); ++ } ++ } else { ++ AuDbg("positive originally\n"); ++ /* inode may be NULL */ ++ AuDebugOn(inode && (inode->i_mode & S_IFMT) != orig_h.mode); ++ if (!tmp_h.inode) { ++ AuDbg("positive --> negative\n"); ++ /* or bypassing aufs */ ++ au_hide(dentry); ++ if (tmp->di_bwh >= 0 && tmp->di_bwh <= dinfo->di_btop) ++ dinfo->di_bwh = tmp->di_bwh; ++ if (inode) ++ err = au_refresh_hinode_self(inode); ++ au_dbg_verify_dinode(dentry); ++ } else if (orig_h.mode == tmp_h.mode) { ++ AuDbg("positive --> positive, same type\n"); ++ if (!S_ISDIR(orig_h.mode) ++ && dinfo->di_btop > tmp->di_btop) { ++ /* ++ * similar to the behaviour of removing and ++ * creating. ++ */ ++ au_hide(dentry); ++ if (inode) ++ err = au_refresh_hinode_self(inode); ++ au_dbg_verify_dinode(dentry); ++ } else { ++ /* fill empty slots */ ++ if (dinfo->di_btop > tmp->di_btop) ++ dinfo->di_btop = tmp->di_btop; ++ if (dinfo->di_bbot < tmp->di_bbot) ++ dinfo->di_bbot = tmp->di_bbot; ++ dinfo->di_bwh = tmp->di_bwh; ++ dinfo->di_bdiropq = tmp->di_bdiropq; ++ bbot = dinfo->di_bbot; ++ bindex = tmp->di_btop; ++ hd = au_hdentry(tmp, bindex); ++ for (; bindex <= bbot; bindex++, hd++) { ++ if (au_h_dptr(dentry, bindex)) ++ continue; ++ h_dentry = hd->hd_dentry; ++ if (!h_dentry) ++ continue; ++ AuDebugOn(d_is_negative(h_dentry)); ++ h_inode = d_inode(h_dentry); ++ AuDebugOn(orig_h.mode ++ != (h_inode->i_mode ++ & S_IFMT)); ++ au_set_h_dptr(dentry, bindex, ++ dget(h_dentry)); ++ } ++ if (inode) ++ err = au_refresh_hinode(inode, dentry); ++ au_dbg_verify_dinode(dentry); ++ } ++ } else { ++ AuDbg("positive --> positive, different type\n"); ++ /* similar to the behaviour of removing and creating */ ++ au_hide(dentry); ++ if (inode) ++ err = au_refresh_hinode_self(inode); ++ au_dbg_verify_dinode(dentry); ++ } ++ } ++ ++out: ++ return err; ++} ++ ++void au_refresh_dop(struct dentry *dentry, int force_reval) ++{ ++ const struct dentry_operations *dop ++ = force_reval ? &aufs_dop : dentry->d_sb->s_d_op; ++ static const unsigned int mask ++ = DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE; ++ ++ BUILD_BUG_ON(sizeof(mask) != sizeof(dentry->d_flags)); ++ ++ if (dentry->d_op == dop) ++ return; ++ ++ AuDbg("%pd\n", dentry); ++ spin_lock(&dentry->d_lock); ++ if (dop == &aufs_dop) ++ dentry->d_flags |= mask; ++ else ++ dentry->d_flags &= ~mask; ++ dentry->d_op = dop; ++ spin_unlock(&dentry->d_lock); ++} ++ ++int au_refresh_dentry(struct dentry *dentry, struct dentry *parent) ++{ ++ int err, ebrange, nbr; ++ unsigned int sigen; ++ struct au_dinfo *dinfo, *tmp; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ DiMustWriteLock(dentry); ++ AuDebugOn(IS_ROOT(dentry)); ++ AuDebugOn(d_really_is_negative(parent)); ++ ++ sb = dentry->d_sb; ++ sigen = au_sigen(sb); ++ err = au_digen_test(parent, sigen); ++ if (unlikely(err)) ++ goto out; ++ ++ nbr = au_sbbot(sb) + 1; ++ dinfo = au_di(dentry); ++ err = au_di_realloc(dinfo, nbr, /*may_shrink*/0); ++ if (unlikely(err)) ++ goto out; ++ ebrange = au_dbrange_test(dentry); ++ if (!ebrange) ++ ebrange = au_do_refresh_hdentry(dentry, parent); ++ ++ if (d_unhashed(dentry) || ebrange /* || dinfo->di_tmpfile */) { ++ AuDebugOn(au_dbtop(dentry) < 0 && au_dbbot(dentry) >= 0); ++ if (d_really_is_positive(dentry)) { ++ inode = d_inode(dentry); ++ err = au_refresh_hinode_self(inode); ++ } ++ au_dbg_verify_dinode(dentry); ++ if (!err) ++ goto out_dgen; /* success */ ++ goto out; ++ } ++ ++ /* temporary dinfo */ ++ AuDbgDentry(dentry); ++ err = -ENOMEM; ++ tmp = au_di_alloc(sb, AuLsc_DI_TMP); ++ if (unlikely(!tmp)) ++ goto out; ++ au_di_swap(tmp, dinfo); ++ /* returns the number of positive dentries */ ++ /* ++ * if current working dir is removed, it returns an error. ++ * but the dentry is legal. ++ */ ++ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); ++ AuDbgDentry(dentry); ++ au_di_swap(tmp, dinfo); ++ if (err == -ENOENT) ++ err = 0; ++ if (err >= 0) { ++ /* compare/refresh by dinfo */ ++ AuDbgDentry(dentry); ++ err = au_refresh_by_dinfo(dentry, dinfo, tmp); ++ au_dbg_verify_dinode(dentry); ++ AuTraceErr(err); ++ } ++ au_di_realloc(dinfo, nbr, /*may_shrink*/1); /* harmless if err */ ++ au_rw_write_unlock(&tmp->di_rwsem); ++ au_di_free(tmp); ++ if (unlikely(err)) ++ goto out; ++ ++out_dgen: ++ au_update_digen(dentry); ++out: ++ if (unlikely(err && !(dentry->d_flags & DCACHE_NFSFS_RENAMED))) { ++ AuIOErr("failed refreshing %pd, %d\n", dentry, err); ++ AuDbgDentry(dentry); ++ } ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_do_h_d_reval(struct dentry *h_dentry, unsigned int flags, ++ struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ int err, valid; ++ ++ err = 0; ++ if (!(h_dentry->d_flags & DCACHE_OP_REVALIDATE)) ++ goto out; ++ ++ AuDbg("b%d\n", bindex); ++ /* ++ * gave up supporting LOOKUP_CREATE/OPEN for lower fs, ++ * due to whiteout and branch permission. ++ */ ++ flags &= ~(/*LOOKUP_PARENT |*/ LOOKUP_OPEN | LOOKUP_CREATE ++ | LOOKUP_FOLLOW | LOOKUP_EXCL); ++ /* it may return tri-state */ ++ valid = h_dentry->d_op->d_revalidate(h_dentry, flags); ++ ++ if (unlikely(valid < 0)) ++ err = valid; ++ else if (!valid) ++ err = -EINVAL; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* todo: remove this */ ++static int h_d_revalidate(struct dentry *dentry, struct inode *inode, ++ unsigned int flags, int do_udba, int dirren) ++{ ++ int err; ++ umode_t mode, h_mode; ++ aufs_bindex_t bindex, btail, btop, ibs, ibe; ++ unsigned char plus, unhashed, is_root, h_plus, h_nfs, tmpfile; ++ struct inode *h_inode, *h_cached_inode; ++ struct dentry *h_dentry; ++ struct qstr *name, *h_name; ++ ++ err = 0; ++ plus = 0; ++ mode = 0; ++ ibs = -1; ++ ibe = -1; ++ unhashed = !!d_unhashed(dentry); ++ is_root = !!IS_ROOT(dentry); ++ name = &dentry->d_name; ++ tmpfile = au_di(dentry)->di_tmpfile; ++ ++ /* ++ * Theoretically, REVAL test should be unnecessary in case of ++ * {FS,I}NOTIFY. ++ * But {fs,i}notify doesn't fire some necessary events, ++ * IN_ATTRIB for atime/nlink/pageio ++ * Let's do REVAL test too. ++ */ ++ if (do_udba && inode) { ++ mode = (inode->i_mode & S_IFMT); ++ plus = (inode->i_nlink > 0); ++ ibs = au_ibtop(inode); ++ ibe = au_ibbot(inode); ++ } ++ ++ btop = au_dbtop(dentry); ++ btail = btop; ++ if (inode && S_ISDIR(inode->i_mode)) ++ btail = au_dbtaildir(dentry); ++ for (bindex = btop; bindex <= btail; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ ++ AuDbg("b%d, %pd\n", bindex, h_dentry); ++ h_nfs = !!au_test_nfs(h_dentry->d_sb); ++ spin_lock(&h_dentry->d_lock); ++ h_name = &h_dentry->d_name; ++ if (unlikely(do_udba ++ && !is_root ++ && ((!h_nfs ++ && (unhashed != !!d_unhashed(h_dentry) ++ || (!tmpfile && !dirren ++ && !au_qstreq(name, h_name)) ++ )) ++ || (h_nfs ++ && !(flags & LOOKUP_OPEN) ++ && (h_dentry->d_flags ++ & DCACHE_NFSFS_RENAMED))) ++ )) { ++ int h_unhashed; ++ ++ h_unhashed = d_unhashed(h_dentry); ++ spin_unlock(&h_dentry->d_lock); ++ AuDbg("unhash 0x%x 0x%x, %pd %pd\n", ++ unhashed, h_unhashed, dentry, h_dentry); ++ goto err; ++ } ++ spin_unlock(&h_dentry->d_lock); ++ ++ err = au_do_h_d_reval(h_dentry, flags, dentry, bindex); ++ if (unlikely(err)) ++ /* do not goto err, to keep the errno */ ++ break; ++ ++ /* todo: plink too? */ ++ if (!do_udba) ++ continue; ++ ++ /* UDBA tests */ ++ if (unlikely(!!inode != d_is_positive(h_dentry))) ++ goto err; ++ ++ h_inode = NULL; ++ if (d_is_positive(h_dentry)) ++ h_inode = d_inode(h_dentry); ++ h_plus = plus; ++ h_mode = mode; ++ h_cached_inode = h_inode; ++ if (h_inode) { ++ h_mode = (h_inode->i_mode & S_IFMT); ++ h_plus = (h_inode->i_nlink > 0); ++ } ++ if (inode && ibs <= bindex && bindex <= ibe) ++ h_cached_inode = au_h_iptr(inode, bindex); ++ ++ if (!h_nfs) { ++ if (unlikely(plus != h_plus && !tmpfile)) ++ goto err; ++ } else { ++ if (unlikely(!(h_dentry->d_flags & DCACHE_NFSFS_RENAMED) ++ && !is_root ++ && !IS_ROOT(h_dentry) ++ && unhashed != d_unhashed(h_dentry))) ++ goto err; ++ } ++ if (unlikely(mode != h_mode ++ || h_cached_inode != h_inode)) ++ goto err; ++ continue; ++ ++err: ++ err = -EINVAL; ++ break; ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* todo: consolidate with do_refresh() and au_reval_for_attr() */ ++static int simple_reval_dpath(struct dentry *dentry, unsigned int sigen) ++{ ++ int err; ++ struct dentry *parent; ++ ++ if (!au_digen_test(dentry, sigen)) ++ return 0; ++ ++ parent = dget_parent(dentry); ++ di_read_lock_parent(parent, AuLock_IR); ++ AuDebugOn(au_digen_test(parent, sigen)); ++ au_dbg_verify_gen(parent, sigen); ++ err = au_refresh_dentry(dentry, parent); ++ di_read_unlock(parent, AuLock_IR); ++ dput(parent); ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_reval_dpath(struct dentry *dentry, unsigned int sigen) ++{ ++ int err; ++ struct dentry *d, *parent; ++ ++ if (!au_ftest_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR)) ++ return simple_reval_dpath(dentry, sigen); ++ ++ /* slow loop, keep it simple and stupid */ ++ /* cf: au_cpup_dirs() */ ++ err = 0; ++ parent = NULL; ++ while (au_digen_test(dentry, sigen)) { ++ d = dentry; ++ while (1) { ++ dput(parent); ++ parent = dget_parent(d); ++ if (!au_digen_test(parent, sigen)) ++ break; ++ d = parent; ++ } ++ ++ if (d != dentry) ++ di_write_lock_child2(d); ++ ++ /* someone might update our dentry while we were sleeping */ ++ if (au_digen_test(d, sigen)) { ++ /* ++ * todo: consolidate with simple_reval_dpath(), ++ * do_refresh() and au_reval_for_attr(). ++ */ ++ di_read_lock_parent(parent, AuLock_IR); ++ err = au_refresh_dentry(d, parent); ++ di_read_unlock(parent, AuLock_IR); ++ } ++ ++ if (d != dentry) ++ di_write_unlock(d); ++ dput(parent); ++ if (unlikely(err)) ++ break; ++ } ++ ++ return err; ++} ++ ++/* ++ * if valid returns 1, otherwise 0. ++ */ ++static int aufs_d_revalidate(struct dentry *dentry, unsigned int flags) ++{ ++ int valid, err; ++ unsigned int sigen; ++ unsigned char do_udba, dirren; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ /* todo: support rcu-walk? */ ++ if (flags & LOOKUP_RCU) ++ return -ECHILD; ++ ++ valid = 0; ++ if (unlikely(!au_di(dentry))) ++ goto out; ++ ++ valid = 1; ++ sb = dentry->d_sb; ++ /* ++ * todo: very ugly ++ * i_mutex of parent dir may be held, ++ * but we should not return 'invalid' due to busy. ++ */ ++ err = aufs_read_lock(dentry, AuLock_FLUSH | AuLock_DW | AuLock_NOPLM); ++ if (unlikely(err)) { ++ valid = err; ++ AuTraceErr(err); ++ goto out; ++ } ++ inode = NULL; ++ if (d_really_is_positive(dentry)) ++ inode = d_inode(dentry); ++ if (unlikely(inode && au_is_bad_inode(inode))) { ++ err = -EINVAL; ++ AuTraceErr(err); ++ goto out_dgrade; ++ } ++ if (unlikely(au_dbrange_test(dentry))) { ++ err = -EINVAL; ++ AuTraceErr(err); ++ goto out_dgrade; ++ } ++ ++ sigen = au_sigen(sb); ++ if (au_digen_test(dentry, sigen)) { ++ AuDebugOn(IS_ROOT(dentry)); ++ err = au_reval_dpath(dentry, sigen); ++ if (unlikely(err)) { ++ AuTraceErr(err); ++ goto out_dgrade; ++ } ++ } ++ di_downgrade_lock(dentry, AuLock_IR); ++ ++ err = -EINVAL; ++ if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY)) ++ && inode ++ && !(inode->i_state && I_LINKABLE) ++ && (IS_DEADDIR(inode) || !inode->i_nlink)) { ++ AuTraceErr(err); ++ goto out_inval; ++ } ++ ++ do_udba = !au_opt_test(au_mntflags(sb), UDBA_NONE); ++ if (do_udba && inode) { ++ aufs_bindex_t btop = au_ibtop(inode); ++ struct inode *h_inode; ++ ++ if (btop >= 0) { ++ h_inode = au_h_iptr(inode, btop); ++ if (h_inode && au_test_higen(inode, h_inode)) { ++ AuTraceErr(err); ++ goto out_inval; ++ } ++ } ++ } ++ ++ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); ++ err = h_d_revalidate(dentry, inode, flags, do_udba, dirren); ++ if (unlikely(!err && do_udba && au_dbtop(dentry) < 0)) { ++ err = -EIO; ++ AuDbg("both of real entry and whiteout found, %p, err %d\n", ++ dentry, err); ++ } ++ goto out_inval; ++ ++out_dgrade: ++ di_downgrade_lock(dentry, AuLock_IR); ++out_inval: ++ aufs_read_unlock(dentry, AuLock_IR); ++ AuTraceErr(err); ++ valid = !err; ++out: ++ if (!valid) { ++ AuDbg("%pd invalid, %d\n", dentry, valid); ++ d_drop(dentry); ++ } ++ return valid; ++} ++ ++static void aufs_d_release(struct dentry *dentry) ++{ ++ if (au_di(dentry)) { ++ au_di_fin(dentry); ++ au_hn_di_reinit(dentry); ++ } ++} ++ ++const struct dentry_operations aufs_dop = { ++ .d_revalidate = aufs_d_revalidate, ++ .d_weak_revalidate = aufs_d_revalidate, ++ .d_release = aufs_d_release ++}; ++ ++/* aufs_dop without d_revalidate */ ++const struct dentry_operations aufs_dop_noreval = { ++ .d_release = aufs_d_release ++}; +diff --git a/fs/aufs/dentry.h b/fs/aufs/dentry.h +new file mode 100644 +index 000000000000..950ad2419856 +--- /dev/null ++++ b/fs/aufs/dentry.h +@@ -0,0 +1,254 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * lookup and dentry operations ++ */ ++ ++#ifndef __AUFS_DENTRY_H__ ++#define __AUFS_DENTRY_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include "dirren.h" ++#include "rwsem.h" ++ ++struct au_hdentry { ++ struct dentry *hd_dentry; ++ aufs_bindex_t hd_id; ++}; ++ ++struct au_dinfo { ++ atomic_t di_generation; ++ ++ struct au_rwsem di_rwsem; ++ aufs_bindex_t di_btop, di_bbot, di_bwh, di_bdiropq; ++ unsigned char di_tmpfile; /* to allow the different name */ ++ struct au_hdentry *di_hdentry; ++} ____cacheline_aligned_in_smp; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* flags for au_lkup_dentry() */ ++#define AuLkup_ALLOW_NEG 1 ++#define AuLkup_IGNORE_PERM (1 << 1) ++#define AuLkup_DIRREN (1 << 2) ++#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name) ++#define au_fset_lkup(flags, name) \ ++ do { (flags) |= AuLkup_##name; } while (0) ++#define au_fclr_lkup(flags, name) \ ++ do { (flags) &= ~AuLkup_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_DIRREN ++#undef AuLkup_DIRREN ++#define AuLkup_DIRREN 0 ++#endif ++ ++struct au_do_lookup_args { ++ unsigned int flags; ++ mode_t type; ++ struct qstr whname, *name; ++ struct au_dr_lookup dirren; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dentry.c */ ++extern const struct dentry_operations aufs_dop, aufs_dop_noreval; ++struct au_branch; ++struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent); ++int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, ++ struct dentry *h_parent, struct au_branch *br); ++ ++int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, ++ unsigned int flags); ++int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh); ++int au_refresh_dentry(struct dentry *dentry, struct dentry *parent); ++int au_reval_dpath(struct dentry *dentry, unsigned int sigen); ++void au_refresh_dop(struct dentry *dentry, int force_reval); ++ ++/* dinfo.c */ ++void au_di_init_once(void *_di); ++struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc); ++void au_di_free(struct au_dinfo *dinfo); ++void au_di_swap(struct au_dinfo *a, struct au_dinfo *b); ++void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src); ++int au_di_init(struct dentry *dentry); ++void au_di_fin(struct dentry *dentry); ++int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink); ++ ++void di_read_lock(struct dentry *d, int flags, unsigned int lsc); ++void di_read_unlock(struct dentry *d, int flags); ++void di_downgrade_lock(struct dentry *d, int flags); ++void di_write_lock(struct dentry *d, unsigned int lsc); ++void di_write_unlock(struct dentry *d); ++void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir); ++void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir); ++void di_write_unlock2(struct dentry *d1, struct dentry *d2); ++ ++struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex); ++struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex); ++aufs_bindex_t au_dbtail(struct dentry *dentry); ++aufs_bindex_t au_dbtaildir(struct dentry *dentry); ++ ++void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_dentry); ++int au_digen_test(struct dentry *dentry, unsigned int sigen); ++int au_dbrange_test(struct dentry *dentry); ++void au_update_digen(struct dentry *dentry); ++void au_update_dbrange(struct dentry *dentry, int do_put_zero); ++void au_update_dbtop(struct dentry *dentry); ++void au_update_dbbot(struct dentry *dentry); ++int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_dinfo *au_di(struct dentry *dentry) ++{ ++ return dentry->d_fsdata; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* lock subclass for dinfo */ ++enum { ++ AuLsc_DI_CHILD, /* child first */ ++ AuLsc_DI_CHILD2, /* rename(2), link(2), and cpup at hnotify */ ++ AuLsc_DI_CHILD3, /* copyup dirs */ ++ AuLsc_DI_PARENT, ++ AuLsc_DI_PARENT2, ++ AuLsc_DI_PARENT3, ++ AuLsc_DI_TMP /* temp for replacing dinfo */ ++}; ++ ++/* ++ * di_read_lock_child, di_write_lock_child, ++ * di_read_lock_child2, di_write_lock_child2, ++ * di_read_lock_child3, di_write_lock_child3, ++ * di_read_lock_parent, di_write_lock_parent, ++ * di_read_lock_parent2, di_write_lock_parent2, ++ * di_read_lock_parent3, di_write_lock_parent3, ++ */ ++#define AuReadLockFunc(name, lsc) \ ++static inline void di_read_lock_##name(struct dentry *d, int flags) \ ++{ di_read_lock(d, flags, AuLsc_DI_##lsc); } ++ ++#define AuWriteLockFunc(name, lsc) \ ++static inline void di_write_lock_##name(struct dentry *d) \ ++{ di_write_lock(d, AuLsc_DI_##lsc); } ++ ++#define AuRWLockFuncs(name, lsc) \ ++ AuReadLockFunc(name, lsc) \ ++ AuWriteLockFunc(name, lsc) ++ ++AuRWLockFuncs(child, CHILD); ++AuRWLockFuncs(child2, CHILD2); ++AuRWLockFuncs(child3, CHILD3); ++AuRWLockFuncs(parent, PARENT); ++AuRWLockFuncs(parent2, PARENT2); ++AuRWLockFuncs(parent3, PARENT3); ++ ++#undef AuReadLockFunc ++#undef AuWriteLockFunc ++#undef AuRWLockFuncs ++ ++#define DiMustNoWaiters(d) AuRwMustNoWaiters(&au_di(d)->di_rwsem) ++#define DiMustAnyLock(d) AuRwMustAnyLock(&au_di(d)->di_rwsem) ++#define DiMustWriteLock(d) AuRwMustWriteLock(&au_di(d)->di_rwsem) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* todo: memory barrier? */ ++static inline unsigned int au_digen(struct dentry *d) ++{ ++ return atomic_read(&au_di(d)->di_generation); ++} ++ ++static inline void au_h_dentry_init(struct au_hdentry *hdentry) ++{ ++ hdentry->hd_dentry = NULL; ++} ++ ++static inline struct au_hdentry *au_hdentry(struct au_dinfo *di, ++ aufs_bindex_t bindex) ++{ ++ return di->di_hdentry + bindex; ++} ++ ++static inline void au_hdput(struct au_hdentry *hd) ++{ ++ if (hd) ++ dput(hd->hd_dentry); ++} ++ ++static inline aufs_bindex_t au_dbtop(struct dentry *dentry) ++{ ++ DiMustAnyLock(dentry); ++ return au_di(dentry)->di_btop; ++} ++ ++static inline aufs_bindex_t au_dbbot(struct dentry *dentry) ++{ ++ DiMustAnyLock(dentry); ++ return au_di(dentry)->di_bbot; ++} ++ ++static inline aufs_bindex_t au_dbwh(struct dentry *dentry) ++{ ++ DiMustAnyLock(dentry); ++ return au_di(dentry)->di_bwh; ++} ++ ++static inline aufs_bindex_t au_dbdiropq(struct dentry *dentry) ++{ ++ DiMustAnyLock(dentry); ++ return au_di(dentry)->di_bdiropq; ++} ++ ++/* todo: hard/soft set? */ ++static inline void au_set_dbtop(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ DiMustWriteLock(dentry); ++ au_di(dentry)->di_btop = bindex; ++} ++ ++static inline void au_set_dbbot(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ DiMustWriteLock(dentry); ++ au_di(dentry)->di_bbot = bindex; ++} ++ ++static inline void au_set_dbwh(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ DiMustWriteLock(dentry); ++ /* dbwh can be outside of btop - bbot range */ ++ au_di(dentry)->di_bwh = bindex; ++} ++ ++static inline void au_set_dbdiropq(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ DiMustWriteLock(dentry); ++ au_di(dentry)->di_bdiropq = bindex; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_HNOTIFY ++static inline void au_digen_dec(struct dentry *d) ++{ ++ atomic_dec(&au_di(d)->di_generation); ++} ++ ++static inline void au_hn_di_reinit(struct dentry *dentry) ++{ ++ dentry->d_fsdata = NULL; ++} ++#else ++AuStubVoid(au_hn_di_reinit, struct dentry *dentry __maybe_unused) ++#endif /* CONFIG_AUFS_HNOTIFY */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DENTRY_H__ */ +diff --git a/fs/aufs/dinfo.c b/fs/aufs/dinfo.c +new file mode 100644 +index 000000000000..f10b8f0b0b10 +--- /dev/null ++++ b/fs/aufs/dinfo.c +@@ -0,0 +1,541 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * dentry private data ++ */ ++ ++#include "aufs.h" ++ ++void au_di_init_once(void *_dinfo) ++{ ++ struct au_dinfo *dinfo = _dinfo; ++ ++ au_rw_init(&dinfo->di_rwsem); ++} ++ ++struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc) ++{ ++ struct au_dinfo *dinfo; ++ int nbr, i; ++ ++ dinfo = au_cache_alloc_dinfo(); ++ if (unlikely(!dinfo)) ++ goto out; ++ ++ nbr = au_sbbot(sb) + 1; ++ if (nbr <= 0) ++ nbr = 1; ++ dinfo->di_hdentry = kcalloc(nbr, sizeof(*dinfo->di_hdentry), GFP_NOFS); ++ if (dinfo->di_hdentry) { ++ au_rw_write_lock_nested(&dinfo->di_rwsem, lsc); ++ dinfo->di_btop = -1; ++ dinfo->di_bbot = -1; ++ dinfo->di_bwh = -1; ++ dinfo->di_bdiropq = -1; ++ dinfo->di_tmpfile = 0; ++ for (i = 0; i < nbr; i++) ++ dinfo->di_hdentry[i].hd_id = -1; ++ goto out; ++ } ++ ++ au_cache_free_dinfo(dinfo); ++ dinfo = NULL; ++ ++out: ++ return dinfo; ++} ++ ++void au_di_free(struct au_dinfo *dinfo) ++{ ++ struct au_hdentry *p; ++ aufs_bindex_t bbot, bindex; ++ ++ /* dentry may not be revalidated */ ++ bindex = dinfo->di_btop; ++ if (bindex >= 0) { ++ bbot = dinfo->di_bbot; ++ p = au_hdentry(dinfo, bindex); ++ while (bindex++ <= bbot) ++ au_hdput(p++); ++ } ++ kfree(dinfo->di_hdentry); ++ au_cache_free_dinfo(dinfo); ++} ++ ++void au_di_swap(struct au_dinfo *a, struct au_dinfo *b) ++{ ++ struct au_hdentry *p; ++ aufs_bindex_t bi; ++ ++ AuRwMustWriteLock(&a->di_rwsem); ++ AuRwMustWriteLock(&b->di_rwsem); ++ ++#define DiSwap(v, name) \ ++ do { \ ++ v = a->di_##name; \ ++ a->di_##name = b->di_##name; \ ++ b->di_##name = v; \ ++ } while (0) ++ ++ DiSwap(p, hdentry); ++ DiSwap(bi, btop); ++ DiSwap(bi, bbot); ++ DiSwap(bi, bwh); ++ DiSwap(bi, bdiropq); ++ /* smp_mb(); */ ++ ++#undef DiSwap ++} ++ ++void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src) ++{ ++ AuRwMustWriteLock(&dst->di_rwsem); ++ AuRwMustWriteLock(&src->di_rwsem); ++ ++ dst->di_btop = src->di_btop; ++ dst->di_bbot = src->di_bbot; ++ dst->di_bwh = src->di_bwh; ++ dst->di_bdiropq = src->di_bdiropq; ++ /* smp_mb(); */ ++} ++ ++int au_di_init(struct dentry *dentry) ++{ ++ int err; ++ struct super_block *sb; ++ struct au_dinfo *dinfo; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ dinfo = au_di_alloc(sb, AuLsc_DI_CHILD); ++ if (dinfo) { ++ atomic_set(&dinfo->di_generation, au_sigen(sb)); ++ /* smp_mb(); */ /* atomic_set */ ++ dentry->d_fsdata = dinfo; ++ } else ++ err = -ENOMEM; ++ ++ return err; ++} ++ ++void au_di_fin(struct dentry *dentry) ++{ ++ struct au_dinfo *dinfo; ++ ++ dinfo = au_di(dentry); ++ AuRwDestroy(&dinfo->di_rwsem); ++ au_di_free(dinfo); ++} ++ ++int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink) ++{ ++ int err, sz; ++ struct au_hdentry *hdp; ++ ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ err = -ENOMEM; ++ sz = sizeof(*hdp) * (dinfo->di_bbot + 1); ++ if (!sz) ++ sz = sizeof(*hdp); ++ hdp = au_kzrealloc(dinfo->di_hdentry, sz, sizeof(*hdp) * nbr, GFP_NOFS, ++ may_shrink); ++ if (hdp) { ++ dinfo->di_hdentry = hdp; ++ err = 0; ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void do_ii_write_lock(struct inode *inode, unsigned int lsc) ++{ ++ switch (lsc) { ++ case AuLsc_DI_CHILD: ++ ii_write_lock_child(inode); ++ break; ++ case AuLsc_DI_CHILD2: ++ ii_write_lock_child2(inode); ++ break; ++ case AuLsc_DI_CHILD3: ++ ii_write_lock_child3(inode); ++ break; ++ case AuLsc_DI_PARENT: ++ ii_write_lock_parent(inode); ++ break; ++ case AuLsc_DI_PARENT2: ++ ii_write_lock_parent2(inode); ++ break; ++ case AuLsc_DI_PARENT3: ++ ii_write_lock_parent3(inode); ++ break; ++ default: ++ BUG(); ++ } ++} ++ ++static void do_ii_read_lock(struct inode *inode, unsigned int lsc) ++{ ++ switch (lsc) { ++ case AuLsc_DI_CHILD: ++ ii_read_lock_child(inode); ++ break; ++ case AuLsc_DI_CHILD2: ++ ii_read_lock_child2(inode); ++ break; ++ case AuLsc_DI_CHILD3: ++ ii_read_lock_child3(inode); ++ break; ++ case AuLsc_DI_PARENT: ++ ii_read_lock_parent(inode); ++ break; ++ case AuLsc_DI_PARENT2: ++ ii_read_lock_parent2(inode); ++ break; ++ case AuLsc_DI_PARENT3: ++ ii_read_lock_parent3(inode); ++ break; ++ default: ++ BUG(); ++ } ++} ++ ++void di_read_lock(struct dentry *d, int flags, unsigned int lsc) ++{ ++ struct inode *inode; ++ ++ au_rw_read_lock_nested(&au_di(d)->di_rwsem, lsc); ++ if (d_really_is_positive(d)) { ++ inode = d_inode(d); ++ if (au_ftest_lock(flags, IW)) ++ do_ii_write_lock(inode, lsc); ++ else if (au_ftest_lock(flags, IR)) ++ do_ii_read_lock(inode, lsc); ++ } ++} ++ ++void di_read_unlock(struct dentry *d, int flags) ++{ ++ struct inode *inode; ++ ++ if (d_really_is_positive(d)) { ++ inode = d_inode(d); ++ if (au_ftest_lock(flags, IW)) { ++ au_dbg_verify_dinode(d); ++ ii_write_unlock(inode); ++ } else if (au_ftest_lock(flags, IR)) { ++ au_dbg_verify_dinode(d); ++ ii_read_unlock(inode); ++ } ++ } ++ au_rw_read_unlock(&au_di(d)->di_rwsem); ++} ++ ++void di_downgrade_lock(struct dentry *d, int flags) ++{ ++ if (d_really_is_positive(d) && au_ftest_lock(flags, IR)) ++ ii_downgrade_lock(d_inode(d)); ++ au_rw_dgrade_lock(&au_di(d)->di_rwsem); ++} ++ ++void di_write_lock(struct dentry *d, unsigned int lsc) ++{ ++ au_rw_write_lock_nested(&au_di(d)->di_rwsem, lsc); ++ if (d_really_is_positive(d)) ++ do_ii_write_lock(d_inode(d), lsc); ++} ++ ++void di_write_unlock(struct dentry *d) ++{ ++ au_dbg_verify_dinode(d); ++ if (d_really_is_positive(d)) ++ ii_write_unlock(d_inode(d)); ++ au_rw_write_unlock(&au_di(d)->di_rwsem); ++} ++ ++void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir) ++{ ++ AuDebugOn(d1 == d2 ++ || d_inode(d1) == d_inode(d2) ++ || d1->d_sb != d2->d_sb); ++ ++ if ((isdir && au_test_subdir(d1, d2)) ++ || d1 < d2) { ++ di_write_lock_child(d1); ++ di_write_lock_child2(d2); ++ } else { ++ di_write_lock_child(d2); ++ di_write_lock_child2(d1); ++ } ++} ++ ++void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir) ++{ ++ AuDebugOn(d1 == d2 ++ || d_inode(d1) == d_inode(d2) ++ || d1->d_sb != d2->d_sb); ++ ++ if ((isdir && au_test_subdir(d1, d2)) ++ || d1 < d2) { ++ di_write_lock_parent(d1); ++ di_write_lock_parent2(d2); ++ } else { ++ di_write_lock_parent(d2); ++ di_write_lock_parent2(d1); ++ } ++} ++ ++void di_write_unlock2(struct dentry *d1, struct dentry *d2) ++{ ++ di_write_unlock(d1); ++ if (d_inode(d1) == d_inode(d2)) ++ au_rw_write_unlock(&au_di(d2)->di_rwsem); ++ else ++ di_write_unlock(d2); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ struct dentry *d; ++ ++ DiMustAnyLock(dentry); ++ ++ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) ++ return NULL; ++ AuDebugOn(bindex < 0); ++ d = au_hdentry(au_di(dentry), bindex)->hd_dentry; ++ AuDebugOn(d && au_dcount(d) <= 0); ++ return d; ++} ++ ++/* ++ * extended version of au_h_dptr(). ++ * returns a hashed and positive (or linkable) h_dentry in bindex, NULL, or ++ * error. ++ */ ++struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ struct dentry *h_dentry; ++ struct inode *inode, *h_inode; ++ ++ AuDebugOn(d_really_is_negative(dentry)); ++ ++ h_dentry = NULL; ++ if (au_dbtop(dentry) <= bindex ++ && bindex <= au_dbbot(dentry)) ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry && !au_d_linkable(h_dentry)) { ++ dget(h_dentry); ++ goto out; /* success */ ++ } ++ ++ inode = d_inode(dentry); ++ AuDebugOn(bindex < au_ibtop(inode)); ++ AuDebugOn(au_ibbot(inode) < bindex); ++ h_inode = au_h_iptr(inode, bindex); ++ h_dentry = d_find_alias(h_inode); ++ if (h_dentry) { ++ if (!IS_ERR(h_dentry)) { ++ if (!au_d_linkable(h_dentry)) ++ goto out; /* success */ ++ dput(h_dentry); ++ } else ++ goto out; ++ } ++ ++ if (au_opt_test(au_mntflags(dentry->d_sb), PLINK)) { ++ h_dentry = au_plink_lkup(inode, bindex); ++ AuDebugOn(!h_dentry); ++ if (!IS_ERR(h_dentry)) { ++ if (!au_d_hashed_positive(h_dentry)) ++ goto out; /* success */ ++ dput(h_dentry); ++ h_dentry = NULL; ++ } ++ } ++ ++out: ++ AuDbgDentry(h_dentry); ++ return h_dentry; ++} ++ ++aufs_bindex_t au_dbtail(struct dentry *dentry) ++{ ++ aufs_bindex_t bbot, bwh; ++ ++ bbot = au_dbbot(dentry); ++ if (0 <= bbot) { ++ bwh = au_dbwh(dentry); ++ if (!bwh) ++ return bwh; ++ if (0 < bwh && bwh < bbot) ++ return bwh - 1; ++ } ++ return bbot; ++} ++ ++aufs_bindex_t au_dbtaildir(struct dentry *dentry) ++{ ++ aufs_bindex_t bbot, bopq; ++ ++ bbot = au_dbtail(dentry); ++ if (0 <= bbot) { ++ bopq = au_dbdiropq(dentry); ++ if (0 <= bopq && bopq < bbot) ++ bbot = bopq; ++ } ++ return bbot; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_dentry) ++{ ++ struct au_dinfo *dinfo; ++ struct au_hdentry *hd; ++ struct au_branch *br; ++ ++ DiMustWriteLock(dentry); ++ ++ dinfo = au_di(dentry); ++ hd = au_hdentry(dinfo, bindex); ++ au_hdput(hd); ++ hd->hd_dentry = h_dentry; ++ if (h_dentry) { ++ br = au_sbr(dentry->d_sb, bindex); ++ hd->hd_id = br->br_id; ++ } ++} ++ ++int au_dbrange_test(struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t btop, bbot; ++ ++ err = 0; ++ btop = au_dbtop(dentry); ++ bbot = au_dbbot(dentry); ++ if (btop >= 0) ++ AuDebugOn(bbot < 0 && btop > bbot); ++ else { ++ err = -EIO; ++ AuDebugOn(bbot >= 0); ++ } ++ ++ return err; ++} ++ ++int au_digen_test(struct dentry *dentry, unsigned int sigen) ++{ ++ int err; ++ ++ err = 0; ++ if (unlikely(au_digen(dentry) != sigen ++ || au_iigen_test(d_inode(dentry), sigen))) ++ err = -EIO; ++ ++ return err; ++} ++ ++void au_update_digen(struct dentry *dentry) ++{ ++ atomic_set(&au_di(dentry)->di_generation, au_sigen(dentry->d_sb)); ++ /* smp_mb(); */ /* atomic_set */ ++} ++ ++void au_update_dbrange(struct dentry *dentry, int do_put_zero) ++{ ++ struct au_dinfo *dinfo; ++ struct dentry *h_d; ++ struct au_hdentry *hdp; ++ aufs_bindex_t bindex, bbot; ++ ++ DiMustWriteLock(dentry); ++ ++ dinfo = au_di(dentry); ++ if (!dinfo || dinfo->di_btop < 0) ++ return; ++ ++ if (do_put_zero) { ++ bbot = dinfo->di_bbot; ++ bindex = dinfo->di_btop; ++ hdp = au_hdentry(dinfo, bindex); ++ for (; bindex <= bbot; bindex++, hdp++) { ++ h_d = hdp->hd_dentry; ++ if (h_d && d_is_negative(h_d)) ++ au_set_h_dptr(dentry, bindex, NULL); ++ } ++ } ++ ++ dinfo->di_btop = 0; ++ hdp = au_hdentry(dinfo, dinfo->di_btop); ++ for (; dinfo->di_btop <= dinfo->di_bbot; dinfo->di_btop++, hdp++) ++ if (hdp->hd_dentry) ++ break; ++ if (dinfo->di_btop > dinfo->di_bbot) { ++ dinfo->di_btop = -1; ++ dinfo->di_bbot = -1; ++ return; ++ } ++ ++ hdp = au_hdentry(dinfo, dinfo->di_bbot); ++ for (; dinfo->di_bbot >= 0; dinfo->di_bbot--, hdp--) ++ if (hdp->hd_dentry) ++ break; ++ AuDebugOn(dinfo->di_btop > dinfo->di_bbot || dinfo->di_bbot < 0); ++} ++ ++void au_update_dbtop(struct dentry *dentry) ++{ ++ aufs_bindex_t bindex, bbot; ++ struct dentry *h_dentry; ++ ++ bbot = au_dbbot(dentry); ++ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ if (d_is_positive(h_dentry)) { ++ au_set_dbtop(dentry, bindex); ++ return; ++ } ++ au_set_h_dptr(dentry, bindex, NULL); ++ } ++} ++ ++void au_update_dbbot(struct dentry *dentry) ++{ ++ aufs_bindex_t bindex, btop; ++ struct dentry *h_dentry; ++ ++ btop = au_dbtop(dentry); ++ for (bindex = au_dbbot(dentry); bindex >= btop; bindex--) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ if (d_is_positive(h_dentry)) { ++ au_set_dbbot(dentry, bindex); ++ return; ++ } ++ au_set_h_dptr(dentry, bindex, NULL); ++ } ++} ++ ++int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry) ++{ ++ aufs_bindex_t bindex, bbot; ++ ++ bbot = au_dbbot(dentry); ++ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) ++ if (au_h_dptr(dentry, bindex) == h_dentry) ++ return bindex; ++ return -1; ++} +diff --git a/fs/aufs/dir.c b/fs/aufs/dir.c +new file mode 100644 +index 000000000000..1d2879e08a54 +--- /dev/null ++++ b/fs/aufs/dir.c +@@ -0,0 +1,749 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * directory operations ++ */ ++ ++#include ++#include "aufs.h" ++ ++void au_add_nlink(struct inode *dir, struct inode *h_dir) ++{ ++ unsigned int nlink; ++ ++ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); ++ ++ nlink = dir->i_nlink; ++ nlink += h_dir->i_nlink - 2; ++ if (h_dir->i_nlink < 2) ++ nlink += 2; ++ smp_mb(); /* for i_nlink */ ++ /* 0 can happen in revaliding */ ++ set_nlink(dir, nlink); ++} ++ ++void au_sub_nlink(struct inode *dir, struct inode *h_dir) ++{ ++ unsigned int nlink; ++ ++ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); ++ ++ nlink = dir->i_nlink; ++ nlink -= h_dir->i_nlink - 2; ++ if (h_dir->i_nlink < 2) ++ nlink -= 2; ++ smp_mb(); /* for i_nlink */ ++ /* nlink == 0 means the branch-fs is broken */ ++ set_nlink(dir, nlink); ++} ++ ++loff_t au_dir_size(struct file *file, struct dentry *dentry) ++{ ++ loff_t sz; ++ aufs_bindex_t bindex, bbot; ++ struct file *h_file; ++ struct dentry *h_dentry; ++ ++ sz = 0; ++ if (file) { ++ AuDebugOn(!d_is_dir(file->f_path.dentry)); ++ ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); ++ bindex <= bbot && sz < KMALLOC_MAX_SIZE; ++ bindex++) { ++ h_file = au_hf_dir(file, bindex); ++ if (h_file && file_inode(h_file)) ++ sz += vfsub_f_size_read(h_file); ++ } ++ } else { ++ AuDebugOn(!dentry); ++ AuDebugOn(!d_is_dir(dentry)); ++ ++ bbot = au_dbtaildir(dentry); ++ for (bindex = au_dbtop(dentry); ++ bindex <= bbot && sz < KMALLOC_MAX_SIZE; ++ bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry && d_is_positive(h_dentry)) ++ sz += i_size_read(d_inode(h_dentry)); ++ } ++ } ++ if (sz < KMALLOC_MAX_SIZE) ++ sz = roundup_pow_of_two(sz); ++ if (sz > KMALLOC_MAX_SIZE) ++ sz = KMALLOC_MAX_SIZE; ++ else if (sz < NAME_MAX) { ++ BUILD_BUG_ON(AUFS_RDBLK_DEF < NAME_MAX); ++ sz = AUFS_RDBLK_DEF; ++ } ++ return sz; ++} ++ ++struct au_dir_ts_arg { ++ struct dentry *dentry; ++ aufs_bindex_t brid; ++}; ++ ++static void au_do_dir_ts(void *arg) ++{ ++ struct au_dir_ts_arg *a = arg; ++ struct au_dtime dt; ++ struct path h_path; ++ struct inode *dir, *h_dir; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_hinode *hdir; ++ int err; ++ aufs_bindex_t btop, bindex; ++ ++ sb = a->dentry->d_sb; ++ if (d_really_is_negative(a->dentry)) ++ goto out; ++ /* no dir->i_mutex lock */ ++ aufs_read_lock(a->dentry, AuLock_DW); /* noflush */ ++ ++ dir = d_inode(a->dentry); ++ btop = au_ibtop(dir); ++ bindex = au_br_index(sb, a->brid); ++ if (bindex < btop) ++ goto out_unlock; ++ ++ br = au_sbr(sb, bindex); ++ h_path.dentry = au_h_dptr(a->dentry, bindex); ++ if (!h_path.dentry) ++ goto out_unlock; ++ h_path.mnt = au_br_mnt(br); ++ au_dtime_store(&dt, a->dentry, &h_path); ++ ++ br = au_sbr(sb, btop); ++ if (!au_br_writable(br->br_perm)) ++ goto out_unlock; ++ h_path.dentry = au_h_dptr(a->dentry, btop); ++ h_path.mnt = au_br_mnt(br); ++ err = vfsub_mnt_want_write(h_path.mnt); ++ if (err) ++ goto out_unlock; ++ hdir = au_hi(dir, btop); ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ h_dir = au_h_iptr(dir, btop); ++ if (h_dir->i_nlink ++ && timespec64_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) { ++ dt.dt_h_path = h_path; ++ au_dtime_revert(&dt); ++ } ++ au_hn_inode_unlock(hdir); ++ vfsub_mnt_drop_write(h_path.mnt); ++ au_cpup_attr_timesizes(dir); ++ ++out_unlock: ++ aufs_read_unlock(a->dentry, AuLock_DW); ++out: ++ dput(a->dentry); ++ au_nwt_done(&au_sbi(sb)->si_nowait); ++ kfree(arg); ++} ++ ++void au_dir_ts(struct inode *dir, aufs_bindex_t bindex) ++{ ++ int perm, wkq_err; ++ aufs_bindex_t btop; ++ struct au_dir_ts_arg *arg; ++ struct dentry *dentry; ++ struct super_block *sb; ++ ++ IMustLock(dir); ++ ++ dentry = d_find_any_alias(dir); ++ AuDebugOn(!dentry); ++ sb = dentry->d_sb; ++ btop = au_ibtop(dir); ++ if (btop == bindex) { ++ au_cpup_attr_timesizes(dir); ++ goto out; ++ } ++ ++ perm = au_sbr_perm(sb, btop); ++ if (!au_br_writable(perm)) ++ goto out; ++ ++ arg = kmalloc(sizeof(*arg), GFP_NOFS); ++ if (!arg) ++ goto out; ++ ++ arg->dentry = dget(dentry); /* will be dput-ted by au_do_dir_ts() */ ++ arg->brid = au_sbr_id(sb, bindex); ++ wkq_err = au_wkq_nowait(au_do_dir_ts, arg, sb, /*flags*/0); ++ if (unlikely(wkq_err)) { ++ pr_err("wkq %d\n", wkq_err); ++ dput(dentry); ++ kfree(arg); ++ } ++ ++out: ++ dput(dentry); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int reopen_dir(struct file *file) ++{ ++ int err; ++ unsigned int flags; ++ aufs_bindex_t bindex, btail, btop; ++ struct dentry *dentry, *h_dentry; ++ struct file *h_file; ++ ++ /* open all lower dirs */ ++ dentry = file->f_path.dentry; ++ btop = au_dbtop(dentry); ++ for (bindex = au_fbtop(file); bindex < btop; bindex++) ++ au_set_h_fptr(file, bindex, NULL); ++ au_set_fbtop(file, btop); ++ ++ btail = au_dbtaildir(dentry); ++ for (bindex = au_fbbot_dir(file); btail < bindex; bindex--) ++ au_set_h_fptr(file, bindex, NULL); ++ au_set_fbbot_dir(file, btail); ++ ++ flags = vfsub_file_flags(file); ++ for (bindex = btop; bindex <= btail; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ h_file = au_hf_dir(file, bindex); ++ if (h_file) ++ continue; ++ ++ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; /* close all? */ ++ au_set_h_fptr(file, bindex, h_file); ++ } ++ au_update_figen(file); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ err = 0; ++ ++out: ++ return err; ++} ++ ++static int do_open_dir(struct file *file, int flags, struct file *h_file) ++{ ++ int err; ++ aufs_bindex_t bindex, btail; ++ struct dentry *dentry, *h_dentry; ++ struct vfsmount *mnt; ++ ++ FiMustWriteLock(file); ++ AuDebugOn(h_file); ++ ++ err = 0; ++ mnt = file->f_path.mnt; ++ dentry = file->f_path.dentry; ++ file->f_version = inode_query_iversion(d_inode(dentry)); ++ bindex = au_dbtop(dentry); ++ au_set_fbtop(file, bindex); ++ btail = au_dbtaildir(dentry); ++ au_set_fbbot_dir(file, btail); ++ for (; !err && bindex <= btail; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ ++ err = vfsub_test_mntns(mnt, h_dentry->d_sb); ++ if (unlikely(err)) ++ break; ++ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); ++ if (IS_ERR(h_file)) { ++ err = PTR_ERR(h_file); ++ break; ++ } ++ au_set_h_fptr(file, bindex, h_file); ++ } ++ au_update_figen(file); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ if (!err) ++ return 0; /* success */ ++ ++ /* close all */ ++ for (bindex = au_fbtop(file); bindex <= btail; bindex++) ++ au_set_h_fptr(file, bindex, NULL); ++ au_set_fbtop(file, -1); ++ au_set_fbbot_dir(file, -1); ++ ++ return err; ++} ++ ++static int aufs_open_dir(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ int err; ++ struct super_block *sb; ++ struct au_fidir *fidir; ++ ++ err = -ENOMEM; ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ fidir = au_fidir_alloc(sb); ++ if (fidir) { ++ struct au_do_open_args args = { ++ .open = do_open_dir, ++ .fidir = fidir ++ }; ++ err = au_do_open(file, &args); ++ if (unlikely(err)) ++ kfree(fidir); ++ } ++ si_read_unlock(sb); ++ return err; ++} ++ ++static int aufs_release_dir(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ struct au_vdir *vdir_cache; ++ struct au_finfo *finfo; ++ struct au_fidir *fidir; ++ struct au_hfile *hf; ++ aufs_bindex_t bindex, bbot; ++ ++ finfo = au_fi(file); ++ fidir = finfo->fi_hdir; ++ if (fidir) { ++ au_hbl_del(&finfo->fi_hlist, ++ &au_sbi(file->f_path.dentry->d_sb)->si_files); ++ vdir_cache = fidir->fd_vdir_cache; /* lock-free */ ++ if (vdir_cache) ++ au_vdir_free(vdir_cache); ++ ++ bindex = finfo->fi_btop; ++ if (bindex >= 0) { ++ hf = fidir->fd_hfile + bindex; ++ /* ++ * calls fput() instead of filp_close(), ++ * since no dnotify or lock for the lower file. ++ */ ++ bbot = fidir->fd_bbot; ++ for (; bindex <= bbot; bindex++, hf++) ++ if (hf->hf_file) ++ au_hfput(hf, /*execed*/0); ++ } ++ kfree(fidir); ++ finfo->fi_hdir = NULL; ++ } ++ au_finfo_fin(file); ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_flush_dir(struct file *file, fl_owner_t id) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct file *h_file; ++ ++ err = 0; ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { ++ h_file = au_hf_dir(file, bindex); ++ if (h_file) ++ err = vfsub_flush(h_file, id); ++ } ++ return err; ++} ++ ++static int aufs_flush_dir(struct file *file, fl_owner_t id) ++{ ++ return au_do_flush(file, id, au_do_flush_dir); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_fsync_dir_no_file(struct dentry *dentry, int datasync) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ bbot = au_dbbot(dentry); ++ for (bindex = au_dbtop(dentry); !err && bindex <= bbot; bindex++) { ++ struct path h_path; ++ ++ if (au_test_ro(sb, bindex, inode)) ++ continue; ++ h_path.dentry = au_h_dptr(dentry, bindex); ++ if (!h_path.dentry) ++ continue; ++ ++ h_path.mnt = au_sbr_mnt(sb, bindex); ++ err = vfsub_fsync(NULL, &h_path, datasync); ++ } ++ ++ return err; ++} ++ ++static int au_do_fsync_dir(struct file *file, int datasync) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct file *h_file; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); ++ if (unlikely(err)) ++ goto out; ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { ++ h_file = au_hf_dir(file, bindex); ++ if (!h_file || au_test_ro(sb, bindex, inode)) ++ continue; ++ ++ err = vfsub_fsync(h_file, &h_file->f_path, datasync); ++ } ++ ++out: ++ return err; ++} ++ ++/* ++ * @file may be NULL ++ */ ++static int aufs_fsync_dir(struct file *file, loff_t start, loff_t end, ++ int datasync) ++{ ++ int err; ++ struct dentry *dentry; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ err = 0; ++ dentry = file->f_path.dentry; ++ inode = d_inode(dentry); ++ inode_lock(inode); ++ sb = dentry->d_sb; ++ si_noflush_read_lock(sb); ++ if (file) ++ err = au_do_fsync_dir(file, datasync); ++ else { ++ di_write_lock_child(dentry); ++ err = au_do_fsync_dir_no_file(dentry, datasync); ++ } ++ au_cpup_attr_timesizes(inode); ++ di_write_unlock(dentry); ++ if (file) ++ fi_write_unlock(file); ++ ++ si_read_unlock(sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_iterate_shared(struct file *file, struct dir_context *ctx) ++{ ++ int err; ++ struct dentry *dentry; ++ struct inode *inode, *h_inode; ++ struct super_block *sb; ++ ++ AuDbg("%pD, ctx{%ps, %llu}\n", file, ctx->actor, ctx->pos); ++ ++ dentry = file->f_path.dentry; ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ ++ sb = dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); ++ if (unlikely(err)) ++ goto out; ++ err = au_alive_dir(dentry); ++ if (!err) ++ err = au_vdir_init(file); ++ di_downgrade_lock(dentry, AuLock_IR); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ if (!au_test_nfsd()) { ++ err = au_vdir_fill_de(file, ctx); ++ fsstack_copy_attr_atime(inode, h_inode); ++ } else { ++ /* ++ * nfsd filldir may call lookup_one_len(), vfs_getattr(), ++ * encode_fh() and others. ++ */ ++ atomic_inc(&h_inode->i_count); ++ di_read_unlock(dentry, AuLock_IR); ++ si_read_unlock(sb); ++ err = au_vdir_fill_de(file, ctx); ++ fsstack_copy_attr_atime(inode, h_inode); ++ fi_write_unlock(file); ++ iput(h_inode); ++ ++ AuTraceErr(err); ++ return err; ++ } ++ ++out_unlock: ++ di_read_unlock(dentry, AuLock_IR); ++ fi_write_unlock(file); ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define AuTestEmpty_WHONLY 1 ++#define AuTestEmpty_CALLED (1 << 1) ++#define AuTestEmpty_SHWH (1 << 2) ++#define au_ftest_testempty(flags, name) ((flags) & AuTestEmpty_##name) ++#define au_fset_testempty(flags, name) \ ++ do { (flags) |= AuTestEmpty_##name; } while (0) ++#define au_fclr_testempty(flags, name) \ ++ do { (flags) &= ~AuTestEmpty_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_SHWH ++#undef AuTestEmpty_SHWH ++#define AuTestEmpty_SHWH 0 ++#endif ++ ++struct test_empty_arg { ++ struct dir_context ctx; ++ struct au_nhash *whlist; ++ unsigned int flags; ++ int err; ++ aufs_bindex_t bindex; ++}; ++ ++static int test_empty_cb(struct dir_context *ctx, const char *__name, ++ int namelen, loff_t offset __maybe_unused, u64 ino, ++ unsigned int d_type) ++{ ++ struct test_empty_arg *arg = container_of(ctx, struct test_empty_arg, ++ ctx); ++ char *name = (void *)__name; ++ ++ arg->err = 0; ++ au_fset_testempty(arg->flags, CALLED); ++ /* smp_mb(); */ ++ if (name[0] == '.' ++ && (namelen == 1 || (name[1] == '.' && namelen == 2))) ++ goto out; /* success */ ++ ++ if (namelen <= AUFS_WH_PFX_LEN ++ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { ++ if (au_ftest_testempty(arg->flags, WHONLY) ++ && !au_nhash_test_known_wh(arg->whlist, name, namelen)) ++ arg->err = -ENOTEMPTY; ++ goto out; ++ } ++ ++ name += AUFS_WH_PFX_LEN; ++ namelen -= AUFS_WH_PFX_LEN; ++ if (!au_nhash_test_known_wh(arg->whlist, name, namelen)) ++ arg->err = au_nhash_append_wh ++ (arg->whlist, name, namelen, ino, d_type, arg->bindex, ++ au_ftest_testempty(arg->flags, SHWH)); ++ ++out: ++ /* smp_mb(); */ ++ AuTraceErr(arg->err); ++ return arg->err; ++} ++ ++static int do_test_empty(struct dentry *dentry, struct test_empty_arg *arg) ++{ ++ int err; ++ struct file *h_file; ++ struct au_branch *br; ++ ++ h_file = au_h_open(dentry, arg->bindex, ++ O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_LARGEFILE, ++ /*file*/NULL, /*force_wr*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = 0; ++ if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) ++ && !file_inode(h_file)->i_nlink) ++ goto out_put; ++ ++ do { ++ arg->err = 0; ++ au_fclr_testempty(arg->flags, CALLED); ++ /* smp_mb(); */ ++ err = vfsub_iterate_dir(h_file, &arg->ctx); ++ if (err >= 0) ++ err = arg->err; ++ } while (!err && au_ftest_testempty(arg->flags, CALLED)); ++ ++out_put: ++ fput(h_file); ++ br = au_sbr(dentry->d_sb, arg->bindex); ++ au_lcnt_dec(&br->br_nfiles); ++out: ++ return err; ++} ++ ++struct do_test_empty_args { ++ int *errp; ++ struct dentry *dentry; ++ struct test_empty_arg *arg; ++}; ++ ++static void call_do_test_empty(void *args) ++{ ++ struct do_test_empty_args *a = args; ++ *a->errp = do_test_empty(a->dentry, a->arg); ++} ++ ++static int sio_test_empty(struct dentry *dentry, struct test_empty_arg *arg) ++{ ++ int err, wkq_err; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ ++ h_dentry = au_h_dptr(dentry, arg->bindex); ++ h_inode = d_inode(h_dentry); ++ /* todo: i_mode changes anytime? */ ++ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); ++ err = au_test_h_perm_sio(h_inode, MAY_EXEC | MAY_READ); ++ inode_unlock_shared(h_inode); ++ if (!err) ++ err = do_test_empty(dentry, arg); ++ else { ++ struct do_test_empty_args args = { ++ .errp = &err, ++ .dentry = dentry, ++ .arg = arg ++ }; ++ unsigned int flags = arg->flags; ++ ++ wkq_err = au_wkq_wait(call_do_test_empty, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ arg->flags = flags; ++ } ++ ++ return err; ++} ++ ++int au_test_empty_lower(struct dentry *dentry) ++{ ++ int err; ++ unsigned int rdhash; ++ aufs_bindex_t bindex, btop, btail; ++ struct au_nhash whlist; ++ struct test_empty_arg arg = { ++ .ctx = { ++ .actor = test_empty_cb ++ } ++ }; ++ int (*test_empty)(struct dentry *dentry, struct test_empty_arg *arg); ++ ++ SiMustAnyLock(dentry->d_sb); ++ ++ rdhash = au_sbi(dentry->d_sb)->si_rdhash; ++ if (!rdhash) ++ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, dentry)); ++ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ ++ arg.flags = 0; ++ arg.whlist = &whlist; ++ btop = au_dbtop(dentry); ++ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) ++ au_fset_testempty(arg.flags, SHWH); ++ test_empty = do_test_empty; ++ if (au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1)) ++ test_empty = sio_test_empty; ++ arg.bindex = btop; ++ err = test_empty(dentry, &arg); ++ if (unlikely(err)) ++ goto out_whlist; ++ ++ au_fset_testempty(arg.flags, WHONLY); ++ btail = au_dbtaildir(dentry); ++ for (bindex = btop + 1; !err && bindex <= btail; bindex++) { ++ struct dentry *h_dentry; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry && d_is_positive(h_dentry)) { ++ arg.bindex = bindex; ++ err = test_empty(dentry, &arg); ++ } ++ } ++ ++out_whlist: ++ au_nhash_wh_free(&whlist); ++out: ++ return err; ++} ++ ++int au_test_empty(struct dentry *dentry, struct au_nhash *whlist) ++{ ++ int err; ++ struct test_empty_arg arg = { ++ .ctx = { ++ .actor = test_empty_cb ++ } ++ }; ++ aufs_bindex_t bindex, btail; ++ ++ err = 0; ++ arg.whlist = whlist; ++ arg.flags = AuTestEmpty_WHONLY; ++ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) ++ au_fset_testempty(arg.flags, SHWH); ++ btail = au_dbtaildir(dentry); ++ for (bindex = au_dbtop(dentry); !err && bindex <= btail; bindex++) { ++ struct dentry *h_dentry; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry && d_is_positive(h_dentry)) { ++ arg.bindex = bindex; ++ err = sio_test_empty(dentry, &arg); ++ } ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++const struct file_operations aufs_dir_fop = { ++ .owner = THIS_MODULE, ++ .llseek = default_llseek, ++ .read = generic_read_dir, ++ .iterate_shared = aufs_iterate_shared, ++ .unlocked_ioctl = aufs_ioctl_dir, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = aufs_compat_ioctl_dir, ++#endif ++ .open = aufs_open_dir, ++ .release = aufs_release_dir, ++ .flush = aufs_flush_dir, ++ .fsync = aufs_fsync_dir ++}; +diff --git a/fs/aufs/dir.h b/fs/aufs/dir.h +new file mode 100644 +index 000000000000..96e235b48f2b +--- /dev/null ++++ b/fs/aufs/dir.h +@@ -0,0 +1,119 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * directory operations ++ */ ++ ++#ifndef __AUFS_DIR_H__ ++#define __AUFS_DIR_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* need to be faster and smaller */ ++ ++struct au_nhash { ++ unsigned int nh_num; ++ struct hlist_head *nh_head; ++}; ++ ++struct au_vdir_destr { ++ unsigned char len; ++ unsigned char name[0]; ++} __packed; ++ ++struct au_vdir_dehstr { ++ struct hlist_node hash; ++ struct au_vdir_destr *str; ++} ____cacheline_aligned_in_smp; ++ ++struct au_vdir_de { ++ ino_t de_ino; ++ unsigned char de_type; ++ /* caution: packed */ ++ struct au_vdir_destr de_str; ++} __packed; ++ ++struct au_vdir_wh { ++ struct hlist_node wh_hash; ++#ifdef CONFIG_AUFS_SHWH ++ ino_t wh_ino; ++ aufs_bindex_t wh_bindex; ++ unsigned char wh_type; ++#else ++ aufs_bindex_t wh_bindex; ++#endif ++ /* caution: packed */ ++ struct au_vdir_destr wh_str; ++} __packed; ++ ++union au_vdir_deblk_p { ++ unsigned char *deblk; ++ struct au_vdir_de *de; ++}; ++ ++struct au_vdir { ++ unsigned char **vd_deblk; ++ unsigned long vd_nblk; ++ struct { ++ unsigned long ul; ++ union au_vdir_deblk_p p; ++ } vd_last; ++ ++ u64 vd_version; ++ unsigned int vd_deblk_sz; ++ unsigned long vd_jiffy; ++} ____cacheline_aligned_in_smp; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dir.c */ ++extern const struct file_operations aufs_dir_fop; ++void au_add_nlink(struct inode *dir, struct inode *h_dir); ++void au_sub_nlink(struct inode *dir, struct inode *h_dir); ++loff_t au_dir_size(struct file *file, struct dentry *dentry); ++void au_dir_ts(struct inode *dir, aufs_bindex_t bsrc); ++int au_test_empty_lower(struct dentry *dentry); ++int au_test_empty(struct dentry *dentry, struct au_nhash *whlist); ++ ++/* vdir.c */ ++unsigned int au_rdhash_est(loff_t sz); ++int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp); ++void au_nhash_wh_free(struct au_nhash *whlist); ++int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, ++ int limit); ++int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen); ++int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, ++ unsigned int d_type, aufs_bindex_t bindex, ++ unsigned char shwh); ++void au_vdir_free(struct au_vdir *vdir); ++int au_vdir_init(struct file *file); ++int au_vdir_fill_de(struct file *file, struct dir_context *ctx); ++ ++/* ioctl.c */ ++long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg); ++ ++#ifdef CONFIG_AUFS_RDU ++/* rdu.c */ ++long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg); ++#ifdef CONFIG_COMPAT ++long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, ++ unsigned long arg); ++#endif ++#else ++AuStub(long, au_rdu_ioctl, return -EINVAL, struct file *file, ++ unsigned int cmd, unsigned long arg) ++#ifdef CONFIG_COMPAT ++AuStub(long, au_rdu_compat_ioctl, return -EINVAL, struct file *file, ++ unsigned int cmd, unsigned long arg) ++#endif ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DIR_H__ */ +diff --git a/fs/aufs/dirren.c b/fs/aufs/dirren.c +new file mode 100644 +index 000000000000..e2273c61fd05 +--- /dev/null ++++ b/fs/aufs/dirren.c +@@ -0,0 +1,1303 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2017-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * special handling in renaming a directory ++ * in order to support looking-up the before-renamed name on the lower readonly ++ * branches ++ */ ++ ++#include ++#include "aufs.h" ++ ++static void au_dr_hino_del(struct au_dr_br *dr, struct au_dr_hino *ent) ++{ ++ int idx; ++ ++ idx = au_dr_ihash(ent->dr_h_ino); ++ au_hbl_del(&ent->dr_hnode, dr->dr_h_ino + idx); ++} ++ ++static int au_dr_hino_test_empty(struct au_dr_br *dr) ++{ ++ int ret, i; ++ struct hlist_bl_head *hbl; ++ ++ ret = 1; ++ for (i = 0; ret && i < AuDirren_NHASH; i++) { ++ hbl = dr->dr_h_ino + i; ++ hlist_bl_lock(hbl); ++ ret &= hlist_bl_empty(hbl); ++ hlist_bl_unlock(hbl); ++ } ++ ++ return ret; ++} ++ ++static struct au_dr_hino *au_dr_hino_find(struct au_dr_br *dr, ino_t ino) ++{ ++ struct au_dr_hino *found, *ent; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ int idx; ++ ++ found = NULL; ++ idx = au_dr_ihash(ino); ++ hbl = dr->dr_h_ino + idx; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) ++ if (ent->dr_h_ino == ino) { ++ found = ent; ++ break; ++ } ++ hlist_bl_unlock(hbl); ++ ++ return found; ++} ++ ++int au_dr_hino_test_add(struct au_dr_br *dr, ino_t ino, ++ struct au_dr_hino *add_ent) ++{ ++ int found, idx; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_dr_hino *ent; ++ ++ found = 0; ++ idx = au_dr_ihash(ino); ++ hbl = dr->dr_h_ino + idx; ++#if 0 ++ { ++ struct hlist_bl_node *tmp; ++ ++ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) ++ AuDbg("hi%llu\n", (unsigned long long)ent->dr_h_ino); ++ } ++#endif ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) ++ if (ent->dr_h_ino == ino) { ++ found = 1; ++ break; ++ } ++ if (!found && add_ent) ++ hlist_bl_add_head(&add_ent->dr_hnode, hbl); ++ hlist_bl_unlock(hbl); ++ ++ if (!found && add_ent) ++ AuDbg("i%llu added\n", (unsigned long long)add_ent->dr_h_ino); ++ ++ return found; ++} ++ ++void au_dr_hino_free(struct au_dr_br *dr) ++{ ++ int i; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos, *tmp; ++ struct au_dr_hino *ent; ++ ++ /* SiMustWriteLock(sb); */ ++ ++ for (i = 0; i < AuDirren_NHASH; i++) { ++ hbl = dr->dr_h_ino + i; ++ /* no spinlock since sbinfo must be write-locked */ ++ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) ++ kfree(ent); ++ INIT_HLIST_BL_HEAD(hbl); ++ } ++} ++ ++/* returns the number of inodes or an error */ ++static int au_dr_hino_store(struct super_block *sb, struct au_branch *br, ++ struct file *hinofile) ++{ ++ int err, i; ++ ssize_t ssz; ++ loff_t pos, oldsize; ++ __be64 u64; ++ struct inode *hinoinode; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *n1, *n2; ++ struct au_dr_hino *ent; ++ ++ SiMustWriteLock(sb); ++ AuDebugOn(!au_br_writable(br->br_perm)); ++ ++ hinoinode = file_inode(hinofile); ++ oldsize = i_size_read(hinoinode); ++ ++ err = 0; ++ pos = 0; ++ hbl = br->br_dirren.dr_h_ino; ++ for (i = 0; !err && i < AuDirren_NHASH; i++, hbl++) { ++ /* no bit-lock since sbinfo must be write-locked */ ++ hlist_bl_for_each_entry_safe(ent, n1, n2, hbl, dr_hnode) { ++ AuDbg("hi%llu, %pD2\n", ++ (unsigned long long)ent->dr_h_ino, hinofile); ++ u64 = cpu_to_be64(ent->dr_h_ino); ++ ssz = vfsub_write_k(hinofile, &u64, sizeof(u64), &pos); ++ if (ssz == sizeof(u64)) ++ continue; ++ ++ /* write error */ ++ pr_err("ssz %zd, %pD2\n", ssz, hinofile); ++ err = -ENOSPC; ++ if (ssz < 0) ++ err = ssz; ++ break; ++ } ++ } ++ /* regardless the error */ ++ if (pos < oldsize) { ++ err = vfsub_trunc(&hinofile->f_path, pos, /*attr*/0, hinofile); ++ AuTraceErr(err); ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_dr_hino_load(struct au_dr_br *dr, struct file *hinofile) ++{ ++ int err, hidx; ++ ssize_t ssz; ++ size_t sz, n; ++ loff_t pos; ++ uint64_t u64; ++ struct au_dr_hino *ent; ++ struct inode *hinoinode; ++ struct hlist_bl_head *hbl; ++ ++ err = 0; ++ pos = 0; ++ hbl = dr->dr_h_ino; ++ hinoinode = file_inode(hinofile); ++ sz = i_size_read(hinoinode); ++ AuDebugOn(sz % sizeof(u64)); ++ n = sz / sizeof(u64); ++ while (n--) { ++ ssz = vfsub_read_k(hinofile, &u64, sizeof(u64), &pos); ++ if (unlikely(ssz != sizeof(u64))) { ++ pr_err("ssz %zd, %pD2\n", ssz, hinofile); ++ err = -EINVAL; ++ if (ssz < 0) ++ err = ssz; ++ goto out_free; ++ } ++ ++ ent = kmalloc(sizeof(*ent), GFP_NOFS); ++ if (!ent) { ++ err = -ENOMEM; ++ AuTraceErr(err); ++ goto out_free; ++ } ++ ent->dr_h_ino = be64_to_cpu((__force __be64)u64); ++ AuDbg("hi%llu, %pD2\n", ++ (unsigned long long)ent->dr_h_ino, hinofile); ++ hidx = au_dr_ihash(ent->dr_h_ino); ++ au_hbl_add(&ent->dr_hnode, hbl + hidx); ++ } ++ goto out; /* success */ ++ ++out_free: ++ au_dr_hino_free(dr); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * @bindex/@br is a switch to distinguish whether suspending hnotify or not. ++ * @path is a switch to distinguish load and store. ++ */ ++static int au_dr_hino(struct super_block *sb, aufs_bindex_t bindex, ++ struct au_branch *br, const struct path *path) ++{ ++ int err, flags; ++ unsigned char load, suspend; ++ struct file *hinofile; ++ struct au_hinode *hdir; ++ struct inode *dir, *delegated; ++ struct path hinopath; ++ struct qstr hinoname = QSTR_INIT(AUFS_WH_DR_BRHINO, ++ sizeof(AUFS_WH_DR_BRHINO) - 1); ++ ++ AuDebugOn(bindex < 0 && !br); ++ AuDebugOn(bindex >= 0 && br); ++ ++ err = -EINVAL; ++ suspend = !br; ++ if (suspend) ++ br = au_sbr(sb, bindex); ++ load = !!path; ++ if (!load) { ++ path = &br->br_path; ++ AuDebugOn(!au_br_writable(br->br_perm)); ++ if (unlikely(!au_br_writable(br->br_perm))) ++ goto out; ++ } ++ ++ hdir = NULL; ++ if (suspend) { ++ dir = d_inode(sb->s_root); ++ hdir = au_hinode(au_ii(dir), bindex); ++ dir = hdir->hi_inode; ++ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); ++ } else { ++ dir = d_inode(path->dentry); ++ inode_lock_nested(dir, AuLsc_I_CHILD); ++ } ++ hinopath.dentry = vfsub_lkup_one(&hinoname, path->dentry); ++ err = PTR_ERR(hinopath.dentry); ++ if (IS_ERR(hinopath.dentry)) ++ goto out_unlock; ++ ++ err = 0; ++ flags = O_RDONLY; ++ if (load) { ++ if (d_is_negative(hinopath.dentry)) ++ goto out_dput; /* success */ ++ } else { ++ if (au_dr_hino_test_empty(&br->br_dirren)) { ++ if (d_is_positive(hinopath.dentry)) { ++ delegated = NULL; ++ err = vfsub_unlink(dir, &hinopath, &delegated, ++ /*force*/0); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ pr_err("ignored err %d, %pd2\n", ++ err, hinopath.dentry); ++ if (unlikely(err == -EWOULDBLOCK)) ++ iput(delegated); ++ err = 0; ++ } ++ goto out_dput; ++ } else if (!d_is_positive(hinopath.dentry)) { ++ err = vfsub_create(dir, &hinopath, 0600, ++ /*want_excl*/false); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out_dput; ++ } ++ flags = O_WRONLY; ++ } ++ hinopath.mnt = path->mnt; ++ hinofile = vfsub_dentry_open(&hinopath, flags); ++ if (suspend) ++ au_hn_inode_unlock(hdir); ++ else ++ inode_unlock(dir); ++ dput(hinopath.dentry); ++ AuTraceErrPtr(hinofile); ++ if (IS_ERR(hinofile)) { ++ err = PTR_ERR(hinofile); ++ goto out; ++ } ++ ++ if (load) ++ err = au_dr_hino_load(&br->br_dirren, hinofile); ++ else ++ err = au_dr_hino_store(sb, br, hinofile); ++ fput(hinofile); ++ goto out; ++ ++out_dput: ++ dput(hinopath.dentry); ++out_unlock: ++ if (suspend) ++ au_hn_inode_unlock(hdir); ++ else ++ inode_unlock(dir); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_dr_brid_init(struct au_dr_brid *brid, const struct path *path) ++{ ++ int err; ++ struct kstatfs kstfs; ++ dev_t dev; ++ struct dentry *dentry; ++ struct super_block *sb; ++ ++ err = vfs_statfs((void *)path, &kstfs); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out; ++ ++ /* todo: support for UUID */ ++ ++ if (kstfs.f_fsid.val[0] || kstfs.f_fsid.val[1]) { ++ brid->type = AuBrid_FSID; ++ brid->fsid = kstfs.f_fsid; ++ } else { ++ dentry = path->dentry; ++ sb = dentry->d_sb; ++ dev = sb->s_dev; ++ if (dev) { ++ brid->type = AuBrid_DEV; ++ brid->dev = dev; ++ } ++ } ++ ++out: ++ return err; ++} ++ ++int au_dr_br_init(struct super_block *sb, struct au_branch *br, ++ const struct path *path) ++{ ++ int err, i; ++ struct au_dr_br *dr; ++ struct hlist_bl_head *hbl; ++ ++ dr = &br->br_dirren; ++ hbl = dr->dr_h_ino; ++ for (i = 0; i < AuDirren_NHASH; i++, hbl++) ++ INIT_HLIST_BL_HEAD(hbl); ++ ++ err = au_dr_brid_init(&dr->dr_brid, path); ++ if (unlikely(err)) ++ goto out; ++ ++ if (au_opt_test(au_mntflags(sb), DIRREN)) ++ err = au_dr_hino(sb, /*bindex*/-1, br, path); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_dr_br_fin(struct super_block *sb, struct au_branch *br) ++{ ++ int err; ++ ++ err = 0; ++ if (au_br_writable(br->br_perm)) ++ err = au_dr_hino(sb, /*bindex*/-1, br, /*path*/NULL); ++ if (!err) ++ au_dr_hino_free(&br->br_dirren); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_brid_str(struct au_dr_brid *brid, struct inode *h_inode, ++ char *buf, size_t sz) ++{ ++ int err; ++ unsigned int major, minor; ++ char *p; ++ ++ p = buf; ++ err = snprintf(p, sz, "%d_", brid->type); ++ AuDebugOn(err > sz); ++ p += err; ++ sz -= err; ++ switch (brid->type) { ++ case AuBrid_Unset: ++ return -EINVAL; ++ case AuBrid_UUID: ++ err = snprintf(p, sz, "%pU", brid->uuid.b); ++ break; ++ case AuBrid_FSID: ++ err = snprintf(p, sz, "%08x-%08x", ++ brid->fsid.val[0], brid->fsid.val[1]); ++ break; ++ case AuBrid_DEV: ++ major = MAJOR(brid->dev); ++ minor = MINOR(brid->dev); ++ if (major <= 0xff && minor <= 0xff) ++ err = snprintf(p, sz, "%02x%02x", major, minor); ++ else ++ err = snprintf(p, sz, "%03x:%05x", major, minor); ++ break; ++ } ++ AuDebugOn(err > sz); ++ p += err; ++ sz -= err; ++ err = snprintf(p, sz, "_%llu", (unsigned long long)h_inode->i_ino); ++ AuDebugOn(err > sz); ++ p += err; ++ sz -= err; ++ ++ return p - buf; ++} ++ ++static int au_drinfo_name(struct au_branch *br, char *name, int len) ++{ ++ int rlen; ++ struct dentry *br_dentry; ++ struct inode *br_inode; ++ ++ br_dentry = au_br_dentry(br); ++ br_inode = d_inode(br_dentry); ++ rlen = au_brid_str(&br->br_dirren.dr_brid, br_inode, name, len); ++ AuDebugOn(rlen >= AUFS_DIRREN_ENV_VAL_SZ); ++ AuDebugOn(rlen > len); ++ ++ return rlen; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * from the given @h_dentry, construct drinfo at @*fdata. ++ * when the size of @*fdata is not enough, reallocate and return new @fdata and ++ * @allocated. ++ */ ++static int au_drinfo_construct(struct au_drinfo_fdata **fdata, ++ struct dentry *h_dentry, ++ unsigned char *allocated) ++{ ++ int err, v; ++ struct au_drinfo_fdata *f, *p; ++ struct au_drinfo *drinfo; ++ struct inode *h_inode; ++ struct qstr *qname; ++ ++ err = 0; ++ f = *fdata; ++ h_inode = d_inode(h_dentry); ++ qname = &h_dentry->d_name; ++ drinfo = &f->drinfo; ++ drinfo->ino = (__force uint64_t)cpu_to_be64(h_inode->i_ino); ++ drinfo->oldnamelen = qname->len; ++ if (*allocated < sizeof(*f) + qname->len) { ++ v = roundup_pow_of_two(*allocated + qname->len); ++ p = au_krealloc(f, v, GFP_NOFS, /*may_shrink*/0); ++ if (unlikely(!p)) { ++ err = -ENOMEM; ++ AuTraceErr(err); ++ goto out; ++ } ++ f = p; ++ *fdata = f; ++ *allocated = v; ++ drinfo = &f->drinfo; ++ } ++ memcpy(drinfo->oldname, qname->name, qname->len); ++ AuDbg("i%llu, %.*s\n", ++ be64_to_cpu((__force __be64)drinfo->ino), drinfo->oldnamelen, ++ drinfo->oldname); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* callers have to free the return value */ ++static struct au_drinfo *au_drinfo_read_k(struct file *file, ino_t h_ino) ++{ ++ struct au_drinfo *ret, *drinfo; ++ struct au_drinfo_fdata fdata; ++ int len; ++ loff_t pos; ++ ssize_t ssz; ++ ++ ret = ERR_PTR(-EIO); ++ pos = 0; ++ ssz = vfsub_read_k(file, &fdata, sizeof(fdata), &pos); ++ if (unlikely(ssz != sizeof(fdata))) { ++ AuIOErr("ssz %zd, %u, %pD2\n", ++ ssz, (unsigned int)sizeof(fdata), file); ++ goto out; ++ } ++ ++ fdata.magic = ntohl((__force __be32)fdata.magic); ++ switch (fdata.magic) { ++ case AUFS_DRINFO_MAGIC_V1: ++ break; ++ default: ++ AuIOErr("magic-num 0x%x, 0x%x, %pD2\n", ++ fdata.magic, AUFS_DRINFO_MAGIC_V1, file); ++ goto out; ++ } ++ ++ drinfo = &fdata.drinfo; ++ len = drinfo->oldnamelen; ++ if (!len) { ++ AuIOErr("broken drinfo %pD2\n", file); ++ goto out; ++ } ++ ++ ret = NULL; ++ drinfo->ino = be64_to_cpu((__force __be64)drinfo->ino); ++ if (unlikely(h_ino && drinfo->ino != h_ino)) { ++ AuDbg("ignored i%llu, i%llu, %pD2\n", ++ (unsigned long long)drinfo->ino, ++ (unsigned long long)h_ino, file); ++ goto out; /* success */ ++ } ++ ++ ret = kmalloc(sizeof(*ret) + len, GFP_NOFS); ++ if (unlikely(!ret)) { ++ ret = ERR_PTR(-ENOMEM); ++ AuTraceErrPtr(ret); ++ goto out; ++ } ++ ++ *ret = *drinfo; ++ ssz = vfsub_read_k(file, (void *)ret->oldname, len, &pos); ++ if (unlikely(ssz != len)) { ++ kfree(ret); ++ ret = ERR_PTR(-EIO); ++ AuIOErr("ssz %zd, %u, %pD2\n", ssz, len, file); ++ goto out; ++ } ++ ++ AuDbg("oldname %.*s\n", ret->oldnamelen, ret->oldname); ++ ++out: ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* in order to be revertible */ ++struct au_drinfo_rev_elm { ++ int created; ++ struct dentry *info_dentry; ++ struct au_drinfo *info_last; ++}; ++ ++struct au_drinfo_rev { ++ unsigned char already; ++ aufs_bindex_t nelm; ++ struct au_drinfo_rev_elm elm[0]; ++}; ++ ++/* todo: isn't it too large? */ ++struct au_drinfo_store { ++ struct path h_ppath; ++ struct dentry *h_dentry; ++ struct au_drinfo_fdata *fdata; ++ char *infoname; /* inside of whname, just after PFX */ ++ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ]; ++ aufs_bindex_t btgt, btail; ++ unsigned char no_sio, ++ allocated, /* current size of *fdata */ ++ infonamelen, /* room size for p */ ++ whnamelen, /* length of the generated name */ ++ renameback; /* renamed back */ ++}; ++ ++/* on rename(2) error, the caller should revert it using @elm */ ++static int au_drinfo_do_store(struct au_drinfo_store *w, ++ struct au_drinfo_rev_elm *elm) ++{ ++ int err, len; ++ ssize_t ssz; ++ loff_t pos; ++ struct path infopath = { ++ .mnt = w->h_ppath.mnt ++ }; ++ struct inode *h_dir, *h_inode, *delegated; ++ struct file *infofile; ++ struct qstr *qname; ++ ++ AuDebugOn(elm ++ && memcmp(elm, page_address(ZERO_PAGE(0)), sizeof(*elm))); ++ ++ infopath.dentry = vfsub_lookup_one_len(w->whname, w->h_ppath.dentry, ++ w->whnamelen); ++ AuTraceErrPtr(infopath.dentry); ++ if (IS_ERR(infopath.dentry)) { ++ err = PTR_ERR(infopath.dentry); ++ goto out; ++ } ++ ++ err = 0; ++ h_dir = d_inode(w->h_ppath.dentry); ++ if (elm && d_is_negative(infopath.dentry)) { ++ err = vfsub_create(h_dir, &infopath, 0600, /*want_excl*/true); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out_dput; ++ elm->created = 1; ++ elm->info_dentry = dget(infopath.dentry); ++ } ++ ++ infofile = vfsub_dentry_open(&infopath, O_RDWR); ++ AuTraceErrPtr(infofile); ++ if (IS_ERR(infofile)) { ++ err = PTR_ERR(infofile); ++ goto out_dput; ++ } ++ ++ h_inode = d_inode(infopath.dentry); ++ if (elm && i_size_read(h_inode)) { ++ h_inode = d_inode(w->h_dentry); ++ elm->info_last = au_drinfo_read_k(infofile, h_inode->i_ino); ++ AuTraceErrPtr(elm->info_last); ++ if (IS_ERR(elm->info_last)) { ++ err = PTR_ERR(elm->info_last); ++ elm->info_last = NULL; ++ AuDebugOn(elm->info_dentry); ++ goto out_fput; ++ } ++ } ++ ++ if (elm && w->renameback) { ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, &infopath, &delegated, /*force*/0); ++ AuTraceErr(err); ++ if (unlikely(err == -EWOULDBLOCK)) ++ iput(delegated); ++ goto out_fput; ++ } ++ ++ pos = 0; ++ qname = &w->h_dentry->d_name; ++ len = sizeof(*w->fdata) + qname->len; ++ if (!elm) ++ len = sizeof(*w->fdata) + w->fdata->drinfo.oldnamelen; ++ ssz = vfsub_write_k(infofile, w->fdata, len, &pos); ++ if (ssz == len) { ++ AuDbg("hi%llu, %.*s\n", w->fdata->drinfo.ino, ++ w->fdata->drinfo.oldnamelen, w->fdata->drinfo.oldname); ++ goto out_fput; /* success */ ++ } else { ++ err = -EIO; ++ if (ssz < 0) ++ err = ssz; ++ /* the caller should revert it using @elm */ ++ } ++ ++out_fput: ++ fput(infofile); ++out_dput: ++ dput(infopath.dentry); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++struct au_call_drinfo_do_store_args { ++ int *errp; ++ struct au_drinfo_store *w; ++ struct au_drinfo_rev_elm *elm; ++}; ++ ++static void au_call_drinfo_do_store(void *args) ++{ ++ struct au_call_drinfo_do_store_args *a = args; ++ ++ *a->errp = au_drinfo_do_store(a->w, a->elm); ++} ++ ++static int au_drinfo_store_sio(struct au_drinfo_store *w, ++ struct au_drinfo_rev_elm *elm) ++{ ++ int err, wkq_err; ++ ++ if (w->no_sio) ++ err = au_drinfo_do_store(w, elm); ++ else { ++ struct au_call_drinfo_do_store_args a = { ++ .errp = &err, ++ .w = w, ++ .elm = elm ++ }; ++ wkq_err = au_wkq_wait(au_call_drinfo_do_store, &a); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ AuTraceErr(err); ++ ++ return err; ++} ++ ++static int au_drinfo_store_work_init(struct au_drinfo_store *w, ++ aufs_bindex_t btgt) ++{ ++ int err; ++ ++ memset(w, 0, sizeof(*w)); ++ w->allocated = roundup_pow_of_two(sizeof(*w->fdata) + 40); ++ strcpy(w->whname, AUFS_WH_DR_INFO_PFX); ++ w->infoname = w->whname + sizeof(AUFS_WH_DR_INFO_PFX) - 1; ++ w->infonamelen = sizeof(w->whname) - sizeof(AUFS_WH_DR_INFO_PFX); ++ w->btgt = btgt; ++ w->no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); ++ ++ err = -ENOMEM; ++ w->fdata = kcalloc(1, w->allocated, GFP_NOFS); ++ if (unlikely(!w->fdata)) { ++ AuTraceErr(err); ++ goto out; ++ } ++ w->fdata->magic = (__force uint32_t)htonl(AUFS_DRINFO_MAGIC_V1); ++ err = 0; ++ ++out: ++ return err; ++} ++ ++static void au_drinfo_store_work_fin(struct au_drinfo_store *w) ++{ ++ kfree(w->fdata); ++} ++ ++static void au_drinfo_store_rev(struct au_drinfo_rev *rev, ++ struct au_drinfo_store *w) ++{ ++ struct au_drinfo_rev_elm *elm; ++ struct inode *h_dir, *delegated; ++ int err, nelm; ++ struct path infopath = { ++ .mnt = w->h_ppath.mnt ++ }; ++ ++ h_dir = d_inode(w->h_ppath.dentry); ++ IMustLock(h_dir); ++ ++ err = 0; ++ elm = rev->elm; ++ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { ++ AuDebugOn(elm->created && elm->info_last); ++ if (elm->created) { ++ AuDbg("here\n"); ++ delegated = NULL; ++ infopath.dentry = elm->info_dentry; ++ err = vfsub_unlink(h_dir, &infopath, &delegated, ++ !w->no_sio); ++ AuTraceErr(err); ++ if (unlikely(err == -EWOULDBLOCK)) ++ iput(delegated); ++ dput(elm->info_dentry); ++ } else if (elm->info_last) { ++ AuDbg("here\n"); ++ w->fdata->drinfo = *elm->info_last; ++ memcpy(w->fdata->drinfo.oldname, ++ elm->info_last->oldname, ++ elm->info_last->oldnamelen); ++ err = au_drinfo_store_sio(w, /*elm*/NULL); ++ kfree(elm->info_last); ++ } ++ if (unlikely(err)) ++ AuIOErr("%d, %s\n", err, w->whname); ++ /* go on even if err */ ++ } ++} ++ ++/* caller has to call au_dr_rename_fin() later */ ++static int au_drinfo_store(struct dentry *dentry, aufs_bindex_t btgt, ++ struct qstr *dst_name, void *_rev) ++{ ++ int err, sz, nelm; ++ aufs_bindex_t bindex, btail; ++ struct au_drinfo_store work; ++ struct au_drinfo_rev *rev, **p; ++ struct au_drinfo_rev_elm *elm; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_hinode *hdir; ++ ++ err = au_drinfo_store_work_init(&work, btgt); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out; ++ ++ err = -ENOMEM; ++ btail = au_dbtaildir(dentry); ++ nelm = btail - btgt; ++ sz = sizeof(*rev) + sizeof(*elm) * nelm; ++ rev = kcalloc(1, sz, GFP_NOFS); ++ if (unlikely(!rev)) { ++ AuTraceErr(err); ++ goto out_args; ++ } ++ rev->nelm = nelm; ++ elm = rev->elm; ++ p = _rev; ++ *p = rev; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ work.h_ppath.dentry = au_h_dptr(dentry, btgt); ++ work.h_ppath.mnt = au_sbr_mnt(sb, btgt); ++ hdir = au_hi(d_inode(dentry), btgt); ++ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); ++ for (bindex = btgt + 1; bindex <= btail; bindex++, elm++) { ++ work.h_dentry = au_h_dptr(dentry, bindex); ++ if (!work.h_dentry) ++ continue; ++ ++ err = au_drinfo_construct(&work.fdata, work.h_dentry, ++ &work.allocated); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ break; ++ ++ work.renameback = au_qstreq(&work.h_dentry->d_name, dst_name); ++ br = au_sbr(sb, bindex); ++ work.whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; ++ work.whnamelen += au_drinfo_name(br, work.infoname, ++ work.infonamelen); ++ AuDbg("whname %.*s, i%llu, %.*s\n", ++ work.whnamelen, work.whname, ++ be64_to_cpu((__force __be64)work.fdata->drinfo.ino), ++ work.fdata->drinfo.oldnamelen, ++ work.fdata->drinfo.oldname); ++ ++ err = au_drinfo_store_sio(&work, elm); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ break; ++ } ++ if (unlikely(err)) { ++ /* revert all drinfo */ ++ au_drinfo_store_rev(rev, &work); ++ kfree(rev); ++ *p = NULL; ++ } ++ au_hn_inode_unlock(hdir); ++ ++out_args: ++ au_drinfo_store_work_fin(&work); ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, ++ struct qstr *dst_name, void *_rev) ++{ ++ int err, already; ++ ino_t ino; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_dr_br *dr; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ struct au_dr_hino *ent; ++ struct au_drinfo_rev *rev, **p; ++ ++ AuDbg("bindex %d\n", bindex); ++ ++ err = -ENOMEM; ++ ent = kmalloc(sizeof(*ent), GFP_NOFS); ++ if (unlikely(!ent)) ++ goto out; ++ ++ sb = src->d_sb; ++ br = au_sbr(sb, bindex); ++ dr = &br->br_dirren; ++ h_dentry = au_h_dptr(src, bindex); ++ h_inode = d_inode(h_dentry); ++ ino = h_inode->i_ino; ++ ent->dr_h_ino = ino; ++ already = au_dr_hino_test_add(dr, ino, ent); ++ AuDbg("b%d, hi%llu, already %d\n", ++ bindex, (unsigned long long)ino, already); ++ ++ err = au_drinfo_store(src, bindex, dst_name, _rev); ++ AuTraceErr(err); ++ if (!err) { ++ p = _rev; ++ rev = *p; ++ rev->already = already; ++ goto out; /* success */ ++ } ++ ++ /* revert */ ++ if (!already) ++ au_dr_hino_del(dr, ent); ++ kfree(ent); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *_rev) ++{ ++ struct au_drinfo_rev *rev; ++ struct au_drinfo_rev_elm *elm; ++ int nelm; ++ ++ rev = _rev; ++ elm = rev->elm; ++ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { ++ dput(elm->info_dentry); ++ kfree(elm->info_last); ++ } ++ kfree(rev); ++} ++ ++void au_dr_rename_rev(struct dentry *src, aufs_bindex_t btgt, void *_rev) ++{ ++ int err; ++ struct au_drinfo_store work; ++ struct au_drinfo_rev *rev = _rev; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct inode *h_inode; ++ struct au_dr_br *dr; ++ struct au_dr_hino *ent; ++ ++ err = au_drinfo_store_work_init(&work, btgt); ++ if (unlikely(err)) ++ goto out; ++ ++ sb = src->d_sb; ++ br = au_sbr(sb, btgt); ++ work.h_ppath.dentry = au_h_dptr(src, btgt); ++ work.h_ppath.mnt = au_br_mnt(br); ++ au_drinfo_store_rev(rev, &work); ++ au_drinfo_store_work_fin(&work); ++ if (rev->already) ++ goto out; ++ ++ dr = &br->br_dirren; ++ h_inode = d_inode(work.h_ppath.dentry); ++ ent = au_dr_hino_find(dr, h_inode->i_ino); ++ BUG_ON(!ent); ++ au_dr_hino_del(dr, ent); ++ kfree(ent); ++ ++out: ++ kfree(rev); ++ if (unlikely(err)) ++ pr_err("failed to remove dirren info\n"); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct au_drinfo *au_drinfo_do_load(struct path *h_ppath, ++ char *whname, int whnamelen, ++ struct dentry **info_dentry) ++{ ++ struct au_drinfo *drinfo; ++ struct file *f; ++ struct inode *h_dir; ++ struct path infopath; ++ int unlocked; ++ ++ AuDbg("%pd/%.*s\n", h_ppath->dentry, whnamelen, whname); ++ ++ *info_dentry = NULL; ++ drinfo = NULL; ++ unlocked = 0; ++ h_dir = d_inode(h_ppath->dentry); ++ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); ++ infopath.dentry = vfsub_lookup_one_len(whname, h_ppath->dentry, ++ whnamelen); ++ if (IS_ERR(infopath.dentry)) { ++ drinfo = (void *)infopath.dentry; ++ goto out; ++ } ++ ++ if (d_is_negative(infopath.dentry)) ++ goto out_dput; /* success */ ++ ++ infopath.mnt = h_ppath->mnt; ++ f = vfsub_dentry_open(&infopath, O_RDONLY); ++ inode_unlock_shared(h_dir); ++ unlocked = 1; ++ if (IS_ERR(f)) { ++ drinfo = (void *)f; ++ goto out_dput; ++ } ++ ++ drinfo = au_drinfo_read_k(f, /*h_ino*/0); ++ if (IS_ERR_OR_NULL(drinfo)) ++ goto out_fput; ++ ++ AuDbg("oldname %.*s\n", drinfo->oldnamelen, drinfo->oldname); ++ *info_dentry = dget(infopath.dentry); /* keep it alive */ ++ ++out_fput: ++ fput(f); ++out_dput: ++ dput(infopath.dentry); ++out: ++ if (!unlocked) ++ inode_unlock_shared(h_dir); ++ AuTraceErrPtr(drinfo); ++ return drinfo; ++} ++ ++struct au_drinfo_do_load_args { ++ struct au_drinfo **drinfop; ++ struct path *h_ppath; ++ char *whname; ++ int whnamelen; ++ struct dentry **info_dentry; ++}; ++ ++static void au_call_drinfo_do_load(void *args) ++{ ++ struct au_drinfo_do_load_args *a = args; ++ ++ *a->drinfop = au_drinfo_do_load(a->h_ppath, a->whname, a->whnamelen, ++ a->info_dentry); ++} ++ ++struct au_drinfo_load { ++ struct path h_ppath; ++ struct qstr *qname; ++ unsigned char no_sio; ++ ++ aufs_bindex_t ninfo; ++ struct au_drinfo **drinfo; ++}; ++ ++static int au_drinfo_load(struct au_drinfo_load *w, aufs_bindex_t bindex, ++ struct au_branch *br) ++{ ++ int err, wkq_err, whnamelen, e; ++ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ] ++ = AUFS_WH_DR_INFO_PFX; ++ struct au_drinfo *drinfo; ++ struct qstr oldname; ++ struct inode *h_dir, *delegated; ++ struct dentry *info_dentry; ++ struct path infopath; ++ ++ whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; ++ whnamelen += au_drinfo_name(br, whname + whnamelen, ++ sizeof(whname) - whnamelen); ++ if (w->no_sio) ++ drinfo = au_drinfo_do_load(&w->h_ppath, whname, whnamelen, ++ &info_dentry); ++ else { ++ struct au_drinfo_do_load_args args = { ++ .drinfop = &drinfo, ++ .h_ppath = &w->h_ppath, ++ .whname = whname, ++ .whnamelen = whnamelen, ++ .info_dentry = &info_dentry ++ }; ++ wkq_err = au_wkq_wait(au_call_drinfo_do_load, &args); ++ if (unlikely(wkq_err)) ++ drinfo = ERR_PTR(wkq_err); ++ } ++ err = PTR_ERR(drinfo); ++ if (IS_ERR_OR_NULL(drinfo)) ++ goto out; ++ ++ err = 0; ++ oldname.len = drinfo->oldnamelen; ++ oldname.name = drinfo->oldname; ++ if (au_qstreq(w->qname, &oldname)) { ++ /* the name is renamed back */ ++ kfree(drinfo); ++ drinfo = NULL; ++ ++ infopath.dentry = info_dentry; ++ infopath.mnt = w->h_ppath.mnt; ++ h_dir = d_inode(w->h_ppath.dentry); ++ delegated = NULL; ++ inode_lock_nested(h_dir, AuLsc_I_PARENT); ++ e = vfsub_unlink(h_dir, &infopath, &delegated, !w->no_sio); ++ inode_unlock(h_dir); ++ if (unlikely(e)) ++ AuIOErr("ignored %d, %pd2\n", e, &infopath.dentry); ++ if (unlikely(e == -EWOULDBLOCK)) ++ iput(delegated); ++ } ++ kfree(w->drinfo[bindex]); ++ w->drinfo[bindex] = drinfo; ++ dput(info_dentry); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_dr_lkup_free(struct au_drinfo **drinfo, int n) ++{ ++ struct au_drinfo **p = drinfo; ++ ++ while (n-- > 0) ++ kfree(*drinfo++); ++ kfree(p); ++} ++ ++int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, ++ aufs_bindex_t btgt) ++{ ++ int err, ninfo; ++ struct au_drinfo_load w; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ struct inode *h_dir; ++ struct au_dr_hino *ent; ++ struct super_block *sb; ++ ++ AuDbg("%.*s, name %.*s, whname %.*s, b%d\n", ++ AuLNPair(&dentry->d_name), AuLNPair(&lkup->dirren.dr_name), ++ AuLNPair(&lkup->whname), btgt); ++ ++ sb = dentry->d_sb; ++ bbot = au_sbbot(sb); ++ w.ninfo = bbot + 1; ++ if (!lkup->dirren.drinfo) { ++ lkup->dirren.drinfo = kcalloc(w.ninfo, ++ sizeof(*lkup->dirren.drinfo), ++ GFP_NOFS); ++ if (unlikely(!lkup->dirren.drinfo)) { ++ err = -ENOMEM; ++ goto out; ++ } ++ lkup->dirren.ninfo = w.ninfo; ++ } ++ w.drinfo = lkup->dirren.drinfo; ++ w.no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); ++ w.h_ppath.dentry = au_h_dptr(dentry, btgt); ++ AuDebugOn(!w.h_ppath.dentry); ++ w.h_ppath.mnt = au_sbr_mnt(sb, btgt); ++ w.qname = &dentry->d_name; ++ ++ ninfo = 0; ++ for (bindex = btgt + 1; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ err = au_drinfo_load(&w, bindex, br); ++ if (unlikely(err)) ++ goto out_free; ++ if (w.drinfo[bindex]) ++ ninfo++; ++ } ++ if (!ninfo) { ++ br = au_sbr(sb, btgt); ++ h_dir = d_inode(w.h_ppath.dentry); ++ ent = au_dr_hino_find(&br->br_dirren, h_dir->i_ino); ++ AuDebugOn(!ent); ++ au_dr_hino_del(&br->br_dirren, ent); ++ kfree(ent); ++ } ++ goto out; /* success */ ++ ++out_free: ++ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); ++ lkup->dirren.ninfo = 0; ++ lkup->dirren.drinfo = NULL; ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_dr_lkup_fin(struct au_do_lookup_args *lkup) ++{ ++ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); ++} ++ ++int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt) ++{ ++ int err; ++ struct au_drinfo *drinfo; ++ ++ err = 0; ++ if (!lkup->dirren.drinfo) ++ goto out; ++ AuDebugOn(lkup->dirren.ninfo < btgt + 1); ++ drinfo = lkup->dirren.drinfo[btgt + 1]; ++ if (!drinfo) ++ goto out; ++ ++ kfree(lkup->whname.name); ++ lkup->whname.name = NULL; ++ lkup->dirren.dr_name.len = drinfo->oldnamelen; ++ lkup->dirren.dr_name.name = drinfo->oldname; ++ lkup->name = &lkup->dirren.dr_name; ++ err = au_wh_name_alloc(&lkup->whname, lkup->name); ++ if (!err) ++ AuDbg("name %.*s, whname %.*s, b%d\n", ++ AuLNPair(lkup->name), AuLNPair(&lkup->whname), ++ btgt); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, ++ ino_t h_ino) ++{ ++ int match; ++ struct au_drinfo *drinfo; ++ ++ match = 1; ++ if (!lkup->dirren.drinfo) ++ goto out; ++ AuDebugOn(lkup->dirren.ninfo < bindex + 1); ++ drinfo = lkup->dirren.drinfo[bindex + 1]; ++ if (!drinfo) ++ goto out; ++ ++ match = (drinfo->ino == h_ino); ++ AuDbg("match %d\n", match); ++ ++out: ++ return match; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_dr_opt_set(struct super_block *sb) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ err = 0; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; !err && bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ err = au_dr_hino(sb, bindex, /*br*/NULL, &br->br_path); ++ } ++ ++ return err; ++} ++ ++int au_dr_opt_flush(struct super_block *sb) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ err = 0; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; !err && bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_writable(br->br_perm)) ++ err = au_dr_hino(sb, bindex, /*br*/NULL, /*path*/NULL); ++ } ++ ++ return err; ++} ++ ++int au_dr_opt_clr(struct super_block *sb, int no_flush) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ err = 0; ++ if (!no_flush) { ++ err = au_dr_opt_flush(sb); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ au_dr_hino_free(&br->br_dirren); ++ } ++ ++out: ++ return err; ++} +diff --git a/fs/aufs/dirren.h b/fs/aufs/dirren.h +new file mode 100644 +index 000000000000..65360459f32b +--- /dev/null ++++ b/fs/aufs/dirren.h +@@ -0,0 +1,127 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2017-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * renamed dir info ++ */ ++ ++#ifndef __AUFS_DIRREN_H__ ++#define __AUFS_DIRREN_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include "hbl.h" ++ ++#define AuDirren_NHASH 100 ++ ++#ifdef CONFIG_AUFS_DIRREN ++enum au_brid_type { ++ AuBrid_Unset, ++ AuBrid_UUID, ++ AuBrid_FSID, ++ AuBrid_DEV ++}; ++ ++struct au_dr_brid { ++ enum au_brid_type type; ++ union { ++ uuid_t uuid; /* unimplemented yet */ ++ fsid_t fsid; ++ dev_t dev; ++ }; ++}; ++ ++/* 20 is the max digits length of ulong 64 */ ++/* brid-type "_" uuid "_" inum */ ++#define AUFS_DIRREN_FNAME_SZ (1 + 1 + UUID_STRING_LEN + 20) ++#define AUFS_DIRREN_ENV_VAL_SZ (AUFS_DIRREN_FNAME_SZ + 1 + 20) ++ ++struct au_dr_hino { ++ struct hlist_bl_node dr_hnode; ++ ino_t dr_h_ino; ++}; ++ ++struct au_dr_br { ++ struct hlist_bl_head dr_h_ino[AuDirren_NHASH]; ++ struct au_dr_brid dr_brid; ++}; ++ ++struct au_dr_lookup { ++ /* dr_name is pointed by struct au_do_lookup_args.name */ ++ struct qstr dr_name; /* subset of dr_info */ ++ aufs_bindex_t ninfo; ++ struct au_drinfo **drinfo; ++}; ++#else ++struct au_dr_hino; ++/* empty */ ++struct au_dr_br { }; ++struct au_dr_lookup { }; ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_branch; ++struct au_do_lookup_args; ++struct au_hinode; ++#ifdef CONFIG_AUFS_DIRREN ++int au_dr_hino_test_add(struct au_dr_br *dr, ino_t h_ino, ++ struct au_dr_hino *add_ent); ++void au_dr_hino_free(struct au_dr_br *dr); ++int au_dr_br_init(struct super_block *sb, struct au_branch *br, ++ const struct path *path); ++int au_dr_br_fin(struct super_block *sb, struct au_branch *br); ++int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, ++ struct qstr *dst_name, void *_rev); ++void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *rev); ++void au_dr_rename_rev(struct dentry *src, aufs_bindex_t bindex, void *rev); ++int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, ++ aufs_bindex_t bindex); ++int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt); ++int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, ++ ino_t h_ino); ++void au_dr_lkup_fin(struct au_do_lookup_args *lkup); ++int au_dr_opt_set(struct super_block *sb); ++int au_dr_opt_flush(struct super_block *sb); ++int au_dr_opt_clr(struct super_block *sb, int no_flush); ++#else ++AuStubInt0(au_dr_hino_test_add, struct au_dr_br *dr, ino_t h_ino, ++ struct au_dr_hino *add_ent); ++AuStubVoid(au_dr_hino_free, struct au_dr_br *dr); ++AuStubInt0(au_dr_br_init, struct super_block *sb, struct au_branch *br, ++ const struct path *path); ++AuStubInt0(au_dr_br_fin, struct super_block *sb, struct au_branch *br); ++AuStubInt0(au_dr_rename, struct dentry *src, aufs_bindex_t bindex, ++ struct qstr *dst_name, void *_rev); ++AuStubVoid(au_dr_rename_fin, struct dentry *src, aufs_bindex_t btgt, void *rev); ++AuStubVoid(au_dr_rename_rev, struct dentry *src, aufs_bindex_t bindex, ++ void *rev); ++AuStubInt0(au_dr_lkup, struct au_do_lookup_args *lkup, struct dentry *dentry, ++ aufs_bindex_t bindex); ++AuStubInt0(au_dr_lkup_name, struct au_do_lookup_args *lkup, aufs_bindex_t btgt); ++AuStubInt0(au_dr_lkup_h_ino, struct au_do_lookup_args *lkup, ++ aufs_bindex_t bindex, ino_t h_ino); ++AuStubVoid(au_dr_lkup_fin, struct au_do_lookup_args *lkup); ++AuStubInt0(au_dr_opt_set, struct super_block *sb); ++AuStubInt0(au_dr_opt_flush, struct super_block *sb); ++AuStubInt0(au_dr_opt_clr, struct super_block *sb, int no_flush); ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_DIRREN ++static inline int au_dr_ihash(ino_t h_ino) ++{ ++ return h_ino % AuDirren_NHASH; ++} ++#else ++AuStubInt0(au_dr_ihash, ino_t h_ino); ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DIRREN_H__ */ +diff --git a/fs/aufs/dynop.c b/fs/aufs/dynop.c +new file mode 100644 +index 000000000000..d80f45763031 +--- /dev/null ++++ b/fs/aufs/dynop.c +@@ -0,0 +1,357 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2010-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * dynamically customizable operations for regular files ++ */ ++ ++#include "aufs.h" ++ ++#define DyPrSym(key) AuDbgSym(key->dk_op.dy_hop) ++ ++/* ++ * How large will these lists be? ++ * Usually just a few elements, 20-30 at most for each, I guess. ++ */ ++static struct hlist_bl_head dynop[AuDyLast]; ++ ++static struct au_dykey *dy_gfind_get(struct hlist_bl_head *hbl, ++ const void *h_op) ++{ ++ struct au_dykey *key, *tmp; ++ struct hlist_bl_node *pos; ++ ++ key = NULL; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) ++ if (tmp->dk_op.dy_hop == h_op) { ++ key = tmp; ++ kref_get(&key->dk_kref); ++ break; ++ } ++ hlist_bl_unlock(hbl); ++ ++ return key; ++} ++ ++static struct au_dykey *dy_bradd(struct au_branch *br, struct au_dykey *key) ++{ ++ struct au_dykey **k, *found; ++ const void *h_op = key->dk_op.dy_hop; ++ int i; ++ ++ found = NULL; ++ k = br->br_dykey; ++ for (i = 0; i < AuBrDynOp; i++) ++ if (k[i]) { ++ if (k[i]->dk_op.dy_hop == h_op) { ++ found = k[i]; ++ break; ++ } ++ } else ++ break; ++ if (!found) { ++ spin_lock(&br->br_dykey_lock); ++ for (; i < AuBrDynOp; i++) ++ if (k[i]) { ++ if (k[i]->dk_op.dy_hop == h_op) { ++ found = k[i]; ++ break; ++ } ++ } else { ++ k[i] = key; ++ break; ++ } ++ spin_unlock(&br->br_dykey_lock); ++ BUG_ON(i == AuBrDynOp); /* expand the array */ ++ } ++ ++ return found; ++} ++ ++/* kref_get() if @key is already added */ ++static struct au_dykey *dy_gadd(struct hlist_bl_head *hbl, struct au_dykey *key) ++{ ++ struct au_dykey *tmp, *found; ++ struct hlist_bl_node *pos; ++ const void *h_op = key->dk_op.dy_hop; ++ ++ found = NULL; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) ++ if (tmp->dk_op.dy_hop == h_op) { ++ kref_get(&tmp->dk_kref); ++ found = tmp; ++ break; ++ } ++ if (!found) ++ hlist_bl_add_head(&key->dk_hnode, hbl); ++ hlist_bl_unlock(hbl); ++ ++ if (!found) ++ DyPrSym(key); ++ return found; ++} ++ ++static void dy_free_rcu(struct rcu_head *rcu) ++{ ++ struct au_dykey *key; ++ ++ key = container_of(rcu, struct au_dykey, dk_rcu); ++ DyPrSym(key); ++ kfree(key); ++} ++ ++static void dy_free(struct kref *kref) ++{ ++ struct au_dykey *key; ++ struct hlist_bl_head *hbl; ++ ++ key = container_of(kref, struct au_dykey, dk_kref); ++ hbl = dynop + key->dk_op.dy_type; ++ au_hbl_del(&key->dk_hnode, hbl); ++ call_rcu(&key->dk_rcu, dy_free_rcu); ++} ++ ++void au_dy_put(struct au_dykey *key) ++{ ++ kref_put(&key->dk_kref, dy_free); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define DyDbgSize(cnt, op) AuDebugOn(cnt != sizeof(op)/sizeof(void *)) ++ ++#ifdef CONFIG_AUFS_DEBUG ++#define DyDbgDeclare(cnt) unsigned int cnt = 0 ++#define DyDbgInc(cnt) do { cnt++; } while (0) ++#else ++#define DyDbgDeclare(cnt) do {} while (0) ++#define DyDbgInc(cnt) do {} while (0) ++#endif ++ ++#define DySet(func, dst, src, h_op, h_sb) do { \ ++ DyDbgInc(cnt); \ ++ if (h_op->func) { \ ++ if (src.func) \ ++ dst.func = src.func; \ ++ else \ ++ AuDbg("%s %s\n", au_sbtype(h_sb), #func); \ ++ } \ ++} while (0) ++ ++#define DySetForce(func, dst, src) do { \ ++ AuDebugOn(!src.func); \ ++ DyDbgInc(cnt); \ ++ dst.func = src.func; \ ++} while (0) ++ ++#define DySetAop(func) \ ++ DySet(func, dyaop->da_op, aufs_aop, h_aop, h_sb) ++#define DySetAopForce(func) \ ++ DySetForce(func, dyaop->da_op, aufs_aop) ++ ++static void dy_aop(struct au_dykey *key, const void *h_op, ++ struct super_block *h_sb __maybe_unused) ++{ ++ struct au_dyaop *dyaop = (void *)key; ++ const struct address_space_operations *h_aop = h_op; ++ DyDbgDeclare(cnt); ++ ++ AuDbg("%s\n", au_sbtype(h_sb)); ++ ++ DySetAop(writepage); ++ DySetAopForce(readpage); /* force */ ++ DySetAop(writepages); ++ DySetAop(set_page_dirty); ++ DySetAop(readpages); ++ DySetAop(write_begin); ++ DySetAop(write_end); ++ DySetAop(bmap); ++ DySetAop(invalidatepage); ++ DySetAop(releasepage); ++ DySetAop(freepage); ++ /* this one will be changed according to an aufs mount option */ ++ DySetAop(direct_IO); ++ DySetAop(migratepage); ++ DySetAop(isolate_page); ++ DySetAop(putback_page); ++ DySetAop(launder_page); ++ DySetAop(is_partially_uptodate); ++ DySetAop(is_dirty_writeback); ++ DySetAop(error_remove_page); ++ DySetAop(swap_activate); ++ DySetAop(swap_deactivate); ++ ++ DyDbgSize(cnt, *h_aop); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void dy_bug(struct kref *kref) ++{ ++ BUG(); ++} ++ ++static struct au_dykey *dy_get(struct au_dynop *op, struct au_branch *br) ++{ ++ struct au_dykey *key, *old; ++ struct hlist_bl_head *hbl; ++ struct op { ++ unsigned int sz; ++ void (*set)(struct au_dykey *key, const void *h_op, ++ struct super_block *h_sb __maybe_unused); ++ }; ++ static const struct op a[] = { ++ [AuDy_AOP] = { ++ .sz = sizeof(struct au_dyaop), ++ .set = dy_aop ++ } ++ }; ++ const struct op *p; ++ ++ hbl = dynop + op->dy_type; ++ key = dy_gfind_get(hbl, op->dy_hop); ++ if (key) ++ goto out_add; /* success */ ++ ++ p = a + op->dy_type; ++ key = kzalloc(p->sz, GFP_NOFS); ++ if (unlikely(!key)) { ++ key = ERR_PTR(-ENOMEM); ++ goto out; ++ } ++ ++ key->dk_op.dy_hop = op->dy_hop; ++ kref_init(&key->dk_kref); ++ p->set(key, op->dy_hop, au_br_sb(br)); ++ old = dy_gadd(hbl, key); ++ if (old) { ++ kfree(key); ++ key = old; ++ } ++ ++out_add: ++ old = dy_bradd(br, key); ++ if (old) ++ /* its ref-count should never be zero here */ ++ kref_put(&key->dk_kref, dy_bug); ++out: ++ return key; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * Aufs prohibits O_DIRECT by default even if the branch supports it. ++ * This behaviour is necessary to return an error from open(O_DIRECT) instead ++ * of the succeeding I/O. The dio mount option enables O_DIRECT and makes ++ * open(O_DIRECT) always succeed, but the succeeding I/O may return an error. ++ * See the aufs manual in detail. ++ */ ++static void dy_adx(struct au_dyaop *dyaop, int do_dx) ++{ ++ if (!do_dx) ++ dyaop->da_op.direct_IO = NULL; ++ else ++ dyaop->da_op.direct_IO = aufs_aop.direct_IO; ++} ++ ++static struct au_dyaop *dy_aget(struct au_branch *br, ++ const struct address_space_operations *h_aop, ++ int do_dx) ++{ ++ struct au_dyaop *dyaop; ++ struct au_dynop op; ++ ++ op.dy_type = AuDy_AOP; ++ op.dy_haop = h_aop; ++ dyaop = (void *)dy_get(&op, br); ++ if (IS_ERR(dyaop)) ++ goto out; ++ dy_adx(dyaop, do_dx); ++ ++out: ++ return dyaop; ++} ++ ++int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, ++ struct inode *h_inode) ++{ ++ int err, do_dx; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_dyaop *dyaop; ++ ++ AuDebugOn(!S_ISREG(h_inode->i_mode)); ++ IiMustWriteLock(inode); ++ ++ sb = inode->i_sb; ++ br = au_sbr(sb, bindex); ++ do_dx = !!au_opt_test(au_mntflags(sb), DIO); ++ dyaop = dy_aget(br, h_inode->i_mapping->a_ops, do_dx); ++ err = PTR_ERR(dyaop); ++ if (IS_ERR(dyaop)) ++ /* unnecessary to call dy_fput() */ ++ goto out; ++ ++ err = 0; ++ inode->i_mapping->a_ops = &dyaop->da_op; ++ ++out: ++ return err; ++} ++ ++/* ++ * Is it safe to replace a_ops during the inode/file is in operation? ++ * Yes, I hope so. ++ */ ++int au_dy_irefresh(struct inode *inode) ++{ ++ int err; ++ aufs_bindex_t btop; ++ struct inode *h_inode; ++ ++ err = 0; ++ if (S_ISREG(inode->i_mode)) { ++ btop = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, btop); ++ err = au_dy_iaop(inode, btop, h_inode); ++ } ++ return err; ++} ++ ++void au_dy_arefresh(int do_dx) ++{ ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_dykey *key; ++ ++ hbl = dynop + AuDy_AOP; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(key, pos, hbl, dk_hnode) ++ dy_adx((void *)key, do_dx); ++ hlist_bl_unlock(hbl); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void __init au_dy_init(void) ++{ ++ int i; ++ ++ /* make sure that 'struct au_dykey *' can be any type */ ++ BUILD_BUG_ON(offsetof(struct au_dyaop, da_key)); ++ ++ for (i = 0; i < AuDyLast; i++) ++ INIT_HLIST_BL_HEAD(dynop + i); ++} ++ ++void au_dy_fin(void) ++{ ++ int i; ++ ++ for (i = 0; i < AuDyLast; i++) ++ WARN_ON(!hlist_bl_empty(dynop + i)); ++} +diff --git a/fs/aufs/dynop.h b/fs/aufs/dynop.h +new file mode 100644 +index 000000000000..4fdbe07983cf +--- /dev/null ++++ b/fs/aufs/dynop.h +@@ -0,0 +1,62 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2010-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * dynamically customizable operations (for regular files only) ++ */ ++ ++#ifndef __AUFS_DYNOP_H__ ++#define __AUFS_DYNOP_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++ ++enum {AuDy_AOP, AuDyLast}; ++ ++struct au_dynop { ++ int dy_type; ++ union { ++ const void *dy_hop; ++ const struct address_space_operations *dy_haop; ++ }; ++}; ++ ++struct au_dykey { ++ union { ++ struct hlist_bl_node dk_hnode; ++ struct rcu_head dk_rcu; ++ }; ++ struct au_dynop dk_op; ++ ++ /* ++ * during I am in the branch local array, kref is gotten. when the ++ * branch is removed, kref is put. ++ */ ++ struct kref dk_kref; ++}; ++ ++/* stop unioning since their sizes are very different from each other */ ++struct au_dyaop { ++ struct au_dykey da_key; ++ struct address_space_operations da_op; /* not const */ ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dynop.c */ ++struct au_branch; ++void au_dy_put(struct au_dykey *key); ++int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, ++ struct inode *h_inode); ++int au_dy_irefresh(struct inode *inode); ++void au_dy_arefresh(int do_dio); ++ ++void __init au_dy_init(void); ++void au_dy_fin(void); ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DYNOP_H__ */ +diff --git a/fs/aufs/export.c b/fs/aufs/export.c +new file mode 100644 +index 000000000000..d5fb61a7a61f +--- /dev/null ++++ b/fs/aufs/export.c +@@ -0,0 +1,825 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * export via nfs ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++union conv { ++#ifdef CONFIG_AUFS_INO_T_64 ++ __u32 a[2]; ++#else ++ __u32 a[1]; ++#endif ++ ino_t ino; ++}; ++ ++static ino_t decode_ino(__u32 *a) ++{ ++ union conv u; ++ ++ BUILD_BUG_ON(sizeof(u.ino) != sizeof(u.a)); ++ u.a[0] = a[0]; ++#ifdef CONFIG_AUFS_INO_T_64 ++ u.a[1] = a[1]; ++#endif ++ return u.ino; ++} ++ ++static void encode_ino(__u32 *a, ino_t ino) ++{ ++ union conv u; ++ ++ u.ino = ino; ++ a[0] = u.a[0]; ++#ifdef CONFIG_AUFS_INO_T_64 ++ a[1] = u.a[1]; ++#endif ++} ++ ++/* NFS file handle */ ++enum { ++ Fh_br_id, ++ Fh_sigen, ++#ifdef CONFIG_AUFS_INO_T_64 ++ /* support 64bit inode number */ ++ Fh_ino1, ++ Fh_ino2, ++ Fh_dir_ino1, ++ Fh_dir_ino2, ++#else ++ Fh_ino1, ++ Fh_dir_ino1, ++#endif ++ Fh_igen, ++ Fh_h_type, ++ Fh_tail, ++ ++ Fh_ino = Fh_ino1, ++ Fh_dir_ino = Fh_dir_ino1 ++}; ++ ++static int au_test_anon(struct dentry *dentry) ++{ ++ /* note: read d_flags without d_lock */ ++ return !!(dentry->d_flags & DCACHE_DISCONNECTED); ++} ++ ++int au_test_nfsd(void) ++{ ++ int ret; ++ struct task_struct *tsk = current; ++ char comm[sizeof(tsk->comm)]; ++ ++ ret = 0; ++ if (tsk->flags & PF_KTHREAD) { ++ get_task_comm(comm, tsk); ++ ret = !strcmp(comm, "nfsd"); ++ } ++ ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* inode generation external table */ ++ ++void au_xigen_inc(struct inode *inode) ++{ ++ loff_t pos; ++ ssize_t sz; ++ __u32 igen; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ ++ sb = inode->i_sb; ++ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); ++ ++ sbinfo = au_sbi(sb); ++ pos = inode->i_ino; ++ pos *= sizeof(igen); ++ igen = inode->i_generation + 1; ++ sz = xino_fwrite(sbinfo->si_xwrite, sbinfo->si_xigen, &igen, ++ sizeof(igen), &pos); ++ if (sz == sizeof(igen)) ++ return; /* success */ ++ ++ if (unlikely(sz >= 0)) ++ AuIOErr("xigen error (%zd)\n", sz); ++} ++ ++int au_xigen_new(struct inode *inode) ++{ ++ int err; ++ loff_t pos; ++ ssize_t sz; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ ++ err = 0; ++ /* todo: dirty, at mount time */ ++ if (inode->i_ino == AUFS_ROOT_INO) ++ goto out; ++ sb = inode->i_sb; ++ SiMustAnyLock(sb); ++ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) ++ goto out; ++ ++ err = -EFBIG; ++ pos = inode->i_ino; ++ if (unlikely(au_loff_max / sizeof(inode->i_generation) - 1 < pos)) { ++ AuIOErr1("too large i%lld\n", pos); ++ goto out; ++ } ++ pos *= sizeof(inode->i_generation); ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ file = sbinfo->si_xigen; ++ BUG_ON(!file); ++ ++ if (vfsub_f_size_read(file) ++ < pos + sizeof(inode->i_generation)) { ++ inode->i_generation = atomic_inc_return(&sbinfo->si_xigen_next); ++ sz = xino_fwrite(sbinfo->si_xwrite, file, &inode->i_generation, ++ sizeof(inode->i_generation), &pos); ++ } else ++ sz = xino_fread(sbinfo->si_xread, file, &inode->i_generation, ++ sizeof(inode->i_generation), &pos); ++ if (sz == sizeof(inode->i_generation)) ++ goto out; /* success */ ++ ++ err = sz; ++ if (unlikely(sz >= 0)) { ++ err = -EIO; ++ AuIOErr("xigen error (%zd)\n", sz); ++ } ++ ++out: ++ return err; ++} ++ ++int au_xigen_set(struct super_block *sb, struct path *path) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ file = au_xino_create2(sb, path, sbinfo->si_xigen); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ err = 0; ++ if (sbinfo->si_xigen) ++ fput(sbinfo->si_xigen); ++ sbinfo->si_xigen = file; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_xigen_clr(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ if (sbinfo->si_xigen) { ++ fput(sbinfo->si_xigen); ++ sbinfo->si_xigen = NULL; ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry *decode_by_ino(struct super_block *sb, ino_t ino, ++ ino_t dir_ino) ++{ ++ struct dentry *dentry, *d; ++ struct inode *inode; ++ unsigned int sigen; ++ ++ dentry = NULL; ++ inode = ilookup(sb, ino); ++ if (!inode) ++ goto out; ++ ++ dentry = ERR_PTR(-ESTALE); ++ sigen = au_sigen(sb); ++ if (unlikely(au_is_bad_inode(inode) ++ || IS_DEADDIR(inode) ++ || sigen != au_iigen(inode, NULL))) ++ goto out_iput; ++ ++ dentry = NULL; ++ if (!dir_ino || S_ISDIR(inode->i_mode)) ++ dentry = d_find_alias(inode); ++ else { ++ spin_lock(&inode->i_lock); ++ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { ++ spin_lock(&d->d_lock); ++ if (!au_test_anon(d) ++ && d_inode(d->d_parent)->i_ino == dir_ino) { ++ dentry = dget_dlock(d); ++ spin_unlock(&d->d_lock); ++ break; ++ } ++ spin_unlock(&d->d_lock); ++ } ++ spin_unlock(&inode->i_lock); ++ } ++ if (unlikely(dentry && au_digen_test(dentry, sigen))) { ++ /* need to refresh */ ++ dput(dentry); ++ dentry = NULL; ++ } ++ ++out_iput: ++ iput(inode); ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* todo: dirty? */ ++/* if exportfs_decode_fh() passed vfsmount*, we could be happy */ ++ ++struct au_compare_mnt_args { ++ /* input */ ++ struct super_block *sb; ++ ++ /* output */ ++ struct vfsmount *mnt; ++}; ++ ++static int au_compare_mnt(struct vfsmount *mnt, void *arg) ++{ ++ struct au_compare_mnt_args *a = arg; ++ ++ if (mnt->mnt_sb != a->sb) ++ return 0; ++ a->mnt = mntget(mnt); ++ return 1; ++} ++ ++static struct vfsmount *au_mnt_get(struct super_block *sb) ++{ ++ int err; ++ struct path root; ++ struct au_compare_mnt_args args = { ++ .sb = sb ++ }; ++ ++ get_fs_root(current->fs, &root); ++ rcu_read_lock(); ++ err = iterate_mounts(au_compare_mnt, &args, root.mnt); ++ rcu_read_unlock(); ++ path_put(&root); ++ AuDebugOn(!err); ++ AuDebugOn(!args.mnt); ++ return args.mnt; ++} ++ ++struct au_nfsd_si_lock { ++ unsigned int sigen; ++ aufs_bindex_t bindex, br_id; ++ unsigned char force_lock; ++}; ++ ++static int si_nfsd_read_lock(struct super_block *sb, ++ struct au_nfsd_si_lock *nsi_lock) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ ++ si_read_lock(sb, AuLock_FLUSH); ++ ++ /* branch id may be wrapped around */ ++ err = 0; ++ bindex = au_br_index(sb, nsi_lock->br_id); ++ if (bindex >= 0 && nsi_lock->sigen + AUFS_BRANCH_MAX > au_sigen(sb)) ++ goto out; /* success */ ++ ++ err = -ESTALE; ++ bindex = -1; ++ if (!nsi_lock->force_lock) ++ si_read_unlock(sb); ++ ++out: ++ nsi_lock->bindex = bindex; ++ return err; ++} ++ ++struct find_name_by_ino { ++ struct dir_context ctx; ++ int called, found; ++ ino_t ino; ++ char *name; ++ int namelen; ++}; ++ ++static int ++find_name_by_ino(struct dir_context *ctx, const char *name, int namelen, ++ loff_t offset, u64 ino, unsigned int d_type) ++{ ++ struct find_name_by_ino *a = container_of(ctx, struct find_name_by_ino, ++ ctx); ++ ++ a->called++; ++ if (a->ino != ino) ++ return 0; ++ ++ memcpy(a->name, name, namelen); ++ a->namelen = namelen; ++ a->found = 1; ++ return 1; ++} ++ ++static struct dentry *au_lkup_by_ino(struct path *path, ino_t ino, ++ struct au_nfsd_si_lock *nsi_lock) ++{ ++ struct dentry *dentry, *parent; ++ struct file *file; ++ struct inode *dir; ++ struct find_name_by_ino arg = { ++ .ctx = { ++ .actor = find_name_by_ino ++ } ++ }; ++ int err; ++ ++ parent = path->dentry; ++ if (nsi_lock) ++ si_read_unlock(parent->d_sb); ++ file = vfsub_dentry_open(path, au_dir_roflags); ++ dentry = (void *)file; ++ if (IS_ERR(file)) ++ goto out; ++ ++ dentry = ERR_PTR(-ENOMEM); ++ arg.name = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!arg.name)) ++ goto out_file; ++ arg.ino = ino; ++ arg.found = 0; ++ do { ++ arg.called = 0; ++ /* smp_mb(); */ ++ err = vfsub_iterate_dir(file, &arg.ctx); ++ } while (!err && !arg.found && arg.called); ++ dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_name; ++ /* instead of ENOENT */ ++ dentry = ERR_PTR(-ESTALE); ++ if (!arg.found) ++ goto out_name; ++ ++ /* do not call vfsub_lkup_one() */ ++ dir = d_inode(parent); ++ dentry = vfsub_lookup_one_len_unlocked(arg.name, parent, arg.namelen); ++ AuTraceErrPtr(dentry); ++ if (IS_ERR(dentry)) ++ goto out_name; ++ AuDebugOn(au_test_anon(dentry)); ++ if (unlikely(d_really_is_negative(dentry))) { ++ dput(dentry); ++ dentry = ERR_PTR(-ENOENT); ++ } ++ ++out_name: ++ free_page((unsigned long)arg.name); ++out_file: ++ fput(file); ++out: ++ if (unlikely(nsi_lock ++ && si_nfsd_read_lock(parent->d_sb, nsi_lock) < 0)) ++ if (!IS_ERR(dentry)) { ++ dput(dentry); ++ dentry = ERR_PTR(-ESTALE); ++ } ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++static struct dentry *decode_by_dir_ino(struct super_block *sb, ino_t ino, ++ ino_t dir_ino, ++ struct au_nfsd_si_lock *nsi_lock) ++{ ++ struct dentry *dentry; ++ struct path path; ++ ++ if (dir_ino != AUFS_ROOT_INO) { ++ path.dentry = decode_by_ino(sb, dir_ino, 0); ++ dentry = path.dentry; ++ if (!path.dentry || IS_ERR(path.dentry)) ++ goto out; ++ AuDebugOn(au_test_anon(path.dentry)); ++ } else ++ path.dentry = dget(sb->s_root); ++ ++ path.mnt = au_mnt_get(sb); ++ dentry = au_lkup_by_ino(&path, ino, nsi_lock); ++ path_put(&path); ++ ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int h_acceptable(void *expv, struct dentry *dentry) ++{ ++ return 1; ++} ++ ++static char *au_build_path(struct dentry *h_parent, struct path *h_rootpath, ++ char *buf, int len, struct super_block *sb) ++{ ++ char *p; ++ int n; ++ struct path path; ++ ++ p = d_path(h_rootpath, buf, len); ++ if (IS_ERR(p)) ++ goto out; ++ n = strlen(p); ++ ++ path.mnt = h_rootpath->mnt; ++ path.dentry = h_parent; ++ p = d_path(&path, buf, len); ++ if (IS_ERR(p)) ++ goto out; ++ if (n != 1) ++ p += n; ++ ++ path.mnt = au_mnt_get(sb); ++ path.dentry = sb->s_root; ++ p = d_path(&path, buf, len - strlen(p)); ++ mntput(path.mnt); ++ if (IS_ERR(p)) ++ goto out; ++ if (n != 1) ++ p[strlen(p)] = '/'; ++ ++out: ++ AuTraceErrPtr(p); ++ return p; ++} ++ ++static ++struct dentry *decode_by_path(struct super_block *sb, ino_t ino, __u32 *fh, ++ int fh_len, struct au_nfsd_si_lock *nsi_lock) ++{ ++ struct dentry *dentry, *h_parent, *root; ++ struct super_block *h_sb; ++ char *pathname, *p; ++ struct vfsmount *h_mnt; ++ struct au_branch *br; ++ int err; ++ struct path path; ++ ++ br = au_sbr(sb, nsi_lock->bindex); ++ h_mnt = au_br_mnt(br); ++ h_sb = h_mnt->mnt_sb; ++ /* todo: call lower fh_to_dentry()? fh_to_parent()? */ ++ lockdep_off(); ++ h_parent = exportfs_decode_fh(h_mnt, (void *)(fh + Fh_tail), ++ fh_len - Fh_tail, fh[Fh_h_type], ++ h_acceptable, /*context*/NULL); ++ lockdep_on(); ++ dentry = h_parent; ++ if (unlikely(!h_parent || IS_ERR(h_parent))) { ++ AuWarn1("%s decode_fh failed, %ld\n", ++ au_sbtype(h_sb), PTR_ERR(h_parent)); ++ goto out; ++ } ++ dentry = NULL; ++ if (unlikely(au_test_anon(h_parent))) { ++ AuWarn1("%s decode_fh returned a disconnected dentry\n", ++ au_sbtype(h_sb)); ++ goto out_h_parent; ++ } ++ ++ dentry = ERR_PTR(-ENOMEM); ++ pathname = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!pathname)) ++ goto out_h_parent; ++ ++ root = sb->s_root; ++ path.mnt = h_mnt; ++ di_read_lock_parent(root, !AuLock_IR); ++ path.dentry = au_h_dptr(root, nsi_lock->bindex); ++ di_read_unlock(root, !AuLock_IR); ++ p = au_build_path(h_parent, &path, pathname, PAGE_SIZE, sb); ++ dentry = (void *)p; ++ if (IS_ERR(p)) ++ goto out_pathname; ++ ++ si_read_unlock(sb); ++ err = vfsub_kern_path(p, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path); ++ dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_relock; ++ ++ dentry = ERR_PTR(-ENOENT); ++ AuDebugOn(au_test_anon(path.dentry)); ++ if (unlikely(d_really_is_negative(path.dentry))) ++ goto out_path; ++ ++ if (ino != d_inode(path.dentry)->i_ino) ++ dentry = au_lkup_by_ino(&path, ino, /*nsi_lock*/NULL); ++ else ++ dentry = dget(path.dentry); ++ ++out_path: ++ path_put(&path); ++out_relock: ++ if (unlikely(si_nfsd_read_lock(sb, nsi_lock) < 0)) ++ if (!IS_ERR(dentry)) { ++ dput(dentry); ++ dentry = ERR_PTR(-ESTALE); ++ } ++out_pathname: ++ free_page((unsigned long)pathname); ++out_h_parent: ++ dput(h_parent); ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry * ++aufs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, ++ int fh_type) ++{ ++ struct dentry *dentry; ++ __u32 *fh = fid->raw; ++ struct au_branch *br; ++ ino_t ino, dir_ino; ++ struct au_nfsd_si_lock nsi_lock = { ++ .force_lock = 0 ++ }; ++ ++ dentry = ERR_PTR(-ESTALE); ++ /* it should never happen, but the file handle is unreliable */ ++ if (unlikely(fh_len < Fh_tail)) ++ goto out; ++ nsi_lock.sigen = fh[Fh_sigen]; ++ nsi_lock.br_id = fh[Fh_br_id]; ++ ++ /* branch id may be wrapped around */ ++ br = NULL; ++ if (unlikely(si_nfsd_read_lock(sb, &nsi_lock))) ++ goto out; ++ nsi_lock.force_lock = 1; ++ ++ /* is this inode still cached? */ ++ ino = decode_ino(fh + Fh_ino); ++ /* it should never happen */ ++ if (unlikely(ino == AUFS_ROOT_INO)) ++ goto out_unlock; ++ ++ dir_ino = decode_ino(fh + Fh_dir_ino); ++ dentry = decode_by_ino(sb, ino, dir_ino); ++ if (IS_ERR(dentry)) ++ goto out_unlock; ++ if (dentry) ++ goto accept; ++ ++ /* is the parent dir cached? */ ++ br = au_sbr(sb, nsi_lock.bindex); ++ au_lcnt_inc(&br->br_nfiles); ++ dentry = decode_by_dir_ino(sb, ino, dir_ino, &nsi_lock); ++ if (IS_ERR(dentry)) ++ goto out_unlock; ++ if (dentry) ++ goto accept; ++ ++ /* lookup path */ ++ dentry = decode_by_path(sb, ino, fh, fh_len, &nsi_lock); ++ if (IS_ERR(dentry)) ++ goto out_unlock; ++ if (unlikely(!dentry)) ++ /* todo?: make it ESTALE */ ++ goto out_unlock; ++ ++accept: ++ if (!au_digen_test(dentry, au_sigen(sb)) ++ && d_inode(dentry)->i_generation == fh[Fh_igen]) ++ goto out_unlock; /* success */ ++ ++ dput(dentry); ++ dentry = ERR_PTR(-ESTALE); ++out_unlock: ++ if (br) ++ au_lcnt_dec(&br->br_nfiles); ++ si_read_unlock(sb); ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++#if 0 /* reserved for future use */ ++/* support subtreecheck option */ ++static struct dentry *aufs_fh_to_parent(struct super_block *sb, struct fid *fid, ++ int fh_len, int fh_type) ++{ ++ struct dentry *parent; ++ __u32 *fh = fid->raw; ++ ino_t dir_ino; ++ ++ dir_ino = decode_ino(fh + Fh_dir_ino); ++ parent = decode_by_ino(sb, dir_ino, 0); ++ if (IS_ERR(parent)) ++ goto out; ++ if (!parent) ++ parent = decode_by_path(sb, au_br_index(sb, fh[Fh_br_id]), ++ dir_ino, fh, fh_len); ++ ++out: ++ AuTraceErrPtr(parent); ++ return parent; ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_encode_fh(struct inode *inode, __u32 *fh, int *max_len, ++ struct inode *dir) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct super_block *sb, *h_sb; ++ struct dentry *dentry, *parent, *h_parent; ++ struct inode *h_dir; ++ struct au_branch *br; ++ ++ err = -ENOSPC; ++ if (unlikely(*max_len <= Fh_tail)) { ++ AuWarn1("NFSv2 client (max_len %d)?\n", *max_len); ++ goto out; ++ } ++ ++ err = FILEID_ROOT; ++ if (inode->i_ino == AUFS_ROOT_INO) { ++ AuDebugOn(inode->i_ino != AUFS_ROOT_INO); ++ goto out; ++ } ++ ++ h_parent = NULL; ++ sb = inode->i_sb; ++ err = si_read_lock(sb, AuLock_FLUSH); ++ if (unlikely(err)) ++ goto out; ++ ++#ifdef CONFIG_AUFS_DEBUG ++ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) ++ AuWarn1("NFS-exporting requires xino\n"); ++#endif ++ err = -EIO; ++ parent = NULL; ++ ii_read_lock_child(inode); ++ bindex = au_ibtop(inode); ++ if (!dir) { ++ dentry = d_find_any_alias(inode); ++ if (unlikely(!dentry)) ++ goto out_unlock; ++ AuDebugOn(au_test_anon(dentry)); ++ parent = dget_parent(dentry); ++ dput(dentry); ++ if (unlikely(!parent)) ++ goto out_unlock; ++ if (d_really_is_positive(parent)) ++ dir = d_inode(parent); ++ } ++ ++ ii_read_lock_parent(dir); ++ h_dir = au_h_iptr(dir, bindex); ++ ii_read_unlock(dir); ++ if (unlikely(!h_dir)) ++ goto out_parent; ++ h_parent = d_find_any_alias(h_dir); ++ if (unlikely(!h_parent)) ++ goto out_hparent; ++ ++ err = -EPERM; ++ br = au_sbr(sb, bindex); ++ h_sb = au_br_sb(br); ++ if (unlikely(!h_sb->s_export_op)) { ++ AuErr1("%s branch is not exportable\n", au_sbtype(h_sb)); ++ goto out_hparent; ++ } ++ ++ fh[Fh_br_id] = br->br_id; ++ fh[Fh_sigen] = au_sigen(sb); ++ encode_ino(fh + Fh_ino, inode->i_ino); ++ encode_ino(fh + Fh_dir_ino, dir->i_ino); ++ fh[Fh_igen] = inode->i_generation; ++ ++ *max_len -= Fh_tail; ++ fh[Fh_h_type] = exportfs_encode_fh(h_parent, (void *)(fh + Fh_tail), ++ max_len, ++ /*connectable or subtreecheck*/0); ++ err = fh[Fh_h_type]; ++ *max_len += Fh_tail; ++ /* todo: macros? */ ++ if (err != FILEID_INVALID) ++ err = 99; ++ else ++ AuWarn1("%s encode_fh failed\n", au_sbtype(h_sb)); ++ ++out_hparent: ++ dput(h_parent); ++out_parent: ++ dput(parent); ++out_unlock: ++ ii_read_unlock(inode); ++ si_read_unlock(sb); ++out: ++ if (unlikely(err < 0)) ++ err = FILEID_INVALID; ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_commit_metadata(struct inode *inode) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct super_block *sb; ++ struct inode *h_inode; ++ int (*f)(struct inode *inode); ++ ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ii_write_lock_child(inode); ++ bindex = au_ibtop(inode); ++ AuDebugOn(bindex < 0); ++ h_inode = au_h_iptr(inode, bindex); ++ ++ f = h_inode->i_sb->s_export_op->commit_metadata; ++ if (f) ++ err = f(h_inode); ++ else { ++ struct writeback_control wbc = { ++ .sync_mode = WB_SYNC_ALL, ++ .nr_to_write = 0 /* metadata only */ ++ }; ++ ++ err = sync_inode(h_inode, &wbc); ++ } ++ ++ au_cpup_attr_timesizes(inode); ++ ii_write_unlock(inode); ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct export_operations aufs_export_op = { ++ .fh_to_dentry = aufs_fh_to_dentry, ++ /* .fh_to_parent = aufs_fh_to_parent, */ ++ .encode_fh = aufs_encode_fh, ++ .commit_metadata = aufs_commit_metadata ++}; ++ ++void au_export_init(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ __u32 u; ++ ++ BUILD_BUG_ON_MSG(IS_BUILTIN(CONFIG_AUFS_FS) ++ && IS_MODULE(CONFIG_EXPORTFS), ++ AUFS_NAME ": unsupported configuration " ++ "CONFIG_EXPORTFS=m and CONFIG_AUFS_FS=y"); ++ ++ sb->s_export_op = &aufs_export_op; ++ sbinfo = au_sbi(sb); ++ sbinfo->si_xigen = NULL; ++ get_random_bytes(&u, sizeof(u)); ++ BUILD_BUG_ON(sizeof(u) != sizeof(int)); ++ atomic_set(&sbinfo->si_xigen_next, u); ++} +diff --git a/fs/aufs/f_op.c b/fs/aufs/f_op.c +new file mode 100644 +index 000000000000..5fda8c253d28 +--- /dev/null ++++ b/fs/aufs/f_op.c +@@ -0,0 +1,806 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * file and vm operations ++ */ ++ ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++int au_do_open_nondir(struct file *file, int flags, struct file *h_file) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct dentry *dentry, *h_dentry; ++ struct au_finfo *finfo; ++ struct inode *h_inode; ++ ++ FiMustWriteLock(file); ++ ++ err = 0; ++ dentry = file->f_path.dentry; ++ AuDebugOn(IS_ERR_OR_NULL(dentry)); ++ finfo = au_fi(file); ++ memset(&finfo->fi_htop, 0, sizeof(finfo->fi_htop)); ++ atomic_set(&finfo->fi_mmapped, 0); ++ bindex = au_dbtop(dentry); ++ if (!h_file) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); ++ if (unlikely(err)) ++ goto out; ++ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); ++ if (IS_ERR(h_file)) { ++ err = PTR_ERR(h_file); ++ goto out; ++ } ++ } else { ++ h_dentry = h_file->f_path.dentry; ++ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); ++ if (unlikely(err)) ++ goto out; ++ /* br ref is already inc-ed */ ++ } ++ ++ if ((flags & __O_TMPFILE) ++ && !(flags & O_EXCL)) { ++ h_inode = file_inode(h_file); ++ spin_lock(&h_inode->i_lock); ++ h_inode->i_state |= I_LINKABLE; ++ spin_unlock(&h_inode->i_lock); ++ } ++ au_set_fbtop(file, bindex); ++ au_set_h_fptr(file, bindex, h_file); ++ au_update_figen(file); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ ++out: ++ return err; ++} ++ ++static int aufs_open_nondir(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ int err; ++ struct super_block *sb; ++ struct au_do_open_args args = { ++ .open = au_do_open_nondir ++ }; ++ ++ AuDbg("%pD, f_flags 0x%x, f_mode 0x%x\n", ++ file, vfsub_file_flags(file), file->f_mode); ++ ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ err = au_do_open(file, &args); ++ si_read_unlock(sb); ++ return err; ++} ++ ++int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file) ++{ ++ struct au_finfo *finfo; ++ aufs_bindex_t bindex; ++ ++ finfo = au_fi(file); ++ au_hbl_del(&finfo->fi_hlist, ++ &au_sbi(file->f_path.dentry->d_sb)->si_files); ++ bindex = finfo->fi_btop; ++ if (bindex >= 0) ++ au_set_h_fptr(file, bindex, NULL); ++ ++ au_finfo_fin(file); ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_flush_nondir(struct file *file, fl_owner_t id) ++{ ++ int err; ++ struct file *h_file; ++ ++ err = 0; ++ h_file = au_hf_top(file); ++ if (h_file) ++ err = vfsub_flush(h_file, id); ++ return err; ++} ++ ++static int aufs_flush_nondir(struct file *file, fl_owner_t id) ++{ ++ return au_do_flush(file, id, au_do_flush_nondir); ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * read and write functions acquire [fdi]_rwsem once, but release before ++ * mmap_sem. This is because to stop a race condition between mmap(2). ++ * Releasing these aufs-rwsem should be safe, no branch-management (by keeping ++ * si_rwsem), no harmful copy-up should happen. Actually copy-up may happen in ++ * read functions after [fdi]_rwsem are released, but it should be harmless. ++ */ ++ ++/* Callers should call au_read_post() or fput() in the end */ ++struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc) ++{ ++ struct file *h_file; ++ int err; ++ ++ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0, lsc); ++ if (!err) { ++ di_read_unlock(file->f_path.dentry, AuLock_IR); ++ h_file = au_hf_top(file); ++ get_file(h_file); ++ if (!keep_fi) ++ fi_read_unlock(file); ++ } else ++ h_file = ERR_PTR(err); ++ ++ return h_file; ++} ++ ++static void au_read_post(struct inode *inode, struct file *h_file) ++{ ++ /* update without lock, I don't think it a problem */ ++ fsstack_copy_attr_atime(inode, file_inode(h_file)); ++ fput(h_file); ++} ++ ++struct au_write_pre { ++ /* input */ ++ unsigned int lsc; ++ ++ /* output */ ++ blkcnt_t blks; ++ aufs_bindex_t btop; ++}; ++ ++/* ++ * return with iinfo is write-locked ++ * callers should call au_write_post() or iinfo_write_unlock() + fput() in the ++ * end ++ */ ++static struct file *au_write_pre(struct file *file, int do_ready, ++ struct au_write_pre *wpre) ++{ ++ struct file *h_file; ++ struct dentry *dentry; ++ int err; ++ unsigned int lsc; ++ struct au_pin pin; ++ ++ lsc = 0; ++ if (wpre) ++ lsc = wpre->lsc; ++ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, lsc); ++ h_file = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ dentry = file->f_path.dentry; ++ if (do_ready) { ++ err = au_ready_to_write(file, -1, &pin); ++ if (unlikely(err)) { ++ h_file = ERR_PTR(err); ++ di_write_unlock(dentry); ++ goto out_fi; ++ } ++ } ++ ++ di_downgrade_lock(dentry, /*flags*/0); ++ if (wpre) ++ wpre->btop = au_fbtop(file); ++ h_file = au_hf_top(file); ++ get_file(h_file); ++ if (wpre) ++ wpre->blks = file_inode(h_file)->i_blocks; ++ if (do_ready) ++ au_unpin(&pin); ++ di_read_unlock(dentry, /*flags*/0); ++ ++out_fi: ++ fi_write_unlock(file); ++out: ++ return h_file; ++} ++ ++static void au_write_post(struct inode *inode, struct file *h_file, ++ struct au_write_pre *wpre, ssize_t written) ++{ ++ struct inode *h_inode; ++ ++ au_cpup_attr_timesizes(inode); ++ AuDebugOn(au_ibtop(inode) != wpre->btop); ++ h_inode = file_inode(h_file); ++ inode->i_mode = h_inode->i_mode; ++ ii_write_unlock(inode); ++ /* AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks); */ ++ if (written > 0) ++ au_fhsm_wrote(inode->i_sb, wpre->btop, ++ /*force*/h_inode->i_blocks > wpre->blks); ++ fput(h_file); ++} ++ ++static ssize_t aufs_read(struct file *file, char __user *buf, size_t count, ++ loff_t *ppos) ++{ ++ ssize_t err; ++ struct inode *inode; ++ struct file *h_file; ++ struct super_block *sb; ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ /* filedata may be obsoleted by concurrent copyup, but no problem */ ++ err = vfsub_read_u(h_file, buf, count, ppos); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ au_read_post(inode, h_file); ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ++ * todo: very ugly ++ * it locks both of i_mutex and si_rwsem for read in safe. ++ * if the plink maintenance mode continues forever (that is the problem), ++ * may loop forever. ++ */ ++static void au_mtx_and_read_lock(struct inode *inode) ++{ ++ int err; ++ struct super_block *sb = inode->i_sb; ++ ++ while (1) { ++ inode_lock(inode); ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (!err) ++ break; ++ inode_unlock(inode); ++ si_read_lock(sb, AuLock_NOPLMW); ++ si_read_unlock(sb); ++ } ++} ++ ++static ssize_t aufs_write(struct file *file, const char __user *ubuf, ++ size_t count, loff_t *ppos) ++{ ++ ssize_t err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *h_file; ++ char __user *buf = (char __user *)ubuf; ++ ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = vfsub_write_u(h_file, buf, count, ppos); ++ au_write_post(inode, h_file, &wpre, err); ++ ++out: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++static ssize_t au_do_iter(struct file *h_file, int rw, struct kiocb *kio, ++ struct iov_iter *iov_iter) ++{ ++ ssize_t err; ++ struct file *file; ++ ssize_t (*iter)(struct kiocb *, struct iov_iter *); ++ ++ err = security_file_permission(h_file, rw); ++ if (unlikely(err)) ++ goto out; ++ ++ err = -ENOSYS; ++ iter = NULL; ++ if (rw == MAY_READ) ++ iter = h_file->f_op->read_iter; ++ else if (rw == MAY_WRITE) ++ iter = h_file->f_op->write_iter; ++ ++ file = kio->ki_filp; ++ kio->ki_filp = h_file; ++ if (iter) { ++ lockdep_off(); ++ err = iter(kio, iov_iter); ++ lockdep_on(); ++ } else ++ /* currently there is no such fs */ ++ WARN_ON_ONCE(1); ++ kio->ki_filp = file; ++ ++out: ++ return err; ++} ++ ++static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter) ++{ ++ ssize_t err; ++ struct file *file, *h_file; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ file = kio->ki_filp; ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/1, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ if (au_test_loopback_kthread()) { ++ au_warn_loopback(h_file->f_path.dentry->d_sb); ++ if (file->f_mapping != h_file->f_mapping) { ++ file->f_mapping = h_file->f_mapping; ++ smp_mb(); /* unnecessary? */ ++ } ++ } ++ fi_read_unlock(file); ++ ++ err = au_do_iter(h_file, MAY_READ, kio, iov_iter); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ au_read_post(inode, h_file); ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++static ssize_t aufs_write_iter(struct kiocb *kio, struct iov_iter *iov_iter) ++{ ++ ssize_t err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *file, *h_file; ++ ++ file = kio->ki_filp; ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = au_do_iter(h_file, MAY_WRITE, kio, iov_iter); ++ au_write_post(inode, h_file, &wpre, err); ++ ++out: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++static ssize_t aufs_splice_read(struct file *file, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags) ++{ ++ ssize_t err; ++ struct file *h_file; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = vfsub_splice_to(h_file, ppos, pipe, len, flags); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ au_read_post(inode, h_file); ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++static ssize_t ++aufs_splice_write(struct pipe_inode_info *pipe, struct file *file, loff_t *ppos, ++ size_t len, unsigned int flags) ++{ ++ ssize_t err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *h_file; ++ ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = vfsub_splice_from(pipe, h_file, ppos, len, flags); ++ au_write_post(inode, h_file, &wpre, err); ++ ++out: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++static long aufs_fallocate(struct file *file, int mode, loff_t offset, ++ loff_t len) ++{ ++ long err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *h_file; ++ ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_fallocate(h_file, mode, offset, len); ++ lockdep_on(); ++ au_write_post(inode, h_file, &wpre, /*written*/1); ++ ++out: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++static ssize_t aufs_copy_file_range(struct file *src, loff_t src_pos, ++ struct file *dst, loff_t dst_pos, ++ size_t len, unsigned int flags) ++{ ++ ssize_t err; ++ struct au_write_pre wpre; ++ enum { SRC, DST }; ++ struct { ++ struct inode *inode; ++ struct file *h_file; ++ struct super_block *h_sb; ++ } a[2]; ++#define a_src a[SRC] ++#define a_dst a[DST] ++ ++ err = -EINVAL; ++ a_src.inode = file_inode(src); ++ if (unlikely(!S_ISREG(a_src.inode->i_mode))) ++ goto out; ++ a_dst.inode = file_inode(dst); ++ if (unlikely(!S_ISREG(a_dst.inode->i_mode))) ++ goto out; ++ ++ au_mtx_and_read_lock(a_dst.inode); ++ /* ++ * in order to match the order in di_write_lock2_{child,parent}(), ++ * use f_path.dentry for this comparison. ++ */ ++ if (src->f_path.dentry < dst->f_path.dentry) { ++ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_1); ++ err = PTR_ERR(a_src.h_file); ++ if (IS_ERR(a_src.h_file)) ++ goto out_si; ++ ++ wpre.lsc = AuLsc_FI_2; ++ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); ++ err = PTR_ERR(a_dst.h_file); ++ if (IS_ERR(a_dst.h_file)) { ++ au_read_post(a_src.inode, a_src.h_file); ++ goto out_si; ++ } ++ } else { ++ wpre.lsc = AuLsc_FI_1; ++ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); ++ err = PTR_ERR(a_dst.h_file); ++ if (IS_ERR(a_dst.h_file)) ++ goto out_si; ++ ++ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_2); ++ err = PTR_ERR(a_src.h_file); ++ if (IS_ERR(a_src.h_file)) { ++ au_write_post(a_dst.inode, a_dst.h_file, &wpre, ++ /*written*/0); ++ goto out_si; ++ } ++ } ++ ++ err = -EXDEV; ++ a_src.h_sb = file_inode(a_src.h_file)->i_sb; ++ a_dst.h_sb = file_inode(a_dst.h_file)->i_sb; ++ if (unlikely(a_src.h_sb != a_dst.h_sb)) { ++ AuDbgFile(src); ++ AuDbgFile(dst); ++ goto out_file; ++ } ++ ++ err = vfsub_copy_file_range(a_src.h_file, src_pos, a_dst.h_file, ++ dst_pos, len, flags); ++ ++out_file: ++ au_write_post(a_dst.inode, a_dst.h_file, &wpre, err); ++ fi_read_unlock(src); ++ au_read_post(a_src.inode, a_src.h_file); ++out_si: ++ si_read_unlock(a_dst.inode->i_sb); ++ inode_unlock(a_dst.inode); ++out: ++ return err; ++#undef a_src ++#undef a_dst ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * The locking order around current->mmap_sem. ++ * - in most and regular cases ++ * file I/O syscall -- aufs_read() or something ++ * -- si_rwsem for read -- mmap_sem ++ * (Note that [fdi]i_rwsem are released before mmap_sem). ++ * - in mmap case ++ * mmap(2) -- mmap_sem -- aufs_mmap() -- si_rwsem for read -- [fdi]i_rwsem ++ * This AB-BA order is definitely bad, but is not a problem since "si_rwsem for ++ * read" allows multiple processes to acquire it and [fdi]i_rwsem are not held ++ * in file I/O. Aufs needs to stop lockdep in aufs_mmap() though. ++ * It means that when aufs acquires si_rwsem for write, the process should never ++ * acquire mmap_sem. ++ * ++ * Actually aufs_iterate() holds [fdi]i_rwsem before mmap_sem, but this is not a ++ * problem either since any directory is not able to be mmap-ed. ++ * The similar scenario is applied to aufs_readlink() too. ++ */ ++ ++#if 0 /* stop calling security_file_mmap() */ ++/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */ ++#define AuConv_VM_PROT(f, b) _calc_vm_trans(f, VM_##b, PROT_##b) ++ ++static unsigned long au_arch_prot_conv(unsigned long flags) ++{ ++ /* currently ppc64 only */ ++#ifdef CONFIG_PPC64 ++ /* cf. linux/arch/powerpc/include/asm/mman.h */ ++ AuDebugOn(arch_calc_vm_prot_bits(-1) != VM_SAO); ++ return AuConv_VM_PROT(flags, SAO); ++#else ++ AuDebugOn(arch_calc_vm_prot_bits(-1)); ++ return 0; ++#endif ++} ++ ++static unsigned long au_prot_conv(unsigned long flags) ++{ ++ return AuConv_VM_PROT(flags, READ) ++ | AuConv_VM_PROT(flags, WRITE) ++ | AuConv_VM_PROT(flags, EXEC) ++ | au_arch_prot_conv(flags); ++} ++ ++/* cf. linux/include/linux/mman.h: calc_vm_flag_bits() */ ++#define AuConv_VM_MAP(f, b) _calc_vm_trans(f, VM_##b, MAP_##b) ++ ++static unsigned long au_flag_conv(unsigned long flags) ++{ ++ return AuConv_VM_MAP(flags, GROWSDOWN) ++ | AuConv_VM_MAP(flags, DENYWRITE) ++ | AuConv_VM_MAP(flags, LOCKED); ++} ++#endif ++ ++static int aufs_mmap(struct file *file, struct vm_area_struct *vma) ++{ ++ int err; ++ const unsigned char wlock ++ = (file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED); ++ struct super_block *sb; ++ struct file *h_file; ++ struct inode *inode; ++ ++ AuDbgVmRegion(file, vma); ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ lockdep_off(); ++ si_read_lock(sb, AuLock_NOPLMW); ++ ++ h_file = au_write_pre(file, wlock, /*wpre*/NULL); ++ lockdep_on(); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = 0; ++ au_set_mmapped(file); ++ au_vm_file_reset(vma, h_file); ++ /* ++ * we cannot call security_mmap_file() here since it may acquire ++ * mmap_sem or i_mutex. ++ * ++ * err = security_mmap_file(h_file, au_prot_conv(vma->vm_flags), ++ * au_flag_conv(vma->vm_flags)); ++ */ ++ if (!err) ++ err = call_mmap(h_file, vma); ++ if (!err) { ++ au_vm_prfile_set(vma, file); ++ fsstack_copy_attr_atime(inode, file_inode(h_file)); ++ goto out_fput; /* success */ ++ } ++ au_unset_mmapped(file); ++ au_vm_file_reset(vma, file); ++ ++out_fput: ++ lockdep_off(); ++ ii_write_unlock(inode); ++ lockdep_on(); ++ fput(h_file); ++out: ++ lockdep_off(); ++ si_read_unlock(sb); ++ lockdep_on(); ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_fsync_nondir(struct file *file, loff_t start, loff_t end, ++ int datasync) ++{ ++ int err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *h_file; ++ ++ err = 0; /* -EBADF; */ /* posix? */ ++ if (unlikely(!(file->f_mode & FMODE_WRITE))) ++ goto out; ++ ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out_unlock; ++ ++ err = vfsub_fsync(h_file, &h_file->f_path, datasync); ++ au_write_post(inode, h_file, &wpre, /*written*/0); ++ ++out_unlock: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++out: ++ return err; ++} ++ ++static int aufs_fasync(int fd, struct file *file, int flag) ++{ ++ int err; ++ struct file *h_file; ++ struct super_block *sb; ++ ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ if (h_file->f_op->fasync) ++ err = h_file->f_op->fasync(fd, h_file, flag); ++ fput(h_file); /* instead of au_read_post() */ ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++static int aufs_setfl(struct file *file, unsigned long arg) ++{ ++ int err; ++ struct file *h_file; ++ struct super_block *sb; ++ ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ /* stop calling h_file->fasync */ ++ arg |= vfsub_file_flags(file) & FASYNC; ++ err = setfl(/*unused fd*/-1, h_file, arg); ++ fput(h_file); /* instead of au_read_post() */ ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* no one supports this operation, currently */ ++#if 0 ++static ssize_t aufs_sendpage(struct file *file, struct page *page, int offset, ++ size_t len, loff_t *pos, int more) ++{ ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++const struct file_operations aufs_file_fop = { ++ .owner = THIS_MODULE, ++ ++ .llseek = default_llseek, ++ ++ .read = aufs_read, ++ .write = aufs_write, ++ .read_iter = aufs_read_iter, ++ .write_iter = aufs_write_iter, ++ ++#ifdef CONFIG_AUFS_POLL ++ .poll = aufs_poll, ++#endif ++ .unlocked_ioctl = aufs_ioctl_nondir, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = aufs_compat_ioctl_nondir, ++#endif ++ .mmap = aufs_mmap, ++ .open = aufs_open_nondir, ++ .flush = aufs_flush_nondir, ++ .release = aufs_release_nondir, ++ .fsync = aufs_fsync_nondir, ++ .fasync = aufs_fasync, ++ /* .sendpage = aufs_sendpage, */ ++ .setfl = aufs_setfl, ++ .splice_write = aufs_splice_write, ++ .splice_read = aufs_splice_read, ++#if 0 ++ .aio_splice_write = aufs_aio_splice_write, ++ .aio_splice_read = aufs_aio_splice_read, ++#endif ++ .fallocate = aufs_fallocate, ++ .copy_file_range = aufs_copy_file_range ++}; +diff --git a/fs/aufs/fhsm.c b/fs/aufs/fhsm.c +new file mode 100644 +index 000000000000..fe8c97490122 +--- /dev/null ++++ b/fs/aufs/fhsm.c +@@ -0,0 +1,413 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2011-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * File-based Hierarchy Storage Management ++ */ ++ ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++static aufs_bindex_t au_fhsm_bottom(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ AuDebugOn(!fhsm); ++ return fhsm->fhsm_bottom; ++} ++ ++void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ AuDebugOn(!fhsm); ++ fhsm->fhsm_bottom = bindex; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_fhsm_test_jiffy(struct au_sbinfo *sbinfo, struct au_branch *br) ++{ ++ struct au_br_fhsm *bf; ++ ++ bf = br->br_fhsm; ++ MtxMustLock(&bf->bf_lock); ++ ++ return !bf->bf_readable ++ || time_after(jiffies, ++ bf->bf_jiffy + sbinfo->si_fhsm.fhsm_expire); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_fhsm_notify(struct super_block *sb, int val) ++{ ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ if (au_fhsm_pid(fhsm) ++ && atomic_read(&fhsm->fhsm_readable) != -1) { ++ atomic_set(&fhsm->fhsm_readable, val); ++ if (val) ++ wake_up(&fhsm->fhsm_wqh); ++ } ++} ++ ++static int au_fhsm_stfs(struct super_block *sb, aufs_bindex_t bindex, ++ struct aufs_stfs *rstfs, int do_lock, int do_notify) ++{ ++ int err; ++ struct au_branch *br; ++ struct au_br_fhsm *bf; ++ ++ br = au_sbr(sb, bindex); ++ AuDebugOn(au_br_rdonly(br)); ++ bf = br->br_fhsm; ++ AuDebugOn(!bf); ++ ++ if (do_lock) ++ mutex_lock(&bf->bf_lock); ++ else ++ MtxMustLock(&bf->bf_lock); ++ ++ /* sb->s_root for NFS is unreliable */ ++ err = au_br_stfs(br, &bf->bf_stfs); ++ if (unlikely(err)) { ++ AuErr1("FHSM failed (%d), b%d, ignored.\n", bindex, err); ++ goto out; ++ } ++ ++ bf->bf_jiffy = jiffies; ++ bf->bf_readable = 1; ++ if (do_notify) ++ au_fhsm_notify(sb, /*val*/1); ++ if (rstfs) ++ *rstfs = bf->bf_stfs; ++ ++out: ++ if (do_lock) ++ mutex_unlock(&bf->bf_lock); ++ au_fhsm_notify(sb, /*val*/1); ++ ++ return err; ++} ++ ++void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ struct au_branch *br; ++ struct au_br_fhsm *bf; ++ ++ AuDbg("b%d, force %d\n", bindex, force); ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ if (!au_ftest_si(sbinfo, FHSM) ++ || fhsm->fhsm_bottom == bindex) ++ return; ++ ++ br = au_sbr(sb, bindex); ++ bf = br->br_fhsm; ++ AuDebugOn(!bf); ++ mutex_lock(&bf->bf_lock); ++ if (force ++ || au_fhsm_pid(fhsm) ++ || au_fhsm_test_jiffy(sbinfo, br)) ++ err = au_fhsm_stfs(sb, bindex, /*rstfs*/NULL, /*do_lock*/0, ++ /*do_notify*/1); ++ mutex_unlock(&bf->bf_lock); ++} ++ ++void au_fhsm_wrote_all(struct super_block *sb, int force) ++{ ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ /* exclude the bottom */ ++ bbot = au_fhsm_bottom(sb); ++ for (bindex = 0; bindex < bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_fhsm(br->br_perm)) ++ au_fhsm_wrote(sb, bindex, force); ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static __poll_t au_fhsm_poll(struct file *file, struct poll_table_struct *wait) ++{ ++ __poll_t mask; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ mask = 0; ++ sbinfo = file->private_data; ++ fhsm = &sbinfo->si_fhsm; ++ poll_wait(file, &fhsm->fhsm_wqh, wait); ++ if (atomic_read(&fhsm->fhsm_readable)) ++ mask = EPOLLIN /* | EPOLLRDNORM */; ++ ++ if (!mask) ++ AuDbg("mask 0x%x\n", mask); ++ return mask; ++} ++ ++static int au_fhsm_do_read_one(struct aufs_stbr __user *stbr, ++ struct aufs_stfs *stfs, __s16 brid) ++{ ++ int err; ++ ++ err = copy_to_user(&stbr->stfs, stfs, sizeof(*stfs)); ++ if (!err) ++ err = __put_user(brid, &stbr->brid); ++ if (unlikely(err)) ++ err = -EFAULT; ++ ++ return err; ++} ++ ++static ssize_t au_fhsm_do_read(struct super_block *sb, ++ struct aufs_stbr __user *stbr, size_t count) ++{ ++ ssize_t err; ++ int nstbr; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ struct au_br_fhsm *bf; ++ ++ /* except the bottom branch */ ++ err = 0; ++ nstbr = 0; ++ bbot = au_fhsm_bottom(sb); ++ for (bindex = 0; !err && bindex < bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!au_br_fhsm(br->br_perm)) ++ continue; ++ ++ bf = br->br_fhsm; ++ mutex_lock(&bf->bf_lock); ++ if (bf->bf_readable) { ++ err = -EFAULT; ++ if (count >= sizeof(*stbr)) ++ err = au_fhsm_do_read_one(stbr++, &bf->bf_stfs, ++ br->br_id); ++ if (!err) { ++ bf->bf_readable = 0; ++ count -= sizeof(*stbr); ++ nstbr++; ++ } ++ } ++ mutex_unlock(&bf->bf_lock); ++ } ++ if (!err) ++ err = sizeof(*stbr) * nstbr; ++ ++ return err; ++} ++ ++static ssize_t au_fhsm_read(struct file *file, char __user *buf, size_t count, ++ loff_t *pos) ++{ ++ ssize_t err; ++ int readable; ++ aufs_bindex_t nfhsm, bindex, bbot; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ struct au_branch *br; ++ struct super_block *sb; ++ ++ err = 0; ++ sbinfo = file->private_data; ++ fhsm = &sbinfo->si_fhsm; ++need_data: ++ spin_lock_irq(&fhsm->fhsm_wqh.lock); ++ if (!atomic_read(&fhsm->fhsm_readable)) { ++ if (vfsub_file_flags(file) & O_NONBLOCK) ++ err = -EAGAIN; ++ else ++ err = wait_event_interruptible_locked_irq ++ (fhsm->fhsm_wqh, ++ atomic_read(&fhsm->fhsm_readable)); ++ } ++ spin_unlock_irq(&fhsm->fhsm_wqh.lock); ++ if (unlikely(err)) ++ goto out; ++ ++ /* sb may already be dead */ ++ au_rw_read_lock(&sbinfo->si_rwsem); ++ readable = atomic_read(&fhsm->fhsm_readable); ++ if (readable > 0) { ++ sb = sbinfo->si_sb; ++ AuDebugOn(!sb); ++ /* exclude the bottom branch */ ++ nfhsm = 0; ++ bbot = au_fhsm_bottom(sb); ++ for (bindex = 0; bindex < bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_fhsm(br->br_perm)) ++ nfhsm++; ++ } ++ err = -EMSGSIZE; ++ if (nfhsm * sizeof(struct aufs_stbr) <= count) { ++ atomic_set(&fhsm->fhsm_readable, 0); ++ err = au_fhsm_do_read(sbinfo->si_sb, (void __user *)buf, ++ count); ++ } ++ } ++ au_rw_read_unlock(&sbinfo->si_rwsem); ++ if (!readable) ++ goto need_data; ++ ++out: ++ return err; ++} ++ ++static int au_fhsm_release(struct inode *inode, struct file *file) ++{ ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ /* sb may already be dead */ ++ sbinfo = file->private_data; ++ fhsm = &sbinfo->si_fhsm; ++ spin_lock(&fhsm->fhsm_spin); ++ fhsm->fhsm_pid = 0; ++ spin_unlock(&fhsm->fhsm_spin); ++ kobject_put(&sbinfo->si_kobj); ++ ++ return 0; ++} ++ ++static const struct file_operations au_fhsm_fops = { ++ .owner = THIS_MODULE, ++ .llseek = noop_llseek, ++ .read = au_fhsm_read, ++ .poll = au_fhsm_poll, ++ .release = au_fhsm_release ++}; ++ ++int au_fhsm_fd(struct super_block *sb, int oflags) ++{ ++ int err, fd; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ err = -EPERM; ++ if (unlikely(!capable(CAP_SYS_ADMIN))) ++ goto out; ++ ++ err = -EINVAL; ++ if (unlikely(oflags & ~(O_CLOEXEC | O_NONBLOCK))) ++ goto out; ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ spin_lock(&fhsm->fhsm_spin); ++ if (!fhsm->fhsm_pid) ++ fhsm->fhsm_pid = current->pid; ++ else ++ err = -EBUSY; ++ spin_unlock(&fhsm->fhsm_spin); ++ if (unlikely(err)) ++ goto out; ++ ++ oflags |= O_RDONLY; ++ /* oflags |= FMODE_NONOTIFY; */ ++ fd = anon_inode_getfd("[aufs_fhsm]", &au_fhsm_fops, sbinfo, oflags); ++ err = fd; ++ if (unlikely(fd < 0)) ++ goto out_pid; ++ ++ /* succeed regardless 'fhsm' status */ ++ kobject_get(&sbinfo->si_kobj); ++ si_noflush_read_lock(sb); ++ if (au_ftest_si(sbinfo, FHSM)) ++ au_fhsm_wrote_all(sb, /*force*/0); ++ si_read_unlock(sb); ++ goto out; /* success */ ++ ++out_pid: ++ spin_lock(&fhsm->fhsm_spin); ++ fhsm->fhsm_pid = 0; ++ spin_unlock(&fhsm->fhsm_spin); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_fhsm_br_alloc(struct au_branch *br) ++{ ++ int err; ++ ++ err = 0; ++ br->br_fhsm = kmalloc(sizeof(*br->br_fhsm), GFP_NOFS); ++ if (br->br_fhsm) ++ au_br_fhsm_init(br->br_fhsm); ++ else ++ err = -ENOMEM; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_fhsm_fin(struct super_block *sb) ++{ ++ au_fhsm_notify(sb, /*val*/-1); ++} ++ ++void au_fhsm_init(struct au_sbinfo *sbinfo) ++{ ++ struct au_fhsm *fhsm; ++ ++ fhsm = &sbinfo->si_fhsm; ++ spin_lock_init(&fhsm->fhsm_spin); ++ init_waitqueue_head(&fhsm->fhsm_wqh); ++ atomic_set(&fhsm->fhsm_readable, 0); ++ fhsm->fhsm_expire ++ = msecs_to_jiffies(AUFS_FHSM_CACHE_DEF_SEC * MSEC_PER_SEC); ++ fhsm->fhsm_bottom = -1; ++} ++ ++void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec) ++{ ++ sbinfo->si_fhsm.fhsm_expire ++ = msecs_to_jiffies(sec * MSEC_PER_SEC); ++} ++ ++void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo) ++{ ++ unsigned int u; ++ ++ if (!au_ftest_si(sbinfo, FHSM)) ++ return; ++ ++ u = jiffies_to_msecs(sbinfo->si_fhsm.fhsm_expire) / MSEC_PER_SEC; ++ if (u != AUFS_FHSM_CACHE_DEF_SEC) ++ seq_printf(seq, ",fhsm_sec=%u", u); ++} +diff --git a/fs/aufs/file.c b/fs/aufs/file.c +new file mode 100644 +index 000000000000..fa33fc2c91cb +--- /dev/null ++++ b/fs/aufs/file.c +@@ -0,0 +1,850 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * handling file/dir, and address_space operation ++ */ ++ ++#ifdef CONFIG_AUFS_DEBUG ++#include ++#endif ++#include ++#include "aufs.h" ++ ++/* drop flags for writing */ ++unsigned int au_file_roflags(unsigned int flags) ++{ ++ flags &= ~(O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC); ++ flags |= O_RDONLY | O_NOATIME; ++ return flags; ++} ++ ++/* common functions to regular file and dir */ ++struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, ++ struct file *file, int force_wr) ++{ ++ struct file *h_file; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct path h_path; ++ int err; ++ ++ /* a race condition can happen between open and unlink/rmdir */ ++ h_file = ERR_PTR(-ENOENT); ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (au_test_nfsd() && (!h_dentry || d_is_negative(h_dentry))) ++ goto out; ++ h_inode = d_inode(h_dentry); ++ spin_lock(&h_dentry->d_lock); ++ err = (!d_unhashed(dentry) && d_unlinked(h_dentry)) ++ /* || !d_inode(dentry)->i_nlink */ ++ ; ++ spin_unlock(&h_dentry->d_lock); ++ if (unlikely(err)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ br = au_sbr(sb, bindex); ++ err = au_br_test_oflag(flags, br); ++ h_file = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ /* drop flags for writing */ ++ if (au_test_ro(sb, bindex, d_inode(dentry))) { ++ if (force_wr && !(flags & O_WRONLY)) ++ force_wr = 0; ++ flags = au_file_roflags(flags); ++ if (force_wr) { ++ h_file = ERR_PTR(-EROFS); ++ flags = au_file_roflags(flags); ++ if (unlikely(vfsub_native_ro(h_inode) ++ || IS_APPEND(h_inode))) ++ goto out; ++ flags &= ~O_ACCMODE; ++ flags |= O_WRONLY; ++ } ++ } ++ flags &= ~O_CREAT; ++ au_lcnt_inc(&br->br_nfiles); ++ h_path.dentry = h_dentry; ++ h_path.mnt = au_br_mnt(br); ++ h_file = vfsub_dentry_open(&h_path, flags); ++ if (IS_ERR(h_file)) ++ goto out_br; ++ ++ if (flags & __FMODE_EXEC) { ++ err = deny_write_access(h_file); ++ if (unlikely(err)) { ++ fput(h_file); ++ h_file = ERR_PTR(err); ++ goto out_br; ++ } ++ } ++ fsnotify_open(h_file); ++ goto out; /* success */ ++ ++out_br: ++ au_lcnt_dec(&br->br_nfiles); ++out: ++ return h_file; ++} ++ ++static int au_cmoo(struct dentry *dentry) ++{ ++ int err, cmoo, matched; ++ unsigned int udba; ++ struct path h_path; ++ struct au_pin pin; ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = -1, ++ .bsrc = -1, ++ .len = -1, ++ .pin = &pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ struct inode *delegated; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ pid_t pid; ++ struct au_branch *br; ++ struct dentry *parent; ++ struct au_hinode *hdir; ++ ++ DiMustWriteLock(dentry); ++ IiMustWriteLock(d_inode(dentry)); ++ ++ err = 0; ++ if (IS_ROOT(dentry)) ++ goto out; ++ cpg.bsrc = au_dbtop(dentry); ++ if (!cpg.bsrc) ++ goto out; ++ ++ sb = dentry->d_sb; ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ pid = au_fhsm_pid(fhsm); ++ rcu_read_lock(); ++ matched = (pid ++ && (current->pid == pid ++ || rcu_dereference(current->real_parent)->pid == pid)); ++ rcu_read_unlock(); ++ if (matched) ++ goto out; ++ ++ br = au_sbr(sb, cpg.bsrc); ++ cmoo = au_br_cmoo(br->br_perm); ++ if (!cmoo) ++ goto out; ++ if (!d_is_reg(dentry)) ++ cmoo &= AuBrAttr_COO_ALL; ++ if (!cmoo) ++ goto out; ++ ++ parent = dget_parent(dentry); ++ di_write_lock_parent(parent); ++ err = au_wbr_do_copyup_bu(dentry, cpg.bsrc - 1); ++ cpg.bdst = err; ++ if (unlikely(err < 0)) { ++ err = 0; /* there is no upper writable branch */ ++ goto out_dgrade; ++ } ++ AuDbg("bsrc %d, bdst %d\n", cpg.bsrc, cpg.bdst); ++ ++ /* do not respect the coo attrib for the target branch */ ++ err = au_cpup_dirs(dentry, cpg.bdst); ++ if (unlikely(err)) ++ goto out_dgrade; ++ ++ di_downgrade_lock(parent, AuLock_IR); ++ udba = au_opt_udba(sb); ++ err = au_pin(&pin, dentry, cpg.bdst, udba, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&pin); ++ if (unlikely(err)) ++ goto out_parent; ++ if (!(cmoo & AuBrWAttr_MOO)) ++ goto out_parent; /* success */ ++ ++ err = au_pin(&pin, dentry, cpg.bsrc, udba, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ h_path.mnt = au_br_mnt(br); ++ h_path.dentry = au_h_dptr(dentry, cpg.bsrc); ++ hdir = au_hi(d_inode(parent), cpg.bsrc); ++ delegated = NULL; ++ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, /*force*/1); ++ au_unpin(&pin); ++ /* todo: keep h_dentry or not? */ ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ if (unlikely(err)) { ++ pr_err("unlink %pd after coo failed (%d), ignored\n", ++ dentry, err); ++ err = 0; ++ } ++ goto out_parent; /* success */ ++ ++out_dgrade: ++ di_downgrade_lock(parent, AuLock_IR); ++out_parent: ++ di_read_unlock(parent, AuLock_IR); ++ dput(parent); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_do_open(struct file *file, struct au_do_open_args *args) ++{ ++ int err, aopen = args->aopen; ++ struct dentry *dentry; ++ struct au_finfo *finfo; ++ ++ if (!aopen) ++ err = au_finfo_init(file, args->fidir); ++ else { ++ lockdep_off(); ++ err = au_finfo_init(file, args->fidir); ++ lockdep_on(); ++ } ++ if (unlikely(err)) ++ goto out; ++ ++ dentry = file->f_path.dentry; ++ AuDebugOn(IS_ERR_OR_NULL(dentry)); ++ di_write_lock_child(dentry); ++ err = au_cmoo(dentry); ++ di_downgrade_lock(dentry, AuLock_IR); ++ if (!err) { ++ if (!aopen) ++ err = args->open(file, vfsub_file_flags(file), NULL); ++ else { ++ lockdep_off(); ++ err = args->open(file, vfsub_file_flags(file), ++ args->h_file); ++ lockdep_on(); ++ } ++ } ++ di_read_unlock(dentry, AuLock_IR); ++ ++ finfo = au_fi(file); ++ if (!err) { ++ finfo->fi_file = file; ++ au_hbl_add(&finfo->fi_hlist, ++ &au_sbi(file->f_path.dentry->d_sb)->si_files); ++ } ++ if (!aopen) ++ fi_write_unlock(file); ++ else { ++ lockdep_off(); ++ fi_write_unlock(file); ++ lockdep_on(); ++ } ++ if (unlikely(err)) { ++ finfo->fi_hdir = NULL; ++ au_finfo_fin(file); ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_reopen_nondir(struct file *file) ++{ ++ int err; ++ aufs_bindex_t btop; ++ struct dentry *dentry; ++ struct au_branch *br; ++ struct file *h_file, *h_file_tmp; ++ ++ dentry = file->f_path.dentry; ++ btop = au_dbtop(dentry); ++ br = au_sbr(dentry->d_sb, btop); ++ h_file_tmp = NULL; ++ if (au_fbtop(file) == btop) { ++ h_file = au_hf_top(file); ++ if (file->f_mode == h_file->f_mode) ++ return 0; /* success */ ++ h_file_tmp = h_file; ++ get_file(h_file_tmp); ++ au_lcnt_inc(&br->br_nfiles); ++ au_set_h_fptr(file, btop, NULL); ++ } ++ AuDebugOn(au_fi(file)->fi_hdir); ++ /* ++ * it can happen ++ * file exists on both of rw and ro ++ * open --> dbtop and fbtop are both 0 ++ * prepend a branch as rw, "rw" become ro ++ * remove rw/file ++ * delete the top branch, "rw" becomes rw again ++ * --> dbtop is 1, fbtop is still 0 ++ * write --> fbtop is 0 but dbtop is 1 ++ */ ++ /* AuDebugOn(au_fbtop(file) < btop); */ ++ ++ h_file = au_h_open(dentry, btop, vfsub_file_flags(file) & ~O_TRUNC, ++ file, /*force_wr*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) { ++ if (h_file_tmp) { ++ /* revert */ ++ au_set_h_fptr(file, btop, h_file_tmp); ++ h_file_tmp = NULL; ++ } ++ goto out; /* todo: close all? */ ++ } ++ ++ err = 0; ++ au_set_fbtop(file, btop); ++ au_set_h_fptr(file, btop, h_file); ++ au_update_figen(file); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ ++out: ++ if (h_file_tmp) { ++ fput(h_file_tmp); ++ au_lcnt_dec(&br->br_nfiles); ++ } ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_reopen_wh(struct file *file, aufs_bindex_t btgt, ++ struct dentry *hi_wh) ++{ ++ int err; ++ aufs_bindex_t btop; ++ struct au_dinfo *dinfo; ++ struct dentry *h_dentry; ++ struct au_hdentry *hdp; ++ ++ dinfo = au_di(file->f_path.dentry); ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ btop = dinfo->di_btop; ++ dinfo->di_btop = btgt; ++ hdp = au_hdentry(dinfo, btgt); ++ h_dentry = hdp->hd_dentry; ++ hdp->hd_dentry = hi_wh; ++ err = au_reopen_nondir(file); ++ hdp->hd_dentry = h_dentry; ++ dinfo->di_btop = btop; ++ ++ return err; ++} ++ ++static int au_ready_to_write_wh(struct file *file, loff_t len, ++ aufs_bindex_t bcpup, struct au_pin *pin) ++{ ++ int err; ++ struct inode *inode, *h_inode; ++ struct dentry *h_dentry, *hi_wh; ++ struct au_cp_generic cpg = { ++ .dentry = file->f_path.dentry, ++ .bdst = bcpup, ++ .bsrc = -1, ++ .len = len, ++ .pin = pin ++ }; ++ ++ au_update_dbtop(cpg.dentry); ++ inode = d_inode(cpg.dentry); ++ h_inode = NULL; ++ if (au_dbtop(cpg.dentry) <= bcpup ++ && au_dbbot(cpg.dentry) >= bcpup) { ++ h_dentry = au_h_dptr(cpg.dentry, bcpup); ++ if (h_dentry && d_is_positive(h_dentry)) ++ h_inode = d_inode(h_dentry); ++ } ++ hi_wh = au_hi_wh(inode, bcpup); ++ if (!hi_wh && !h_inode) ++ err = au_sio_cpup_wh(&cpg, file); ++ else ++ /* already copied-up after unlink */ ++ err = au_reopen_wh(file, bcpup, hi_wh); ++ ++ if (!err ++ && (inode->i_nlink > 1 ++ || (inode->i_state & I_LINKABLE)) ++ && au_opt_test(au_mntflags(cpg.dentry->d_sb), PLINK)) ++ au_plink_append(inode, bcpup, au_h_dptr(cpg.dentry, bcpup)); ++ ++ return err; ++} ++ ++/* ++ * prepare the @file for writing. ++ */ ++int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin) ++{ ++ int err; ++ aufs_bindex_t dbtop; ++ struct dentry *parent; ++ struct inode *inode; ++ struct super_block *sb; ++ struct file *h_file; ++ struct au_cp_generic cpg = { ++ .dentry = file->f_path.dentry, ++ .bdst = -1, ++ .bsrc = -1, ++ .len = len, ++ .pin = pin, ++ .flags = AuCpup_DTIME ++ }; ++ ++ sb = cpg.dentry->d_sb; ++ inode = d_inode(cpg.dentry); ++ cpg.bsrc = au_fbtop(file); ++ err = au_test_ro(sb, cpg.bsrc, inode); ++ if (!err && (au_hf_top(file)->f_mode & FMODE_WRITE)) { ++ err = au_pin(pin, cpg.dentry, cpg.bsrc, AuOpt_UDBA_NONE, ++ /*flags*/0); ++ goto out; ++ } ++ ++ /* need to cpup or reopen */ ++ parent = dget_parent(cpg.dentry); ++ di_write_lock_parent(parent); ++ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); ++ cpg.bdst = err; ++ if (unlikely(err < 0)) ++ goto out_dgrade; ++ err = 0; ++ ++ if (!d_unhashed(cpg.dentry) && !au_h_dptr(parent, cpg.bdst)) { ++ err = au_cpup_dirs(cpg.dentry, cpg.bdst); ++ if (unlikely(err)) ++ goto out_dgrade; ++ } ++ ++ err = au_pin(pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out_dgrade; ++ ++ dbtop = au_dbtop(cpg.dentry); ++ if (dbtop <= cpg.bdst) ++ cpg.bsrc = cpg.bdst; ++ ++ if (dbtop <= cpg.bdst /* just reopen */ ++ || !d_unhashed(cpg.dentry) /* copyup and reopen */ ++ ) { ++ h_file = au_h_open_pre(cpg.dentry, cpg.bsrc, /*force_wr*/0); ++ if (IS_ERR(h_file)) ++ err = PTR_ERR(h_file); ++ else { ++ di_downgrade_lock(parent, AuLock_IR); ++ if (dbtop > cpg.bdst) ++ err = au_sio_cpup_simple(&cpg); ++ if (!err) ++ err = au_reopen_nondir(file); ++ au_h_open_post(cpg.dentry, cpg.bsrc, h_file); ++ } ++ } else { /* copyup as wh and reopen */ ++ /* ++ * since writable hfsplus branch is not supported, ++ * h_open_pre/post() are unnecessary. ++ */ ++ err = au_ready_to_write_wh(file, len, cpg.bdst, pin); ++ di_downgrade_lock(parent, AuLock_IR); ++ } ++ ++ if (!err) { ++ au_pin_set_parent_lflag(pin, /*lflag*/0); ++ goto out_dput; /* success */ ++ } ++ au_unpin(pin); ++ goto out_unlock; ++ ++out_dgrade: ++ di_downgrade_lock(parent, AuLock_IR); ++out_unlock: ++ di_read_unlock(parent, AuLock_IR); ++out_dput: ++ dput(parent); ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_do_flush(struct file *file, fl_owner_t id, ++ int (*flush)(struct file *file, fl_owner_t id)) ++{ ++ int err; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ si_noflush_read_lock(sb); ++ fi_read_lock(file); ++ ii_read_lock_child(inode); ++ ++ err = flush(file, id); ++ au_cpup_attr_timesizes(inode); ++ ++ ii_read_unlock(inode); ++ fi_read_unlock(file); ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_file_refresh_by_inode(struct file *file, int *need_reopen) ++{ ++ int err; ++ struct au_pin pin; ++ struct au_finfo *finfo; ++ struct dentry *parent, *hi_wh; ++ struct inode *inode; ++ struct super_block *sb; ++ struct au_cp_generic cpg = { ++ .dentry = file->f_path.dentry, ++ .bdst = -1, ++ .bsrc = -1, ++ .len = -1, ++ .pin = &pin, ++ .flags = AuCpup_DTIME ++ }; ++ ++ FiMustWriteLock(file); ++ ++ err = 0; ++ finfo = au_fi(file); ++ sb = cpg.dentry->d_sb; ++ inode = d_inode(cpg.dentry); ++ cpg.bdst = au_ibtop(inode); ++ if (cpg.bdst == finfo->fi_btop || IS_ROOT(cpg.dentry)) ++ goto out; ++ ++ parent = dget_parent(cpg.dentry); ++ if (au_test_ro(sb, cpg.bdst, inode)) { ++ di_read_lock_parent(parent, !AuLock_IR); ++ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); ++ cpg.bdst = err; ++ di_read_unlock(parent, !AuLock_IR); ++ if (unlikely(err < 0)) ++ goto out_parent; ++ err = 0; ++ } ++ ++ di_read_lock_parent(parent, AuLock_IR); ++ hi_wh = au_hi_wh(inode, cpg.bdst); ++ if (!S_ISDIR(inode->i_mode) ++ && au_opt_test(au_mntflags(sb), PLINK) ++ && au_plink_test(inode) ++ && !d_unhashed(cpg.dentry) ++ && cpg.bdst < au_dbtop(cpg.dentry)) { ++ err = au_test_and_cpup_dirs(cpg.dentry, cpg.bdst); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ /* always superio. */ ++ err = au_pin(&pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (!err) { ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&pin); ++ } ++ } else if (hi_wh) { ++ /* already copied-up after unlink */ ++ err = au_reopen_wh(file, cpg.bdst, hi_wh); ++ *need_reopen = 0; ++ } ++ ++out_unlock: ++ di_read_unlock(parent, AuLock_IR); ++out_parent: ++ dput(parent); ++out: ++ return err; ++} ++ ++static void au_do_refresh_dir(struct file *file) ++{ ++ aufs_bindex_t bindex, bbot, new_bindex, brid; ++ struct au_hfile *p, tmp, *q; ++ struct au_finfo *finfo; ++ struct super_block *sb; ++ struct au_fidir *fidir; ++ ++ FiMustWriteLock(file); ++ ++ sb = file->f_path.dentry->d_sb; ++ finfo = au_fi(file); ++ fidir = finfo->fi_hdir; ++ AuDebugOn(!fidir); ++ p = fidir->fd_hfile + finfo->fi_btop; ++ brid = p->hf_br->br_id; ++ bbot = fidir->fd_bbot; ++ for (bindex = finfo->fi_btop; bindex <= bbot; bindex++, p++) { ++ if (!p->hf_file) ++ continue; ++ ++ new_bindex = au_br_index(sb, p->hf_br->br_id); ++ if (new_bindex == bindex) ++ continue; ++ if (new_bindex < 0) { ++ au_set_h_fptr(file, bindex, NULL); ++ continue; ++ } ++ ++ /* swap two lower inode, and loop again */ ++ q = fidir->fd_hfile + new_bindex; ++ tmp = *q; ++ *q = *p; ++ *p = tmp; ++ if (tmp.hf_file) { ++ bindex--; ++ p--; ++ } ++ } ++ ++ p = fidir->fd_hfile; ++ if (!au_test_mmapped(file) && !d_unlinked(file->f_path.dentry)) { ++ bbot = au_sbbot(sb); ++ for (finfo->fi_btop = 0; finfo->fi_btop <= bbot; ++ finfo->fi_btop++, p++) ++ if (p->hf_file) { ++ if (file_inode(p->hf_file)) ++ break; ++ au_hfput(p, /*execed*/0); ++ } ++ } else { ++ bbot = au_br_index(sb, brid); ++ for (finfo->fi_btop = 0; finfo->fi_btop < bbot; ++ finfo->fi_btop++, p++) ++ if (p->hf_file) ++ au_hfput(p, /*execed*/0); ++ bbot = au_sbbot(sb); ++ } ++ ++ p = fidir->fd_hfile + bbot; ++ for (fidir->fd_bbot = bbot; fidir->fd_bbot >= finfo->fi_btop; ++ fidir->fd_bbot--, p--) ++ if (p->hf_file) { ++ if (file_inode(p->hf_file)) ++ break; ++ au_hfput(p, /*execed*/0); ++ } ++ AuDebugOn(fidir->fd_bbot < finfo->fi_btop); ++} ++ ++/* ++ * after branch manipulating, refresh the file. ++ */ ++static int refresh_file(struct file *file, int (*reopen)(struct file *file)) ++{ ++ int err, need_reopen, nbr; ++ aufs_bindex_t bbot, bindex; ++ struct dentry *dentry; ++ struct super_block *sb; ++ struct au_finfo *finfo; ++ struct au_hfile *hfile; ++ ++ dentry = file->f_path.dentry; ++ sb = dentry->d_sb; ++ nbr = au_sbbot(sb) + 1; ++ finfo = au_fi(file); ++ if (!finfo->fi_hdir) { ++ hfile = &finfo->fi_htop; ++ AuDebugOn(!hfile->hf_file); ++ bindex = au_br_index(sb, hfile->hf_br->br_id); ++ AuDebugOn(bindex < 0); ++ if (bindex != finfo->fi_btop) ++ au_set_fbtop(file, bindex); ++ } else { ++ err = au_fidir_realloc(finfo, nbr, /*may_shrink*/0); ++ if (unlikely(err)) ++ goto out; ++ au_do_refresh_dir(file); ++ } ++ ++ err = 0; ++ need_reopen = 1; ++ if (!au_test_mmapped(file)) ++ err = au_file_refresh_by_inode(file, &need_reopen); ++ if (finfo->fi_hdir) ++ /* harmless if err */ ++ au_fidir_realloc(finfo, nbr, /*may_shrink*/1); ++ if (!err && need_reopen && !d_unlinked(dentry)) ++ err = reopen(file); ++ if (!err) { ++ au_update_figen(file); ++ goto out; /* success */ ++ } ++ ++ /* error, close all lower files */ ++ if (finfo->fi_hdir) { ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) ++ au_set_h_fptr(file, bindex, NULL); ++ } ++ ++out: ++ return err; ++} ++ ++/* common function to regular file and dir */ ++int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), ++ int wlock, unsigned int fi_lsc) ++{ ++ int err; ++ unsigned int sigen, figen; ++ aufs_bindex_t btop; ++ unsigned char pseudo_link; ++ struct dentry *dentry; ++ struct inode *inode; ++ ++ err = 0; ++ dentry = file->f_path.dentry; ++ inode = d_inode(dentry); ++ sigen = au_sigen(dentry->d_sb); ++ fi_write_lock_nested(file, fi_lsc); ++ figen = au_figen(file); ++ if (!fi_lsc) ++ di_write_lock_child(dentry); ++ else ++ di_write_lock_child2(dentry); ++ btop = au_dbtop(dentry); ++ pseudo_link = (btop != au_ibtop(inode)); ++ if (sigen == figen && !pseudo_link && au_fbtop(file) == btop) { ++ if (!wlock) { ++ di_downgrade_lock(dentry, AuLock_IR); ++ fi_downgrade_lock(file); ++ } ++ goto out; /* success */ ++ } ++ ++ AuDbg("sigen %d, figen %d\n", sigen, figen); ++ if (au_digen_test(dentry, sigen)) { ++ err = au_reval_dpath(dentry, sigen); ++ AuDebugOn(!err && au_digen_test(dentry, sigen)); ++ } ++ ++ if (!err) ++ err = refresh_file(file, reopen); ++ if (!err) { ++ if (!wlock) { ++ di_downgrade_lock(dentry, AuLock_IR); ++ fi_downgrade_lock(file); ++ } ++ } else { ++ di_write_unlock(dentry); ++ fi_write_unlock(file); ++ } ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* cf. aufs_nopage() */ ++/* for madvise(2) */ ++static int aufs_readpage(struct file *file __maybe_unused, struct page *page) ++{ ++ unlock_page(page); ++ return 0; ++} ++ ++/* it will never be called, but necessary to support O_DIRECT */ ++static ssize_t aufs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) ++{ BUG(); return 0; } ++ ++/* they will never be called. */ ++#ifdef CONFIG_AUFS_DEBUG ++static int aufs_write_begin(struct file *file, struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned flags, ++ struct page **pagep, void **fsdata) ++{ AuUnsupport(); return 0; } ++static int aufs_write_end(struct file *file, struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned copied, ++ struct page *page, void *fsdata) ++{ AuUnsupport(); return 0; } ++static int aufs_writepage(struct page *page, struct writeback_control *wbc) ++{ AuUnsupport(); return 0; } ++ ++static int aufs_set_page_dirty(struct page *page) ++{ AuUnsupport(); return 0; } ++static void aufs_invalidatepage(struct page *page, unsigned int offset, ++ unsigned int length) ++{ AuUnsupport(); } ++static int aufs_releasepage(struct page *page, gfp_t gfp) ++{ AuUnsupport(); return 0; } ++#if 0 /* called by memory compaction regardless file */ ++static int aufs_migratepage(struct address_space *mapping, struct page *newpage, ++ struct page *page, enum migrate_mode mode) ++{ AuUnsupport(); return 0; } ++#endif ++static bool aufs_isolate_page(struct page *page, isolate_mode_t mode) ++{ AuUnsupport(); return true; } ++static void aufs_putback_page(struct page *page) ++{ AuUnsupport(); } ++static int aufs_launder_page(struct page *page) ++{ AuUnsupport(); return 0; } ++static int aufs_is_partially_uptodate(struct page *page, ++ unsigned long from, ++ unsigned long count) ++{ AuUnsupport(); return 0; } ++static void aufs_is_dirty_writeback(struct page *page, bool *dirty, ++ bool *writeback) ++{ AuUnsupport(); } ++static int aufs_error_remove_page(struct address_space *mapping, ++ struct page *page) ++{ AuUnsupport(); return 0; } ++static int aufs_swap_activate(struct swap_info_struct *sis, struct file *file, ++ sector_t *span) ++{ AuUnsupport(); return 0; } ++static void aufs_swap_deactivate(struct file *file) ++{ AuUnsupport(); } ++#endif /* CONFIG_AUFS_DEBUG */ ++ ++const struct address_space_operations aufs_aop = { ++ .readpage = aufs_readpage, ++ .direct_IO = aufs_direct_IO, ++#ifdef CONFIG_AUFS_DEBUG ++ .writepage = aufs_writepage, ++ /* no writepages, because of writepage */ ++ .set_page_dirty = aufs_set_page_dirty, ++ /* no readpages, because of readpage */ ++ .write_begin = aufs_write_begin, ++ .write_end = aufs_write_end, ++ /* no bmap, no block device */ ++ .invalidatepage = aufs_invalidatepage, ++ .releasepage = aufs_releasepage, ++ /* is fallback_migrate_page ok? */ ++ /* .migratepage = aufs_migratepage, */ ++ .isolate_page = aufs_isolate_page, ++ .putback_page = aufs_putback_page, ++ .launder_page = aufs_launder_page, ++ .is_partially_uptodate = aufs_is_partially_uptodate, ++ .is_dirty_writeback = aufs_is_dirty_writeback, ++ .error_remove_page = aufs_error_remove_page, ++ .swap_activate = aufs_swap_activate, ++ .swap_deactivate = aufs_swap_deactivate ++#endif /* CONFIG_AUFS_DEBUG */ ++}; +diff --git a/fs/aufs/file.h b/fs/aufs/file.h +new file mode 100644 +index 000000000000..4c73ac8da97c +--- /dev/null ++++ b/fs/aufs/file.h +@@ -0,0 +1,328 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * file operations ++ */ ++ ++#ifndef __AUFS_FILE_H__ ++#define __AUFS_FILE_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++#include "rwsem.h" ++ ++struct au_branch; ++struct au_hfile { ++ struct file *hf_file; ++ struct au_branch *hf_br; ++}; ++ ++struct au_vdir; ++struct au_fidir { ++ aufs_bindex_t fd_bbot; ++ aufs_bindex_t fd_nent; ++ struct au_vdir *fd_vdir_cache; ++ struct au_hfile fd_hfile[]; ++}; ++ ++static inline int au_fidir_sz(int nent) ++{ ++ AuDebugOn(nent < 0); ++ return sizeof(struct au_fidir) + sizeof(struct au_hfile) * nent; ++} ++ ++struct au_finfo { ++ atomic_t fi_generation; ++ ++ struct au_rwsem fi_rwsem; ++ aufs_bindex_t fi_btop; ++ ++ /* do not union them */ ++ struct { /* for non-dir */ ++ struct au_hfile fi_htop; ++ atomic_t fi_mmapped; ++ }; ++ struct au_fidir *fi_hdir; /* for dir only */ ++ ++ struct hlist_bl_node fi_hlist; ++ struct file *fi_file; /* very ugly */ ++} ____cacheline_aligned_in_smp; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* file.c */ ++extern const struct address_space_operations aufs_aop; ++unsigned int au_file_roflags(unsigned int flags); ++struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, ++ struct file *file, int force_wr); ++struct au_do_open_args { ++ int aopen; ++ int (*open)(struct file *file, int flags, ++ struct file *h_file); ++ struct au_fidir *fidir; ++ struct file *h_file; ++}; ++int au_do_open(struct file *file, struct au_do_open_args *args); ++int au_reopen_nondir(struct file *file); ++struct au_pin; ++int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin); ++int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), ++ int wlock, unsigned int fi_lsc); ++int au_do_flush(struct file *file, fl_owner_t id, ++ int (*flush)(struct file *file, fl_owner_t id)); ++ ++/* poll.c */ ++#ifdef CONFIG_AUFS_POLL ++__poll_t aufs_poll(struct file *file, struct poll_table_struct *pt); ++#endif ++ ++#ifdef CONFIG_AUFS_BR_HFSPLUS ++/* hfsplus.c */ ++struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, ++ int force_wr); ++void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, ++ struct file *h_file); ++#else ++AuStub(struct file *, au_h_open_pre, return NULL, struct dentry *dentry, ++ aufs_bindex_t bindex, int force_wr) ++AuStubVoid(au_h_open_post, struct dentry *dentry, aufs_bindex_t bindex, ++ struct file *h_file); ++#endif ++ ++/* f_op.c */ ++extern const struct file_operations aufs_file_fop; ++int au_do_open_nondir(struct file *file, int flags, struct file *h_file); ++int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file); ++struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc); ++ ++/* finfo.c */ ++void au_hfput(struct au_hfile *hf, int execed); ++void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, ++ struct file *h_file); ++ ++void au_update_figen(struct file *file); ++struct au_fidir *au_fidir_alloc(struct super_block *sb); ++int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink); ++ ++void au_fi_init_once(void *_fi); ++void au_finfo_fin(struct file *file); ++int au_finfo_init(struct file *file, struct au_fidir *fidir); ++ ++/* ioctl.c */ ++long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg); ++#ifdef CONFIG_COMPAT ++long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, ++ unsigned long arg); ++long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, ++ unsigned long arg); ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_finfo *au_fi(struct file *file) ++{ ++ return file->private_data; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define fi_read_lock(f) au_rw_read_lock(&au_fi(f)->fi_rwsem) ++#define fi_write_lock(f) au_rw_write_lock(&au_fi(f)->fi_rwsem) ++#define fi_read_trylock(f) au_rw_read_trylock(&au_fi(f)->fi_rwsem) ++#define fi_write_trylock(f) au_rw_write_trylock(&au_fi(f)->fi_rwsem) ++/* ++#define fi_read_trylock_nested(f) \ ++ au_rw_read_trylock_nested(&au_fi(f)->fi_rwsem) ++#define fi_write_trylock_nested(f) \ ++ au_rw_write_trylock_nested(&au_fi(f)->fi_rwsem) ++*/ ++ ++#define fi_read_unlock(f) au_rw_read_unlock(&au_fi(f)->fi_rwsem) ++#define fi_write_unlock(f) au_rw_write_unlock(&au_fi(f)->fi_rwsem) ++#define fi_downgrade_lock(f) au_rw_dgrade_lock(&au_fi(f)->fi_rwsem) ++ ++/* lock subclass for finfo */ ++enum { ++ AuLsc_FI_1, ++ AuLsc_FI_2 ++}; ++ ++static inline void fi_read_lock_nested(struct file *f, unsigned int lsc) ++{ ++ au_rw_read_lock_nested(&au_fi(f)->fi_rwsem, lsc); ++} ++ ++static inline void fi_write_lock_nested(struct file *f, unsigned int lsc) ++{ ++ au_rw_write_lock_nested(&au_fi(f)->fi_rwsem, lsc); ++} ++ ++/* ++ * fi_read_lock_1, fi_write_lock_1, ++ * fi_read_lock_2, fi_write_lock_2 ++ */ ++#define AuReadLockFunc(name) \ ++static inline void fi_read_lock_##name(struct file *f) \ ++{ fi_read_lock_nested(f, AuLsc_FI_##name); } ++ ++#define AuWriteLockFunc(name) \ ++static inline void fi_write_lock_##name(struct file *f) \ ++{ fi_write_lock_nested(f, AuLsc_FI_##name); } ++ ++#define AuRWLockFuncs(name) \ ++ AuReadLockFunc(name) \ ++ AuWriteLockFunc(name) ++ ++AuRWLockFuncs(1); ++AuRWLockFuncs(2); ++ ++#undef AuReadLockFunc ++#undef AuWriteLockFunc ++#undef AuRWLockFuncs ++ ++#define FiMustNoWaiters(f) AuRwMustNoWaiters(&au_fi(f)->fi_rwsem) ++#define FiMustAnyLock(f) AuRwMustAnyLock(&au_fi(f)->fi_rwsem) ++#define FiMustWriteLock(f) AuRwMustWriteLock(&au_fi(f)->fi_rwsem) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* todo: hard/soft set? */ ++static inline aufs_bindex_t au_fbtop(struct file *file) ++{ ++ FiMustAnyLock(file); ++ return au_fi(file)->fi_btop; ++} ++ ++static inline aufs_bindex_t au_fbbot_dir(struct file *file) ++{ ++ FiMustAnyLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ return au_fi(file)->fi_hdir->fd_bbot; ++} ++ ++static inline struct au_vdir *au_fvdir_cache(struct file *file) ++{ ++ FiMustAnyLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ return au_fi(file)->fi_hdir->fd_vdir_cache; ++} ++ ++static inline void au_set_fbtop(struct file *file, aufs_bindex_t bindex) ++{ ++ FiMustWriteLock(file); ++ au_fi(file)->fi_btop = bindex; ++} ++ ++static inline void au_set_fbbot_dir(struct file *file, aufs_bindex_t bindex) ++{ ++ FiMustWriteLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ au_fi(file)->fi_hdir->fd_bbot = bindex; ++} ++ ++static inline void au_set_fvdir_cache(struct file *file, ++ struct au_vdir *vdir_cache) ++{ ++ FiMustWriteLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ au_fi(file)->fi_hdir->fd_vdir_cache = vdir_cache; ++} ++ ++static inline struct file *au_hf_top(struct file *file) ++{ ++ FiMustAnyLock(file); ++ AuDebugOn(au_fi(file)->fi_hdir); ++ return au_fi(file)->fi_htop.hf_file; ++} ++ ++static inline struct file *au_hf_dir(struct file *file, aufs_bindex_t bindex) ++{ ++ FiMustAnyLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ return au_fi(file)->fi_hdir->fd_hfile[0 + bindex].hf_file; ++} ++ ++/* todo: memory barrier? */ ++static inline unsigned int au_figen(struct file *f) ++{ ++ return atomic_read(&au_fi(f)->fi_generation); ++} ++ ++static inline void au_set_mmapped(struct file *f) ++{ ++ if (atomic_inc_return(&au_fi(f)->fi_mmapped)) ++ return; ++ pr_warn("fi_mmapped wrapped around\n"); ++ while (!atomic_inc_return(&au_fi(f)->fi_mmapped)) ++ ; ++} ++ ++static inline void au_unset_mmapped(struct file *f) ++{ ++ atomic_dec(&au_fi(f)->fi_mmapped); ++} ++ ++static inline int au_test_mmapped(struct file *f) ++{ ++ return atomic_read(&au_fi(f)->fi_mmapped); ++} ++ ++/* customize vma->vm_file */ ++ ++static inline void au_do_vm_file_reset(struct vm_area_struct *vma, ++ struct file *file) ++{ ++ struct file *f; ++ ++ f = vma->vm_file; ++ get_file(file); ++ vma->vm_file = file; ++ fput(f); ++} ++ ++#ifdef CONFIG_MMU ++#define AuDbgVmRegion(file, vma) do {} while (0) ++ ++static inline void au_vm_file_reset(struct vm_area_struct *vma, ++ struct file *file) ++{ ++ au_do_vm_file_reset(vma, file); ++} ++#else ++#define AuDbgVmRegion(file, vma) \ ++ AuDebugOn((vma)->vm_region && (vma)->vm_region->vm_file != (file)) ++ ++static inline void au_vm_file_reset(struct vm_area_struct *vma, ++ struct file *file) ++{ ++ struct file *f; ++ ++ au_do_vm_file_reset(vma, file); ++ f = vma->vm_region->vm_file; ++ get_file(file); ++ vma->vm_region->vm_file = file; ++ fput(f); ++} ++#endif /* CONFIG_MMU */ ++ ++/* handle vma->vm_prfile */ ++static inline void au_vm_prfile_set(struct vm_area_struct *vma, ++ struct file *file) ++{ ++ get_file(file); ++ vma->vm_prfile = file; ++#ifndef CONFIG_MMU ++ get_file(file); ++ vma->vm_region->vm_prfile = file; ++#endif ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_FILE_H__ */ +diff --git a/fs/aufs/finfo.c b/fs/aufs/finfo.c +new file mode 100644 +index 000000000000..e46da749ef33 +--- /dev/null ++++ b/fs/aufs/finfo.c +@@ -0,0 +1,136 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * file private data ++ */ ++ ++#include "aufs.h" ++ ++void au_hfput(struct au_hfile *hf, int execed) ++{ ++ if (execed) ++ allow_write_access(hf->hf_file); ++ fput(hf->hf_file); ++ hf->hf_file = NULL; ++ au_lcnt_dec(&hf->hf_br->br_nfiles); ++ hf->hf_br = NULL; ++} ++ ++void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, struct file *val) ++{ ++ struct au_finfo *finfo = au_fi(file); ++ struct au_hfile *hf; ++ struct au_fidir *fidir; ++ ++ fidir = finfo->fi_hdir; ++ if (!fidir) { ++ AuDebugOn(finfo->fi_btop != bindex); ++ hf = &finfo->fi_htop; ++ } else ++ hf = fidir->fd_hfile + bindex; ++ ++ if (hf && hf->hf_file) ++ au_hfput(hf, vfsub_file_execed(file)); ++ if (val) { ++ FiMustWriteLock(file); ++ AuDebugOn(IS_ERR_OR_NULL(file->f_path.dentry)); ++ hf->hf_file = val; ++ hf->hf_br = au_sbr(file->f_path.dentry->d_sb, bindex); ++ } ++} ++ ++void au_update_figen(struct file *file) ++{ ++ atomic_set(&au_fi(file)->fi_generation, au_digen(file->f_path.dentry)); ++ /* smp_mb(); */ /* atomic_set */ ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_fidir *au_fidir_alloc(struct super_block *sb) ++{ ++ struct au_fidir *fidir; ++ int nbr; ++ ++ nbr = au_sbbot(sb) + 1; ++ if (nbr < 2) ++ nbr = 2; /* initial allocate for 2 branches */ ++ fidir = kzalloc(au_fidir_sz(nbr), GFP_NOFS); ++ if (fidir) { ++ fidir->fd_bbot = -1; ++ fidir->fd_nent = nbr; ++ } ++ ++ return fidir; ++} ++ ++int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink) ++{ ++ int err; ++ struct au_fidir *fidir, *p; ++ ++ AuRwMustWriteLock(&finfo->fi_rwsem); ++ fidir = finfo->fi_hdir; ++ AuDebugOn(!fidir); ++ ++ err = -ENOMEM; ++ p = au_kzrealloc(fidir, au_fidir_sz(fidir->fd_nent), au_fidir_sz(nbr), ++ GFP_NOFS, may_shrink); ++ if (p) { ++ p->fd_nent = nbr; ++ finfo->fi_hdir = p; ++ err = 0; ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_finfo_fin(struct file *file) ++{ ++ struct au_finfo *finfo; ++ ++ au_lcnt_dec(&au_sbi(file->f_path.dentry->d_sb)->si_nfiles); ++ ++ finfo = au_fi(file); ++ AuDebugOn(finfo->fi_hdir); ++ AuRwDestroy(&finfo->fi_rwsem); ++ au_cache_free_finfo(finfo); ++} ++ ++void au_fi_init_once(void *_finfo) ++{ ++ struct au_finfo *finfo = _finfo; ++ ++ au_rw_init(&finfo->fi_rwsem); ++} ++ ++int au_finfo_init(struct file *file, struct au_fidir *fidir) ++{ ++ int err; ++ struct au_finfo *finfo; ++ struct dentry *dentry; ++ ++ err = -ENOMEM; ++ dentry = file->f_path.dentry; ++ finfo = au_cache_alloc_finfo(); ++ if (unlikely(!finfo)) ++ goto out; ++ ++ err = 0; ++ au_lcnt_inc(&au_sbi(dentry->d_sb)->si_nfiles); ++ au_rw_write_lock(&finfo->fi_rwsem); ++ finfo->fi_btop = -1; ++ finfo->fi_hdir = fidir; ++ atomic_set(&finfo->fi_generation, au_digen(dentry)); ++ /* smp_mb(); */ /* atomic_set */ ++ ++ file->private_data = finfo; ++ ++out: ++ return err; ++} +diff --git a/fs/aufs/fstype.h b/fs/aufs/fstype.h +new file mode 100644 +index 000000000000..0a6b40f9612c +--- /dev/null ++++ b/fs/aufs/fstype.h +@@ -0,0 +1,388 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * judging filesystem type ++ */ ++ ++#ifndef __AUFS_FSTYPE_H__ ++#define __AUFS_FSTYPE_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++ ++static inline int au_test_aufs(struct super_block *sb) ++{ ++ return sb->s_magic == AUFS_SUPER_MAGIC; ++} ++ ++static inline const char *au_sbtype(struct super_block *sb) ++{ ++ return sb->s_type->name; ++} ++ ++static inline int au_test_iso9660(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_ISO9660_FS) ++ return sb->s_magic == ISOFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_romfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_ROMFS_FS) ++ return sb->s_magic == ROMFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_cramfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_CRAMFS) ++ return sb->s_magic == CRAMFS_MAGIC; ++#endif ++ return 0; ++} ++ ++static inline int au_test_nfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_NFS_FS) ++ return sb->s_magic == NFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_fuse(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_FUSE_FS) ++ return sb->s_magic == FUSE_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_xfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_XFS_FS) ++ return sb->s_magic == XFS_SB_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_tmpfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_TMPFS ++ return sb->s_magic == TMPFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_ecryptfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_ECRYPT_FS) ++ return !strcmp(au_sbtype(sb), "ecryptfs"); ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_ramfs(struct super_block *sb) ++{ ++ return sb->s_magic == RAMFS_MAGIC; ++} ++ ++static inline int au_test_ubifs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_UBIFS_FS) ++ return sb->s_magic == UBIFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_procfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_PROC_FS ++ return sb->s_magic == PROC_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_sysfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_SYSFS ++ return sb->s_magic == SYSFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_configfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_CONFIGFS_FS) ++ return sb->s_magic == CONFIGFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_minix(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_MINIX_FS) ++ return sb->s_magic == MINIX3_SUPER_MAGIC ++ || sb->s_magic == MINIX2_SUPER_MAGIC ++ || sb->s_magic == MINIX2_SUPER_MAGIC2 ++ || sb->s_magic == MINIX_SUPER_MAGIC ++ || sb->s_magic == MINIX_SUPER_MAGIC2; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_fat(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_FAT_FS) ++ return sb->s_magic == MSDOS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_msdos(struct super_block *sb) ++{ ++ return au_test_fat(sb); ++} ++ ++static inline int au_test_vfat(struct super_block *sb) ++{ ++ return au_test_fat(sb); ++} ++ ++static inline int au_test_securityfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_SECURITYFS ++ return sb->s_magic == SECURITYFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_squashfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_SQUASHFS) ++ return sb->s_magic == SQUASHFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_btrfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_BTRFS_FS) ++ return sb->s_magic == BTRFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_xenfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_XENFS) ++ return sb->s_magic == XENFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_debugfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_DEBUG_FS ++ return sb->s_magic == DEBUGFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_nilfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_NILFS) ++ return sb->s_magic == NILFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_hfsplus(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_HFSPLUS_FS) ++ return sb->s_magic == HFSPLUS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * they can't be an aufs branch. ++ */ ++static inline int au_test_fs_unsuppoted(struct super_block *sb) ++{ ++ return ++#ifndef CONFIG_AUFS_BR_RAMFS ++ au_test_ramfs(sb) || ++#endif ++ au_test_procfs(sb) ++ || au_test_sysfs(sb) ++ || au_test_configfs(sb) ++ || au_test_debugfs(sb) ++ || au_test_securityfs(sb) ++ || au_test_xenfs(sb) ++ || au_test_ecryptfs(sb) ++ /* || !strcmp(au_sbtype(sb), "unionfs") */ ++ || au_test_aufs(sb); /* will be supported in next version */ ++} ++ ++static inline int au_test_fs_remote(struct super_block *sb) ++{ ++ return !au_test_tmpfs(sb) ++#ifdef CONFIG_AUFS_BR_RAMFS ++ && !au_test_ramfs(sb) ++#endif ++ && !(sb->s_type->fs_flags & FS_REQUIRES_DEV); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * Note: these functions (below) are created after reading ->getattr() in all ++ * filesystems under linux/fs. it means we have to do so in every update... ++ */ ++ ++/* ++ * some filesystems require getattr to refresh the inode attributes before ++ * referencing. ++ * in most cases, we can rely on the inode attribute in NFS (or every remote fs) ++ * and leave the work for d_revalidate() ++ */ ++static inline int au_test_fs_refresh_iattr(struct super_block *sb) ++{ ++ return au_test_nfs(sb) ++ || au_test_fuse(sb) ++ /* || au_test_btrfs(sb) */ /* untested */ ++ ; ++} ++ ++/* ++ * filesystems which don't maintain i_size or i_blocks. ++ */ ++static inline int au_test_fs_bad_iattr_size(struct super_block *sb) ++{ ++ return au_test_xfs(sb) ++ || au_test_btrfs(sb) ++ || au_test_ubifs(sb) ++ || au_test_hfsplus(sb) /* maintained, but incorrect */ ++ /* || au_test_minix(sb) */ /* untested */ ++ ; ++} ++ ++/* ++ * filesystems which don't store the correct value in some of their inode ++ * attributes. ++ */ ++static inline int au_test_fs_bad_iattr(struct super_block *sb) ++{ ++ return au_test_fs_bad_iattr_size(sb) ++ || au_test_fat(sb) ++ || au_test_msdos(sb) ++ || au_test_vfat(sb); ++} ++ ++/* they don't check i_nlink in link(2) */ ++static inline int au_test_fs_no_limit_nlink(struct super_block *sb) ++{ ++ return au_test_tmpfs(sb) ++#ifdef CONFIG_AUFS_BR_RAMFS ++ || au_test_ramfs(sb) ++#endif ++ || au_test_ubifs(sb) ++ || au_test_hfsplus(sb); ++} ++ ++/* ++ * filesystems which sets S_NOATIME and S_NOCMTIME. ++ */ ++static inline int au_test_fs_notime(struct super_block *sb) ++{ ++ return au_test_nfs(sb) ++ || au_test_fuse(sb) ++ || au_test_ubifs(sb) ++ ; ++} ++ ++/* temporary support for i#1 in cramfs */ ++static inline int au_test_fs_unique_ino(struct inode *inode) ++{ ++ if (au_test_cramfs(inode->i_sb)) ++ return inode->i_ino != 1; ++ return 1; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * the filesystem where the xino files placed must support i/o after unlink and ++ * maintain i_size and i_blocks. ++ */ ++static inline int au_test_fs_bad_xino(struct super_block *sb) ++{ ++ return au_test_fs_remote(sb) ++ || au_test_fs_bad_iattr_size(sb) ++ /* don't want unnecessary work for xino */ ++ || au_test_aufs(sb) ++ || au_test_ecryptfs(sb) ++ || au_test_nilfs(sb); ++} ++ ++static inline int au_test_fs_trunc_xino(struct super_block *sb) ++{ ++ return au_test_tmpfs(sb) ++ || au_test_ramfs(sb); ++} ++ ++/* ++ * test if the @sb is real-readonly. ++ */ ++static inline int au_test_fs_rr(struct super_block *sb) ++{ ++ return au_test_squashfs(sb) ++ || au_test_iso9660(sb) ++ || au_test_cramfs(sb) ++ || au_test_romfs(sb); ++} ++ ++/* ++ * test if the @inode is nfs with 'noacl' option ++ * NFS always sets SB_POSIXACL regardless its mount option 'noacl.' ++ */ ++static inline int au_test_nfs_noacl(struct inode *inode) ++{ ++ return au_test_nfs(inode->i_sb) ++ /* && IS_POSIXACL(inode) */ ++ && !nfs_server_capable(inode, NFS_CAP_ACLS); ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_FSTYPE_H__ */ +diff --git a/fs/aufs/hbl.h b/fs/aufs/hbl.h +new file mode 100644 +index 000000000000..feff55d18aa6 +--- /dev/null ++++ b/fs/aufs/hbl.h +@@ -0,0 +1,52 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2017-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * helpers for hlist_bl.h ++ */ ++ ++#ifndef __AUFS_HBL_H__ ++#define __AUFS_HBL_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++static inline void au_hbl_add(struct hlist_bl_node *node, ++ struct hlist_bl_head *hbl) ++{ ++ hlist_bl_lock(hbl); ++ hlist_bl_add_head(node, hbl); ++ hlist_bl_unlock(hbl); ++} ++ ++static inline void au_hbl_del(struct hlist_bl_node *node, ++ struct hlist_bl_head *hbl) ++{ ++ hlist_bl_lock(hbl); ++ hlist_bl_del(node); ++ hlist_bl_unlock(hbl); ++} ++ ++#define au_hbl_for_each(pos, head) \ ++ for (pos = hlist_bl_first(head); \ ++ pos; \ ++ pos = pos->next) ++ ++static inline unsigned long au_hbl_count(struct hlist_bl_head *hbl) ++{ ++ unsigned long cnt; ++ struct hlist_bl_node *pos; ++ ++ cnt = 0; ++ hlist_bl_lock(hbl); ++ au_hbl_for_each(pos, hbl) ++ cnt++; ++ hlist_bl_unlock(hbl); ++ return cnt; ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_HBL_H__ */ +diff --git a/fs/aufs/hfsnotify.c b/fs/aufs/hfsnotify.c +new file mode 100644 +index 000000000000..414527996ace +--- /dev/null ++++ b/fs/aufs/hfsnotify.c +@@ -0,0 +1,276 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * fsnotify for the lower directories ++ */ ++ ++#include "aufs.h" ++ ++/* FS_IN_IGNORED is unnecessary */ ++static const __u32 AuHfsnMask = (FS_MOVED_TO | FS_MOVED_FROM | FS_DELETE ++ | FS_CREATE | FS_EVENT_ON_CHILD); ++static DECLARE_WAIT_QUEUE_HEAD(au_hfsn_wq); ++static __cacheline_aligned_in_smp atomic64_t au_hfsn_ifree = ATOMIC64_INIT(0); ++ ++static void au_hfsn_free_mark(struct fsnotify_mark *mark) ++{ ++ struct au_hnotify *hn = container_of(mark, struct au_hnotify, ++ hn_mark); ++ /* AuDbg("here\n"); */ ++ au_cache_free_hnotify(hn); ++ smp_mb__before_atomic(); /* for atomic64_dec */ ++ if (atomic64_dec_and_test(&au_hfsn_ifree)) ++ wake_up(&au_hfsn_wq); ++} ++ ++static int au_hfsn_alloc(struct au_hinode *hinode) ++{ ++ int err; ++ struct au_hnotify *hn; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct fsnotify_mark *mark; ++ aufs_bindex_t bindex; ++ ++ hn = hinode->hi_notify; ++ sb = hn->hn_aufs_inode->i_sb; ++ bindex = au_br_index(sb, hinode->hi_id); ++ br = au_sbr(sb, bindex); ++ AuDebugOn(!br->br_hfsn); ++ ++ mark = &hn->hn_mark; ++ fsnotify_init_mark(mark, br->br_hfsn->hfsn_group); ++ mark->mask = AuHfsnMask; ++ /* ++ * by udba rename or rmdir, aufs assign a new inode to the known ++ * h_inode, so specify 1 to allow dups. ++ */ ++ lockdep_off(); ++ err = fsnotify_add_inode_mark(mark, hinode->hi_inode, /*allow_dups*/1); ++ lockdep_on(); ++ ++ return err; ++} ++ ++static int au_hfsn_free(struct au_hinode *hinode, struct au_hnotify *hn) ++{ ++ struct fsnotify_mark *mark; ++ unsigned long long ull; ++ struct fsnotify_group *group; ++ ++ ull = atomic64_inc_return(&au_hfsn_ifree); ++ BUG_ON(!ull); ++ ++ mark = &hn->hn_mark; ++ spin_lock(&mark->lock); ++ group = mark->group; ++ fsnotify_get_group(group); ++ spin_unlock(&mark->lock); ++ lockdep_off(); ++ fsnotify_destroy_mark(mark, group); ++ fsnotify_put_mark(mark); ++ fsnotify_put_group(group); ++ lockdep_on(); ++ ++ /* free hn by myself */ ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_hfsn_ctl(struct au_hinode *hinode, int do_set) ++{ ++ struct fsnotify_mark *mark; ++ ++ mark = &hinode->hi_notify->hn_mark; ++ spin_lock(&mark->lock); ++ if (do_set) { ++ AuDebugOn(mark->mask & AuHfsnMask); ++ mark->mask |= AuHfsnMask; ++ } else { ++ AuDebugOn(!(mark->mask & AuHfsnMask)); ++ mark->mask &= ~AuHfsnMask; ++ } ++ spin_unlock(&mark->lock); ++ /* fsnotify_recalc_inode_mask(hinode->hi_inode); */ ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* #define AuDbgHnotify */ ++#ifdef AuDbgHnotify ++static char *au_hfsn_name(u32 mask) ++{ ++#ifdef CONFIG_AUFS_DEBUG ++#define test_ret(flag) \ ++ do { \ ++ if (mask & flag) \ ++ return #flag; \ ++ } while (0) ++ test_ret(FS_ACCESS); ++ test_ret(FS_MODIFY); ++ test_ret(FS_ATTRIB); ++ test_ret(FS_CLOSE_WRITE); ++ test_ret(FS_CLOSE_NOWRITE); ++ test_ret(FS_OPEN); ++ test_ret(FS_MOVED_FROM); ++ test_ret(FS_MOVED_TO); ++ test_ret(FS_CREATE); ++ test_ret(FS_DELETE); ++ test_ret(FS_DELETE_SELF); ++ test_ret(FS_MOVE_SELF); ++ test_ret(FS_UNMOUNT); ++ test_ret(FS_Q_OVERFLOW); ++ test_ret(FS_IN_IGNORED); ++ test_ret(FS_ISDIR); ++ test_ret(FS_IN_ONESHOT); ++ test_ret(FS_EVENT_ON_CHILD); ++ return ""; ++#undef test_ret ++#else ++ return "??"; ++#endif ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_hfsn_free_group(struct fsnotify_group *group) ++{ ++ struct au_br_hfsnotify *hfsn = group->private; ++ ++ /* AuDbg("here\n"); */ ++ kfree(hfsn); ++} ++ ++static int au_hfsn_handle_event(struct fsnotify_group *group, ++ struct inode *inode, ++ u32 mask, const void *data, int data_type, ++ const unsigned char *file_name, u32 cookie, ++ struct fsnotify_iter_info *iter_info) ++{ ++ int err; ++ struct au_hnotify *hnotify; ++ struct inode *h_dir, *h_inode; ++ struct qstr h_child_qstr = QSTR_INIT(file_name, strlen(file_name)); ++ struct fsnotify_mark *inode_mark; ++ ++ AuDebugOn(data_type != FSNOTIFY_EVENT_INODE); ++ ++ err = 0; ++ /* if FS_UNMOUNT happens, there must be another bug */ ++ AuDebugOn(mask & FS_UNMOUNT); ++ if (mask & (FS_IN_IGNORED | FS_UNMOUNT)) ++ goto out; ++ ++ h_dir = inode; ++ h_inode = NULL; ++#ifdef AuDbgHnotify ++ au_debug_on(); ++ if (1 || h_child_qstr.len != sizeof(AUFS_XINO_FNAME) - 1 ++ || strncmp(h_child_qstr.name, AUFS_XINO_FNAME, h_child_qstr.len)) { ++ AuDbg("i%lu, mask 0x%x %s, hcname %.*s, hi%lu\n", ++ h_dir->i_ino, mask, au_hfsn_name(mask), ++ AuLNPair(&h_child_qstr), h_inode ? h_inode->i_ino : 0); ++ /* WARN_ON(1); */ ++ } ++ au_debug_off(); ++#endif ++ ++ inode_mark = fsnotify_iter_inode_mark(iter_info); ++ AuDebugOn(!inode_mark); ++ hnotify = container_of(inode_mark, struct au_hnotify, hn_mark); ++ err = au_hnotify(h_dir, hnotify, mask, &h_child_qstr, h_inode); ++ ++out: ++ return err; ++} ++ ++static struct fsnotify_ops au_hfsn_ops = { ++ .handle_event = au_hfsn_handle_event, ++ .free_group_priv = au_hfsn_free_group, ++ .free_mark = au_hfsn_free_mark ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_hfsn_fin_br(struct au_branch *br) ++{ ++ struct au_br_hfsnotify *hfsn; ++ ++ hfsn = br->br_hfsn; ++ if (hfsn) { ++ lockdep_off(); ++ fsnotify_put_group(hfsn->hfsn_group); ++ lockdep_on(); ++ } ++} ++ ++static int au_hfsn_init_br(struct au_branch *br, int perm) ++{ ++ int err; ++ struct fsnotify_group *group; ++ struct au_br_hfsnotify *hfsn; ++ ++ err = 0; ++ br->br_hfsn = NULL; ++ if (!au_br_hnotifyable(perm)) ++ goto out; ++ ++ err = -ENOMEM; ++ hfsn = kmalloc(sizeof(*hfsn), GFP_NOFS); ++ if (unlikely(!hfsn)) ++ goto out; ++ ++ err = 0; ++ group = fsnotify_alloc_group(&au_hfsn_ops); ++ if (IS_ERR(group)) { ++ err = PTR_ERR(group); ++ pr_err("fsnotify_alloc_group() failed, %d\n", err); ++ goto out_hfsn; ++ } ++ ++ group->private = hfsn; ++ hfsn->hfsn_group = group; ++ br->br_hfsn = hfsn; ++ goto out; /* success */ ++ ++out_hfsn: ++ kfree(hfsn); ++out: ++ return err; ++} ++ ++static int au_hfsn_reset_br(unsigned int udba, struct au_branch *br, int perm) ++{ ++ int err; ++ ++ err = 0; ++ if (!br->br_hfsn) ++ err = au_hfsn_init_br(br, perm); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_hfsn_fin(void) ++{ ++ AuDbg("au_hfsn_ifree %lld\n", (long long)atomic64_read(&au_hfsn_ifree)); ++ wait_event(au_hfsn_wq, !atomic64_read(&au_hfsn_ifree)); ++} ++ ++const struct au_hnotify_op au_hnotify_op = { ++ .ctl = au_hfsn_ctl, ++ .alloc = au_hfsn_alloc, ++ .free = au_hfsn_free, ++ ++ .fin = au_hfsn_fin, ++ ++ .reset_br = au_hfsn_reset_br, ++ .fin_br = au_hfsn_fin_br, ++ .init_br = au_hfsn_init_br ++}; +diff --git a/fs/aufs/hfsplus.c b/fs/aufs/hfsplus.c +new file mode 100644 +index 000000000000..7f60a264e00d +--- /dev/null ++++ b/fs/aufs/hfsplus.c +@@ -0,0 +1,47 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2010-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * special support for filesystems which acquires an inode mutex ++ * at final closing a file, eg, hfsplus. ++ * ++ * This trick is very simple and stupid, just to open the file before really ++ * necessary open to tell hfsplus that this is not the final closing. ++ * The caller should call au_h_open_pre() after acquiring the inode mutex, ++ * and au_h_open_post() after releasing it. ++ */ ++ ++#include "aufs.h" ++ ++struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, ++ int force_wr) ++{ ++ struct file *h_file; ++ struct dentry *h_dentry; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ AuDebugOn(!h_dentry); ++ AuDebugOn(d_is_negative(h_dentry)); ++ ++ h_file = NULL; ++ if (au_test_hfsplus(h_dentry->d_sb) ++ && d_is_reg(h_dentry)) ++ h_file = au_h_open(dentry, bindex, ++ O_RDONLY | O_NOATIME | O_LARGEFILE, ++ /*file*/NULL, force_wr); ++ return h_file; ++} ++ ++void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, ++ struct file *h_file) ++{ ++ struct au_branch *br; ++ ++ if (h_file) { ++ fput(h_file); ++ br = au_sbr(dentry->d_sb, bindex); ++ au_lcnt_dec(&br->br_nfiles); ++ } ++} +diff --git a/fs/aufs/hnotify.c b/fs/aufs/hnotify.c +new file mode 100644 +index 000000000000..7fdeb27cfa42 +--- /dev/null ++++ b/fs/aufs/hnotify.c +@@ -0,0 +1,707 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * abstraction to notify the direct changes on lower directories ++ */ ++ ++#include "aufs.h" ++ ++int au_hn_alloc(struct au_hinode *hinode, struct inode *inode) ++{ ++ int err; ++ struct au_hnotify *hn; ++ ++ err = -ENOMEM; ++ hn = au_cache_alloc_hnotify(); ++ if (hn) { ++ hn->hn_aufs_inode = inode; ++ hinode->hi_notify = hn; ++ err = au_hnotify_op.alloc(hinode); ++ AuTraceErr(err); ++ if (unlikely(err)) { ++ hinode->hi_notify = NULL; ++ au_cache_free_hnotify(hn); ++ /* ++ * The upper dir was removed by udba, but the same named ++ * dir left. In this case, aufs assigns a new inode ++ * number and set the monitor again. ++ * For the lower dir, the old monitor is still left. ++ */ ++ if (err == -EEXIST) ++ err = 0; ++ } ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_hn_free(struct au_hinode *hinode) ++{ ++ struct au_hnotify *hn; ++ ++ hn = hinode->hi_notify; ++ if (hn) { ++ hinode->hi_notify = NULL; ++ if (au_hnotify_op.free(hinode, hn)) ++ au_cache_free_hnotify(hn); ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_hn_ctl(struct au_hinode *hinode, int do_set) ++{ ++ if (hinode->hi_notify) ++ au_hnotify_op.ctl(hinode, do_set); ++} ++ ++void au_hn_reset(struct inode *inode, unsigned int flags) ++{ ++ aufs_bindex_t bindex, bbot; ++ struct inode *hi; ++ struct dentry *iwhdentry; ++ ++ bbot = au_ibbot(inode); ++ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { ++ hi = au_h_iptr(inode, bindex); ++ if (!hi) ++ continue; ++ ++ /* inode_lock_nested(hi, AuLsc_I_CHILD); */ ++ iwhdentry = au_hi_wh(inode, bindex); ++ if (iwhdentry) ++ dget(iwhdentry); ++ au_igrab(hi); ++ au_set_h_iptr(inode, bindex, NULL, 0); ++ au_set_h_iptr(inode, bindex, au_igrab(hi), ++ flags & ~AuHi_XINO); ++ iput(hi); ++ dput(iwhdentry); ++ /* inode_unlock(hi); */ ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int hn_xino(struct inode *inode, struct inode *h_inode) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot, bfound, btop; ++ struct inode *h_i; ++ ++ err = 0; ++ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { ++ pr_warn("branch root dir was changed\n"); ++ goto out; ++ } ++ ++ bfound = -1; ++ bbot = au_ibbot(inode); ++ btop = au_ibtop(inode); ++#if 0 /* reserved for future use */ ++ if (bindex == bbot) { ++ /* keep this ino in rename case */ ++ goto out; ++ } ++#endif ++ for (bindex = btop; bindex <= bbot; bindex++) ++ if (au_h_iptr(inode, bindex) == h_inode) { ++ bfound = bindex; ++ break; ++ } ++ if (bfound < 0) ++ goto out; ++ ++ for (bindex = btop; bindex <= bbot; bindex++) { ++ h_i = au_h_iptr(inode, bindex); ++ if (!h_i) ++ continue; ++ ++ err = au_xino_write(inode->i_sb, bindex, h_i->i_ino, /*ino*/0); ++ /* ignore this error */ ++ /* bad action? */ ++ } ++ ++ /* children inode number will be broken */ ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int hn_gen_tree(struct dentry *dentry) ++{ ++ int err, i, j, ndentry; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry **dentries; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_dcsub_pages(&dpages, dentry, NULL, NULL); ++ if (unlikely(err)) ++ goto out_dpages; ++ ++ for (i = 0; i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ dentries = dpage->dentries; ++ ndentry = dpage->ndentry; ++ for (j = 0; j < ndentry; j++) { ++ struct dentry *d; ++ ++ d = dentries[j]; ++ if (IS_ROOT(d)) ++ continue; ++ ++ au_digen_dec(d); ++ if (d_really_is_positive(d)) ++ /* todo: reset children xino? ++ cached children only? */ ++ au_iigen_dec(d_inode(d)); ++ } ++ } ++ ++out_dpages: ++ au_dpages_free(&dpages); ++ ++#if 0 ++ /* discard children */ ++ dentry_unhash(dentry); ++ dput(dentry); ++#endif ++out: ++ return err; ++} ++ ++/* ++ * return 0 if processed. ++ */ ++static int hn_gen_by_inode(char *name, unsigned int nlen, struct inode *inode, ++ const unsigned int isdir) ++{ ++ int err; ++ struct dentry *d; ++ struct qstr *dname; ++ ++ err = 1; ++ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { ++ pr_warn("branch root dir was changed\n"); ++ err = 0; ++ goto out; ++ } ++ ++ if (!isdir) { ++ AuDebugOn(!name); ++ au_iigen_dec(inode); ++ spin_lock(&inode->i_lock); ++ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { ++ spin_lock(&d->d_lock); ++ dname = &d->d_name; ++ if (dname->len != nlen ++ && memcmp(dname->name, name, nlen)) { ++ spin_unlock(&d->d_lock); ++ continue; ++ } ++ err = 0; ++ au_digen_dec(d); ++ spin_unlock(&d->d_lock); ++ break; ++ } ++ spin_unlock(&inode->i_lock); ++ } else { ++ au_fset_si(au_sbi(inode->i_sb), FAILED_REFRESH_DIR); ++ d = d_find_any_alias(inode); ++ if (!d) { ++ au_iigen_dec(inode); ++ goto out; ++ } ++ ++ spin_lock(&d->d_lock); ++ dname = &d->d_name; ++ if (dname->len == nlen && !memcmp(dname->name, name, nlen)) { ++ spin_unlock(&d->d_lock); ++ err = hn_gen_tree(d); ++ spin_lock(&d->d_lock); ++ } ++ spin_unlock(&d->d_lock); ++ dput(d); ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int hn_gen_by_name(struct dentry *dentry, const unsigned int isdir) ++{ ++ int err; ++ ++ if (IS_ROOT(dentry)) { ++ pr_warn("branch root dir was changed\n"); ++ return 0; ++ } ++ ++ err = 0; ++ if (!isdir) { ++ au_digen_dec(dentry); ++ if (d_really_is_positive(dentry)) ++ au_iigen_dec(d_inode(dentry)); ++ } else { ++ au_fset_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR); ++ if (d_really_is_positive(dentry)) ++ err = hn_gen_tree(dentry); ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* hnotify job flags */ ++#define AuHnJob_XINO0 1 ++#define AuHnJob_GEN (1 << 1) ++#define AuHnJob_DIRENT (1 << 2) ++#define AuHnJob_ISDIR (1 << 3) ++#define AuHnJob_TRYXINO0 (1 << 4) ++#define AuHnJob_MNTPNT (1 << 5) ++#define au_ftest_hnjob(flags, name) ((flags) & AuHnJob_##name) ++#define au_fset_hnjob(flags, name) \ ++ do { (flags) |= AuHnJob_##name; } while (0) ++#define au_fclr_hnjob(flags, name) \ ++ do { (flags) &= ~AuHnJob_##name; } while (0) ++ ++enum { ++ AuHn_CHILD, ++ AuHn_PARENT, ++ AuHnLast ++}; ++ ++struct au_hnotify_args { ++ struct inode *h_dir, *dir, *h_child_inode; ++ u32 mask; ++ unsigned int flags[AuHnLast]; ++ unsigned int h_child_nlen; ++ char h_child_name[]; ++}; ++ ++struct hn_job_args { ++ unsigned int flags; ++ struct inode *inode, *h_inode, *dir, *h_dir; ++ struct dentry *dentry; ++ char *h_name; ++ int h_nlen; ++}; ++ ++static int hn_job(struct hn_job_args *a) ++{ ++ const unsigned int isdir = au_ftest_hnjob(a->flags, ISDIR); ++ int e; ++ ++ /* reset xino */ ++ if (au_ftest_hnjob(a->flags, XINO0) && a->inode) ++ hn_xino(a->inode, a->h_inode); /* ignore this error */ ++ ++ if (au_ftest_hnjob(a->flags, TRYXINO0) ++ && a->inode ++ && a->h_inode) { ++ inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); ++ if (!a->h_inode->i_nlink ++ && !(a->h_inode->i_state & I_LINKABLE)) ++ hn_xino(a->inode, a->h_inode); /* ignore this error */ ++ inode_unlock_shared(a->h_inode); ++ } ++ ++ /* make the generation obsolete */ ++ if (au_ftest_hnjob(a->flags, GEN)) { ++ e = -1; ++ if (a->inode) ++ e = hn_gen_by_inode(a->h_name, a->h_nlen, a->inode, ++ isdir); ++ if (e && a->dentry) ++ hn_gen_by_name(a->dentry, isdir); ++ /* ignore this error */ ++ } ++ ++ /* make dir entries obsolete */ ++ if (au_ftest_hnjob(a->flags, DIRENT) && a->inode) { ++ struct au_vdir *vdir; ++ ++ vdir = au_ivdir(a->inode); ++ if (vdir) ++ vdir->vd_jiffy = 0; ++ /* IMustLock(a->inode); */ ++ /* inode_inc_iversion(a->inode); */ ++ } ++ ++ /* can do nothing but warn */ ++ if (au_ftest_hnjob(a->flags, MNTPNT) ++ && a->dentry ++ && d_mountpoint(a->dentry)) ++ pr_warn("mount-point %pd is removed or renamed\n", a->dentry); ++ ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry *lookup_wlock_by_name(char *name, unsigned int nlen, ++ struct inode *dir) ++{ ++ struct dentry *dentry, *d, *parent; ++ struct qstr *dname; ++ ++ parent = d_find_any_alias(dir); ++ if (!parent) ++ return NULL; ++ ++ dentry = NULL; ++ spin_lock(&parent->d_lock); ++ list_for_each_entry(d, &parent->d_subdirs, d_child) { ++ /* AuDbg("%pd\n", d); */ ++ spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED); ++ dname = &d->d_name; ++ if (dname->len != nlen || memcmp(dname->name, name, nlen)) ++ goto cont_unlock; ++ if (au_di(d)) ++ au_digen_dec(d); ++ else ++ goto cont_unlock; ++ if (au_dcount(d) > 0) { ++ dentry = dget_dlock(d); ++ spin_unlock(&d->d_lock); ++ break; ++ } ++ ++cont_unlock: ++ spin_unlock(&d->d_lock); ++ } ++ spin_unlock(&parent->d_lock); ++ dput(parent); ++ ++ if (dentry) ++ di_write_lock_child(dentry); ++ ++ return dentry; ++} ++ ++static struct inode *lookup_wlock_by_ino(struct super_block *sb, ++ aufs_bindex_t bindex, ino_t h_ino) ++{ ++ struct inode *inode; ++ ino_t ino; ++ int err; ++ ++ inode = NULL; ++ err = au_xino_read(sb, bindex, h_ino, &ino); ++ if (!err && ino) ++ inode = ilookup(sb, ino); ++ if (!inode) ++ goto out; ++ ++ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { ++ pr_warn("wrong root branch\n"); ++ iput(inode); ++ inode = NULL; ++ goto out; ++ } ++ ++ ii_write_lock_child(inode); ++ ++out: ++ return inode; ++} ++ ++static void au_hn_bh(void *_args) ++{ ++ struct au_hnotify_args *a = _args; ++ struct super_block *sb; ++ aufs_bindex_t bindex, bbot, bfound; ++ unsigned char xino, try_iput; ++ int err; ++ struct inode *inode; ++ ino_t h_ino; ++ struct hn_job_args args; ++ struct dentry *dentry; ++ struct au_sbinfo *sbinfo; ++ ++ AuDebugOn(!_args); ++ AuDebugOn(!a->h_dir); ++ AuDebugOn(!a->dir); ++ AuDebugOn(!a->mask); ++ AuDbg("mask 0x%x, i%lu, hi%lu, hci%lu\n", ++ a->mask, a->dir->i_ino, a->h_dir->i_ino, ++ a->h_child_inode ? a->h_child_inode->i_ino : 0); ++ ++ inode = NULL; ++ dentry = NULL; ++ /* ++ * do not lock a->dir->i_mutex here ++ * because of d_revalidate() may cause a deadlock. ++ */ ++ sb = a->dir->i_sb; ++ AuDebugOn(!sb); ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!sbinfo); ++ si_write_lock(sb, AuLock_NOPLMW); ++ ++ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) ++ switch (a->mask & FS_EVENTS_POSS_ON_CHILD) { ++ case FS_MOVED_FROM: ++ case FS_MOVED_TO: ++ AuWarn1("DIRREN with UDBA may not work correctly " ++ "for the direct rename(2)\n"); ++ } ++ ++ ii_read_lock_parent(a->dir); ++ bfound = -1; ++ bbot = au_ibbot(a->dir); ++ for (bindex = au_ibtop(a->dir); bindex <= bbot; bindex++) ++ if (au_h_iptr(a->dir, bindex) == a->h_dir) { ++ bfound = bindex; ++ break; ++ } ++ ii_read_unlock(a->dir); ++ if (unlikely(bfound < 0)) ++ goto out; ++ ++ xino = !!au_opt_test(au_mntflags(sb), XINO); ++ h_ino = 0; ++ if (a->h_child_inode) ++ h_ino = a->h_child_inode->i_ino; ++ ++ if (a->h_child_nlen ++ && (au_ftest_hnjob(a->flags[AuHn_CHILD], GEN) ++ || au_ftest_hnjob(a->flags[AuHn_CHILD], MNTPNT))) ++ dentry = lookup_wlock_by_name(a->h_child_name, a->h_child_nlen, ++ a->dir); ++ try_iput = 0; ++ if (dentry && d_really_is_positive(dentry)) ++ inode = d_inode(dentry); ++ if (xino && !inode && h_ino ++ && (au_ftest_hnjob(a->flags[AuHn_CHILD], XINO0) ++ || au_ftest_hnjob(a->flags[AuHn_CHILD], TRYXINO0) ++ || au_ftest_hnjob(a->flags[AuHn_CHILD], GEN))) { ++ inode = lookup_wlock_by_ino(sb, bfound, h_ino); ++ try_iput = 1; ++ } ++ ++ args.flags = a->flags[AuHn_CHILD]; ++ args.dentry = dentry; ++ args.inode = inode; ++ args.h_inode = a->h_child_inode; ++ args.dir = a->dir; ++ args.h_dir = a->h_dir; ++ args.h_name = a->h_child_name; ++ args.h_nlen = a->h_child_nlen; ++ err = hn_job(&args); ++ if (dentry) { ++ if (au_di(dentry)) ++ di_write_unlock(dentry); ++ dput(dentry); ++ } ++ if (inode && try_iput) { ++ ii_write_unlock(inode); ++ iput(inode); ++ } ++ ++ ii_write_lock_parent(a->dir); ++ args.flags = a->flags[AuHn_PARENT]; ++ args.dentry = NULL; ++ args.inode = a->dir; ++ args.h_inode = a->h_dir; ++ args.dir = NULL; ++ args.h_dir = NULL; ++ args.h_name = NULL; ++ args.h_nlen = 0; ++ err = hn_job(&args); ++ ii_write_unlock(a->dir); ++ ++out: ++ iput(a->h_child_inode); ++ iput(a->h_dir); ++ iput(a->dir); ++ si_write_unlock(sb); ++ au_nwt_done(&sbinfo->si_nowait); ++ kfree(a); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, ++ struct qstr *h_child_qstr, struct inode *h_child_inode) ++{ ++ int err, len; ++ unsigned int flags[AuHnLast], f; ++ unsigned char isdir, isroot, wh; ++ struct inode *dir; ++ struct au_hnotify_args *args; ++ char *p, *h_child_name; ++ ++ err = 0; ++ AuDebugOn(!hnotify || !hnotify->hn_aufs_inode); ++ dir = igrab(hnotify->hn_aufs_inode); ++ if (!dir) ++ goto out; ++ ++ isroot = (dir->i_ino == AUFS_ROOT_INO); ++ wh = 0; ++ h_child_name = (void *)h_child_qstr->name; ++ len = h_child_qstr->len; ++ if (h_child_name) { ++ if (len > AUFS_WH_PFX_LEN ++ && !memcmp(h_child_name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { ++ h_child_name += AUFS_WH_PFX_LEN; ++ len -= AUFS_WH_PFX_LEN; ++ wh = 1; ++ } ++ } ++ ++ isdir = 0; ++ if (h_child_inode) ++ isdir = !!S_ISDIR(h_child_inode->i_mode); ++ flags[AuHn_PARENT] = AuHnJob_ISDIR; ++ flags[AuHn_CHILD] = 0; ++ if (isdir) ++ flags[AuHn_CHILD] = AuHnJob_ISDIR; ++ au_fset_hnjob(flags[AuHn_PARENT], DIRENT); ++ au_fset_hnjob(flags[AuHn_CHILD], GEN); ++ switch (mask & FS_EVENTS_POSS_ON_CHILD) { ++ case FS_MOVED_FROM: ++ case FS_MOVED_TO: ++ au_fset_hnjob(flags[AuHn_CHILD], XINO0); ++ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); ++ /*FALLTHROUGH*/ ++ case FS_CREATE: ++ AuDebugOn(!h_child_name); ++ break; ++ ++ case FS_DELETE: ++ /* ++ * aufs never be able to get this child inode. ++ * revalidation should be in d_revalidate() ++ * by checking i_nlink, i_generation or d_unhashed(). ++ */ ++ AuDebugOn(!h_child_name); ++ au_fset_hnjob(flags[AuHn_CHILD], TRYXINO0); ++ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); ++ break; ++ ++ default: ++ AuDebugOn(1); ++ } ++ ++ if (wh) ++ h_child_inode = NULL; ++ ++ err = -ENOMEM; ++ /* iput() and kfree() will be called in au_hnotify() */ ++ args = kmalloc(sizeof(*args) + len + 1, GFP_NOFS); ++ if (unlikely(!args)) { ++ AuErr1("no memory\n"); ++ iput(dir); ++ goto out; ++ } ++ args->flags[AuHn_PARENT] = flags[AuHn_PARENT]; ++ args->flags[AuHn_CHILD] = flags[AuHn_CHILD]; ++ args->mask = mask; ++ args->dir = dir; ++ args->h_dir = igrab(h_dir); ++ if (h_child_inode) ++ h_child_inode = igrab(h_child_inode); /* can be NULL */ ++ args->h_child_inode = h_child_inode; ++ args->h_child_nlen = len; ++ if (len) { ++ p = (void *)args; ++ p += sizeof(*args); ++ memcpy(p, h_child_name, len); ++ p[len] = 0; ++ } ++ ++ /* NFS fires the event for silly-renamed one from kworker */ ++ f = 0; ++ if (!dir->i_nlink ++ || (au_test_nfs(h_dir->i_sb) && (mask & FS_DELETE))) ++ f = AuWkq_NEST; ++ err = au_wkq_nowait(au_hn_bh, args, dir->i_sb, f); ++ if (unlikely(err)) { ++ pr_err("wkq %d\n", err); ++ iput(args->h_child_inode); ++ iput(args->h_dir); ++ iput(args->dir); ++ kfree(args); ++ } ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm) ++{ ++ int err; ++ ++ AuDebugOn(!(udba & AuOptMask_UDBA)); ++ ++ err = 0; ++ if (au_hnotify_op.reset_br) ++ err = au_hnotify_op.reset_br(udba, br, perm); ++ ++ return err; ++} ++ ++int au_hnotify_init_br(struct au_branch *br, int perm) ++{ ++ int err; ++ ++ err = 0; ++ if (au_hnotify_op.init_br) ++ err = au_hnotify_op.init_br(br, perm); ++ ++ return err; ++} ++ ++void au_hnotify_fin_br(struct au_branch *br) ++{ ++ if (au_hnotify_op.fin_br) ++ au_hnotify_op.fin_br(br); ++} ++ ++static void au_hn_destroy_cache(void) ++{ ++ kmem_cache_destroy(au_cache[AuCache_HNOTIFY]); ++ au_cache[AuCache_HNOTIFY] = NULL; ++} ++ ++int __init au_hnotify_init(void) ++{ ++ int err; ++ ++ err = -ENOMEM; ++ au_cache[AuCache_HNOTIFY] = AuCache(au_hnotify); ++ if (au_cache[AuCache_HNOTIFY]) { ++ err = 0; ++ if (au_hnotify_op.init) ++ err = au_hnotify_op.init(); ++ if (unlikely(err)) ++ au_hn_destroy_cache(); ++ } ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_hnotify_fin(void) ++{ ++ if (au_hnotify_op.fin) ++ au_hnotify_op.fin(); ++ ++ /* cf. au_cache_fin() */ ++ if (au_cache[AuCache_HNOTIFY]) ++ au_hn_destroy_cache(); ++} +diff --git a/fs/aufs/i_op.c b/fs/aufs/i_op.c +new file mode 100644 +index 000000000000..232d29fa25ec +--- /dev/null ++++ b/fs/aufs/i_op.c +@@ -0,0 +1,1493 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * inode operations (except add/del/rename) ++ */ ++ ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++static int h_permission(struct inode *h_inode, int mask, ++ struct path *h_path, int brperm) ++{ ++ int err; ++ const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); ++ ++ err = -EPERM; ++ if (write_mask && IS_IMMUTABLE(h_inode)) ++ goto out; ++ ++ err = -EACCES; ++ if (((mask & MAY_EXEC) ++ && S_ISREG(h_inode->i_mode) ++ && (path_noexec(h_path) ++ || !(h_inode->i_mode & 0111)))) ++ goto out; ++ ++ /* ++ * - skip the lower fs test in the case of write to ro branch. ++ * - nfs dir permission write check is optimized, but a policy for ++ * link/rename requires a real check. ++ * - nfs always sets SB_POSIXACL regardless its mount option 'noacl.' ++ * in this case, generic_permission() returns -EOPNOTSUPP. ++ */ ++ if ((write_mask && !au_br_writable(brperm)) ++ || (au_test_nfs(h_inode->i_sb) && S_ISDIR(h_inode->i_mode) ++ && write_mask && !(mask & MAY_READ)) ++ || !h_inode->i_op->permission) { ++ /* AuLabel(generic_permission); */ ++ /* AuDbg("get_acl %ps\n", h_inode->i_op->get_acl); */ ++ err = generic_permission(h_inode, mask); ++ if (err == -EOPNOTSUPP && au_test_nfs_noacl(h_inode)) ++ err = h_inode->i_op->permission(h_inode, mask); ++ AuTraceErr(err); ++ } else { ++ /* AuLabel(h_inode->permission); */ ++ err = h_inode->i_op->permission(h_inode, mask); ++ AuTraceErr(err); ++ } ++ ++ if (!err) ++ err = devcgroup_inode_permission(h_inode, mask); ++ if (!err) ++ err = security_inode_permission(h_inode, mask); ++ ++#if 0 ++ if (!err) { ++ /* todo: do we need to call ima_path_check()? */ ++ struct path h_path = { ++ .dentry = ++ .mnt = h_mnt ++ }; ++ err = ima_path_check(&h_path, ++ mask & (MAY_READ | MAY_WRITE | MAY_EXEC), ++ IMA_COUNT_LEAVE); ++ } ++#endif ++ ++out: ++ return err; ++} ++ ++static int aufs_permission(struct inode *inode, int mask) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ const unsigned char isdir = !!S_ISDIR(inode->i_mode), ++ write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); ++ struct inode *h_inode; ++ struct super_block *sb; ++ struct au_branch *br; ++ ++ /* todo: support rcu-walk? */ ++ if (mask & MAY_NOT_BLOCK) ++ return -ECHILD; ++ ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ ii_read_lock_child(inode); ++#if 0 ++ err = au_iigen_test(inode, au_sigen(sb)); ++ if (unlikely(err)) ++ goto out; ++#endif ++ ++ if (!isdir ++ || write_mask ++ || au_opt_test(au_mntflags(sb), DIRPERM1)) { ++ err = au_busy_or_stale(); ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ if (unlikely(!h_inode ++ || (h_inode->i_mode & S_IFMT) ++ != (inode->i_mode & S_IFMT))) ++ goto out; ++ ++ err = 0; ++ bindex = au_ibtop(inode); ++ br = au_sbr(sb, bindex); ++ err = h_permission(h_inode, mask, &br->br_path, br->br_perm); ++ if (write_mask ++ && !err ++ && !special_file(h_inode->i_mode)) { ++ /* test whether the upper writable branch exists */ ++ err = -EROFS; ++ for (; bindex >= 0; bindex--) ++ if (!au_br_rdonly(au_sbr(sb, bindex))) { ++ err = 0; ++ break; ++ } ++ } ++ goto out; ++ } ++ ++ /* non-write to dir */ ++ err = 0; ++ bbot = au_ibbot(inode); ++ for (bindex = au_ibtop(inode); !err && bindex <= bbot; bindex++) { ++ h_inode = au_h_iptr(inode, bindex); ++ if (h_inode) { ++ err = au_busy_or_stale(); ++ if (unlikely(!S_ISDIR(h_inode->i_mode))) ++ break; ++ ++ br = au_sbr(sb, bindex); ++ err = h_permission(h_inode, mask, &br->br_path, ++ br->br_perm); ++ } ++ } ++ ++out: ++ ii_read_unlock(inode); ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry *aufs_lookup(struct inode *dir, struct dentry *dentry, ++ unsigned int flags) ++{ ++ struct dentry *ret, *parent; ++ struct inode *inode; ++ struct super_block *sb; ++ int err, npositive; ++ ++ IMustLock(dir); ++ ++ /* todo: support rcu-walk? */ ++ ret = ERR_PTR(-ECHILD); ++ if (flags & LOOKUP_RCU) ++ goto out; ++ ++ ret = ERR_PTR(-ENAMETOOLONG); ++ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) ++ goto out; ++ ++ sb = dir->i_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ ret = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_di_init(dentry); ++ ret = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_si; ++ ++ inode = NULL; ++ npositive = 0; /* suppress a warning */ ++ parent = dentry->d_parent; /* dir inode is locked */ ++ di_read_lock_parent(parent, AuLock_IR); ++ err = au_alive_dir(parent); ++ if (!err) ++ err = au_digen_test(parent, au_sigen(sb)); ++ if (!err) { ++ /* regardless LOOKUP_CREATE, always ALLOW_NEG */ ++ npositive = au_lkup_dentry(dentry, au_dbtop(parent), ++ AuLkup_ALLOW_NEG); ++ err = npositive; ++ } ++ di_read_unlock(parent, AuLock_IR); ++ ret = ERR_PTR(err); ++ if (unlikely(err < 0)) ++ goto out_unlock; ++ ++ if (npositive) { ++ inode = au_new_inode(dentry, /*must_new*/0); ++ if (IS_ERR(inode)) { ++ ret = (void *)inode; ++ inode = NULL; ++ goto out_unlock; ++ } ++ } ++ ++ if (inode) ++ atomic_inc(&inode->i_count); ++ ret = d_splice_alias(inode, dentry); ++#if 0 ++ if (unlikely(d_need_lookup(dentry))) { ++ spin_lock(&dentry->d_lock); ++ dentry->d_flags &= ~DCACHE_NEED_LOOKUP; ++ spin_unlock(&dentry->d_lock); ++ } else ++#endif ++ if (inode) { ++ if (!IS_ERR(ret)) { ++ iput(inode); ++ if (ret && ret != dentry) ++ ii_write_unlock(inode); ++ } else { ++ ii_write_unlock(inode); ++ iput(inode); ++ inode = NULL; ++ } ++ } ++ ++out_unlock: ++ di_write_unlock(dentry); ++out_si: ++ si_read_unlock(sb); ++out: ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * very dirty and complicated aufs ->atomic_open(). ++ * aufs_atomic_open() ++ * + au_aopen_or_create() ++ * + add_simple() ++ * + vfsub_atomic_open() ++ * + branch fs ->atomic_open() ++ * may call the actual 'open' for h_file ++ * + inc br_nfiles only if opened ++ * + au_aopen_no_open() or au_aopen_do_open() ++ * ++ * au_aopen_do_open() ++ * + finish_open() ++ * + au_do_aopen() ++ * + au_do_open() the body of all 'open' ++ * + au_do_open_nondir() ++ * set the passed h_file ++ * ++ * au_aopen_no_open() ++ * + finish_no_open() ++ */ ++ ++struct aopen_node { ++ struct hlist_bl_node hblist; ++ struct file *file, *h_file; ++}; ++ ++static int au_do_aopen(struct inode *inode, struct file *file) ++{ ++ struct hlist_bl_head *aopen; ++ struct hlist_bl_node *pos; ++ struct aopen_node *node; ++ struct au_do_open_args args = { ++ .aopen = 1, ++ .open = au_do_open_nondir ++ }; ++ ++ aopen = &au_sbi(inode->i_sb)->si_aopen; ++ hlist_bl_lock(aopen); ++ hlist_bl_for_each_entry(node, pos, aopen, hblist) ++ if (node->file == file) { ++ args.h_file = node->h_file; ++ break; ++ } ++ hlist_bl_unlock(aopen); ++ /* AuDebugOn(!args.h_file); */ ++ ++ return au_do_open(file, &args); ++} ++ ++static int au_aopen_do_open(struct file *file, struct dentry *dentry, ++ struct aopen_node *aopen_node) ++{ ++ int err; ++ struct hlist_bl_head *aopen; ++ ++ AuLabel(here); ++ aopen = &au_sbi(dentry->d_sb)->si_aopen; ++ au_hbl_add(&aopen_node->hblist, aopen); ++ err = finish_open(file, dentry, au_do_aopen); ++ au_hbl_del(&aopen_node->hblist, aopen); ++ /* AuDbgFile(file); */ ++ AuDbg("%pd%s%s\n", dentry, ++ (file->f_mode & FMODE_CREATED) ? " created" : "", ++ (file->f_mode & FMODE_OPENED) ? " opened" : ""); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_aopen_no_open(struct file *file, struct dentry *dentry) ++{ ++ int err; ++ ++ AuLabel(here); ++ dget(dentry); ++ err = finish_no_open(file, dentry); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++static int aufs_atomic_open(struct inode *dir, struct dentry *dentry, ++ struct file *file, unsigned int open_flag, ++ umode_t create_mode) ++{ ++ int err, did_open; ++ unsigned int lkup_flags; ++ aufs_bindex_t bindex; ++ struct super_block *sb; ++ struct dentry *parent, *d; ++ struct vfsub_aopen_args args = { ++ .open_flag = open_flag, ++ .create_mode = create_mode ++ }; ++ struct aopen_node aopen_node = { ++ .file = file ++ }; ++ ++ IMustLock(dir); ++ AuDbg("open_flag 0%o\n", open_flag); ++ AuDbgDentry(dentry); ++ ++ err = 0; ++ if (!au_di(dentry)) { ++ lkup_flags = LOOKUP_OPEN; ++ if (open_flag & O_CREAT) ++ lkup_flags |= LOOKUP_CREATE; ++ d = aufs_lookup(dir, dentry, lkup_flags); ++ if (IS_ERR(d)) { ++ err = PTR_ERR(d); ++ AuTraceErr(err); ++ goto out; ++ } else if (d) { ++ /* ++ * obsoleted dentry found. ++ * another error will be returned later. ++ */ ++ d_drop(d); ++ AuDbgDentry(d); ++ dput(d); ++ } ++ AuDbgDentry(dentry); ++ } ++ ++ if (d_is_positive(dentry) ++ || d_unhashed(dentry) ++ || d_unlinked(dentry) ++ || !(open_flag & O_CREAT)) { ++ err = au_aopen_no_open(file, dentry); ++ goto out; /* success */ ++ } ++ ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); ++ if (unlikely(err)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ parent = dentry->d_parent; /* dir is locked */ ++ di_write_lock_parent(parent); ++ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); ++ if (unlikely(err < 0)) ++ goto out_parent; ++ ++ AuDbgDentry(dentry); ++ if (d_is_positive(dentry)) { ++ err = au_aopen_no_open(file, dentry); ++ goto out_parent; /* success */ ++ } ++ ++ args.file = alloc_empty_file(file->f_flags, current_cred()); ++ err = PTR_ERR(args.file); ++ if (IS_ERR(args.file)) ++ goto out_parent; ++ ++ bindex = au_dbtop(dentry); ++ err = au_aopen_or_create(dir, dentry, &args); ++ AuTraceErr(err); ++ AuDbgFile(args.file); ++ file->f_mode = args.file->f_mode & ~FMODE_OPENED; ++ did_open = !!(args.file->f_mode & FMODE_OPENED); ++ if (!did_open) { ++ fput(args.file); ++ args.file = NULL; ++ } ++ di_write_unlock(parent); ++ di_write_unlock(dentry); ++ if (unlikely(err < 0)) { ++ if (args.file) ++ fput(args.file); ++ goto out_sb; ++ } ++ ++ if (!did_open) ++ err = au_aopen_no_open(file, dentry); ++ else { ++ aopen_node.h_file = args.file; ++ err = au_aopen_do_open(file, dentry, &aopen_node); ++ } ++ if (unlikely(err < 0)) { ++ if (args.file) ++ fput(args.file); ++ if (did_open) ++ au_lcnt_dec(&args.br->br_nfiles); ++ } ++ goto out_sb; /* success */ ++ ++out_parent: ++ di_write_unlock(parent); ++ di_write_unlock(dentry); ++out_sb: ++ si_read_unlock(sb); ++out: ++ AuTraceErr(err); ++ AuDbgFile(file); ++ return err; ++} ++ ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_wr_dir_cpup(struct dentry *dentry, struct dentry *parent, ++ const unsigned char add_entry, aufs_bindex_t bcpup, ++ aufs_bindex_t btop) ++{ ++ int err; ++ struct dentry *h_parent; ++ struct inode *h_dir; ++ ++ if (add_entry) ++ IMustLock(d_inode(parent)); ++ else ++ di_write_lock_parent(parent); ++ ++ err = 0; ++ if (!au_h_dptr(parent, bcpup)) { ++ if (btop > bcpup) ++ err = au_cpup_dirs(dentry, bcpup); ++ else if (btop < bcpup) ++ err = au_cpdown_dirs(dentry, bcpup); ++ else ++ BUG(); ++ } ++ if (!err && add_entry && !au_ftest_wrdir(add_entry, TMPFILE)) { ++ h_parent = au_h_dptr(parent, bcpup); ++ h_dir = d_inode(h_parent); ++ inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); ++ err = au_lkup_neg(dentry, bcpup, /*wh*/0); ++ /* todo: no unlock here */ ++ inode_unlock_shared(h_dir); ++ ++ AuDbg("bcpup %d\n", bcpup); ++ if (!err) { ++ if (d_really_is_negative(dentry)) ++ au_set_h_dptr(dentry, btop, NULL); ++ au_update_dbrange(dentry, /*do_put_zero*/0); ++ } ++ } ++ ++ if (!add_entry) ++ di_write_unlock(parent); ++ if (!err) ++ err = bcpup; /* success */ ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * decide the branch and the parent dir where we will create a new entry. ++ * returns new bindex or an error. ++ * copyup the parent dir if needed. ++ */ ++int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, ++ struct au_wr_dir_args *args) ++{ ++ int err; ++ unsigned int flags; ++ aufs_bindex_t bcpup, btop, src_btop; ++ const unsigned char add_entry ++ = au_ftest_wrdir(args->flags, ADD_ENTRY) ++ | au_ftest_wrdir(args->flags, TMPFILE); ++ struct super_block *sb; ++ struct dentry *parent; ++ struct au_sbinfo *sbinfo; ++ ++ sb = dentry->d_sb; ++ sbinfo = au_sbi(sb); ++ parent = dget_parent(dentry); ++ btop = au_dbtop(dentry); ++ bcpup = btop; ++ if (args->force_btgt < 0) { ++ if (src_dentry) { ++ src_btop = au_dbtop(src_dentry); ++ if (src_btop < btop) ++ bcpup = src_btop; ++ } else if (add_entry) { ++ flags = 0; ++ if (au_ftest_wrdir(args->flags, ISDIR)) ++ au_fset_wbr(flags, DIR); ++ err = AuWbrCreate(sbinfo, dentry, flags); ++ bcpup = err; ++ } ++ ++ if (bcpup < 0 || au_test_ro(sb, bcpup, d_inode(dentry))) { ++ if (add_entry) ++ err = AuWbrCopyup(sbinfo, dentry); ++ else { ++ if (!IS_ROOT(dentry)) { ++ di_read_lock_parent(parent, !AuLock_IR); ++ err = AuWbrCopyup(sbinfo, dentry); ++ di_read_unlock(parent, !AuLock_IR); ++ } else ++ err = AuWbrCopyup(sbinfo, dentry); ++ } ++ bcpup = err; ++ if (unlikely(err < 0)) ++ goto out; ++ } ++ } else { ++ bcpup = args->force_btgt; ++ AuDebugOn(au_test_ro(sb, bcpup, d_inode(dentry))); ++ } ++ ++ AuDbg("btop %d, bcpup %d\n", btop, bcpup); ++ err = bcpup; ++ if (bcpup == btop) ++ goto out; /* success */ ++ ++ /* copyup the new parent into the branch we process */ ++ err = au_wr_dir_cpup(dentry, parent, add_entry, bcpup, btop); ++ if (err >= 0) { ++ if (d_really_is_negative(dentry)) { ++ au_set_h_dptr(dentry, btop, NULL); ++ au_set_dbtop(dentry, bcpup); ++ au_set_dbbot(dentry, bcpup); ++ } ++ AuDebugOn(add_entry ++ && !au_ftest_wrdir(args->flags, TMPFILE) ++ && !au_h_dptr(dentry, bcpup)); ++ } ++ ++out: ++ dput(parent); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_pin_hdir_unlock(struct au_pin *p) ++{ ++ if (p->hdir) ++ au_hn_inode_unlock(p->hdir); ++} ++ ++int au_pin_hdir_lock(struct au_pin *p) ++{ ++ int err; ++ ++ err = 0; ++ if (!p->hdir) ++ goto out; ++ ++ /* even if an error happens later, keep this lock */ ++ au_hn_inode_lock_nested(p->hdir, p->lsc_hi); ++ ++ err = -EBUSY; ++ if (unlikely(p->hdir->hi_inode != d_inode(p->h_parent))) ++ goto out; ++ ++ err = 0; ++ if (p->h_dentry) ++ err = au_h_verify(p->h_dentry, p->udba, p->hdir->hi_inode, ++ p->h_parent, p->br); ++ ++out: ++ return err; ++} ++ ++int au_pin_hdir_relock(struct au_pin *p) ++{ ++ int err, i; ++ struct inode *h_i; ++ struct dentry *h_d[] = { ++ p->h_dentry, ++ p->h_parent ++ }; ++ ++ err = au_pin_hdir_lock(p); ++ if (unlikely(err)) ++ goto out; ++ ++ for (i = 0; !err && i < sizeof(h_d)/sizeof(*h_d); i++) { ++ if (!h_d[i]) ++ continue; ++ if (d_is_positive(h_d[i])) { ++ h_i = d_inode(h_d[i]); ++ err = !h_i->i_nlink; ++ } ++ } ++ ++out: ++ return err; ++} ++ ++static void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task) ++{ ++#if !defined(CONFIG_RWSEM_GENERIC_SPINLOCK) && defined(CONFIG_RWSEM_SPIN_ON_OWNER) ++ p->hdir->hi_inode->i_rwsem.owner = task; ++#endif ++} ++ ++void au_pin_hdir_acquire_nest(struct au_pin *p) ++{ ++ if (p->hdir) { ++ rwsem_acquire_nest(&p->hdir->hi_inode->i_rwsem.dep_map, ++ p->lsc_hi, 0, NULL, _RET_IP_); ++ au_pin_hdir_set_owner(p, current); ++ } ++} ++ ++void au_pin_hdir_release(struct au_pin *p) ++{ ++ if (p->hdir) { ++ au_pin_hdir_set_owner(p, p->task); ++ rwsem_release(&p->hdir->hi_inode->i_rwsem.dep_map, 1, _RET_IP_); ++ } ++} ++ ++struct dentry *au_pinned_h_parent(struct au_pin *pin) ++{ ++ if (pin && pin->parent) ++ return au_h_dptr(pin->parent, pin->bindex); ++ return NULL; ++} ++ ++void au_unpin(struct au_pin *p) ++{ ++ if (p->hdir) ++ au_pin_hdir_unlock(p); ++ if (p->h_mnt && au_ftest_pin(p->flags, MNT_WRITE)) ++ vfsub_mnt_drop_write(p->h_mnt); ++ if (!p->hdir) ++ return; ++ ++ if (!au_ftest_pin(p->flags, DI_LOCKED)) ++ di_read_unlock(p->parent, AuLock_IR); ++ iput(p->hdir->hi_inode); ++ dput(p->parent); ++ p->parent = NULL; ++ p->hdir = NULL; ++ p->h_mnt = NULL; ++ /* do not clear p->task */ ++} ++ ++int au_do_pin(struct au_pin *p) ++{ ++ int err; ++ struct super_block *sb; ++ struct inode *h_dir; ++ ++ err = 0; ++ sb = p->dentry->d_sb; ++ p->br = au_sbr(sb, p->bindex); ++ if (IS_ROOT(p->dentry)) { ++ if (au_ftest_pin(p->flags, MNT_WRITE)) { ++ p->h_mnt = au_br_mnt(p->br); ++ err = vfsub_mnt_want_write(p->h_mnt); ++ if (unlikely(err)) { ++ au_fclr_pin(p->flags, MNT_WRITE); ++ goto out_err; ++ } ++ } ++ goto out; ++ } ++ ++ p->h_dentry = NULL; ++ if (p->bindex <= au_dbbot(p->dentry)) ++ p->h_dentry = au_h_dptr(p->dentry, p->bindex); ++ ++ p->parent = dget_parent(p->dentry); ++ if (!au_ftest_pin(p->flags, DI_LOCKED)) ++ di_read_lock(p->parent, AuLock_IR, p->lsc_di); ++ ++ h_dir = NULL; ++ p->h_parent = au_h_dptr(p->parent, p->bindex); ++ p->hdir = au_hi(d_inode(p->parent), p->bindex); ++ if (p->hdir) ++ h_dir = p->hdir->hi_inode; ++ ++ /* ++ * udba case, or ++ * if DI_LOCKED is not set, then p->parent may be different ++ * and h_parent can be NULL. ++ */ ++ if (unlikely(!p->hdir || !h_dir || !p->h_parent)) { ++ err = -EBUSY; ++ if (!au_ftest_pin(p->flags, DI_LOCKED)) ++ di_read_unlock(p->parent, AuLock_IR); ++ dput(p->parent); ++ p->parent = NULL; ++ goto out_err; ++ } ++ ++ if (au_ftest_pin(p->flags, MNT_WRITE)) { ++ p->h_mnt = au_br_mnt(p->br); ++ err = vfsub_mnt_want_write(p->h_mnt); ++ if (unlikely(err)) { ++ au_fclr_pin(p->flags, MNT_WRITE); ++ if (!au_ftest_pin(p->flags, DI_LOCKED)) ++ di_read_unlock(p->parent, AuLock_IR); ++ dput(p->parent); ++ p->parent = NULL; ++ goto out_err; ++ } ++ } ++ ++ au_igrab(h_dir); ++ err = au_pin_hdir_lock(p); ++ if (!err) ++ goto out; /* success */ ++ ++ au_unpin(p); ++ ++out_err: ++ pr_err("err %d\n", err); ++ err = au_busy_or_stale(); ++out: ++ return err; ++} ++ ++void au_pin_init(struct au_pin *p, struct dentry *dentry, ++ aufs_bindex_t bindex, int lsc_di, int lsc_hi, ++ unsigned int udba, unsigned char flags) ++{ ++ p->dentry = dentry; ++ p->udba = udba; ++ p->lsc_di = lsc_di; ++ p->lsc_hi = lsc_hi; ++ p->flags = flags; ++ p->bindex = bindex; ++ ++ p->parent = NULL; ++ p->hdir = NULL; ++ p->h_mnt = NULL; ++ ++ p->h_dentry = NULL; ++ p->h_parent = NULL; ++ p->br = NULL; ++ p->task = current; ++} ++ ++int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int udba, unsigned char flags) ++{ ++ au_pin_init(pin, dentry, bindex, AuLsc_DI_PARENT, AuLsc_I_PARENT2, ++ udba, flags); ++ return au_do_pin(pin); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * ->setattr() and ->getattr() are called in various cases. ++ * chmod, stat: dentry is revalidated. ++ * fchmod, fstat: file and dentry are not revalidated, additionally they may be ++ * unhashed. ++ * for ->setattr(), ia->ia_file is passed from ftruncate only. ++ */ ++/* todo: consolidate with do_refresh() and simple_reval_dpath() */ ++int au_reval_for_attr(struct dentry *dentry, unsigned int sigen) ++{ ++ int err; ++ struct dentry *parent; ++ ++ err = 0; ++ if (au_digen_test(dentry, sigen)) { ++ parent = dget_parent(dentry); ++ di_read_lock_parent(parent, AuLock_IR); ++ err = au_refresh_dentry(dentry, parent); ++ di_read_unlock(parent, AuLock_IR); ++ dput(parent); ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, ++ struct au_icpup_args *a) ++{ ++ int err; ++ loff_t sz; ++ aufs_bindex_t btop, ibtop; ++ struct dentry *hi_wh, *parent; ++ struct inode *inode; ++ struct au_wr_dir_args wr_dir_args = { ++ .force_btgt = -1, ++ .flags = 0 ++ }; ++ ++ if (d_is_dir(dentry)) ++ au_fset_wrdir(wr_dir_args.flags, ISDIR); ++ /* plink or hi_wh() case */ ++ btop = au_dbtop(dentry); ++ inode = d_inode(dentry); ++ ibtop = au_ibtop(inode); ++ if (btop != ibtop && !au_test_ro(inode->i_sb, ibtop, inode)) ++ wr_dir_args.force_btgt = ibtop; ++ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); ++ if (unlikely(err < 0)) ++ goto out; ++ a->btgt = err; ++ if (err != btop) ++ au_fset_icpup(a->flags, DID_CPUP); ++ ++ err = 0; ++ a->pin_flags = AuPin_MNT_WRITE; ++ parent = NULL; ++ if (!IS_ROOT(dentry)) { ++ au_fset_pin(a->pin_flags, DI_LOCKED); ++ parent = dget_parent(dentry); ++ di_write_lock_parent(parent); ++ } ++ ++ err = au_pin(&a->pin, dentry, a->btgt, a->udba, a->pin_flags); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ sz = -1; ++ a->h_path.dentry = au_h_dptr(dentry, btop); ++ a->h_inode = d_inode(a->h_path.dentry); ++ if (ia && (ia->ia_valid & ATTR_SIZE)) { ++ inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); ++ if (ia->ia_size < i_size_read(a->h_inode)) ++ sz = ia->ia_size; ++ inode_unlock_shared(a->h_inode); ++ } ++ ++ hi_wh = NULL; ++ if (au_ftest_icpup(a->flags, DID_CPUP) && d_unlinked(dentry)) { ++ hi_wh = au_hi_wh(inode, a->btgt); ++ if (!hi_wh) { ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = a->btgt, ++ .bsrc = -1, ++ .len = sz, ++ .pin = &a->pin ++ }; ++ err = au_sio_cpup_wh(&cpg, /*file*/NULL); ++ if (unlikely(err)) ++ goto out_unlock; ++ hi_wh = au_hi_wh(inode, a->btgt); ++ /* todo: revalidate hi_wh? */ ++ } ++ } ++ ++ if (parent) { ++ au_pin_set_parent_lflag(&a->pin, /*lflag*/0); ++ di_downgrade_lock(parent, AuLock_IR); ++ dput(parent); ++ parent = NULL; ++ } ++ if (!au_ftest_icpup(a->flags, DID_CPUP)) ++ goto out; /* success */ ++ ++ if (!d_unhashed(dentry)) { ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = a->btgt, ++ .bsrc = btop, ++ .len = sz, ++ .pin = &a->pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ err = au_sio_cpup_simple(&cpg); ++ if (!err) ++ a->h_path.dentry = au_h_dptr(dentry, a->btgt); ++ } else if (!hi_wh) ++ a->h_path.dentry = au_h_dptr(dentry, a->btgt); ++ else ++ a->h_path.dentry = hi_wh; /* do not dget here */ ++ ++out_unlock: ++ a->h_inode = d_inode(a->h_path.dentry); ++ if (!err) ++ goto out; /* success */ ++ au_unpin(&a->pin); ++out_parent: ++ if (parent) { ++ di_write_unlock(parent); ++ dput(parent); ++ } ++out: ++ if (!err) ++ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); ++ return err; ++} ++ ++static int aufs_setattr(struct dentry *dentry, struct iattr *ia) ++{ ++ int err; ++ struct inode *inode, *delegated; ++ struct super_block *sb; ++ struct file *file; ++ struct au_icpup_args *a; ++ ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ ++ err = setattr_prepare(dentry, ia); ++ if (unlikely(err)) ++ goto out; ++ ++ err = -ENOMEM; ++ a = kzalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ if (ia->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) ++ ia->ia_valid &= ~ATTR_MODE; ++ ++ file = NULL; ++ sb = dentry->d_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out_kfree; ++ ++ if (ia->ia_valid & ATTR_FILE) { ++ /* currently ftruncate(2) only */ ++ AuDebugOn(!d_is_reg(dentry)); ++ file = ia->ia_file; ++ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, ++ /*fi_lsc*/0); ++ if (unlikely(err)) ++ goto out_si; ++ ia->ia_file = au_hf_top(file); ++ a->udba = AuOpt_UDBA_NONE; ++ } else { ++ /* fchmod() doesn't pass ia_file */ ++ a->udba = au_opt_udba(sb); ++ di_write_lock_child(dentry); ++ /* no d_unlinked(), to set UDBA_NONE for root */ ++ if (d_unhashed(dentry)) ++ a->udba = AuOpt_UDBA_NONE; ++ if (a->udba != AuOpt_UDBA_NONE) { ++ AuDebugOn(IS_ROOT(dentry)); ++ err = au_reval_for_attr(dentry, au_sigen(sb)); ++ if (unlikely(err)) ++ goto out_dentry; ++ } ++ } ++ ++ err = au_pin_and_icpup(dentry, ia, a); ++ if (unlikely(err < 0)) ++ goto out_dentry; ++ if (au_ftest_icpup(a->flags, DID_CPUP)) { ++ ia->ia_file = NULL; ++ ia->ia_valid &= ~ATTR_FILE; ++ } ++ ++ a->h_path.mnt = au_sbr_mnt(sb, a->btgt); ++ if ((ia->ia_valid & (ATTR_MODE | ATTR_CTIME)) ++ == (ATTR_MODE | ATTR_CTIME)) { ++ err = security_path_chmod(&a->h_path, ia->ia_mode); ++ if (unlikely(err)) ++ goto out_unlock; ++ } else if ((ia->ia_valid & (ATTR_UID | ATTR_GID)) ++ && (ia->ia_valid & ATTR_CTIME)) { ++ err = security_path_chown(&a->h_path, ia->ia_uid, ia->ia_gid); ++ if (unlikely(err)) ++ goto out_unlock; ++ } ++ ++ if (ia->ia_valid & ATTR_SIZE) { ++ struct file *f; ++ ++ if (ia->ia_size < i_size_read(inode)) ++ /* unmap only */ ++ truncate_setsize(inode, ia->ia_size); ++ ++ f = NULL; ++ if (ia->ia_valid & ATTR_FILE) ++ f = ia->ia_file; ++ inode_unlock(a->h_inode); ++ err = vfsub_trunc(&a->h_path, ia->ia_size, ia->ia_valid, f); ++ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); ++ } else { ++ delegated = NULL; ++ while (1) { ++ err = vfsub_notify_change(&a->h_path, ia, &delegated); ++ if (delegated) { ++ err = break_deleg_wait(&delegated); ++ if (!err) ++ continue; ++ } ++ break; ++ } ++ } ++ /* ++ * regardless aufs 'acl' option setting. ++ * why don't all acl-aware fs call this func from their ->setattr()? ++ */ ++ if (!err && (ia->ia_valid & ATTR_MODE)) ++ err = vfsub_acl_chmod(a->h_inode, ia->ia_mode); ++ if (!err) ++ au_cpup_attr_changeable(inode); ++ ++out_unlock: ++ inode_unlock(a->h_inode); ++ au_unpin(&a->pin); ++ if (unlikely(err)) ++ au_update_dbtop(dentry); ++out_dentry: ++ di_write_unlock(dentry); ++ if (file) { ++ fi_write_unlock(file); ++ ia->ia_file = file; ++ ia->ia_valid |= ATTR_FILE; ++ } ++out_si: ++ si_read_unlock(sb); ++out_kfree: ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) ++static int au_h_path_to_set_attr(struct dentry *dentry, ++ struct au_icpup_args *a, struct path *h_path) ++{ ++ int err; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ a->udba = au_opt_udba(sb); ++ /* no d_unlinked(), to set UDBA_NONE for root */ ++ if (d_unhashed(dentry)) ++ a->udba = AuOpt_UDBA_NONE; ++ if (a->udba != AuOpt_UDBA_NONE) { ++ AuDebugOn(IS_ROOT(dentry)); ++ err = au_reval_for_attr(dentry, au_sigen(sb)); ++ if (unlikely(err)) ++ goto out; ++ } ++ err = au_pin_and_icpup(dentry, /*ia*/NULL, a); ++ if (unlikely(err < 0)) ++ goto out; ++ ++ h_path->dentry = a->h_path.dentry; ++ h_path->mnt = au_sbr_mnt(sb, a->btgt); ++ ++out: ++ return err; ++} ++ ++ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, ++ struct au_sxattr *arg) ++{ ++ int err; ++ struct path h_path; ++ struct super_block *sb; ++ struct au_icpup_args *a; ++ struct inode *h_inode; ++ ++ IMustLock(inode); ++ ++ err = -ENOMEM; ++ a = kzalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out_kfree; ++ ++ h_path.dentry = NULL; /* silence gcc */ ++ di_write_lock_child(dentry); ++ err = au_h_path_to_set_attr(dentry, a, &h_path); ++ if (unlikely(err)) ++ goto out_di; ++ ++ inode_unlock(a->h_inode); ++ switch (arg->type) { ++ case AU_XATTR_SET: ++ AuDebugOn(d_is_negative(h_path.dentry)); ++ err = vfsub_setxattr(h_path.dentry, ++ arg->u.set.name, arg->u.set.value, ++ arg->u.set.size, arg->u.set.flags); ++ break; ++ case AU_ACL_SET: ++ err = -EOPNOTSUPP; ++ h_inode = d_inode(h_path.dentry); ++ if (h_inode->i_op->set_acl) ++ /* this will call posix_acl_update_mode */ ++ err = h_inode->i_op->set_acl(h_inode, ++ arg->u.acl_set.acl, ++ arg->u.acl_set.type); ++ break; ++ } ++ if (!err) ++ au_cpup_attr_timesizes(inode); ++ ++ au_unpin(&a->pin); ++ if (unlikely(err)) ++ au_update_dbtop(dentry); ++ ++out_di: ++ di_write_unlock(dentry); ++ si_read_unlock(sb); ++out_kfree: ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} ++#endif ++ ++static void au_refresh_iattr(struct inode *inode, struct kstat *st, ++ unsigned int nlink) ++{ ++ unsigned int n; ++ ++ inode->i_mode = st->mode; ++ /* don't i_[ug]id_write() here */ ++ inode->i_uid = st->uid; ++ inode->i_gid = st->gid; ++ inode->i_atime = st->atime; ++ inode->i_mtime = st->mtime; ++ inode->i_ctime = st->ctime; ++ ++ au_cpup_attr_nlink(inode, /*force*/0); ++ if (S_ISDIR(inode->i_mode)) { ++ n = inode->i_nlink; ++ n -= nlink; ++ n += st->nlink; ++ smp_mb(); /* for i_nlink */ ++ /* 0 can happen */ ++ set_nlink(inode, n); ++ } ++ ++ spin_lock(&inode->i_lock); ++ inode->i_blocks = st->blocks; ++ i_size_write(inode, st->size); ++ spin_unlock(&inode->i_lock); ++} ++ ++/* ++ * common routine for aufs_getattr() and au_getxattr(). ++ * returns zero or negative (an error). ++ * @dentry will be read-locked in success. ++ */ ++int au_h_path_getattr(struct dentry *dentry, int force, struct path *h_path, ++ int locked) ++{ ++ int err; ++ unsigned int mnt_flags, sigen; ++ unsigned char udba_none; ++ aufs_bindex_t bindex; ++ struct super_block *sb, *h_sb; ++ struct inode *inode; ++ ++ h_path->mnt = NULL; ++ h_path->dentry = NULL; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ mnt_flags = au_mntflags(sb); ++ udba_none = !!au_opt_test(mnt_flags, UDBA_NONE); ++ ++ if (unlikely(locked)) ++ goto body; /* skip locking dinfo */ ++ ++ /* support fstat(2) */ ++ if (!d_unlinked(dentry) && !udba_none) { ++ sigen = au_sigen(sb); ++ err = au_digen_test(dentry, sigen); ++ if (!err) { ++ di_read_lock_child(dentry, AuLock_IR); ++ err = au_dbrange_test(dentry); ++ if (unlikely(err)) { ++ di_read_unlock(dentry, AuLock_IR); ++ goto out; ++ } ++ } else { ++ AuDebugOn(IS_ROOT(dentry)); ++ di_write_lock_child(dentry); ++ err = au_dbrange_test(dentry); ++ if (!err) ++ err = au_reval_for_attr(dentry, sigen); ++ if (!err) ++ di_downgrade_lock(dentry, AuLock_IR); ++ else { ++ di_write_unlock(dentry); ++ goto out; ++ } ++ } ++ } else ++ di_read_lock_child(dentry, AuLock_IR); ++ ++body: ++ inode = d_inode(dentry); ++ bindex = au_ibtop(inode); ++ h_path->mnt = au_sbr_mnt(sb, bindex); ++ h_sb = h_path->mnt->mnt_sb; ++ if (!force ++ && !au_test_fs_bad_iattr(h_sb) ++ && udba_none) ++ goto out; /* success */ ++ ++ if (au_dbtop(dentry) == bindex) ++ h_path->dentry = au_h_dptr(dentry, bindex); ++ else if (au_opt_test(mnt_flags, PLINK) && au_plink_test(inode)) { ++ h_path->dentry = au_plink_lkup(inode, bindex); ++ if (IS_ERR(h_path->dentry)) ++ /* pretending success */ ++ h_path->dentry = NULL; ++ else ++ dput(h_path->dentry); ++ } ++ ++out: ++ return err; ++} ++ ++static int aufs_getattr(const struct path *path, struct kstat *st, ++ u32 request, unsigned int query) ++{ ++ int err; ++ unsigned char positive; ++ struct path h_path; ++ struct dentry *dentry; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ dentry = path->dentry; ++ inode = d_inode(dentry); ++ sb = dentry->d_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out; ++ err = au_h_path_getattr(dentry, /*force*/0, &h_path, /*locked*/0); ++ if (unlikely(err)) ++ goto out_si; ++ if (unlikely(!h_path.dentry)) ++ /* illegally overlapped or something */ ++ goto out_fill; /* pretending success */ ++ ++ positive = d_is_positive(h_path.dentry); ++ if (positive) ++ /* no vfsub version */ ++ err = vfs_getattr(&h_path, st, request, query); ++ if (!err) { ++ if (positive) ++ au_refresh_iattr(inode, st, ++ d_inode(h_path.dentry)->i_nlink); ++ goto out_fill; /* success */ ++ } ++ AuTraceErr(err); ++ goto out_di; ++ ++out_fill: ++ generic_fillattr(inode, st); ++out_di: ++ di_read_unlock(dentry, AuLock_IR); ++out_si: ++ si_read_unlock(sb); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static const char *aufs_get_link(struct dentry *dentry, struct inode *inode, ++ struct delayed_call *done) ++{ ++ const char *ret; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ int err; ++ aufs_bindex_t bindex; ++ ++ ret = NULL; /* suppress a warning */ ++ err = -ECHILD; ++ if (!dentry) ++ goto out; ++ ++ err = aufs_read_lock(dentry, AuLock_IR | AuLock_GEN); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_d_hashed_positive(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ err = -EINVAL; ++ inode = d_inode(dentry); ++ bindex = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, bindex); ++ if (unlikely(!h_inode->i_op->get_link)) ++ goto out_unlock; ++ ++ err = -EBUSY; ++ h_dentry = NULL; ++ if (au_dbtop(dentry) <= bindex) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry) ++ dget(h_dentry); ++ } ++ if (!h_dentry) { ++ h_dentry = d_find_any_alias(h_inode); ++ if (IS_ERR(h_dentry)) { ++ err = PTR_ERR(h_dentry); ++ goto out_unlock; ++ } ++ } ++ if (unlikely(!h_dentry)) ++ goto out_unlock; ++ ++ err = 0; ++ AuDbg("%ps\n", h_inode->i_op->get_link); ++ AuDbgDentry(h_dentry); ++ ret = vfs_get_link(h_dentry, done); ++ dput(h_dentry); ++ if (IS_ERR(ret)) ++ err = PTR_ERR(ret); ++ ++out_unlock: ++ aufs_read_unlock(dentry, AuLock_IR); ++out: ++ if (unlikely(err)) ++ ret = ERR_PTR(err); ++ AuTraceErrPtr(ret); ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_is_special(struct inode *inode) ++{ ++ return (inode->i_mode & (S_IFBLK | S_IFCHR | S_IFIFO | S_IFSOCK)); ++} ++ ++static int aufs_update_time(struct inode *inode, struct timespec64 *ts, ++ int flags) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct super_block *sb; ++ struct inode *h_inode; ++ struct vfsmount *h_mnt; ++ ++ sb = inode->i_sb; ++ WARN_ONCE((flags & S_ATIME) && !IS_NOATIME(inode), ++ "unexpected s_flags 0x%lx", sb->s_flags); ++ ++ /* mmap_sem might be acquired already, cf. aufs_mmap() */ ++ lockdep_off(); ++ si_read_lock(sb, AuLock_FLUSH); ++ ii_write_lock_child(inode); ++ ++ err = 0; ++ bindex = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, bindex); ++ if (!au_test_ro(sb, bindex, inode)) { ++ h_mnt = au_sbr_mnt(sb, bindex); ++ err = vfsub_mnt_want_write(h_mnt); ++ if (!err) { ++ err = vfsub_update_time(h_inode, ts, flags); ++ vfsub_mnt_drop_write(h_mnt); ++ } ++ } else if (au_is_special(h_inode)) { ++ /* ++ * Never copy-up here. ++ * These special files may already be opened and used for ++ * communicating. If we copied it up, then the communication ++ * would be corrupted. ++ */ ++ AuWarn1("timestamps for i%lu are ignored " ++ "since it is on readonly branch (hi%lu).\n", ++ inode->i_ino, h_inode->i_ino); ++ } else if (flags & ~S_ATIME) { ++ err = -EIO; ++ AuIOErr1("unexpected flags 0x%x\n", flags); ++ AuDebugOn(1); ++ } ++ ++ if (!err) ++ au_cpup_attr_timesizes(inode); ++ ii_write_unlock(inode); ++ si_read_unlock(sb); ++ lockdep_on(); ++ ++ if (!err && (flags & S_VERSION)) ++ inode_inc_iversion(inode); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* no getattr version will be set by module.c:aufs_init() */ ++struct inode_operations aufs_iop_nogetattr[AuIop_Last], ++ aufs_iop[] = { ++ [AuIop_SYMLINK] = { ++ .permission = aufs_permission, ++#ifdef CONFIG_FS_POSIX_ACL ++ .get_acl = aufs_get_acl, ++ .set_acl = aufs_set_acl, /* unsupport for symlink? */ ++#endif ++ ++ .setattr = aufs_setattr, ++ .getattr = aufs_getattr, ++ ++#ifdef CONFIG_AUFS_XATTR ++ .listxattr = aufs_listxattr, ++#endif ++ ++ .get_link = aufs_get_link, ++ ++ /* .update_time = aufs_update_time */ ++ }, ++ [AuIop_DIR] = { ++ .create = aufs_create, ++ .lookup = aufs_lookup, ++ .link = aufs_link, ++ .unlink = aufs_unlink, ++ .symlink = aufs_symlink, ++ .mkdir = aufs_mkdir, ++ .rmdir = aufs_rmdir, ++ .mknod = aufs_mknod, ++ .rename = aufs_rename, ++ ++ .permission = aufs_permission, ++#ifdef CONFIG_FS_POSIX_ACL ++ .get_acl = aufs_get_acl, ++ .set_acl = aufs_set_acl, ++#endif ++ ++ .setattr = aufs_setattr, ++ .getattr = aufs_getattr, ++ ++#ifdef CONFIG_AUFS_XATTR ++ .listxattr = aufs_listxattr, ++#endif ++ ++ .update_time = aufs_update_time, ++ .atomic_open = aufs_atomic_open, ++ .tmpfile = aufs_tmpfile ++ }, ++ [AuIop_OTHER] = { ++ .permission = aufs_permission, ++#ifdef CONFIG_FS_POSIX_ACL ++ .get_acl = aufs_get_acl, ++ .set_acl = aufs_set_acl, ++#endif ++ ++ .setattr = aufs_setattr, ++ .getattr = aufs_getattr, ++ ++#ifdef CONFIG_AUFS_XATTR ++ .listxattr = aufs_listxattr, ++#endif ++ ++ .update_time = aufs_update_time ++ } ++}; +diff --git a/fs/aufs/i_op_add.c b/fs/aufs/i_op_add.c +new file mode 100644 +index 000000000000..06c121e746cf +--- /dev/null ++++ b/fs/aufs/i_op_add.c +@@ -0,0 +1,922 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * inode operations (add entry) ++ */ ++ ++#include "aufs.h" ++ ++/* ++ * final procedure of adding a new entry, except link(2). ++ * remove whiteout, instantiate, copyup the parent dir's times and size ++ * and update version. ++ * if it failed, re-create the removed whiteout. ++ */ ++static int epilog(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct dentry *dentry) ++{ ++ int err, rerr; ++ aufs_bindex_t bwh; ++ struct path h_path; ++ struct super_block *sb; ++ struct inode *inode, *h_dir; ++ struct dentry *wh; ++ ++ bwh = -1; ++ sb = dir->i_sb; ++ if (wh_dentry) { ++ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ ++ IMustLock(h_dir); ++ AuDebugOn(au_h_iptr(dir, bindex) != h_dir); ++ bwh = au_dbwh(dentry); ++ h_path.dentry = wh_dentry; ++ h_path.mnt = au_sbr_mnt(sb, bindex); ++ err = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, ++ dentry); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ inode = au_new_inode(dentry, /*must_new*/1); ++ if (!IS_ERR(inode)) { ++ d_instantiate(dentry, inode); ++ dir = d_inode(dentry->d_parent); /* dir inode is locked */ ++ IMustLock(dir); ++ au_dir_ts(dir, bindex); ++ inode_inc_iversion(dir); ++ au_fhsm_wrote(sb, bindex, /*force*/0); ++ return 0; /* success */ ++ } ++ ++ err = PTR_ERR(inode); ++ if (!wh_dentry) ++ goto out; ++ ++ /* revert */ ++ /* dir inode is locked */ ++ wh = au_wh_create(dentry, bwh, wh_dentry->d_parent); ++ rerr = PTR_ERR(wh); ++ if (IS_ERR(wh)) { ++ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", ++ dentry, err, rerr); ++ err = -EIO; ++ } else ++ dput(wh); ++ ++out: ++ return err; ++} ++ ++static int au_d_may_add(struct dentry *dentry) ++{ ++ int err; ++ ++ err = 0; ++ if (unlikely(d_unhashed(dentry))) ++ err = -ENOENT; ++ if (unlikely(d_really_is_positive(dentry))) ++ err = -EEXIST; ++ return err; ++} ++ ++/* ++ * simple tests for the adding inode operations. ++ * following the checks in vfs, plus the parent-child relationship. ++ */ ++int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent, int isdir) ++{ ++ int err; ++ umode_t h_mode; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ ++ err = -ENAMETOOLONG; ++ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) ++ goto out; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (d_really_is_negative(dentry)) { ++ err = -EEXIST; ++ if (unlikely(d_is_positive(h_dentry))) ++ goto out; ++ } else { ++ /* rename(2) case */ ++ err = -EIO; ++ if (unlikely(d_is_negative(h_dentry))) ++ goto out; ++ h_inode = d_inode(h_dentry); ++ if (unlikely(!h_inode->i_nlink)) ++ goto out; ++ ++ h_mode = h_inode->i_mode; ++ if (!isdir) { ++ err = -EISDIR; ++ if (unlikely(S_ISDIR(h_mode))) ++ goto out; ++ } else if (unlikely(!S_ISDIR(h_mode))) { ++ err = -ENOTDIR; ++ goto out; ++ } ++ } ++ ++ err = 0; ++ /* expected parent dir is locked */ ++ if (unlikely(h_parent != h_dentry->d_parent)) ++ err = -EIO; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * initial procedure of adding a new entry. ++ * prepare writable branch and the parent dir, lock it, ++ * and lookup whiteout for the new entry. ++ */ ++static struct dentry* ++lock_hdir_lkup_wh(struct dentry *dentry, struct au_dtime *dt, ++ struct dentry *src_dentry, struct au_pin *pin, ++ struct au_wr_dir_args *wr_dir_args) ++{ ++ struct dentry *wh_dentry, *h_parent; ++ struct super_block *sb; ++ struct au_branch *br; ++ int err; ++ unsigned int udba; ++ aufs_bindex_t bcpup; ++ ++ AuDbg("%pd\n", dentry); ++ ++ err = au_wr_dir(dentry, src_dentry, wr_dir_args); ++ bcpup = err; ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err < 0)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ udba = au_opt_udba(sb); ++ err = au_pin(pin, dentry, bcpup, udba, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ h_parent = au_pinned_h_parent(pin); ++ if (udba != AuOpt_UDBA_NONE ++ && au_dbtop(dentry) == bcpup) ++ err = au_may_add(dentry, bcpup, h_parent, ++ au_ftest_wrdir(wr_dir_args->flags, ISDIR)); ++ else if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) ++ err = -ENAMETOOLONG; ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_unpin; ++ ++ br = au_sbr(sb, bcpup); ++ if (dt) { ++ struct path tmp = { ++ .dentry = h_parent, ++ .mnt = au_br_mnt(br) ++ }; ++ au_dtime_store(dt, au_pinned_parent(pin), &tmp); ++ } ++ ++ wh_dentry = NULL; ++ if (bcpup != au_dbwh(dentry)) ++ goto out; /* success */ ++ ++ /* ++ * ENAMETOOLONG here means that if we allowed create such name, then it ++ * would not be able to removed in the future. So we don't allow such ++ * name here and we don't handle ENAMETOOLONG differently here. ++ */ ++ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, br); ++ ++out_unpin: ++ if (IS_ERR(wh_dentry)) ++ au_unpin(pin); ++out: ++ return wh_dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++enum { Mknod, Symlink, Creat }; ++struct simple_arg { ++ int type; ++ union { ++ struct { ++ umode_t mode; ++ bool want_excl; ++ bool try_aopen; ++ struct vfsub_aopen_args *aopen; ++ } c; ++ struct { ++ const char *symname; ++ } s; ++ struct { ++ umode_t mode; ++ dev_t dev; ++ } m; ++ } u; ++}; ++ ++static int add_simple(struct inode *dir, struct dentry *dentry, ++ struct simple_arg *arg) ++{ ++ int err, rerr; ++ aufs_bindex_t btop; ++ unsigned char created; ++ const unsigned char try_aopen ++ = (arg->type == Creat && arg->u.c.try_aopen); ++ struct vfsub_aopen_args *aopen = arg->u.c.aopen; ++ struct dentry *wh_dentry, *parent; ++ struct inode *h_dir; ++ struct super_block *sb; ++ struct au_branch *br; ++ /* to reduce stack size */ ++ struct { ++ struct au_dtime dt; ++ struct au_pin pin; ++ struct path h_path; ++ struct au_wr_dir_args wr_dir_args; ++ } *a; ++ ++ AuDbg("%pd\n", dentry); ++ IMustLock(dir); ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ a->wr_dir_args.force_btgt = -1; ++ a->wr_dir_args.flags = AuWrDir_ADD_ENTRY; ++ ++ parent = dentry->d_parent; /* dir inode is locked */ ++ if (!try_aopen) { ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_free; ++ } ++ err = au_d_may_add(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ if (!try_aopen) ++ di_write_lock_parent(parent); ++ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, ++ &a->pin, &a->wr_dir_args); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ btop = au_dbtop(dentry); ++ sb = dentry->d_sb; ++ br = au_sbr(sb, btop); ++ a->h_path.dentry = au_h_dptr(dentry, btop); ++ a->h_path.mnt = au_br_mnt(br); ++ h_dir = au_pinned_h_dir(&a->pin); ++ switch (arg->type) { ++ case Creat: ++ if (!try_aopen || !h_dir->i_op->atomic_open) { ++ err = vfsub_create(h_dir, &a->h_path, arg->u.c.mode, ++ arg->u.c.want_excl); ++ created = !err; ++ if (!err && try_aopen) ++ aopen->file->f_mode |= FMODE_CREATED; ++ } else { ++ aopen->br = br; ++ err = vfsub_atomic_open(h_dir, a->h_path.dentry, aopen); ++ AuDbg("err %d\n", err); ++ AuDbgFile(aopen->file); ++ created = err >= 0 ++ && !!(aopen->file->f_mode & FMODE_CREATED); ++ } ++ break; ++ case Symlink: ++ err = vfsub_symlink(h_dir, &a->h_path, arg->u.s.symname); ++ created = !err; ++ break; ++ case Mknod: ++ err = vfsub_mknod(h_dir, &a->h_path, arg->u.m.mode, ++ arg->u.m.dev); ++ created = !err; ++ break; ++ default: ++ BUG(); ++ } ++ if (unlikely(err < 0)) ++ goto out_unpin; ++ ++ err = epilog(dir, btop, wh_dentry, dentry); ++ if (!err) ++ goto out_unpin; /* success */ ++ ++ /* revert */ ++ if (created /* && d_is_positive(a->h_path.dentry) */) { ++ /* no delegation since it is just created */ ++ rerr = vfsub_unlink(h_dir, &a->h_path, /*delegated*/NULL, ++ /*force*/0); ++ if (rerr) { ++ AuIOErr("%pd revert failure(%d, %d)\n", ++ dentry, err, rerr); ++ err = -EIO; ++ } ++ au_dtime_revert(&a->dt); ++ } ++ if (try_aopen && h_dir->i_op->atomic_open ++ && (aopen->file->f_mode & FMODE_OPENED)) ++ /* aopen->file is still opened */ ++ au_lcnt_dec(&aopen->br->br_nfiles); ++ ++out_unpin: ++ au_unpin(&a->pin); ++ dput(wh_dentry); ++out_parent: ++ if (!try_aopen) ++ di_write_unlock(parent); ++out_unlock: ++ if (unlikely(err)) { ++ au_update_dbtop(dentry); ++ d_drop(dentry); ++ } ++ if (!try_aopen) ++ aufs_read_unlock(dentry, AuLock_DW); ++out_free: ++ kfree(a); ++out: ++ return err; ++} ++ ++int aufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, ++ dev_t dev) ++{ ++ struct simple_arg arg = { ++ .type = Mknod, ++ .u.m = { ++ .mode = mode, ++ .dev = dev ++ } ++ }; ++ return add_simple(dir, dentry, &arg); ++} ++ ++int aufs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) ++{ ++ struct simple_arg arg = { ++ .type = Symlink, ++ .u.s.symname = symname ++ }; ++ return add_simple(dir, dentry, &arg); ++} ++ ++int aufs_create(struct inode *dir, struct dentry *dentry, umode_t mode, ++ bool want_excl) ++{ ++ struct simple_arg arg = { ++ .type = Creat, ++ .u.c = { ++ .mode = mode, ++ .want_excl = want_excl ++ } ++ }; ++ return add_simple(dir, dentry, &arg); ++} ++ ++int au_aopen_or_create(struct inode *dir, struct dentry *dentry, ++ struct vfsub_aopen_args *aopen_args) ++{ ++ struct simple_arg arg = { ++ .type = Creat, ++ .u.c = { ++ .mode = aopen_args->create_mode, ++ .want_excl = aopen_args->open_flag & O_EXCL, ++ .try_aopen = true, ++ .aopen = aopen_args ++ } ++ }; ++ return add_simple(dir, dentry, &arg); ++} ++ ++int aufs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct super_block *sb; ++ struct dentry *parent, *h_parent, *h_dentry; ++ struct inode *h_dir, *inode; ++ struct vfsmount *h_mnt; ++ struct au_wr_dir_args wr_dir_args = { ++ .force_btgt = -1, ++ .flags = AuWrDir_TMPFILE ++ }; ++ ++ /* copy-up may happen */ ++ inode_lock(dir); ++ ++ sb = dir->i_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_di_init(dentry); ++ if (unlikely(err)) ++ goto out_si; ++ ++ err = -EBUSY; ++ parent = d_find_any_alias(dir); ++ AuDebugOn(!parent); ++ di_write_lock_parent(parent); ++ if (unlikely(d_inode(parent) != dir)) ++ goto out_parent; ++ ++ err = au_digen_test(parent, au_sigen(sb)); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ bindex = au_dbtop(parent); ++ au_set_dbtop(dentry, bindex); ++ au_set_dbbot(dentry, bindex); ++ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); ++ bindex = err; ++ if (unlikely(err < 0)) ++ goto out_parent; ++ ++ err = -EOPNOTSUPP; ++ h_dir = au_h_iptr(dir, bindex); ++ if (unlikely(!h_dir->i_op->tmpfile)) ++ goto out_parent; ++ ++ h_mnt = au_sbr_mnt(sb, bindex); ++ err = vfsub_mnt_want_write(h_mnt); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ h_parent = au_h_dptr(parent, bindex); ++ h_dentry = vfs_tmpfile(h_parent, mode, /*open_flag*/0); ++ if (IS_ERR(h_dentry)) { ++ err = PTR_ERR(h_dentry); ++ goto out_mnt; ++ } ++ ++ au_set_dbtop(dentry, bindex); ++ au_set_dbbot(dentry, bindex); ++ au_set_h_dptr(dentry, bindex, dget(h_dentry)); ++ inode = au_new_inode(dentry, /*must_new*/1); ++ if (IS_ERR(inode)) { ++ err = PTR_ERR(inode); ++ au_set_h_dptr(dentry, bindex, NULL); ++ au_set_dbtop(dentry, -1); ++ au_set_dbbot(dentry, -1); ++ } else { ++ if (!inode->i_nlink) ++ set_nlink(inode, 1); ++ d_tmpfile(dentry, inode); ++ au_di(dentry)->di_tmpfile = 1; ++ ++ /* update without i_mutex */ ++ if (au_ibtop(dir) == au_dbtop(dentry)) ++ au_cpup_attr_timesizes(dir); ++ } ++ dput(h_dentry); ++ ++out_mnt: ++ vfsub_mnt_drop_write(h_mnt); ++out_parent: ++ di_write_unlock(parent); ++ dput(parent); ++ di_write_unlock(dentry); ++ if (unlikely(err)) { ++ au_di_fin(dentry); ++ dentry->d_fsdata = NULL; ++ } ++out_si: ++ si_read_unlock(sb); ++out: ++ inode_unlock(dir); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_link_args { ++ aufs_bindex_t bdst, bsrc; ++ struct au_pin pin; ++ struct path h_path; ++ struct dentry *src_parent, *parent; ++}; ++ ++static int au_cpup_before_link(struct dentry *src_dentry, ++ struct au_link_args *a) ++{ ++ int err; ++ struct dentry *h_src_dentry; ++ struct au_cp_generic cpg = { ++ .dentry = src_dentry, ++ .bdst = a->bdst, ++ .bsrc = a->bsrc, ++ .len = -1, ++ .pin = &a->pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN /* | AuCpup_KEEPLINO */ ++ }; ++ ++ di_read_lock_parent(a->src_parent, AuLock_IR); ++ err = au_test_and_cpup_dirs(src_dentry, a->bdst); ++ if (unlikely(err)) ++ goto out; ++ ++ h_src_dentry = au_h_dptr(src_dentry, a->bsrc); ++ err = au_pin(&a->pin, src_dentry, a->bdst, ++ au_opt_udba(src_dentry->d_sb), ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&a->pin); ++ ++out: ++ di_read_unlock(a->src_parent, AuLock_IR); ++ return err; ++} ++ ++static int au_cpup_or_link(struct dentry *src_dentry, struct dentry *dentry, ++ struct au_link_args *a) ++{ ++ int err; ++ unsigned char plink; ++ aufs_bindex_t bbot; ++ struct dentry *h_src_dentry; ++ struct inode *h_inode, *inode, *delegated; ++ struct super_block *sb; ++ struct file *h_file; ++ ++ plink = 0; ++ h_inode = NULL; ++ sb = src_dentry->d_sb; ++ inode = d_inode(src_dentry); ++ if (au_ibtop(inode) <= a->bdst) ++ h_inode = au_h_iptr(inode, a->bdst); ++ if (!h_inode || !h_inode->i_nlink) { ++ /* copyup src_dentry as the name of dentry. */ ++ bbot = au_dbbot(dentry); ++ if (bbot < a->bsrc) ++ au_set_dbbot(dentry, a->bsrc); ++ au_set_h_dptr(dentry, a->bsrc, ++ dget(au_h_dptr(src_dentry, a->bsrc))); ++ dget(a->h_path.dentry); ++ au_set_h_dptr(dentry, a->bdst, NULL); ++ AuDbg("temporary d_inode...\n"); ++ spin_lock(&dentry->d_lock); ++ dentry->d_inode = d_inode(src_dentry); /* tmp */ ++ spin_unlock(&dentry->d_lock); ++ h_file = au_h_open_pre(dentry, a->bsrc, /*force_wr*/0); ++ if (IS_ERR(h_file)) ++ err = PTR_ERR(h_file); ++ else { ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = a->bdst, ++ .bsrc = -1, ++ .len = -1, ++ .pin = &a->pin, ++ .flags = AuCpup_KEEPLINO ++ }; ++ err = au_sio_cpup_simple(&cpg); ++ au_h_open_post(dentry, a->bsrc, h_file); ++ if (!err) { ++ dput(a->h_path.dentry); ++ a->h_path.dentry = au_h_dptr(dentry, a->bdst); ++ } else ++ au_set_h_dptr(dentry, a->bdst, ++ a->h_path.dentry); ++ } ++ spin_lock(&dentry->d_lock); ++ dentry->d_inode = NULL; /* restore */ ++ spin_unlock(&dentry->d_lock); ++ AuDbg("temporary d_inode...done\n"); ++ au_set_h_dptr(dentry, a->bsrc, NULL); ++ au_set_dbbot(dentry, bbot); ++ } else { ++ /* the inode of src_dentry already exists on a.bdst branch */ ++ h_src_dentry = d_find_alias(h_inode); ++ if (!h_src_dentry && au_plink_test(inode)) { ++ plink = 1; ++ h_src_dentry = au_plink_lkup(inode, a->bdst); ++ err = PTR_ERR(h_src_dentry); ++ if (IS_ERR(h_src_dentry)) ++ goto out; ++ ++ if (unlikely(d_is_negative(h_src_dentry))) { ++ dput(h_src_dentry); ++ h_src_dentry = NULL; ++ } ++ ++ } ++ if (h_src_dentry) { ++ delegated = NULL; ++ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), ++ &a->h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ dput(h_src_dentry); ++ } else { ++ AuIOErr("no dentry found for hi%lu on b%d\n", ++ h_inode->i_ino, a->bdst); ++ err = -EIO; ++ } ++ } ++ ++ if (!err && !plink) ++ au_plink_append(inode, a->bdst, a->h_path.dentry); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int aufs_link(struct dentry *src_dentry, struct inode *dir, ++ struct dentry *dentry) ++{ ++ int err, rerr; ++ struct au_dtime dt; ++ struct au_link_args *a; ++ struct dentry *wh_dentry, *h_src_dentry; ++ struct inode *inode, *delegated; ++ struct super_block *sb; ++ struct au_wr_dir_args wr_dir_args = { ++ /* .force_btgt = -1, */ ++ .flags = AuWrDir_ADD_ENTRY ++ }; ++ ++ IMustLock(dir); ++ inode = d_inode(src_dentry); ++ IMustLock(inode); ++ ++ err = -ENOMEM; ++ a = kzalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ a->parent = dentry->d_parent; /* dir inode is locked */ ++ err = aufs_read_and_write_lock2(dentry, src_dentry, ++ AuLock_NOPLM | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_kfree; ++ err = au_d_linkable(src_dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ err = au_d_may_add(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ a->src_parent = dget_parent(src_dentry); ++ wr_dir_args.force_btgt = au_ibtop(inode); ++ ++ di_write_lock_parent(a->parent); ++ wr_dir_args.force_btgt = au_wbr(dentry, wr_dir_args.force_btgt); ++ wh_dentry = lock_hdir_lkup_wh(dentry, &dt, src_dentry, &a->pin, ++ &wr_dir_args); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ a->bdst = au_dbtop(dentry); ++ a->h_path.dentry = au_h_dptr(dentry, a->bdst); ++ a->h_path.mnt = au_sbr_mnt(sb, a->bdst); ++ a->bsrc = au_ibtop(inode); ++ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); ++ if (!h_src_dentry && au_di(src_dentry)->di_tmpfile) ++ h_src_dentry = dget(au_hi_wh(inode, a->bsrc)); ++ if (!h_src_dentry) { ++ a->bsrc = au_dbtop(src_dentry); ++ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); ++ AuDebugOn(!h_src_dentry); ++ } else if (IS_ERR(h_src_dentry)) { ++ err = PTR_ERR(h_src_dentry); ++ goto out_parent; ++ } ++ ++ /* ++ * aufs doesn't touch the credential so ++ * security_dentry_create_files_as() is unnecessary. ++ */ ++ if (au_opt_test(au_mntflags(sb), PLINK)) { ++ if (a->bdst < a->bsrc ++ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) ++ err = au_cpup_or_link(src_dentry, dentry, a); ++ else { ++ delegated = NULL; ++ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), ++ &a->h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ } ++ dput(h_src_dentry); ++ } else { ++ /* ++ * copyup src_dentry to the branch we process, ++ * and then link(2) to it. ++ */ ++ dput(h_src_dentry); ++ if (a->bdst < a->bsrc ++ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) { ++ au_unpin(&a->pin); ++ di_write_unlock(a->parent); ++ err = au_cpup_before_link(src_dentry, a); ++ di_write_lock_parent(a->parent); ++ if (!err) ++ err = au_pin(&a->pin, dentry, a->bdst, ++ au_opt_udba(sb), ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out_wh; ++ } ++ if (!err) { ++ h_src_dentry = au_h_dptr(src_dentry, a->bdst); ++ err = -ENOENT; ++ if (h_src_dentry && d_is_positive(h_src_dentry)) { ++ delegated = NULL; ++ err = vfsub_link(h_src_dentry, ++ au_pinned_h_dir(&a->pin), ++ &a->h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry" ++ " for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ } ++ } ++ } ++ if (unlikely(err)) ++ goto out_unpin; ++ ++ if (wh_dentry) { ++ a->h_path.dentry = wh_dentry; ++ err = au_wh_unlink_dentry(au_pinned_h_dir(&a->pin), &a->h_path, ++ dentry); ++ if (unlikely(err)) ++ goto out_revert; ++ } ++ ++ au_dir_ts(dir, a->bdst); ++ inode_inc_iversion(dir); ++ inc_nlink(inode); ++ inode->i_ctime = dir->i_ctime; ++ d_instantiate(dentry, au_igrab(inode)); ++ if (d_unhashed(a->h_path.dentry)) ++ /* some filesystem calls d_drop() */ ++ d_drop(dentry); ++ /* some filesystems consume an inode even hardlink */ ++ au_fhsm_wrote(sb, a->bdst, /*force*/0); ++ goto out_unpin; /* success */ ++ ++out_revert: ++ /* no delegation since it is just created */ ++ rerr = vfsub_unlink(au_pinned_h_dir(&a->pin), &a->h_path, ++ /*delegated*/NULL, /*force*/0); ++ if (unlikely(rerr)) { ++ AuIOErr("%pd reverting failed(%d, %d)\n", dentry, err, rerr); ++ err = -EIO; ++ } ++ au_dtime_revert(&dt); ++out_unpin: ++ au_unpin(&a->pin); ++out_wh: ++ dput(wh_dentry); ++out_parent: ++ di_write_unlock(a->parent); ++ dput(a->src_parent); ++out_unlock: ++ if (unlikely(err)) { ++ au_update_dbtop(dentry); ++ d_drop(dentry); ++ } ++ aufs_read_and_write_unlock2(dentry, src_dentry); ++out_kfree: ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int aufs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) ++{ ++ int err, rerr; ++ aufs_bindex_t bindex; ++ unsigned char diropq; ++ struct path h_path; ++ struct dentry *wh_dentry, *parent, *opq_dentry; ++ struct inode *h_inode; ++ struct super_block *sb; ++ struct { ++ struct au_pin pin; ++ struct au_dtime dt; ++ } *a; /* reduce the stack usage */ ++ struct au_wr_dir_args wr_dir_args = { ++ .force_btgt = -1, ++ .flags = AuWrDir_ADD_ENTRY | AuWrDir_ISDIR ++ }; ++ ++ IMustLock(dir); ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_free; ++ err = au_d_may_add(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ parent = dentry->d_parent; /* dir inode is locked */ ++ di_write_lock_parent(parent); ++ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, ++ &a->pin, &wr_dir_args); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ sb = dentry->d_sb; ++ bindex = au_dbtop(dentry); ++ h_path.dentry = au_h_dptr(dentry, bindex); ++ h_path.mnt = au_sbr_mnt(sb, bindex); ++ err = vfsub_mkdir(au_pinned_h_dir(&a->pin), &h_path, mode); ++ if (unlikely(err)) ++ goto out_unpin; ++ ++ /* make the dir opaque */ ++ diropq = 0; ++ h_inode = d_inode(h_path.dentry); ++ if (wh_dentry ++ || au_opt_test(au_mntflags(sb), ALWAYS_DIROPQ)) { ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ opq_dentry = au_diropq_create(dentry, bindex); ++ inode_unlock(h_inode); ++ err = PTR_ERR(opq_dentry); ++ if (IS_ERR(opq_dentry)) ++ goto out_dir; ++ dput(opq_dentry); ++ diropq = 1; ++ } ++ ++ err = epilog(dir, bindex, wh_dentry, dentry); ++ if (!err) { ++ inc_nlink(dir); ++ goto out_unpin; /* success */ ++ } ++ ++ /* revert */ ++ if (diropq) { ++ AuLabel(revert opq); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ rerr = au_diropq_remove(dentry, bindex); ++ inode_unlock(h_inode); ++ if (rerr) { ++ AuIOErr("%pd reverting diropq failed(%d, %d)\n", ++ dentry, err, rerr); ++ err = -EIO; ++ } ++ } ++ ++out_dir: ++ AuLabel(revert dir); ++ rerr = vfsub_rmdir(au_pinned_h_dir(&a->pin), &h_path); ++ if (rerr) { ++ AuIOErr("%pd reverting dir failed(%d, %d)\n", ++ dentry, err, rerr); ++ err = -EIO; ++ } ++ au_dtime_revert(&a->dt); ++out_unpin: ++ au_unpin(&a->pin); ++ dput(wh_dentry); ++out_parent: ++ di_write_unlock(parent); ++out_unlock: ++ if (unlikely(err)) { ++ au_update_dbtop(dentry); ++ d_drop(dentry); ++ } ++ aufs_read_unlock(dentry, AuLock_DW); ++out_free: ++ kfree(a); ++out: ++ return err; ++} +diff --git a/fs/aufs/i_op_del.c b/fs/aufs/i_op_del.c +new file mode 100644 +index 000000000000..35f6328c49e1 +--- /dev/null ++++ b/fs/aufs/i_op_del.c +@@ -0,0 +1,499 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * inode operations (del entry) ++ */ ++ ++#include "aufs.h" ++ ++/* ++ * decide if a new whiteout for @dentry is necessary or not. ++ * when it is necessary, prepare the parent dir for the upper branch whose ++ * branch index is @bcpup for creation. the actual creation of the whiteout will ++ * be done by caller. ++ * return value: ++ * 0: wh is unnecessary ++ * plus: wh is necessary ++ * minus: error ++ */ ++int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup) ++{ ++ int need_wh, err; ++ aufs_bindex_t btop; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ btop = au_dbtop(dentry); ++ if (*bcpup < 0) { ++ *bcpup = btop; ++ if (au_test_ro(sb, btop, d_inode(dentry))) { ++ err = AuWbrCopyup(au_sbi(sb), dentry); ++ *bcpup = err; ++ if (unlikely(err < 0)) ++ goto out; ++ } ++ } else ++ AuDebugOn(btop < *bcpup ++ || au_test_ro(sb, *bcpup, d_inode(dentry))); ++ AuDbg("bcpup %d, btop %d\n", *bcpup, btop); ++ ++ if (*bcpup != btop) { ++ err = au_cpup_dirs(dentry, *bcpup); ++ if (unlikely(err)) ++ goto out; ++ need_wh = 1; ++ } else { ++ struct au_dinfo *dinfo, *tmp; ++ ++ need_wh = -ENOMEM; ++ dinfo = au_di(dentry); ++ tmp = au_di_alloc(sb, AuLsc_DI_TMP); ++ if (tmp) { ++ au_di_cp(tmp, dinfo); ++ au_di_swap(tmp, dinfo); ++ /* returns the number of positive dentries */ ++ need_wh = au_lkup_dentry(dentry, btop + 1, ++ /* AuLkup_IGNORE_PERM */ 0); ++ au_di_swap(tmp, dinfo); ++ au_rw_write_unlock(&tmp->di_rwsem); ++ au_di_free(tmp); ++ } ++ } ++ AuDbg("need_wh %d\n", need_wh); ++ err = need_wh; ++ ++out: ++ return err; ++} ++ ++/* ++ * simple tests for the del-entry operations. ++ * following the checks in vfs, plus the parent-child relationship. ++ */ ++int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent, int isdir) ++{ ++ int err; ++ umode_t h_mode; ++ struct dentry *h_dentry, *h_latest; ++ struct inode *h_inode; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (d_really_is_positive(dentry)) { ++ err = -ENOENT; ++ if (unlikely(d_is_negative(h_dentry))) ++ goto out; ++ h_inode = d_inode(h_dentry); ++ if (unlikely(!h_inode->i_nlink)) ++ goto out; ++ ++ h_mode = h_inode->i_mode; ++ if (!isdir) { ++ err = -EISDIR; ++ if (unlikely(S_ISDIR(h_mode))) ++ goto out; ++ } else if (unlikely(!S_ISDIR(h_mode))) { ++ err = -ENOTDIR; ++ goto out; ++ } ++ } else { ++ /* rename(2) case */ ++ err = -EIO; ++ if (unlikely(d_is_positive(h_dentry))) ++ goto out; ++ } ++ ++ err = -ENOENT; ++ /* expected parent dir is locked */ ++ if (unlikely(h_parent != h_dentry->d_parent)) ++ goto out; ++ err = 0; ++ ++ /* ++ * rmdir a dir may break the consistency on some filesystem. ++ * let's try heavy test. ++ */ ++ err = -EACCES; ++ if (unlikely(!au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1) ++ && au_test_h_perm(d_inode(h_parent), ++ MAY_EXEC | MAY_WRITE))) ++ goto out; ++ ++ h_latest = au_sio_lkup_one(&dentry->d_name, h_parent); ++ err = -EIO; ++ if (IS_ERR(h_latest)) ++ goto out; ++ if (h_latest == h_dentry) ++ err = 0; ++ dput(h_latest); ++ ++out: ++ return err; ++} ++ ++/* ++ * decide the branch where we operate for @dentry. the branch index will be set ++ * @rbcpup. after deciding it, 'pin' it and store the timestamps of the parent ++ * dir for reverting. ++ * when a new whiteout is necessary, create it. ++ */ ++static struct dentry* ++lock_hdir_create_wh(struct dentry *dentry, int isdir, aufs_bindex_t *rbcpup, ++ struct au_dtime *dt, struct au_pin *pin) ++{ ++ struct dentry *wh_dentry; ++ struct super_block *sb; ++ struct path h_path; ++ int err, need_wh; ++ unsigned int udba; ++ aufs_bindex_t bcpup; ++ ++ need_wh = au_wr_dir_need_wh(dentry, isdir, rbcpup); ++ wh_dentry = ERR_PTR(need_wh); ++ if (unlikely(need_wh < 0)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ udba = au_opt_udba(sb); ++ bcpup = *rbcpup; ++ err = au_pin(pin, dentry, bcpup, udba, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ h_path.dentry = au_pinned_h_parent(pin); ++ if (udba != AuOpt_UDBA_NONE ++ && au_dbtop(dentry) == bcpup) { ++ err = au_may_del(dentry, bcpup, h_path.dentry, isdir); ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_unpin; ++ } ++ ++ h_path.mnt = au_sbr_mnt(sb, bcpup); ++ au_dtime_store(dt, au_pinned_parent(pin), &h_path); ++ wh_dentry = NULL; ++ if (!need_wh) ++ goto out; /* success, no need to create whiteout */ ++ ++ wh_dentry = au_wh_create(dentry, bcpup, h_path.dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_unpin; ++ ++ /* returns with the parent is locked and wh_dentry is dget-ed */ ++ goto out; /* success */ ++ ++out_unpin: ++ au_unpin(pin); ++out: ++ return wh_dentry; ++} ++ ++/* ++ * when removing a dir, rename it to a unique temporary whiteout-ed name first ++ * in order to be revertible and save time for removing many child whiteouts ++ * under the dir. ++ * returns 1 when there are too many child whiteout and caller should remove ++ * them asynchronously. returns 0 when the number of children is enough small to ++ * remove now or the branch fs is a remote fs. ++ * otherwise return an error. ++ */ ++static int renwh_and_rmdir(struct dentry *dentry, aufs_bindex_t bindex, ++ struct au_nhash *whlist, struct inode *dir) ++{ ++ int rmdir_later, err, dirwh; ++ struct dentry *h_dentry; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ sb = dentry->d_sb; ++ SiMustAnyLock(sb); ++ h_dentry = au_h_dptr(dentry, bindex); ++ err = au_whtmp_ren(h_dentry, au_sbr(sb, bindex)); ++ if (unlikely(err)) ++ goto out; ++ ++ /* stop monitoring */ ++ inode = d_inode(dentry); ++ au_hn_free(au_hi(inode, bindex)); ++ ++ if (!au_test_fs_remote(h_dentry->d_sb)) { ++ dirwh = au_sbi(sb)->si_dirwh; ++ rmdir_later = (dirwh <= 1); ++ if (!rmdir_later) ++ rmdir_later = au_nhash_test_longer_wh(whlist, bindex, ++ dirwh); ++ if (rmdir_later) ++ return rmdir_later; ++ } ++ ++ err = au_whtmp_rmdir(dir, bindex, h_dentry, whlist); ++ if (unlikely(err)) { ++ AuIOErr("rmdir %pd, b%d failed, %d. ignored\n", ++ h_dentry, bindex, err); ++ err = 0; ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * final procedure for deleting a entry. ++ * maintain dentry and iattr. ++ */ ++static void epilog(struct inode *dir, struct dentry *dentry, ++ aufs_bindex_t bindex) ++{ ++ struct inode *inode; ++ ++ inode = d_inode(dentry); ++ d_drop(dentry); ++ inode->i_ctime = dir->i_ctime; ++ ++ au_dir_ts(dir, bindex); ++ inode_inc_iversion(dir); ++} ++ ++/* ++ * when an error happened, remove the created whiteout and revert everything. ++ */ ++static int do_revert(int err, struct inode *dir, aufs_bindex_t bindex, ++ aufs_bindex_t bwh, struct dentry *wh_dentry, ++ struct dentry *dentry, struct au_dtime *dt) ++{ ++ int rerr; ++ struct path h_path = { ++ .dentry = wh_dentry, ++ .mnt = au_sbr_mnt(dir->i_sb, bindex) ++ }; ++ ++ rerr = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, dentry); ++ if (!rerr) { ++ au_set_dbwh(dentry, bwh); ++ au_dtime_revert(dt); ++ return 0; ++ } ++ ++ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", dentry, err, rerr); ++ return -EIO; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int aufs_unlink(struct inode *dir, struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t bwh, bindex, btop; ++ struct inode *inode, *h_dir, *delegated; ++ struct dentry *parent, *wh_dentry; ++ /* to reduce stack size */ ++ struct { ++ struct au_dtime dt; ++ struct au_pin pin; ++ struct path h_path; ++ } *a; ++ ++ IMustLock(dir); ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_free; ++ err = au_d_hashed_positive(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ err = -EISDIR; ++ if (unlikely(d_is_dir(dentry))) ++ goto out_unlock; /* possible? */ ++ ++ btop = au_dbtop(dentry); ++ bwh = au_dbwh(dentry); ++ bindex = -1; ++ parent = dentry->d_parent; /* dir inode is locked */ ++ di_write_lock_parent(parent); ++ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/0, &bindex, &a->dt, ++ &a->pin); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ a->h_path.mnt = au_sbr_mnt(dentry->d_sb, btop); ++ a->h_path.dentry = au_h_dptr(dentry, btop); ++ dget(a->h_path.dentry); ++ if (bindex == btop) { ++ h_dir = au_pinned_h_dir(&a->pin); ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, &a->h_path, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ } else { ++ /* dir inode is locked */ ++ h_dir = d_inode(wh_dentry->d_parent); ++ IMustLock(h_dir); ++ err = 0; ++ } ++ ++ if (!err) { ++ vfsub_drop_nlink(inode); ++ epilog(dir, dentry, bindex); ++ ++ /* update target timestamps */ ++ if (bindex == btop) { ++ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); ++ /*ignore*/ ++ inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ } else ++ /* todo: this timestamp may be reverted later */ ++ inode->i_ctime = h_dir->i_ctime; ++ goto out_unpin; /* success */ ++ } ++ ++ /* revert */ ++ if (wh_dentry) { ++ int rerr; ++ ++ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, ++ &a->dt); ++ if (rerr) ++ err = rerr; ++ } ++ ++out_unpin: ++ au_unpin(&a->pin); ++ dput(wh_dentry); ++ dput(a->h_path.dentry); ++out_parent: ++ di_write_unlock(parent); ++out_unlock: ++ aufs_read_unlock(dentry, AuLock_DW); ++out_free: ++ kfree(a); ++out: ++ return err; ++} ++ ++int aufs_rmdir(struct inode *dir, struct dentry *dentry) ++{ ++ int err, rmdir_later; ++ aufs_bindex_t bwh, bindex, btop; ++ struct inode *inode; ++ struct dentry *parent, *wh_dentry, *h_dentry; ++ struct au_whtmp_rmdir *args; ++ /* to reduce stack size */ ++ struct { ++ struct au_dtime dt; ++ struct au_pin pin; ++ } *a; ++ ++ IMustLock(dir); ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_free; ++ err = au_alive_dir(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ err = -ENOTDIR; ++ if (unlikely(!d_is_dir(dentry))) ++ goto out_unlock; /* possible? */ ++ ++ err = -ENOMEM; ++ args = au_whtmp_rmdir_alloc(dir->i_sb, GFP_NOFS); ++ if (unlikely(!args)) ++ goto out_unlock; ++ ++ parent = dentry->d_parent; /* dir inode is locked */ ++ di_write_lock_parent(parent); ++ err = au_test_empty(dentry, &args->whlist); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ btop = au_dbtop(dentry); ++ bwh = au_dbwh(dentry); ++ bindex = -1; ++ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/1, &bindex, &a->dt, ++ &a->pin); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ h_dentry = au_h_dptr(dentry, btop); ++ dget(h_dentry); ++ rmdir_later = 0; ++ if (bindex == btop) { ++ err = renwh_and_rmdir(dentry, btop, &args->whlist, dir); ++ if (err > 0) { ++ rmdir_later = err; ++ err = 0; ++ } ++ } else { ++ /* stop monitoring */ ++ au_hn_free(au_hi(inode, btop)); ++ ++ /* dir inode is locked */ ++ IMustLock(d_inode(wh_dentry->d_parent)); ++ err = 0; ++ } ++ ++ if (!err) { ++ vfsub_dead_dir(inode); ++ au_set_dbdiropq(dentry, -1); ++ epilog(dir, dentry, bindex); ++ ++ if (rmdir_later) { ++ au_whtmp_kick_rmdir(dir, btop, h_dentry, args); ++ args = NULL; ++ } ++ ++ goto out_unpin; /* success */ ++ } ++ ++ /* revert */ ++ AuLabel(revert); ++ if (wh_dentry) { ++ int rerr; ++ ++ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, ++ &a->dt); ++ if (rerr) ++ err = rerr; ++ } ++ ++out_unpin: ++ au_unpin(&a->pin); ++ dput(wh_dentry); ++ dput(h_dentry); ++out_parent: ++ di_write_unlock(parent); ++ if (args) ++ au_whtmp_rmdir_free(args); ++out_unlock: ++ aufs_read_unlock(dentry, AuLock_DW); ++out_free: ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} +diff --git a/fs/aufs/i_op_ren.c b/fs/aufs/i_op_ren.c +new file mode 100644 +index 000000000000..5849f3c83f29 +--- /dev/null ++++ b/fs/aufs/i_op_ren.c +@@ -0,0 +1,1236 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * inode operation (rename entry) ++ * todo: this is crazy monster ++ */ ++ ++#include "aufs.h" ++ ++enum { AuSRC, AuDST, AuSrcDst }; ++enum { AuPARENT, AuCHILD, AuParentChild }; ++ ++#define AuRen_ISDIR_SRC 1 ++#define AuRen_ISDIR_DST (1 << 1) ++#define AuRen_ISSAMEDIR (1 << 2) ++#define AuRen_WHSRC (1 << 3) ++#define AuRen_WHDST (1 << 4) ++#define AuRen_MNT_WRITE (1 << 5) ++#define AuRen_DT_DSTDIR (1 << 6) ++#define AuRen_DIROPQ_SRC (1 << 7) ++#define AuRen_DIROPQ_DST (1 << 8) ++#define AuRen_DIRREN (1 << 9) ++#define AuRen_DROPPED_SRC (1 << 10) ++#define AuRen_DROPPED_DST (1 << 11) ++#define au_ftest_ren(flags, name) ((flags) & AuRen_##name) ++#define au_fset_ren(flags, name) \ ++ do { (flags) |= AuRen_##name; } while (0) ++#define au_fclr_ren(flags, name) \ ++ do { (flags) &= ~AuRen_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_DIRREN ++#undef AuRen_DIRREN ++#define AuRen_DIRREN 0 ++#endif ++ ++struct au_ren_args { ++ struct { ++ struct dentry *dentry, *h_dentry, *parent, *h_parent, ++ *wh_dentry; ++ struct inode *dir, *inode; ++ struct au_hinode *hdir, *hinode; ++ struct au_dtime dt[AuParentChild]; ++ aufs_bindex_t btop, bdiropq; ++ } sd[AuSrcDst]; ++ ++#define src_dentry sd[AuSRC].dentry ++#define src_dir sd[AuSRC].dir ++#define src_inode sd[AuSRC].inode ++#define src_h_dentry sd[AuSRC].h_dentry ++#define src_parent sd[AuSRC].parent ++#define src_h_parent sd[AuSRC].h_parent ++#define src_wh_dentry sd[AuSRC].wh_dentry ++#define src_hdir sd[AuSRC].hdir ++#define src_hinode sd[AuSRC].hinode ++#define src_h_dir sd[AuSRC].hdir->hi_inode ++#define src_dt sd[AuSRC].dt ++#define src_btop sd[AuSRC].btop ++#define src_bdiropq sd[AuSRC].bdiropq ++ ++#define dst_dentry sd[AuDST].dentry ++#define dst_dir sd[AuDST].dir ++#define dst_inode sd[AuDST].inode ++#define dst_h_dentry sd[AuDST].h_dentry ++#define dst_parent sd[AuDST].parent ++#define dst_h_parent sd[AuDST].h_parent ++#define dst_wh_dentry sd[AuDST].wh_dentry ++#define dst_hdir sd[AuDST].hdir ++#define dst_hinode sd[AuDST].hinode ++#define dst_h_dir sd[AuDST].hdir->hi_inode ++#define dst_dt sd[AuDST].dt ++#define dst_btop sd[AuDST].btop ++#define dst_bdiropq sd[AuDST].bdiropq ++ ++ struct dentry *h_trap; ++ struct au_branch *br; ++ struct path h_path; ++ struct au_nhash whlist; ++ aufs_bindex_t btgt, src_bwh; ++ ++ struct { ++ unsigned short auren_flags; ++ unsigned char flags; /* syscall parameter */ ++ unsigned char exchange; ++ } __packed; ++ ++ struct au_whtmp_rmdir *thargs; ++ struct dentry *h_dst; ++ struct au_hinode *h_root; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * functions for reverting. ++ * when an error happened in a single rename systemcall, we should revert ++ * everything as if nothing happened. ++ * we don't need to revert the copied-up/down the parent dir since they are ++ * harmless. ++ */ ++ ++#define RevertFailure(fmt, ...) do { \ ++ AuIOErr("revert failure: " fmt " (%d, %d)\n", \ ++ ##__VA_ARGS__, err, rerr); \ ++ err = -EIO; \ ++} while (0) ++ ++static void au_ren_do_rev_diropq(int err, struct au_ren_args *a, int idx) ++{ ++ int rerr; ++ struct dentry *d; ++#define src_or_dst(member) a->sd[idx].member ++ ++ d = src_or_dst(dentry); /* {src,dst}_dentry */ ++ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); ++ rerr = au_diropq_remove(d, a->btgt); ++ au_hn_inode_unlock(src_or_dst(hinode)); ++ au_set_dbdiropq(d, src_or_dst(bdiropq)); ++ if (rerr) ++ RevertFailure("remove diropq %pd", d); ++ ++#undef src_or_dst_ ++} ++ ++static void au_ren_rev_diropq(int err, struct au_ren_args *a) ++{ ++ if (au_ftest_ren(a->auren_flags, DIROPQ_SRC)) ++ au_ren_do_rev_diropq(err, a, AuSRC); ++ if (au_ftest_ren(a->auren_flags, DIROPQ_DST)) ++ au_ren_do_rev_diropq(err, a, AuDST); ++} ++ ++static void au_ren_rev_rename(int err, struct au_ren_args *a) ++{ ++ int rerr; ++ struct inode *delegated; ++ ++ a->h_path.dentry = vfsub_lkup_one(&a->src_dentry->d_name, ++ a->src_h_parent); ++ rerr = PTR_ERR(a->h_path.dentry); ++ if (IS_ERR(a->h_path.dentry)) { ++ RevertFailure("lkup one %pd", a->src_dentry); ++ return; ++ } ++ ++ delegated = NULL; ++ rerr = vfsub_rename(a->dst_h_dir, ++ au_h_dptr(a->src_dentry, a->btgt), ++ a->src_h_dir, &a->h_path, &delegated, a->flags); ++ if (unlikely(rerr == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal rename\n"); ++ iput(delegated); ++ } ++ d_drop(a->h_path.dentry); ++ dput(a->h_path.dentry); ++ /* au_set_h_dptr(a->src_dentry, a->btgt, NULL); */ ++ if (rerr) ++ RevertFailure("rename %pd", a->src_dentry); ++} ++ ++static void au_ren_rev_whtmp(int err, struct au_ren_args *a) ++{ ++ int rerr; ++ struct inode *delegated; ++ ++ a->h_path.dentry = vfsub_lkup_one(&a->dst_dentry->d_name, ++ a->dst_h_parent); ++ rerr = PTR_ERR(a->h_path.dentry); ++ if (IS_ERR(a->h_path.dentry)) { ++ RevertFailure("lkup one %pd", a->dst_dentry); ++ return; ++ } ++ if (d_is_positive(a->h_path.dentry)) { ++ d_drop(a->h_path.dentry); ++ dput(a->h_path.dentry); ++ return; ++ } ++ ++ delegated = NULL; ++ rerr = vfsub_rename(a->dst_h_dir, a->h_dst, a->dst_h_dir, &a->h_path, ++ &delegated, a->flags); ++ if (unlikely(rerr == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal rename\n"); ++ iput(delegated); ++ } ++ d_drop(a->h_path.dentry); ++ dput(a->h_path.dentry); ++ if (!rerr) ++ au_set_h_dptr(a->dst_dentry, a->btgt, dget(a->h_dst)); ++ else ++ RevertFailure("rename %pd", a->h_dst); ++} ++ ++static void au_ren_rev_whsrc(int err, struct au_ren_args *a) ++{ ++ int rerr; ++ ++ a->h_path.dentry = a->src_wh_dentry; ++ rerr = au_wh_unlink_dentry(a->src_h_dir, &a->h_path, a->src_dentry); ++ au_set_dbwh(a->src_dentry, a->src_bwh); ++ if (rerr) ++ RevertFailure("unlink %pd", a->src_wh_dentry); ++} ++#undef RevertFailure ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * when we have to copyup the renaming entry, do it with the rename-target name ++ * in order to minimize the cost (the later actual rename is unnecessary). ++ * otherwise rename it on the target branch. ++ */ ++static int au_ren_or_cpup(struct au_ren_args *a) ++{ ++ int err; ++ struct dentry *d; ++ struct inode *delegated; ++ ++ d = a->src_dentry; ++ if (au_dbtop(d) == a->btgt) { ++ a->h_path.dentry = a->dst_h_dentry; ++ AuDebugOn(au_dbtop(d) != a->btgt); ++ delegated = NULL; ++ err = vfsub_rename(a->src_h_dir, au_h_dptr(d, a->btgt), ++ a->dst_h_dir, &a->h_path, &delegated, ++ a->flags); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal rename\n"); ++ iput(delegated); ++ } ++ } else ++ BUG(); ++ ++ if (!err && a->h_dst) ++ /* it will be set to dinfo later */ ++ dget(a->h_dst); ++ ++ return err; ++} ++ ++/* cf. aufs_rmdir() */ ++static int au_ren_del_whtmp(struct au_ren_args *a) ++{ ++ int err; ++ struct inode *dir; ++ ++ dir = a->dst_dir; ++ SiMustAnyLock(dir->i_sb); ++ if (!au_nhash_test_longer_wh(&a->whlist, a->btgt, ++ au_sbi(dir->i_sb)->si_dirwh) ++ || au_test_fs_remote(a->h_dst->d_sb)) { ++ err = au_whtmp_rmdir(dir, a->btgt, a->h_dst, &a->whlist); ++ if (unlikely(err)) ++ pr_warn("failed removing whtmp dir %pd (%d), " ++ "ignored.\n", a->h_dst, err); ++ } else { ++ au_nhash_wh_free(&a->thargs->whlist); ++ a->thargs->whlist = a->whlist; ++ a->whlist.nh_num = 0; ++ au_whtmp_kick_rmdir(dir, a->btgt, a->h_dst, a->thargs); ++ dput(a->h_dst); ++ a->thargs = NULL; ++ } ++ ++ return 0; ++} ++ ++/* make it 'opaque' dir. */ ++static int au_ren_do_diropq(struct au_ren_args *a, int idx) ++{ ++ int err; ++ struct dentry *d, *diropq; ++#define src_or_dst(member) a->sd[idx].member ++ ++ err = 0; ++ d = src_or_dst(dentry); /* {src,dst}_dentry */ ++ src_or_dst(bdiropq) = au_dbdiropq(d); ++ src_or_dst(hinode) = au_hi(src_or_dst(inode), a->btgt); ++ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); ++ diropq = au_diropq_create(d, a->btgt); ++ au_hn_inode_unlock(src_or_dst(hinode)); ++ if (IS_ERR(diropq)) ++ err = PTR_ERR(diropq); ++ else ++ dput(diropq); ++ ++#undef src_or_dst_ ++ return err; ++} ++ ++static int au_ren_diropq(struct au_ren_args *a) ++{ ++ int err; ++ unsigned char always; ++ struct dentry *d; ++ ++ err = 0; ++ d = a->dst_dentry; /* already renamed on the branch */ ++ always = !!au_opt_test(au_mntflags(d->d_sb), ALWAYS_DIROPQ); ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) ++ && !au_ftest_ren(a->auren_flags, DIRREN) ++ && a->btgt != au_dbdiropq(a->src_dentry) ++ && (a->dst_wh_dentry ++ || a->btgt <= au_dbdiropq(d) ++ /* hide the lower to keep xino */ ++ /* the lowers may not be a dir, but we hide them anyway */ ++ || a->btgt < au_dbbot(d) ++ || always)) { ++ AuDbg("here\n"); ++ err = au_ren_do_diropq(a, AuSRC); ++ if (unlikely(err)) ++ goto out; ++ au_fset_ren(a->auren_flags, DIROPQ_SRC); ++ } ++ if (!a->exchange) ++ goto out; /* success */ ++ ++ d = a->src_dentry; /* already renamed on the branch */ ++ if (au_ftest_ren(a->auren_flags, ISDIR_DST) ++ && a->btgt != au_dbdiropq(a->dst_dentry) ++ && (a->btgt < au_dbdiropq(d) ++ || a->btgt < au_dbbot(d) ++ || always)) { ++ AuDbgDentry(a->src_dentry); ++ AuDbgDentry(a->dst_dentry); ++ err = au_ren_do_diropq(a, AuDST); ++ if (unlikely(err)) ++ goto out_rev_src; ++ au_fset_ren(a->auren_flags, DIROPQ_DST); ++ } ++ goto out; /* success */ ++ ++out_rev_src: ++ AuDbg("err %d, reverting src\n", err); ++ au_ren_rev_diropq(err, a); ++out: ++ return err; ++} ++ ++static int do_rename(struct au_ren_args *a) ++{ ++ int err; ++ struct dentry *d, *h_d; ++ ++ if (!a->exchange) { ++ /* prepare workqueue args for asynchronous rmdir */ ++ h_d = a->dst_h_dentry; ++ if (au_ftest_ren(a->auren_flags, ISDIR_DST) ++ /* && !au_ftest_ren(a->auren_flags, DIRREN) */ ++ && d_is_positive(h_d)) { ++ err = -ENOMEM; ++ a->thargs = au_whtmp_rmdir_alloc(a->src_dentry->d_sb, ++ GFP_NOFS); ++ if (unlikely(!a->thargs)) ++ goto out; ++ a->h_dst = dget(h_d); ++ } ++ ++ /* create whiteout for src_dentry */ ++ if (au_ftest_ren(a->auren_flags, WHSRC)) { ++ a->src_bwh = au_dbwh(a->src_dentry); ++ AuDebugOn(a->src_bwh >= 0); ++ a->src_wh_dentry = au_wh_create(a->src_dentry, a->btgt, ++ a->src_h_parent); ++ err = PTR_ERR(a->src_wh_dentry); ++ if (IS_ERR(a->src_wh_dentry)) ++ goto out_thargs; ++ } ++ ++ /* lookup whiteout for dentry */ ++ if (au_ftest_ren(a->auren_flags, WHDST)) { ++ h_d = au_wh_lkup(a->dst_h_parent, ++ &a->dst_dentry->d_name, a->br); ++ err = PTR_ERR(h_d); ++ if (IS_ERR(h_d)) ++ goto out_whsrc; ++ if (d_is_negative(h_d)) ++ dput(h_d); ++ else ++ a->dst_wh_dentry = h_d; ++ } ++ ++ /* rename dentry to tmpwh */ ++ if (a->thargs) { ++ err = au_whtmp_ren(a->dst_h_dentry, a->br); ++ if (unlikely(err)) ++ goto out_whdst; ++ ++ d = a->dst_dentry; ++ au_set_h_dptr(d, a->btgt, NULL); ++ err = au_lkup_neg(d, a->btgt, /*wh*/0); ++ if (unlikely(err)) ++ goto out_whtmp; ++ a->dst_h_dentry = au_h_dptr(d, a->btgt); ++ } ++ } ++ ++ BUG_ON(d_is_positive(a->dst_h_dentry) && a->src_btop != a->btgt); ++#if 0 ++ BUG_ON(!au_ftest_ren(a->auren_flags, DIRREN) ++ && d_is_positive(a->dst_h_dentry) ++ && a->src_btop != a->btgt); ++#endif ++ ++ /* rename by vfs_rename or cpup */ ++ err = au_ren_or_cpup(a); ++ if (unlikely(err)) ++ /* leave the copied-up one */ ++ goto out_whtmp; ++ ++ /* make dir opaque */ ++ err = au_ren_diropq(a); ++ if (unlikely(err)) ++ goto out_rename; ++ ++ /* update target timestamps */ ++ if (a->exchange) { ++ AuDebugOn(au_dbtop(a->dst_dentry) != a->btgt); ++ a->h_path.dentry = au_h_dptr(a->dst_dentry, a->btgt); ++ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ ++ a->dst_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ } ++ AuDebugOn(au_dbtop(a->src_dentry) != a->btgt); ++ a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt); ++ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ ++ a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ ++ if (!a->exchange) { ++ /* remove whiteout for dentry */ ++ if (a->dst_wh_dentry) { ++ a->h_path.dentry = a->dst_wh_dentry; ++ err = au_wh_unlink_dentry(a->dst_h_dir, &a->h_path, ++ a->dst_dentry); ++ if (unlikely(err)) ++ goto out_diropq; ++ } ++ ++ /* remove whtmp */ ++ if (a->thargs) ++ au_ren_del_whtmp(a); /* ignore this error */ ++ ++ au_fhsm_wrote(a->src_dentry->d_sb, a->btgt, /*force*/0); ++ } ++ err = 0; ++ goto out_success; ++ ++out_diropq: ++ au_ren_rev_diropq(err, a); ++out_rename: ++ au_ren_rev_rename(err, a); ++ dput(a->h_dst); ++out_whtmp: ++ if (a->thargs) ++ au_ren_rev_whtmp(err, a); ++out_whdst: ++ dput(a->dst_wh_dentry); ++ a->dst_wh_dentry = NULL; ++out_whsrc: ++ if (a->src_wh_dentry) ++ au_ren_rev_whsrc(err, a); ++out_success: ++ dput(a->src_wh_dentry); ++ dput(a->dst_wh_dentry); ++out_thargs: ++ if (a->thargs) { ++ dput(a->h_dst); ++ au_whtmp_rmdir_free(a->thargs); ++ a->thargs = NULL; ++ } ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * test if @dentry dir can be rename destination or not. ++ * success means, it is a logically empty dir. ++ */ ++static int may_rename_dstdir(struct dentry *dentry, struct au_nhash *whlist) ++{ ++ return au_test_empty(dentry, whlist); ++} ++ ++/* ++ * test if @a->src_dentry dir can be rename source or not. ++ * if it can, return 0. ++ * success means, ++ * - it is a logically empty dir. ++ * - or, it exists on writable branch and has no children including whiteouts ++ * on the lower branch unless DIRREN is on. ++ */ ++static int may_rename_srcdir(struct au_ren_args *a) ++{ ++ int err; ++ unsigned int rdhash; ++ aufs_bindex_t btop, btgt; ++ struct dentry *dentry; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ ++ dentry = a->src_dentry; ++ sb = dentry->d_sb; ++ sbinfo = au_sbi(sb); ++ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) ++ au_fset_ren(a->auren_flags, DIRREN); ++ ++ btgt = a->btgt; ++ btop = au_dbtop(dentry); ++ if (btop != btgt) { ++ struct au_nhash whlist; ++ ++ SiMustAnyLock(sb); ++ rdhash = sbinfo->si_rdhash; ++ if (!rdhash) ++ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, ++ dentry)); ++ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_test_empty(dentry, &whlist); ++ au_nhash_wh_free(&whlist); ++ goto out; ++ } ++ ++ if (btop == au_dbtaildir(dentry)) ++ return 0; /* success */ ++ ++ err = au_test_empty_lower(dentry); ++ ++out: ++ if (err == -ENOTEMPTY) { ++ if (au_ftest_ren(a->auren_flags, DIRREN)) { ++ err = 0; ++ } else { ++ AuWarn1("renaming dir who has child(ren) on multiple " ++ "branches, is not supported\n"); ++ err = -EXDEV; ++ } ++ } ++ return err; ++} ++ ++/* side effect: sets whlist and h_dentry */ ++static int au_ren_may_dir(struct au_ren_args *a) ++{ ++ int err; ++ unsigned int rdhash; ++ struct dentry *d; ++ ++ d = a->dst_dentry; ++ SiMustAnyLock(d->d_sb); ++ ++ err = 0; ++ if (au_ftest_ren(a->auren_flags, ISDIR_DST) && a->dst_inode) { ++ rdhash = au_sbi(d->d_sb)->si_rdhash; ++ if (!rdhash) ++ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, d)); ++ err = au_nhash_alloc(&a->whlist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ ++ if (!a->exchange) { ++ au_set_dbtop(d, a->dst_btop); ++ err = may_rename_dstdir(d, &a->whlist); ++ au_set_dbtop(d, a->btgt); ++ } else ++ err = may_rename_srcdir(a); ++ } ++ a->dst_h_dentry = au_h_dptr(d, au_dbtop(d)); ++ if (unlikely(err)) ++ goto out; ++ ++ d = a->src_dentry; ++ a->src_h_dentry = au_h_dptr(d, au_dbtop(d)); ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { ++ err = may_rename_srcdir(a); ++ if (unlikely(err)) { ++ au_nhash_wh_free(&a->whlist); ++ a->whlist.nh_num = 0; ++ } ++ } ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * simple tests for rename. ++ * following the checks in vfs, plus the parent-child relationship. ++ */ ++static int au_may_ren(struct au_ren_args *a) ++{ ++ int err, isdir; ++ struct inode *h_inode; ++ ++ if (a->src_btop == a->btgt) { ++ err = au_may_del(a->src_dentry, a->btgt, a->src_h_parent, ++ au_ftest_ren(a->auren_flags, ISDIR_SRC)); ++ if (unlikely(err)) ++ goto out; ++ err = -EINVAL; ++ if (unlikely(a->src_h_dentry == a->h_trap)) ++ goto out; ++ } ++ ++ err = 0; ++ if (a->dst_btop != a->btgt) ++ goto out; ++ ++ err = -ENOTEMPTY; ++ if (unlikely(a->dst_h_dentry == a->h_trap)) ++ goto out; ++ ++ err = -EIO; ++ isdir = !!au_ftest_ren(a->auren_flags, ISDIR_DST); ++ if (d_really_is_negative(a->dst_dentry)) { ++ if (d_is_negative(a->dst_h_dentry)) ++ err = au_may_add(a->dst_dentry, a->btgt, ++ a->dst_h_parent, isdir); ++ } else { ++ if (unlikely(d_is_negative(a->dst_h_dentry))) ++ goto out; ++ h_inode = d_inode(a->dst_h_dentry); ++ if (h_inode->i_nlink) ++ err = au_may_del(a->dst_dentry, a->btgt, ++ a->dst_h_parent, isdir); ++ } ++ ++out: ++ if (unlikely(err == -ENOENT || err == -EEXIST)) ++ err = -EIO; ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * locking order ++ * (VFS) ++ * - src_dir and dir by lock_rename() ++ * - inode if exists ++ * (aufs) ++ * - lock all ++ * + src_dentry and dentry by aufs_read_and_write_lock2() which calls, ++ * + si_read_lock ++ * + di_write_lock2_child() ++ * + di_write_lock_child() ++ * + ii_write_lock_child() ++ * + di_write_lock_child2() ++ * + ii_write_lock_child2() ++ * + src_parent and parent ++ * + di_write_lock_parent() ++ * + ii_write_lock_parent() ++ * + di_write_lock_parent2() ++ * + ii_write_lock_parent2() ++ * + lower src_dir and dir by vfsub_lock_rename() ++ * + verify the every relationships between child and parent. if any ++ * of them failed, unlock all and return -EBUSY. ++ */ ++static void au_ren_unlock(struct au_ren_args *a) ++{ ++ vfsub_unlock_rename(a->src_h_parent, a->src_hdir, ++ a->dst_h_parent, a->dst_hdir); ++ if (au_ftest_ren(a->auren_flags, DIRREN) ++ && a->h_root) ++ au_hn_inode_unlock(a->h_root); ++ if (au_ftest_ren(a->auren_flags, MNT_WRITE)) ++ vfsub_mnt_drop_write(au_br_mnt(a->br)); ++} ++ ++static int au_ren_lock(struct au_ren_args *a) ++{ ++ int err; ++ unsigned int udba; ++ ++ err = 0; ++ a->src_h_parent = au_h_dptr(a->src_parent, a->btgt); ++ a->src_hdir = au_hi(a->src_dir, a->btgt); ++ a->dst_h_parent = au_h_dptr(a->dst_parent, a->btgt); ++ a->dst_hdir = au_hi(a->dst_dir, a->btgt); ++ ++ err = vfsub_mnt_want_write(au_br_mnt(a->br)); ++ if (unlikely(err)) ++ goto out; ++ au_fset_ren(a->auren_flags, MNT_WRITE); ++ if (au_ftest_ren(a->auren_flags, DIRREN)) { ++ struct dentry *root; ++ struct inode *dir; ++ ++ /* ++ * sbinfo is already locked, so this ii_read_lock is ++ * unnecessary. but our debugging feature checks it. ++ */ ++ root = a->src_inode->i_sb->s_root; ++ if (root != a->src_parent && root != a->dst_parent) { ++ dir = d_inode(root); ++ ii_read_lock_parent3(dir); ++ a->h_root = au_hi(dir, a->btgt); ++ ii_read_unlock(dir); ++ au_hn_inode_lock_nested(a->h_root, AuLsc_I_PARENT3); ++ } ++ } ++ a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir, ++ a->dst_h_parent, a->dst_hdir); ++ udba = au_opt_udba(a->src_dentry->d_sb); ++ if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent) ++ || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent))) ++ err = au_busy_or_stale(); ++ if (!err && au_dbtop(a->src_dentry) == a->btgt) ++ err = au_h_verify(a->src_h_dentry, udba, ++ d_inode(a->src_h_parent), a->src_h_parent, ++ a->br); ++ if (!err && au_dbtop(a->dst_dentry) == a->btgt) ++ err = au_h_verify(a->dst_h_dentry, udba, ++ d_inode(a->dst_h_parent), a->dst_h_parent, ++ a->br); ++ if (!err) ++ goto out; /* success */ ++ ++ err = au_busy_or_stale(); ++ au_ren_unlock(a); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_ren_refresh_dir(struct au_ren_args *a) ++{ ++ struct inode *dir; ++ ++ dir = a->dst_dir; ++ inode_inc_iversion(dir); ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { ++ /* is this updating defined in POSIX? */ ++ au_cpup_attr_timesizes(a->src_inode); ++ au_cpup_attr_nlink(dir, /*force*/1); ++ } ++ au_dir_ts(dir, a->btgt); ++ ++ if (a->exchange) { ++ dir = a->src_dir; ++ inode_inc_iversion(dir); ++ if (au_ftest_ren(a->auren_flags, ISDIR_DST)) { ++ /* is this updating defined in POSIX? */ ++ au_cpup_attr_timesizes(a->dst_inode); ++ au_cpup_attr_nlink(dir, /*force*/1); ++ } ++ au_dir_ts(dir, a->btgt); ++ } ++ ++ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) ++ return; ++ ++ dir = a->src_dir; ++ inode_inc_iversion(dir); ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) ++ au_cpup_attr_nlink(dir, /*force*/1); ++ au_dir_ts(dir, a->btgt); ++} ++ ++static void au_ren_refresh(struct au_ren_args *a) ++{ ++ aufs_bindex_t bbot, bindex; ++ struct dentry *d, *h_d; ++ struct inode *i, *h_i; ++ struct super_block *sb; ++ ++ d = a->dst_dentry; ++ d_drop(d); ++ if (a->h_dst) ++ /* already dget-ed by au_ren_or_cpup() */ ++ au_set_h_dptr(d, a->btgt, a->h_dst); ++ ++ i = a->dst_inode; ++ if (i) { ++ if (!a->exchange) { ++ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) ++ vfsub_drop_nlink(i); ++ else { ++ vfsub_dead_dir(i); ++ au_cpup_attr_timesizes(i); ++ } ++ au_update_dbrange(d, /*do_put_zero*/1); ++ } else ++ au_cpup_attr_nlink(i, /*force*/1); ++ } else { ++ bbot = a->btgt; ++ for (bindex = au_dbtop(d); bindex < bbot; bindex++) ++ au_set_h_dptr(d, bindex, NULL); ++ bbot = au_dbbot(d); ++ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) ++ au_set_h_dptr(d, bindex, NULL); ++ au_update_dbrange(d, /*do_put_zero*/0); ++ } ++ ++ if (a->exchange ++ || au_ftest_ren(a->auren_flags, DIRREN)) { ++ d_drop(a->src_dentry); ++ if (au_ftest_ren(a->auren_flags, DIRREN)) ++ au_set_dbwh(a->src_dentry, -1); ++ return; ++ } ++ ++ d = a->src_dentry; ++ au_set_dbwh(d, -1); ++ bbot = au_dbbot(d); ++ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { ++ h_d = au_h_dptr(d, bindex); ++ if (h_d) ++ au_set_h_dptr(d, bindex, NULL); ++ } ++ au_set_dbbot(d, a->btgt); ++ ++ sb = d->d_sb; ++ i = a->src_inode; ++ if (au_opt_test(au_mntflags(sb), PLINK) && au_plink_test(i)) ++ return; /* success */ ++ ++ bbot = au_ibbot(i); ++ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { ++ h_i = au_h_iptr(i, bindex); ++ if (h_i) { ++ au_xino_write(sb, bindex, h_i->i_ino, /*ino*/0); ++ /* ignore this error */ ++ au_set_h_iptr(i, bindex, NULL, 0); ++ } ++ } ++ au_set_ibbot(i, a->btgt); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* mainly for link(2) and rename(2) */ ++int au_wbr(struct dentry *dentry, aufs_bindex_t btgt) ++{ ++ aufs_bindex_t bdiropq, bwh; ++ struct dentry *parent; ++ struct au_branch *br; ++ ++ parent = dentry->d_parent; ++ IMustLock(d_inode(parent)); /* dir is locked */ ++ ++ bdiropq = au_dbdiropq(parent); ++ bwh = au_dbwh(dentry); ++ br = au_sbr(dentry->d_sb, btgt); ++ if (au_br_rdonly(br) ++ || (0 <= bdiropq && bdiropq < btgt) ++ || (0 <= bwh && bwh < btgt)) ++ btgt = -1; ++ ++ AuDbg("btgt %d\n", btgt); ++ return btgt; ++} ++ ++/* sets src_btop, dst_btop and btgt */ ++static int au_ren_wbr(struct au_ren_args *a) ++{ ++ int err; ++ struct au_wr_dir_args wr_dir_args = { ++ /* .force_btgt = -1, */ ++ .flags = AuWrDir_ADD_ENTRY ++ }; ++ ++ a->src_btop = au_dbtop(a->src_dentry); ++ a->dst_btop = au_dbtop(a->dst_dentry); ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) ++ || au_ftest_ren(a->auren_flags, ISDIR_DST)) ++ au_fset_wrdir(wr_dir_args.flags, ISDIR); ++ wr_dir_args.force_btgt = a->src_btop; ++ if (a->dst_inode && a->dst_btop < a->src_btop) ++ wr_dir_args.force_btgt = a->dst_btop; ++ wr_dir_args.force_btgt = au_wbr(a->dst_dentry, wr_dir_args.force_btgt); ++ err = au_wr_dir(a->dst_dentry, a->src_dentry, &wr_dir_args); ++ a->btgt = err; ++ if (a->exchange) ++ au_update_dbtop(a->dst_dentry); ++ ++ return err; ++} ++ ++static void au_ren_dt(struct au_ren_args *a) ++{ ++ a->h_path.dentry = a->src_h_parent; ++ au_dtime_store(a->src_dt + AuPARENT, a->src_parent, &a->h_path); ++ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) { ++ a->h_path.dentry = a->dst_h_parent; ++ au_dtime_store(a->dst_dt + AuPARENT, a->dst_parent, &a->h_path); ++ } ++ ++ au_fclr_ren(a->auren_flags, DT_DSTDIR); ++ if (!au_ftest_ren(a->auren_flags, ISDIR_SRC) ++ && !a->exchange) ++ return; ++ ++ a->h_path.dentry = a->src_h_dentry; ++ au_dtime_store(a->src_dt + AuCHILD, a->src_dentry, &a->h_path); ++ if (d_is_positive(a->dst_h_dentry)) { ++ au_fset_ren(a->auren_flags, DT_DSTDIR); ++ a->h_path.dentry = a->dst_h_dentry; ++ au_dtime_store(a->dst_dt + AuCHILD, a->dst_dentry, &a->h_path); ++ } ++} ++ ++static void au_ren_rev_dt(int err, struct au_ren_args *a) ++{ ++ struct dentry *h_d; ++ struct inode *h_inode; ++ ++ au_dtime_revert(a->src_dt + AuPARENT); ++ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) ++ au_dtime_revert(a->dst_dt + AuPARENT); ++ ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) && err != -EIO) { ++ h_d = a->src_dt[AuCHILD].dt_h_path.dentry; ++ h_inode = d_inode(h_d); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ au_dtime_revert(a->src_dt + AuCHILD); ++ inode_unlock(h_inode); ++ ++ if (au_ftest_ren(a->auren_flags, DT_DSTDIR)) { ++ h_d = a->dst_dt[AuCHILD].dt_h_path.dentry; ++ h_inode = d_inode(h_d); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ au_dtime_revert(a->dst_dt + AuCHILD); ++ inode_unlock(h_inode); ++ } ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int aufs_rename(struct inode *_src_dir, struct dentry *_src_dentry, ++ struct inode *_dst_dir, struct dentry *_dst_dentry, ++ unsigned int _flags) ++{ ++ int err, lock_flags; ++ void *rev; ++ /* reduce stack space */ ++ struct au_ren_args *a; ++ struct au_pin pin; ++ ++ AuDbg("%pd, %pd, 0x%x\n", _src_dentry, _dst_dentry, _flags); ++ IMustLock(_src_dir); ++ IMustLock(_dst_dir); ++ ++ err = -EINVAL; ++ if (unlikely(_flags & RENAME_WHITEOUT)) ++ goto out; ++ ++ err = -ENOMEM; ++ BUILD_BUG_ON(sizeof(*a) > PAGE_SIZE); ++ a = kzalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ a->flags = _flags; ++ BUILD_BUG_ON(sizeof(a->exchange) == sizeof(u8) ++ && RENAME_EXCHANGE > U8_MAX); ++ a->exchange = _flags & RENAME_EXCHANGE; ++ a->src_dir = _src_dir; ++ a->src_dentry = _src_dentry; ++ a->src_inode = NULL; ++ if (d_really_is_positive(a->src_dentry)) ++ a->src_inode = d_inode(a->src_dentry); ++ a->src_parent = a->src_dentry->d_parent; /* dir inode is locked */ ++ a->dst_dir = _dst_dir; ++ a->dst_dentry = _dst_dentry; ++ a->dst_inode = NULL; ++ if (d_really_is_positive(a->dst_dentry)) ++ a->dst_inode = d_inode(a->dst_dentry); ++ a->dst_parent = a->dst_dentry->d_parent; /* dir inode is locked */ ++ if (a->dst_inode) { ++ /* ++ * if EXCHANGE && src is non-dir && dst is dir, ++ * dst is not locked. ++ */ ++ /* IMustLock(a->dst_inode); */ ++ au_igrab(a->dst_inode); ++ } ++ ++ err = -ENOTDIR; ++ lock_flags = AuLock_FLUSH | AuLock_NOPLM | AuLock_GEN; ++ if (d_is_dir(a->src_dentry)) { ++ au_fset_ren(a->auren_flags, ISDIR_SRC); ++ if (unlikely(!a->exchange ++ && d_really_is_positive(a->dst_dentry) ++ && !d_is_dir(a->dst_dentry))) ++ goto out_free; ++ lock_flags |= AuLock_DIRS; ++ } ++ if (a->dst_inode && d_is_dir(a->dst_dentry)) { ++ au_fset_ren(a->auren_flags, ISDIR_DST); ++ if (unlikely(!a->exchange ++ && d_really_is_positive(a->src_dentry) ++ && !d_is_dir(a->src_dentry))) ++ goto out_free; ++ lock_flags |= AuLock_DIRS; ++ } ++ err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry, ++ lock_flags); ++ if (unlikely(err)) ++ goto out_free; ++ ++ err = au_d_hashed_positive(a->src_dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ err = -ENOENT; ++ if (a->dst_inode) { ++ /* ++ * If it is a dir, VFS unhash it before this ++ * function. It means we cannot rely upon d_unhashed(). ++ */ ++ if (unlikely(!a->dst_inode->i_nlink)) ++ goto out_unlock; ++ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) { ++ err = au_d_hashed_positive(a->dst_dentry); ++ if (unlikely(err && !a->exchange)) ++ goto out_unlock; ++ } else if (unlikely(IS_DEADDIR(a->dst_inode))) ++ goto out_unlock; ++ } else if (unlikely(d_unhashed(a->dst_dentry))) ++ goto out_unlock; ++ ++ /* ++ * is it possible? ++ * yes, it happened (in linux-3.3-rcN) but I don't know why. ++ * there may exist a problem somewhere else. ++ */ ++ err = -EINVAL; ++ if (unlikely(d_inode(a->dst_parent) == d_inode(a->src_dentry))) ++ goto out_unlock; ++ ++ au_fset_ren(a->auren_flags, ISSAMEDIR); /* temporary */ ++ di_write_lock_parent(a->dst_parent); ++ ++ /* which branch we process */ ++ err = au_ren_wbr(a); ++ if (unlikely(err < 0)) ++ goto out_parent; ++ a->br = au_sbr(a->dst_dentry->d_sb, a->btgt); ++ a->h_path.mnt = au_br_mnt(a->br); ++ ++ /* are they available to be renamed */ ++ err = au_ren_may_dir(a); ++ if (unlikely(err)) ++ goto out_children; ++ ++ /* prepare the writable parent dir on the same branch */ ++ if (a->dst_btop == a->btgt) { ++ au_fset_ren(a->auren_flags, WHDST); ++ } else { ++ err = au_cpup_dirs(a->dst_dentry, a->btgt); ++ if (unlikely(err)) ++ goto out_children; ++ } ++ ++ err = 0; ++ if (!a->exchange) { ++ if (a->src_dir != a->dst_dir) { ++ /* ++ * this temporary unlock is safe, ++ * because both dir->i_mutex are locked. ++ */ ++ di_write_unlock(a->dst_parent); ++ di_write_lock_parent(a->src_parent); ++ err = au_wr_dir_need_wh(a->src_dentry, ++ au_ftest_ren(a->auren_flags, ++ ISDIR_SRC), ++ &a->btgt); ++ di_write_unlock(a->src_parent); ++ di_write_lock2_parent(a->src_parent, a->dst_parent, ++ /*isdir*/1); ++ au_fclr_ren(a->auren_flags, ISSAMEDIR); ++ } else ++ err = au_wr_dir_need_wh(a->src_dentry, ++ au_ftest_ren(a->auren_flags, ++ ISDIR_SRC), ++ &a->btgt); ++ } ++ if (unlikely(err < 0)) ++ goto out_children; ++ if (err) ++ au_fset_ren(a->auren_flags, WHSRC); ++ ++ /* cpup src */ ++ if (a->src_btop != a->btgt) { ++ err = au_pin(&pin, a->src_dentry, a->btgt, ++ au_opt_udba(a->src_dentry->d_sb), ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (!err) { ++ struct au_cp_generic cpg = { ++ .dentry = a->src_dentry, ++ .bdst = a->btgt, ++ .bsrc = a->src_btop, ++ .len = -1, ++ .pin = &pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ AuDebugOn(au_dbtop(a->src_dentry) != a->src_btop); ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&pin); ++ } ++ if (unlikely(err)) ++ goto out_children; ++ a->src_btop = a->btgt; ++ a->src_h_dentry = au_h_dptr(a->src_dentry, a->btgt); ++ if (!a->exchange) ++ au_fset_ren(a->auren_flags, WHSRC); ++ } ++ ++ /* cpup dst */ ++ if (a->exchange && a->dst_inode ++ && a->dst_btop != a->btgt) { ++ err = au_pin(&pin, a->dst_dentry, a->btgt, ++ au_opt_udba(a->dst_dentry->d_sb), ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (!err) { ++ struct au_cp_generic cpg = { ++ .dentry = a->dst_dentry, ++ .bdst = a->btgt, ++ .bsrc = a->dst_btop, ++ .len = -1, ++ .pin = &pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&pin); ++ } ++ if (unlikely(err)) ++ goto out_children; ++ a->dst_btop = a->btgt; ++ a->dst_h_dentry = au_h_dptr(a->dst_dentry, a->btgt); ++ } ++ ++ /* lock them all */ ++ err = au_ren_lock(a); ++ if (unlikely(err)) ++ /* leave the copied-up one */ ++ goto out_children; ++ ++ if (!a->exchange) { ++ if (!au_opt_test(au_mntflags(a->dst_dir->i_sb), UDBA_NONE)) ++ err = au_may_ren(a); ++ else if (unlikely(a->dst_dentry->d_name.len > AUFS_MAX_NAMELEN)) ++ err = -ENAMETOOLONG; ++ if (unlikely(err)) ++ goto out_hdir; ++ } ++ ++ /* store timestamps to be revertible */ ++ au_ren_dt(a); ++ ++ /* store dirren info */ ++ if (au_ftest_ren(a->auren_flags, DIRREN)) { ++ err = au_dr_rename(a->src_dentry, a->btgt, ++ &a->dst_dentry->d_name, &rev); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out_dt; ++ } ++ ++ /* here we go */ ++ err = do_rename(a); ++ if (unlikely(err)) ++ goto out_dirren; ++ ++ if (au_ftest_ren(a->auren_flags, DIRREN)) ++ au_dr_rename_fin(a->src_dentry, a->btgt, rev); ++ ++ /* update dir attributes */ ++ au_ren_refresh_dir(a); ++ ++ /* dput/iput all lower dentries */ ++ au_ren_refresh(a); ++ ++ goto out_hdir; /* success */ ++ ++out_dirren: ++ if (au_ftest_ren(a->auren_flags, DIRREN)) ++ au_dr_rename_rev(a->src_dentry, a->btgt, rev); ++out_dt: ++ au_ren_rev_dt(err, a); ++out_hdir: ++ au_ren_unlock(a); ++out_children: ++ au_nhash_wh_free(&a->whlist); ++ if (err && a->dst_inode && a->dst_btop != a->btgt) { ++ AuDbg("btop %d, btgt %d\n", a->dst_btop, a->btgt); ++ au_set_h_dptr(a->dst_dentry, a->btgt, NULL); ++ au_set_dbtop(a->dst_dentry, a->dst_btop); ++ } ++out_parent: ++ if (!err) { ++ if (d_unhashed(a->src_dentry)) ++ au_fset_ren(a->auren_flags, DROPPED_SRC); ++ if (d_unhashed(a->dst_dentry)) ++ au_fset_ren(a->auren_flags, DROPPED_DST); ++ if (!a->exchange) ++ d_move(a->src_dentry, a->dst_dentry); ++ else { ++ d_exchange(a->src_dentry, a->dst_dentry); ++ if (au_ftest_ren(a->auren_flags, DROPPED_DST)) ++ d_drop(a->dst_dentry); ++ } ++ if (au_ftest_ren(a->auren_flags, DROPPED_SRC)) ++ d_drop(a->src_dentry); ++ } else { ++ au_update_dbtop(a->dst_dentry); ++ if (!a->dst_inode) ++ d_drop(a->dst_dentry); ++ } ++ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) ++ di_write_unlock(a->dst_parent); ++ else ++ di_write_unlock2(a->src_parent, a->dst_parent); ++out_unlock: ++ aufs_read_and_write_unlock2(a->dst_dentry, a->src_dentry); ++out_free: ++ iput(a->dst_inode); ++ if (a->thargs) ++ au_whtmp_rmdir_free(a->thargs); ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} +diff --git a/fs/aufs/iinfo.c b/fs/aufs/iinfo.c +new file mode 100644 +index 000000000000..f5c2bd14176e +--- /dev/null ++++ b/fs/aufs/iinfo.c +@@ -0,0 +1,273 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * inode private data ++ */ ++ ++#include "aufs.h" ++ ++struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex) ++{ ++ struct inode *h_inode; ++ struct au_hinode *hinode; ++ ++ IiMustAnyLock(inode); ++ ++ hinode = au_hinode(au_ii(inode), bindex); ++ h_inode = hinode->hi_inode; ++ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); ++ return h_inode; ++} ++ ++/* todo: hard/soft set? */ ++void au_hiput(struct au_hinode *hinode) ++{ ++ au_hn_free(hinode); ++ dput(hinode->hi_whdentry); ++ iput(hinode->hi_inode); ++} ++ ++unsigned int au_hi_flags(struct inode *inode, int isdir) ++{ ++ unsigned int flags; ++ const unsigned int mnt_flags = au_mntflags(inode->i_sb); ++ ++ flags = 0; ++ if (au_opt_test(mnt_flags, XINO)) ++ au_fset_hi(flags, XINO); ++ if (isdir && au_opt_test(mnt_flags, UDBA_HNOTIFY)) ++ au_fset_hi(flags, HNOTIFY); ++ return flags; ++} ++ ++void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, ++ struct inode *h_inode, unsigned int flags) ++{ ++ struct au_hinode *hinode; ++ struct inode *hi; ++ struct au_iinfo *iinfo = au_ii(inode); ++ ++ IiMustWriteLock(inode); ++ ++ hinode = au_hinode(iinfo, bindex); ++ hi = hinode->hi_inode; ++ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); ++ ++ if (hi) ++ au_hiput(hinode); ++ hinode->hi_inode = h_inode; ++ if (h_inode) { ++ int err; ++ struct super_block *sb = inode->i_sb; ++ struct au_branch *br; ++ ++ AuDebugOn(inode->i_mode ++ && (h_inode->i_mode & S_IFMT) ++ != (inode->i_mode & S_IFMT)); ++ if (bindex == iinfo->ii_btop) ++ au_cpup_igen(inode, h_inode); ++ br = au_sbr(sb, bindex); ++ hinode->hi_id = br->br_id; ++ if (au_ftest_hi(flags, XINO)) { ++ err = au_xino_write(sb, bindex, h_inode->i_ino, ++ inode->i_ino); ++ if (unlikely(err)) ++ AuIOErr1("failed au_xino_write() %d\n", err); ++ } ++ ++ if (au_ftest_hi(flags, HNOTIFY) ++ && au_br_hnotifyable(br->br_perm)) { ++ err = au_hn_alloc(hinode, inode); ++ if (unlikely(err)) ++ AuIOErr1("au_hn_alloc() %d\n", err); ++ } ++ } ++} ++ ++void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_wh) ++{ ++ struct au_hinode *hinode; ++ ++ IiMustWriteLock(inode); ++ ++ hinode = au_hinode(au_ii(inode), bindex); ++ AuDebugOn(hinode->hi_whdentry); ++ hinode->hi_whdentry = h_wh; ++} ++ ++void au_update_iigen(struct inode *inode, int half) ++{ ++ struct au_iinfo *iinfo; ++ struct au_iigen *iigen; ++ unsigned int sigen; ++ ++ sigen = au_sigen(inode->i_sb); ++ iinfo = au_ii(inode); ++ iigen = &iinfo->ii_generation; ++ spin_lock(&iigen->ig_spin); ++ iigen->ig_generation = sigen; ++ if (half) ++ au_ig_fset(iigen->ig_flags, HALF_REFRESHED); ++ else ++ au_ig_fclr(iigen->ig_flags, HALF_REFRESHED); ++ spin_unlock(&iigen->ig_spin); ++} ++ ++/* it may be called at remount time, too */ ++void au_update_ibrange(struct inode *inode, int do_put_zero) ++{ ++ struct au_iinfo *iinfo; ++ aufs_bindex_t bindex, bbot; ++ ++ AuDebugOn(au_is_bad_inode(inode)); ++ IiMustWriteLock(inode); ++ ++ iinfo = au_ii(inode); ++ if (do_put_zero && iinfo->ii_btop >= 0) { ++ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; ++ bindex++) { ++ struct inode *h_i; ++ ++ h_i = au_hinode(iinfo, bindex)->hi_inode; ++ if (h_i ++ && !h_i->i_nlink ++ && !(h_i->i_state & I_LINKABLE)) ++ au_set_h_iptr(inode, bindex, NULL, 0); ++ } ++ } ++ ++ iinfo->ii_btop = -1; ++ iinfo->ii_bbot = -1; ++ bbot = au_sbbot(inode->i_sb); ++ for (bindex = 0; bindex <= bbot; bindex++) ++ if (au_hinode(iinfo, bindex)->hi_inode) { ++ iinfo->ii_btop = bindex; ++ break; ++ } ++ if (iinfo->ii_btop >= 0) ++ for (bindex = bbot; bindex >= iinfo->ii_btop; bindex--) ++ if (au_hinode(iinfo, bindex)->hi_inode) { ++ iinfo->ii_bbot = bindex; ++ break; ++ } ++ AuDebugOn(iinfo->ii_btop > iinfo->ii_bbot); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_icntnr_init_once(void *_c) ++{ ++ struct au_icntnr *c = _c; ++ struct au_iinfo *iinfo = &c->iinfo; ++ ++ spin_lock_init(&iinfo->ii_generation.ig_spin); ++ au_rw_init(&iinfo->ii_rwsem); ++ inode_init_once(&c->vfs_inode); ++} ++ ++void au_hinode_init(struct au_hinode *hinode) ++{ ++ hinode->hi_inode = NULL; ++ hinode->hi_id = -1; ++ au_hn_init(hinode); ++ hinode->hi_whdentry = NULL; ++} ++ ++int au_iinfo_init(struct inode *inode) ++{ ++ struct au_iinfo *iinfo; ++ struct super_block *sb; ++ struct au_hinode *hi; ++ int nbr, i; ++ ++ sb = inode->i_sb; ++ iinfo = &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); ++ nbr = au_sbbot(sb) + 1; ++ if (unlikely(nbr <= 0)) ++ nbr = 1; ++ hi = kmalloc_array(nbr, sizeof(*iinfo->ii_hinode), GFP_NOFS); ++ if (hi) { ++ au_lcnt_inc(&au_sbi(sb)->si_ninodes); ++ ++ iinfo->ii_hinode = hi; ++ for (i = 0; i < nbr; i++, hi++) ++ au_hinode_init(hi); ++ ++ iinfo->ii_generation.ig_generation = au_sigen(sb); ++ iinfo->ii_btop = -1; ++ iinfo->ii_bbot = -1; ++ iinfo->ii_vdir = NULL; ++ return 0; ++ } ++ return -ENOMEM; ++} ++ ++int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink) ++{ ++ int err, i; ++ struct au_hinode *hip; ++ ++ AuRwMustWriteLock(&iinfo->ii_rwsem); ++ ++ err = -ENOMEM; ++ hip = au_krealloc(iinfo->ii_hinode, sizeof(*hip) * nbr, GFP_NOFS, ++ may_shrink); ++ if (hip) { ++ iinfo->ii_hinode = hip; ++ i = iinfo->ii_bbot + 1; ++ hip += i; ++ for (; i < nbr; i++, hip++) ++ au_hinode_init(hip); ++ err = 0; ++ } ++ ++ return err; ++} ++ ++void au_iinfo_fin(struct inode *inode) ++{ ++ struct au_iinfo *iinfo; ++ struct au_hinode *hi; ++ struct super_block *sb; ++ aufs_bindex_t bindex, bbot; ++ const unsigned char unlinked = !inode->i_nlink; ++ ++ AuDebugOn(au_is_bad_inode(inode)); ++ ++ sb = inode->i_sb; ++ au_lcnt_dec(&au_sbi(sb)->si_ninodes); ++ if (si_pid_test(sb)) ++ au_xino_delete_inode(inode, unlinked); ++ else { ++ /* ++ * it is safe to hide the dependency between sbinfo and ++ * sb->s_umount. ++ */ ++ lockdep_off(); ++ si_noflush_read_lock(sb); ++ au_xino_delete_inode(inode, unlinked); ++ si_read_unlock(sb); ++ lockdep_on(); ++ } ++ ++ iinfo = au_ii(inode); ++ if (iinfo->ii_vdir) ++ au_vdir_free(iinfo->ii_vdir); ++ ++ bindex = iinfo->ii_btop; ++ if (bindex >= 0) { ++ hi = au_hinode(iinfo, bindex); ++ bbot = iinfo->ii_bbot; ++ while (bindex++ <= bbot) { ++ if (hi->hi_inode) ++ au_hiput(hi); ++ hi++; ++ } ++ } ++ kfree(iinfo->ii_hinode); ++ AuRwDestroy(&iinfo->ii_rwsem); ++} +diff --git a/fs/aufs/inode.c b/fs/aufs/inode.c +new file mode 100644 +index 000000000000..a798a6a07fda +--- /dev/null ++++ b/fs/aufs/inode.c +@@ -0,0 +1,515 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * inode functions ++ */ ++ ++#include "aufs.h" ++ ++struct inode *au_igrab(struct inode *inode) ++{ ++ if (inode) { ++ AuDebugOn(!atomic_read(&inode->i_count)); ++ ihold(inode); ++ } ++ return inode; ++} ++ ++static void au_refresh_hinode_attr(struct inode *inode, int do_version) ++{ ++ au_cpup_attr_all(inode, /*force*/0); ++ au_update_iigen(inode, /*half*/1); ++ if (do_version) ++ inode_inc_iversion(inode); ++} ++ ++static int au_ii_refresh(struct inode *inode, int *update) ++{ ++ int err, e, nbr; ++ umode_t type; ++ aufs_bindex_t bindex, new_bindex; ++ struct super_block *sb; ++ struct au_iinfo *iinfo; ++ struct au_hinode *p, *q, tmp; ++ ++ AuDebugOn(au_is_bad_inode(inode)); ++ IiMustWriteLock(inode); ++ ++ *update = 0; ++ sb = inode->i_sb; ++ nbr = au_sbbot(sb) + 1; ++ type = inode->i_mode & S_IFMT; ++ iinfo = au_ii(inode); ++ err = au_hinode_realloc(iinfo, nbr, /*may_shrink*/0); ++ if (unlikely(err)) ++ goto out; ++ ++ AuDebugOn(iinfo->ii_btop < 0); ++ p = au_hinode(iinfo, iinfo->ii_btop); ++ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; ++ bindex++, p++) { ++ if (!p->hi_inode) ++ continue; ++ ++ AuDebugOn(type != (p->hi_inode->i_mode & S_IFMT)); ++ new_bindex = au_br_index(sb, p->hi_id); ++ if (new_bindex == bindex) ++ continue; ++ ++ if (new_bindex < 0) { ++ *update = 1; ++ au_hiput(p); ++ p->hi_inode = NULL; ++ continue; ++ } ++ ++ if (new_bindex < iinfo->ii_btop) ++ iinfo->ii_btop = new_bindex; ++ if (iinfo->ii_bbot < new_bindex) ++ iinfo->ii_bbot = new_bindex; ++ /* swap two lower inode, and loop again */ ++ q = au_hinode(iinfo, new_bindex); ++ tmp = *q; ++ *q = *p; ++ *p = tmp; ++ if (tmp.hi_inode) { ++ bindex--; ++ p--; ++ } ++ } ++ au_update_ibrange(inode, /*do_put_zero*/0); ++ au_hinode_realloc(iinfo, nbr, /*may_shrink*/1); /* harmless if err */ ++ e = au_dy_irefresh(inode); ++ if (unlikely(e && !err)) ++ err = e; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_refresh_iop(struct inode *inode, int force_getattr) ++{ ++ int type; ++ struct au_sbinfo *sbi = au_sbi(inode->i_sb); ++ const struct inode_operations *iop ++ = force_getattr ? aufs_iop : sbi->si_iop_array; ++ ++ if (inode->i_op == iop) ++ return; ++ ++ switch (inode->i_mode & S_IFMT) { ++ case S_IFDIR: ++ type = AuIop_DIR; ++ break; ++ case S_IFLNK: ++ type = AuIop_SYMLINK; ++ break; ++ default: ++ type = AuIop_OTHER; ++ break; ++ } ++ ++ inode->i_op = iop + type; ++ /* unnecessary smp_wmb() */ ++} ++ ++int au_refresh_hinode_self(struct inode *inode) ++{ ++ int err, update; ++ ++ err = au_ii_refresh(inode, &update); ++ if (!err) ++ au_refresh_hinode_attr(inode, update && S_ISDIR(inode->i_mode)); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_refresh_hinode(struct inode *inode, struct dentry *dentry) ++{ ++ int err, e, update; ++ unsigned int flags; ++ umode_t mode; ++ aufs_bindex_t bindex, bbot; ++ unsigned char isdir; ++ struct au_hinode *p; ++ struct au_iinfo *iinfo; ++ ++ err = au_ii_refresh(inode, &update); ++ if (unlikely(err)) ++ goto out; ++ ++ update = 0; ++ iinfo = au_ii(inode); ++ p = au_hinode(iinfo, iinfo->ii_btop); ++ mode = (inode->i_mode & S_IFMT); ++ isdir = S_ISDIR(mode); ++ flags = au_hi_flags(inode, isdir); ++ bbot = au_dbbot(dentry); ++ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { ++ struct inode *h_i, *h_inode; ++ struct dentry *h_d; ++ ++ h_d = au_h_dptr(dentry, bindex); ++ if (!h_d || d_is_negative(h_d)) ++ continue; ++ ++ h_inode = d_inode(h_d); ++ AuDebugOn(mode != (h_inode->i_mode & S_IFMT)); ++ if (iinfo->ii_btop <= bindex && bindex <= iinfo->ii_bbot) { ++ h_i = au_h_iptr(inode, bindex); ++ if (h_i) { ++ if (h_i == h_inode) ++ continue; ++ err = -EIO; ++ break; ++ } ++ } ++ if (bindex < iinfo->ii_btop) ++ iinfo->ii_btop = bindex; ++ if (iinfo->ii_bbot < bindex) ++ iinfo->ii_bbot = bindex; ++ au_set_h_iptr(inode, bindex, au_igrab(h_inode), flags); ++ update = 1; ++ } ++ au_update_ibrange(inode, /*do_put_zero*/0); ++ e = au_dy_irefresh(inode); ++ if (unlikely(e && !err)) ++ err = e; ++ if (!err) ++ au_refresh_hinode_attr(inode, update && isdir); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int set_inode(struct inode *inode, struct dentry *dentry) ++{ ++ int err; ++ unsigned int flags; ++ umode_t mode; ++ aufs_bindex_t bindex, btop, btail; ++ unsigned char isdir; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ struct au_iinfo *iinfo; ++ struct inode_operations *iop; ++ ++ IiMustWriteLock(inode); ++ ++ err = 0; ++ isdir = 0; ++ iop = au_sbi(inode->i_sb)->si_iop_array; ++ btop = au_dbtop(dentry); ++ h_dentry = au_h_dptr(dentry, btop); ++ h_inode = d_inode(h_dentry); ++ mode = h_inode->i_mode; ++ switch (mode & S_IFMT) { ++ case S_IFREG: ++ btail = au_dbtail(dentry); ++ inode->i_op = iop + AuIop_OTHER; ++ inode->i_fop = &aufs_file_fop; ++ err = au_dy_iaop(inode, btop, h_inode); ++ if (unlikely(err)) ++ goto out; ++ break; ++ case S_IFDIR: ++ isdir = 1; ++ btail = au_dbtaildir(dentry); ++ inode->i_op = iop + AuIop_DIR; ++ inode->i_fop = &aufs_dir_fop; ++ break; ++ case S_IFLNK: ++ btail = au_dbtail(dentry); ++ inode->i_op = iop + AuIop_SYMLINK; ++ break; ++ case S_IFBLK: ++ case S_IFCHR: ++ case S_IFIFO: ++ case S_IFSOCK: ++ btail = au_dbtail(dentry); ++ inode->i_op = iop + AuIop_OTHER; ++ init_special_inode(inode, mode, h_inode->i_rdev); ++ break; ++ default: ++ AuIOErr("Unknown file type 0%o\n", mode); ++ err = -EIO; ++ goto out; ++ } ++ ++ /* do not set hnotify for whiteouted dirs (SHWH mode) */ ++ flags = au_hi_flags(inode, isdir); ++ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH) ++ && au_ftest_hi(flags, HNOTIFY) ++ && dentry->d_name.len > AUFS_WH_PFX_LEN ++ && !memcmp(dentry->d_name.name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) ++ au_fclr_hi(flags, HNOTIFY); ++ iinfo = au_ii(inode); ++ iinfo->ii_btop = btop; ++ iinfo->ii_bbot = btail; ++ for (bindex = btop; bindex <= btail; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry) ++ au_set_h_iptr(inode, bindex, ++ au_igrab(d_inode(h_dentry)), flags); ++ } ++ au_cpup_attr_all(inode, /*force*/1); ++ /* ++ * to force calling aufs_get_acl() every time, ++ * do not call cache_no_acl() for aufs inode. ++ */ ++ ++out: ++ return err; ++} ++ ++/* ++ * successful returns with iinfo write_locked ++ * minus: errno ++ * zero: success, matched ++ * plus: no error, but unmatched ++ */ ++static int reval_inode(struct inode *inode, struct dentry *dentry) ++{ ++ int err; ++ unsigned int gen, igflags; ++ aufs_bindex_t bindex, bbot; ++ struct inode *h_inode, *h_dinode; ++ struct dentry *h_dentry; ++ ++ /* ++ * before this function, if aufs got any iinfo lock, it must be only ++ * one, the parent dir. ++ * it can happen by UDBA and the obsoleted inode number. ++ */ ++ err = -EIO; ++ if (unlikely(inode->i_ino == parent_ino(dentry))) ++ goto out; ++ ++ err = 1; ++ ii_write_lock_new_child(inode); ++ h_dentry = au_h_dptr(dentry, au_dbtop(dentry)); ++ h_dinode = d_inode(h_dentry); ++ bbot = au_ibbot(inode); ++ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { ++ h_inode = au_h_iptr(inode, bindex); ++ if (!h_inode || h_inode != h_dinode) ++ continue; ++ ++ err = 0; ++ gen = au_iigen(inode, &igflags); ++ if (gen == au_digen(dentry) ++ && !au_ig_ftest(igflags, HALF_REFRESHED)) ++ break; ++ ++ /* fully refresh inode using dentry */ ++ err = au_refresh_hinode(inode, dentry); ++ if (!err) ++ au_update_iigen(inode, /*half*/0); ++ break; ++ } ++ ++ if (unlikely(err)) ++ ii_write_unlock(inode); ++out: ++ return err; ++} ++ ++int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ unsigned int d_type, ino_t *ino) ++{ ++ int err, idx; ++ const int isnondir = d_type != DT_DIR; ++ ++ /* prevent hardlinked inode number from race condition */ ++ if (isnondir) { ++ err = au_xinondir_enter(sb, bindex, h_ino, &idx); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ err = au_xino_read(sb, bindex, h_ino, ino); ++ if (unlikely(err)) ++ goto out_xinondir; ++ ++ if (!*ino) { ++ err = -EIO; ++ *ino = au_xino_new_ino(sb); ++ if (unlikely(!*ino)) ++ goto out_xinondir; ++ err = au_xino_write(sb, bindex, h_ino, *ino); ++ if (unlikely(err)) ++ goto out_xinondir; ++ } ++ ++out_xinondir: ++ if (isnondir && idx >= 0) ++ au_xinondir_leave(sb, bindex, h_ino, idx); ++out: ++ return err; ++} ++ ++/* successful returns with iinfo write_locked */ ++/* todo: return with unlocked? */ ++struct inode *au_new_inode(struct dentry *dentry, int must_new) ++{ ++ struct inode *inode, *h_inode; ++ struct dentry *h_dentry; ++ struct super_block *sb; ++ ino_t h_ino, ino; ++ int err, idx, hlinked; ++ aufs_bindex_t btop; ++ ++ sb = dentry->d_sb; ++ btop = au_dbtop(dentry); ++ h_dentry = au_h_dptr(dentry, btop); ++ h_inode = d_inode(h_dentry); ++ h_ino = h_inode->i_ino; ++ hlinked = !d_is_dir(h_dentry) && h_inode->i_nlink > 1; ++ ++new_ino: ++ /* ++ * stop 'race'-ing between hardlinks under different ++ * parents. ++ */ ++ if (hlinked) { ++ err = au_xinondir_enter(sb, btop, h_ino, &idx); ++ inode = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ err = au_xino_read(sb, btop, h_ino, &ino); ++ inode = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_xinondir; ++ ++ if (!ino) { ++ ino = au_xino_new_ino(sb); ++ if (unlikely(!ino)) { ++ inode = ERR_PTR(-EIO); ++ goto out_xinondir; ++ } ++ } ++ ++ AuDbg("i%lu\n", (unsigned long)ino); ++ inode = au_iget_locked(sb, ino); ++ err = PTR_ERR(inode); ++ if (IS_ERR(inode)) ++ goto out_xinondir; ++ ++ AuDbg("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW)); ++ if (inode->i_state & I_NEW) { ++ ii_write_lock_new_child(inode); ++ err = set_inode(inode, dentry); ++ if (!err) { ++ unlock_new_inode(inode); ++ goto out_xinondir; /* success */ ++ } ++ ++ /* ++ * iget_failed() calls iput(), but we need to call ++ * ii_write_unlock() after iget_failed(). so dirty hack for ++ * i_count. ++ */ ++ atomic_inc(&inode->i_count); ++ iget_failed(inode); ++ ii_write_unlock(inode); ++ au_xino_write(sb, btop, h_ino, /*ino*/0); ++ /* ignore this error */ ++ goto out_iput; ++ } else if (!must_new && !IS_DEADDIR(inode) && inode->i_nlink) { ++ /* ++ * horrible race condition between lookup, readdir and copyup ++ * (or something). ++ */ ++ if (hlinked && idx >= 0) ++ au_xinondir_leave(sb, btop, h_ino, idx); ++ err = reval_inode(inode, dentry); ++ if (unlikely(err < 0)) { ++ hlinked = 0; ++ goto out_iput; ++ } ++ if (!err) ++ goto out; /* success */ ++ else if (hlinked && idx >= 0) { ++ err = au_xinondir_enter(sb, btop, h_ino, &idx); ++ if (unlikely(err)) { ++ iput(inode); ++ inode = ERR_PTR(err); ++ goto out; ++ } ++ } ++ } ++ ++ if (unlikely(au_test_fs_unique_ino(h_inode))) ++ AuWarn1("Warning: Un-notified UDBA or repeatedly renamed dir," ++ " b%d, %s, %pd, hi%lu, i%lu.\n", ++ btop, au_sbtype(h_dentry->d_sb), dentry, ++ (unsigned long)h_ino, (unsigned long)ino); ++ ino = 0; ++ err = au_xino_write(sb, btop, h_ino, /*ino*/0); ++ if (!err) { ++ iput(inode); ++ if (hlinked && idx >= 0) ++ au_xinondir_leave(sb, btop, h_ino, idx); ++ goto new_ino; ++ } ++ ++out_iput: ++ iput(inode); ++ inode = ERR_PTR(err); ++out_xinondir: ++ if (hlinked && idx >= 0) ++ au_xinondir_leave(sb, btop, h_ino, idx); ++out: ++ return inode; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, ++ struct inode *inode) ++{ ++ int err; ++ struct inode *hi; ++ ++ err = au_br_rdonly(au_sbr(sb, bindex)); ++ ++ /* pseudo-link after flushed may happen out of bounds */ ++ if (!err ++ && inode ++ && au_ibtop(inode) <= bindex ++ && bindex <= au_ibbot(inode)) { ++ /* ++ * permission check is unnecessary since vfsub routine ++ * will be called later ++ */ ++ hi = au_h_iptr(inode, bindex); ++ if (hi) ++ err = IS_IMMUTABLE(hi) ? -EROFS : 0; ++ } ++ ++ return err; ++} ++ ++int au_test_h_perm(struct inode *h_inode, int mask) ++{ ++ if (uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) ++ return 0; ++ return inode_permission(h_inode, mask); ++} ++ ++int au_test_h_perm_sio(struct inode *h_inode, int mask) ++{ ++ if (au_test_nfs(h_inode->i_sb) ++ && (mask & MAY_WRITE) ++ && S_ISDIR(h_inode->i_mode)) ++ mask |= MAY_READ; /* force permission check */ ++ return au_test_h_perm(h_inode, mask); ++} +diff --git a/fs/aufs/inode.h b/fs/aufs/inode.h +new file mode 100644 +index 000000000000..b6dca8988666 +--- /dev/null ++++ b/fs/aufs/inode.h +@@ -0,0 +1,683 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * inode operations ++ */ ++ ++#ifndef __AUFS_INODE_H__ ++#define __AUFS_INODE_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include "rwsem.h" ++ ++struct vfsmount; ++ ++struct au_hnotify { ++#ifdef CONFIG_AUFS_HNOTIFY ++#ifdef CONFIG_AUFS_HFSNOTIFY ++ /* never use fsnotify_add_vfsmount_mark() */ ++ struct fsnotify_mark hn_mark; ++#endif ++ struct inode *hn_aufs_inode; /* no get/put */ ++#endif ++} ____cacheline_aligned_in_smp; ++ ++struct au_hinode { ++ struct inode *hi_inode; ++ aufs_bindex_t hi_id; ++#ifdef CONFIG_AUFS_HNOTIFY ++ struct au_hnotify *hi_notify; ++#endif ++ ++ /* reference to the copied-up whiteout with get/put */ ++ struct dentry *hi_whdentry; ++}; ++ ++/* ig_flags */ ++#define AuIG_HALF_REFRESHED 1 ++#define au_ig_ftest(flags, name) ((flags) & AuIG_##name) ++#define au_ig_fset(flags, name) \ ++ do { (flags) |= AuIG_##name; } while (0) ++#define au_ig_fclr(flags, name) \ ++ do { (flags) &= ~AuIG_##name; } while (0) ++ ++struct au_iigen { ++ spinlock_t ig_spin; ++ __u32 ig_generation, ig_flags; ++}; ++ ++struct au_vdir; ++struct au_iinfo { ++ struct au_iigen ii_generation; ++ struct super_block *ii_hsb1; /* no get/put */ ++ ++ struct au_rwsem ii_rwsem; ++ aufs_bindex_t ii_btop, ii_bbot; ++ __u32 ii_higen; ++ struct au_hinode *ii_hinode; ++ struct au_vdir *ii_vdir; ++}; ++ ++struct au_icntnr { ++ struct au_iinfo iinfo; ++ struct inode vfs_inode; ++ struct hlist_bl_node plink; ++} ____cacheline_aligned_in_smp; ++ ++/* au_pin flags */ ++#define AuPin_DI_LOCKED 1 ++#define AuPin_MNT_WRITE (1 << 1) ++#define au_ftest_pin(flags, name) ((flags) & AuPin_##name) ++#define au_fset_pin(flags, name) \ ++ do { (flags) |= AuPin_##name; } while (0) ++#define au_fclr_pin(flags, name) \ ++ do { (flags) &= ~AuPin_##name; } while (0) ++ ++struct au_pin { ++ /* input */ ++ struct dentry *dentry; ++ unsigned int udba; ++ unsigned char lsc_di, lsc_hi, flags; ++ aufs_bindex_t bindex; ++ ++ /* output */ ++ struct dentry *parent; ++ struct au_hinode *hdir; ++ struct vfsmount *h_mnt; ++ ++ /* temporary unlock/relock for copyup */ ++ struct dentry *h_dentry, *h_parent; ++ struct au_branch *br; ++ struct task_struct *task; ++}; ++ ++void au_pin_hdir_unlock(struct au_pin *p); ++int au_pin_hdir_lock(struct au_pin *p); ++int au_pin_hdir_relock(struct au_pin *p); ++void au_pin_hdir_acquire_nest(struct au_pin *p); ++void au_pin_hdir_release(struct au_pin *p); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_iinfo *au_ii(struct inode *inode) ++{ ++ BUG_ON(is_bad_inode(inode)); ++ return &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* inode.c */ ++struct inode *au_igrab(struct inode *inode); ++void au_refresh_iop(struct inode *inode, int force_getattr); ++int au_refresh_hinode_self(struct inode *inode); ++int au_refresh_hinode(struct inode *inode, struct dentry *dentry); ++int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ unsigned int d_type, ino_t *ino); ++struct inode *au_new_inode(struct dentry *dentry, int must_new); ++int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, ++ struct inode *inode); ++int au_test_h_perm(struct inode *h_inode, int mask); ++int au_test_h_perm_sio(struct inode *h_inode, int mask); ++ ++static inline int au_wh_ino(struct super_block *sb, aufs_bindex_t bindex, ++ ino_t h_ino, unsigned int d_type, ino_t *ino) ++{ ++#ifdef CONFIG_AUFS_SHWH ++ return au_ino(sb, bindex, h_ino, d_type, ino); ++#else ++ return 0; ++#endif ++} ++ ++/* i_op.c */ ++enum { ++ AuIop_SYMLINK, ++ AuIop_DIR, ++ AuIop_OTHER, ++ AuIop_Last ++}; ++extern struct inode_operations aufs_iop[AuIop_Last], ++ aufs_iop_nogetattr[AuIop_Last]; ++ ++/* au_wr_dir flags */ ++#define AuWrDir_ADD_ENTRY 1 ++#define AuWrDir_ISDIR (1 << 1) ++#define AuWrDir_TMPFILE (1 << 2) ++#define au_ftest_wrdir(flags, name) ((flags) & AuWrDir_##name) ++#define au_fset_wrdir(flags, name) \ ++ do { (flags) |= AuWrDir_##name; } while (0) ++#define au_fclr_wrdir(flags, name) \ ++ do { (flags) &= ~AuWrDir_##name; } while (0) ++ ++struct au_wr_dir_args { ++ aufs_bindex_t force_btgt; ++ unsigned char flags; ++}; ++int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, ++ struct au_wr_dir_args *args); ++ ++struct dentry *au_pinned_h_parent(struct au_pin *pin); ++void au_pin_init(struct au_pin *pin, struct dentry *dentry, ++ aufs_bindex_t bindex, int lsc_di, int lsc_hi, ++ unsigned int udba, unsigned char flags); ++int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int udba, unsigned char flags) __must_check; ++int au_do_pin(struct au_pin *pin) __must_check; ++void au_unpin(struct au_pin *pin); ++int au_reval_for_attr(struct dentry *dentry, unsigned int sigen); ++ ++#define AuIcpup_DID_CPUP 1 ++#define au_ftest_icpup(flags, name) ((flags) & AuIcpup_##name) ++#define au_fset_icpup(flags, name) \ ++ do { (flags) |= AuIcpup_##name; } while (0) ++#define au_fclr_icpup(flags, name) \ ++ do { (flags) &= ~AuIcpup_##name; } while (0) ++ ++struct au_icpup_args { ++ unsigned char flags; ++ unsigned char pin_flags; ++ aufs_bindex_t btgt; ++ unsigned int udba; ++ struct au_pin pin; ++ struct path h_path; ++ struct inode *h_inode; ++}; ++ ++int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, ++ struct au_icpup_args *a); ++ ++int au_h_path_getattr(struct dentry *dentry, int force, struct path *h_path, ++ int locked); ++ ++/* i_op_add.c */ ++int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent, int isdir); ++int aufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, ++ dev_t dev); ++int aufs_symlink(struct inode *dir, struct dentry *dentry, const char *symname); ++int aufs_create(struct inode *dir, struct dentry *dentry, umode_t mode, ++ bool want_excl); ++struct vfsub_aopen_args; ++int au_aopen_or_create(struct inode *dir, struct dentry *dentry, ++ struct vfsub_aopen_args *args); ++int aufs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode); ++int aufs_link(struct dentry *src_dentry, struct inode *dir, ++ struct dentry *dentry); ++int aufs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode); ++ ++/* i_op_del.c */ ++int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup); ++int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent, int isdir); ++int aufs_unlink(struct inode *dir, struct dentry *dentry); ++int aufs_rmdir(struct inode *dir, struct dentry *dentry); ++ ++/* i_op_ren.c */ ++int au_wbr(struct dentry *dentry, aufs_bindex_t btgt); ++int aufs_rename(struct inode *src_dir, struct dentry *src_dentry, ++ struct inode *dir, struct dentry *dentry, ++ unsigned int flags); ++ ++/* iinfo.c */ ++struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex); ++void au_hiput(struct au_hinode *hinode); ++void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_wh); ++unsigned int au_hi_flags(struct inode *inode, int isdir); ++ ++/* hinode flags */ ++#define AuHi_XINO 1 ++#define AuHi_HNOTIFY (1 << 1) ++#define au_ftest_hi(flags, name) ((flags) & AuHi_##name) ++#define au_fset_hi(flags, name) \ ++ do { (flags) |= AuHi_##name; } while (0) ++#define au_fclr_hi(flags, name) \ ++ do { (flags) &= ~AuHi_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_HNOTIFY ++#undef AuHi_HNOTIFY ++#define AuHi_HNOTIFY 0 ++#endif ++ ++void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, ++ struct inode *h_inode, unsigned int flags); ++ ++void au_update_iigen(struct inode *inode, int half); ++void au_update_ibrange(struct inode *inode, int do_put_zero); ++ ++void au_icntnr_init_once(void *_c); ++void au_hinode_init(struct au_hinode *hinode); ++int au_iinfo_init(struct inode *inode); ++void au_iinfo_fin(struct inode *inode); ++int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink); ++ ++#ifdef CONFIG_PROC_FS ++/* plink.c */ ++int au_plink_maint(struct super_block *sb, int flags); ++struct au_sbinfo; ++void au_plink_maint_leave(struct au_sbinfo *sbinfo); ++int au_plink_maint_enter(struct super_block *sb); ++#ifdef CONFIG_AUFS_DEBUG ++void au_plink_list(struct super_block *sb); ++#else ++AuStubVoid(au_plink_list, struct super_block *sb) ++#endif ++int au_plink_test(struct inode *inode); ++struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex); ++void au_plink_append(struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_dentry); ++void au_plink_put(struct super_block *sb, int verbose); ++void au_plink_clean(struct super_block *sb, int verbose); ++void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id); ++#else ++AuStubInt0(au_plink_maint, struct super_block *sb, int flags); ++AuStubVoid(au_plink_maint_leave, struct au_sbinfo *sbinfo); ++AuStubInt0(au_plink_maint_enter, struct super_block *sb); ++AuStubVoid(au_plink_list, struct super_block *sb); ++AuStubInt0(au_plink_test, struct inode *inode); ++AuStub(struct dentry *, au_plink_lkup, return NULL, ++ struct inode *inode, aufs_bindex_t bindex); ++AuStubVoid(au_plink_append, struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_dentry); ++AuStubVoid(au_plink_put, struct super_block *sb, int verbose); ++AuStubVoid(au_plink_clean, struct super_block *sb, int verbose); ++AuStubVoid(au_plink_half_refresh, struct super_block *sb, aufs_bindex_t br_id); ++#endif /* CONFIG_PROC_FS */ ++ ++#ifdef CONFIG_AUFS_XATTR ++/* xattr.c */ ++int au_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, int ignore_flags, ++ unsigned int verbose); ++ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size); ++void au_xattr_init(struct super_block *sb); ++#else ++AuStubInt0(au_cpup_xattr, struct dentry *h_dst, struct dentry *h_src, ++ int ignore_flags, unsigned int verbose); ++AuStubVoid(au_xattr_init, struct super_block *sb); ++#endif ++ ++#ifdef CONFIG_FS_POSIX_ACL ++struct posix_acl *aufs_get_acl(struct inode *inode, int type); ++int aufs_set_acl(struct inode *inode, struct posix_acl *acl, int type); ++#endif ++ ++#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) ++enum { ++ AU_XATTR_SET, ++ AU_ACL_SET ++}; ++ ++struct au_sxattr { ++ int type; ++ union { ++ struct { ++ const char *name; ++ const void *value; ++ size_t size; ++ int flags; ++ } set; ++ struct { ++ struct posix_acl *acl; ++ int type; ++ } acl_set; ++ } u; ++}; ++ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, ++ struct au_sxattr *arg); ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* lock subclass for iinfo */ ++enum { ++ AuLsc_II_CHILD, /* child first */ ++ AuLsc_II_CHILD2, /* rename(2), link(2), and cpup at hnotify */ ++ AuLsc_II_CHILD3, /* copyup dirs */ ++ AuLsc_II_PARENT, /* see AuLsc_I_PARENT in vfsub.h */ ++ AuLsc_II_PARENT2, ++ AuLsc_II_PARENT3, /* copyup dirs */ ++ AuLsc_II_NEW_CHILD ++}; ++ ++/* ++ * ii_read_lock_child, ii_write_lock_child, ++ * ii_read_lock_child2, ii_write_lock_child2, ++ * ii_read_lock_child3, ii_write_lock_child3, ++ * ii_read_lock_parent, ii_write_lock_parent, ++ * ii_read_lock_parent2, ii_write_lock_parent2, ++ * ii_read_lock_parent3, ii_write_lock_parent3, ++ * ii_read_lock_new_child, ii_write_lock_new_child, ++ */ ++#define AuReadLockFunc(name, lsc) \ ++static inline void ii_read_lock_##name(struct inode *i) \ ++{ \ ++ au_rw_read_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ ++} ++ ++#define AuWriteLockFunc(name, lsc) \ ++static inline void ii_write_lock_##name(struct inode *i) \ ++{ \ ++ au_rw_write_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ ++} ++ ++#define AuRWLockFuncs(name, lsc) \ ++ AuReadLockFunc(name, lsc) \ ++ AuWriteLockFunc(name, lsc) ++ ++AuRWLockFuncs(child, CHILD); ++AuRWLockFuncs(child2, CHILD2); ++AuRWLockFuncs(child3, CHILD3); ++AuRWLockFuncs(parent, PARENT); ++AuRWLockFuncs(parent2, PARENT2); ++AuRWLockFuncs(parent3, PARENT3); ++AuRWLockFuncs(new_child, NEW_CHILD); ++ ++#undef AuReadLockFunc ++#undef AuWriteLockFunc ++#undef AuRWLockFuncs ++ ++#define ii_read_unlock(i) au_rw_read_unlock(&au_ii(i)->ii_rwsem) ++#define ii_write_unlock(i) au_rw_write_unlock(&au_ii(i)->ii_rwsem) ++#define ii_downgrade_lock(i) au_rw_dgrade_lock(&au_ii(i)->ii_rwsem) ++ ++#define IiMustNoWaiters(i) AuRwMustNoWaiters(&au_ii(i)->ii_rwsem) ++#define IiMustAnyLock(i) AuRwMustAnyLock(&au_ii(i)->ii_rwsem) ++#define IiMustWriteLock(i) AuRwMustWriteLock(&au_ii(i)->ii_rwsem) ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline void au_icntnr_init(struct au_icntnr *c) ++{ ++#ifdef CONFIG_AUFS_DEBUG ++ c->vfs_inode.i_mode = 0; ++#endif ++} ++ ++static inline unsigned int au_iigen(struct inode *inode, unsigned int *igflags) ++{ ++ unsigned int gen; ++ struct au_iinfo *iinfo; ++ struct au_iigen *iigen; ++ ++ iinfo = au_ii(inode); ++ iigen = &iinfo->ii_generation; ++ spin_lock(&iigen->ig_spin); ++ if (igflags) ++ *igflags = iigen->ig_flags; ++ gen = iigen->ig_generation; ++ spin_unlock(&iigen->ig_spin); ++ ++ return gen; ++} ++ ++/* tiny test for inode number */ ++/* tmpfs generation is too rough */ ++static inline int au_test_higen(struct inode *inode, struct inode *h_inode) ++{ ++ struct au_iinfo *iinfo; ++ ++ iinfo = au_ii(inode); ++ AuRwMustAnyLock(&iinfo->ii_rwsem); ++ return !(iinfo->ii_hsb1 == h_inode->i_sb ++ && iinfo->ii_higen == h_inode->i_generation); ++} ++ ++static inline void au_iigen_dec(struct inode *inode) ++{ ++ struct au_iinfo *iinfo; ++ struct au_iigen *iigen; ++ ++ iinfo = au_ii(inode); ++ iigen = &iinfo->ii_generation; ++ spin_lock(&iigen->ig_spin); ++ iigen->ig_generation--; ++ spin_unlock(&iigen->ig_spin); ++} ++ ++static inline int au_iigen_test(struct inode *inode, unsigned int sigen) ++{ ++ int err; ++ ++ err = 0; ++ if (unlikely(inode && au_iigen(inode, NULL) != sigen)) ++ err = -EIO; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_hinode *au_hinode(struct au_iinfo *iinfo, ++ aufs_bindex_t bindex) ++{ ++ return iinfo->ii_hinode + bindex; ++} ++ ++static inline int au_is_bad_inode(struct inode *inode) ++{ ++ return !!(is_bad_inode(inode) || !au_hinode(au_ii(inode), 0)); ++} ++ ++static inline aufs_bindex_t au_ii_br_id(struct inode *inode, ++ aufs_bindex_t bindex) ++{ ++ IiMustAnyLock(inode); ++ return au_hinode(au_ii(inode), bindex)->hi_id; ++} ++ ++static inline aufs_bindex_t au_ibtop(struct inode *inode) ++{ ++ IiMustAnyLock(inode); ++ return au_ii(inode)->ii_btop; ++} ++ ++static inline aufs_bindex_t au_ibbot(struct inode *inode) ++{ ++ IiMustAnyLock(inode); ++ return au_ii(inode)->ii_bbot; ++} ++ ++static inline struct au_vdir *au_ivdir(struct inode *inode) ++{ ++ IiMustAnyLock(inode); ++ return au_ii(inode)->ii_vdir; ++} ++ ++static inline struct dentry *au_hi_wh(struct inode *inode, aufs_bindex_t bindex) ++{ ++ IiMustAnyLock(inode); ++ return au_hinode(au_ii(inode), bindex)->hi_whdentry; ++} ++ ++static inline void au_set_ibtop(struct inode *inode, aufs_bindex_t bindex) ++{ ++ IiMustWriteLock(inode); ++ au_ii(inode)->ii_btop = bindex; ++} ++ ++static inline void au_set_ibbot(struct inode *inode, aufs_bindex_t bindex) ++{ ++ IiMustWriteLock(inode); ++ au_ii(inode)->ii_bbot = bindex; ++} ++ ++static inline void au_set_ivdir(struct inode *inode, struct au_vdir *vdir) ++{ ++ IiMustWriteLock(inode); ++ au_ii(inode)->ii_vdir = vdir; ++} ++ ++static inline struct au_hinode *au_hi(struct inode *inode, aufs_bindex_t bindex) ++{ ++ IiMustAnyLock(inode); ++ return au_hinode(au_ii(inode), bindex); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct dentry *au_pinned_parent(struct au_pin *pin) ++{ ++ if (pin) ++ return pin->parent; ++ return NULL; ++} ++ ++static inline struct inode *au_pinned_h_dir(struct au_pin *pin) ++{ ++ if (pin && pin->hdir) ++ return pin->hdir->hi_inode; ++ return NULL; ++} ++ ++static inline struct au_hinode *au_pinned_hdir(struct au_pin *pin) ++{ ++ if (pin) ++ return pin->hdir; ++ return NULL; ++} ++ ++static inline void au_pin_set_dentry(struct au_pin *pin, struct dentry *dentry) ++{ ++ if (pin) ++ pin->dentry = dentry; ++} ++ ++static inline void au_pin_set_parent_lflag(struct au_pin *pin, ++ unsigned char lflag) ++{ ++ if (pin) { ++ if (lflag) ++ au_fset_pin(pin->flags, DI_LOCKED); ++ else ++ au_fclr_pin(pin->flags, DI_LOCKED); ++ } ++} ++ ++#if 0 /* reserved */ ++static inline void au_pin_set_parent(struct au_pin *pin, struct dentry *parent) ++{ ++ if (pin) { ++ dput(pin->parent); ++ pin->parent = dget(parent); ++ } ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_branch; ++#ifdef CONFIG_AUFS_HNOTIFY ++struct au_hnotify_op { ++ void (*ctl)(struct au_hinode *hinode, int do_set); ++ int (*alloc)(struct au_hinode *hinode); ++ ++ /* ++ * if it returns true, the the caller should free hinode->hi_notify, ++ * otherwise ->free() frees it. ++ */ ++ int (*free)(struct au_hinode *hinode, ++ struct au_hnotify *hn) __must_check; ++ ++ void (*fin)(void); ++ int (*init)(void); ++ ++ int (*reset_br)(unsigned int udba, struct au_branch *br, int perm); ++ void (*fin_br)(struct au_branch *br); ++ int (*init_br)(struct au_branch *br, int perm); ++}; ++ ++/* hnotify.c */ ++int au_hn_alloc(struct au_hinode *hinode, struct inode *inode); ++void au_hn_free(struct au_hinode *hinode); ++void au_hn_ctl(struct au_hinode *hinode, int do_set); ++void au_hn_reset(struct inode *inode, unsigned int flags); ++int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, ++ struct qstr *h_child_qstr, struct inode *h_child_inode); ++int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm); ++int au_hnotify_init_br(struct au_branch *br, int perm); ++void au_hnotify_fin_br(struct au_branch *br); ++int __init au_hnotify_init(void); ++void au_hnotify_fin(void); ++ ++/* hfsnotify.c */ ++extern const struct au_hnotify_op au_hnotify_op; ++ ++static inline ++void au_hn_init(struct au_hinode *hinode) ++{ ++ hinode->hi_notify = NULL; ++} ++ ++static inline struct au_hnotify *au_hn(struct au_hinode *hinode) ++{ ++ return hinode->hi_notify; ++} ++ ++#else ++AuStub(int, au_hn_alloc, return -EOPNOTSUPP, ++ struct au_hinode *hinode __maybe_unused, ++ struct inode *inode __maybe_unused) ++AuStub(struct au_hnotify *, au_hn, return NULL, struct au_hinode *hinode) ++AuStubVoid(au_hn_free, struct au_hinode *hinode __maybe_unused) ++AuStubVoid(au_hn_ctl, struct au_hinode *hinode __maybe_unused, ++ int do_set __maybe_unused) ++AuStubVoid(au_hn_reset, struct inode *inode __maybe_unused, ++ unsigned int flags __maybe_unused) ++AuStubInt0(au_hnotify_reset_br, unsigned int udba __maybe_unused, ++ struct au_branch *br __maybe_unused, ++ int perm __maybe_unused) ++AuStubInt0(au_hnotify_init_br, struct au_branch *br __maybe_unused, ++ int perm __maybe_unused) ++AuStubVoid(au_hnotify_fin_br, struct au_branch *br __maybe_unused) ++AuStubInt0(__init au_hnotify_init, void) ++AuStubVoid(au_hnotify_fin, void) ++AuStubVoid(au_hn_init, struct au_hinode *hinode __maybe_unused) ++#endif /* CONFIG_AUFS_HNOTIFY */ ++ ++static inline void au_hn_suspend(struct au_hinode *hdir) ++{ ++ au_hn_ctl(hdir, /*do_set*/0); ++} ++ ++static inline void au_hn_resume(struct au_hinode *hdir) ++{ ++ au_hn_ctl(hdir, /*do_set*/1); ++} ++ ++static inline void au_hn_inode_lock(struct au_hinode *hdir) ++{ ++ inode_lock(hdir->hi_inode); ++ au_hn_suspend(hdir); ++} ++ ++static inline void au_hn_inode_lock_nested(struct au_hinode *hdir, ++ unsigned int sc __maybe_unused) ++{ ++ inode_lock_nested(hdir->hi_inode, sc); ++ au_hn_suspend(hdir); ++} ++ ++#if 0 /* unused */ ++#include "vfsub.h" ++static inline void au_hn_inode_lock_shared_nested(struct au_hinode *hdir, ++ unsigned int sc) ++{ ++ inode_lock_shared_nested(hdir->hi_inode, sc); ++ au_hn_suspend(hdir); ++} ++#endif ++ ++static inline void au_hn_inode_unlock(struct au_hinode *hdir) ++{ ++ au_hn_resume(hdir); ++ inode_unlock(hdir->hi_inode); ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_INODE_H__ */ +diff --git a/fs/aufs/ioctl.c b/fs/aufs/ioctl.c +new file mode 100644 +index 000000000000..194db41dc9d9 +--- /dev/null ++++ b/fs/aufs/ioctl.c +@@ -0,0 +1,207 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * ioctl ++ * plink-management and readdir in userspace. ++ * assist the pathconf(3) wrapper library. ++ * move-down ++ * File-based Hierarchical Storage Management. ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++static int au_wbr_fd(struct path *path, struct aufs_wbr_fd __user *arg) ++{ ++ int err, fd; ++ aufs_bindex_t wbi, bindex, bbot; ++ struct file *h_file; ++ struct super_block *sb; ++ struct dentry *root; ++ struct au_branch *br; ++ struct aufs_wbr_fd wbrfd = { ++ .oflags = au_dir_roflags, ++ .brid = -1 ++ }; ++ const int valid = O_RDONLY | O_NONBLOCK | O_LARGEFILE | O_DIRECTORY ++ | O_NOATIME | O_CLOEXEC; ++ ++ AuDebugOn(wbrfd.oflags & ~valid); ++ ++ if (arg) { ++ err = copy_from_user(&wbrfd, arg, sizeof(wbrfd)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ goto out; ++ } ++ ++ err = -EINVAL; ++ AuDbg("wbrfd{0%o, %d}\n", wbrfd.oflags, wbrfd.brid); ++ wbrfd.oflags |= au_dir_roflags; ++ AuDbg("0%o\n", wbrfd.oflags); ++ if (unlikely(wbrfd.oflags & ~valid)) ++ goto out; ++ } ++ ++ fd = get_unused_fd_flags(0); ++ err = fd; ++ if (unlikely(fd < 0)) ++ goto out; ++ ++ h_file = ERR_PTR(-EINVAL); ++ wbi = 0; ++ br = NULL; ++ sb = path->dentry->d_sb; ++ root = sb->s_root; ++ aufs_read_lock(root, AuLock_IR); ++ bbot = au_sbbot(sb); ++ if (wbrfd.brid >= 0) { ++ wbi = au_br_index(sb, wbrfd.brid); ++ if (unlikely(wbi < 0 || wbi > bbot)) ++ goto out_unlock; ++ } ++ ++ h_file = ERR_PTR(-ENOENT); ++ br = au_sbr(sb, wbi); ++ if (!au_br_writable(br->br_perm)) { ++ if (arg) ++ goto out_unlock; ++ ++ bindex = wbi + 1; ++ wbi = -1; ++ for (; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_writable(br->br_perm)) { ++ wbi = bindex; ++ br = au_sbr(sb, wbi); ++ break; ++ } ++ } ++ } ++ AuDbg("wbi %d\n", wbi); ++ if (wbi >= 0) ++ h_file = au_h_open(root, wbi, wbrfd.oflags, NULL, ++ /*force_wr*/0); ++ ++out_unlock: ++ aufs_read_unlock(root, AuLock_IR); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out_fd; ++ ++ au_lcnt_dec(&br->br_nfiles); /* cf. au_h_open() */ ++ fd_install(fd, h_file); ++ err = fd; ++ goto out; /* success */ ++ ++out_fd: ++ put_unused_fd(fd); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long err; ++ struct dentry *dentry; ++ ++ switch (cmd) { ++ case AUFS_CTL_RDU: ++ case AUFS_CTL_RDU_INO: ++ err = au_rdu_ioctl(file, cmd, arg); ++ break; ++ ++ case AUFS_CTL_WBR_FD: ++ err = au_wbr_fd(&file->f_path, (void __user *)arg); ++ break; ++ ++ case AUFS_CTL_IBUSY: ++ err = au_ibusy_ioctl(file, arg); ++ break; ++ ++ case AUFS_CTL_BRINFO: ++ err = au_brinfo_ioctl(file, arg); ++ break; ++ ++ case AUFS_CTL_FHSM_FD: ++ dentry = file->f_path.dentry; ++ if (IS_ROOT(dentry)) ++ err = au_fhsm_fd(dentry->d_sb, arg); ++ else ++ err = -ENOTTY; ++ break; ++ ++ default: ++ /* do not call the lower */ ++ AuDbg("0x%x\n", cmd); ++ err = -ENOTTY; ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long err; ++ ++ switch (cmd) { ++ case AUFS_CTL_MVDOWN: ++ err = au_mvdown(file->f_path.dentry, (void __user *)arg); ++ break; ++ ++ case AUFS_CTL_WBR_FD: ++ err = au_wbr_fd(&file->f_path, (void __user *)arg); ++ break; ++ ++ default: ++ /* do not call the lower */ ++ AuDbg("0x%x\n", cmd); ++ err = -ENOTTY; ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++#ifdef CONFIG_COMPAT ++long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, ++ unsigned long arg) ++{ ++ long err; ++ ++ switch (cmd) { ++ case AUFS_CTL_RDU: ++ case AUFS_CTL_RDU_INO: ++ err = au_rdu_compat_ioctl(file, cmd, arg); ++ break; ++ ++ case AUFS_CTL_IBUSY: ++ err = au_ibusy_compat_ioctl(file, arg); ++ break; ++ ++ case AUFS_CTL_BRINFO: ++ err = au_brinfo_compat_ioctl(file, arg); ++ break; ++ ++ default: ++ err = aufs_ioctl_dir(file, cmd, arg); ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, ++ unsigned long arg) ++{ ++ return aufs_ioctl_nondir(file, cmd, (unsigned long)compat_ptr(arg)); ++} ++#endif +diff --git a/fs/aufs/lcnt.h b/fs/aufs/lcnt.h +new file mode 100644 +index 000000000000..7fb1697b2f54 +--- /dev/null ++++ b/fs/aufs/lcnt.h +@@ -0,0 +1,173 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * simple long counter wrapper ++ */ ++ ++#ifndef __AUFS_LCNT_H__ ++#define __AUFS_LCNT_H__ ++ ++#ifdef __KERNEL__ ++ ++#include "debug.h" ++ ++#define AuLCntATOMIC 1 ++#define AuLCntPCPUCNT 2 ++/* ++ * why does percpu_refcount require extra synchronize_rcu()s in ++ * au_br_do_free() ++ */ ++#define AuLCntPCPUREF 3 ++ ++/* #define AuLCntChosen AuLCntATOMIC */ ++#define AuLCntChosen AuLCntPCPUCNT ++/* #define AuLCntChosen AuLCntPCPUREF */ ++ ++#if AuLCntChosen == AuLCntATOMIC ++#include ++ ++typedef atomic_long_t au_lcnt_t; ++ ++static inline int au_lcnt_init(au_lcnt_t *cnt, void *release __maybe_unused) ++{ ++ atomic_long_set(cnt, 0); ++ return 0; ++} ++ ++static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) ++{ ++ /* empty */ ++} ++ ++static inline void au_lcnt_fin(au_lcnt_t *cnt __maybe_unused, ++ int do_sync __maybe_unused) ++{ ++ /* empty */ ++} ++ ++static inline void au_lcnt_inc(au_lcnt_t *cnt) ++{ ++ atomic_long_inc(cnt); ++} ++ ++static inline void au_lcnt_dec(au_lcnt_t *cnt) ++{ ++ atomic_long_dec(cnt); ++} ++ ++static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev __maybe_unused) ++{ ++ return atomic_long_read(cnt); ++} ++#endif ++ ++#if AuLCntChosen == AuLCntPCPUCNT ++#include ++ ++typedef struct percpu_counter au_lcnt_t; ++ ++static inline int au_lcnt_init(au_lcnt_t *cnt, void *release __maybe_unused) ++{ ++ return percpu_counter_init(cnt, 0, GFP_NOFS); ++} ++ ++static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) ++{ ++ /* empty */ ++} ++ ++static inline void au_lcnt_fin(au_lcnt_t *cnt, int do_sync __maybe_unused) ++{ ++ percpu_counter_destroy(cnt); ++} ++ ++static inline void au_lcnt_inc(au_lcnt_t *cnt) ++{ ++ percpu_counter_inc(cnt); ++} ++ ++static inline void au_lcnt_dec(au_lcnt_t *cnt) ++{ ++ percpu_counter_dec(cnt); ++} ++ ++static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev __maybe_unused) ++{ ++ s64 n; ++ ++ n = percpu_counter_sum(cnt); ++ BUG_ON(n < 0); ++ if (LONG_MAX != LLONG_MAX ++ && n > LONG_MAX) ++ AuWarn1("%s\n", "wrap-around"); ++ ++ return n; ++} ++#endif ++ ++#if AuLCntChosen == AuLCntPCPUREF ++#include ++ ++typedef struct percpu_ref au_lcnt_t; ++ ++static inline int au_lcnt_init(au_lcnt_t *cnt, percpu_ref_func_t *release) ++{ ++ if (!release) ++ release = percpu_ref_exit; ++ return percpu_ref_init(cnt, release, /*percpu mode*/0, GFP_NOFS); ++} ++ ++static inline void au_lcnt_wait_for_fin(au_lcnt_t *cnt __maybe_unused) ++{ ++ synchronize_rcu(); ++} ++ ++static inline void au_lcnt_fin(au_lcnt_t *cnt, int do_sync) ++{ ++ percpu_ref_kill(cnt); ++ if (do_sync) ++ au_lcnt_wait_for_fin(cnt); ++} ++ ++static inline void au_lcnt_inc(au_lcnt_t *cnt) ++{ ++ percpu_ref_get(cnt); ++} ++ ++static inline void au_lcnt_dec(au_lcnt_t *cnt) ++{ ++ percpu_ref_put(cnt); ++} ++ ++/* ++ * avoid calling this func as possible. ++ */ ++static inline long au_lcnt_read(au_lcnt_t *cnt, int do_rev) ++{ ++ long l; ++ ++ percpu_ref_switch_to_atomic_sync(cnt); ++ l = atomic_long_read(&cnt->count); ++ if (do_rev) ++ percpu_ref_switch_to_percpu(cnt); ++ ++ /* percpu_ref is initialized by 1 instead of 0 */ ++ return l - 1; ++} ++#endif ++ ++#ifdef CONFIG_AUFS_DEBUG ++#define AuLCntZero(val) do { \ ++ long l = val; \ ++ if (l) \ ++ AuDbg("%s = %ld\n", #val, l); \ ++} while (0) ++#else ++#define AuLCntZero(val) do {} while (0) ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_LCNT_H__ */ +diff --git a/fs/aufs/loop.c b/fs/aufs/loop.c +new file mode 100644 +index 000000000000..3d8434975ca4 +--- /dev/null ++++ b/fs/aufs/loop.c +@@ -0,0 +1,135 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * support for loopback block device as a branch ++ */ ++ ++#include "aufs.h" ++ ++/* added into drivers/block/loop.c */ ++static struct file *(*backing_file_func)(struct super_block *sb); ++ ++/* ++ * test if two lower dentries have overlapping branches. ++ */ ++int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding) ++{ ++ struct super_block *h_sb; ++ struct file *backing_file; ++ ++ if (unlikely(!backing_file_func)) { ++ /* don't load "loop" module here */ ++ backing_file_func = symbol_get(loop_backing_file); ++ if (unlikely(!backing_file_func)) ++ /* "loop" module is not loaded */ ++ return 0; ++ } ++ ++ h_sb = h_adding->d_sb; ++ backing_file = backing_file_func(h_sb); ++ if (!backing_file) ++ return 0; ++ ++ h_adding = backing_file->f_path.dentry; ++ /* ++ * h_adding can be local NFS. ++ * in this case aufs cannot detect the loop. ++ */ ++ if (unlikely(h_adding->d_sb == sb)) ++ return 1; ++ return !!au_test_subdir(h_adding, sb->s_root); ++} ++ ++/* true if a kernel thread named 'loop[0-9].*' accesses a file */ ++int au_test_loopback_kthread(void) ++{ ++ int ret; ++ struct task_struct *tsk = current; ++ char c, comm[sizeof(tsk->comm)]; ++ ++ ret = 0; ++ if (tsk->flags & PF_KTHREAD) { ++ get_task_comm(comm, tsk); ++ c = comm[4]; ++ ret = ('0' <= c && c <= '9' ++ && !strncmp(comm, "loop", 4)); ++ } ++ ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define au_warn_loopback_step 16 ++static int au_warn_loopback_nelem = au_warn_loopback_step; ++static unsigned long *au_warn_loopback_array; ++ ++void au_warn_loopback(struct super_block *h_sb) ++{ ++ int i, new_nelem; ++ unsigned long *a, magic; ++ static DEFINE_SPINLOCK(spin); ++ ++ magic = h_sb->s_magic; ++ spin_lock(&spin); ++ a = au_warn_loopback_array; ++ for (i = 0; i < au_warn_loopback_nelem && *a; i++) ++ if (a[i] == magic) { ++ spin_unlock(&spin); ++ return; ++ } ++ ++ /* h_sb is new to us, print it */ ++ if (i < au_warn_loopback_nelem) { ++ a[i] = magic; ++ goto pr; ++ } ++ ++ /* expand the array */ ++ new_nelem = au_warn_loopback_nelem + au_warn_loopback_step; ++ a = au_kzrealloc(au_warn_loopback_array, ++ au_warn_loopback_nelem * sizeof(unsigned long), ++ new_nelem * sizeof(unsigned long), GFP_ATOMIC, ++ /*may_shrink*/0); ++ if (a) { ++ au_warn_loopback_nelem = new_nelem; ++ au_warn_loopback_array = a; ++ a[i] = magic; ++ goto pr; ++ } ++ ++ spin_unlock(&spin); ++ AuWarn1("realloc failed, ignored\n"); ++ return; ++ ++pr: ++ spin_unlock(&spin); ++ pr_warn("you may want to try another patch for loopback file " ++ "on %s(0x%lx) branch\n", au_sbtype(h_sb), magic); ++} ++ ++int au_loopback_init(void) ++{ ++ int err; ++ struct super_block *sb __maybe_unused; ++ ++ BUILD_BUG_ON(sizeof(sb->s_magic) != sizeof(unsigned long)); ++ ++ err = 0; ++ au_warn_loopback_array = kcalloc(au_warn_loopback_step, ++ sizeof(unsigned long), GFP_NOFS); ++ if (unlikely(!au_warn_loopback_array)) ++ err = -ENOMEM; ++ ++ return err; ++} ++ ++void au_loopback_fin(void) ++{ ++ if (backing_file_func) ++ symbol_put(loop_backing_file); ++ kfree(au_warn_loopback_array); ++} +diff --git a/fs/aufs/loop.h b/fs/aufs/loop.h +new file mode 100644 +index 000000000000..05d703ddf190 +--- /dev/null ++++ b/fs/aufs/loop.h +@@ -0,0 +1,40 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * support for loopback mount as a branch ++ */ ++ ++#ifndef __AUFS_LOOP_H__ ++#define __AUFS_LOOP_H__ ++ ++#ifdef __KERNEL__ ++ ++struct dentry; ++struct super_block; ++ ++#ifdef CONFIG_AUFS_BDEV_LOOP ++/* drivers/block/loop.c */ ++struct file *loop_backing_file(struct super_block *sb); ++ ++/* loop.c */ ++int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding); ++int au_test_loopback_kthread(void); ++void au_warn_loopback(struct super_block *h_sb); ++ ++int au_loopback_init(void); ++void au_loopback_fin(void); ++#else ++AuStubInt0(au_test_loopback_overlap, struct super_block *sb, ++ struct dentry *h_adding) ++AuStubInt0(au_test_loopback_kthread, void) ++AuStubVoid(au_warn_loopback, struct super_block *h_sb) ++ ++AuStubInt0(au_loopback_init, void) ++AuStubVoid(au_loopback_fin, void) ++#endif /* BLK_DEV_LOOP */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_LOOP_H__ */ +diff --git a/fs/aufs/magic.mk b/fs/aufs/magic.mk +new file mode 100644 +index 000000000000..7bc9eef3ffec +--- /dev/null ++++ b/fs/aufs/magic.mk +@@ -0,0 +1,31 @@ ++# SPDX-License-Identifier: GPL-2.0 ++ ++# defined in ${srctree}/fs/fuse/inode.c ++# tristate ++ifdef CONFIG_FUSE_FS ++ccflags-y += -DFUSE_SUPER_MAGIC=0x65735546 ++endif ++ ++# defined in ${srctree}/fs/xfs/xfs_sb.h ++# tristate ++ifdef CONFIG_XFS_FS ++ccflags-y += -DXFS_SB_MAGIC=0x58465342 ++endif ++ ++# defined in ${srctree}/fs/configfs/mount.c ++# tristate ++ifdef CONFIG_CONFIGFS_FS ++ccflags-y += -DCONFIGFS_MAGIC=0x62656570 ++endif ++ ++# defined in ${srctree}/fs/ubifs/ubifs.h ++# tristate ++ifdef CONFIG_UBIFS_FS ++ccflags-y += -DUBIFS_SUPER_MAGIC=0x24051905 ++endif ++ ++# defined in ${srctree}/fs/hfsplus/hfsplus_raw.h ++# tristate ++ifdef CONFIG_HFSPLUS_FS ++ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b ++endif +diff --git a/fs/aufs/module.c b/fs/aufs/module.c +new file mode 100644 +index 000000000000..59a119d834c7 +--- /dev/null ++++ b/fs/aufs/module.c +@@ -0,0 +1,259 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * module global variables and operations ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++/* shrinkable realloc */ ++void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink) ++{ ++ size_t sz; ++ int diff; ++ ++ sz = 0; ++ diff = -1; ++ if (p) { ++#if 0 /* unused */ ++ if (!new_sz) { ++ kfree(p); ++ p = NULL; ++ goto out; ++ } ++#else ++ AuDebugOn(!new_sz); ++#endif ++ sz = ksize(p); ++ diff = au_kmidx_sub(sz, new_sz); ++ } ++ if (sz && !diff) ++ goto out; ++ ++ if (sz < new_sz) ++ /* expand or SLOB */ ++ p = krealloc(p, new_sz, gfp); ++ else if (new_sz < sz && may_shrink) { ++ /* shrink */ ++ void *q; ++ ++ q = kmalloc(new_sz, gfp); ++ if (q) { ++ if (p) { ++ memcpy(q, p, new_sz); ++ kfree(p); ++ } ++ p = q; ++ } else ++ p = NULL; ++ } ++ ++out: ++ return p; ++} ++ ++void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, ++ int may_shrink) ++{ ++ p = au_krealloc(p, new_sz, gfp, may_shrink); ++ if (p && new_sz > nused) ++ memset(p + nused, 0, new_sz - nused); ++ return p; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * aufs caches ++ */ ++struct kmem_cache *au_cache[AuCache_Last]; ++ ++static void au_cache_fin(void) ++{ ++ int i; ++ ++ /* ++ * Make sure all delayed rcu free inodes are flushed before we ++ * destroy cache. ++ */ ++ rcu_barrier(); ++ ++ /* excluding AuCache_HNOTIFY */ ++ BUILD_BUG_ON(AuCache_HNOTIFY + 1 != AuCache_Last); ++ for (i = 0; i < AuCache_HNOTIFY; i++) { ++ kmem_cache_destroy(au_cache[i]); ++ au_cache[i] = NULL; ++ } ++} ++ ++static int __init au_cache_init(void) ++{ ++ au_cache[AuCache_DINFO] = AuCacheCtor(au_dinfo, au_di_init_once); ++ if (au_cache[AuCache_DINFO]) ++ /* SLAB_DESTROY_BY_RCU */ ++ au_cache[AuCache_ICNTNR] = AuCacheCtor(au_icntnr, ++ au_icntnr_init_once); ++ if (au_cache[AuCache_ICNTNR]) ++ au_cache[AuCache_FINFO] = AuCacheCtor(au_finfo, ++ au_fi_init_once); ++ if (au_cache[AuCache_FINFO]) ++ au_cache[AuCache_VDIR] = AuCache(au_vdir); ++ if (au_cache[AuCache_VDIR]) ++ au_cache[AuCache_DEHSTR] = AuCache(au_vdir_dehstr); ++ if (au_cache[AuCache_DEHSTR]) ++ return 0; ++ ++ au_cache_fin(); ++ return -ENOMEM; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_dir_roflags; ++ ++#ifdef CONFIG_AUFS_SBILIST ++/* ++ * iterate_supers_type() doesn't protect us from ++ * remounting (branch management) ++ */ ++struct hlist_bl_head au_sbilist; ++#endif ++ ++/* ++ * functions for module interface. ++ */ ++MODULE_LICENSE("GPL"); ++/* MODULE_LICENSE("GPL v2"); */ ++MODULE_AUTHOR("Junjiro R. Okajima "); ++MODULE_DESCRIPTION(AUFS_NAME ++ " -- Advanced multi layered unification filesystem"); ++MODULE_VERSION(AUFS_VERSION); ++ ++/* this module parameter has no meaning when SYSFS is disabled */ ++int sysaufs_brs = 1; ++MODULE_PARM_DESC(brs, "use /fs/aufs/si_*/brN"); ++module_param_named(brs, sysaufs_brs, int, 0444); ++ ++/* this module parameter has no meaning when USER_NS is disabled */ ++bool au_userns; ++MODULE_PARM_DESC(allow_userns, "allow unprivileged to mount under userns"); ++module_param_named(allow_userns, au_userns, bool, 0444); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static char au_esc_chars[0x20 + 3]; /* 0x01-0x20, backslash, del, and NULL */ ++ ++int au_seq_path(struct seq_file *seq, struct path *path) ++{ ++ int err; ++ ++ err = seq_path(seq, path, au_esc_chars); ++ if (err >= 0) ++ err = 0; ++ else ++ err = -ENOMEM; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int __init aufs_init(void) ++{ ++ int err, i; ++ char *p; ++ ++ p = au_esc_chars; ++ for (i = 1; i <= ' '; i++) ++ *p++ = i; ++ *p++ = '\\'; ++ *p++ = '\x7f'; ++ *p = 0; ++ ++ au_dir_roflags = au_file_roflags(O_DIRECTORY | O_LARGEFILE); ++ ++ memcpy(aufs_iop_nogetattr, aufs_iop, sizeof(aufs_iop)); ++ for (i = 0; i < AuIop_Last; i++) ++ aufs_iop_nogetattr[i].getattr = NULL; ++ ++ memset(au_cache, 0, sizeof(au_cache)); /* including hnotify */ ++ ++ au_sbilist_init(); ++ sysaufs_brs_init(); ++ au_debug_init(); ++ au_dy_init(); ++ err = sysaufs_init(); ++ if (unlikely(err)) ++ goto out; ++ err = dbgaufs_init(); ++ if (unlikely(err)) ++ goto out_sysaufs; ++ err = au_procfs_init(); ++ if (unlikely(err)) ++ goto out_dbgaufs; ++ err = au_wkq_init(); ++ if (unlikely(err)) ++ goto out_procfs; ++ err = au_loopback_init(); ++ if (unlikely(err)) ++ goto out_wkq; ++ err = au_hnotify_init(); ++ if (unlikely(err)) ++ goto out_loopback; ++ err = au_sysrq_init(); ++ if (unlikely(err)) ++ goto out_hin; ++ err = au_cache_init(); ++ if (unlikely(err)) ++ goto out_sysrq; ++ ++ aufs_fs_type.fs_flags |= au_userns ? FS_USERNS_MOUNT : 0; ++ err = register_filesystem(&aufs_fs_type); ++ if (unlikely(err)) ++ goto out_cache; ++ ++ /* since we define pr_fmt, call printk directly */ ++ printk(KERN_INFO AUFS_NAME " " AUFS_VERSION "\n"); ++ goto out; /* success */ ++ ++out_cache: ++ au_cache_fin(); ++out_sysrq: ++ au_sysrq_fin(); ++out_hin: ++ au_hnotify_fin(); ++out_loopback: ++ au_loopback_fin(); ++out_wkq: ++ au_wkq_fin(); ++out_procfs: ++ au_procfs_fin(); ++out_dbgaufs: ++ dbgaufs_fin(); ++out_sysaufs: ++ sysaufs_fin(); ++ au_dy_fin(); ++out: ++ return err; ++} ++ ++static void __exit aufs_exit(void) ++{ ++ unregister_filesystem(&aufs_fs_type); ++ au_cache_fin(); ++ au_sysrq_fin(); ++ au_hnotify_fin(); ++ au_loopback_fin(); ++ au_wkq_fin(); ++ au_procfs_fin(); ++ dbgaufs_fin(); ++ sysaufs_fin(); ++ au_dy_fin(); ++} ++ ++module_init(aufs_init); ++module_exit(aufs_exit); +diff --git a/fs/aufs/module.h b/fs/aufs/module.h +new file mode 100644 +index 000000000000..f5cb96b8d5e2 +--- /dev/null ++++ b/fs/aufs/module.h +@@ -0,0 +1,89 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * module initialization and module-global ++ */ ++ ++#ifndef __AUFS_MODULE_H__ ++#define __AUFS_MODULE_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++struct path; ++struct seq_file; ++ ++/* module parameters */ ++extern int sysaufs_brs; ++extern bool au_userns; ++ ++/* ---------------------------------------------------------------------- */ ++ ++extern int au_dir_roflags; ++ ++void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink); ++void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, ++ int may_shrink); ++ ++static inline int au_kmidx_sub(size_t sz, size_t new_sz) ++{ ++#ifndef CONFIG_SLOB ++ return kmalloc_index(sz) - kmalloc_index(new_sz); ++#else ++ return -1; /* SLOB is untested */ ++#endif ++} ++ ++int au_seq_path(struct seq_file *seq, struct path *path); ++ ++#ifdef CONFIG_PROC_FS ++/* procfs.c */ ++int __init au_procfs_init(void); ++void au_procfs_fin(void); ++#else ++AuStubInt0(au_procfs_init, void); ++AuStubVoid(au_procfs_fin, void); ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* kmem cache */ ++enum { ++ AuCache_DINFO, ++ AuCache_ICNTNR, ++ AuCache_FINFO, ++ AuCache_VDIR, ++ AuCache_DEHSTR, ++ AuCache_HNOTIFY, /* must be last */ ++ AuCache_Last ++}; ++ ++extern struct kmem_cache *au_cache[AuCache_Last]; ++ ++#define AuCacheFlags (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD) ++#define AuCache(type) KMEM_CACHE(type, AuCacheFlags) ++#define AuCacheCtor(type, ctor) \ ++ kmem_cache_create(#type, sizeof(struct type), \ ++ __alignof__(struct type), AuCacheFlags, ctor) ++ ++#define AuCacheFuncs(name, index) \ ++static inline struct au_##name *au_cache_alloc_##name(void) \ ++{ return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } \ ++static inline void au_cache_free_##name(struct au_##name *p) \ ++{ kmem_cache_free(au_cache[AuCache_##index], p); } ++ ++AuCacheFuncs(dinfo, DINFO); ++AuCacheFuncs(icntnr, ICNTNR); ++AuCacheFuncs(finfo, FINFO); ++AuCacheFuncs(vdir, VDIR); ++AuCacheFuncs(vdir_dehstr, DEHSTR); ++#ifdef CONFIG_AUFS_HNOTIFY ++AuCacheFuncs(hnotify, HNOTIFY); ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_MODULE_H__ */ +diff --git a/fs/aufs/mvdown.c b/fs/aufs/mvdown.c +new file mode 100644 +index 000000000000..583681ead8ce +--- /dev/null ++++ b/fs/aufs/mvdown.c +@@ -0,0 +1,692 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2011-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * move-down, opposite of copy-up ++ */ ++ ++#include "aufs.h" ++ ++struct au_mvd_args { ++ struct { ++ struct super_block *h_sb; ++ struct dentry *h_parent; ++ struct au_hinode *hdir; ++ struct inode *h_dir, *h_inode; ++ struct au_pin pin; ++ } info[AUFS_MVDOWN_NARRAY]; ++ ++ struct aufs_mvdown mvdown; ++ struct dentry *dentry, *parent; ++ struct inode *inode, *dir; ++ struct super_block *sb; ++ aufs_bindex_t bopq, bwh, bfound; ++ unsigned char rename_lock; ++}; ++ ++#define mvd_errno mvdown.au_errno ++#define mvd_bsrc mvdown.stbr[AUFS_MVDOWN_UPPER].bindex ++#define mvd_src_brid mvdown.stbr[AUFS_MVDOWN_UPPER].brid ++#define mvd_bdst mvdown.stbr[AUFS_MVDOWN_LOWER].bindex ++#define mvd_dst_brid mvdown.stbr[AUFS_MVDOWN_LOWER].brid ++ ++#define mvd_h_src_sb info[AUFS_MVDOWN_UPPER].h_sb ++#define mvd_h_src_parent info[AUFS_MVDOWN_UPPER].h_parent ++#define mvd_hdir_src info[AUFS_MVDOWN_UPPER].hdir ++#define mvd_h_src_dir info[AUFS_MVDOWN_UPPER].h_dir ++#define mvd_h_src_inode info[AUFS_MVDOWN_UPPER].h_inode ++#define mvd_pin_src info[AUFS_MVDOWN_UPPER].pin ++ ++#define mvd_h_dst_sb info[AUFS_MVDOWN_LOWER].h_sb ++#define mvd_h_dst_parent info[AUFS_MVDOWN_LOWER].h_parent ++#define mvd_hdir_dst info[AUFS_MVDOWN_LOWER].hdir ++#define mvd_h_dst_dir info[AUFS_MVDOWN_LOWER].h_dir ++#define mvd_h_dst_inode info[AUFS_MVDOWN_LOWER].h_inode ++#define mvd_pin_dst info[AUFS_MVDOWN_LOWER].pin ++ ++#define AU_MVD_PR(flag, ...) do { \ ++ if (flag) \ ++ pr_err(__VA_ARGS__); \ ++ } while (0) ++ ++static int find_lower_writable(struct au_mvd_args *a) ++{ ++ struct super_block *sb; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ sb = a->sb; ++ bindex = a->mvd_bsrc; ++ bbot = au_sbbot(sb); ++ if (a->mvdown.flags & AUFS_MVDOWN_FHSM_LOWER) ++ for (bindex++; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_fhsm(br->br_perm) ++ && !sb_rdonly(au_br_sb(br))) ++ return bindex; ++ } ++ else if (!(a->mvdown.flags & AUFS_MVDOWN_ROLOWER)) ++ for (bindex++; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!au_br_rdonly(br)) ++ return bindex; ++ } ++ else ++ for (bindex++; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!sb_rdonly(au_br_sb(br))) { ++ if (au_br_rdonly(br)) ++ a->mvdown.flags ++ |= AUFS_MVDOWN_ROLOWER_R; ++ return bindex; ++ } ++ } ++ ++ return -1; ++} ++ ++/* make the parent dir on bdst */ ++static int au_do_mkdir(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ ++ err = 0; ++ a->mvd_hdir_src = au_hi(a->dir, a->mvd_bsrc); ++ a->mvd_hdir_dst = au_hi(a->dir, a->mvd_bdst); ++ a->mvd_h_src_parent = au_h_dptr(a->parent, a->mvd_bsrc); ++ a->mvd_h_dst_parent = NULL; ++ if (au_dbbot(a->parent) >= a->mvd_bdst) ++ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); ++ if (!a->mvd_h_dst_parent) { ++ err = au_cpdown_dirs(a->dentry, a->mvd_bdst); ++ if (unlikely(err)) { ++ AU_MVD_PR(dmsg, "cpdown_dirs failed\n"); ++ goto out; ++ } ++ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* lock them all */ ++static int au_do_lock(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct dentry *h_trap; ++ ++ a->mvd_h_src_sb = au_sbr_sb(a->sb, a->mvd_bsrc); ++ a->mvd_h_dst_sb = au_sbr_sb(a->sb, a->mvd_bdst); ++ err = au_pin(&a->mvd_pin_dst, a->dentry, a->mvd_bdst, ++ au_opt_udba(a->sb), ++ AuPin_MNT_WRITE | AuPin_DI_LOCKED); ++ AuTraceErr(err); ++ if (unlikely(err)) { ++ AU_MVD_PR(dmsg, "pin_dst failed\n"); ++ goto out; ++ } ++ ++ if (a->mvd_h_src_sb != a->mvd_h_dst_sb) { ++ a->rename_lock = 0; ++ au_pin_init(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, ++ AuLsc_DI_PARENT, AuLsc_I_PARENT3, ++ au_opt_udba(a->sb), ++ AuPin_MNT_WRITE | AuPin_DI_LOCKED); ++ err = au_do_pin(&a->mvd_pin_src); ++ AuTraceErr(err); ++ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); ++ if (unlikely(err)) { ++ AU_MVD_PR(dmsg, "pin_src failed\n"); ++ goto out_dst; ++ } ++ goto out; /* success */ ++ } ++ ++ a->rename_lock = 1; ++ au_pin_hdir_unlock(&a->mvd_pin_dst); ++ err = au_pin(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, ++ au_opt_udba(a->sb), ++ AuPin_MNT_WRITE | AuPin_DI_LOCKED); ++ AuTraceErr(err); ++ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); ++ if (unlikely(err)) { ++ AU_MVD_PR(dmsg, "pin_src failed\n"); ++ au_pin_hdir_lock(&a->mvd_pin_dst); ++ goto out_dst; ++ } ++ au_pin_hdir_unlock(&a->mvd_pin_src); ++ h_trap = vfsub_lock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, ++ a->mvd_h_dst_parent, a->mvd_hdir_dst); ++ if (h_trap) { ++ err = (h_trap != a->mvd_h_src_parent); ++ if (err) ++ err = (h_trap != a->mvd_h_dst_parent); ++ } ++ BUG_ON(err); /* it should never happen */ ++ if (unlikely(a->mvd_h_src_dir != au_pinned_h_dir(&a->mvd_pin_src))) { ++ err = -EBUSY; ++ AuTraceErr(err); ++ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, ++ a->mvd_h_dst_parent, a->mvd_hdir_dst); ++ au_pin_hdir_lock(&a->mvd_pin_src); ++ au_unpin(&a->mvd_pin_src); ++ au_pin_hdir_lock(&a->mvd_pin_dst); ++ goto out_dst; ++ } ++ goto out; /* success */ ++ ++out_dst: ++ au_unpin(&a->mvd_pin_dst); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static void au_do_unlock(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ if (!a->rename_lock) ++ au_unpin(&a->mvd_pin_src); ++ else { ++ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, ++ a->mvd_h_dst_parent, a->mvd_hdir_dst); ++ au_pin_hdir_lock(&a->mvd_pin_src); ++ au_unpin(&a->mvd_pin_src); ++ au_pin_hdir_lock(&a->mvd_pin_dst); ++ } ++ au_unpin(&a->mvd_pin_dst); ++} ++ ++/* copy-down the file */ ++static int au_do_cpdown(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct au_cp_generic cpg = { ++ .dentry = a->dentry, ++ .bdst = a->mvd_bdst, ++ .bsrc = a->mvd_bsrc, ++ .len = -1, ++ .pin = &a->mvd_pin_dst, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ ++ AuDbg("b%d, b%d\n", cpg.bsrc, cpg.bdst); ++ if (a->mvdown.flags & AUFS_MVDOWN_OWLOWER) ++ au_fset_cpup(cpg.flags, OVERWRITE); ++ if (a->mvdown.flags & AUFS_MVDOWN_ROLOWER) ++ au_fset_cpup(cpg.flags, RWDST); ++ err = au_sio_cpdown_simple(&cpg); ++ if (unlikely(err)) ++ AU_MVD_PR(dmsg, "cpdown failed\n"); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * unlink the whiteout on bdst if exist which may be created by UDBA while we ++ * were sleeping ++ */ ++static int au_do_unlink_wh(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct path h_path; ++ struct au_branch *br; ++ struct inode *delegated; ++ ++ br = au_sbr(a->sb, a->mvd_bdst); ++ h_path.dentry = au_wh_lkup(a->mvd_h_dst_parent, &a->dentry->d_name, br); ++ err = PTR_ERR(h_path.dentry); ++ if (IS_ERR(h_path.dentry)) { ++ AU_MVD_PR(dmsg, "wh_lkup failed\n"); ++ goto out; ++ } ++ ++ err = 0; ++ if (d_is_positive(h_path.dentry)) { ++ h_path.mnt = au_br_mnt(br); ++ delegated = NULL; ++ err = vfsub_unlink(d_inode(a->mvd_h_dst_parent), &h_path, ++ &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ if (unlikely(err)) ++ AU_MVD_PR(dmsg, "wh_unlink failed\n"); ++ } ++ dput(h_path.dentry); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * unlink the topmost h_dentry ++ */ ++static int au_do_unlink(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct path h_path; ++ struct inode *delegated; ++ ++ h_path.mnt = au_sbr_mnt(a->sb, a->mvd_bsrc); ++ h_path.dentry = au_h_dptr(a->dentry, a->mvd_bsrc); ++ delegated = NULL; ++ err = vfsub_unlink(a->mvd_h_src_dir, &h_path, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ if (unlikely(err)) ++ AU_MVD_PR(dmsg, "unlink failed\n"); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* Since mvdown succeeded, we ignore an error of this function */ ++static void au_do_stfs(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct au_branch *br; ++ ++ a->mvdown.flags |= AUFS_MVDOWN_STFS_FAILED; ++ br = au_sbr(a->sb, a->mvd_bsrc); ++ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_UPPER].stfs); ++ if (!err) { ++ br = au_sbr(a->sb, a->mvd_bdst); ++ a->mvdown.stbr[AUFS_MVDOWN_LOWER].brid = br->br_id; ++ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_LOWER].stfs); ++ } ++ if (!err) ++ a->mvdown.flags &= ~AUFS_MVDOWN_STFS_FAILED; ++ else ++ AU_MVD_PR(dmsg, "statfs failed (%d), ignored\n", err); ++} ++ ++/* ++ * copy-down the file and unlink the bsrc file. ++ * - unlink the bdst whout if exist ++ * - copy-down the file (with whtmp name and rename) ++ * - unlink the bsrc file ++ */ ++static int au_do_mvdown(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ ++ err = au_do_mkdir(dmsg, a); ++ if (!err) ++ err = au_do_lock(dmsg, a); ++ if (unlikely(err)) ++ goto out; ++ ++ /* ++ * do not revert the activities we made on bdst since they should be ++ * harmless in aufs. ++ */ ++ ++ err = au_do_cpdown(dmsg, a); ++ if (!err) ++ err = au_do_unlink_wh(dmsg, a); ++ if (!err && !(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) ++ err = au_do_unlink(dmsg, a); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ AuDbg("%pd2, 0x%x, %d --> %d\n", ++ a->dentry, a->mvdown.flags, a->mvd_bsrc, a->mvd_bdst); ++ if (find_lower_writable(a) < 0) ++ a->mvdown.flags |= AUFS_MVDOWN_BOTTOM; ++ ++ if (a->mvdown.flags & AUFS_MVDOWN_STFS) ++ au_do_stfs(dmsg, a); ++ ++ /* maintain internal array */ ++ if (!(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) { ++ au_set_h_dptr(a->dentry, a->mvd_bsrc, NULL); ++ au_set_dbtop(a->dentry, a->mvd_bdst); ++ au_set_h_iptr(a->inode, a->mvd_bsrc, NULL, /*flags*/0); ++ au_set_ibtop(a->inode, a->mvd_bdst); ++ } else { ++ /* hide the lower */ ++ au_set_h_dptr(a->dentry, a->mvd_bdst, NULL); ++ au_set_dbbot(a->dentry, a->mvd_bsrc); ++ au_set_h_iptr(a->inode, a->mvd_bdst, NULL, /*flags*/0); ++ au_set_ibbot(a->inode, a->mvd_bsrc); ++ } ++ if (au_dbbot(a->dentry) < a->mvd_bdst) ++ au_set_dbbot(a->dentry, a->mvd_bdst); ++ if (au_ibbot(a->inode) < a->mvd_bdst) ++ au_set_ibbot(a->inode, a->mvd_bdst); ++ ++out_unlock: ++ au_do_unlock(dmsg, a); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* make sure the file is idle */ ++static int au_mvd_args_busy(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err, plinked; ++ ++ err = 0; ++ plinked = !!au_opt_test(au_mntflags(a->sb), PLINK); ++ if (au_dbtop(a->dentry) == a->mvd_bsrc ++ && au_dcount(a->dentry) == 1 ++ && atomic_read(&a->inode->i_count) == 1 ++ /* && a->mvd_h_src_inode->i_nlink == 1 */ ++ && (!plinked || !au_plink_test(a->inode)) ++ && a->inode->i_nlink == 1) ++ goto out; ++ ++ err = -EBUSY; ++ AU_MVD_PR(dmsg, ++ "b%d, d{b%d, c%d?}, i{c%d?, l%u}, hi{l%u}, p{%d, %d}\n", ++ a->mvd_bsrc, au_dbtop(a->dentry), au_dcount(a->dentry), ++ atomic_read(&a->inode->i_count), a->inode->i_nlink, ++ a->mvd_h_src_inode->i_nlink, ++ plinked, plinked ? au_plink_test(a->inode) : 0); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* make sure the parent dir is fine */ ++static int au_mvd_args_parent(const unsigned char dmsg, ++ struct au_mvd_args *a) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ ++ err = 0; ++ if (unlikely(au_alive_dir(a->parent))) { ++ err = -ENOENT; ++ AU_MVD_PR(dmsg, "parent dir is dead\n"); ++ goto out; ++ } ++ ++ a->bopq = au_dbdiropq(a->parent); ++ bindex = au_wbr_nonopq(a->dentry, a->mvd_bdst); ++ AuDbg("b%d\n", bindex); ++ if (unlikely((bindex >= 0 && bindex < a->mvd_bdst) ++ || (a->bopq != -1 && a->bopq < a->mvd_bdst))) { ++ err = -EINVAL; ++ a->mvd_errno = EAU_MVDOWN_OPAQUE; ++ AU_MVD_PR(dmsg, "ancestor is opaque b%d, b%d\n", ++ a->bopq, a->mvd_bdst); ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_mvd_args_intermediate(const unsigned char dmsg, ++ struct au_mvd_args *a) ++{ ++ int err; ++ struct au_dinfo *dinfo, *tmp; ++ ++ /* lookup the next lower positive entry */ ++ err = -ENOMEM; ++ tmp = au_di_alloc(a->sb, AuLsc_DI_TMP); ++ if (unlikely(!tmp)) ++ goto out; ++ ++ a->bfound = -1; ++ a->bwh = -1; ++ dinfo = au_di(a->dentry); ++ au_di_cp(tmp, dinfo); ++ au_di_swap(tmp, dinfo); ++ ++ /* returns the number of positive dentries */ ++ err = au_lkup_dentry(a->dentry, a->mvd_bsrc + 1, ++ /* AuLkup_IGNORE_PERM */ 0); ++ if (!err) ++ a->bwh = au_dbwh(a->dentry); ++ else if (err > 0) ++ a->bfound = au_dbtop(a->dentry); ++ ++ au_di_swap(tmp, dinfo); ++ au_rw_write_unlock(&tmp->di_rwsem); ++ au_di_free(tmp); ++ if (unlikely(err < 0)) ++ AU_MVD_PR(dmsg, "failed look-up lower\n"); ++ ++ /* ++ * here, we have these cases. ++ * bfound == -1 ++ * no positive dentry under bsrc. there are more sub-cases. ++ * bwh < 0 ++ * there no whiteout, we can safely move-down. ++ * bwh <= bsrc ++ * impossible ++ * bsrc < bwh && bwh < bdst ++ * there is a whiteout on RO branch. cannot proceed. ++ * bwh == bdst ++ * there is a whiteout on the RW target branch. it should ++ * be removed. ++ * bdst < bwh ++ * there is a whiteout somewhere unrelated branch. ++ * -1 < bfound && bfound <= bsrc ++ * impossible. ++ * bfound < bdst ++ * found, but it is on RO branch between bsrc and bdst. cannot ++ * proceed. ++ * bfound == bdst ++ * found, replace it if AUFS_MVDOWN_FORCE is set. otherwise return ++ * error. ++ * bdst < bfound ++ * found, after we create the file on bdst, it will be hidden. ++ */ ++ ++ AuDebugOn(a->bfound == -1 ++ && a->bwh != -1 ++ && a->bwh <= a->mvd_bsrc); ++ AuDebugOn(-1 < a->bfound ++ && a->bfound <= a->mvd_bsrc); ++ ++ err = -EINVAL; ++ if (a->bfound == -1 ++ && a->mvd_bsrc < a->bwh ++ && a->bwh != -1 ++ && a->bwh < a->mvd_bdst) { ++ a->mvd_errno = EAU_MVDOWN_WHITEOUT; ++ AU_MVD_PR(dmsg, "bsrc %d, bdst %d, bfound %d, bwh %d\n", ++ a->mvd_bsrc, a->mvd_bdst, a->bfound, a->bwh); ++ goto out; ++ } else if (a->bfound != -1 && a->bfound < a->mvd_bdst) { ++ a->mvd_errno = EAU_MVDOWN_UPPER; ++ AU_MVD_PR(dmsg, "bdst %d, bfound %d\n", ++ a->mvd_bdst, a->bfound); ++ goto out; ++ } ++ ++ err = 0; /* success */ ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_mvd_args_exist(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ ++ err = 0; ++ if (!(a->mvdown.flags & AUFS_MVDOWN_OWLOWER) ++ && a->bfound == a->mvd_bdst) ++ err = -EEXIST; ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_mvd_args(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct au_branch *br; ++ ++ err = -EISDIR; ++ if (unlikely(S_ISDIR(a->inode->i_mode))) ++ goto out; ++ ++ err = -EINVAL; ++ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_UPPER)) ++ a->mvd_bsrc = au_ibtop(a->inode); ++ else { ++ a->mvd_bsrc = au_br_index(a->sb, a->mvd_src_brid); ++ if (unlikely(a->mvd_bsrc < 0 ++ || (a->mvd_bsrc < au_dbtop(a->dentry) ++ || au_dbbot(a->dentry) < a->mvd_bsrc ++ || !au_h_dptr(a->dentry, a->mvd_bsrc)) ++ || (a->mvd_bsrc < au_ibtop(a->inode) ++ || au_ibbot(a->inode) < a->mvd_bsrc ++ || !au_h_iptr(a->inode, a->mvd_bsrc)))) { ++ a->mvd_errno = EAU_MVDOWN_NOUPPER; ++ AU_MVD_PR(dmsg, "no upper\n"); ++ goto out; ++ } ++ } ++ if (unlikely(a->mvd_bsrc == au_sbbot(a->sb))) { ++ a->mvd_errno = EAU_MVDOWN_BOTTOM; ++ AU_MVD_PR(dmsg, "on the bottom\n"); ++ goto out; ++ } ++ a->mvd_h_src_inode = au_h_iptr(a->inode, a->mvd_bsrc); ++ br = au_sbr(a->sb, a->mvd_bsrc); ++ err = au_br_rdonly(br); ++ if (!(a->mvdown.flags & AUFS_MVDOWN_ROUPPER)) { ++ if (unlikely(err)) ++ goto out; ++ } else if (!(vfsub_native_ro(a->mvd_h_src_inode) ++ || IS_APPEND(a->mvd_h_src_inode))) { ++ if (err) ++ a->mvdown.flags |= AUFS_MVDOWN_ROUPPER_R; ++ /* go on */ ++ } else ++ goto out; ++ ++ err = -EINVAL; ++ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_LOWER)) { ++ a->mvd_bdst = find_lower_writable(a); ++ if (unlikely(a->mvd_bdst < 0)) { ++ a->mvd_errno = EAU_MVDOWN_BOTTOM; ++ AU_MVD_PR(dmsg, "no writable lower branch\n"); ++ goto out; ++ } ++ } else { ++ a->mvd_bdst = au_br_index(a->sb, a->mvd_dst_brid); ++ if (unlikely(a->mvd_bdst < 0 ++ || au_sbbot(a->sb) < a->mvd_bdst)) { ++ a->mvd_errno = EAU_MVDOWN_NOLOWERBR; ++ AU_MVD_PR(dmsg, "no lower brid\n"); ++ goto out; ++ } ++ } ++ ++ err = au_mvd_args_busy(dmsg, a); ++ if (!err) ++ err = au_mvd_args_parent(dmsg, a); ++ if (!err) ++ err = au_mvd_args_intermediate(dmsg, a); ++ if (!err) ++ err = au_mvd_args_exist(dmsg, a); ++ if (!err) ++ AuDbg("b%d, b%d\n", a->mvd_bsrc, a->mvd_bdst); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *uarg) ++{ ++ int err, e; ++ unsigned char dmsg; ++ struct au_mvd_args *args; ++ struct inode *inode; ++ ++ inode = d_inode(dentry); ++ err = -EPERM; ++ if (unlikely(!capable(CAP_SYS_ADMIN))) ++ goto out; ++ ++ err = -ENOMEM; ++ args = kmalloc(sizeof(*args), GFP_NOFS); ++ if (unlikely(!args)) ++ goto out; ++ ++ err = copy_from_user(&args->mvdown, uarg, sizeof(args->mvdown)); ++ if (!err) ++ err = !access_ok(VERIFY_WRITE, uarg, sizeof(*uarg)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out_free; ++ } ++ AuDbg("flags 0x%x\n", args->mvdown.flags); ++ args->mvdown.flags &= ~(AUFS_MVDOWN_ROLOWER_R | AUFS_MVDOWN_ROUPPER_R); ++ args->mvdown.au_errno = 0; ++ args->dentry = dentry; ++ args->inode = inode; ++ args->sb = dentry->d_sb; ++ ++ err = -ENOENT; ++ dmsg = !!(args->mvdown.flags & AUFS_MVDOWN_DMSG); ++ args->parent = dget_parent(dentry); ++ args->dir = d_inode(args->parent); ++ inode_lock_nested(args->dir, I_MUTEX_PARENT); ++ dput(args->parent); ++ if (unlikely(args->parent != dentry->d_parent)) { ++ AU_MVD_PR(dmsg, "parent dir is moved\n"); ++ goto out_dir; ++ } ++ ++ inode_lock_nested(inode, I_MUTEX_CHILD); ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_NOPLMW); ++ if (unlikely(err)) ++ goto out_inode; ++ ++ di_write_lock_parent(args->parent); ++ err = au_mvd_args(dmsg, args); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ err = au_do_mvdown(dmsg, args); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ au_cpup_attr_timesizes(args->dir); ++ au_cpup_attr_timesizes(inode); ++ if (!(args->mvdown.flags & AUFS_MVDOWN_KUPPER)) ++ au_cpup_igen(inode, au_h_iptr(inode, args->mvd_bdst)); ++ /* au_digen_dec(dentry); */ ++ ++out_parent: ++ di_write_unlock(args->parent); ++ aufs_read_unlock(dentry, AuLock_DW); ++out_inode: ++ inode_unlock(inode); ++out_dir: ++ inode_unlock(args->dir); ++out_free: ++ e = copy_to_user(uarg, &args->mvdown, sizeof(args->mvdown)); ++ if (unlikely(e)) ++ err = -EFAULT; ++ kfree(args); ++out: ++ AuTraceErr(err); ++ return err; ++} +diff --git a/fs/aufs/opts.c b/fs/aufs/opts.c +new file mode 100644 +index 000000000000..7c42dde5ab8a +--- /dev/null ++++ b/fs/aufs/opts.c +@@ -0,0 +1,1864 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * mount options/flags ++ */ ++ ++#include ++#include /* a distribution requires */ ++#include ++#include "aufs.h" ++ ++/* ---------------------------------------------------------------------- */ ++ ++enum { ++ Opt_br, ++ Opt_add, Opt_del, Opt_mod, Opt_append, Opt_prepend, ++ Opt_idel, Opt_imod, ++ Opt_dirwh, Opt_rdcache, Opt_rdblk, Opt_rdhash, ++ Opt_rdblk_def, Opt_rdhash_def, ++ Opt_xino, Opt_noxino, ++ Opt_trunc_xino, Opt_trunc_xino_v, Opt_notrunc_xino, ++ Opt_trunc_xino_path, Opt_itrunc_xino, ++ Opt_trunc_xib, Opt_notrunc_xib, ++ Opt_shwh, Opt_noshwh, ++ Opt_plink, Opt_noplink, Opt_list_plink, ++ Opt_udba, ++ Opt_dio, Opt_nodio, ++ Opt_diropq_a, Opt_diropq_w, ++ Opt_warn_perm, Opt_nowarn_perm, ++ Opt_wbr_copyup, Opt_wbr_create, ++ Opt_fhsm_sec, ++ Opt_verbose, Opt_noverbose, ++ Opt_sum, Opt_nosum, Opt_wsum, ++ Opt_dirperm1, Opt_nodirperm1, ++ Opt_dirren, Opt_nodirren, ++ Opt_acl, Opt_noacl, ++ Opt_tail, Opt_ignore, Opt_ignore_silent, Opt_err ++}; ++ ++static match_table_t options = { ++ {Opt_br, "br=%s"}, ++ {Opt_br, "br:%s"}, ++ ++ {Opt_add, "add=%d:%s"}, ++ {Opt_add, "add:%d:%s"}, ++ {Opt_add, "ins=%d:%s"}, ++ {Opt_add, "ins:%d:%s"}, ++ {Opt_append, "append=%s"}, ++ {Opt_append, "append:%s"}, ++ {Opt_prepend, "prepend=%s"}, ++ {Opt_prepend, "prepend:%s"}, ++ ++ {Opt_del, "del=%s"}, ++ {Opt_del, "del:%s"}, ++ /* {Opt_idel, "idel:%d"}, */ ++ {Opt_mod, "mod=%s"}, ++ {Opt_mod, "mod:%s"}, ++ /* {Opt_imod, "imod:%d:%s"}, */ ++ ++ {Opt_dirwh, "dirwh=%d"}, ++ ++ {Opt_xino, "xino=%s"}, ++ {Opt_noxino, "noxino"}, ++ {Opt_trunc_xino, "trunc_xino"}, ++ {Opt_trunc_xino_v, "trunc_xino_v=%d:%d"}, ++ {Opt_notrunc_xino, "notrunc_xino"}, ++ {Opt_trunc_xino_path, "trunc_xino=%s"}, ++ {Opt_itrunc_xino, "itrunc_xino=%d"}, ++ /* {Opt_zxino, "zxino=%s"}, */ ++ {Opt_trunc_xib, "trunc_xib"}, ++ {Opt_notrunc_xib, "notrunc_xib"}, ++ ++#ifdef CONFIG_PROC_FS ++ {Opt_plink, "plink"}, ++#else ++ {Opt_ignore_silent, "plink"}, ++#endif ++ ++ {Opt_noplink, "noplink"}, ++ ++#ifdef CONFIG_AUFS_DEBUG ++ {Opt_list_plink, "list_plink"}, ++#endif ++ ++ {Opt_udba, "udba=%s"}, ++ ++ {Opt_dio, "dio"}, ++ {Opt_nodio, "nodio"}, ++ ++#ifdef CONFIG_AUFS_DIRREN ++ {Opt_dirren, "dirren"}, ++ {Opt_nodirren, "nodirren"}, ++#else ++ {Opt_ignore, "dirren"}, ++ {Opt_ignore_silent, "nodirren"}, ++#endif ++ ++#ifdef CONFIG_AUFS_FHSM ++ {Opt_fhsm_sec, "fhsm_sec=%d"}, ++#else ++ {Opt_ignore, "fhsm_sec=%d"}, ++#endif ++ ++ {Opt_diropq_a, "diropq=always"}, ++ {Opt_diropq_a, "diropq=a"}, ++ {Opt_diropq_w, "diropq=whiteouted"}, ++ {Opt_diropq_w, "diropq=w"}, ++ ++ {Opt_warn_perm, "warn_perm"}, ++ {Opt_nowarn_perm, "nowarn_perm"}, ++ ++ /* keep them temporary */ ++ {Opt_ignore_silent, "nodlgt"}, ++ {Opt_ignore, "clean_plink"}, ++ ++#ifdef CONFIG_AUFS_SHWH ++ {Opt_shwh, "shwh"}, ++#endif ++ {Opt_noshwh, "noshwh"}, ++ ++ {Opt_dirperm1, "dirperm1"}, ++ {Opt_nodirperm1, "nodirperm1"}, ++ ++ {Opt_verbose, "verbose"}, ++ {Opt_verbose, "v"}, ++ {Opt_noverbose, "noverbose"}, ++ {Opt_noverbose, "quiet"}, ++ {Opt_noverbose, "q"}, ++ {Opt_noverbose, "silent"}, ++ ++ {Opt_sum, "sum"}, ++ {Opt_nosum, "nosum"}, ++ {Opt_wsum, "wsum"}, ++ ++ {Opt_rdcache, "rdcache=%d"}, ++ {Opt_rdblk, "rdblk=%d"}, ++ {Opt_rdblk_def, "rdblk=def"}, ++ {Opt_rdhash, "rdhash=%d"}, ++ {Opt_rdhash_def, "rdhash=def"}, ++ ++ {Opt_wbr_create, "create=%s"}, ++ {Opt_wbr_create, "create_policy=%s"}, ++ {Opt_wbr_copyup, "cpup=%s"}, ++ {Opt_wbr_copyup, "copyup=%s"}, ++ {Opt_wbr_copyup, "copyup_policy=%s"}, ++ ++ /* generic VFS flag */ ++#ifdef CONFIG_FS_POSIX_ACL ++ {Opt_acl, "acl"}, ++ {Opt_noacl, "noacl"}, ++#else ++ {Opt_ignore, "acl"}, ++ {Opt_ignore_silent, "noacl"}, ++#endif ++ ++ /* internal use for the scripts */ ++ {Opt_ignore_silent, "si=%s"}, ++ ++ {Opt_br, "dirs=%s"}, ++ {Opt_ignore, "debug=%d"}, ++ {Opt_ignore, "delete=whiteout"}, ++ {Opt_ignore, "delete=all"}, ++ {Opt_ignore, "imap=%s"}, ++ ++ /* temporary workaround, due to old mount(8)? */ ++ {Opt_ignore_silent, "relatime"}, ++ ++ {Opt_err, NULL} ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static const char *au_parser_pattern(int val, match_table_t tbl) ++{ ++ struct match_token *p; ++ ++ p = tbl; ++ while (p->pattern) { ++ if (p->token == val) ++ return p->pattern; ++ p++; ++ } ++ BUG(); ++ return "??"; ++} ++ ++static const char *au_optstr(int *val, match_table_t tbl) ++{ ++ struct match_token *p; ++ int v; ++ ++ v = *val; ++ if (!v) ++ goto out; ++ p = tbl; ++ while (p->pattern) { ++ if (p->token ++ && (v & p->token) == p->token) { ++ *val &= ~p->token; ++ return p->pattern; ++ } ++ p++; ++ } ++ ++out: ++ return NULL; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static match_table_t brperm = { ++ {AuBrPerm_RO, AUFS_BRPERM_RO}, ++ {AuBrPerm_RR, AUFS_BRPERM_RR}, ++ {AuBrPerm_RW, AUFS_BRPERM_RW}, ++ {0, NULL} ++}; ++ ++static match_table_t brattr = { ++ /* general */ ++ {AuBrAttr_COO_REG, AUFS_BRATTR_COO_REG}, ++ {AuBrAttr_COO_ALL, AUFS_BRATTR_COO_ALL}, ++ /* 'unpin' attrib is meaningless since linux-3.18-rc1 */ ++ {AuBrAttr_UNPIN, AUFS_BRATTR_UNPIN}, ++#ifdef CONFIG_AUFS_FHSM ++ {AuBrAttr_FHSM, AUFS_BRATTR_FHSM}, ++#endif ++#ifdef CONFIG_AUFS_XATTR ++ {AuBrAttr_ICEX, AUFS_BRATTR_ICEX}, ++ {AuBrAttr_ICEX_SEC, AUFS_BRATTR_ICEX_SEC}, ++ {AuBrAttr_ICEX_SYS, AUFS_BRATTR_ICEX_SYS}, ++ {AuBrAttr_ICEX_TR, AUFS_BRATTR_ICEX_TR}, ++ {AuBrAttr_ICEX_USR, AUFS_BRATTR_ICEX_USR}, ++ {AuBrAttr_ICEX_OTH, AUFS_BRATTR_ICEX_OTH}, ++#endif ++ ++ /* ro/rr branch */ ++ {AuBrRAttr_WH, AUFS_BRRATTR_WH}, ++ ++ /* rw branch */ ++ {AuBrWAttr_MOO, AUFS_BRWATTR_MOO}, ++ {AuBrWAttr_NoLinkWH, AUFS_BRWATTR_NLWH}, ++ ++ {0, NULL} ++}; ++ ++static int br_attr_val(char *str, match_table_t table, substring_t args[]) ++{ ++ int attr, v; ++ char *p; ++ ++ attr = 0; ++ do { ++ p = strchr(str, '+'); ++ if (p) ++ *p = 0; ++ v = match_token(str, table, args); ++ if (v) { ++ if (v & AuBrAttr_CMOO_Mask) ++ attr &= ~AuBrAttr_CMOO_Mask; ++ attr |= v; ++ } else { ++ if (p) ++ *p = '+'; ++ pr_warn("ignored branch attribute %s\n", str); ++ break; ++ } ++ if (p) ++ str = p + 1; ++ } while (p); ++ ++ return attr; ++} ++ ++static int au_do_optstr_br_attr(au_br_perm_str_t *str, int perm) ++{ ++ int sz; ++ const char *p; ++ char *q; ++ ++ q = str->a; ++ *q = 0; ++ p = au_optstr(&perm, brattr); ++ if (p) { ++ sz = strlen(p); ++ memcpy(q, p, sz + 1); ++ q += sz; ++ } else ++ goto out; ++ ++ do { ++ p = au_optstr(&perm, brattr); ++ if (p) { ++ *q++ = '+'; ++ sz = strlen(p); ++ memcpy(q, p, sz + 1); ++ q += sz; ++ } ++ } while (p); ++ ++out: ++ return q - str->a; ++} ++ ++static int noinline_for_stack br_perm_val(char *perm) ++{ ++ int val, bad, sz; ++ char *p; ++ substring_t args[MAX_OPT_ARGS]; ++ au_br_perm_str_t attr; ++ ++ p = strchr(perm, '+'); ++ if (p) ++ *p = 0; ++ val = match_token(perm, brperm, args); ++ if (!val) { ++ if (p) ++ *p = '+'; ++ pr_warn("ignored branch permission %s\n", perm); ++ val = AuBrPerm_RO; ++ goto out; ++ } ++ if (!p) ++ goto out; ++ ++ val |= br_attr_val(p + 1, brattr, args); ++ ++ bad = 0; ++ switch (val & AuBrPerm_Mask) { ++ case AuBrPerm_RO: ++ case AuBrPerm_RR: ++ bad = val & AuBrWAttr_Mask; ++ val &= ~AuBrWAttr_Mask; ++ break; ++ case AuBrPerm_RW: ++ bad = val & AuBrRAttr_Mask; ++ val &= ~AuBrRAttr_Mask; ++ break; ++ } ++ ++ /* ++ * 'unpin' attrib becomes meaningless since linux-3.18-rc1, but aufs ++ * does not treat it as an error, just warning. ++ * this is a tiny guard for the user operation. ++ */ ++ if (val & AuBrAttr_UNPIN) { ++ bad |= AuBrAttr_UNPIN; ++ val &= ~AuBrAttr_UNPIN; ++ } ++ ++ if (unlikely(bad)) { ++ sz = au_do_optstr_br_attr(&attr, bad); ++ AuDebugOn(!sz); ++ pr_warn("ignored branch attribute %s\n", attr.a); ++ } ++ ++out: ++ return val; ++} ++ ++void au_optstr_br_perm(au_br_perm_str_t *str, int perm) ++{ ++ au_br_perm_str_t attr; ++ const char *p; ++ char *q; ++ int sz; ++ ++ q = str->a; ++ p = au_optstr(&perm, brperm); ++ AuDebugOn(!p || !*p); ++ sz = strlen(p); ++ memcpy(q, p, sz + 1); ++ q += sz; ++ ++ sz = au_do_optstr_br_attr(&attr, perm); ++ if (sz) { ++ *q++ = '+'; ++ memcpy(q, attr.a, sz + 1); ++ } ++ ++ AuDebugOn(strlen(str->a) >= sizeof(str->a)); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static match_table_t udbalevel = { ++ {AuOpt_UDBA_REVAL, "reval"}, ++ {AuOpt_UDBA_NONE, "none"}, ++#ifdef CONFIG_AUFS_HNOTIFY ++ {AuOpt_UDBA_HNOTIFY, "notify"}, /* abstraction */ ++#ifdef CONFIG_AUFS_HFSNOTIFY ++ {AuOpt_UDBA_HNOTIFY, "fsnotify"}, ++#endif ++#endif ++ {-1, NULL} ++}; ++ ++static int noinline_for_stack udba_val(char *str) ++{ ++ substring_t args[MAX_OPT_ARGS]; ++ ++ return match_token(str, udbalevel, args); ++} ++ ++const char *au_optstr_udba(int udba) ++{ ++ return au_parser_pattern(udba, udbalevel); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static match_table_t au_wbr_create_policy = { ++ {AuWbrCreate_TDP, "tdp"}, ++ {AuWbrCreate_TDP, "top-down-parent"}, ++ {AuWbrCreate_RR, "rr"}, ++ {AuWbrCreate_RR, "round-robin"}, ++ {AuWbrCreate_MFS, "mfs"}, ++ {AuWbrCreate_MFS, "most-free-space"}, ++ {AuWbrCreate_MFSV, "mfs:%d"}, ++ {AuWbrCreate_MFSV, "most-free-space:%d"}, ++ ++ /* top-down regardless the parent, and then mfs */ ++ {AuWbrCreate_TDMFS, "tdmfs:%d"}, ++ {AuWbrCreate_TDMFSV, "tdmfs:%d:%d"}, ++ ++ {AuWbrCreate_MFSRR, "mfsrr:%d"}, ++ {AuWbrCreate_MFSRRV, "mfsrr:%d:%d"}, ++ {AuWbrCreate_PMFS, "pmfs"}, ++ {AuWbrCreate_PMFSV, "pmfs:%d"}, ++ {AuWbrCreate_PMFSRR, "pmfsrr:%d"}, ++ {AuWbrCreate_PMFSRRV, "pmfsrr:%d:%d"}, ++ ++ {-1, NULL} ++}; ++ ++static int au_wbr_mfs_wmark(substring_t *arg, char *str, ++ struct au_opt_wbr_create *create) ++{ ++ int err; ++ unsigned long long ull; ++ ++ err = 0; ++ if (!match_u64(arg, &ull)) ++ create->mfsrr_watermark = ull; ++ else { ++ pr_err("bad integer in %s\n", str); ++ err = -EINVAL; ++ } ++ ++ return err; ++} ++ ++static int au_wbr_mfs_sec(substring_t *arg, char *str, ++ struct au_opt_wbr_create *create) ++{ ++ int n, err; ++ ++ err = 0; ++ if (!match_int(arg, &n) && 0 <= n && n <= AUFS_MFS_MAX_SEC) ++ create->mfs_second = n; ++ else { ++ pr_err("bad integer in %s\n", str); ++ err = -EINVAL; ++ } ++ ++ return err; ++} ++ ++static int noinline_for_stack ++au_wbr_create_val(char *str, struct au_opt_wbr_create *create) ++{ ++ int err, e; ++ substring_t args[MAX_OPT_ARGS]; ++ ++ err = match_token(str, au_wbr_create_policy, args); ++ create->wbr_create = err; ++ switch (err) { ++ case AuWbrCreate_MFSRRV: ++ case AuWbrCreate_TDMFSV: ++ case AuWbrCreate_PMFSRRV: ++ e = au_wbr_mfs_wmark(&args[0], str, create); ++ if (!e) ++ e = au_wbr_mfs_sec(&args[1], str, create); ++ if (unlikely(e)) ++ err = e; ++ break; ++ case AuWbrCreate_MFSRR: ++ case AuWbrCreate_TDMFS: ++ case AuWbrCreate_PMFSRR: ++ e = au_wbr_mfs_wmark(&args[0], str, create); ++ if (unlikely(e)) { ++ err = e; ++ break; ++ } ++ /*FALLTHROUGH*/ ++ case AuWbrCreate_MFS: ++ case AuWbrCreate_PMFS: ++ create->mfs_second = AUFS_MFS_DEF_SEC; ++ break; ++ case AuWbrCreate_MFSV: ++ case AuWbrCreate_PMFSV: ++ e = au_wbr_mfs_sec(&args[0], str, create); ++ if (unlikely(e)) ++ err = e; ++ break; ++ } ++ ++ return err; ++} ++ ++const char *au_optstr_wbr_create(int wbr_create) ++{ ++ return au_parser_pattern(wbr_create, au_wbr_create_policy); ++} ++ ++static match_table_t au_wbr_copyup_policy = { ++ {AuWbrCopyup_TDP, "tdp"}, ++ {AuWbrCopyup_TDP, "top-down-parent"}, ++ {AuWbrCopyup_BUP, "bup"}, ++ {AuWbrCopyup_BUP, "bottom-up-parent"}, ++ {AuWbrCopyup_BU, "bu"}, ++ {AuWbrCopyup_BU, "bottom-up"}, ++ {-1, NULL} ++}; ++ ++static int noinline_for_stack au_wbr_copyup_val(char *str) ++{ ++ substring_t args[MAX_OPT_ARGS]; ++ ++ return match_token(str, au_wbr_copyup_policy, args); ++} ++ ++const char *au_optstr_wbr_copyup(int wbr_copyup) ++{ ++ return au_parser_pattern(wbr_copyup, au_wbr_copyup_policy); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static const int lkup_dirflags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY; ++ ++static void dump_opts(struct au_opts *opts) ++{ ++#ifdef CONFIG_AUFS_DEBUG ++ /* reduce stack space */ ++ union { ++ struct au_opt_add *add; ++ struct au_opt_del *del; ++ struct au_opt_mod *mod; ++ struct au_opt_xino *xino; ++ struct au_opt_xino_itrunc *xino_itrunc; ++ struct au_opt_wbr_create *create; ++ } u; ++ struct au_opt *opt; ++ ++ opt = opts->opt; ++ while (opt->type != Opt_tail) { ++ switch (opt->type) { ++ case Opt_add: ++ u.add = &opt->add; ++ AuDbg("add {b%d, %s, 0x%x, %p}\n", ++ u.add->bindex, u.add->pathname, u.add->perm, ++ u.add->path.dentry); ++ break; ++ case Opt_del: ++ case Opt_idel: ++ u.del = &opt->del; ++ AuDbg("del {%s, %p}\n", ++ u.del->pathname, u.del->h_path.dentry); ++ break; ++ case Opt_mod: ++ case Opt_imod: ++ u.mod = &opt->mod; ++ AuDbg("mod {%s, 0x%x, %p}\n", ++ u.mod->path, u.mod->perm, u.mod->h_root); ++ break; ++ case Opt_append: ++ u.add = &opt->add; ++ AuDbg("append {b%d, %s, 0x%x, %p}\n", ++ u.add->bindex, u.add->pathname, u.add->perm, ++ u.add->path.dentry); ++ break; ++ case Opt_prepend: ++ u.add = &opt->add; ++ AuDbg("prepend {b%d, %s, 0x%x, %p}\n", ++ u.add->bindex, u.add->pathname, u.add->perm, ++ u.add->path.dentry); ++ break; ++ case Opt_dirwh: ++ AuDbg("dirwh %d\n", opt->dirwh); ++ break; ++ case Opt_rdcache: ++ AuDbg("rdcache %d\n", opt->rdcache); ++ break; ++ case Opt_rdblk: ++ AuDbg("rdblk %u\n", opt->rdblk); ++ break; ++ case Opt_rdblk_def: ++ AuDbg("rdblk_def\n"); ++ break; ++ case Opt_rdhash: ++ AuDbg("rdhash %u\n", opt->rdhash); ++ break; ++ case Opt_rdhash_def: ++ AuDbg("rdhash_def\n"); ++ break; ++ case Opt_xino: ++ u.xino = &opt->xino; ++ AuDbg("xino {%s %pD}\n", u.xino->path, u.xino->file); ++ break; ++ case Opt_trunc_xino: ++ AuLabel(trunc_xino); ++ break; ++ case Opt_notrunc_xino: ++ AuLabel(notrunc_xino); ++ break; ++ case Opt_trunc_xino_path: ++ case Opt_itrunc_xino: ++ u.xino_itrunc = &opt->xino_itrunc; ++ AuDbg("trunc_xino %d\n", u.xino_itrunc->bindex); ++ break; ++ case Opt_noxino: ++ AuLabel(noxino); ++ break; ++ case Opt_trunc_xib: ++ AuLabel(trunc_xib); ++ break; ++ case Opt_notrunc_xib: ++ AuLabel(notrunc_xib); ++ break; ++ case Opt_shwh: ++ AuLabel(shwh); ++ break; ++ case Opt_noshwh: ++ AuLabel(noshwh); ++ break; ++ case Opt_dirperm1: ++ AuLabel(dirperm1); ++ break; ++ case Opt_nodirperm1: ++ AuLabel(nodirperm1); ++ break; ++ case Opt_plink: ++ AuLabel(plink); ++ break; ++ case Opt_noplink: ++ AuLabel(noplink); ++ break; ++ case Opt_list_plink: ++ AuLabel(list_plink); ++ break; ++ case Opt_udba: ++ AuDbg("udba %d, %s\n", ++ opt->udba, au_optstr_udba(opt->udba)); ++ break; ++ case Opt_dio: ++ AuLabel(dio); ++ break; ++ case Opt_nodio: ++ AuLabel(nodio); ++ break; ++ case Opt_diropq_a: ++ AuLabel(diropq_a); ++ break; ++ case Opt_diropq_w: ++ AuLabel(diropq_w); ++ break; ++ case Opt_warn_perm: ++ AuLabel(warn_perm); ++ break; ++ case Opt_nowarn_perm: ++ AuLabel(nowarn_perm); ++ break; ++ case Opt_verbose: ++ AuLabel(verbose); ++ break; ++ case Opt_noverbose: ++ AuLabel(noverbose); ++ break; ++ case Opt_sum: ++ AuLabel(sum); ++ break; ++ case Opt_nosum: ++ AuLabel(nosum); ++ break; ++ case Opt_wsum: ++ AuLabel(wsum); ++ break; ++ case Opt_wbr_create: ++ u.create = &opt->wbr_create; ++ AuDbg("create %d, %s\n", u.create->wbr_create, ++ au_optstr_wbr_create(u.create->wbr_create)); ++ switch (u.create->wbr_create) { ++ case AuWbrCreate_MFSV: ++ case AuWbrCreate_PMFSV: ++ AuDbg("%d sec\n", u.create->mfs_second); ++ break; ++ case AuWbrCreate_MFSRR: ++ case AuWbrCreate_TDMFS: ++ AuDbg("%llu watermark\n", ++ u.create->mfsrr_watermark); ++ break; ++ case AuWbrCreate_MFSRRV: ++ case AuWbrCreate_TDMFSV: ++ case AuWbrCreate_PMFSRRV: ++ AuDbg("%llu watermark, %d sec\n", ++ u.create->mfsrr_watermark, ++ u.create->mfs_second); ++ break; ++ } ++ break; ++ case Opt_wbr_copyup: ++ AuDbg("copyup %d, %s\n", opt->wbr_copyup, ++ au_optstr_wbr_copyup(opt->wbr_copyup)); ++ break; ++ case Opt_fhsm_sec: ++ AuDbg("fhsm_sec %u\n", opt->fhsm_second); ++ break; ++ case Opt_dirren: ++ AuLabel(dirren); ++ break; ++ case Opt_nodirren: ++ AuLabel(nodirren); ++ break; ++ case Opt_acl: ++ AuLabel(acl); ++ break; ++ case Opt_noacl: ++ AuLabel(noacl); ++ break; ++ default: ++ BUG(); ++ } ++ opt++; ++ } ++#endif ++} ++ ++void au_opts_free(struct au_opts *opts) ++{ ++ struct au_opt *opt; ++ ++ opt = opts->opt; ++ while (opt->type != Opt_tail) { ++ switch (opt->type) { ++ case Opt_add: ++ case Opt_append: ++ case Opt_prepend: ++ path_put(&opt->add.path); ++ break; ++ case Opt_del: ++ case Opt_idel: ++ path_put(&opt->del.h_path); ++ break; ++ case Opt_mod: ++ case Opt_imod: ++ dput(opt->mod.h_root); ++ break; ++ case Opt_xino: ++ fput(opt->xino.file); ++ break; ++ } ++ opt++; ++ } ++} ++ ++static int opt_add(struct au_opt *opt, char *opt_str, unsigned long sb_flags, ++ aufs_bindex_t bindex) ++{ ++ int err; ++ struct au_opt_add *add = &opt->add; ++ char *p; ++ ++ add->bindex = bindex; ++ add->perm = AuBrPerm_RO; ++ add->pathname = opt_str; ++ p = strchr(opt_str, '='); ++ if (p) { ++ *p++ = 0; ++ if (*p) ++ add->perm = br_perm_val(p); ++ } ++ ++ err = vfsub_kern_path(add->pathname, lkup_dirflags, &add->path); ++ if (!err) { ++ if (!p) { ++ add->perm = AuBrPerm_RO; ++ if (au_test_fs_rr(add->path.dentry->d_sb)) ++ add->perm = AuBrPerm_RR; ++ else if (!bindex && !(sb_flags & SB_RDONLY)) ++ add->perm = AuBrPerm_RW; ++ } ++ opt->type = Opt_add; ++ goto out; ++ } ++ pr_err("lookup failed %s (%d)\n", add->pathname, err); ++ err = -EINVAL; ++ ++out: ++ return err; ++} ++ ++static int au_opts_parse_del(struct au_opt_del *del, substring_t args[]) ++{ ++ int err; ++ ++ del->pathname = args[0].from; ++ AuDbg("del path %s\n", del->pathname); ++ ++ err = vfsub_kern_path(del->pathname, lkup_dirflags, &del->h_path); ++ if (unlikely(err)) ++ pr_err("lookup failed %s (%d)\n", del->pathname, err); ++ ++ return err; ++} ++ ++#if 0 /* reserved for future use */ ++static int au_opts_parse_idel(struct super_block *sb, aufs_bindex_t bindex, ++ struct au_opt_del *del, substring_t args[]) ++{ ++ int err; ++ struct dentry *root; ++ ++ err = -EINVAL; ++ root = sb->s_root; ++ aufs_read_lock(root, AuLock_FLUSH); ++ if (bindex < 0 || au_sbbot(sb) < bindex) { ++ pr_err("out of bounds, %d\n", bindex); ++ goto out; ++ } ++ ++ err = 0; ++ del->h_path.dentry = dget(au_h_dptr(root, bindex)); ++ del->h_path.mnt = mntget(au_sbr_mnt(sb, bindex)); ++ ++out: ++ aufs_read_unlock(root, !AuLock_IR); ++ return err; ++} ++#endif ++ ++static int noinline_for_stack ++au_opts_parse_mod(struct au_opt_mod *mod, substring_t args[]) ++{ ++ int err; ++ struct path path; ++ char *p; ++ ++ err = -EINVAL; ++ mod->path = args[0].from; ++ p = strchr(mod->path, '='); ++ if (unlikely(!p)) { ++ pr_err("no permission %s\n", args[0].from); ++ goto out; ++ } ++ ++ *p++ = 0; ++ err = vfsub_kern_path(mod->path, lkup_dirflags, &path); ++ if (unlikely(err)) { ++ pr_err("lookup failed %s (%d)\n", mod->path, err); ++ goto out; ++ } ++ ++ mod->perm = br_perm_val(p); ++ AuDbg("mod path %s, perm 0x%x, %s\n", mod->path, mod->perm, p); ++ mod->h_root = dget(path.dentry); ++ path_put(&path); ++ ++out: ++ return err; ++} ++ ++#if 0 /* reserved for future use */ ++static int au_opts_parse_imod(struct super_block *sb, aufs_bindex_t bindex, ++ struct au_opt_mod *mod, substring_t args[]) ++{ ++ int err; ++ struct dentry *root; ++ ++ err = -EINVAL; ++ root = sb->s_root; ++ aufs_read_lock(root, AuLock_FLUSH); ++ if (bindex < 0 || au_sbbot(sb) < bindex) { ++ pr_err("out of bounds, %d\n", bindex); ++ goto out; ++ } ++ ++ err = 0; ++ mod->perm = br_perm_val(args[1].from); ++ AuDbg("mod path %s, perm 0x%x, %s\n", ++ mod->path, mod->perm, args[1].from); ++ mod->h_root = dget(au_h_dptr(root, bindex)); ++ ++out: ++ aufs_read_unlock(root, !AuLock_IR); ++ return err; ++} ++#endif ++ ++static int au_opts_parse_xino(struct super_block *sb, struct au_opt_xino *xino, ++ substring_t args[]) ++{ ++ int err; ++ struct file *file; ++ ++ file = au_xino_create(sb, args[0].from, /*silent*/0); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ ++ err = -EINVAL; ++ if (unlikely(file->f_path.dentry->d_sb == sb)) { ++ fput(file); ++ pr_err("%s must be outside\n", args[0].from); ++ goto out; ++ } ++ ++ err = 0; ++ xino->file = file; ++ xino->path = args[0].from; ++ ++out: ++ return err; ++} ++ ++static int noinline_for_stack ++au_opts_parse_xino_itrunc_path(struct super_block *sb, ++ struct au_opt_xino_itrunc *xino_itrunc, ++ substring_t args[]) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct path path; ++ struct dentry *root; ++ ++ err = vfsub_kern_path(args[0].from, lkup_dirflags, &path); ++ if (unlikely(err)) { ++ pr_err("lookup failed %s (%d)\n", args[0].from, err); ++ goto out; ++ } ++ ++ xino_itrunc->bindex = -1; ++ root = sb->s_root; ++ aufs_read_lock(root, AuLock_FLUSH); ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ if (au_h_dptr(root, bindex) == path.dentry) { ++ xino_itrunc->bindex = bindex; ++ break; ++ } ++ } ++ aufs_read_unlock(root, !AuLock_IR); ++ path_put(&path); ++ ++ if (unlikely(xino_itrunc->bindex < 0)) { ++ pr_err("no such branch %s\n", args[0].from); ++ err = -EINVAL; ++ } ++ ++out: ++ return err; ++} ++ ++/* called without aufs lock */ ++int au_opts_parse(struct super_block *sb, char *str, struct au_opts *opts) ++{ ++ int err, n, token; ++ aufs_bindex_t bindex; ++ unsigned char skipped; ++ struct dentry *root; ++ struct au_opt *opt, *opt_tail; ++ char *opt_str; ++ /* reduce the stack space */ ++ union { ++ struct au_opt_xino_itrunc *xino_itrunc; ++ struct au_opt_wbr_create *create; ++ } u; ++ struct { ++ substring_t args[MAX_OPT_ARGS]; ++ } *a; ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ root = sb->s_root; ++ err = 0; ++ bindex = 0; ++ opt = opts->opt; ++ opt_tail = opt + opts->max_opt - 1; ++ opt->type = Opt_tail; ++ while (!err && (opt_str = strsep(&str, ",")) && *opt_str) { ++ err = -EINVAL; ++ skipped = 0; ++ token = match_token(opt_str, options, a->args); ++ switch (token) { ++ case Opt_br: ++ err = 0; ++ while (!err && (opt_str = strsep(&a->args[0].from, ":")) ++ && *opt_str) { ++ err = opt_add(opt, opt_str, opts->sb_flags, ++ bindex++); ++ if (unlikely(!err && ++opt > opt_tail)) { ++ err = -E2BIG; ++ break; ++ } ++ opt->type = Opt_tail; ++ skipped = 1; ++ } ++ break; ++ case Opt_add: ++ if (unlikely(match_int(&a->args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ bindex = n; ++ err = opt_add(opt, a->args[1].from, opts->sb_flags, ++ bindex); ++ if (!err) ++ opt->type = token; ++ break; ++ case Opt_append: ++ err = opt_add(opt, a->args[0].from, opts->sb_flags, ++ /*dummy bindex*/1); ++ if (!err) ++ opt->type = token; ++ break; ++ case Opt_prepend: ++ err = opt_add(opt, a->args[0].from, opts->sb_flags, ++ /*bindex*/0); ++ if (!err) ++ opt->type = token; ++ break; ++ case Opt_del: ++ err = au_opts_parse_del(&opt->del, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++#if 0 /* reserved for future use */ ++ case Opt_idel: ++ del->pathname = "(indexed)"; ++ if (unlikely(match_int(&args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ err = au_opts_parse_idel(sb, n, &opt->del, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++#endif ++ case Opt_mod: ++ err = au_opts_parse_mod(&opt->mod, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++#ifdef IMOD /* reserved for future use */ ++ case Opt_imod: ++ u.mod->path = "(indexed)"; ++ if (unlikely(match_int(&a->args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ err = au_opts_parse_imod(sb, n, &opt->mod, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++#endif ++ case Opt_xino: ++ err = au_opts_parse_xino(sb, &opt->xino, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++ ++ case Opt_trunc_xino_path: ++ err = au_opts_parse_xino_itrunc_path ++ (sb, &opt->xino_itrunc, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++ ++ case Opt_itrunc_xino: ++ u.xino_itrunc = &opt->xino_itrunc; ++ if (unlikely(match_int(&a->args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ u.xino_itrunc->bindex = n; ++ aufs_read_lock(root, AuLock_FLUSH); ++ if (n < 0 || au_sbbot(sb) < n) { ++ pr_err("out of bounds, %d\n", n); ++ aufs_read_unlock(root, !AuLock_IR); ++ break; ++ } ++ aufs_read_unlock(root, !AuLock_IR); ++ err = 0; ++ opt->type = token; ++ break; ++ ++ case Opt_dirwh: ++ if (unlikely(match_int(&a->args[0], &opt->dirwh))) ++ break; ++ err = 0; ++ opt->type = token; ++ break; ++ ++ case Opt_rdcache: ++ if (unlikely(match_int(&a->args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ if (unlikely(n > AUFS_RDCACHE_MAX)) { ++ pr_err("rdcache must be smaller than %d\n", ++ AUFS_RDCACHE_MAX); ++ break; ++ } ++ opt->rdcache = n; ++ err = 0; ++ opt->type = token; ++ break; ++ case Opt_rdblk: ++ if (unlikely(match_int(&a->args[0], &n) ++ || n < 0 ++ || n > KMALLOC_MAX_SIZE)) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ if (unlikely(n && n < NAME_MAX)) { ++ pr_err("rdblk must be larger than %d\n", ++ NAME_MAX); ++ break; ++ } ++ opt->rdblk = n; ++ err = 0; ++ opt->type = token; ++ break; ++ case Opt_rdhash: ++ if (unlikely(match_int(&a->args[0], &n) ++ || n < 0 ++ || n * sizeof(struct hlist_head) ++ > KMALLOC_MAX_SIZE)) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ opt->rdhash = n; ++ err = 0; ++ opt->type = token; ++ break; ++ ++ case Opt_trunc_xino: ++ case Opt_notrunc_xino: ++ case Opt_noxino: ++ case Opt_trunc_xib: ++ case Opt_notrunc_xib: ++ case Opt_shwh: ++ case Opt_noshwh: ++ case Opt_dirperm1: ++ case Opt_nodirperm1: ++ case Opt_plink: ++ case Opt_noplink: ++ case Opt_list_plink: ++ case Opt_dio: ++ case Opt_nodio: ++ case Opt_diropq_a: ++ case Opt_diropq_w: ++ case Opt_warn_perm: ++ case Opt_nowarn_perm: ++ case Opt_verbose: ++ case Opt_noverbose: ++ case Opt_sum: ++ case Opt_nosum: ++ case Opt_wsum: ++ case Opt_rdblk_def: ++ case Opt_rdhash_def: ++ case Opt_dirren: ++ case Opt_nodirren: ++ case Opt_acl: ++ case Opt_noacl: ++ err = 0; ++ opt->type = token; ++ break; ++ ++ case Opt_udba: ++ opt->udba = udba_val(a->args[0].from); ++ if (opt->udba >= 0) { ++ err = 0; ++ opt->type = token; ++ } else ++ pr_err("wrong value, %s\n", opt_str); ++ break; ++ ++ case Opt_wbr_create: ++ u.create = &opt->wbr_create; ++ u.create->wbr_create ++ = au_wbr_create_val(a->args[0].from, u.create); ++ if (u.create->wbr_create >= 0) { ++ err = 0; ++ opt->type = token; ++ } else ++ pr_err("wrong value, %s\n", opt_str); ++ break; ++ case Opt_wbr_copyup: ++ opt->wbr_copyup = au_wbr_copyup_val(a->args[0].from); ++ if (opt->wbr_copyup >= 0) { ++ err = 0; ++ opt->type = token; ++ } else ++ pr_err("wrong value, %s\n", opt_str); ++ break; ++ ++ case Opt_fhsm_sec: ++ if (unlikely(match_int(&a->args[0], &n) ++ || n < 0)) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ if (sysaufs_brs) { ++ opt->fhsm_second = n; ++ opt->type = token; ++ } else ++ pr_warn("ignored %s\n", opt_str); ++ err = 0; ++ break; ++ ++ case Opt_ignore: ++ pr_warn("ignored %s\n", opt_str); ++ /*FALLTHROUGH*/ ++ case Opt_ignore_silent: ++ skipped = 1; ++ err = 0; ++ break; ++ case Opt_err: ++ pr_err("unknown option %s\n", opt_str); ++ break; ++ } ++ ++ if (!err && !skipped) { ++ if (unlikely(++opt > opt_tail)) { ++ err = -E2BIG; ++ opt--; ++ opt->type = Opt_tail; ++ break; ++ } ++ opt->type = Opt_tail; ++ } ++ } ++ ++ kfree(a); ++ dump_opts(opts); ++ if (unlikely(err)) ++ au_opts_free(opts); ++ ++out: ++ return err; ++} ++ ++static int au_opt_wbr_create(struct super_block *sb, ++ struct au_opt_wbr_create *create) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ err = 1; /* handled */ ++ sbinfo = au_sbi(sb); ++ if (sbinfo->si_wbr_create_ops->fin) { ++ err = sbinfo->si_wbr_create_ops->fin(sb); ++ if (!err) ++ err = 1; ++ } ++ ++ sbinfo->si_wbr_create = create->wbr_create; ++ sbinfo->si_wbr_create_ops = au_wbr_create_ops + create->wbr_create; ++ switch (create->wbr_create) { ++ case AuWbrCreate_MFSRRV: ++ case AuWbrCreate_MFSRR: ++ case AuWbrCreate_TDMFS: ++ case AuWbrCreate_TDMFSV: ++ case AuWbrCreate_PMFSRR: ++ case AuWbrCreate_PMFSRRV: ++ sbinfo->si_wbr_mfs.mfsrr_watermark = create->mfsrr_watermark; ++ /*FALLTHROUGH*/ ++ case AuWbrCreate_MFS: ++ case AuWbrCreate_MFSV: ++ case AuWbrCreate_PMFS: ++ case AuWbrCreate_PMFSV: ++ sbinfo->si_wbr_mfs.mfs_expire ++ = msecs_to_jiffies(create->mfs_second * MSEC_PER_SEC); ++ break; ++ } ++ ++ if (sbinfo->si_wbr_create_ops->init) ++ sbinfo->si_wbr_create_ops->init(sb); /* ignore */ ++ ++ return err; ++} ++ ++/* ++ * returns, ++ * plus: processed without an error ++ * zero: unprocessed ++ */ ++static int au_opt_simple(struct super_block *sb, struct au_opt *opt, ++ struct au_opts *opts) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ err = 1; /* handled */ ++ sbinfo = au_sbi(sb); ++ switch (opt->type) { ++ case Opt_udba: ++ sbinfo->si_mntflags &= ~AuOptMask_UDBA; ++ sbinfo->si_mntflags |= opt->udba; ++ opts->given_udba |= opt->udba; ++ break; ++ ++ case Opt_plink: ++ au_opt_set(sbinfo->si_mntflags, PLINK); ++ break; ++ case Opt_noplink: ++ if (au_opt_test(sbinfo->si_mntflags, PLINK)) ++ au_plink_put(sb, /*verbose*/1); ++ au_opt_clr(sbinfo->si_mntflags, PLINK); ++ break; ++ case Opt_list_plink: ++ if (au_opt_test(sbinfo->si_mntflags, PLINK)) ++ au_plink_list(sb); ++ break; ++ ++ case Opt_dio: ++ au_opt_set(sbinfo->si_mntflags, DIO); ++ au_fset_opts(opts->flags, REFRESH_DYAOP); ++ break; ++ case Opt_nodio: ++ au_opt_clr(sbinfo->si_mntflags, DIO); ++ au_fset_opts(opts->flags, REFRESH_DYAOP); ++ break; ++ ++ case Opt_fhsm_sec: ++ au_fhsm_set(sbinfo, opt->fhsm_second); ++ break; ++ ++ case Opt_diropq_a: ++ au_opt_set(sbinfo->si_mntflags, ALWAYS_DIROPQ); ++ break; ++ case Opt_diropq_w: ++ au_opt_clr(sbinfo->si_mntflags, ALWAYS_DIROPQ); ++ break; ++ ++ case Opt_warn_perm: ++ au_opt_set(sbinfo->si_mntflags, WARN_PERM); ++ break; ++ case Opt_nowarn_perm: ++ au_opt_clr(sbinfo->si_mntflags, WARN_PERM); ++ break; ++ ++ case Opt_verbose: ++ au_opt_set(sbinfo->si_mntflags, VERBOSE); ++ break; ++ case Opt_noverbose: ++ au_opt_clr(sbinfo->si_mntflags, VERBOSE); ++ break; ++ ++ case Opt_sum: ++ au_opt_set(sbinfo->si_mntflags, SUM); ++ break; ++ case Opt_wsum: ++ au_opt_clr(sbinfo->si_mntflags, SUM); ++ au_opt_set(sbinfo->si_mntflags, SUM_W); ++ case Opt_nosum: ++ au_opt_clr(sbinfo->si_mntflags, SUM); ++ au_opt_clr(sbinfo->si_mntflags, SUM_W); ++ break; ++ ++ case Opt_wbr_create: ++ err = au_opt_wbr_create(sb, &opt->wbr_create); ++ break; ++ case Opt_wbr_copyup: ++ sbinfo->si_wbr_copyup = opt->wbr_copyup; ++ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + opt->wbr_copyup; ++ break; ++ ++ case Opt_dirwh: ++ sbinfo->si_dirwh = opt->dirwh; ++ break; ++ ++ case Opt_rdcache: ++ sbinfo->si_rdcache ++ = msecs_to_jiffies(opt->rdcache * MSEC_PER_SEC); ++ break; ++ case Opt_rdblk: ++ sbinfo->si_rdblk = opt->rdblk; ++ break; ++ case Opt_rdblk_def: ++ sbinfo->si_rdblk = AUFS_RDBLK_DEF; ++ break; ++ case Opt_rdhash: ++ sbinfo->si_rdhash = opt->rdhash; ++ break; ++ case Opt_rdhash_def: ++ sbinfo->si_rdhash = AUFS_RDHASH_DEF; ++ break; ++ ++ case Opt_shwh: ++ au_opt_set(sbinfo->si_mntflags, SHWH); ++ break; ++ case Opt_noshwh: ++ au_opt_clr(sbinfo->si_mntflags, SHWH); ++ break; ++ ++ case Opt_dirperm1: ++ au_opt_set(sbinfo->si_mntflags, DIRPERM1); ++ break; ++ case Opt_nodirperm1: ++ au_opt_clr(sbinfo->si_mntflags, DIRPERM1); ++ break; ++ ++ case Opt_trunc_xino: ++ au_opt_set(sbinfo->si_mntflags, TRUNC_XINO); ++ break; ++ case Opt_notrunc_xino: ++ au_opt_clr(sbinfo->si_mntflags, TRUNC_XINO); ++ break; ++ ++ case Opt_trunc_xino_path: ++ case Opt_itrunc_xino: ++ err = au_xino_trunc(sb, opt->xino_itrunc.bindex, ++ /*idx_begin*/0); ++ if (!err) ++ err = 1; ++ break; ++ ++ case Opt_trunc_xib: ++ au_fset_opts(opts->flags, TRUNC_XIB); ++ break; ++ case Opt_notrunc_xib: ++ au_fclr_opts(opts->flags, TRUNC_XIB); ++ break; ++ ++ case Opt_dirren: ++ err = 1; ++ if (!au_opt_test(sbinfo->si_mntflags, DIRREN)) { ++ err = au_dr_opt_set(sb); ++ if (!err) ++ err = 1; ++ } ++ if (err == 1) ++ au_opt_set(sbinfo->si_mntflags, DIRREN); ++ break; ++ case Opt_nodirren: ++ err = 1; ++ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) { ++ err = au_dr_opt_clr(sb, au_ftest_opts(opts->flags, ++ DR_FLUSHED)); ++ if (!err) ++ err = 1; ++ } ++ if (err == 1) ++ au_opt_clr(sbinfo->si_mntflags, DIRREN); ++ break; ++ ++ case Opt_acl: ++ sb->s_flags |= SB_POSIXACL; ++ break; ++ case Opt_noacl: ++ sb->s_flags &= ~SB_POSIXACL; ++ break; ++ ++ default: ++ err = 0; ++ break; ++ } ++ ++ return err; ++} ++ ++/* ++ * returns tri-state. ++ * plus: processed without an error ++ * zero: unprocessed ++ * minus: error ++ */ ++static int au_opt_br(struct super_block *sb, struct au_opt *opt, ++ struct au_opts *opts) ++{ ++ int err, do_refresh; ++ ++ err = 0; ++ switch (opt->type) { ++ case Opt_append: ++ opt->add.bindex = au_sbbot(sb) + 1; ++ if (opt->add.bindex < 0) ++ opt->add.bindex = 0; ++ goto add; ++ case Opt_prepend: ++ opt->add.bindex = 0; ++ add: /* indented label */ ++ case Opt_add: ++ err = au_br_add(sb, &opt->add, ++ au_ftest_opts(opts->flags, REMOUNT)); ++ if (!err) { ++ err = 1; ++ au_fset_opts(opts->flags, REFRESH); ++ } ++ break; ++ ++ case Opt_del: ++ case Opt_idel: ++ err = au_br_del(sb, &opt->del, ++ au_ftest_opts(opts->flags, REMOUNT)); ++ if (!err) { ++ err = 1; ++ au_fset_opts(opts->flags, TRUNC_XIB); ++ au_fset_opts(opts->flags, REFRESH); ++ } ++ break; ++ ++ case Opt_mod: ++ case Opt_imod: ++ err = au_br_mod(sb, &opt->mod, ++ au_ftest_opts(opts->flags, REMOUNT), ++ &do_refresh); ++ if (!err) { ++ err = 1; ++ if (do_refresh) ++ au_fset_opts(opts->flags, REFRESH); ++ } ++ break; ++ } ++ return err; ++} ++ ++static int au_opt_xino(struct super_block *sb, struct au_opt *opt, ++ struct au_opt_xino **opt_xino, ++ struct au_opts *opts) ++{ ++ int err; ++ ++ err = 0; ++ switch (opt->type) { ++ case Opt_xino: ++ err = au_xino_set(sb, &opt->xino, ++ !!au_ftest_opts(opts->flags, REMOUNT)); ++ if (unlikely(err)) ++ break; ++ ++ *opt_xino = &opt->xino; ++ break; ++ ++ case Opt_noxino: ++ au_xino_clr(sb); ++ *opt_xino = (void *)-1; ++ break; ++ } ++ ++ return err; ++} ++ ++int au_opts_verify(struct super_block *sb, unsigned long sb_flags, ++ unsigned int pending) ++{ ++ int err, fhsm; ++ aufs_bindex_t bindex, bbot; ++ unsigned char do_plink, skip, do_free, can_no_dreval; ++ struct au_branch *br; ++ struct au_wbr *wbr; ++ struct dentry *root, *dentry; ++ struct inode *dir, *h_dir; ++ struct au_sbinfo *sbinfo; ++ struct au_hinode *hdir; ++ ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!(sbinfo->si_mntflags & AuOptMask_UDBA)); ++ ++ if (!(sb_flags & SB_RDONLY)) { ++ if (unlikely(!au_br_writable(au_sbr_perm(sb, 0)))) ++ pr_warn("first branch should be rw\n"); ++ if (unlikely(au_opt_test(sbinfo->si_mntflags, SHWH))) ++ pr_warn_once("shwh should be used with ro\n"); ++ } ++ ++ if (au_opt_test((sbinfo->si_mntflags | pending), UDBA_HNOTIFY) ++ && !au_opt_test(sbinfo->si_mntflags, XINO)) ++ pr_warn_once("udba=*notify requires xino\n"); ++ ++ if (au_opt_test(sbinfo->si_mntflags, DIRPERM1)) ++ pr_warn_once("dirperm1 breaks the protection" ++ " by the permission bits on the lower branch\n"); ++ ++ err = 0; ++ fhsm = 0; ++ root = sb->s_root; ++ dir = d_inode(root); ++ do_plink = !!au_opt_test(sbinfo->si_mntflags, PLINK); ++ can_no_dreval = !!au_opt_test((sbinfo->si_mntflags | pending), ++ UDBA_NONE); ++ bbot = au_sbbot(sb); ++ for (bindex = 0; !err && bindex <= bbot; bindex++) { ++ skip = 0; ++ h_dir = au_h_iptr(dir, bindex); ++ br = au_sbr(sb, bindex); ++ ++ if ((br->br_perm & AuBrAttr_ICEX) ++ && !h_dir->i_op->listxattr) ++ br->br_perm &= ~AuBrAttr_ICEX; ++#if 0 ++ if ((br->br_perm & AuBrAttr_ICEX_SEC) ++ && (au_br_sb(br)->s_flags & SB_NOSEC)) ++ br->br_perm &= ~AuBrAttr_ICEX_SEC; ++#endif ++ ++ do_free = 0; ++ wbr = br->br_wbr; ++ if (wbr) ++ wbr_wh_read_lock(wbr); ++ ++ if (!au_br_writable(br->br_perm)) { ++ do_free = !!wbr; ++ skip = (!wbr ++ || (!wbr->wbr_whbase ++ && !wbr->wbr_plink ++ && !wbr->wbr_orph)); ++ } else if (!au_br_wh_linkable(br->br_perm)) { ++ /* skip = (!br->br_whbase && !br->br_orph); */ ++ skip = (!wbr || !wbr->wbr_whbase); ++ if (skip && wbr) { ++ if (do_plink) ++ skip = !!wbr->wbr_plink; ++ else ++ skip = !wbr->wbr_plink; ++ } ++ } else { ++ /* skip = (br->br_whbase && br->br_ohph); */ ++ skip = (wbr && wbr->wbr_whbase); ++ if (skip) { ++ if (do_plink) ++ skip = !!wbr->wbr_plink; ++ else ++ skip = !wbr->wbr_plink; ++ } ++ } ++ if (wbr) ++ wbr_wh_read_unlock(wbr); ++ ++ if (can_no_dreval) { ++ dentry = br->br_path.dentry; ++ spin_lock(&dentry->d_lock); ++ if (dentry->d_flags & ++ (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE)) ++ can_no_dreval = 0; ++ spin_unlock(&dentry->d_lock); ++ } ++ ++ if (au_br_fhsm(br->br_perm)) { ++ fhsm++; ++ AuDebugOn(!br->br_fhsm); ++ } ++ ++ if (skip) ++ continue; ++ ++ hdir = au_hi(dir, bindex); ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ if (wbr) ++ wbr_wh_write_lock(wbr); ++ err = au_wh_init(br, sb); ++ if (wbr) ++ wbr_wh_write_unlock(wbr); ++ au_hn_inode_unlock(hdir); ++ ++ if (!err && do_free) { ++ kfree(wbr); ++ br->br_wbr = NULL; ++ } ++ } ++ ++ if (can_no_dreval) ++ au_fset_si(sbinfo, NO_DREVAL); ++ else ++ au_fclr_si(sbinfo, NO_DREVAL); ++ ++ if (fhsm >= 2) { ++ au_fset_si(sbinfo, FHSM); ++ for (bindex = bbot; bindex >= 0; bindex--) { ++ br = au_sbr(sb, bindex); ++ if (au_br_fhsm(br->br_perm)) { ++ au_fhsm_set_bottom(sb, bindex); ++ break; ++ } ++ } ++ } else { ++ au_fclr_si(sbinfo, FHSM); ++ au_fhsm_set_bottom(sb, -1); ++ } ++ ++ return err; ++} ++ ++int au_opts_mount(struct super_block *sb, struct au_opts *opts) ++{ ++ int err; ++ unsigned int tmp; ++ aufs_bindex_t bindex, bbot; ++ struct au_opt *opt; ++ struct au_opt_xino *opt_xino, xino; ++ struct au_sbinfo *sbinfo; ++ struct au_branch *br; ++ struct inode *dir; ++ ++ SiMustWriteLock(sb); ++ ++ err = 0; ++ opt_xino = NULL; ++ opt = opts->opt; ++ while (err >= 0 && opt->type != Opt_tail) ++ err = au_opt_simple(sb, opt++, opts); ++ if (err > 0) ++ err = 0; ++ else if (unlikely(err < 0)) ++ goto out; ++ ++ /* disable xino and udba temporary */ ++ sbinfo = au_sbi(sb); ++ tmp = sbinfo->si_mntflags; ++ au_opt_clr(sbinfo->si_mntflags, XINO); ++ au_opt_set_udba(sbinfo->si_mntflags, UDBA_REVAL); ++ ++ opt = opts->opt; ++ while (err >= 0 && opt->type != Opt_tail) ++ err = au_opt_br(sb, opt++, opts); ++ if (err > 0) ++ err = 0; ++ else if (unlikely(err < 0)) ++ goto out; ++ ++ bbot = au_sbbot(sb); ++ if (unlikely(bbot < 0)) { ++ err = -EINVAL; ++ pr_err("no branches\n"); ++ goto out; ++ } ++ ++ if (au_opt_test(tmp, XINO)) ++ au_opt_set(sbinfo->si_mntflags, XINO); ++ opt = opts->opt; ++ while (!err && opt->type != Opt_tail) ++ err = au_opt_xino(sb, opt++, &opt_xino, opts); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_opts_verify(sb, sb->s_flags, tmp); ++ if (unlikely(err)) ++ goto out; ++ ++ /* restore xino */ ++ if (au_opt_test(tmp, XINO) && !opt_xino) { ++ xino.file = au_xino_def(sb); ++ err = PTR_ERR(xino.file); ++ if (IS_ERR(xino.file)) ++ goto out; ++ ++ err = au_xino_set(sb, &xino, /*remount*/0); ++ fput(xino.file); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ /* restore udba */ ++ tmp &= AuOptMask_UDBA; ++ sbinfo->si_mntflags &= ~AuOptMask_UDBA; ++ sbinfo->si_mntflags |= tmp; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ err = au_hnotify_reset_br(tmp, br, br->br_perm); ++ if (unlikely(err)) ++ AuIOErr("hnotify failed on br %d, %d, ignored\n", ++ bindex, err); ++ /* go on even if err */ ++ } ++ if (au_opt_test(tmp, UDBA_HNOTIFY)) { ++ dir = d_inode(sb->s_root); ++ au_hn_reset(dir, au_hi_flags(dir, /*isdir*/1) & ~AuHi_XINO); ++ } ++ ++out: ++ return err; ++} ++ ++int au_opts_remount(struct super_block *sb, struct au_opts *opts) ++{ ++ int err, rerr; ++ unsigned char no_dreval; ++ struct inode *dir; ++ struct au_opt_xino *opt_xino; ++ struct au_opt *opt; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ err = au_dr_opt_flush(sb); ++ if (unlikely(err)) ++ goto out; ++ au_fset_opts(opts->flags, DR_FLUSHED); ++ ++ dir = d_inode(sb->s_root); ++ sbinfo = au_sbi(sb); ++ opt_xino = NULL; ++ opt = opts->opt; ++ while (err >= 0 && opt->type != Opt_tail) { ++ err = au_opt_simple(sb, opt, opts); ++ if (!err) ++ err = au_opt_br(sb, opt, opts); ++ if (!err) ++ err = au_opt_xino(sb, opt, &opt_xino, opts); ++ opt++; ++ } ++ if (err > 0) ++ err = 0; ++ AuTraceErr(err); ++ /* go on even err */ ++ ++ no_dreval = !!au_ftest_si(sbinfo, NO_DREVAL); ++ rerr = au_opts_verify(sb, opts->sb_flags, /*pending*/0); ++ if (unlikely(rerr && !err)) ++ err = rerr; ++ ++ if (no_dreval != !!au_ftest_si(sbinfo, NO_DREVAL)) ++ au_fset_opts(opts->flags, REFRESH_IDOP); ++ ++ if (au_ftest_opts(opts->flags, TRUNC_XIB)) { ++ rerr = au_xib_trunc(sb); ++ if (unlikely(rerr && !err)) ++ err = rerr; ++ } ++ ++ /* will be handled by the caller */ ++ if (!au_ftest_opts(opts->flags, REFRESH) ++ && (opts->given_udba ++ || au_opt_test(sbinfo->si_mntflags, XINO) ++ || au_ftest_opts(opts->flags, REFRESH_IDOP) ++ )) ++ au_fset_opts(opts->flags, REFRESH); ++ ++ AuDbg("status 0x%x\n", opts->flags); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++unsigned int au_opt_udba(struct super_block *sb) ++{ ++ return au_mntflags(sb) & AuOptMask_UDBA; ++} +diff --git a/fs/aufs/opts.h b/fs/aufs/opts.h +new file mode 100644 +index 000000000000..8e21acc3f18b +--- /dev/null ++++ b/fs/aufs/opts.h +@@ -0,0 +1,212 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * mount options/flags ++ */ ++ ++#ifndef __AUFS_OPTS_H__ ++#define __AUFS_OPTS_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++struct file; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* mount flags */ ++#define AuOpt_XINO 1 /* external inode number bitmap ++ and translation table */ ++#define AuOpt_TRUNC_XINO (1 << 1) /* truncate xino files */ ++#define AuOpt_UDBA_NONE (1 << 2) /* users direct branch access */ ++#define AuOpt_UDBA_REVAL (1 << 3) ++#define AuOpt_UDBA_HNOTIFY (1 << 4) ++#define AuOpt_SHWH (1 << 5) /* show whiteout */ ++#define AuOpt_PLINK (1 << 6) /* pseudo-link */ ++#define AuOpt_DIRPERM1 (1 << 7) /* ignore the lower dir's perm ++ bits */ ++#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */ ++#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */ ++#define AuOpt_SUM_W (1 << 11) /* unimplemented */ ++#define AuOpt_WARN_PERM (1 << 12) /* warn when add-branch */ ++#define AuOpt_VERBOSE (1 << 13) /* busy inode when del-branch */ ++#define AuOpt_DIO (1 << 14) /* direct io */ ++#define AuOpt_DIRREN (1 << 15) /* directory rename */ ++ ++#ifndef CONFIG_AUFS_HNOTIFY ++#undef AuOpt_UDBA_HNOTIFY ++#define AuOpt_UDBA_HNOTIFY 0 ++#endif ++#ifndef CONFIG_AUFS_DIRREN ++#undef AuOpt_DIRREN ++#define AuOpt_DIRREN 0 ++#endif ++#ifndef CONFIG_AUFS_SHWH ++#undef AuOpt_SHWH ++#define AuOpt_SHWH 0 ++#endif ++ ++#define AuOpt_Def (AuOpt_XINO \ ++ | AuOpt_UDBA_REVAL \ ++ | AuOpt_PLINK \ ++ /* | AuOpt_DIRPERM1 */ \ ++ | AuOpt_WARN_PERM) ++#define AuOptMask_UDBA (AuOpt_UDBA_NONE \ ++ | AuOpt_UDBA_REVAL \ ++ | AuOpt_UDBA_HNOTIFY) ++ ++#define au_opt_test(flags, name) (flags & AuOpt_##name) ++#define au_opt_set(flags, name) do { \ ++ BUILD_BUG_ON(AuOpt_##name & AuOptMask_UDBA); \ ++ ((flags) |= AuOpt_##name); \ ++} while (0) ++#define au_opt_set_udba(flags, name) do { \ ++ (flags) &= ~AuOptMask_UDBA; \ ++ ((flags) |= AuOpt_##name); \ ++} while (0) ++#define au_opt_clr(flags, name) do { \ ++ ((flags) &= ~AuOpt_##name); \ ++} while (0) ++ ++static inline unsigned int au_opts_plink(unsigned int mntflags) ++{ ++#ifdef CONFIG_PROC_FS ++ return mntflags; ++#else ++ return mntflags & ~AuOpt_PLINK; ++#endif ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* policies to select one among multiple writable branches */ ++enum { ++ AuWbrCreate_TDP, /* top down parent */ ++ AuWbrCreate_RR, /* round robin */ ++ AuWbrCreate_MFS, /* most free space */ ++ AuWbrCreate_MFSV, /* mfs with seconds */ ++ AuWbrCreate_MFSRR, /* mfs then rr */ ++ AuWbrCreate_MFSRRV, /* mfs then rr with seconds */ ++ AuWbrCreate_TDMFS, /* top down regardless parent and mfs */ ++ AuWbrCreate_TDMFSV, /* top down regardless parent and mfs */ ++ AuWbrCreate_PMFS, /* parent and mfs */ ++ AuWbrCreate_PMFSV, /* parent and mfs with seconds */ ++ AuWbrCreate_PMFSRR, /* parent, mfs and round-robin */ ++ AuWbrCreate_PMFSRRV, /* plus seconds */ ++ ++ AuWbrCreate_Def = AuWbrCreate_TDP ++}; ++ ++enum { ++ AuWbrCopyup_TDP, /* top down parent */ ++ AuWbrCopyup_BUP, /* bottom up parent */ ++ AuWbrCopyup_BU, /* bottom up */ ++ ++ AuWbrCopyup_Def = AuWbrCopyup_TDP ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_opt_add { ++ aufs_bindex_t bindex; ++ char *pathname; ++ int perm; ++ struct path path; ++}; ++ ++struct au_opt_del { ++ char *pathname; ++ struct path h_path; ++}; ++ ++struct au_opt_mod { ++ char *path; ++ int perm; ++ struct dentry *h_root; ++}; ++ ++struct au_opt_xino { ++ char *path; ++ struct file *file; ++}; ++ ++struct au_opt_xino_itrunc { ++ aufs_bindex_t bindex; ++}; ++ ++struct au_opt_wbr_create { ++ int wbr_create; ++ int mfs_second; ++ unsigned long long mfsrr_watermark; ++}; ++ ++struct au_opt { ++ int type; ++ union { ++ struct au_opt_xino xino; ++ struct au_opt_xino_itrunc xino_itrunc; ++ struct au_opt_add add; ++ struct au_opt_del del; ++ struct au_opt_mod mod; ++ int dirwh; ++ int rdcache; ++ unsigned int rdblk; ++ unsigned int rdhash; ++ int udba; ++ struct au_opt_wbr_create wbr_create; ++ int wbr_copyup; ++ unsigned int fhsm_second; ++ }; ++}; ++ ++/* opts flags */ ++#define AuOpts_REMOUNT 1 ++#define AuOpts_REFRESH (1 << 1) ++#define AuOpts_TRUNC_XIB (1 << 2) ++#define AuOpts_REFRESH_DYAOP (1 << 3) ++#define AuOpts_REFRESH_IDOP (1 << 4) ++#define AuOpts_DR_FLUSHED (1 << 5) ++#define au_ftest_opts(flags, name) ((flags) & AuOpts_##name) ++#define au_fset_opts(flags, name) \ ++ do { (flags) |= AuOpts_##name; } while (0) ++#define au_fclr_opts(flags, name) \ ++ do { (flags) &= ~AuOpts_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_DIRREN ++#undef AuOpts_DR_FLUSHED ++#define AuOpts_DR_FLUSHED 0 ++#endif ++ ++struct au_opts { ++ struct au_opt *opt; ++ int max_opt; ++ ++ unsigned int given_udba; ++ unsigned int flags; ++ unsigned long sb_flags; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* opts.c */ ++void au_optstr_br_perm(au_br_perm_str_t *str, int perm); ++const char *au_optstr_udba(int udba); ++const char *au_optstr_wbr_copyup(int wbr_copyup); ++const char *au_optstr_wbr_create(int wbr_create); ++ ++void au_opts_free(struct au_opts *opts); ++struct super_block; ++int au_opts_parse(struct super_block *sb, char *str, struct au_opts *opts); ++int au_opts_verify(struct super_block *sb, unsigned long sb_flags, ++ unsigned int pending); ++int au_opts_mount(struct super_block *sb, struct au_opts *opts); ++int au_opts_remount(struct super_block *sb, struct au_opts *opts); ++ ++unsigned int au_opt_udba(struct super_block *sb); ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_OPTS_H__ */ +diff --git a/fs/aufs/plink.c b/fs/aufs/plink.c +new file mode 100644 +index 000000000000..3dfd0296d42e +--- /dev/null ++++ b/fs/aufs/plink.c +@@ -0,0 +1,503 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * pseudo-link ++ */ ++ ++#include "aufs.h" ++ ++/* ++ * the pseudo-link maintenance mode. ++ * during a user process maintains the pseudo-links, ++ * prohibit adding a new plink and branch manipulation. ++ * ++ * Flags ++ * NOPLM: ++ * For entry functions which will handle plink, and i_mutex is already held ++ * in VFS. ++ * They cannot wait and should return an error at once. ++ * Callers has to check the error. ++ * NOPLMW: ++ * For entry functions which will handle plink, but i_mutex is not held ++ * in VFS. ++ * They can wait the plink maintenance mode to finish. ++ * ++ * They behave like F_SETLK and F_SETLKW. ++ * If the caller never handle plink, then both flags are unnecessary. ++ */ ++ ++int au_plink_maint(struct super_block *sb, int flags) ++{ ++ int err; ++ pid_t pid, ppid; ++ struct task_struct *parent, *prev; ++ struct au_sbinfo *sbi; ++ ++ SiMustAnyLock(sb); ++ ++ err = 0; ++ if (!au_opt_test(au_mntflags(sb), PLINK)) ++ goto out; ++ ++ sbi = au_sbi(sb); ++ pid = sbi->si_plink_maint_pid; ++ if (!pid || pid == current->pid) ++ goto out; ++ ++ /* todo: it highly depends upon /sbin/mount.aufs */ ++ prev = NULL; ++ parent = current; ++ ppid = 0; ++ rcu_read_lock(); ++ while (1) { ++ parent = rcu_dereference(parent->real_parent); ++ if (parent == prev) ++ break; ++ ppid = task_pid_vnr(parent); ++ if (pid == ppid) { ++ rcu_read_unlock(); ++ goto out; ++ } ++ prev = parent; ++ } ++ rcu_read_unlock(); ++ ++ if (au_ftest_lock(flags, NOPLMW)) { ++ /* if there is no i_mutex lock in VFS, we don't need to wait */ ++ /* AuDebugOn(!lockdep_depth(current)); */ ++ while (sbi->si_plink_maint_pid) { ++ si_read_unlock(sb); ++ /* gave up wake_up_bit() */ ++ wait_event(sbi->si_plink_wq, !sbi->si_plink_maint_pid); ++ ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&sbi->si_nowait); ++ si_noflush_read_lock(sb); ++ } ++ } else if (au_ftest_lock(flags, NOPLM)) { ++ AuDbg("ppid %d, pid %d\n", ppid, pid); ++ err = -EAGAIN; ++ } ++ ++out: ++ return err; ++} ++ ++void au_plink_maint_leave(struct au_sbinfo *sbinfo) ++{ ++ spin_lock(&sbinfo->si_plink_maint_lock); ++ sbinfo->si_plink_maint_pid = 0; ++ spin_unlock(&sbinfo->si_plink_maint_lock); ++ wake_up_all(&sbinfo->si_plink_wq); ++} ++ ++int au_plink_maint_enter(struct super_block *sb) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ /* make sure i am the only one in this fs */ ++ si_write_lock(sb, AuLock_FLUSH); ++ if (au_opt_test(au_mntflags(sb), PLINK)) { ++ spin_lock(&sbinfo->si_plink_maint_lock); ++ if (!sbinfo->si_plink_maint_pid) ++ sbinfo->si_plink_maint_pid = current->pid; ++ else ++ err = -EBUSY; ++ spin_unlock(&sbinfo->si_plink_maint_lock); ++ } ++ si_write_unlock(sb); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_DEBUG ++void au_plink_list(struct super_block *sb) ++{ ++ int i; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_icntnr *icntnr; ++ ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); ++ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); ++ ++ for (i = 0; i < AuPlink_NHASH; i++) { ++ hbl = sbinfo->si_plink + i; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) ++ AuDbg("%lu\n", icntnr->vfs_inode.i_ino); ++ hlist_bl_unlock(hbl); ++ } ++} ++#endif ++ ++/* is the inode pseudo-linked? */ ++int au_plink_test(struct inode *inode) ++{ ++ int found, i; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_icntnr *icntnr; ++ ++ sbinfo = au_sbi(inode->i_sb); ++ AuRwMustAnyLock(&sbinfo->si_rwsem); ++ AuDebugOn(!au_opt_test(au_mntflags(inode->i_sb), PLINK)); ++ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); ++ ++ found = 0; ++ i = au_plink_hash(inode->i_ino); ++ hbl = sbinfo->si_plink + i; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) ++ if (&icntnr->vfs_inode == inode) { ++ found = 1; ++ break; ++ } ++ hlist_bl_unlock(hbl); ++ return found; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * generate a name for plink. ++ * the file will be stored under AUFS_WH_PLINKDIR. ++ */ ++/* 20 is max digits length of ulong 64 */ ++#define PLINK_NAME_LEN ((20 + 1) * 2) ++ ++static int plink_name(char *name, int len, struct inode *inode, ++ aufs_bindex_t bindex) ++{ ++ int rlen; ++ struct inode *h_inode; ++ ++ h_inode = au_h_iptr(inode, bindex); ++ rlen = snprintf(name, len, "%lu.%lu", inode->i_ino, h_inode->i_ino); ++ return rlen; ++} ++ ++struct au_do_plink_lkup_args { ++ struct dentry **errp; ++ struct qstr *tgtname; ++ struct dentry *h_parent; ++ struct au_branch *br; ++}; ++ ++static struct dentry *au_do_plink_lkup(struct qstr *tgtname, ++ struct dentry *h_parent, ++ struct au_branch *br) ++{ ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ ++ h_inode = d_inode(h_parent); ++ inode_lock_shared_nested(h_inode, AuLsc_I_CHILD2); ++ h_dentry = vfsub_lkup_one(tgtname, h_parent); ++ inode_unlock_shared(h_inode); ++ return h_dentry; ++} ++ ++static void au_call_do_plink_lkup(void *args) ++{ ++ struct au_do_plink_lkup_args *a = args; ++ *a->errp = au_do_plink_lkup(a->tgtname, a->h_parent, a->br); ++} ++ ++/* lookup the plink-ed @inode under the branch at @bindex */ ++struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex) ++{ ++ struct dentry *h_dentry, *h_parent; ++ struct au_branch *br; ++ int wkq_err; ++ char a[PLINK_NAME_LEN]; ++ struct qstr tgtname = QSTR_INIT(a, 0); ++ ++ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); ++ ++ br = au_sbr(inode->i_sb, bindex); ++ h_parent = br->br_wbr->wbr_plink; ++ tgtname.len = plink_name(a, sizeof(a), inode, bindex); ++ ++ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) { ++ struct au_do_plink_lkup_args args = { ++ .errp = &h_dentry, ++ .tgtname = &tgtname, ++ .h_parent = h_parent, ++ .br = br ++ }; ++ ++ wkq_err = au_wkq_wait(au_call_do_plink_lkup, &args); ++ if (unlikely(wkq_err)) ++ h_dentry = ERR_PTR(wkq_err); ++ } else ++ h_dentry = au_do_plink_lkup(&tgtname, h_parent, br); ++ ++ return h_dentry; ++} ++ ++/* create a pseudo-link */ ++static int do_whplink(struct qstr *tgt, struct dentry *h_parent, ++ struct dentry *h_dentry, struct au_branch *br) ++{ ++ int err; ++ struct path h_path = { ++ .mnt = au_br_mnt(br) ++ }; ++ struct inode *h_dir, *delegated; ++ ++ h_dir = d_inode(h_parent); ++ inode_lock_nested(h_dir, AuLsc_I_CHILD2); ++again: ++ h_path.dentry = vfsub_lkup_one(tgt, h_parent); ++ err = PTR_ERR(h_path.dentry); ++ if (IS_ERR(h_path.dentry)) ++ goto out; ++ ++ err = 0; ++ /* wh.plink dir is not monitored */ ++ /* todo: is it really safe? */ ++ if (d_is_positive(h_path.dentry) ++ && d_inode(h_path.dentry) != d_inode(h_dentry)) { ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, &h_path, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ dput(h_path.dentry); ++ h_path.dentry = NULL; ++ if (!err) ++ goto again; ++ } ++ if (!err && d_is_negative(h_path.dentry)) { ++ delegated = NULL; ++ err = vfsub_link(h_dentry, h_dir, &h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ } ++ dput(h_path.dentry); ++ ++out: ++ inode_unlock(h_dir); ++ return err; ++} ++ ++struct do_whplink_args { ++ int *errp; ++ struct qstr *tgt; ++ struct dentry *h_parent; ++ struct dentry *h_dentry; ++ struct au_branch *br; ++}; ++ ++static void call_do_whplink(void *args) ++{ ++ struct do_whplink_args *a = args; ++ *a->errp = do_whplink(a->tgt, a->h_parent, a->h_dentry, a->br); ++} ++ ++static int whplink(struct dentry *h_dentry, struct inode *inode, ++ aufs_bindex_t bindex, struct au_branch *br) ++{ ++ int err, wkq_err; ++ struct au_wbr *wbr; ++ struct dentry *h_parent; ++ char a[PLINK_NAME_LEN]; ++ struct qstr tgtname = QSTR_INIT(a, 0); ++ ++ wbr = au_sbr(inode->i_sb, bindex)->br_wbr; ++ h_parent = wbr->wbr_plink; ++ tgtname.len = plink_name(a, sizeof(a), inode, bindex); ++ ++ /* always superio. */ ++ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) { ++ struct do_whplink_args args = { ++ .errp = &err, ++ .tgt = &tgtname, ++ .h_parent = h_parent, ++ .h_dentry = h_dentry, ++ .br = br ++ }; ++ wkq_err = au_wkq_wait(call_do_whplink, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } else ++ err = do_whplink(&tgtname, h_parent, h_dentry, br); ++ ++ return err; ++} ++ ++/* ++ * create a new pseudo-link for @h_dentry on @bindex. ++ * the linked inode is held in aufs @inode. ++ */ ++void au_plink_append(struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_dentry) ++{ ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_icntnr *icntnr; ++ int found, err, cnt, i; ++ ++ sb = inode->i_sb; ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); ++ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); ++ ++ found = au_plink_test(inode); ++ if (found) ++ return; ++ ++ i = au_plink_hash(inode->i_ino); ++ hbl = sbinfo->si_plink + i; ++ au_igrab(inode); ++ ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) { ++ if (&icntnr->vfs_inode == inode) { ++ found = 1; ++ break; ++ } ++ } ++ if (!found) { ++ icntnr = container_of(inode, struct au_icntnr, vfs_inode); ++ hlist_bl_add_head(&icntnr->plink, hbl); ++ } ++ hlist_bl_unlock(hbl); ++ if (!found) { ++ cnt = au_hbl_count(hbl); ++#define msg "unexpectedly unbalanced or too many pseudo-links" ++ if (cnt > AUFS_PLINK_WARN) ++ AuWarn1(msg ", %d\n", cnt); ++#undef msg ++ err = whplink(h_dentry, inode, bindex, au_sbr(sb, bindex)); ++ if (unlikely(err)) { ++ pr_warn("err %d, damaged pseudo link.\n", err); ++ au_hbl_del(&icntnr->plink, hbl); ++ iput(&icntnr->vfs_inode); ++ } ++ } else ++ iput(&icntnr->vfs_inode); ++} ++ ++/* free all plinks */ ++void au_plink_put(struct super_block *sb, int verbose) ++{ ++ int i, warned; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos, *tmp; ++ struct au_icntnr *icntnr; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); ++ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); ++ ++ /* no spin_lock since sbinfo is write-locked */ ++ warned = 0; ++ for (i = 0; i < AuPlink_NHASH; i++) { ++ hbl = sbinfo->si_plink + i; ++ if (!warned && verbose && !hlist_bl_empty(hbl)) { ++ pr_warn("pseudo-link is not flushed"); ++ warned = 1; ++ } ++ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) ++ iput(&icntnr->vfs_inode); ++ INIT_HLIST_BL_HEAD(hbl); ++ } ++} ++ ++void au_plink_clean(struct super_block *sb, int verbose) ++{ ++ struct dentry *root; ++ ++ root = sb->s_root; ++ aufs_write_lock(root); ++ if (au_opt_test(au_mntflags(sb), PLINK)) ++ au_plink_put(sb, verbose); ++ aufs_write_unlock(root); ++} ++ ++static int au_plink_do_half_refresh(struct inode *inode, aufs_bindex_t br_id) ++{ ++ int do_put; ++ aufs_bindex_t btop, bbot, bindex; ++ ++ do_put = 0; ++ btop = au_ibtop(inode); ++ bbot = au_ibbot(inode); ++ if (btop >= 0) { ++ for (bindex = btop; bindex <= bbot; bindex++) { ++ if (!au_h_iptr(inode, bindex) ++ || au_ii_br_id(inode, bindex) != br_id) ++ continue; ++ au_set_h_iptr(inode, bindex, NULL, 0); ++ do_put = 1; ++ break; ++ } ++ if (do_put) ++ for (bindex = btop; bindex <= bbot; bindex++) ++ if (au_h_iptr(inode, bindex)) { ++ do_put = 0; ++ break; ++ } ++ } else ++ do_put = 1; ++ ++ return do_put; ++} ++ ++/* free the plinks on a branch specified by @br_id */ ++void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id) ++{ ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos, *tmp; ++ struct au_icntnr *icntnr; ++ struct inode *inode; ++ int i, do_put; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); ++ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); ++ ++ /* no bit_lock since sbinfo is write-locked */ ++ for (i = 0; i < AuPlink_NHASH; i++) { ++ hbl = sbinfo->si_plink + i; ++ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) { ++ inode = au_igrab(&icntnr->vfs_inode); ++ ii_write_lock_child(inode); ++ do_put = au_plink_do_half_refresh(inode, br_id); ++ if (do_put) { ++ hlist_bl_del(&icntnr->plink); ++ iput(inode); ++ } ++ ii_write_unlock(inode); ++ iput(inode); ++ } ++ } ++} +diff --git a/fs/aufs/poll.c b/fs/aufs/poll.c +new file mode 100644 +index 000000000000..cbf3c070cd8d +--- /dev/null ++++ b/fs/aufs/poll.c +@@ -0,0 +1,38 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * poll operation ++ * There is only one filesystem which implements ->poll operation, currently. ++ */ ++ ++#include "aufs.h" ++ ++__poll_t aufs_poll(struct file *file, struct poll_table_struct *pt) ++{ ++ __poll_t mask; ++ struct file *h_file; ++ struct super_block *sb; ++ ++ /* We should pretend an error happened. */ ++ mask = EPOLLERR /* | EPOLLIN | EPOLLOUT */; ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ if (IS_ERR(h_file)) { ++ AuDbg("h_file %ld\n", PTR_ERR(h_file)); ++ goto out; ++ } ++ ++ mask = vfs_poll(h_file, pt); ++ fput(h_file); /* instead of au_read_post() */ ++ ++out: ++ si_read_unlock(sb); ++ if (mask & EPOLLERR) ++ AuDbg("mask 0x%x\n", mask); ++ return mask; ++} +diff --git a/fs/aufs/posix_acl.c b/fs/aufs/posix_acl.c +new file mode 100644 +index 000000000000..ac918fee79e1 +--- /dev/null ++++ b/fs/aufs/posix_acl.c +@@ -0,0 +1,90 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2014-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * posix acl operations ++ */ ++ ++#include ++#include "aufs.h" ++ ++struct posix_acl *aufs_get_acl(struct inode *inode, int type) ++{ ++ struct posix_acl *acl; ++ int err; ++ aufs_bindex_t bindex; ++ struct inode *h_inode; ++ struct super_block *sb; ++ ++ acl = NULL; ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ ii_read_lock_child(inode); ++ if (!(sb->s_flags & SB_POSIXACL)) ++ goto out; ++ ++ bindex = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, bindex); ++ if (unlikely(!h_inode ++ || ((h_inode->i_mode & S_IFMT) ++ != (inode->i_mode & S_IFMT)))) { ++ err = au_busy_or_stale(); ++ acl = ERR_PTR(err); ++ goto out; ++ } ++ ++ /* always topmost only */ ++ acl = get_acl(h_inode, type); ++ if (!IS_ERR_OR_NULL(acl)) ++ set_cached_acl(inode, type, acl); ++ ++out: ++ ii_read_unlock(inode); ++ si_read_unlock(sb); ++ ++ AuTraceErrPtr(acl); ++ return acl; ++} ++ ++int aufs_set_acl(struct inode *inode, struct posix_acl *acl, int type) ++{ ++ int err; ++ ssize_t ssz; ++ struct dentry *dentry; ++ struct au_sxattr arg = { ++ .type = AU_ACL_SET, ++ .u.acl_set = { ++ .acl = acl, ++ .type = type ++ }, ++ }; ++ ++ IMustLock(inode); ++ ++ if (inode->i_ino == AUFS_ROOT_INO) ++ dentry = dget(inode->i_sb->s_root); ++ else { ++ dentry = d_find_alias(inode); ++ if (!dentry) ++ dentry = d_find_any_alias(inode); ++ if (!dentry) { ++ pr_warn("cannot handle this inode, " ++ "please report to aufs-users ML\n"); ++ err = -ENOENT; ++ goto out; ++ } ++ } ++ ++ ssz = au_sxattr(dentry, inode, &arg); ++ dput(dentry); ++ err = ssz; ++ if (ssz >= 0) { ++ err = 0; ++ set_cached_acl(inode, type, acl); ++ } ++ ++out: ++ return err; ++} +diff --git a/fs/aufs/procfs.c b/fs/aufs/procfs.c +new file mode 100644 +index 000000000000..566a932fa72d +--- /dev/null ++++ b/fs/aufs/procfs.c +@@ -0,0 +1,158 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2010-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * procfs interfaces ++ */ ++ ++#include ++#include "aufs.h" ++ ++static int au_procfs_plm_release(struct inode *inode, struct file *file) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ sbinfo = file->private_data; ++ if (sbinfo) { ++ au_plink_maint_leave(sbinfo); ++ kobject_put(&sbinfo->si_kobj); ++ } ++ ++ return 0; ++} ++ ++static void au_procfs_plm_write_clean(struct file *file) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ sbinfo = file->private_data; ++ if (sbinfo) ++ au_plink_clean(sbinfo->si_sb, /*verbose*/0); ++} ++ ++static int au_procfs_plm_write_si(struct file *file, unsigned long id) ++{ ++ int err; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_node *pos; ++ ++ err = -EBUSY; ++ if (unlikely(file->private_data)) ++ goto out; ++ ++ sb = NULL; ++ /* don't use au_sbilist_lock() here */ ++ hlist_bl_lock(&au_sbilist); ++ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) ++ if (id == sysaufs_si_id(sbinfo)) { ++ kobject_get(&sbinfo->si_kobj); ++ sb = sbinfo->si_sb; ++ break; ++ } ++ hlist_bl_unlock(&au_sbilist); ++ ++ err = -EINVAL; ++ if (unlikely(!sb)) ++ goto out; ++ ++ err = au_plink_maint_enter(sb); ++ if (!err) ++ /* keep kobject_get() */ ++ file->private_data = sbinfo; ++ else ++ kobject_put(&sbinfo->si_kobj); ++out: ++ return err; ++} ++ ++/* ++ * Accept a valid "si=xxxx" only. ++ * Once it is accepted successfully, accept "clean" too. ++ */ ++static ssize_t au_procfs_plm_write(struct file *file, const char __user *ubuf, ++ size_t count, loff_t *ppos) ++{ ++ ssize_t err; ++ unsigned long id; ++ /* last newline is allowed */ ++ char buf[3 + sizeof(unsigned long) * 2 + 1]; ++ ++ err = -EACCES; ++ if (unlikely(!capable(CAP_SYS_ADMIN))) ++ goto out; ++ ++ err = -EINVAL; ++ if (unlikely(count > sizeof(buf))) ++ goto out; ++ ++ err = copy_from_user(buf, ubuf, count); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ goto out; ++ } ++ buf[count] = 0; ++ ++ err = -EINVAL; ++ if (!strcmp("clean", buf)) { ++ au_procfs_plm_write_clean(file); ++ goto out_success; ++ } else if (unlikely(strncmp("si=", buf, 3))) ++ goto out; ++ ++ err = kstrtoul(buf + 3, 16, &id); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_procfs_plm_write_si(file, id); ++ if (unlikely(err)) ++ goto out; ++ ++out_success: ++ err = count; /* success */ ++out: ++ return err; ++} ++ ++static const struct file_operations au_procfs_plm_fop = { ++ .write = au_procfs_plm_write, ++ .release = au_procfs_plm_release, ++ .owner = THIS_MODULE ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct proc_dir_entry *au_procfs_dir; ++ ++void au_procfs_fin(void) ++{ ++ remove_proc_entry(AUFS_PLINK_MAINT_NAME, au_procfs_dir); ++ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); ++} ++ ++int __init au_procfs_init(void) ++{ ++ int err; ++ struct proc_dir_entry *entry; ++ ++ err = -ENOMEM; ++ au_procfs_dir = proc_mkdir(AUFS_PLINK_MAINT_DIR, NULL); ++ if (unlikely(!au_procfs_dir)) ++ goto out; ++ ++ entry = proc_create(AUFS_PLINK_MAINT_NAME, S_IFREG | 0200, ++ au_procfs_dir, &au_procfs_plm_fop); ++ if (unlikely(!entry)) ++ goto out_dir; ++ ++ err = 0; ++ goto out; /* success */ ++ ++ ++out_dir: ++ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); ++out: ++ return err; ++} +diff --git a/fs/aufs/rdu.c b/fs/aufs/rdu.c +new file mode 100644 +index 000000000000..8a7eb103a96e +--- /dev/null ++++ b/fs/aufs/rdu.c +@@ -0,0 +1,369 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * readdir in userspace. ++ */ ++ ++#include ++#include ++#include ++#include "aufs.h" ++ ++/* bits for struct aufs_rdu.flags */ ++#define AuRdu_CALLED 1 ++#define AuRdu_CONT (1 << 1) ++#define AuRdu_FULL (1 << 2) ++#define au_ftest_rdu(flags, name) ((flags) & AuRdu_##name) ++#define au_fset_rdu(flags, name) \ ++ do { (flags) |= AuRdu_##name; } while (0) ++#define au_fclr_rdu(flags, name) \ ++ do { (flags) &= ~AuRdu_##name; } while (0) ++ ++struct au_rdu_arg { ++ struct dir_context ctx; ++ struct aufs_rdu *rdu; ++ union au_rdu_ent_ul ent; ++ unsigned long end; ++ ++ struct super_block *sb; ++ int err; ++}; ++ ++static int au_rdu_fill(struct dir_context *ctx, const char *name, int nlen, ++ loff_t offset, u64 h_ino, unsigned int d_type) ++{ ++ int err, len; ++ struct au_rdu_arg *arg = container_of(ctx, struct au_rdu_arg, ctx); ++ struct aufs_rdu *rdu = arg->rdu; ++ struct au_rdu_ent ent; ++ ++ err = 0; ++ arg->err = 0; ++ au_fset_rdu(rdu->cookie.flags, CALLED); ++ len = au_rdu_len(nlen); ++ if (arg->ent.ul + len < arg->end) { ++ ent.ino = h_ino; ++ ent.bindex = rdu->cookie.bindex; ++ ent.type = d_type; ++ ent.nlen = nlen; ++ if (unlikely(nlen > AUFS_MAX_NAMELEN)) ++ ent.type = DT_UNKNOWN; ++ ++ /* unnecessary to support mmap_sem since this is a dir */ ++ err = -EFAULT; ++ if (copy_to_user(arg->ent.e, &ent, sizeof(ent))) ++ goto out; ++ if (copy_to_user(arg->ent.e->name, name, nlen)) ++ goto out; ++ /* the terminating NULL */ ++ if (__put_user(0, arg->ent.e->name + nlen)) ++ goto out; ++ err = 0; ++ /* AuDbg("%p, %.*s\n", arg->ent.p, nlen, name); */ ++ arg->ent.ul += len; ++ rdu->rent++; ++ } else { ++ err = -EFAULT; ++ au_fset_rdu(rdu->cookie.flags, FULL); ++ rdu->full = 1; ++ rdu->tail = arg->ent; ++ } ++ ++out: ++ /* AuTraceErr(err); */ ++ return err; ++} ++ ++static int au_rdu_do(struct file *h_file, struct au_rdu_arg *arg) ++{ ++ int err; ++ loff_t offset; ++ struct au_rdu_cookie *cookie = &arg->rdu->cookie; ++ ++ /* we don't have to care (FMODE_32BITHASH | FMODE_64BITHASH) for ext4 */ ++ offset = vfsub_llseek(h_file, cookie->h_pos, SEEK_SET); ++ err = offset; ++ if (unlikely(offset != cookie->h_pos)) ++ goto out; ++ ++ err = 0; ++ do { ++ arg->err = 0; ++ au_fclr_rdu(cookie->flags, CALLED); ++ /* smp_mb(); */ ++ err = vfsub_iterate_dir(h_file, &arg->ctx); ++ if (err >= 0) ++ err = arg->err; ++ } while (!err ++ && au_ftest_rdu(cookie->flags, CALLED) ++ && !au_ftest_rdu(cookie->flags, FULL)); ++ cookie->h_pos = h_file->f_pos; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_rdu(struct file *file, struct aufs_rdu *rdu) ++{ ++ int err; ++ aufs_bindex_t bbot; ++ struct au_rdu_arg arg = { ++ .ctx = { ++ .actor = au_rdu_fill ++ } ++ }; ++ struct dentry *dentry; ++ struct inode *inode; ++ struct file *h_file; ++ struct au_rdu_cookie *cookie = &rdu->cookie; ++ ++ err = !access_ok(VERIFY_WRITE, rdu->ent.e, rdu->sz); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out; ++ } ++ rdu->rent = 0; ++ rdu->tail = rdu->ent; ++ rdu->full = 0; ++ arg.rdu = rdu; ++ arg.ent = rdu->ent; ++ arg.end = arg.ent.ul; ++ arg.end += rdu->sz; ++ ++ err = -ENOTDIR; ++ if (unlikely(!file->f_op->iterate && !file->f_op->iterate_shared)) ++ goto out; ++ ++ err = security_file_permission(file, MAY_READ); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out; ++ ++ dentry = file->f_path.dentry; ++ inode = d_inode(dentry); ++ inode_lock_shared(inode); ++ ++ arg.sb = inode->i_sb; ++ err = si_read_lock(arg.sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out_mtx; ++ err = au_alive_dir(dentry); ++ if (unlikely(err)) ++ goto out_si; ++ /* todo: reval? */ ++ fi_read_lock(file); ++ ++ err = -EAGAIN; ++ if (unlikely(au_ftest_rdu(cookie->flags, CONT) ++ && cookie->generation != au_figen(file))) ++ goto out_unlock; ++ ++ err = 0; ++ if (!rdu->blk) { ++ rdu->blk = au_sbi(arg.sb)->si_rdblk; ++ if (!rdu->blk) ++ rdu->blk = au_dir_size(file, /*dentry*/NULL); ++ } ++ bbot = au_fbtop(file); ++ if (cookie->bindex < bbot) ++ cookie->bindex = bbot; ++ bbot = au_fbbot_dir(file); ++ /* AuDbg("b%d, b%d\n", cookie->bindex, bbot); */ ++ for (; !err && cookie->bindex <= bbot; ++ cookie->bindex++, cookie->h_pos = 0) { ++ h_file = au_hf_dir(file, cookie->bindex); ++ if (!h_file) ++ continue; ++ ++ au_fclr_rdu(cookie->flags, FULL); ++ err = au_rdu_do(h_file, &arg); ++ AuTraceErr(err); ++ if (unlikely(au_ftest_rdu(cookie->flags, FULL) || err)) ++ break; ++ } ++ AuDbg("rent %llu\n", rdu->rent); ++ ++ if (!err && !au_ftest_rdu(cookie->flags, CONT)) { ++ rdu->shwh = !!au_opt_test(au_sbi(arg.sb)->si_mntflags, SHWH); ++ au_fset_rdu(cookie->flags, CONT); ++ cookie->generation = au_figen(file); ++ } ++ ++ ii_read_lock_child(inode); ++ fsstack_copy_attr_atime(inode, au_h_iptr(inode, au_ibtop(inode))); ++ ii_read_unlock(inode); ++ ++out_unlock: ++ fi_read_unlock(file); ++out_si: ++ si_read_unlock(arg.sb); ++out_mtx: ++ inode_unlock_shared(inode); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_rdu_ino(struct file *file, struct aufs_rdu *rdu) ++{ ++ int err; ++ ino_t ino; ++ unsigned long long nent; ++ union au_rdu_ent_ul *u; ++ struct au_rdu_ent ent; ++ struct super_block *sb; ++ ++ err = 0; ++ nent = rdu->nent; ++ u = &rdu->ent; ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ while (nent-- > 0) { ++ /* unnecessary to support mmap_sem since this is a dir */ ++ err = copy_from_user(&ent, u->e, sizeof(ent)); ++ if (!err) ++ err = !access_ok(VERIFY_WRITE, &u->e->ino, sizeof(ino)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ break; ++ } ++ ++ /* AuDbg("b%d, i%llu\n", ent.bindex, ent.ino); */ ++ if (!ent.wh) ++ err = au_ino(sb, ent.bindex, ent.ino, ent.type, &ino); ++ else ++ err = au_wh_ino(sb, ent.bindex, ent.ino, ent.type, ++ &ino); ++ if (unlikely(err)) { ++ AuTraceErr(err); ++ break; ++ } ++ ++ err = __put_user(ino, &u->e->ino); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ break; ++ } ++ u->ul += au_rdu_len(ent.nlen); ++ } ++ si_read_unlock(sb); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_rdu_verify(struct aufs_rdu *rdu) ++{ ++ AuDbg("rdu{%llu, %p, %u | %u | %llu, %u, %u | " ++ "%llu, b%d, 0x%x, g%u}\n", ++ rdu->sz, rdu->ent.e, rdu->verify[AufsCtlRduV_SZ], ++ rdu->blk, ++ rdu->rent, rdu->shwh, rdu->full, ++ rdu->cookie.h_pos, rdu->cookie.bindex, rdu->cookie.flags, ++ rdu->cookie.generation); ++ ++ if (rdu->verify[AufsCtlRduV_SZ] == sizeof(*rdu)) ++ return 0; ++ ++ AuDbg("%u:%u\n", ++ rdu->verify[AufsCtlRduV_SZ], (unsigned int)sizeof(*rdu)); ++ return -EINVAL; ++} ++ ++long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long err, e; ++ struct aufs_rdu rdu; ++ void __user *p = (void __user *)arg; ++ ++ err = copy_from_user(&rdu, p, sizeof(rdu)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out; ++ } ++ err = au_rdu_verify(&rdu); ++ if (unlikely(err)) ++ goto out; ++ ++ switch (cmd) { ++ case AUFS_CTL_RDU: ++ err = au_rdu(file, &rdu); ++ if (unlikely(err)) ++ break; ++ ++ e = copy_to_user(p, &rdu, sizeof(rdu)); ++ if (unlikely(e)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ } ++ break; ++ case AUFS_CTL_RDU_INO: ++ err = au_rdu_ino(file, &rdu); ++ break; ++ ++ default: ++ /* err = -ENOTTY; */ ++ err = -EINVAL; ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++#ifdef CONFIG_COMPAT ++long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long err, e; ++ struct aufs_rdu rdu; ++ void __user *p = compat_ptr(arg); ++ ++ /* todo: get_user()? */ ++ err = copy_from_user(&rdu, p, sizeof(rdu)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out; ++ } ++ rdu.ent.e = compat_ptr(rdu.ent.ul); ++ err = au_rdu_verify(&rdu); ++ if (unlikely(err)) ++ goto out; ++ ++ switch (cmd) { ++ case AUFS_CTL_RDU: ++ err = au_rdu(file, &rdu); ++ if (unlikely(err)) ++ break; ++ ++ rdu.ent.ul = ptr_to_compat(rdu.ent.e); ++ rdu.tail.ul = ptr_to_compat(rdu.tail.e); ++ e = copy_to_user(p, &rdu, sizeof(rdu)); ++ if (unlikely(e)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ } ++ break; ++ case AUFS_CTL_RDU_INO: ++ err = au_rdu_ino(file, &rdu); ++ break; ++ ++ default: ++ /* err = -ENOTTY; */ ++ err = -EINVAL; ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++#endif +diff --git a/fs/aufs/rwsem.h b/fs/aufs/rwsem.h +new file mode 100644 +index 000000000000..1e636d0039e6 +--- /dev/null ++++ b/fs/aufs/rwsem.h +@@ -0,0 +1,60 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * simple read-write semaphore wrappers ++ */ ++ ++#ifndef __AUFS_RWSEM_H__ ++#define __AUFS_RWSEM_H__ ++ ++#ifdef __KERNEL__ ++ ++#include "debug.h" ++ ++/* in the future, the name 'au_rwsem' will be totally gone */ ++#define au_rwsem rw_semaphore ++ ++/* to debug easier, do not make them inlined functions */ ++#define AuRwMustNoWaiters(rw) AuDebugOn(rwsem_is_contended(rw)) ++/* rwsem_is_locked() is unusable */ ++#define AuRwMustReadLock(rw) AuDebugOn(!lockdep_recursing(current) \ ++ && debug_locks \ ++ && !lockdep_is_held_type(rw, 1)) ++#define AuRwMustWriteLock(rw) AuDebugOn(!lockdep_recursing(current) \ ++ && debug_locks \ ++ && !lockdep_is_held_type(rw, 0)) ++#define AuRwMustAnyLock(rw) AuDebugOn(!lockdep_recursing(current) \ ++ && debug_locks \ ++ && !lockdep_is_held(rw)) ++#define AuRwDestroy(rw) AuDebugOn(!lockdep_recursing(current) \ ++ && debug_locks \ ++ && lockdep_is_held(rw)) ++ ++#define au_rw_init(rw) init_rwsem(rw) ++ ++#define au_rw_init_wlock(rw) do { \ ++ au_rw_init(rw); \ ++ down_write(rw); \ ++ } while (0) ++ ++#define au_rw_init_wlock_nested(rw, lsc) do { \ ++ au_rw_init(rw); \ ++ down_write_nested(rw, lsc); \ ++ } while (0) ++ ++#define au_rw_read_lock(rw) down_read(rw) ++#define au_rw_read_lock_nested(rw, lsc) down_read_nested(rw, lsc) ++#define au_rw_read_unlock(rw) up_read(rw) ++#define au_rw_dgrade_lock(rw) downgrade_write(rw) ++#define au_rw_write_lock(rw) down_write(rw) ++#define au_rw_write_lock_nested(rw, lsc) down_write_nested(rw, lsc) ++#define au_rw_write_unlock(rw) up_write(rw) ++/* why is not _nested version defined? */ ++#define au_rw_read_trylock(rw) down_read_trylock(rw) ++#define au_rw_write_trylock(rw) down_write_trylock(rw) ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_RWSEM_H__ */ +diff --git a/fs/aufs/sbinfo.c b/fs/aufs/sbinfo.c +new file mode 100644 +index 000000000000..6b04f5d18ddc +--- /dev/null ++++ b/fs/aufs/sbinfo.c +@@ -0,0 +1,300 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * superblock private data ++ */ ++ ++#include "aufs.h" ++ ++/* ++ * they are necessary regardless sysfs is disabled. ++ */ ++void au_si_free(struct kobject *kobj) ++{ ++ int i; ++ struct au_sbinfo *sbinfo; ++ char *locked __maybe_unused; /* debug only */ ++ ++ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); ++ for (i = 0; i < AuPlink_NHASH; i++) ++ AuDebugOn(!hlist_bl_empty(sbinfo->si_plink + i)); ++ AuDebugOn(atomic_read(&sbinfo->si_nowait.nw_len)); ++ ++ AuLCntZero(au_lcnt_read(&sbinfo->si_ninodes, /*do_rev*/0)); ++ au_lcnt_fin(&sbinfo->si_ninodes, /*do_sync*/0); ++ AuLCntZero(au_lcnt_read(&sbinfo->si_nfiles, /*do_rev*/0)); ++ au_lcnt_fin(&sbinfo->si_nfiles, /*do_sync*/0); ++ ++ dbgaufs_si_fin(sbinfo); ++ au_rw_write_lock(&sbinfo->si_rwsem); ++ au_br_free(sbinfo); ++ au_rw_write_unlock(&sbinfo->si_rwsem); ++ ++ kfree(sbinfo->si_branch); ++ mutex_destroy(&sbinfo->si_xib_mtx); ++ AuRwDestroy(&sbinfo->si_rwsem); ++ ++ au_lcnt_wait_for_fin(&sbinfo->si_ninodes); ++ /* si_nfiles is waited too */ ++ kfree(sbinfo); ++} ++ ++int au_si_alloc(struct super_block *sb) ++{ ++ int err, i; ++ struct au_sbinfo *sbinfo; ++ ++ err = -ENOMEM; ++ sbinfo = kzalloc(sizeof(*sbinfo), GFP_NOFS); ++ if (unlikely(!sbinfo)) ++ goto out; ++ ++ /* will be reallocated separately */ ++ sbinfo->si_branch = kzalloc(sizeof(*sbinfo->si_branch), GFP_NOFS); ++ if (unlikely(!sbinfo->si_branch)) ++ goto out_sbinfo; ++ ++ err = sysaufs_si_init(sbinfo); ++ if (!err) { ++ dbgaufs_si_null(sbinfo); ++ err = dbgaufs_si_init(sbinfo); ++ if (unlikely(err)) ++ kobject_put(&sbinfo->si_kobj); ++ } ++ if (unlikely(err)) ++ goto out_br; ++ ++ au_nwt_init(&sbinfo->si_nowait); ++ au_rw_init_wlock(&sbinfo->si_rwsem); ++ ++ au_lcnt_init(&sbinfo->si_ninodes, /*release*/NULL); ++ au_lcnt_init(&sbinfo->si_nfiles, /*release*/NULL); ++ ++ sbinfo->si_bbot = -1; ++ sbinfo->si_last_br_id = AUFS_BRANCH_MAX / 2; ++ ++ sbinfo->si_wbr_copyup = AuWbrCopyup_Def; ++ sbinfo->si_wbr_create = AuWbrCreate_Def; ++ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + sbinfo->si_wbr_copyup; ++ sbinfo->si_wbr_create_ops = au_wbr_create_ops + sbinfo->si_wbr_create; ++ ++ au_fhsm_init(sbinfo); ++ ++ sbinfo->si_mntflags = au_opts_plink(AuOpt_Def); ++ ++ sbinfo->si_xino_jiffy = jiffies; ++ sbinfo->si_xino_expire ++ = msecs_to_jiffies(AUFS_XINO_DEF_SEC * MSEC_PER_SEC); ++ mutex_init(&sbinfo->si_xib_mtx); ++ /* leave si_xib_last_pindex and si_xib_next_bit */ ++ ++ INIT_HLIST_BL_HEAD(&sbinfo->si_aopen); ++ ++ sbinfo->si_rdcache = msecs_to_jiffies(AUFS_RDCACHE_DEF * MSEC_PER_SEC); ++ sbinfo->si_rdblk = AUFS_RDBLK_DEF; ++ sbinfo->si_rdhash = AUFS_RDHASH_DEF; ++ sbinfo->si_dirwh = AUFS_DIRWH_DEF; ++ ++ for (i = 0; i < AuPlink_NHASH; i++) ++ INIT_HLIST_BL_HEAD(sbinfo->si_plink + i); ++ init_waitqueue_head(&sbinfo->si_plink_wq); ++ spin_lock_init(&sbinfo->si_plink_maint_lock); ++ ++ INIT_HLIST_BL_HEAD(&sbinfo->si_files); ++ ++ /* with getattr by default */ ++ sbinfo->si_iop_array = aufs_iop; ++ ++ /* leave other members for sysaufs and si_mnt. */ ++ sbinfo->si_sb = sb; ++ sb->s_fs_info = sbinfo; ++ si_pid_set(sb); ++ return 0; /* success */ ++ ++out_br: ++ kfree(sbinfo->si_branch); ++out_sbinfo: ++ kfree(sbinfo); ++out: ++ return err; ++} ++ ++int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink) ++{ ++ int err, sz; ++ struct au_branch **brp; ++ ++ AuRwMustWriteLock(&sbinfo->si_rwsem); ++ ++ err = -ENOMEM; ++ sz = sizeof(*brp) * (sbinfo->si_bbot + 1); ++ if (unlikely(!sz)) ++ sz = sizeof(*brp); ++ brp = au_kzrealloc(sbinfo->si_branch, sz, sizeof(*brp) * nbr, GFP_NOFS, ++ may_shrink); ++ if (brp) { ++ sbinfo->si_branch = brp; ++ err = 0; ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++unsigned int au_sigen_inc(struct super_block *sb) ++{ ++ unsigned int gen; ++ struct inode *inode; ++ ++ SiMustWriteLock(sb); ++ ++ gen = ++au_sbi(sb)->si_generation; ++ au_update_digen(sb->s_root); ++ inode = d_inode(sb->s_root); ++ au_update_iigen(inode, /*half*/0); ++ inode_inc_iversion(inode); ++ return gen; ++} ++ ++aufs_bindex_t au_new_br_id(struct super_block *sb) ++{ ++ aufs_bindex_t br_id; ++ int i; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ for (i = 0; i <= AUFS_BRANCH_MAX; i++) { ++ br_id = ++sbinfo->si_last_br_id; ++ AuDebugOn(br_id < 0); ++ if (br_id && au_br_index(sb, br_id) < 0) ++ return br_id; ++ } ++ ++ return -1; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* it is ok that new 'nwt' tasks are appended while we are sleeping */ ++int si_read_lock(struct super_block *sb, int flags) ++{ ++ int err; ++ ++ err = 0; ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&au_sbi(sb)->si_nowait); ++ ++ si_noflush_read_lock(sb); ++ err = au_plink_maint(sb, flags); ++ if (unlikely(err)) ++ si_read_unlock(sb); ++ ++ return err; ++} ++ ++int si_write_lock(struct super_block *sb, int flags) ++{ ++ int err; ++ ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&au_sbi(sb)->si_nowait); ++ ++ si_noflush_write_lock(sb); ++ err = au_plink_maint(sb, flags); ++ if (unlikely(err)) ++ si_write_unlock(sb); ++ ++ return err; ++} ++ ++/* dentry and super_block lock. call at entry point */ ++int aufs_read_lock(struct dentry *dentry, int flags) ++{ ++ int err; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ err = si_read_lock(sb, flags); ++ if (unlikely(err)) ++ goto out; ++ ++ if (au_ftest_lock(flags, DW)) ++ di_write_lock_child(dentry); ++ else ++ di_read_lock_child(dentry, flags); ++ ++ if (au_ftest_lock(flags, GEN)) { ++ err = au_digen_test(dentry, au_sigen(sb)); ++ if (!au_opt_test(au_mntflags(sb), UDBA_NONE)) ++ AuDebugOn(!err && au_dbrange_test(dentry)); ++ else if (!err) ++ err = au_dbrange_test(dentry); ++ if (unlikely(err)) ++ aufs_read_unlock(dentry, flags); ++ } ++ ++out: ++ return err; ++} ++ ++void aufs_read_unlock(struct dentry *dentry, int flags) ++{ ++ if (au_ftest_lock(flags, DW)) ++ di_write_unlock(dentry); ++ else ++ di_read_unlock(dentry, flags); ++ si_read_unlock(dentry->d_sb); ++} ++ ++void aufs_write_lock(struct dentry *dentry) ++{ ++ si_write_lock(dentry->d_sb, AuLock_FLUSH | AuLock_NOPLMW); ++ di_write_lock_child(dentry); ++} ++ ++void aufs_write_unlock(struct dentry *dentry) ++{ ++ di_write_unlock(dentry); ++ si_write_unlock(dentry->d_sb); ++} ++ ++int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags) ++{ ++ int err; ++ unsigned int sigen; ++ struct super_block *sb; ++ ++ sb = d1->d_sb; ++ err = si_read_lock(sb, flags); ++ if (unlikely(err)) ++ goto out; ++ ++ di_write_lock2_child(d1, d2, au_ftest_lock(flags, DIRS)); ++ ++ if (au_ftest_lock(flags, GEN)) { ++ sigen = au_sigen(sb); ++ err = au_digen_test(d1, sigen); ++ AuDebugOn(!err && au_dbrange_test(d1)); ++ if (!err) { ++ err = au_digen_test(d2, sigen); ++ AuDebugOn(!err && au_dbrange_test(d2)); ++ } ++ if (unlikely(err)) ++ aufs_read_and_write_unlock2(d1, d2); ++ } ++ ++out: ++ return err; ++} ++ ++void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2) ++{ ++ di_write_unlock2(d1, d2); ++ si_read_unlock(d1->d_sb); ++} +diff --git a/fs/aufs/super.c b/fs/aufs/super.c +new file mode 100644 +index 000000000000..777503e6c00e +--- /dev/null ++++ b/fs/aufs/super.c +@@ -0,0 +1,1035 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * mount and super_block operations ++ */ ++ ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++/* ++ * super_operations ++ */ ++static struct inode *aufs_alloc_inode(struct super_block *sb __maybe_unused) ++{ ++ struct au_icntnr *c; ++ ++ c = au_cache_alloc_icntnr(); ++ if (c) { ++ au_icntnr_init(c); ++ inode_set_iversion(&c->vfs_inode, 1); /* sigen(sb); */ ++ c->iinfo.ii_hinode = NULL; ++ return &c->vfs_inode; ++ } ++ return NULL; ++} ++ ++static void aufs_destroy_inode_cb(struct rcu_head *head) ++{ ++ struct inode *inode = container_of(head, struct inode, i_rcu); ++ ++ au_cache_free_icntnr(container_of(inode, struct au_icntnr, vfs_inode)); ++} ++ ++static void aufs_destroy_inode(struct inode *inode) ++{ ++ if (!au_is_bad_inode(inode)) ++ au_iinfo_fin(inode); ++ call_rcu(&inode->i_rcu, aufs_destroy_inode_cb); ++} ++ ++struct inode *au_iget_locked(struct super_block *sb, ino_t ino) ++{ ++ struct inode *inode; ++ int err; ++ ++ inode = iget_locked(sb, ino); ++ if (unlikely(!inode)) { ++ inode = ERR_PTR(-ENOMEM); ++ goto out; ++ } ++ if (!(inode->i_state & I_NEW)) ++ goto out; ++ ++ err = au_xigen_new(inode); ++ if (!err) ++ err = au_iinfo_init(inode); ++ if (!err) ++ inode_inc_iversion(inode); ++ else { ++ iget_failed(inode); ++ inode = ERR_PTR(err); ++ } ++ ++out: ++ /* never return NULL */ ++ AuDebugOn(!inode); ++ AuTraceErrPtr(inode); ++ return inode; ++} ++ ++/* lock free root dinfo */ ++static int au_show_brs(struct seq_file *seq, struct super_block *sb) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct path path; ++ struct au_hdentry *hdp; ++ struct au_branch *br; ++ au_br_perm_str_t perm; ++ ++ err = 0; ++ bbot = au_sbbot(sb); ++ bindex = 0; ++ hdp = au_hdentry(au_di(sb->s_root), bindex); ++ for (; !err && bindex <= bbot; bindex++, hdp++) { ++ br = au_sbr(sb, bindex); ++ path.mnt = au_br_mnt(br); ++ path.dentry = hdp->hd_dentry; ++ err = au_seq_path(seq, &path); ++ if (!err) { ++ au_optstr_br_perm(&perm, br->br_perm); ++ seq_printf(seq, "=%s", perm.a); ++ if (bindex != bbot) ++ seq_putc(seq, ':'); ++ } ++ } ++ if (unlikely(err || seq_has_overflowed(seq))) ++ err = -E2BIG; ++ ++ return err; ++} ++ ++static void au_gen_fmt(char *fmt, int len __maybe_unused, const char *pat, ++ const char *append) ++{ ++ char *p; ++ ++ p = fmt; ++ while (*pat != ':') ++ *p++ = *pat++; ++ *p++ = *pat++; ++ strcpy(p, append); ++ AuDebugOn(strlen(fmt) >= len); ++} ++ ++static void au_show_wbr_create(struct seq_file *m, int v, ++ struct au_sbinfo *sbinfo) ++{ ++ const char *pat; ++ char fmt[32]; ++ struct au_wbr_mfs *mfs; ++ ++ AuRwMustAnyLock(&sbinfo->si_rwsem); ++ ++ seq_puts(m, ",create="); ++ pat = au_optstr_wbr_create(v); ++ mfs = &sbinfo->si_wbr_mfs; ++ switch (v) { ++ case AuWbrCreate_TDP: ++ case AuWbrCreate_RR: ++ case AuWbrCreate_MFS: ++ case AuWbrCreate_PMFS: ++ seq_puts(m, pat); ++ break; ++ case AuWbrCreate_MFSRR: ++ case AuWbrCreate_TDMFS: ++ case AuWbrCreate_PMFSRR: ++ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu"); ++ seq_printf(m, fmt, mfs->mfsrr_watermark); ++ break; ++ case AuWbrCreate_MFSV: ++ case AuWbrCreate_PMFSV: ++ au_gen_fmt(fmt, sizeof(fmt), pat, "%lu"); ++ seq_printf(m, fmt, ++ jiffies_to_msecs(mfs->mfs_expire) ++ / MSEC_PER_SEC); ++ break; ++ case AuWbrCreate_MFSRRV: ++ case AuWbrCreate_TDMFSV: ++ case AuWbrCreate_PMFSRRV: ++ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu:%lu"); ++ seq_printf(m, fmt, mfs->mfsrr_watermark, ++ jiffies_to_msecs(mfs->mfs_expire) / MSEC_PER_SEC); ++ break; ++ default: ++ BUG(); ++ } ++} ++ ++static int au_show_xino(struct seq_file *seq, struct super_block *sb) ++{ ++#ifdef CONFIG_SYSFS ++ return 0; ++#else ++ int err; ++ const int len = sizeof(AUFS_XINO_FNAME) - 1; ++ aufs_bindex_t bindex, brid; ++ struct qstr *name; ++ struct file *f; ++ struct dentry *d, *h_root; ++ struct au_branch *br; ++ ++ AuRwMustAnyLock(&sbinfo->si_rwsem); ++ ++ err = 0; ++ f = au_sbi(sb)->si_xib; ++ if (!f) ++ goto out; ++ ++ /* stop printing the default xino path on the first writable branch */ ++ h_root = NULL; ++ bindex = au_xi_root(sb, f->f_path.dentry); ++ if (bindex >= 0) { ++ br = au_sbr_sb(sb, bindex); ++ h_root = au_br_dentry(br); ++ } ++ ++ d = f->f_path.dentry; ++ name = &d->d_name; ++ /* safe ->d_parent because the file is unlinked */ ++ if (d->d_parent == h_root ++ && name->len == len ++ && !memcmp(name->name, AUFS_XINO_FNAME, len)) ++ goto out; ++ ++ seq_puts(seq, ",xino="); ++ err = au_xino_path(seq, f); ++ ++out: ++ return err; ++#endif ++} ++ ++/* seq_file will re-call me in case of too long string */ ++static int aufs_show_options(struct seq_file *m, struct dentry *dentry) ++{ ++ int err; ++ unsigned int mnt_flags, v; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ ++#define AuBool(name, str) do { \ ++ v = au_opt_test(mnt_flags, name); \ ++ if (v != au_opt_test(AuOpt_Def, name)) \ ++ seq_printf(m, ",%s" #str, v ? "" : "no"); \ ++} while (0) ++ ++#define AuStr(name, str) do { \ ++ v = mnt_flags & AuOptMask_##name; \ ++ if (v != (AuOpt_Def & AuOptMask_##name)) \ ++ seq_printf(m, "," #str "=%s", au_optstr_##str(v)); \ ++} while (0) ++ ++#define AuUInt(name, str, val) do { \ ++ if (val != AUFS_##name##_DEF) \ ++ seq_printf(m, "," #str "=%u", val); \ ++} while (0) ++ ++ sb = dentry->d_sb; ++ if (sb->s_flags & SB_POSIXACL) ++ seq_puts(m, ",acl"); ++#if 0 ++ if (sb->s_flags & SB_I_VERSION) ++ seq_puts(m, ",i_version"); ++#endif ++ ++ /* lock free root dinfo */ ++ si_noflush_read_lock(sb); ++ sbinfo = au_sbi(sb); ++ seq_printf(m, ",si=%lx", sysaufs_si_id(sbinfo)); ++ ++ mnt_flags = au_mntflags(sb); ++ if (au_opt_test(mnt_flags, XINO)) { ++ err = au_show_xino(m, sb); ++ if (unlikely(err)) ++ goto out; ++ } else ++ seq_puts(m, ",noxino"); ++ ++ AuBool(TRUNC_XINO, trunc_xino); ++ AuStr(UDBA, udba); ++ AuBool(SHWH, shwh); ++ AuBool(PLINK, plink); ++ AuBool(DIO, dio); ++ AuBool(DIRPERM1, dirperm1); ++ ++ v = sbinfo->si_wbr_create; ++ if (v != AuWbrCreate_Def) ++ au_show_wbr_create(m, v, sbinfo); ++ ++ v = sbinfo->si_wbr_copyup; ++ if (v != AuWbrCopyup_Def) ++ seq_printf(m, ",cpup=%s", au_optstr_wbr_copyup(v)); ++ ++ v = au_opt_test(mnt_flags, ALWAYS_DIROPQ); ++ if (v != au_opt_test(AuOpt_Def, ALWAYS_DIROPQ)) ++ seq_printf(m, ",diropq=%c", v ? 'a' : 'w'); ++ ++ AuUInt(DIRWH, dirwh, sbinfo->si_dirwh); ++ ++ v = jiffies_to_msecs(sbinfo->si_rdcache) / MSEC_PER_SEC; ++ AuUInt(RDCACHE, rdcache, v); ++ ++ AuUInt(RDBLK, rdblk, sbinfo->si_rdblk); ++ AuUInt(RDHASH, rdhash, sbinfo->si_rdhash); ++ ++ au_fhsm_show(m, sbinfo); ++ ++ AuBool(DIRREN, dirren); ++ AuBool(SUM, sum); ++ /* AuBool(SUM_W, wsum); */ ++ AuBool(WARN_PERM, warn_perm); ++ AuBool(VERBOSE, verbose); ++ ++out: ++ /* be sure to print "br:" last */ ++ if (!sysaufs_brs) { ++ seq_puts(m, ",br:"); ++ au_show_brs(m, sb); ++ } ++ si_read_unlock(sb); ++ return 0; ++ ++#undef AuBool ++#undef AuStr ++#undef AuUInt ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* sum mode which returns the summation for statfs(2) */ ++ ++static u64 au_add_till_max(u64 a, u64 b) ++{ ++ u64 old; ++ ++ old = a; ++ a += b; ++ if (old <= a) ++ return a; ++ return ULLONG_MAX; ++} ++ ++static u64 au_mul_till_max(u64 a, long mul) ++{ ++ u64 old; ++ ++ old = a; ++ a *= mul; ++ if (old <= a) ++ return a; ++ return ULLONG_MAX; ++} ++ ++static int au_statfs_sum(struct super_block *sb, struct kstatfs *buf) ++{ ++ int err; ++ long bsize, factor; ++ u64 blocks, bfree, bavail, files, ffree; ++ aufs_bindex_t bbot, bindex, i; ++ unsigned char shared; ++ struct path h_path; ++ struct super_block *h_sb; ++ ++ err = 0; ++ bsize = LONG_MAX; ++ files = 0; ++ ffree = 0; ++ blocks = 0; ++ bfree = 0; ++ bavail = 0; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ h_path.mnt = au_sbr_mnt(sb, bindex); ++ h_sb = h_path.mnt->mnt_sb; ++ shared = 0; ++ for (i = 0; !shared && i < bindex; i++) ++ shared = (au_sbr_sb(sb, i) == h_sb); ++ if (shared) ++ continue; ++ ++ /* sb->s_root for NFS is unreliable */ ++ h_path.dentry = h_path.mnt->mnt_root; ++ err = vfs_statfs(&h_path, buf); ++ if (unlikely(err)) ++ goto out; ++ ++ if (bsize > buf->f_bsize) { ++ /* ++ * we will reduce bsize, so we have to expand blocks ++ * etc. to match them again ++ */ ++ factor = (bsize / buf->f_bsize); ++ blocks = au_mul_till_max(blocks, factor); ++ bfree = au_mul_till_max(bfree, factor); ++ bavail = au_mul_till_max(bavail, factor); ++ bsize = buf->f_bsize; ++ } ++ ++ factor = (buf->f_bsize / bsize); ++ blocks = au_add_till_max(blocks, ++ au_mul_till_max(buf->f_blocks, factor)); ++ bfree = au_add_till_max(bfree, ++ au_mul_till_max(buf->f_bfree, factor)); ++ bavail = au_add_till_max(bavail, ++ au_mul_till_max(buf->f_bavail, factor)); ++ files = au_add_till_max(files, buf->f_files); ++ ffree = au_add_till_max(ffree, buf->f_ffree); ++ } ++ ++ buf->f_bsize = bsize; ++ buf->f_blocks = blocks; ++ buf->f_bfree = bfree; ++ buf->f_bavail = bavail; ++ buf->f_files = files; ++ buf->f_ffree = ffree; ++ buf->f_frsize = 0; ++ ++out: ++ return err; ++} ++ ++static int aufs_statfs(struct dentry *dentry, struct kstatfs *buf) ++{ ++ int err; ++ struct path h_path; ++ struct super_block *sb; ++ ++ /* lock free root dinfo */ ++ sb = dentry->d_sb; ++ si_noflush_read_lock(sb); ++ if (!au_opt_test(au_mntflags(sb), SUM)) { ++ /* sb->s_root for NFS is unreliable */ ++ h_path.mnt = au_sbr_mnt(sb, 0); ++ h_path.dentry = h_path.mnt->mnt_root; ++ err = vfs_statfs(&h_path, buf); ++ } else ++ err = au_statfs_sum(sb, buf); ++ si_read_unlock(sb); ++ ++ if (!err) { ++ buf->f_type = AUFS_SUPER_MAGIC; ++ buf->f_namelen = AUFS_MAX_NAMELEN; ++ memset(&buf->f_fsid, 0, sizeof(buf->f_fsid)); ++ } ++ /* buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; */ ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_sync_fs(struct super_block *sb, int wait) ++{ ++ int err, e; ++ aufs_bindex_t bbot, bindex; ++ struct au_branch *br; ++ struct super_block *h_sb; ++ ++ err = 0; ++ si_noflush_read_lock(sb); ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!au_br_writable(br->br_perm)) ++ continue; ++ ++ h_sb = au_sbr_sb(sb, bindex); ++ e = vfsub_sync_filesystem(h_sb, wait); ++ if (unlikely(e && !err)) ++ err = e; ++ /* go on even if an error happens */ ++ } ++ si_read_unlock(sb); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* final actions when unmounting a file system */ ++static void aufs_put_super(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ sbinfo = au_sbi(sb); ++ if (sbinfo) ++ kobject_put(&sbinfo->si_kobj); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, ++ struct super_block *sb, void *arg) ++{ ++ void *array; ++ unsigned long long n, sz; ++ ++ array = NULL; ++ n = 0; ++ if (!*hint) ++ goto out; ++ ++ if (*hint > ULLONG_MAX / sizeof(array)) { ++ array = ERR_PTR(-EMFILE); ++ pr_err("hint %llu\n", *hint); ++ goto out; ++ } ++ ++ sz = sizeof(array) * *hint; ++ array = kzalloc(sz, GFP_NOFS); ++ if (unlikely(!array)) ++ array = vzalloc(sz); ++ if (unlikely(!array)) { ++ array = ERR_PTR(-ENOMEM); ++ goto out; ++ } ++ ++ n = cb(sb, array, *hint, arg); ++ AuDebugOn(n > *hint); ++ ++out: ++ *hint = n; ++ return array; ++} ++ ++static unsigned long long au_iarray_cb(struct super_block *sb, void *a, ++ unsigned long long max __maybe_unused, ++ void *arg) ++{ ++ unsigned long long n; ++ struct inode **p, *inode; ++ struct list_head *head; ++ ++ n = 0; ++ p = a; ++ head = arg; ++ spin_lock(&sb->s_inode_list_lock); ++ list_for_each_entry(inode, head, i_sb_list) { ++ if (!au_is_bad_inode(inode) ++ && au_ii(inode)->ii_btop >= 0) { ++ spin_lock(&inode->i_lock); ++ if (atomic_read(&inode->i_count)) { ++ au_igrab(inode); ++ *p++ = inode; ++ n++; ++ AuDebugOn(n > max); ++ } ++ spin_unlock(&inode->i_lock); ++ } ++ } ++ spin_unlock(&sb->s_inode_list_lock); ++ ++ return n; ++} ++ ++struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max) ++{ ++ struct au_sbinfo *sbi; ++ ++ sbi = au_sbi(sb); ++ *max = au_lcnt_read(&sbi->si_ninodes, /*do_rev*/1); ++ return au_array_alloc(max, au_iarray_cb, sb, &sb->s_inodes); ++} ++ ++void au_iarray_free(struct inode **a, unsigned long long max) ++{ ++ unsigned long long ull; ++ ++ for (ull = 0; ull < max; ull++) ++ iput(a[ull]); ++ kvfree(a); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * refresh dentry and inode at remount time. ++ */ ++/* todo: consolidate with simple_reval_dpath() and au_reval_for_attr() */ ++static int au_do_refresh(struct dentry *dentry, unsigned int dir_flags, ++ struct dentry *parent) ++{ ++ int err; ++ ++ di_write_lock_child(dentry); ++ di_read_lock_parent(parent, AuLock_IR); ++ err = au_refresh_dentry(dentry, parent); ++ if (!err && dir_flags) ++ au_hn_reset(d_inode(dentry), dir_flags); ++ di_read_unlock(parent, AuLock_IR); ++ di_write_unlock(dentry); ++ ++ return err; ++} ++ ++static int au_do_refresh_d(struct dentry *dentry, unsigned int sigen, ++ struct au_sbinfo *sbinfo, ++ const unsigned int dir_flags, unsigned int do_idop) ++{ ++ int err; ++ struct dentry *parent; ++ ++ err = 0; ++ parent = dget_parent(dentry); ++ if (!au_digen_test(parent, sigen) && au_digen_test(dentry, sigen)) { ++ if (d_really_is_positive(dentry)) { ++ if (!d_is_dir(dentry)) ++ err = au_do_refresh(dentry, /*dir_flags*/0, ++ parent); ++ else { ++ err = au_do_refresh(dentry, dir_flags, parent); ++ if (unlikely(err)) ++ au_fset_si(sbinfo, FAILED_REFRESH_DIR); ++ } ++ } else ++ err = au_do_refresh(dentry, /*dir_flags*/0, parent); ++ AuDbgDentry(dentry); ++ } ++ dput(parent); ++ ++ if (!err) { ++ if (do_idop) ++ au_refresh_dop(dentry, /*force_reval*/0); ++ } else ++ au_refresh_dop(dentry, /*force_reval*/1); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_refresh_d(struct super_block *sb, unsigned int do_idop) ++{ ++ int err, i, j, ndentry, e; ++ unsigned int sigen; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry **dentries, *d; ++ struct au_sbinfo *sbinfo; ++ struct dentry *root = sb->s_root; ++ const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1); ++ ++ if (do_idop) ++ au_refresh_dop(root, /*force_reval*/0); ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_dcsub_pages(&dpages, root, NULL, NULL); ++ if (unlikely(err)) ++ goto out_dpages; ++ ++ sigen = au_sigen(sb); ++ sbinfo = au_sbi(sb); ++ for (i = 0; i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ dentries = dpage->dentries; ++ ndentry = dpage->ndentry; ++ for (j = 0; j < ndentry; j++) { ++ d = dentries[j]; ++ e = au_do_refresh_d(d, sigen, sbinfo, dir_flags, ++ do_idop); ++ if (unlikely(e && !err)) ++ err = e; ++ /* go on even err */ ++ } ++ } ++ ++out_dpages: ++ au_dpages_free(&dpages); ++out: ++ return err; ++} ++ ++static int au_refresh_i(struct super_block *sb, unsigned int do_idop) ++{ ++ int err, e; ++ unsigned int sigen; ++ unsigned long long max, ull; ++ struct inode *inode, **array; ++ ++ array = au_iarray_alloc(sb, &max); ++ err = PTR_ERR(array); ++ if (IS_ERR(array)) ++ goto out; ++ ++ err = 0; ++ sigen = au_sigen(sb); ++ for (ull = 0; ull < max; ull++) { ++ inode = array[ull]; ++ if (unlikely(!inode)) ++ break; ++ ++ e = 0; ++ ii_write_lock_child(inode); ++ if (au_iigen(inode, NULL) != sigen) { ++ e = au_refresh_hinode_self(inode); ++ if (unlikely(e)) { ++ au_refresh_iop(inode, /*force_getattr*/1); ++ pr_err("error %d, i%lu\n", e, inode->i_ino); ++ if (!err) ++ err = e; ++ /* go on even if err */ ++ } ++ } ++ if (!e && do_idop) ++ au_refresh_iop(inode, /*force_getattr*/0); ++ ii_write_unlock(inode); ++ } ++ ++ au_iarray_free(array, max); ++ ++out: ++ return err; ++} ++ ++static void au_remount_refresh(struct super_block *sb, unsigned int do_idop) ++{ ++ int err, e; ++ unsigned int udba; ++ aufs_bindex_t bindex, bbot; ++ struct dentry *root; ++ struct inode *inode; ++ struct au_branch *br; ++ struct au_sbinfo *sbi; ++ ++ au_sigen_inc(sb); ++ sbi = au_sbi(sb); ++ au_fclr_si(sbi, FAILED_REFRESH_DIR); ++ ++ root = sb->s_root; ++ DiMustNoWaiters(root); ++ inode = d_inode(root); ++ IiMustNoWaiters(inode); ++ ++ udba = au_opt_udba(sb); ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ err = au_hnotify_reset_br(udba, br, br->br_perm); ++ if (unlikely(err)) ++ AuIOErr("hnotify failed on br %d, %d, ignored\n", ++ bindex, err); ++ /* go on even if err */ ++ } ++ au_hn_reset(inode, au_hi_flags(inode, /*isdir*/1)); ++ ++ if (do_idop) { ++ if (au_ftest_si(sbi, NO_DREVAL)) { ++ AuDebugOn(sb->s_d_op == &aufs_dop_noreval); ++ sb->s_d_op = &aufs_dop_noreval; ++ AuDebugOn(sbi->si_iop_array == aufs_iop_nogetattr); ++ sbi->si_iop_array = aufs_iop_nogetattr; ++ } else { ++ AuDebugOn(sb->s_d_op == &aufs_dop); ++ sb->s_d_op = &aufs_dop; ++ AuDebugOn(sbi->si_iop_array == aufs_iop); ++ sbi->si_iop_array = aufs_iop; ++ } ++ pr_info("reset to %ps and %ps\n", ++ sb->s_d_op, sbi->si_iop_array); ++ } ++ ++ di_write_unlock(root); ++ err = au_refresh_d(sb, do_idop); ++ e = au_refresh_i(sb, do_idop); ++ if (unlikely(e && !err)) ++ err = e; ++ /* aufs_write_lock() calls ..._child() */ ++ di_write_lock_child(root); ++ ++ au_cpup_attr_all(inode, /*force*/1); ++ ++ if (unlikely(err)) ++ AuIOErr("refresh failed, ignored, %d\n", err); ++} ++ ++/* stop extra interpretation of errno in mount(8), and strange error messages */ ++static int cvt_err(int err) ++{ ++ AuTraceErr(err); ++ ++ switch (err) { ++ case -ENOENT: ++ case -ENOTDIR: ++ case -EEXIST: ++ case -EIO: ++ err = -EINVAL; ++ } ++ return err; ++} ++ ++static int aufs_remount_fs(struct super_block *sb, int *flags, char *data) ++{ ++ int err, do_dx; ++ unsigned int mntflags; ++ struct au_opts opts = { ++ .opt = NULL ++ }; ++ struct dentry *root; ++ struct inode *inode; ++ struct au_sbinfo *sbinfo; ++ ++ err = 0; ++ root = sb->s_root; ++ if (!data || !*data) { ++ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (!err) { ++ di_write_lock_child(root); ++ err = au_opts_verify(sb, *flags, /*pending*/0); ++ aufs_write_unlock(root); ++ } ++ goto out; ++ } ++ ++ err = -ENOMEM; ++ opts.opt = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!opts.opt)) ++ goto out; ++ opts.max_opt = PAGE_SIZE / sizeof(*opts.opt); ++ opts.flags = AuOpts_REMOUNT; ++ opts.sb_flags = *flags; ++ ++ /* parse it before aufs lock */ ++ err = au_opts_parse(sb, data, &opts); ++ if (unlikely(err)) ++ goto out_opts; ++ ++ sbinfo = au_sbi(sb); ++ inode = d_inode(root); ++ inode_lock(inode); ++ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out_mtx; ++ di_write_lock_child(root); ++ ++ /* au_opts_remount() may return an error */ ++ err = au_opts_remount(sb, &opts); ++ au_opts_free(&opts); ++ ++ if (au_ftest_opts(opts.flags, REFRESH)) ++ au_remount_refresh(sb, au_ftest_opts(opts.flags, REFRESH_IDOP)); ++ ++ if (au_ftest_opts(opts.flags, REFRESH_DYAOP)) { ++ mntflags = au_mntflags(sb); ++ do_dx = !!au_opt_test(mntflags, DIO); ++ au_dy_arefresh(do_dx); ++ } ++ ++ au_fhsm_wrote_all(sb, /*force*/1); /* ?? */ ++ aufs_write_unlock(root); ++ ++out_mtx: ++ inode_unlock(inode); ++out_opts: ++ free_page((unsigned long)opts.opt); ++out: ++ err = cvt_err(err); ++ AuTraceErr(err); ++ return err; ++} ++ ++static const struct super_operations aufs_sop = { ++ .alloc_inode = aufs_alloc_inode, ++ .destroy_inode = aufs_destroy_inode, ++ /* always deleting, no clearing */ ++ .drop_inode = generic_delete_inode, ++ .show_options = aufs_show_options, ++ .statfs = aufs_statfs, ++ .put_super = aufs_put_super, ++ .sync_fs = aufs_sync_fs, ++ .remount_fs = aufs_remount_fs ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int alloc_root(struct super_block *sb) ++{ ++ int err; ++ struct inode *inode; ++ struct dentry *root; ++ ++ err = -ENOMEM; ++ inode = au_iget_locked(sb, AUFS_ROOT_INO); ++ err = PTR_ERR(inode); ++ if (IS_ERR(inode)) ++ goto out; ++ ++ inode->i_op = aufs_iop + AuIop_DIR; /* with getattr by default */ ++ inode->i_fop = &aufs_dir_fop; ++ inode->i_mode = S_IFDIR; ++ set_nlink(inode, 2); ++ unlock_new_inode(inode); ++ ++ root = d_make_root(inode); ++ if (unlikely(!root)) ++ goto out; ++ err = PTR_ERR(root); ++ if (IS_ERR(root)) ++ goto out; ++ ++ err = au_di_init(root); ++ if (!err) { ++ sb->s_root = root; ++ return 0; /* success */ ++ } ++ dput(root); ++ ++out: ++ return err; ++} ++ ++static int aufs_fill_super(struct super_block *sb, void *raw_data, ++ int silent __maybe_unused) ++{ ++ int err; ++ struct au_opts opts = { ++ .opt = NULL ++ }; ++ struct au_sbinfo *sbinfo; ++ struct dentry *root; ++ struct inode *inode; ++ char *arg = raw_data; ++ ++ if (unlikely(!arg || !*arg)) { ++ err = -EINVAL; ++ pr_err("no arg\n"); ++ goto out; ++ } ++ ++ err = -ENOMEM; ++ opts.opt = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!opts.opt)) ++ goto out; ++ opts.max_opt = PAGE_SIZE / sizeof(*opts.opt); ++ opts.sb_flags = sb->s_flags; ++ ++ err = au_si_alloc(sb); ++ if (unlikely(err)) ++ goto out_opts; ++ sbinfo = au_sbi(sb); ++ ++ /* all timestamps always follow the ones on the branch */ ++ sb->s_flags |= SB_NOATIME | SB_NODIRATIME; ++ sb->s_flags |= SB_I_VERSION; /* do we really need this? */ ++ sb->s_op = &aufs_sop; ++ sb->s_d_op = &aufs_dop; ++ sb->s_magic = AUFS_SUPER_MAGIC; ++ sb->s_maxbytes = 0; ++ sb->s_stack_depth = 1; ++ au_export_init(sb); ++ au_xattr_init(sb); ++ ++ err = alloc_root(sb); ++ if (unlikely(err)) { ++ si_write_unlock(sb); ++ goto out_info; ++ } ++ root = sb->s_root; ++ inode = d_inode(root); ++ ++ /* ++ * actually we can parse options regardless aufs lock here. ++ * but at remount time, parsing must be done before aufs lock. ++ * so we follow the same rule. ++ */ ++ ii_write_lock_parent(inode); ++ aufs_write_unlock(root); ++ err = au_opts_parse(sb, arg, &opts); ++ if (unlikely(err)) ++ goto out_root; ++ ++ /* lock vfs_inode first, then aufs. */ ++ inode_lock(inode); ++ aufs_write_lock(root); ++ err = au_opts_mount(sb, &opts); ++ au_opts_free(&opts); ++ if (!err && au_ftest_si(sbinfo, NO_DREVAL)) { ++ sb->s_d_op = &aufs_dop_noreval; ++ pr_info("%ps\n", sb->s_d_op); ++ au_refresh_dop(root, /*force_reval*/0); ++ sbinfo->si_iop_array = aufs_iop_nogetattr; ++ au_refresh_iop(inode, /*force_getattr*/0); ++ } ++ aufs_write_unlock(root); ++ inode_unlock(inode); ++ if (!err) ++ goto out_opts; /* success */ ++ ++out_root: ++ dput(root); ++ sb->s_root = NULL; ++out_info: ++ kobject_put(&sbinfo->si_kobj); ++ sb->s_fs_info = NULL; ++out_opts: ++ free_page((unsigned long)opts.opt); ++out: ++ AuTraceErr(err); ++ err = cvt_err(err); ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry *aufs_mount(struct file_system_type *fs_type, int flags, ++ const char *dev_name __maybe_unused, ++ void *raw_data) ++{ ++ struct dentry *root; ++ ++ /* all timestamps always follow the ones on the branch */ ++ /* mnt->mnt_flags |= MNT_NOATIME | MNT_NODIRATIME; */ ++ root = mount_nodev(fs_type, flags, raw_data, aufs_fill_super); ++ if (IS_ERR(root)) ++ goto out; ++ ++ au_sbilist_add(root->d_sb); ++ ++out: ++ return root; ++} ++ ++static void aufs_kill_sb(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ sbinfo = au_sbi(sb); ++ if (sbinfo) { ++ au_sbilist_del(sb); ++ aufs_write_lock(sb->s_root); ++ au_fhsm_fin(sb); ++ if (sbinfo->si_wbr_create_ops->fin) ++ sbinfo->si_wbr_create_ops->fin(sb); ++ if (au_opt_test(sbinfo->si_mntflags, UDBA_HNOTIFY)) { ++ au_opt_set_udba(sbinfo->si_mntflags, UDBA_NONE); ++ au_remount_refresh(sb, /*do_idop*/0); ++ } ++ if (au_opt_test(sbinfo->si_mntflags, PLINK)) ++ au_plink_put(sb, /*verbose*/1); ++ au_xino_clr(sb); ++ au_dr_opt_flush(sb); ++ sbinfo->si_sb = NULL; ++ aufs_write_unlock(sb->s_root); ++ au_nwt_flush(&sbinfo->si_nowait); ++ } ++ kill_anon_super(sb); ++} ++ ++struct file_system_type aufs_fs_type = { ++ .name = AUFS_FSTYPE, ++ /* a race between rename and others */ ++ .fs_flags = FS_RENAME_DOES_D_MOVE, ++ .mount = aufs_mount, ++ .kill_sb = aufs_kill_sb, ++ /* no need to __module_get() and module_put(). */ ++ .owner = THIS_MODULE, ++}; +diff --git a/fs/aufs/super.h b/fs/aufs/super.h +new file mode 100644 +index 000000000000..fe9533038314 +--- /dev/null ++++ b/fs/aufs/super.h +@@ -0,0 +1,576 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * super_block operations ++ */ ++ ++#ifndef __AUFS_SUPER_H__ ++#define __AUFS_SUPER_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include "hbl.h" ++#include "lcnt.h" ++#include "rwsem.h" ++#include "wkq.h" ++ ++/* policies to select one among multiple writable branches */ ++struct au_wbr_copyup_operations { ++ int (*copyup)(struct dentry *dentry); ++}; ++ ++#define AuWbr_DIR 1 /* target is a dir */ ++#define AuWbr_PARENT (1 << 1) /* always require a parent */ ++ ++#define au_ftest_wbr(flags, name) ((flags) & AuWbr_##name) ++#define au_fset_wbr(flags, name) { (flags) |= AuWbr_##name; } ++#define au_fclr_wbr(flags, name) { (flags) &= ~AuWbr_##name; } ++ ++struct au_wbr_create_operations { ++ int (*create)(struct dentry *dentry, unsigned int flags); ++ int (*init)(struct super_block *sb); ++ int (*fin)(struct super_block *sb); ++}; ++ ++struct au_wbr_mfs { ++ struct mutex mfs_lock; /* protect this structure */ ++ unsigned long mfs_jiffy; ++ unsigned long mfs_expire; ++ aufs_bindex_t mfs_bindex; ++ ++ unsigned long long mfsrr_bytes; ++ unsigned long long mfsrr_watermark; ++}; ++ ++#define AuPlink_NHASH 100 ++static inline int au_plink_hash(ino_t ino) ++{ ++ return ino % AuPlink_NHASH; ++} ++ ++/* File-based Hierarchical Storage Management */ ++struct au_fhsm { ++#ifdef CONFIG_AUFS_FHSM ++ /* allow only one process who can receive the notification */ ++ spinlock_t fhsm_spin; ++ pid_t fhsm_pid; ++ wait_queue_head_t fhsm_wqh; ++ atomic_t fhsm_readable; ++ ++ /* these are protected by si_rwsem */ ++ unsigned long fhsm_expire; ++ aufs_bindex_t fhsm_bottom; ++#endif ++}; ++ ++struct au_branch; ++struct au_sbinfo { ++ /* nowait tasks in the system-wide workqueue */ ++ struct au_nowait_tasks si_nowait; ++ ++ /* ++ * tried sb->s_umount, but failed due to the dependency between i_mutex. ++ * rwsem for au_sbinfo is necessary. ++ */ ++ struct au_rwsem si_rwsem; ++ ++ /* ++ * dirty approach to protect sb->sb_inodes and ->s_files (gone) from ++ * remount. ++ */ ++ au_lcnt_t si_ninodes, si_nfiles; ++ ++ /* branch management */ ++ unsigned int si_generation; ++ ++ /* see AuSi_ flags */ ++ unsigned char au_si_status; ++ ++ aufs_bindex_t si_bbot; ++ ++ /* dirty trick to keep br_id plus */ ++ unsigned int si_last_br_id : ++ sizeof(aufs_bindex_t) * BITS_PER_BYTE - 1; ++ struct au_branch **si_branch; ++ ++ /* policy to select a writable branch */ ++ unsigned char si_wbr_copyup; ++ unsigned char si_wbr_create; ++ struct au_wbr_copyup_operations *si_wbr_copyup_ops; ++ struct au_wbr_create_operations *si_wbr_create_ops; ++ ++ /* round robin */ ++ atomic_t si_wbr_rr_next; ++ ++ /* most free space */ ++ struct au_wbr_mfs si_wbr_mfs; ++ ++ /* File-based Hierarchical Storage Management */ ++ struct au_fhsm si_fhsm; ++ ++ /* mount flags */ ++ /* include/asm-ia64/siginfo.h defines a macro named si_flags */ ++ unsigned int si_mntflags; ++ ++ /* external inode number (bitmap and translation table) */ ++ vfs_readf_t si_xread; ++ vfs_writef_t si_xwrite; ++ loff_t si_ximaxent; /* max entries in a xino */ ++ ++ struct file *si_xib; ++ struct mutex si_xib_mtx; /* protect xib members */ ++ unsigned long *si_xib_buf; ++ unsigned long si_xib_last_pindex; ++ int si_xib_next_bit; ++ ++ unsigned long si_xino_jiffy; ++ unsigned long si_xino_expire; ++ /* reserved for future use */ ++ /* unsigned long long si_xib_limit; */ /* Max xib file size */ ++ ++#ifdef CONFIG_AUFS_EXPORT ++ /* i_generation */ ++ /* todo: make xigen file an array to support many inode numbers */ ++ struct file *si_xigen; ++ atomic_t si_xigen_next; ++#endif ++ ++ /* dirty trick to support atomic_open */ ++ struct hlist_bl_head si_aopen; ++ ++ /* vdir parameters */ ++ unsigned long si_rdcache; /* max cache time in jiffies */ ++ unsigned int si_rdblk; /* deblk size */ ++ unsigned int si_rdhash; /* hash size */ ++ ++ /* ++ * If the number of whiteouts are larger than si_dirwh, leave all of ++ * them after au_whtmp_ren to reduce the cost of rmdir(2). ++ * future fsck.aufs or kernel thread will remove them later. ++ * Otherwise, remove all whiteouts and the dir in rmdir(2). ++ */ ++ unsigned int si_dirwh; ++ ++ /* pseudo_link list */ ++ struct hlist_bl_head si_plink[AuPlink_NHASH]; ++ wait_queue_head_t si_plink_wq; ++ spinlock_t si_plink_maint_lock; ++ pid_t si_plink_maint_pid; ++ ++ /* file list */ ++ struct hlist_bl_head si_files; ++ ++ /* with/without getattr, brother of sb->s_d_op */ ++ struct inode_operations *si_iop_array; ++ ++ /* ++ * sysfs and lifetime management. ++ * this is not a small structure and it may be a waste of memory in case ++ * of sysfs is disabled, particularly when many aufs-es are mounted. ++ * but using sysfs is majority. ++ */ ++ struct kobject si_kobj; ++#ifdef CONFIG_DEBUG_FS ++ struct dentry *si_dbgaufs; ++ struct dentry *si_dbgaufs_plink; ++ struct dentry *si_dbgaufs_xib; ++#ifdef CONFIG_AUFS_EXPORT ++ struct dentry *si_dbgaufs_xigen; ++#endif ++#endif ++ ++#ifdef CONFIG_AUFS_SBILIST ++ struct hlist_bl_node si_list; ++#endif ++ ++ /* dirty, necessary for unmounting, sysfs and sysrq */ ++ struct super_block *si_sb; ++}; ++ ++/* sbinfo status flags */ ++/* ++ * set true when refresh_dirs() failed at remount time. ++ * then try refreshing dirs at access time again. ++ * if it is false, refreshing dirs at access time is unnecessary ++ */ ++#define AuSi_FAILED_REFRESH_DIR 1 ++#define AuSi_FHSM (1 << 1) /* fhsm is active now */ ++#define AuSi_NO_DREVAL (1 << 2) /* disable all d_revalidate */ ++ ++#ifndef CONFIG_AUFS_FHSM ++#undef AuSi_FHSM ++#define AuSi_FHSM 0 ++#endif ++ ++static inline unsigned char au_do_ftest_si(struct au_sbinfo *sbi, ++ unsigned int flag) ++{ ++ AuRwMustAnyLock(&sbi->si_rwsem); ++ return sbi->au_si_status & flag; ++} ++#define au_ftest_si(sbinfo, name) au_do_ftest_si(sbinfo, AuSi_##name) ++#define au_fset_si(sbinfo, name) do { \ ++ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ ++ (sbinfo)->au_si_status |= AuSi_##name; \ ++} while (0) ++#define au_fclr_si(sbinfo, name) do { \ ++ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ ++ (sbinfo)->au_si_status &= ~AuSi_##name; \ ++} while (0) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* policy to select one among writable branches */ ++#define AuWbrCopyup(sbinfo, ...) \ ++ ((sbinfo)->si_wbr_copyup_ops->copyup(__VA_ARGS__)) ++#define AuWbrCreate(sbinfo, ...) \ ++ ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__)) ++ ++/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */ ++#define AuLock_DW 1 /* write-lock dentry */ ++#define AuLock_IR (1 << 1) /* read-lock inode */ ++#define AuLock_IW (1 << 2) /* write-lock inode */ ++#define AuLock_FLUSH (1 << 3) /* wait for 'nowait' tasks */ ++#define AuLock_DIRS (1 << 4) /* target is a pair of dirs */ ++ /* except RENAME_EXCHANGE */ ++#define AuLock_NOPLM (1 << 5) /* return err in plm mode */ ++#define AuLock_NOPLMW (1 << 6) /* wait for plm mode ends */ ++#define AuLock_GEN (1 << 7) /* test digen/iigen */ ++#define au_ftest_lock(flags, name) ((flags) & AuLock_##name) ++#define au_fset_lock(flags, name) \ ++ do { (flags) |= AuLock_##name; } while (0) ++#define au_fclr_lock(flags, name) \ ++ do { (flags) &= ~AuLock_##name; } while (0) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* super.c */ ++extern struct file_system_type aufs_fs_type; ++struct inode *au_iget_locked(struct super_block *sb, ino_t ino); ++typedef unsigned long long (*au_arraycb_t)(struct super_block *sb, void *array, ++ unsigned long long max, void *arg); ++void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, ++ struct super_block *sb, void *arg); ++struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max); ++void au_iarray_free(struct inode **a, unsigned long long max); ++ ++/* sbinfo.c */ ++void au_si_free(struct kobject *kobj); ++int au_si_alloc(struct super_block *sb); ++int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink); ++ ++unsigned int au_sigen_inc(struct super_block *sb); ++aufs_bindex_t au_new_br_id(struct super_block *sb); ++ ++int si_read_lock(struct super_block *sb, int flags); ++int si_write_lock(struct super_block *sb, int flags); ++int aufs_read_lock(struct dentry *dentry, int flags); ++void aufs_read_unlock(struct dentry *dentry, int flags); ++void aufs_write_lock(struct dentry *dentry); ++void aufs_write_unlock(struct dentry *dentry); ++int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags); ++void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2); ++ ++/* wbr_policy.c */ ++extern struct au_wbr_copyup_operations au_wbr_copyup_ops[]; ++extern struct au_wbr_create_operations au_wbr_create_ops[]; ++int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst); ++int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex); ++int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop); ++ ++/* mvdown.c */ ++int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *arg); ++ ++#ifdef CONFIG_AUFS_FHSM ++/* fhsm.c */ ++ ++static inline pid_t au_fhsm_pid(struct au_fhsm *fhsm) ++{ ++ pid_t pid; ++ ++ spin_lock(&fhsm->fhsm_spin); ++ pid = fhsm->fhsm_pid; ++ spin_unlock(&fhsm->fhsm_spin); ++ ++ return pid; ++} ++ ++void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force); ++void au_fhsm_wrote_all(struct super_block *sb, int force); ++int au_fhsm_fd(struct super_block *sb, int oflags); ++int au_fhsm_br_alloc(struct au_branch *br); ++void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex); ++void au_fhsm_fin(struct super_block *sb); ++void au_fhsm_init(struct au_sbinfo *sbinfo); ++void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec); ++void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo); ++#else ++AuStubVoid(au_fhsm_wrote, struct super_block *sb, aufs_bindex_t bindex, ++ int force) ++AuStubVoid(au_fhsm_wrote_all, struct super_block *sb, int force) ++AuStub(int, au_fhsm_fd, return -EOPNOTSUPP, struct super_block *sb, int oflags) ++AuStub(pid_t, au_fhsm_pid, return 0, struct au_fhsm *fhsm) ++AuStubInt0(au_fhsm_br_alloc, struct au_branch *br) ++AuStubVoid(au_fhsm_set_bottom, struct super_block *sb, aufs_bindex_t bindex) ++AuStubVoid(au_fhsm_fin, struct super_block *sb) ++AuStubVoid(au_fhsm_init, struct au_sbinfo *sbinfo) ++AuStubVoid(au_fhsm_set, struct au_sbinfo *sbinfo, unsigned int sec) ++AuStubVoid(au_fhsm_show, struct seq_file *seq, struct au_sbinfo *sbinfo) ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_sbinfo *au_sbi(struct super_block *sb) ++{ ++ return sb->s_fs_info; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_EXPORT ++int au_test_nfsd(void); ++void au_export_init(struct super_block *sb); ++void au_xigen_inc(struct inode *inode); ++int au_xigen_new(struct inode *inode); ++int au_xigen_set(struct super_block *sb, struct path *path); ++void au_xigen_clr(struct super_block *sb); ++ ++static inline int au_busy_or_stale(void) ++{ ++ if (!au_test_nfsd()) ++ return -EBUSY; ++ return -ESTALE; ++} ++#else ++AuStubInt0(au_test_nfsd, void) ++AuStubVoid(au_export_init, struct super_block *sb) ++AuStubVoid(au_xigen_inc, struct inode *inode) ++AuStubInt0(au_xigen_new, struct inode *inode) ++AuStubInt0(au_xigen_set, struct super_block *sb, struct path *path) ++AuStubVoid(au_xigen_clr, struct super_block *sb) ++AuStub(int, au_busy_or_stale, return -EBUSY, void) ++#endif /* CONFIG_AUFS_EXPORT */ ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_SBILIST ++/* module.c */ ++extern struct hlist_bl_head au_sbilist; ++ ++static inline void au_sbilist_init(void) ++{ ++ INIT_HLIST_BL_HEAD(&au_sbilist); ++} ++ ++static inline void au_sbilist_add(struct super_block *sb) ++{ ++ au_hbl_add(&au_sbi(sb)->si_list, &au_sbilist); ++} ++ ++static inline void au_sbilist_del(struct super_block *sb) ++{ ++ au_hbl_del(&au_sbi(sb)->si_list, &au_sbilist); ++} ++ ++#ifdef CONFIG_AUFS_MAGIC_SYSRQ ++static inline void au_sbilist_lock(void) ++{ ++ hlist_bl_lock(&au_sbilist); ++} ++ ++static inline void au_sbilist_unlock(void) ++{ ++ hlist_bl_unlock(&au_sbilist); ++} ++#define AuGFP_SBILIST GFP_ATOMIC ++#else ++AuStubVoid(au_sbilist_lock, void) ++AuStubVoid(au_sbilist_unlock, void) ++#define AuGFP_SBILIST GFP_NOFS ++#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ ++#else ++AuStubVoid(au_sbilist_init, void) ++AuStubVoid(au_sbilist_add, struct super_block *sb) ++AuStubVoid(au_sbilist_del, struct super_block *sb) ++AuStubVoid(au_sbilist_lock, void) ++AuStubVoid(au_sbilist_unlock, void) ++#define AuGFP_SBILIST GFP_NOFS ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline void dbgaufs_si_null(struct au_sbinfo *sbinfo) ++{ ++ /* ++ * This function is a dynamic '__init' function actually, ++ * so the tiny check for si_rwsem is unnecessary. ++ */ ++ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ ++#ifdef CONFIG_DEBUG_FS ++ sbinfo->si_dbgaufs = NULL; ++ sbinfo->si_dbgaufs_plink = NULL; ++ sbinfo->si_dbgaufs_xib = NULL; ++#ifdef CONFIG_AUFS_EXPORT ++ sbinfo->si_dbgaufs_xigen = NULL; ++#endif ++#endif ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* current->atomic_flags */ ++/* this value should never corrupt the ones defined in linux/sched.h */ ++#define PFA_AUFS 7 ++ ++TASK_PFA_TEST(AUFS, test_aufs) /* task_test_aufs */ ++TASK_PFA_SET(AUFS, aufs) /* task_set_aufs */ ++TASK_PFA_CLEAR(AUFS, aufs) /* task_clear_aufs */ ++ ++static inline int si_pid_test(struct super_block *sb) ++{ ++ return !!task_test_aufs(current); ++} ++ ++static inline void si_pid_clr(struct super_block *sb) ++{ ++ AuDebugOn(!task_test_aufs(current)); ++ task_clear_aufs(current); ++} ++ ++static inline void si_pid_set(struct super_block *sb) ++{ ++ AuDebugOn(task_test_aufs(current)); ++ task_set_aufs(current); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* lock superblock. mainly for entry point functions */ ++#define __si_read_lock(sb) au_rw_read_lock(&au_sbi(sb)->si_rwsem) ++#define __si_write_lock(sb) au_rw_write_lock(&au_sbi(sb)->si_rwsem) ++#define __si_read_trylock(sb) au_rw_read_trylock(&au_sbi(sb)->si_rwsem) ++#define __si_write_trylock(sb) au_rw_write_trylock(&au_sbi(sb)->si_rwsem) ++/* ++#define __si_read_trylock_nested(sb) \ ++ au_rw_read_trylock_nested(&au_sbi(sb)->si_rwsem) ++#define __si_write_trylock_nested(sb) \ ++ au_rw_write_trylock_nested(&au_sbi(sb)->si_rwsem) ++*/ ++ ++#define __si_read_unlock(sb) au_rw_read_unlock(&au_sbi(sb)->si_rwsem) ++#define __si_write_unlock(sb) au_rw_write_unlock(&au_sbi(sb)->si_rwsem) ++#define __si_downgrade_lock(sb) au_rw_dgrade_lock(&au_sbi(sb)->si_rwsem) ++ ++#define SiMustNoWaiters(sb) AuRwMustNoWaiters(&au_sbi(sb)->si_rwsem) ++#define SiMustAnyLock(sb) AuRwMustAnyLock(&au_sbi(sb)->si_rwsem) ++#define SiMustWriteLock(sb) AuRwMustWriteLock(&au_sbi(sb)->si_rwsem) ++ ++static inline void si_noflush_read_lock(struct super_block *sb) ++{ ++ __si_read_lock(sb); ++ si_pid_set(sb); ++} ++ ++static inline int si_noflush_read_trylock(struct super_block *sb) ++{ ++ int locked; ++ ++ locked = __si_read_trylock(sb); ++ if (locked) ++ si_pid_set(sb); ++ return locked; ++} ++ ++static inline void si_noflush_write_lock(struct super_block *sb) ++{ ++ __si_write_lock(sb); ++ si_pid_set(sb); ++} ++ ++static inline int si_noflush_write_trylock(struct super_block *sb) ++{ ++ int locked; ++ ++ locked = __si_write_trylock(sb); ++ if (locked) ++ si_pid_set(sb); ++ return locked; ++} ++ ++#if 0 /* reserved */ ++static inline int si_read_trylock(struct super_block *sb, int flags) ++{ ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&au_sbi(sb)->si_nowait); ++ return si_noflush_read_trylock(sb); ++} ++#endif ++ ++static inline void si_read_unlock(struct super_block *sb) ++{ ++ si_pid_clr(sb); ++ __si_read_unlock(sb); ++} ++ ++#if 0 /* reserved */ ++static inline int si_write_trylock(struct super_block *sb, int flags) ++{ ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&au_sbi(sb)->si_nowait); ++ return si_noflush_write_trylock(sb); ++} ++#endif ++ ++static inline void si_write_unlock(struct super_block *sb) ++{ ++ si_pid_clr(sb); ++ __si_write_unlock(sb); ++} ++ ++#if 0 /* reserved */ ++static inline void si_downgrade_lock(struct super_block *sb) ++{ ++ __si_downgrade_lock(sb); ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline aufs_bindex_t au_sbbot(struct super_block *sb) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_bbot; ++} ++ ++static inline unsigned int au_mntflags(struct super_block *sb) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_mntflags; ++} ++ ++static inline unsigned int au_sigen(struct super_block *sb) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_generation; ++} ++ ++static inline struct au_branch *au_sbr(struct super_block *sb, ++ aufs_bindex_t bindex) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_branch[0 + bindex]; ++} ++ ++static inline loff_t au_xi_maxent(struct super_block *sb) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_ximaxent; ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_SUPER_H__ */ +diff --git a/fs/aufs/sysaufs.c b/fs/aufs/sysaufs.c +new file mode 100644 +index 000000000000..0e9bcb0232bc +--- /dev/null ++++ b/fs/aufs/sysaufs.c +@@ -0,0 +1,80 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * sysfs interface and lifetime management ++ * they are necessary regardless sysfs is disabled. ++ */ ++ ++#include ++#include "aufs.h" ++ ++unsigned long sysaufs_si_mask; ++struct kset *sysaufs_kset; ++ ++#define AuSiAttr(_name) { \ ++ .attr = { .name = __stringify(_name), .mode = 0444 }, \ ++ .show = sysaufs_si_##_name, \ ++} ++ ++static struct sysaufs_si_attr sysaufs_si_attr_xi_path = AuSiAttr(xi_path); ++struct attribute *sysaufs_si_attrs[] = { ++ &sysaufs_si_attr_xi_path.attr, ++ NULL, ++}; ++ ++static const struct sysfs_ops au_sbi_ops = { ++ .show = sysaufs_si_show ++}; ++ ++static struct kobj_type au_sbi_ktype = { ++ .release = au_si_free, ++ .sysfs_ops = &au_sbi_ops, ++ .default_attrs = sysaufs_si_attrs ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++int sysaufs_si_init(struct au_sbinfo *sbinfo) ++{ ++ int err; ++ ++ sbinfo->si_kobj.kset = sysaufs_kset; ++ /* cf. sysaufs_name() */ ++ err = kobject_init_and_add ++ (&sbinfo->si_kobj, &au_sbi_ktype, /*&sysaufs_kset->kobj*/NULL, ++ SysaufsSiNamePrefix "%lx", sysaufs_si_id(sbinfo)); ++ ++ return err; ++} ++ ++void sysaufs_fin(void) ++{ ++ sysfs_remove_group(&sysaufs_kset->kobj, sysaufs_attr_group); ++ kset_unregister(sysaufs_kset); ++} ++ ++int __init sysaufs_init(void) ++{ ++ int err; ++ ++ do { ++ get_random_bytes(&sysaufs_si_mask, sizeof(sysaufs_si_mask)); ++ } while (!sysaufs_si_mask); ++ ++ err = -EINVAL; ++ sysaufs_kset = kset_create_and_add(AUFS_NAME, NULL, fs_kobj); ++ if (unlikely(!sysaufs_kset)) ++ goto out; ++ err = PTR_ERR(sysaufs_kset); ++ if (IS_ERR(sysaufs_kset)) ++ goto out; ++ err = sysfs_create_group(&sysaufs_kset->kobj, sysaufs_attr_group); ++ if (unlikely(err)) ++ kset_unregister(sysaufs_kset); ++ ++out: ++ return err; ++} +diff --git a/fs/aufs/sysaufs.h b/fs/aufs/sysaufs.h +new file mode 100644 +index 000000000000..bf82fa4730d3 +--- /dev/null ++++ b/fs/aufs/sysaufs.h +@@ -0,0 +1,89 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * sysfs interface and mount lifetime management ++ */ ++ ++#ifndef __SYSAUFS_H__ ++#define __SYSAUFS_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include "module.h" ++ ++struct super_block; ++struct au_sbinfo; ++ ++struct sysaufs_si_attr { ++ struct attribute attr; ++ int (*show)(struct seq_file *seq, struct super_block *sb); ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* sysaufs.c */ ++extern unsigned long sysaufs_si_mask; ++extern struct kset *sysaufs_kset; ++extern struct attribute *sysaufs_si_attrs[]; ++int sysaufs_si_init(struct au_sbinfo *sbinfo); ++int __init sysaufs_init(void); ++void sysaufs_fin(void); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* some people doesn't like to show a pointer in kernel */ ++static inline unsigned long sysaufs_si_id(struct au_sbinfo *sbinfo) ++{ ++ return sysaufs_si_mask ^ (unsigned long)sbinfo; ++} ++ ++#define SysaufsSiNamePrefix "si_" ++#define SysaufsSiNameLen (sizeof(SysaufsSiNamePrefix) + 16) ++static inline void sysaufs_name(struct au_sbinfo *sbinfo, char *name) ++{ ++ snprintf(name, SysaufsSiNameLen, SysaufsSiNamePrefix "%lx", ++ sysaufs_si_id(sbinfo)); ++} ++ ++struct au_branch; ++#ifdef CONFIG_SYSFS ++/* sysfs.c */ ++extern struct attribute_group *sysaufs_attr_group; ++ ++int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb); ++ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, ++ char *buf); ++long au_brinfo_ioctl(struct file *file, unsigned long arg); ++#ifdef CONFIG_COMPAT ++long au_brinfo_compat_ioctl(struct file *file, unsigned long arg); ++#endif ++ ++void sysaufs_br_init(struct au_branch *br); ++void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex); ++void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); ++ ++#define sysaufs_brs_init() do {} while (0) ++ ++#else ++#define sysaufs_attr_group NULL ++ ++AuStubInt0(sysaufs_si_xi_path, struct seq_file *seq, struct super_block *sb) ++AuStub(ssize_t, sysaufs_si_show, return 0, struct kobject *kobj, ++ struct attribute *attr, char *buf) ++AuStubVoid(sysaufs_br_init, struct au_branch *br) ++AuStubVoid(sysaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex) ++AuStubVoid(sysaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) ++ ++static inline void sysaufs_brs_init(void) ++{ ++ sysaufs_brs = 0; ++} ++ ++#endif /* CONFIG_SYSFS */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __SYSAUFS_H__ */ +diff --git a/fs/aufs/sysfs.c b/fs/aufs/sysfs.c +new file mode 100644 +index 000000000000..bb90eb1021cb +--- /dev/null ++++ b/fs/aufs/sysfs.c +@@ -0,0 +1,337 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * sysfs interface ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++static struct attribute *au_attr[] = { ++ NULL, /* need to NULL terminate the list of attributes */ ++}; ++ ++static struct attribute_group sysaufs_attr_group_body = { ++ .attrs = au_attr ++}; ++ ++struct attribute_group *sysaufs_attr_group = &sysaufs_attr_group_body; ++ ++/* ---------------------------------------------------------------------- */ ++ ++int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb) ++{ ++ int err; ++ ++ SiMustAnyLock(sb); ++ ++ err = 0; ++ if (au_opt_test(au_mntflags(sb), XINO)) { ++ err = au_xino_path(seq, au_sbi(sb)->si_xib); ++ seq_putc(seq, '\n'); ++ } ++ return err; ++} ++ ++/* ++ * the lifetime of branch is independent from the entry under sysfs. ++ * sysfs handles the lifetime of the entry, and never call ->show() after it is ++ * unlinked. ++ */ ++static int sysaufs_si_br(struct seq_file *seq, struct super_block *sb, ++ aufs_bindex_t bindex, int idx) ++{ ++ int err; ++ struct path path; ++ struct dentry *root; ++ struct au_branch *br; ++ au_br_perm_str_t perm; ++ ++ AuDbg("b%d\n", bindex); ++ ++ err = 0; ++ root = sb->s_root; ++ di_read_lock_parent(root, !AuLock_IR); ++ br = au_sbr(sb, bindex); ++ ++ switch (idx) { ++ case AuBrSysfs_BR: ++ path.mnt = au_br_mnt(br); ++ path.dentry = au_h_dptr(root, bindex); ++ err = au_seq_path(seq, &path); ++ if (!err) { ++ au_optstr_br_perm(&perm, br->br_perm); ++ seq_printf(seq, "=%s\n", perm.a); ++ } ++ break; ++ case AuBrSysfs_BRID: ++ seq_printf(seq, "%d\n", br->br_id); ++ break; ++ } ++ di_read_unlock(root, !AuLock_IR); ++ if (unlikely(err || seq_has_overflowed(seq))) ++ err = -E2BIG; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct seq_file *au_seq(char *p, ssize_t len) ++{ ++ struct seq_file *seq; ++ ++ seq = kzalloc(sizeof(*seq), GFP_NOFS); ++ if (seq) { ++ /* mutex_init(&seq.lock); */ ++ seq->buf = p; ++ seq->size = len; ++ return seq; /* success */ ++ } ++ ++ seq = ERR_PTR(-ENOMEM); ++ return seq; ++} ++ ++#define SysaufsBr_PREFIX "br" ++#define SysaufsBrid_PREFIX "brid" ++ ++/* todo: file size may exceed PAGE_SIZE */ ++ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, ++ char *buf) ++{ ++ ssize_t err; ++ int idx; ++ long l; ++ aufs_bindex_t bbot; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ struct seq_file *seq; ++ char *name; ++ struct attribute **cattr; ++ ++ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); ++ sb = sbinfo->si_sb; ++ ++ /* ++ * prevent a race condition between sysfs and aufs. ++ * for instance, sysfs_file_read() calls sysfs_get_active_two() which ++ * prohibits maintaining the sysfs entries. ++ * hew we acquire read lock after sysfs_get_active_two(). ++ * on the other hand, the remount process may maintain the sysfs/aufs ++ * entries after acquiring write lock. ++ * it can cause a deadlock. ++ * simply we gave up processing read here. ++ */ ++ err = -EBUSY; ++ if (unlikely(!si_noflush_read_trylock(sb))) ++ goto out; ++ ++ seq = au_seq(buf, PAGE_SIZE); ++ err = PTR_ERR(seq); ++ if (IS_ERR(seq)) ++ goto out_unlock; ++ ++ name = (void *)attr->name; ++ cattr = sysaufs_si_attrs; ++ while (*cattr) { ++ if (!strcmp(name, (*cattr)->name)) { ++ err = container_of(*cattr, struct sysaufs_si_attr, attr) ++ ->show(seq, sb); ++ goto out_seq; ++ } ++ cattr++; ++ } ++ ++ if (!strncmp(name, SysaufsBrid_PREFIX, ++ sizeof(SysaufsBrid_PREFIX) - 1)) { ++ idx = AuBrSysfs_BRID; ++ name += sizeof(SysaufsBrid_PREFIX) - 1; ++ } else if (!strncmp(name, SysaufsBr_PREFIX, ++ sizeof(SysaufsBr_PREFIX) - 1)) { ++ idx = AuBrSysfs_BR; ++ name += sizeof(SysaufsBr_PREFIX) - 1; ++ } else ++ BUG(); ++ ++ err = kstrtol(name, 10, &l); ++ if (!err) { ++ bbot = au_sbbot(sb); ++ if (l <= bbot) ++ err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l, idx); ++ else ++ err = -ENOENT; ++ } ++ ++out_seq: ++ if (!err) { ++ err = seq->count; ++ /* sysfs limit */ ++ if (unlikely(err == PAGE_SIZE)) ++ err = -EFBIG; ++ } ++ kfree(seq); ++out_unlock: ++ si_read_unlock(sb); ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_brinfo(struct super_block *sb, union aufs_brinfo __user *arg) ++{ ++ int err; ++ int16_t brid; ++ aufs_bindex_t bindex, bbot; ++ size_t sz; ++ char *buf; ++ struct seq_file *seq; ++ struct au_branch *br; ++ ++ si_read_lock(sb, AuLock_FLUSH); ++ bbot = au_sbbot(sb); ++ err = bbot + 1; ++ if (!arg) ++ goto out; ++ ++ err = -ENOMEM; ++ buf = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!buf)) ++ goto out; ++ ++ seq = au_seq(buf, PAGE_SIZE); ++ err = PTR_ERR(seq); ++ if (IS_ERR(seq)) ++ goto out_buf; ++ ++ sz = sizeof(*arg) - offsetof(union aufs_brinfo, path); ++ for (bindex = 0; bindex <= bbot; bindex++, arg++) { ++ err = !access_ok(VERIFY_WRITE, arg, sizeof(*arg)); ++ if (unlikely(err)) ++ break; ++ ++ br = au_sbr(sb, bindex); ++ brid = br->br_id; ++ BUILD_BUG_ON(sizeof(brid) != sizeof(arg->id)); ++ err = __put_user(brid, &arg->id); ++ if (unlikely(err)) ++ break; ++ ++ BUILD_BUG_ON(sizeof(br->br_perm) != sizeof(arg->perm)); ++ err = __put_user(br->br_perm, &arg->perm); ++ if (unlikely(err)) ++ break; ++ ++ err = au_seq_path(seq, &br->br_path); ++ if (unlikely(err)) ++ break; ++ seq_putc(seq, '\0'); ++ if (!seq_has_overflowed(seq)) { ++ err = copy_to_user(arg->path, seq->buf, seq->count); ++ seq->count = 0; ++ if (unlikely(err)) ++ break; ++ } else { ++ err = -E2BIG; ++ goto out_seq; ++ } ++ } ++ if (unlikely(err)) ++ err = -EFAULT; ++ ++out_seq: ++ kfree(seq); ++out_buf: ++ free_page((unsigned long)buf); ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++long au_brinfo_ioctl(struct file *file, unsigned long arg) ++{ ++ return au_brinfo(file->f_path.dentry->d_sb, (void __user *)arg); ++} ++ ++#ifdef CONFIG_COMPAT ++long au_brinfo_compat_ioctl(struct file *file, unsigned long arg) ++{ ++ return au_brinfo(file->f_path.dentry->d_sb, compat_ptr(arg)); ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++void sysaufs_br_init(struct au_branch *br) ++{ ++ int i; ++ struct au_brsysfs *br_sysfs; ++ struct attribute *attr; ++ ++ br_sysfs = br->br_sysfs; ++ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { ++ attr = &br_sysfs->attr; ++ sysfs_attr_init(attr); ++ attr->name = br_sysfs->name; ++ attr->mode = 0444; ++ br_sysfs++; ++ } ++} ++ ++void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ struct au_branch *br; ++ struct kobject *kobj; ++ struct au_brsysfs *br_sysfs; ++ int i; ++ aufs_bindex_t bbot; ++ ++ if (!sysaufs_brs) ++ return; ++ ++ kobj = &au_sbi(sb)->si_kobj; ++ bbot = au_sbbot(sb); ++ for (; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ br_sysfs = br->br_sysfs; ++ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { ++ sysfs_remove_file(kobj, &br_sysfs->attr); ++ br_sysfs++; ++ } ++ } ++} ++ ++void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ int err, i; ++ aufs_bindex_t bbot; ++ struct kobject *kobj; ++ struct au_branch *br; ++ struct au_brsysfs *br_sysfs; ++ ++ if (!sysaufs_brs) ++ return; ++ ++ kobj = &au_sbi(sb)->si_kobj; ++ bbot = au_sbbot(sb); ++ for (; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ br_sysfs = br->br_sysfs; ++ snprintf(br_sysfs[AuBrSysfs_BR].name, sizeof(br_sysfs->name), ++ SysaufsBr_PREFIX "%d", bindex); ++ snprintf(br_sysfs[AuBrSysfs_BRID].name, sizeof(br_sysfs->name), ++ SysaufsBrid_PREFIX "%d", bindex); ++ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { ++ err = sysfs_create_file(kobj, &br_sysfs->attr); ++ if (unlikely(err)) ++ pr_warn("failed %s under sysfs(%d)\n", ++ br_sysfs->name, err); ++ br_sysfs++; ++ } ++ } ++} +diff --git a/fs/aufs/sysrq.c b/fs/aufs/sysrq.c +new file mode 100644 +index 000000000000..e6b842a65117 +--- /dev/null ++++ b/fs/aufs/sysrq.c +@@ -0,0 +1,147 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * magic sysrq handler ++ */ ++ ++/* #include */ ++#include ++#include "aufs.h" ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void sysrq_sb(struct super_block *sb) ++{ ++ char *plevel; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ struct hlist_bl_head *files; ++ struct hlist_bl_node *pos; ++ struct au_finfo *finfo; ++ ++ plevel = au_plevel; ++ au_plevel = KERN_WARNING; ++ ++ /* since we define pr_fmt, call printk directly */ ++#define pr(str) printk(KERN_WARNING AUFS_NAME ": " str) ++ ++ sbinfo = au_sbi(sb); ++ printk(KERN_WARNING "si=%lx\n", sysaufs_si_id(sbinfo)); ++ pr("superblock\n"); ++ au_dpri_sb(sb); ++ ++#if 0 ++ pr("root dentry\n"); ++ au_dpri_dentry(sb->s_root); ++ pr("root inode\n"); ++ au_dpri_inode(d_inode(sb->s_root)); ++#endif ++ ++#if 0 ++ do { ++ int err, i, j, ndentry; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ ++ err = au_dpages_init(&dpages, GFP_ATOMIC); ++ if (unlikely(err)) ++ break; ++ err = au_dcsub_pages(&dpages, sb->s_root, NULL, NULL); ++ if (!err) ++ for (i = 0; i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ ndentry = dpage->ndentry; ++ for (j = 0; j < ndentry; j++) ++ au_dpri_dentry(dpage->dentries[j]); ++ } ++ au_dpages_free(&dpages); ++ } while (0); ++#endif ++ ++#if 1 ++ { ++ struct inode *i; ++ ++ pr("isolated inode\n"); ++ spin_lock(&sb->s_inode_list_lock); ++ list_for_each_entry(i, &sb->s_inodes, i_sb_list) { ++ spin_lock(&i->i_lock); ++ if (1 || hlist_empty(&i->i_dentry)) ++ au_dpri_inode(i); ++ spin_unlock(&i->i_lock); ++ } ++ spin_unlock(&sb->s_inode_list_lock); ++ } ++#endif ++ pr("files\n"); ++ files = &au_sbi(sb)->si_files; ++ hlist_bl_lock(files); ++ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { ++ umode_t mode; ++ ++ file = finfo->fi_file; ++ mode = file_inode(file)->i_mode; ++ if (!special_file(mode)) ++ au_dpri_file(file); ++ } ++ hlist_bl_unlock(files); ++ pr("done\n"); ++ ++#undef pr ++ au_plevel = plevel; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* module parameter */ ++static char *aufs_sysrq_key = "a"; ++module_param_named(sysrq, aufs_sysrq_key, charp, 0444); ++MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME); ++ ++static void au_sysrq(int key __maybe_unused) ++{ ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_node *pos; ++ ++ lockdep_off(); ++ au_sbilist_lock(); ++ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) ++ sysrq_sb(sbinfo->si_sb); ++ au_sbilist_unlock(); ++ lockdep_on(); ++} ++ ++static struct sysrq_key_op au_sysrq_op = { ++ .handler = au_sysrq, ++ .help_msg = "Aufs", ++ .action_msg = "Aufs", ++ .enable_mask = SYSRQ_ENABLE_DUMP ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++int __init au_sysrq_init(void) ++{ ++ int err; ++ char key; ++ ++ err = -1; ++ key = *aufs_sysrq_key; ++ if ('a' <= key && key <= 'z') ++ err = register_sysrq_key(key, &au_sysrq_op); ++ if (unlikely(err)) ++ pr_err("err %d, sysrq=%c\n", err, key); ++ return err; ++} ++ ++void au_sysrq_fin(void) ++{ ++ int err; ++ ++ err = unregister_sysrq_key(*aufs_sysrq_key, &au_sysrq_op); ++ if (unlikely(err)) ++ pr_err("err %d (ignored)\n", err); ++} +diff --git a/fs/aufs/vdir.c b/fs/aufs/vdir.c +new file mode 100644 +index 000000000000..1e7075386a51 +--- /dev/null ++++ b/fs/aufs/vdir.c +@@ -0,0 +1,882 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * virtual or vertical directory ++ */ ++ ++#include "aufs.h" ++ ++static unsigned int calc_size(int nlen) ++{ ++ return ALIGN(sizeof(struct au_vdir_de) + nlen, sizeof(ino_t)); ++} ++ ++static int set_deblk_end(union au_vdir_deblk_p *p, ++ union au_vdir_deblk_p *deblk_end) ++{ ++ if (calc_size(0) <= deblk_end->deblk - p->deblk) { ++ p->de->de_str.len = 0; ++ /* smp_mb(); */ ++ return 0; ++ } ++ return -1; /* error */ ++} ++ ++/* returns true or false */ ++static int is_deblk_end(union au_vdir_deblk_p *p, ++ union au_vdir_deblk_p *deblk_end) ++{ ++ if (calc_size(0) <= deblk_end->deblk - p->deblk) ++ return !p->de->de_str.len; ++ return 1; ++} ++ ++static unsigned char *last_deblk(struct au_vdir *vdir) ++{ ++ return vdir->vd_deblk[vdir->vd_nblk - 1]; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* estimate the appropriate size for name hash table */ ++unsigned int au_rdhash_est(loff_t sz) ++{ ++ unsigned int n; ++ ++ n = UINT_MAX; ++ sz >>= 10; ++ if (sz < n) ++ n = sz; ++ if (sz < AUFS_RDHASH_DEF) ++ n = AUFS_RDHASH_DEF; ++ /* pr_info("n %u\n", n); */ ++ return n; ++} ++ ++/* ++ * the allocated memory has to be freed by ++ * au_nhash_wh_free() or au_nhash_de_free(). ++ */ ++int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp) ++{ ++ struct hlist_head *head; ++ unsigned int u; ++ size_t sz; ++ ++ sz = sizeof(*nhash->nh_head) * num_hash; ++ head = kmalloc(sz, gfp); ++ if (head) { ++ nhash->nh_num = num_hash; ++ nhash->nh_head = head; ++ for (u = 0; u < num_hash; u++) ++ INIT_HLIST_HEAD(head++); ++ return 0; /* success */ ++ } ++ ++ return -ENOMEM; ++} ++ ++static void nhash_count(struct hlist_head *head) ++{ ++#if 0 ++ unsigned long n; ++ struct hlist_node *pos; ++ ++ n = 0; ++ hlist_for_each(pos, head) ++ n++; ++ pr_info("%lu\n", n); ++#endif ++} ++ ++static void au_nhash_wh_do_free(struct hlist_head *head) ++{ ++ struct au_vdir_wh *pos; ++ struct hlist_node *node; ++ ++ hlist_for_each_entry_safe(pos, node, head, wh_hash) ++ kfree(pos); ++} ++ ++static void au_nhash_de_do_free(struct hlist_head *head) ++{ ++ struct au_vdir_dehstr *pos; ++ struct hlist_node *node; ++ ++ hlist_for_each_entry_safe(pos, node, head, hash) ++ au_cache_free_vdir_dehstr(pos); ++} ++ ++static void au_nhash_do_free(struct au_nhash *nhash, ++ void (*free)(struct hlist_head *head)) ++{ ++ unsigned int n; ++ struct hlist_head *head; ++ ++ n = nhash->nh_num; ++ if (!n) ++ return; ++ ++ head = nhash->nh_head; ++ while (n-- > 0) { ++ nhash_count(head); ++ free(head++); ++ } ++ kfree(nhash->nh_head); ++} ++ ++void au_nhash_wh_free(struct au_nhash *whlist) ++{ ++ au_nhash_do_free(whlist, au_nhash_wh_do_free); ++} ++ ++static void au_nhash_de_free(struct au_nhash *delist) ++{ ++ au_nhash_do_free(delist, au_nhash_de_do_free); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, ++ int limit) ++{ ++ int num; ++ unsigned int u, n; ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ ++ num = 0; ++ n = whlist->nh_num; ++ head = whlist->nh_head; ++ for (u = 0; u < n; u++, head++) ++ hlist_for_each_entry(pos, head, wh_hash) ++ if (pos->wh_bindex == btgt && ++num > limit) ++ return 1; ++ return 0; ++} ++ ++static struct hlist_head *au_name_hash(struct au_nhash *nhash, ++ unsigned char *name, ++ unsigned int len) ++{ ++ unsigned int v; ++ /* const unsigned int magic_bit = 12; */ ++ ++ AuDebugOn(!nhash->nh_num || !nhash->nh_head); ++ ++ v = 0; ++ if (len > 8) ++ len = 8; ++ while (len--) ++ v += *name++; ++ /* v = hash_long(v, magic_bit); */ ++ v %= nhash->nh_num; ++ return nhash->nh_head + v; ++} ++ ++static int au_nhash_test_name(struct au_vdir_destr *str, const char *name, ++ int nlen) ++{ ++ return str->len == nlen && !memcmp(str->name, name, nlen); ++} ++ ++/* returns found or not */ ++int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen) ++{ ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ struct au_vdir_destr *str; ++ ++ head = au_name_hash(whlist, name, nlen); ++ hlist_for_each_entry(pos, head, wh_hash) { ++ str = &pos->wh_str; ++ AuDbg("%.*s\n", str->len, str->name); ++ if (au_nhash_test_name(str, name, nlen)) ++ return 1; ++ } ++ return 0; ++} ++ ++/* returns found(true) or not */ ++static int test_known(struct au_nhash *delist, char *name, int nlen) ++{ ++ struct hlist_head *head; ++ struct au_vdir_dehstr *pos; ++ struct au_vdir_destr *str; ++ ++ head = au_name_hash(delist, name, nlen); ++ hlist_for_each_entry(pos, head, hash) { ++ str = pos->str; ++ AuDbg("%.*s\n", str->len, str->name); ++ if (au_nhash_test_name(str, name, nlen)) ++ return 1; ++ } ++ return 0; ++} ++ ++static void au_shwh_init_wh(struct au_vdir_wh *wh, ino_t ino, ++ unsigned char d_type) ++{ ++#ifdef CONFIG_AUFS_SHWH ++ wh->wh_ino = ino; ++ wh->wh_type = d_type; ++#endif ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, ++ unsigned int d_type, aufs_bindex_t bindex, ++ unsigned char shwh) ++{ ++ int err; ++ struct au_vdir_destr *str; ++ struct au_vdir_wh *wh; ++ ++ AuDbg("%.*s\n", nlen, name); ++ AuDebugOn(!whlist->nh_num || !whlist->nh_head); ++ ++ err = -ENOMEM; ++ wh = kmalloc(sizeof(*wh) + nlen, GFP_NOFS); ++ if (unlikely(!wh)) ++ goto out; ++ ++ err = 0; ++ wh->wh_bindex = bindex; ++ if (shwh) ++ au_shwh_init_wh(wh, ino, d_type); ++ str = &wh->wh_str; ++ str->len = nlen; ++ memcpy(str->name, name, nlen); ++ hlist_add_head(&wh->wh_hash, au_name_hash(whlist, name, nlen)); ++ /* smp_mb(); */ ++ ++out: ++ return err; ++} ++ ++static int append_deblk(struct au_vdir *vdir) ++{ ++ int err; ++ unsigned long ul; ++ const unsigned int deblk_sz = vdir->vd_deblk_sz; ++ union au_vdir_deblk_p p, deblk_end; ++ unsigned char **o; ++ ++ err = -ENOMEM; ++ o = au_krealloc(vdir->vd_deblk, sizeof(*o) * (vdir->vd_nblk + 1), ++ GFP_NOFS, /*may_shrink*/0); ++ if (unlikely(!o)) ++ goto out; ++ ++ vdir->vd_deblk = o; ++ p.deblk = kmalloc(deblk_sz, GFP_NOFS); ++ if (p.deblk) { ++ ul = vdir->vd_nblk++; ++ vdir->vd_deblk[ul] = p.deblk; ++ vdir->vd_last.ul = ul; ++ vdir->vd_last.p.deblk = p.deblk; ++ deblk_end.deblk = p.deblk + deblk_sz; ++ err = set_deblk_end(&p, &deblk_end); ++ } ++ ++out: ++ return err; ++} ++ ++static int append_de(struct au_vdir *vdir, char *name, int nlen, ino_t ino, ++ unsigned int d_type, struct au_nhash *delist) ++{ ++ int err; ++ unsigned int sz; ++ const unsigned int deblk_sz = vdir->vd_deblk_sz; ++ union au_vdir_deblk_p p, *room, deblk_end; ++ struct au_vdir_dehstr *dehstr; ++ ++ p.deblk = last_deblk(vdir); ++ deblk_end.deblk = p.deblk + deblk_sz; ++ room = &vdir->vd_last.p; ++ AuDebugOn(room->deblk < p.deblk || deblk_end.deblk <= room->deblk ++ || !is_deblk_end(room, &deblk_end)); ++ ++ sz = calc_size(nlen); ++ if (unlikely(sz > deblk_end.deblk - room->deblk)) { ++ err = append_deblk(vdir); ++ if (unlikely(err)) ++ goto out; ++ ++ p.deblk = last_deblk(vdir); ++ deblk_end.deblk = p.deblk + deblk_sz; ++ /* smp_mb(); */ ++ AuDebugOn(room->deblk != p.deblk); ++ } ++ ++ err = -ENOMEM; ++ dehstr = au_cache_alloc_vdir_dehstr(); ++ if (unlikely(!dehstr)) ++ goto out; ++ ++ dehstr->str = &room->de->de_str; ++ hlist_add_head(&dehstr->hash, au_name_hash(delist, name, nlen)); ++ room->de->de_ino = ino; ++ room->de->de_type = d_type; ++ room->de->de_str.len = nlen; ++ memcpy(room->de->de_str.name, name, nlen); ++ ++ err = 0; ++ room->deblk += sz; ++ if (unlikely(set_deblk_end(room, &deblk_end))) ++ err = append_deblk(vdir); ++ /* smp_mb(); */ ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_vdir_free(struct au_vdir *vdir) ++{ ++ unsigned char **deblk; ++ ++ deblk = vdir->vd_deblk; ++ while (vdir->vd_nblk--) ++ kfree(*deblk++); ++ kfree(vdir->vd_deblk); ++ au_cache_free_vdir(vdir); ++} ++ ++static struct au_vdir *alloc_vdir(struct file *file) ++{ ++ struct au_vdir *vdir; ++ struct super_block *sb; ++ int err; ++ ++ sb = file->f_path.dentry->d_sb; ++ SiMustAnyLock(sb); ++ ++ err = -ENOMEM; ++ vdir = au_cache_alloc_vdir(); ++ if (unlikely(!vdir)) ++ goto out; ++ ++ vdir->vd_deblk = kzalloc(sizeof(*vdir->vd_deblk), GFP_NOFS); ++ if (unlikely(!vdir->vd_deblk)) ++ goto out_free; ++ ++ vdir->vd_deblk_sz = au_sbi(sb)->si_rdblk; ++ if (!vdir->vd_deblk_sz) { ++ /* estimate the appropriate size for deblk */ ++ vdir->vd_deblk_sz = au_dir_size(file, /*dentry*/NULL); ++ /* pr_info("vd_deblk_sz %u\n", vdir->vd_deblk_sz); */ ++ } ++ vdir->vd_nblk = 0; ++ vdir->vd_version = 0; ++ vdir->vd_jiffy = 0; ++ err = append_deblk(vdir); ++ if (!err) ++ return vdir; /* success */ ++ ++ kfree(vdir->vd_deblk); ++ ++out_free: ++ au_cache_free_vdir(vdir); ++out: ++ vdir = ERR_PTR(err); ++ return vdir; ++} ++ ++static int reinit_vdir(struct au_vdir *vdir) ++{ ++ int err; ++ union au_vdir_deblk_p p, deblk_end; ++ ++ while (vdir->vd_nblk > 1) { ++ kfree(vdir->vd_deblk[vdir->vd_nblk - 1]); ++ /* vdir->vd_deblk[vdir->vd_nblk - 1] = NULL; */ ++ vdir->vd_nblk--; ++ } ++ p.deblk = vdir->vd_deblk[0]; ++ deblk_end.deblk = p.deblk + vdir->vd_deblk_sz; ++ err = set_deblk_end(&p, &deblk_end); ++ /* keep vd_dblk_sz */ ++ vdir->vd_last.ul = 0; ++ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; ++ vdir->vd_version = 0; ++ vdir->vd_jiffy = 0; ++ /* smp_mb(); */ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define AuFillVdir_CALLED 1 ++#define AuFillVdir_WHABLE (1 << 1) ++#define AuFillVdir_SHWH (1 << 2) ++#define au_ftest_fillvdir(flags, name) ((flags) & AuFillVdir_##name) ++#define au_fset_fillvdir(flags, name) \ ++ do { (flags) |= AuFillVdir_##name; } while (0) ++#define au_fclr_fillvdir(flags, name) \ ++ do { (flags) &= ~AuFillVdir_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_SHWH ++#undef AuFillVdir_SHWH ++#define AuFillVdir_SHWH 0 ++#endif ++ ++struct fillvdir_arg { ++ struct dir_context ctx; ++ struct file *file; ++ struct au_vdir *vdir; ++ struct au_nhash delist; ++ struct au_nhash whlist; ++ aufs_bindex_t bindex; ++ unsigned int flags; ++ int err; ++}; ++ ++static int fillvdir(struct dir_context *ctx, const char *__name, int nlen, ++ loff_t offset __maybe_unused, u64 h_ino, ++ unsigned int d_type) ++{ ++ struct fillvdir_arg *arg = container_of(ctx, struct fillvdir_arg, ctx); ++ char *name = (void *)__name; ++ struct super_block *sb; ++ ino_t ino; ++ const unsigned char shwh = !!au_ftest_fillvdir(arg->flags, SHWH); ++ ++ arg->err = 0; ++ sb = arg->file->f_path.dentry->d_sb; ++ au_fset_fillvdir(arg->flags, CALLED); ++ /* smp_mb(); */ ++ if (nlen <= AUFS_WH_PFX_LEN ++ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { ++ if (test_known(&arg->delist, name, nlen) ++ || au_nhash_test_known_wh(&arg->whlist, name, nlen)) ++ goto out; /* already exists or whiteouted */ ++ ++ arg->err = au_ino(sb, arg->bindex, h_ino, d_type, &ino); ++ if (!arg->err) { ++ if (unlikely(nlen > AUFS_MAX_NAMELEN)) ++ d_type = DT_UNKNOWN; ++ arg->err = append_de(arg->vdir, name, nlen, ino, ++ d_type, &arg->delist); ++ } ++ } else if (au_ftest_fillvdir(arg->flags, WHABLE)) { ++ name += AUFS_WH_PFX_LEN; ++ nlen -= AUFS_WH_PFX_LEN; ++ if (au_nhash_test_known_wh(&arg->whlist, name, nlen)) ++ goto out; /* already whiteouted */ ++ ++ ino = 0; /* just to suppress a warning */ ++ if (shwh) ++ arg->err = au_wh_ino(sb, arg->bindex, h_ino, d_type, ++ &ino); ++ if (!arg->err) { ++ if (nlen <= AUFS_MAX_NAMELEN + AUFS_WH_PFX_LEN) ++ d_type = DT_UNKNOWN; ++ arg->err = au_nhash_append_wh ++ (&arg->whlist, name, nlen, ino, d_type, ++ arg->bindex, shwh); ++ } ++ } ++ ++out: ++ if (!arg->err) ++ arg->vdir->vd_jiffy = jiffies; ++ /* smp_mb(); */ ++ AuTraceErr(arg->err); ++ return arg->err; ++} ++ ++static int au_handle_shwh(struct super_block *sb, struct au_vdir *vdir, ++ struct au_nhash *whlist, struct au_nhash *delist) ++{ ++#ifdef CONFIG_AUFS_SHWH ++ int err; ++ unsigned int nh, u; ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ struct hlist_node *n; ++ char *p, *o; ++ struct au_vdir_destr *destr; ++ ++ AuDebugOn(!au_opt_test(au_mntflags(sb), SHWH)); ++ ++ err = -ENOMEM; ++ o = p = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!p)) ++ goto out; ++ ++ err = 0; ++ nh = whlist->nh_num; ++ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); ++ p += AUFS_WH_PFX_LEN; ++ for (u = 0; u < nh; u++) { ++ head = whlist->nh_head + u; ++ hlist_for_each_entry_safe(pos, n, head, wh_hash) { ++ destr = &pos->wh_str; ++ memcpy(p, destr->name, destr->len); ++ err = append_de(vdir, o, destr->len + AUFS_WH_PFX_LEN, ++ pos->wh_ino, pos->wh_type, delist); ++ if (unlikely(err)) ++ break; ++ } ++ } ++ ++ free_page((unsigned long)o); ++ ++out: ++ AuTraceErr(err); ++ return err; ++#else ++ return 0; ++#endif ++} ++ ++static int au_do_read_vdir(struct fillvdir_arg *arg) ++{ ++ int err; ++ unsigned int rdhash; ++ loff_t offset; ++ aufs_bindex_t bbot, bindex, btop; ++ unsigned char shwh; ++ struct file *hf, *file; ++ struct super_block *sb; ++ ++ file = arg->file; ++ sb = file->f_path.dentry->d_sb; ++ SiMustAnyLock(sb); ++ ++ rdhash = au_sbi(sb)->si_rdhash; ++ if (!rdhash) ++ rdhash = au_rdhash_est(au_dir_size(file, /*dentry*/NULL)); ++ err = au_nhash_alloc(&arg->delist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_nhash_alloc(&arg->whlist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out_delist; ++ ++ err = 0; ++ arg->flags = 0; ++ shwh = 0; ++ if (au_opt_test(au_mntflags(sb), SHWH)) { ++ shwh = 1; ++ au_fset_fillvdir(arg->flags, SHWH); ++ } ++ btop = au_fbtop(file); ++ bbot = au_fbbot_dir(file); ++ for (bindex = btop; !err && bindex <= bbot; bindex++) { ++ hf = au_hf_dir(file, bindex); ++ if (!hf) ++ continue; ++ ++ offset = vfsub_llseek(hf, 0, SEEK_SET); ++ err = offset; ++ if (unlikely(offset)) ++ break; ++ ++ arg->bindex = bindex; ++ au_fclr_fillvdir(arg->flags, WHABLE); ++ if (shwh ++ || (bindex != bbot ++ && au_br_whable(au_sbr_perm(sb, bindex)))) ++ au_fset_fillvdir(arg->flags, WHABLE); ++ do { ++ arg->err = 0; ++ au_fclr_fillvdir(arg->flags, CALLED); ++ /* smp_mb(); */ ++ err = vfsub_iterate_dir(hf, &arg->ctx); ++ if (err >= 0) ++ err = arg->err; ++ } while (!err && au_ftest_fillvdir(arg->flags, CALLED)); ++ ++ /* ++ * dir_relax() may be good for concurrency, but aufs should not ++ * use it since it will cause a lockdep problem. ++ */ ++ } ++ ++ if (!err && shwh) ++ err = au_handle_shwh(sb, arg->vdir, &arg->whlist, &arg->delist); ++ ++ au_nhash_wh_free(&arg->whlist); ++ ++out_delist: ++ au_nhash_de_free(&arg->delist); ++out: ++ return err; ++} ++ ++static int read_vdir(struct file *file, int may_read) ++{ ++ int err; ++ unsigned long expire; ++ unsigned char do_read; ++ struct fillvdir_arg arg = { ++ .ctx = { ++ .actor = fillvdir ++ } ++ }; ++ struct inode *inode; ++ struct au_vdir *vdir, *allocated; ++ ++ err = 0; ++ inode = file_inode(file); ++ IMustLock(inode); ++ IiMustWriteLock(inode); ++ SiMustAnyLock(inode->i_sb); ++ ++ allocated = NULL; ++ do_read = 0; ++ expire = au_sbi(inode->i_sb)->si_rdcache; ++ vdir = au_ivdir(inode); ++ if (!vdir) { ++ do_read = 1; ++ vdir = alloc_vdir(file); ++ err = PTR_ERR(vdir); ++ if (IS_ERR(vdir)) ++ goto out; ++ err = 0; ++ allocated = vdir; ++ } else if (may_read ++ && (!inode_eq_iversion(inode, vdir->vd_version) ++ || time_after(jiffies, vdir->vd_jiffy + expire))) { ++ do_read = 1; ++ err = reinit_vdir(vdir); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ if (!do_read) ++ return 0; /* success */ ++ ++ arg.file = file; ++ arg.vdir = vdir; ++ err = au_do_read_vdir(&arg); ++ if (!err) { ++ /* file->f_pos = 0; */ /* todo: ctx->pos? */ ++ vdir->vd_version = inode_query_iversion(inode); ++ vdir->vd_last.ul = 0; ++ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; ++ if (allocated) ++ au_set_ivdir(inode, allocated); ++ } else if (allocated) ++ au_vdir_free(allocated); ++ ++out: ++ return err; ++} ++ ++static int copy_vdir(struct au_vdir *tgt, struct au_vdir *src) ++{ ++ int err, rerr; ++ unsigned long ul, n; ++ const unsigned int deblk_sz = src->vd_deblk_sz; ++ ++ AuDebugOn(tgt->vd_nblk != 1); ++ ++ err = -ENOMEM; ++ if (tgt->vd_nblk < src->vd_nblk) { ++ unsigned char **p; ++ ++ p = au_krealloc(tgt->vd_deblk, sizeof(*p) * src->vd_nblk, ++ GFP_NOFS, /*may_shrink*/0); ++ if (unlikely(!p)) ++ goto out; ++ tgt->vd_deblk = p; ++ } ++ ++ if (tgt->vd_deblk_sz != deblk_sz) { ++ unsigned char *p; ++ ++ tgt->vd_deblk_sz = deblk_sz; ++ p = au_krealloc(tgt->vd_deblk[0], deblk_sz, GFP_NOFS, ++ /*may_shrink*/1); ++ if (unlikely(!p)) ++ goto out; ++ tgt->vd_deblk[0] = p; ++ } ++ memcpy(tgt->vd_deblk[0], src->vd_deblk[0], deblk_sz); ++ tgt->vd_version = src->vd_version; ++ tgt->vd_jiffy = src->vd_jiffy; ++ ++ n = src->vd_nblk; ++ for (ul = 1; ul < n; ul++) { ++ tgt->vd_deblk[ul] = kmemdup(src->vd_deblk[ul], deblk_sz, ++ GFP_NOFS); ++ if (unlikely(!tgt->vd_deblk[ul])) ++ goto out; ++ tgt->vd_nblk++; ++ } ++ tgt->vd_nblk = n; ++ tgt->vd_last.ul = tgt->vd_last.ul; ++ tgt->vd_last.p.deblk = tgt->vd_deblk[tgt->vd_last.ul]; ++ tgt->vd_last.p.deblk += src->vd_last.p.deblk ++ - src->vd_deblk[src->vd_last.ul]; ++ /* smp_mb(); */ ++ return 0; /* success */ ++ ++out: ++ rerr = reinit_vdir(tgt); ++ BUG_ON(rerr); ++ return err; ++} ++ ++int au_vdir_init(struct file *file) ++{ ++ int err; ++ struct inode *inode; ++ struct au_vdir *vdir_cache, *allocated; ++ ++ /* test file->f_pos here instead of ctx->pos */ ++ err = read_vdir(file, !file->f_pos); ++ if (unlikely(err)) ++ goto out; ++ ++ allocated = NULL; ++ vdir_cache = au_fvdir_cache(file); ++ if (!vdir_cache) { ++ vdir_cache = alloc_vdir(file); ++ err = PTR_ERR(vdir_cache); ++ if (IS_ERR(vdir_cache)) ++ goto out; ++ allocated = vdir_cache; ++ } else if (!file->f_pos && vdir_cache->vd_version != file->f_version) { ++ /* test file->f_pos here instead of ctx->pos */ ++ err = reinit_vdir(vdir_cache); ++ if (unlikely(err)) ++ goto out; ++ } else ++ return 0; /* success */ ++ ++ inode = file_inode(file); ++ err = copy_vdir(vdir_cache, au_ivdir(inode)); ++ if (!err) { ++ file->f_version = inode_query_iversion(inode); ++ if (allocated) ++ au_set_fvdir_cache(file, allocated); ++ } else if (allocated) ++ au_vdir_free(allocated); ++ ++out: ++ return err; ++} ++ ++static loff_t calc_offset(struct au_vdir *vdir) ++{ ++ loff_t offset; ++ union au_vdir_deblk_p p; ++ ++ p.deblk = vdir->vd_deblk[vdir->vd_last.ul]; ++ offset = vdir->vd_last.p.deblk - p.deblk; ++ offset += vdir->vd_deblk_sz * vdir->vd_last.ul; ++ return offset; ++} ++ ++/* returns true or false */ ++static int seek_vdir(struct file *file, struct dir_context *ctx) ++{ ++ int valid; ++ unsigned int deblk_sz; ++ unsigned long ul, n; ++ loff_t offset; ++ union au_vdir_deblk_p p, deblk_end; ++ struct au_vdir *vdir_cache; ++ ++ valid = 1; ++ vdir_cache = au_fvdir_cache(file); ++ offset = calc_offset(vdir_cache); ++ AuDbg("offset %lld\n", offset); ++ if (ctx->pos == offset) ++ goto out; ++ ++ vdir_cache->vd_last.ul = 0; ++ vdir_cache->vd_last.p.deblk = vdir_cache->vd_deblk[0]; ++ if (!ctx->pos) ++ goto out; ++ ++ valid = 0; ++ deblk_sz = vdir_cache->vd_deblk_sz; ++ ul = div64_u64(ctx->pos, deblk_sz); ++ AuDbg("ul %lu\n", ul); ++ if (ul >= vdir_cache->vd_nblk) ++ goto out; ++ ++ n = vdir_cache->vd_nblk; ++ for (; ul < n; ul++) { ++ p.deblk = vdir_cache->vd_deblk[ul]; ++ deblk_end.deblk = p.deblk + deblk_sz; ++ offset = ul; ++ offset *= deblk_sz; ++ while (!is_deblk_end(&p, &deblk_end) && offset < ctx->pos) { ++ unsigned int l; ++ ++ l = calc_size(p.de->de_str.len); ++ offset += l; ++ p.deblk += l; ++ } ++ if (!is_deblk_end(&p, &deblk_end)) { ++ valid = 1; ++ vdir_cache->vd_last.ul = ul; ++ vdir_cache->vd_last.p = p; ++ break; ++ } ++ } ++ ++out: ++ /* smp_mb(); */ ++ if (!valid) ++ AuDbg("valid %d\n", !valid); ++ return valid; ++} ++ ++int au_vdir_fill_de(struct file *file, struct dir_context *ctx) ++{ ++ unsigned int l, deblk_sz; ++ union au_vdir_deblk_p deblk_end; ++ struct au_vdir *vdir_cache; ++ struct au_vdir_de *de; ++ ++ if (!seek_vdir(file, ctx)) ++ return 0; ++ ++ vdir_cache = au_fvdir_cache(file); ++ deblk_sz = vdir_cache->vd_deblk_sz; ++ while (1) { ++ deblk_end.deblk = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; ++ deblk_end.deblk += deblk_sz; ++ while (!is_deblk_end(&vdir_cache->vd_last.p, &deblk_end)) { ++ de = vdir_cache->vd_last.p.de; ++ AuDbg("%.*s, off%lld, i%lu, dt%d\n", ++ de->de_str.len, de->de_str.name, ctx->pos, ++ (unsigned long)de->de_ino, de->de_type); ++ if (unlikely(!dir_emit(ctx, de->de_str.name, ++ de->de_str.len, de->de_ino, ++ de->de_type))) { ++ /* todo: ignore the error caused by udba? */ ++ /* return err; */ ++ return 0; ++ } ++ ++ l = calc_size(de->de_str.len); ++ vdir_cache->vd_last.p.deblk += l; ++ ctx->pos += l; ++ } ++ if (vdir_cache->vd_last.ul < vdir_cache->vd_nblk - 1) { ++ vdir_cache->vd_last.ul++; ++ vdir_cache->vd_last.p.deblk ++ = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; ++ ctx->pos = deblk_sz * vdir_cache->vd_last.ul; ++ continue; ++ } ++ break; ++ } ++ ++ /* smp_mb(); */ ++ return 0; ++} +diff --git a/fs/aufs/vfsub.c b/fs/aufs/vfsub.c +new file mode 100644 +index 000000000000..1978e190da9e +--- /dev/null ++++ b/fs/aufs/vfsub.c +@@ -0,0 +1,889 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * sub-routines for VFS ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++#ifdef CONFIG_AUFS_BR_FUSE ++int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb) ++{ ++ if (!au_test_fuse(h_sb) || !au_userns) ++ return 0; ++ ++ return is_current_mnt_ns(mnt) ? 0 : -EACCES; ++} ++#endif ++ ++int vfsub_sync_filesystem(struct super_block *h_sb, int wait) ++{ ++ int err; ++ ++ lockdep_off(); ++ down_read(&h_sb->s_umount); ++ err = __sync_filesystem(h_sb, wait); ++ up_read(&h_sb->s_umount); ++ lockdep_on(); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int vfsub_update_h_iattr(struct path *h_path, int *did) ++{ ++ int err; ++ struct kstat st; ++ struct super_block *h_sb; ++ ++ /* for remote fs, leave work for its getattr or d_revalidate */ ++ /* for bad i_attr fs, handle them in aufs_getattr() */ ++ /* still some fs may acquire i_mutex. we need to skip them */ ++ err = 0; ++ if (!did) ++ did = &err; ++ h_sb = h_path->dentry->d_sb; ++ *did = (!au_test_fs_remote(h_sb) && au_test_fs_refresh_iattr(h_sb)); ++ if (*did) ++ err = vfsub_getattr(h_path, &st); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct file *vfsub_dentry_open(struct path *path, int flags) ++{ ++ struct file *file; ++ ++ file = dentry_open(path, flags /* | __FMODE_NONOTIFY */, ++ current_cred()); ++ if (!IS_ERR_OR_NULL(file) ++ && (file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) ++ i_readcount_inc(d_inode(path->dentry)); ++ ++ return file; ++} ++ ++struct file *vfsub_filp_open(const char *path, int oflags, int mode) ++{ ++ struct file *file; ++ ++ lockdep_off(); ++ file = filp_open(path, ++ oflags /* | __FMODE_NONOTIFY */, ++ mode); ++ lockdep_on(); ++ if (IS_ERR(file)) ++ goto out; ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ ++ ++out: ++ return file; ++} ++ ++/* ++ * Ideally this function should call VFS:do_last() in order to keep all its ++ * checkings. But it is very hard for aufs to regenerate several VFS internal ++ * structure such as nameidata. This is a second (or third) best approach. ++ * cf. linux/fs/namei.c:do_last(), lookup_open() and atomic_open(). ++ */ ++int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, ++ struct vfsub_aopen_args *args) ++{ ++ int err; ++ struct au_branch *br = args->br; ++ struct file *file = args->file; ++ /* copied from linux/fs/namei.c:atomic_open() */ ++ struct dentry *const DENTRY_NOT_SET = (void *)-1UL; ++ ++ IMustLock(dir); ++ AuDebugOn(!dir->i_op->atomic_open); ++ ++ err = au_br_test_oflag(args->open_flag, br); ++ if (unlikely(err)) ++ goto out; ++ ++ au_lcnt_inc(&br->br_nfiles); ++ file->f_path.dentry = DENTRY_NOT_SET; ++ file->f_path.mnt = au_br_mnt(br); ++ AuDbg("%ps\n", dir->i_op->atomic_open); ++ err = dir->i_op->atomic_open(dir, dentry, file, args->open_flag, ++ args->create_mode); ++ if (unlikely(err < 0)) { ++ au_lcnt_dec(&br->br_nfiles); ++ goto out; ++ } ++ ++ /* temporary workaround for nfsv4 branch */ ++ if (au_test_nfs(dir->i_sb)) ++ nfs_mark_for_revalidate(dir); ++ ++ if (file->f_mode & FMODE_CREATED) ++ fsnotify_create(dir, dentry); ++ if (!(file->f_mode & FMODE_OPENED)) { ++ au_lcnt_dec(&br->br_nfiles); ++ goto out; ++ } ++ ++ /* todo: call VFS:may_open() here */ ++ /* todo: ima_file_check() too? */ ++ if (!err && (args->open_flag & __FMODE_EXEC)) ++ err = deny_write_access(file); ++ if (!err) ++ fsnotify_open(file); ++ else ++ au_lcnt_dec(&br->br_nfiles); ++ /* note that the file is created and still opened */ ++ ++out: ++ return err; ++} ++ ++int vfsub_kern_path(const char *name, unsigned int flags, struct path *path) ++{ ++ int err; ++ ++ err = kern_path(name, flags, path); ++ if (!err && d_is_positive(path->dentry)) ++ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++struct dentry *vfsub_lookup_one_len_unlocked(const char *name, ++ struct dentry *parent, int len) ++{ ++ struct path path = { ++ .mnt = NULL ++ }; ++ ++ path.dentry = lookup_one_len_unlocked(name, parent, len); ++ if (IS_ERR(path.dentry)) ++ goto out; ++ if (d_is_positive(path.dentry)) ++ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ ++ ++out: ++ AuTraceErrPtr(path.dentry); ++ return path.dentry; ++} ++ ++struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent, ++ int len) ++{ ++ struct path path = { ++ .mnt = NULL ++ }; ++ ++ /* VFS checks it too, but by WARN_ON_ONCE() */ ++ IMustLock(d_inode(parent)); ++ ++ path.dentry = lookup_one_len(name, parent, len); ++ if (IS_ERR(path.dentry)) ++ goto out; ++ if (d_is_positive(path.dentry)) ++ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ ++ ++out: ++ AuTraceErrPtr(path.dentry); ++ return path.dentry; ++} ++ ++void vfsub_call_lkup_one(void *args) ++{ ++ struct vfsub_lkup_one_args *a = args; ++ *a->errp = vfsub_lkup_one(a->name, a->parent); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, ++ struct dentry *d2, struct au_hinode *hdir2) ++{ ++ struct dentry *d; ++ ++ lockdep_off(); ++ d = lock_rename(d1, d2); ++ lockdep_on(); ++ au_hn_suspend(hdir1); ++ if (hdir1 != hdir2) ++ au_hn_suspend(hdir2); ++ ++ return d; ++} ++ ++void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, ++ struct dentry *d2, struct au_hinode *hdir2) ++{ ++ au_hn_resume(hdir1); ++ if (hdir1 != hdir2) ++ au_hn_resume(hdir2); ++ lockdep_off(); ++ unlock_rename(d1, d2); ++ lockdep_on(); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int vfsub_create(struct inode *dir, struct path *path, int mode, bool want_excl) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_mknod(path, d, mode, 0); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_create(dir, path->dentry, mode, want_excl); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_symlink(struct inode *dir, struct path *path, const char *symname) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_symlink(path, d, symname); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_symlink(dir, path->dentry, symname); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_mknod(path, d, mode, new_encode_dev(dev)); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_mknod(dir, path->dentry, mode, dev); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++static int au_test_nlink(struct inode *inode) ++{ ++ const unsigned int link_max = UINT_MAX >> 1; /* rough margin */ ++ ++ if (!au_test_fs_no_limit_nlink(inode->i_sb) ++ || inode->i_nlink < link_max) ++ return 0; ++ return -EMLINK; ++} ++ ++int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path, ++ struct inode **delegated_inode) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ err = au_test_nlink(d_inode(src_dentry)); ++ if (unlikely(err)) ++ return err; ++ ++ /* we don't call may_linkat() */ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_link(src_dentry, path, d); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_link(src_dentry, dir, path->dentry, delegated_inode); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ /* fuse has different memory inode for the same inumber */ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ tmp.dentry = src_dentry; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry, ++ struct inode *dir, struct path *path, ++ struct inode **delegated_inode, unsigned int flags) ++{ ++ int err; ++ struct path tmp = { ++ .mnt = path->mnt ++ }; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ IMustLock(src_dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ tmp.dentry = src_dentry->d_parent; ++ err = security_path_rename(&tmp, src_dentry, path, d, /*flags*/0); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_rename(src_dir, src_dentry, dir, path->dentry, ++ delegated_inode, flags); ++ lockdep_on(); ++ if (!err) { ++ int did; ++ ++ tmp.dentry = d->d_parent; ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = src_dentry; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ tmp.dentry = src_dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_mkdir(struct inode *dir, struct path *path, int mode) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_mkdir(path, d, mode); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_mkdir(dir, path->dentry, mode); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_rmdir(struct inode *dir, struct path *path) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_rmdir(path, d); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_rmdir(dir, path->dentry); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = { ++ .dentry = path->dentry->d_parent, ++ .mnt = path->mnt ++ }; ++ ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* todo: support mmap_sem? */ ++ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, ++ loff_t *ppos) ++{ ++ ssize_t err; ++ ++ lockdep_off(); ++ err = vfs_read(file, ubuf, count, ppos); ++ lockdep_on(); ++ if (err >= 0) ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++/* todo: kernel_read()? */ ++ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, ++ loff_t *ppos) ++{ ++ ssize_t err; ++ mm_segment_t oldfs; ++ union { ++ void *k; ++ char __user *u; ++ } buf; ++ ++ buf.k = kbuf; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ err = vfsub_read_u(file, buf.u, count, ppos); ++ set_fs(oldfs); ++ return err; ++} ++ ++ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, ++ loff_t *ppos) ++{ ++ ssize_t err; ++ ++ lockdep_off(); ++ err = vfs_write(file, ubuf, count, ppos); ++ lockdep_on(); ++ if (err >= 0) ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos) ++{ ++ ssize_t err; ++ mm_segment_t oldfs; ++ union { ++ void *k; ++ const char __user *u; ++ } buf; ++ ++ buf.k = kbuf; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ err = vfsub_write_u(file, buf.u, count, ppos); ++ set_fs(oldfs); ++ return err; ++} ++ ++int vfsub_flush(struct file *file, fl_owner_t id) ++{ ++ int err; ++ ++ err = 0; ++ if (file->f_op->flush) { ++ if (!au_test_nfs(file->f_path.dentry->d_sb)) ++ err = file->f_op->flush(file, id); ++ else { ++ lockdep_off(); ++ err = file->f_op->flush(file, id); ++ lockdep_on(); ++ } ++ if (!err) ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); ++ /*ignore*/ ++ } ++ return err; ++} ++ ++int vfsub_iterate_dir(struct file *file, struct dir_context *ctx) ++{ ++ int err; ++ ++ AuDbg("%pD, ctx{%ps, %llu}\n", file, ctx->actor, ctx->pos); ++ ++ lockdep_off(); ++ err = iterate_dir(file, ctx); ++ lockdep_on(); ++ if (err >= 0) ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ ++ ++ return err; ++} ++ ++long vfsub_splice_to(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags) ++{ ++ long err; ++ ++ lockdep_off(); ++ err = do_splice_to(in, ppos, pipe, len, flags); ++ lockdep_on(); ++ file_accessed(in); ++ if (err >= 0) ++ vfsub_update_h_iattr(&in->f_path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags) ++{ ++ long err; ++ ++ lockdep_off(); ++ err = do_splice_from(pipe, out, ppos, len, flags); ++ lockdep_on(); ++ if (err >= 0) ++ vfsub_update_h_iattr(&out->f_path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++int vfsub_fsync(struct file *file, struct path *path, int datasync) ++{ ++ int err; ++ ++ /* file can be NULL */ ++ lockdep_off(); ++ err = vfs_fsync(file, datasync); ++ lockdep_on(); ++ if (!err) { ++ if (!path) { ++ AuDebugOn(!file); ++ path = &file->f_path; ++ } ++ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ ++ } ++ return err; ++} ++ ++/* cf. open.c:do_sys_truncate() and do_sys_ftruncate() */ ++int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, ++ struct file *h_file) ++{ ++ int err; ++ struct inode *h_inode; ++ struct super_block *h_sb; ++ ++ if (!h_file) { ++ err = vfsub_truncate(h_path, length); ++ goto out; ++ } ++ ++ h_inode = d_inode(h_path->dentry); ++ h_sb = h_inode->i_sb; ++ lockdep_off(); ++ sb_start_write(h_sb); ++ lockdep_on(); ++ err = locks_verify_truncate(h_inode, h_file, length); ++ if (!err) ++ err = security_path_truncate(h_path); ++ if (!err) { ++ lockdep_off(); ++ err = do_truncate(h_path->dentry, length, attr, h_file); ++ lockdep_on(); ++ } ++ lockdep_off(); ++ sb_end_write(h_sb); ++ lockdep_on(); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_vfsub_mkdir_args { ++ int *errp; ++ struct inode *dir; ++ struct path *path; ++ int mode; ++}; ++ ++static void au_call_vfsub_mkdir(void *args) ++{ ++ struct au_vfsub_mkdir_args *a = args; ++ *a->errp = vfsub_mkdir(a->dir, a->path, a->mode); ++} ++ ++int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode) ++{ ++ int err, do_sio, wkq_err; ++ ++ do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE); ++ if (!do_sio) { ++ lockdep_off(); ++ err = vfsub_mkdir(dir, path, mode); ++ lockdep_on(); ++ } else { ++ struct au_vfsub_mkdir_args args = { ++ .errp = &err, ++ .dir = dir, ++ .path = path, ++ .mode = mode ++ }; ++ wkq_err = au_wkq_wait(au_call_vfsub_mkdir, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ return err; ++} ++ ++struct au_vfsub_rmdir_args { ++ int *errp; ++ struct inode *dir; ++ struct path *path; ++}; ++ ++static void au_call_vfsub_rmdir(void *args) ++{ ++ struct au_vfsub_rmdir_args *a = args; ++ *a->errp = vfsub_rmdir(a->dir, a->path); ++} ++ ++int vfsub_sio_rmdir(struct inode *dir, struct path *path) ++{ ++ int err, do_sio, wkq_err; ++ ++ do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE); ++ if (!do_sio) { ++ lockdep_off(); ++ err = vfsub_rmdir(dir, path); ++ lockdep_on(); ++ } else { ++ struct au_vfsub_rmdir_args args = { ++ .errp = &err, ++ .dir = dir, ++ .path = path ++ }; ++ wkq_err = au_wkq_wait(au_call_vfsub_rmdir, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct notify_change_args { ++ int *errp; ++ struct path *path; ++ struct iattr *ia; ++ struct inode **delegated_inode; ++}; ++ ++static void call_notify_change(void *args) ++{ ++ struct notify_change_args *a = args; ++ struct inode *h_inode; ++ ++ h_inode = d_inode(a->path->dentry); ++ IMustLock(h_inode); ++ ++ *a->errp = -EPERM; ++ if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) { ++ lockdep_off(); ++ *a->errp = notify_change(a->path->dentry, a->ia, ++ a->delegated_inode); ++ lockdep_on(); ++ if (!*a->errp) ++ vfsub_update_h_iattr(a->path, /*did*/NULL); /*ignore*/ ++ } ++ AuTraceErr(*a->errp); ++} ++ ++int vfsub_notify_change(struct path *path, struct iattr *ia, ++ struct inode **delegated_inode) ++{ ++ int err; ++ struct notify_change_args args = { ++ .errp = &err, ++ .path = path, ++ .ia = ia, ++ .delegated_inode = delegated_inode ++ }; ++ ++ call_notify_change(&args); ++ ++ return err; ++} ++ ++int vfsub_sio_notify_change(struct path *path, struct iattr *ia, ++ struct inode **delegated_inode) ++{ ++ int err, wkq_err; ++ struct notify_change_args args = { ++ .errp = &err, ++ .path = path, ++ .ia = ia, ++ .delegated_inode = delegated_inode ++ }; ++ ++ wkq_err = au_wkq_wait(call_notify_change, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct unlink_args { ++ int *errp; ++ struct inode *dir; ++ struct path *path; ++ struct inode **delegated_inode; ++}; ++ ++static void call_unlink(void *args) ++{ ++ struct unlink_args *a = args; ++ struct dentry *d = a->path->dentry; ++ struct inode *h_inode; ++ const int stop_sillyrename = (au_test_nfs(d->d_sb) ++ && au_dcount(d) == 1); ++ ++ IMustLock(a->dir); ++ ++ a->path->dentry = d->d_parent; ++ *a->errp = security_path_unlink(a->path, d); ++ a->path->dentry = d; ++ if (unlikely(*a->errp)) ++ return; ++ ++ if (!stop_sillyrename) ++ dget(d); ++ h_inode = NULL; ++ if (d_is_positive(d)) { ++ h_inode = d_inode(d); ++ ihold(h_inode); ++ } ++ ++ lockdep_off(); ++ *a->errp = vfs_unlink(a->dir, d, a->delegated_inode); ++ lockdep_on(); ++ if (!*a->errp) { ++ struct path tmp = { ++ .dentry = d->d_parent, ++ .mnt = a->path->mnt ++ }; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ ++ } ++ ++ if (!stop_sillyrename) ++ dput(d); ++ if (h_inode) ++ iput(h_inode); ++ ++ AuTraceErr(*a->errp); ++} ++ ++/* ++ * @dir: must be locked. ++ * @dentry: target dentry. ++ */ ++int vfsub_unlink(struct inode *dir, struct path *path, ++ struct inode **delegated_inode, int force) ++{ ++ int err; ++ struct unlink_args args = { ++ .errp = &err, ++ .dir = dir, ++ .path = path, ++ .delegated_inode = delegated_inode ++ }; ++ ++ if (!force) ++ call_unlink(&args); ++ else { ++ int wkq_err; ++ ++ wkq_err = au_wkq_wait(call_unlink, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ return err; ++} +diff --git a/fs/aufs/vfsub.h b/fs/aufs/vfsub.h +new file mode 100644 +index 000000000000..11a3d4f90da7 +--- /dev/null ++++ b/fs/aufs/vfsub.h +@@ -0,0 +1,342 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * sub-routines for VFS ++ */ ++ ++#ifndef __AUFS_VFSUB_H__ ++#define __AUFS_VFSUB_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++#include ++#include "debug.h" ++ ++/* copied from linux/fs/internal.h */ ++/* todo: BAD approach!! */ ++extern void __mnt_drop_write(struct vfsmount *); ++extern struct file *alloc_empty_file(int, const struct cred *); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* lock subclass for lower inode */ ++/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */ ++/* reduce? gave up. */ ++enum { ++ AuLsc_I_Begin = I_MUTEX_PARENT2, /* 5 */ ++ AuLsc_I_PARENT, /* lower inode, parent first */ ++ AuLsc_I_PARENT2, /* copyup dirs */ ++ AuLsc_I_PARENT3, /* copyup wh */ ++ AuLsc_I_CHILD, ++ AuLsc_I_CHILD2, ++ AuLsc_I_End ++}; ++ ++/* to debug easier, do not make them inlined functions */ ++#define MtxMustLock(mtx) AuDebugOn(!mutex_is_locked(mtx)) ++#define IMustLock(i) AuDebugOn(!inode_is_locked(i)) ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline void vfsub_drop_nlink(struct inode *inode) ++{ ++ AuDebugOn(!inode->i_nlink); ++ drop_nlink(inode); ++} ++ ++static inline void vfsub_dead_dir(struct inode *inode) ++{ ++ AuDebugOn(!S_ISDIR(inode->i_mode)); ++ inode->i_flags |= S_DEAD; ++ clear_nlink(inode); ++} ++ ++static inline int vfsub_native_ro(struct inode *inode) ++{ ++ return sb_rdonly(inode->i_sb) ++ || IS_RDONLY(inode) ++ /* || IS_APPEND(inode) */ ++ || IS_IMMUTABLE(inode); ++} ++ ++#ifdef CONFIG_AUFS_BR_FUSE ++int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb); ++#else ++AuStubInt0(vfsub_test_mntns, struct vfsmount *mnt, struct super_block *h_sb); ++#endif ++ ++int vfsub_sync_filesystem(struct super_block *h_sb, int wait); ++ ++/* ---------------------------------------------------------------------- */ ++ ++int vfsub_update_h_iattr(struct path *h_path, int *did); ++struct file *vfsub_dentry_open(struct path *path, int flags); ++struct file *vfsub_filp_open(const char *path, int oflags, int mode); ++struct au_branch; ++struct vfsub_aopen_args { ++ struct file *file; ++ unsigned int open_flag; ++ umode_t create_mode; ++ struct au_branch *br; ++}; ++int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, ++ struct vfsub_aopen_args *args); ++int vfsub_kern_path(const char *name, unsigned int flags, struct path *path); ++ ++struct dentry *vfsub_lookup_one_len_unlocked(const char *name, ++ struct dentry *parent, int len); ++struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent, ++ int len); ++ ++struct vfsub_lkup_one_args { ++ struct dentry **errp; ++ struct qstr *name; ++ struct dentry *parent; ++}; ++ ++static inline struct dentry *vfsub_lkup_one(struct qstr *name, ++ struct dentry *parent) ++{ ++ return vfsub_lookup_one_len(name->name, parent, name->len); ++} ++ ++void vfsub_call_lkup_one(void *args); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline int vfsub_mnt_want_write(struct vfsmount *mnt) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = mnt_want_write(mnt); ++ lockdep_on(); ++ return err; ++} ++ ++static inline void vfsub_mnt_drop_write(struct vfsmount *mnt) ++{ ++ lockdep_off(); ++ mnt_drop_write(mnt); ++ lockdep_on(); ++} ++ ++#if 0 /* reserved */ ++static inline void vfsub_mnt_drop_write_file(struct file *file) ++{ ++ lockdep_off(); ++ mnt_drop_write_file(file); ++ lockdep_on(); ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_hinode; ++struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, ++ struct dentry *d2, struct au_hinode *hdir2); ++void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, ++ struct dentry *d2, struct au_hinode *hdir2); ++ ++int vfsub_create(struct inode *dir, struct path *path, int mode, ++ bool want_excl); ++int vfsub_symlink(struct inode *dir, struct path *path, ++ const char *symname); ++int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev); ++int vfsub_link(struct dentry *src_dentry, struct inode *dir, ++ struct path *path, struct inode **delegated_inode); ++int vfsub_rename(struct inode *src_hdir, struct dentry *src_dentry, ++ struct inode *hdir, struct path *path, ++ struct inode **delegated_inode, unsigned int flags); ++int vfsub_mkdir(struct inode *dir, struct path *path, int mode); ++int vfsub_rmdir(struct inode *dir, struct path *path); ++ ++/* ---------------------------------------------------------------------- */ ++ ++ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, ++ loff_t *ppos); ++ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, ++ loff_t *ppos); ++ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, ++ loff_t *ppos); ++ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, ++ loff_t *ppos); ++int vfsub_flush(struct file *file, fl_owner_t id); ++int vfsub_iterate_dir(struct file *file, struct dir_context *ctx); ++ ++static inline loff_t vfsub_f_size_read(struct file *file) ++{ ++ return i_size_read(file_inode(file)); ++} ++ ++static inline unsigned int vfsub_file_flags(struct file *file) ++{ ++ unsigned int flags; ++ ++ spin_lock(&file->f_lock); ++ flags = file->f_flags; ++ spin_unlock(&file->f_lock); ++ ++ return flags; ++} ++ ++static inline int vfsub_file_execed(struct file *file) ++{ ++ /* todo: direct access f_flags */ ++ return !!(vfsub_file_flags(file) & __FMODE_EXEC); ++} ++ ++#if 0 /* reserved */ ++static inline void vfsub_file_accessed(struct file *h_file) ++{ ++ file_accessed(h_file); ++ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); /*ignore*/ ++} ++#endif ++ ++#if 0 /* reserved */ ++static inline void vfsub_touch_atime(struct vfsmount *h_mnt, ++ struct dentry *h_dentry) ++{ ++ struct path h_path = { ++ .dentry = h_dentry, ++ .mnt = h_mnt ++ }; ++ touch_atime(&h_path); ++ vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ ++} ++#endif ++ ++static inline int vfsub_update_time(struct inode *h_inode, ++ struct timespec64 *ts, int flags) ++{ ++ return update_time(h_inode, ts, flags); ++ /* no vfsub_update_h_iattr() since we don't have struct path */ ++} ++ ++#ifdef CONFIG_FS_POSIX_ACL ++static inline int vfsub_acl_chmod(struct inode *h_inode, umode_t h_mode) ++{ ++ int err; ++ ++ err = posix_acl_chmod(h_inode, h_mode); ++ if (err == -EOPNOTSUPP) ++ err = 0; ++ return err; ++} ++#else ++AuStubInt0(vfsub_acl_chmod, struct inode *h_inode, umode_t h_mode); ++#endif ++ ++long vfsub_splice_to(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags); ++long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags); ++ ++static inline long vfsub_truncate(struct path *path, loff_t length) ++{ ++ long err; ++ ++ lockdep_off(); ++ err = vfs_truncate(path, length); ++ lockdep_on(); ++ return err; ++} ++ ++int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, ++ struct file *h_file); ++int vfsub_fsync(struct file *file, struct path *path, int datasync); ++ ++/* ++ * re-use branch fs's ioctl(FICLONE) while aufs itself doesn't support such ++ * ioctl. ++ */ ++static inline int vfsub_clone_file_range(struct file *src, struct file *dst, ++ u64 len) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = vfs_clone_file_range(src, 0, dst, 0, len); ++ lockdep_on(); ++ ++ return err; ++} ++ ++/* copy_file_range(2) is a systemcall */ ++static inline ssize_t vfsub_copy_file_range(struct file *src, loff_t src_pos, ++ struct file *dst, loff_t dst_pos, ++ size_t len, unsigned int flags) ++{ ++ ssize_t ssz; ++ ++ lockdep_off(); ++ ssz = vfs_copy_file_range(src, src_pos, dst, dst_pos, len, flags); ++ lockdep_on(); ++ ++ return ssz; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline loff_t vfsub_llseek(struct file *file, loff_t offset, int origin) ++{ ++ loff_t err; ++ ++ lockdep_off(); ++ err = vfs_llseek(file, offset, origin); ++ lockdep_on(); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode); ++int vfsub_sio_rmdir(struct inode *dir, struct path *path); ++int vfsub_sio_notify_change(struct path *path, struct iattr *ia, ++ struct inode **delegated_inode); ++int vfsub_notify_change(struct path *path, struct iattr *ia, ++ struct inode **delegated_inode); ++int vfsub_unlink(struct inode *dir, struct path *path, ++ struct inode **delegated_inode, int force); ++ ++static inline int vfsub_getattr(const struct path *path, struct kstat *st) ++{ ++ return vfs_getattr(path, st, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline int vfsub_setxattr(struct dentry *dentry, const char *name, ++ const void *value, size_t size, int flags) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = vfs_setxattr(dentry, name, value, size, flags); ++ lockdep_on(); ++ ++ return err; ++} ++ ++static inline int vfsub_removexattr(struct dentry *dentry, const char *name) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = vfs_removexattr(dentry, name); ++ lockdep_on(); ++ ++ return err; ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_VFSUB_H__ */ +diff --git a/fs/aufs/wbr_policy.c b/fs/aufs/wbr_policy.c +new file mode 100644 +index 000000000000..f15ed349e1de +--- /dev/null ++++ b/fs/aufs/wbr_policy.c +@@ -0,0 +1,817 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * policies for selecting one among multiple writable branches ++ */ ++ ++#include ++#include "aufs.h" ++ ++/* subset of cpup_attr() */ ++static noinline_for_stack ++int au_cpdown_attr(struct path *h_path, struct dentry *h_src) ++{ ++ int err, sbits; ++ struct iattr ia; ++ struct inode *h_isrc; ++ ++ h_isrc = d_inode(h_src); ++ ia.ia_valid = ATTR_FORCE | ATTR_MODE | ATTR_UID | ATTR_GID; ++ ia.ia_mode = h_isrc->i_mode; ++ ia.ia_uid = h_isrc->i_uid; ++ ia.ia_gid = h_isrc->i_gid; ++ sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID)); ++ au_cpup_attr_flags(d_inode(h_path->dentry), h_isrc->i_flags); ++ /* no delegation since it is just created */ ++ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); ++ ++ /* is this nfs only? */ ++ if (!err && sbits && au_test_nfs(h_path->dentry->d_sb)) { ++ ia.ia_valid = ATTR_FORCE | ATTR_MODE; ++ ia.ia_mode = h_isrc->i_mode; ++ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); ++ } ++ ++ return err; ++} ++ ++#define AuCpdown_PARENT_OPQ 1 ++#define AuCpdown_WHED (1 << 1) ++#define AuCpdown_MADE_DIR (1 << 2) ++#define AuCpdown_DIROPQ (1 << 3) ++#define au_ftest_cpdown(flags, name) ((flags) & AuCpdown_##name) ++#define au_fset_cpdown(flags, name) \ ++ do { (flags) |= AuCpdown_##name; } while (0) ++#define au_fclr_cpdown(flags, name) \ ++ do { (flags) &= ~AuCpdown_##name; } while (0) ++ ++static int au_cpdown_dir_opq(struct dentry *dentry, aufs_bindex_t bdst, ++ unsigned int *flags) ++{ ++ int err; ++ struct dentry *opq_dentry; ++ ++ opq_dentry = au_diropq_create(dentry, bdst); ++ err = PTR_ERR(opq_dentry); ++ if (IS_ERR(opq_dentry)) ++ goto out; ++ dput(opq_dentry); ++ au_fset_cpdown(*flags, DIROPQ); ++ ++out: ++ return err; ++} ++ ++static int au_cpdown_dir_wh(struct dentry *dentry, struct dentry *h_parent, ++ struct inode *dir, aufs_bindex_t bdst) ++{ ++ int err; ++ struct path h_path; ++ struct au_branch *br; ++ ++ br = au_sbr(dentry->d_sb, bdst); ++ h_path.dentry = au_wh_lkup(h_parent, &dentry->d_name, br); ++ err = PTR_ERR(h_path.dentry); ++ if (IS_ERR(h_path.dentry)) ++ goto out; ++ ++ err = 0; ++ if (d_is_positive(h_path.dentry)) { ++ h_path.mnt = au_br_mnt(br); ++ err = au_wh_unlink_dentry(au_h_iptr(dir, bdst), &h_path, ++ dentry); ++ } ++ dput(h_path.dentry); ++ ++out: ++ return err; ++} ++ ++static int au_cpdown_dir(struct dentry *dentry, aufs_bindex_t bdst, ++ struct au_pin *pin, ++ struct dentry *h_parent, void *arg) ++{ ++ int err, rerr; ++ aufs_bindex_t bopq, btop; ++ struct path h_path; ++ struct dentry *parent; ++ struct inode *h_dir, *h_inode, *inode, *dir; ++ unsigned int *flags = arg; ++ ++ btop = au_dbtop(dentry); ++ /* dentry is di-locked */ ++ parent = dget_parent(dentry); ++ dir = d_inode(parent); ++ h_dir = d_inode(h_parent); ++ AuDebugOn(h_dir != au_h_iptr(dir, bdst)); ++ IMustLock(h_dir); ++ ++ err = au_lkup_neg(dentry, bdst, /*wh*/0); ++ if (unlikely(err < 0)) ++ goto out; ++ h_path.dentry = au_h_dptr(dentry, bdst); ++ h_path.mnt = au_sbr_mnt(dentry->d_sb, bdst); ++ err = vfsub_sio_mkdir(au_h_iptr(dir, bdst), &h_path, 0755); ++ if (unlikely(err)) ++ goto out_put; ++ au_fset_cpdown(*flags, MADE_DIR); ++ ++ bopq = au_dbdiropq(dentry); ++ au_fclr_cpdown(*flags, WHED); ++ au_fclr_cpdown(*flags, DIROPQ); ++ if (au_dbwh(dentry) == bdst) ++ au_fset_cpdown(*flags, WHED); ++ if (!au_ftest_cpdown(*flags, PARENT_OPQ) && bopq <= bdst) ++ au_fset_cpdown(*flags, PARENT_OPQ); ++ h_inode = d_inode(h_path.dentry); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ if (au_ftest_cpdown(*flags, WHED)) { ++ err = au_cpdown_dir_opq(dentry, bdst, flags); ++ if (unlikely(err)) { ++ inode_unlock(h_inode); ++ goto out_dir; ++ } ++ } ++ ++ err = au_cpdown_attr(&h_path, au_h_dptr(dentry, btop)); ++ inode_unlock(h_inode); ++ if (unlikely(err)) ++ goto out_opq; ++ ++ if (au_ftest_cpdown(*flags, WHED)) { ++ err = au_cpdown_dir_wh(dentry, h_parent, dir, bdst); ++ if (unlikely(err)) ++ goto out_opq; ++ } ++ ++ inode = d_inode(dentry); ++ if (au_ibbot(inode) < bdst) ++ au_set_ibbot(inode, bdst); ++ au_set_h_iptr(inode, bdst, au_igrab(h_inode), ++ au_hi_flags(inode, /*isdir*/1)); ++ au_fhsm_wrote(dentry->d_sb, bdst, /*force*/0); ++ goto out; /* success */ ++ ++ /* revert */ ++out_opq: ++ if (au_ftest_cpdown(*flags, DIROPQ)) { ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ rerr = au_diropq_remove(dentry, bdst); ++ inode_unlock(h_inode); ++ if (unlikely(rerr)) { ++ AuIOErr("failed removing diropq for %pd b%d (%d)\n", ++ dentry, bdst, rerr); ++ err = -EIO; ++ goto out; ++ } ++ } ++out_dir: ++ if (au_ftest_cpdown(*flags, MADE_DIR)) { ++ rerr = vfsub_sio_rmdir(au_h_iptr(dir, bdst), &h_path); ++ if (unlikely(rerr)) { ++ AuIOErr("failed removing %pd b%d (%d)\n", ++ dentry, bdst, rerr); ++ err = -EIO; ++ } ++ } ++out_put: ++ au_set_h_dptr(dentry, bdst, NULL); ++ if (au_dbbot(dentry) == bdst) ++ au_update_dbbot(dentry); ++out: ++ dput(parent); ++ return err; ++} ++ ++int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst) ++{ ++ int err; ++ unsigned int flags; ++ ++ flags = 0; ++ err = au_cp_dirs(dentry, bdst, au_cpdown_dir, &flags); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* policies for create */ ++ ++int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ int err, i, j, ndentry; ++ aufs_bindex_t bopq; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry **dentries, *parent, *d; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ parent = dget_parent(dentry); ++ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/0); ++ if (unlikely(err)) ++ goto out_free; ++ ++ err = bindex; ++ for (i = 0; i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ dentries = dpage->dentries; ++ ndentry = dpage->ndentry; ++ for (j = 0; j < ndentry; j++) { ++ d = dentries[j]; ++ di_read_lock_parent2(d, !AuLock_IR); ++ bopq = au_dbdiropq(d); ++ di_read_unlock(d, !AuLock_IR); ++ if (bopq >= 0 && bopq < err) ++ err = bopq; ++ } ++ } ++ ++out_free: ++ dput(parent); ++ au_dpages_free(&dpages); ++out: ++ return err; ++} ++ ++static int au_wbr_bu(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ for (; bindex >= 0; bindex--) ++ if (!au_br_rdonly(au_sbr(sb, bindex))) ++ return bindex; ++ return -EROFS; ++} ++ ++/* top down parent */ ++static int au_wbr_create_tdp(struct dentry *dentry, ++ unsigned int flags __maybe_unused) ++{ ++ int err; ++ aufs_bindex_t btop, bindex; ++ struct super_block *sb; ++ struct dentry *parent, *h_parent; ++ ++ sb = dentry->d_sb; ++ btop = au_dbtop(dentry); ++ err = btop; ++ if (!au_br_rdonly(au_sbr(sb, btop))) ++ goto out; ++ ++ err = -EROFS; ++ parent = dget_parent(dentry); ++ for (bindex = au_dbtop(parent); bindex < btop; bindex++) { ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || d_is_negative(h_parent)) ++ continue; ++ ++ if (!au_br_rdonly(au_sbr(sb, bindex))) { ++ err = bindex; ++ break; ++ } ++ } ++ dput(parent); ++ ++ /* bottom up here */ ++ if (unlikely(err < 0)) { ++ err = au_wbr_bu(sb, btop - 1); ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ } ++ ++out: ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* an exception for the policy other than tdp */ ++static int au_wbr_create_exp(struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t bwh, bdiropq; ++ struct dentry *parent; ++ ++ err = -1; ++ bwh = au_dbwh(dentry); ++ parent = dget_parent(dentry); ++ bdiropq = au_dbdiropq(parent); ++ if (bwh >= 0) { ++ if (bdiropq >= 0) ++ err = min(bdiropq, bwh); ++ else ++ err = bwh; ++ AuDbg("%d\n", err); ++ } else if (bdiropq >= 0) { ++ err = bdiropq; ++ AuDbg("%d\n", err); ++ } ++ dput(parent); ++ ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ ++ if (err >= 0 && au_br_rdonly(au_sbr(dentry->d_sb, err))) ++ err = -1; ++ ++ AuDbg("%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* round robin */ ++static int au_wbr_create_init_rr(struct super_block *sb) ++{ ++ int err; ++ ++ err = au_wbr_bu(sb, au_sbbot(sb)); ++ atomic_set(&au_sbi(sb)->si_wbr_rr_next, -err); /* less important */ ++ /* smp_mb(); */ ++ ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++static int au_wbr_create_rr(struct dentry *dentry, unsigned int flags) ++{ ++ int err, nbr; ++ unsigned int u; ++ aufs_bindex_t bindex, bbot; ++ struct super_block *sb; ++ atomic_t *next; ++ ++ err = au_wbr_create_exp(dentry); ++ if (err >= 0) ++ goto out; ++ ++ sb = dentry->d_sb; ++ next = &au_sbi(sb)->si_wbr_rr_next; ++ bbot = au_sbbot(sb); ++ nbr = bbot + 1; ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ if (!au_ftest_wbr(flags, DIR)) { ++ err = atomic_dec_return(next) + 1; ++ /* modulo for 0 is meaningless */ ++ if (unlikely(!err)) ++ err = atomic_dec_return(next) + 1; ++ } else ++ err = atomic_read(next); ++ AuDbg("%d\n", err); ++ u = err; ++ err = u % nbr; ++ AuDbg("%d\n", err); ++ if (!au_br_rdonly(au_sbr(sb, err))) ++ break; ++ err = -EROFS; ++ } ++ ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ ++out: ++ AuDbg("%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* most free space */ ++static void au_mfs(struct dentry *dentry, struct dentry *parent) ++{ ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_wbr_mfs *mfs; ++ struct dentry *h_parent; ++ aufs_bindex_t bindex, bbot; ++ int err; ++ unsigned long long b, bavail; ++ struct path h_path; ++ /* reduce the stack usage */ ++ struct kstatfs *st; ++ ++ st = kmalloc(sizeof(*st), GFP_NOFS); ++ if (unlikely(!st)) { ++ AuWarn1("failed updating mfs(%d), ignored\n", -ENOMEM); ++ return; ++ } ++ ++ bavail = 0; ++ sb = dentry->d_sb; ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ MtxMustLock(&mfs->mfs_lock); ++ mfs->mfs_bindex = -EROFS; ++ mfs->mfsrr_bytes = 0; ++ if (!parent) { ++ bindex = 0; ++ bbot = au_sbbot(sb); ++ } else { ++ bindex = au_dbtop(parent); ++ bbot = au_dbtaildir(parent); ++ } ++ ++ for (; bindex <= bbot; bindex++) { ++ if (parent) { ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || d_is_negative(h_parent)) ++ continue; ++ } ++ br = au_sbr(sb, bindex); ++ if (au_br_rdonly(br)) ++ continue; ++ ++ /* sb->s_root for NFS is unreliable */ ++ h_path.mnt = au_br_mnt(br); ++ h_path.dentry = h_path.mnt->mnt_root; ++ err = vfs_statfs(&h_path, st); ++ if (unlikely(err)) { ++ AuWarn1("failed statfs, b%d, %d\n", bindex, err); ++ continue; ++ } ++ ++ /* when the available size is equal, select the lower one */ ++ BUILD_BUG_ON(sizeof(b) < sizeof(st->f_bavail) ++ || sizeof(b) < sizeof(st->f_bsize)); ++ b = st->f_bavail * st->f_bsize; ++ br->br_wbr->wbr_bytes = b; ++ if (b >= bavail) { ++ bavail = b; ++ mfs->mfs_bindex = bindex; ++ mfs->mfs_jiffy = jiffies; ++ } ++ } ++ ++ mfs->mfsrr_bytes = bavail; ++ AuDbg("b%d\n", mfs->mfs_bindex); ++ kfree(st); ++} ++ ++static int au_wbr_create_mfs(struct dentry *dentry, unsigned int flags) ++{ ++ int err; ++ struct dentry *parent; ++ struct super_block *sb; ++ struct au_wbr_mfs *mfs; ++ ++ err = au_wbr_create_exp(dentry); ++ if (err >= 0) ++ goto out; ++ ++ sb = dentry->d_sb; ++ parent = NULL; ++ if (au_ftest_wbr(flags, PARENT)) ++ parent = dget_parent(dentry); ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ mutex_lock(&mfs->mfs_lock); ++ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) ++ || mfs->mfs_bindex < 0 ++ || au_br_rdonly(au_sbr(sb, mfs->mfs_bindex))) ++ au_mfs(dentry, parent); ++ mutex_unlock(&mfs->mfs_lock); ++ err = mfs->mfs_bindex; ++ dput(parent); ++ ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ ++out: ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++static int au_wbr_create_init_mfs(struct super_block *sb) ++{ ++ struct au_wbr_mfs *mfs; ++ ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ mutex_init(&mfs->mfs_lock); ++ mfs->mfs_jiffy = 0; ++ mfs->mfs_bindex = -EROFS; ++ ++ return 0; ++} ++ ++static int au_wbr_create_fin_mfs(struct super_block *sb __maybe_unused) ++{ ++ mutex_destroy(&au_sbi(sb)->si_wbr_mfs.mfs_lock); ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* top down regardless parent, and then mfs */ ++static int au_wbr_create_tdmfs(struct dentry *dentry, ++ unsigned int flags __maybe_unused) ++{ ++ int err; ++ aufs_bindex_t bwh, btail, bindex, bfound, bmfs; ++ unsigned long long watermark; ++ struct super_block *sb; ++ struct au_wbr_mfs *mfs; ++ struct au_branch *br; ++ struct dentry *parent; ++ ++ sb = dentry->d_sb; ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ mutex_lock(&mfs->mfs_lock); ++ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) ++ || mfs->mfs_bindex < 0) ++ au_mfs(dentry, /*parent*/NULL); ++ watermark = mfs->mfsrr_watermark; ++ bmfs = mfs->mfs_bindex; ++ mutex_unlock(&mfs->mfs_lock); ++ ++ /* another style of au_wbr_create_exp() */ ++ bwh = au_dbwh(dentry); ++ parent = dget_parent(dentry); ++ btail = au_dbtaildir(parent); ++ if (bwh >= 0 && bwh < btail) ++ btail = bwh; ++ ++ err = au_wbr_nonopq(dentry, btail); ++ if (unlikely(err < 0)) ++ goto out; ++ btail = err; ++ bfound = -1; ++ for (bindex = 0; bindex <= btail; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_rdonly(br)) ++ continue; ++ if (br->br_wbr->wbr_bytes > watermark) { ++ bfound = bindex; ++ break; ++ } ++ } ++ err = bfound; ++ if (err < 0) ++ err = bmfs; ++ ++out: ++ dput(parent); ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* most free space and then round robin */ ++static int au_wbr_create_mfsrr(struct dentry *dentry, unsigned int flags) ++{ ++ int err; ++ struct au_wbr_mfs *mfs; ++ ++ err = au_wbr_create_mfs(dentry, flags); ++ if (err >= 0) { ++ mfs = &au_sbi(dentry->d_sb)->si_wbr_mfs; ++ mutex_lock(&mfs->mfs_lock); ++ if (mfs->mfsrr_bytes < mfs->mfsrr_watermark) ++ err = au_wbr_create_rr(dentry, flags); ++ mutex_unlock(&mfs->mfs_lock); ++ } ++ ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++static int au_wbr_create_init_mfsrr(struct super_block *sb) ++{ ++ int err; ++ ++ au_wbr_create_init_mfs(sb); /* ignore */ ++ err = au_wbr_create_init_rr(sb); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* top down parent and most free space */ ++static int au_wbr_create_pmfs(struct dentry *dentry, unsigned int flags) ++{ ++ int err, e2; ++ unsigned long long b; ++ aufs_bindex_t bindex, btop, bbot; ++ struct super_block *sb; ++ struct dentry *parent, *h_parent; ++ struct au_branch *br; ++ ++ err = au_wbr_create_tdp(dentry, flags); ++ if (unlikely(err < 0)) ++ goto out; ++ parent = dget_parent(dentry); ++ btop = au_dbtop(parent); ++ bbot = au_dbtaildir(parent); ++ if (btop == bbot) ++ goto out_parent; /* success */ ++ ++ e2 = au_wbr_create_mfs(dentry, flags); ++ if (e2 < 0) ++ goto out_parent; /* success */ ++ ++ /* when the available size is equal, select upper one */ ++ sb = dentry->d_sb; ++ br = au_sbr(sb, err); ++ b = br->br_wbr->wbr_bytes; ++ AuDbg("b%d, %llu\n", err, b); ++ ++ for (bindex = btop; bindex <= bbot; bindex++) { ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || d_is_negative(h_parent)) ++ continue; ++ ++ br = au_sbr(sb, bindex); ++ if (!au_br_rdonly(br) && br->br_wbr->wbr_bytes > b) { ++ b = br->br_wbr->wbr_bytes; ++ err = bindex; ++ AuDbg("b%d, %llu\n", err, b); ++ } ++ } ++ ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ ++out_parent: ++ dput(parent); ++out: ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * - top down parent ++ * - most free space with parent ++ * - most free space round-robin regardless parent ++ */ ++static int au_wbr_create_pmfsrr(struct dentry *dentry, unsigned int flags) ++{ ++ int err; ++ unsigned long long watermark; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_wbr_mfs *mfs; ++ ++ err = au_wbr_create_pmfs(dentry, flags | AuWbr_PARENT); ++ if (unlikely(err < 0)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ br = au_sbr(sb, err); ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ mutex_lock(&mfs->mfs_lock); ++ watermark = mfs->mfsrr_watermark; ++ mutex_unlock(&mfs->mfs_lock); ++ if (br->br_wbr->wbr_bytes < watermark) ++ /* regardless the parent dir */ ++ err = au_wbr_create_mfsrr(dentry, flags); ++ ++out: ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* policies for copyup */ ++ ++/* top down parent */ ++static int au_wbr_copyup_tdp(struct dentry *dentry) ++{ ++ return au_wbr_create_tdp(dentry, /*flags, anything is ok*/0); ++} ++ ++/* bottom up parent */ ++static int au_wbr_copyup_bup(struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t bindex, btop; ++ struct dentry *parent, *h_parent; ++ struct super_block *sb; ++ ++ err = -EROFS; ++ sb = dentry->d_sb; ++ parent = dget_parent(dentry); ++ btop = au_dbtop(parent); ++ for (bindex = au_dbtop(dentry); bindex >= btop; bindex--) { ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || d_is_negative(h_parent)) ++ continue; ++ ++ if (!au_br_rdonly(au_sbr(sb, bindex))) { ++ err = bindex; ++ break; ++ } ++ } ++ dput(parent); ++ ++ /* bottom up here */ ++ if (unlikely(err < 0)) ++ err = au_wbr_bu(sb, btop - 1); ++ ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* bottom up */ ++int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop) ++{ ++ int err; ++ ++ err = au_wbr_bu(dentry->d_sb, btop); ++ AuDbg("b%d\n", err); ++ if (err > btop) ++ err = au_wbr_nonopq(dentry, err); ++ ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++static int au_wbr_copyup_bu(struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t btop; ++ ++ btop = au_dbtop(dentry); ++ err = au_wbr_do_copyup_bu(dentry, btop); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_wbr_copyup_operations au_wbr_copyup_ops[] = { ++ [AuWbrCopyup_TDP] = { ++ .copyup = au_wbr_copyup_tdp ++ }, ++ [AuWbrCopyup_BUP] = { ++ .copyup = au_wbr_copyup_bup ++ }, ++ [AuWbrCopyup_BU] = { ++ .copyup = au_wbr_copyup_bu ++ } ++}; ++ ++struct au_wbr_create_operations au_wbr_create_ops[] = { ++ [AuWbrCreate_TDP] = { ++ .create = au_wbr_create_tdp ++ }, ++ [AuWbrCreate_RR] = { ++ .create = au_wbr_create_rr, ++ .init = au_wbr_create_init_rr ++ }, ++ [AuWbrCreate_MFS] = { ++ .create = au_wbr_create_mfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_MFSV] = { ++ .create = au_wbr_create_mfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_MFSRR] = { ++ .create = au_wbr_create_mfsrr, ++ .init = au_wbr_create_init_mfsrr, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_MFSRRV] = { ++ .create = au_wbr_create_mfsrr, ++ .init = au_wbr_create_init_mfsrr, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_TDMFS] = { ++ .create = au_wbr_create_tdmfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_TDMFSV] = { ++ .create = au_wbr_create_tdmfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_PMFS] = { ++ .create = au_wbr_create_pmfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_PMFSV] = { ++ .create = au_wbr_create_pmfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_PMFSRR] = { ++ .create = au_wbr_create_pmfsrr, ++ .init = au_wbr_create_init_mfsrr, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_PMFSRRV] = { ++ .create = au_wbr_create_pmfsrr, ++ .init = au_wbr_create_init_mfsrr, ++ .fin = au_wbr_create_fin_mfs ++ } ++}; +diff --git a/fs/aufs/whout.c b/fs/aufs/whout.c +new file mode 100644 +index 000000000000..a3c64efb2784 +--- /dev/null ++++ b/fs/aufs/whout.c +@@ -0,0 +1,1049 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * whiteout for logical deletion and opaque directory ++ */ ++ ++#include "aufs.h" ++ ++#define WH_MASK 0444 ++ ++/* ++ * If a directory contains this file, then it is opaque. We start with the ++ * .wh. flag so that it is blocked by lookup. ++ */ ++static struct qstr diropq_name = QSTR_INIT(AUFS_WH_DIROPQ, ++ sizeof(AUFS_WH_DIROPQ) - 1); ++ ++/* ++ * generate whiteout name, which is NOT terminated by NULL. ++ * @name: original d_name.name ++ * @len: original d_name.len ++ * @wh: whiteout qstr ++ * returns zero when succeeds, otherwise error. ++ * succeeded value as wh->name should be freed by kfree(). ++ */ ++int au_wh_name_alloc(struct qstr *wh, const struct qstr *name) ++{ ++ char *p; ++ ++ if (unlikely(name->len > PATH_MAX - AUFS_WH_PFX_LEN)) ++ return -ENAMETOOLONG; ++ ++ wh->len = name->len + AUFS_WH_PFX_LEN; ++ p = kmalloc(wh->len, GFP_NOFS); ++ wh->name = p; ++ if (p) { ++ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); ++ memcpy(p + AUFS_WH_PFX_LEN, name->name, name->len); ++ /* smp_mb(); */ ++ return 0; ++ } ++ return -ENOMEM; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * test if the @wh_name exists under @h_parent. ++ * @try_sio specifies the necessary of super-io. ++ */ ++int au_wh_test(struct dentry *h_parent, struct qstr *wh_name, int try_sio) ++{ ++ int err; ++ struct dentry *wh_dentry; ++ ++ if (!try_sio) ++ wh_dentry = vfsub_lkup_one(wh_name, h_parent); ++ else ++ wh_dentry = au_sio_lkup_one(wh_name, h_parent); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) { ++ if (err == -ENAMETOOLONG) ++ err = 0; ++ goto out; ++ } ++ ++ err = 0; ++ if (d_is_negative(wh_dentry)) ++ goto out_wh; /* success */ ++ ++ err = 1; ++ if (d_is_reg(wh_dentry)) ++ goto out_wh; /* success */ ++ ++ err = -EIO; ++ AuIOErr("%pd Invalid whiteout entry type 0%o.\n", ++ wh_dentry, d_inode(wh_dentry)->i_mode); ++ ++out_wh: ++ dput(wh_dentry); ++out: ++ return err; ++} ++ ++/* ++ * test if the @h_dentry sets opaque or not. ++ */ ++int au_diropq_test(struct dentry *h_dentry) ++{ ++ int err; ++ struct inode *h_dir; ++ ++ h_dir = d_inode(h_dentry); ++ err = au_wh_test(h_dentry, &diropq_name, ++ au_test_h_perm_sio(h_dir, MAY_EXEC)); ++ return err; ++} ++ ++/* ++ * returns a negative dentry whose name is unique and temporary. ++ */ ++struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, ++ struct qstr *prefix) ++{ ++ struct dentry *dentry; ++ int i; ++ char defname[NAME_MAX - AUFS_MAX_NAMELEN + DNAME_INLINE_LEN + 1], ++ *name, *p; ++ /* strict atomic_t is unnecessary here */ ++ static unsigned short cnt; ++ struct qstr qs; ++ ++ BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN); ++ ++ name = defname; ++ qs.len = sizeof(defname) - DNAME_INLINE_LEN + prefix->len - 1; ++ if (unlikely(prefix->len > DNAME_INLINE_LEN)) { ++ dentry = ERR_PTR(-ENAMETOOLONG); ++ if (unlikely(qs.len > NAME_MAX)) ++ goto out; ++ dentry = ERR_PTR(-ENOMEM); ++ name = kmalloc(qs.len + 1, GFP_NOFS); ++ if (unlikely(!name)) ++ goto out; ++ } ++ ++ /* doubly whiteout-ed */ ++ memcpy(name, AUFS_WH_PFX AUFS_WH_PFX, AUFS_WH_PFX_LEN * 2); ++ p = name + AUFS_WH_PFX_LEN * 2; ++ memcpy(p, prefix->name, prefix->len); ++ p += prefix->len; ++ *p++ = '.'; ++ AuDebugOn(name + qs.len + 1 - p <= AUFS_WH_TMP_LEN); ++ ++ qs.name = name; ++ for (i = 0; i < 3; i++) { ++ sprintf(p, "%.*x", AUFS_WH_TMP_LEN, cnt++); ++ dentry = au_sio_lkup_one(&qs, h_parent); ++ if (IS_ERR(dentry) || d_is_negative(dentry)) ++ goto out_name; ++ dput(dentry); ++ } ++ /* pr_warn("could not get random name\n"); */ ++ dentry = ERR_PTR(-EEXIST); ++ AuDbg("%.*s\n", AuLNPair(&qs)); ++ BUG(); ++ ++out_name: ++ if (name != defname) ++ kfree(name); ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++/* ++ * rename the @h_dentry on @br to the whiteouted temporary name. ++ */ ++int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br) ++{ ++ int err; ++ struct path h_path = { ++ .mnt = au_br_mnt(br) ++ }; ++ struct inode *h_dir, *delegated; ++ struct dentry *h_parent; ++ ++ h_parent = h_dentry->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ ++ h_path.dentry = au_whtmp_lkup(h_parent, br, &h_dentry->d_name); ++ err = PTR_ERR(h_path.dentry); ++ if (IS_ERR(h_path.dentry)) ++ goto out; ++ ++ /* under the same dir, no need to lock_rename() */ ++ delegated = NULL; ++ err = vfsub_rename(h_dir, h_dentry, h_dir, &h_path, &delegated, ++ /*flags*/0); ++ AuTraceErr(err); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal rename\n"); ++ iput(delegated); ++ } ++ dput(h_path.dentry); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * functions for removing a whiteout ++ */ ++ ++static int do_unlink_wh(struct inode *h_dir, struct path *h_path) ++{ ++ int err, force; ++ struct inode *delegated; ++ ++ /* ++ * forces superio when the dir has a sticky bit. ++ * this may be a violation of unix fs semantics. ++ */ ++ force = (h_dir->i_mode & S_ISVTX) ++ && !uid_eq(current_fsuid(), d_inode(h_path->dentry)->i_uid); ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, h_path, &delegated, force); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ return err; ++} ++ ++int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, ++ struct dentry *dentry) ++{ ++ int err; ++ ++ err = do_unlink_wh(h_dir, h_path); ++ if (!err && dentry) ++ au_set_dbwh(dentry, -1); ++ ++ return err; ++} ++ ++static int unlink_wh_name(struct dentry *h_parent, struct qstr *wh, ++ struct au_branch *br) ++{ ++ int err; ++ struct path h_path = { ++ .mnt = au_br_mnt(br) ++ }; ++ ++ err = 0; ++ h_path.dentry = vfsub_lkup_one(wh, h_parent); ++ if (IS_ERR(h_path.dentry)) ++ err = PTR_ERR(h_path.dentry); ++ else { ++ if (d_is_reg(h_path.dentry)) ++ err = do_unlink_wh(d_inode(h_parent), &h_path); ++ dput(h_path.dentry); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * initialize/clean whiteout for a branch ++ */ ++ ++static void au_wh_clean(struct inode *h_dir, struct path *whpath, ++ const int isdir) ++{ ++ int err; ++ struct inode *delegated; ++ ++ if (d_is_negative(whpath->dentry)) ++ return; ++ ++ if (isdir) ++ err = vfsub_rmdir(h_dir, whpath); ++ else { ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, whpath, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ } ++ if (unlikely(err)) ++ pr_warn("failed removing %pd (%d), ignored.\n", ++ whpath->dentry, err); ++} ++ ++static int test_linkable(struct dentry *h_root) ++{ ++ struct inode *h_dir = d_inode(h_root); ++ ++ if (h_dir->i_op->link) ++ return 0; ++ ++ pr_err("%pd (%s) doesn't support link(2), use noplink and rw+nolwh\n", ++ h_root, au_sbtype(h_root->d_sb)); ++ return -ENOSYS; ++} ++ ++/* todo: should this mkdir be done in /sbin/mount.aufs helper? */ ++static int au_whdir(struct inode *h_dir, struct path *path) ++{ ++ int err; ++ ++ err = -EEXIST; ++ if (d_is_negative(path->dentry)) { ++ int mode = 0700; ++ ++ if (au_test_nfs(path->dentry->d_sb)) ++ mode |= 0111; ++ err = vfsub_mkdir(h_dir, path, mode); ++ } else if (d_is_dir(path->dentry)) ++ err = 0; ++ else ++ pr_err("unknown %pd exists\n", path->dentry); ++ ++ return err; ++} ++ ++struct au_wh_base { ++ const struct qstr *name; ++ struct dentry *dentry; ++}; ++ ++static void au_wh_init_ro(struct inode *h_dir, struct au_wh_base base[], ++ struct path *h_path) ++{ ++ h_path->dentry = base[AuBrWh_BASE].dentry; ++ au_wh_clean(h_dir, h_path, /*isdir*/0); ++ h_path->dentry = base[AuBrWh_PLINK].dentry; ++ au_wh_clean(h_dir, h_path, /*isdir*/1); ++ h_path->dentry = base[AuBrWh_ORPH].dentry; ++ au_wh_clean(h_dir, h_path, /*isdir*/1); ++} ++ ++/* ++ * returns tri-state, ++ * minus: error, caller should print the message ++ * zero: success ++ * plus: error, caller should NOT print the message ++ */ ++static int au_wh_init_rw_nolink(struct dentry *h_root, struct au_wbr *wbr, ++ int do_plink, struct au_wh_base base[], ++ struct path *h_path) ++{ ++ int err; ++ struct inode *h_dir; ++ ++ h_dir = d_inode(h_root); ++ h_path->dentry = base[AuBrWh_BASE].dentry; ++ au_wh_clean(h_dir, h_path, /*isdir*/0); ++ h_path->dentry = base[AuBrWh_PLINK].dentry; ++ if (do_plink) { ++ err = test_linkable(h_root); ++ if (unlikely(err)) { ++ err = 1; ++ goto out; ++ } ++ ++ err = au_whdir(h_dir, h_path); ++ if (unlikely(err)) ++ goto out; ++ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); ++ } else ++ au_wh_clean(h_dir, h_path, /*isdir*/1); ++ h_path->dentry = base[AuBrWh_ORPH].dentry; ++ err = au_whdir(h_dir, h_path); ++ if (unlikely(err)) ++ goto out; ++ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); ++ ++out: ++ return err; ++} ++ ++/* ++ * for the moment, aufs supports the branch filesystem which does not support ++ * link(2). testing on FAT which does not support i_op->setattr() fully either, ++ * copyup failed. finally, such filesystem will not be used as the writable ++ * branch. ++ * ++ * returns tri-state, see above. ++ */ ++static int au_wh_init_rw(struct dentry *h_root, struct au_wbr *wbr, ++ int do_plink, struct au_wh_base base[], ++ struct path *h_path) ++{ ++ int err; ++ struct inode *h_dir; ++ ++ WbrWhMustWriteLock(wbr); ++ ++ err = test_linkable(h_root); ++ if (unlikely(err)) { ++ err = 1; ++ goto out; ++ } ++ ++ /* ++ * todo: should this create be done in /sbin/mount.aufs helper? ++ */ ++ err = -EEXIST; ++ h_dir = d_inode(h_root); ++ if (d_is_negative(base[AuBrWh_BASE].dentry)) { ++ h_path->dentry = base[AuBrWh_BASE].dentry; ++ err = vfsub_create(h_dir, h_path, WH_MASK, /*want_excl*/true); ++ } else if (d_is_reg(base[AuBrWh_BASE].dentry)) ++ err = 0; ++ else ++ pr_err("unknown %pd2 exists\n", base[AuBrWh_BASE].dentry); ++ if (unlikely(err)) ++ goto out; ++ ++ h_path->dentry = base[AuBrWh_PLINK].dentry; ++ if (do_plink) { ++ err = au_whdir(h_dir, h_path); ++ if (unlikely(err)) ++ goto out; ++ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); ++ } else ++ au_wh_clean(h_dir, h_path, /*isdir*/1); ++ wbr->wbr_whbase = dget(base[AuBrWh_BASE].dentry); ++ ++ h_path->dentry = base[AuBrWh_ORPH].dentry; ++ err = au_whdir(h_dir, h_path); ++ if (unlikely(err)) ++ goto out; ++ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); ++ ++out: ++ return err; ++} ++ ++/* ++ * initialize the whiteout base file/dir for @br. ++ */ ++int au_wh_init(struct au_branch *br, struct super_block *sb) ++{ ++ int err, i; ++ const unsigned char do_plink ++ = !!au_opt_test(au_mntflags(sb), PLINK); ++ struct inode *h_dir; ++ struct path path = br->br_path; ++ struct dentry *h_root = path.dentry; ++ struct au_wbr *wbr = br->br_wbr; ++ static const struct qstr base_name[] = { ++ [AuBrWh_BASE] = QSTR_INIT(AUFS_BASE_NAME, ++ sizeof(AUFS_BASE_NAME) - 1), ++ [AuBrWh_PLINK] = QSTR_INIT(AUFS_PLINKDIR_NAME, ++ sizeof(AUFS_PLINKDIR_NAME) - 1), ++ [AuBrWh_ORPH] = QSTR_INIT(AUFS_ORPHDIR_NAME, ++ sizeof(AUFS_ORPHDIR_NAME) - 1) ++ }; ++ struct au_wh_base base[] = { ++ [AuBrWh_BASE] = { ++ .name = base_name + AuBrWh_BASE, ++ .dentry = NULL ++ }, ++ [AuBrWh_PLINK] = { ++ .name = base_name + AuBrWh_PLINK, ++ .dentry = NULL ++ }, ++ [AuBrWh_ORPH] = { ++ .name = base_name + AuBrWh_ORPH, ++ .dentry = NULL ++ } ++ }; ++ ++ if (wbr) ++ WbrWhMustWriteLock(wbr); ++ ++ for (i = 0; i < AuBrWh_Last; i++) { ++ /* doubly whiteouted */ ++ struct dentry *d; ++ ++ d = au_wh_lkup(h_root, (void *)base[i].name, br); ++ err = PTR_ERR(d); ++ if (IS_ERR(d)) ++ goto out; ++ ++ base[i].dentry = d; ++ AuDebugOn(wbr ++ && wbr->wbr_wh[i] ++ && wbr->wbr_wh[i] != base[i].dentry); ++ } ++ ++ if (wbr) ++ for (i = 0; i < AuBrWh_Last; i++) { ++ dput(wbr->wbr_wh[i]); ++ wbr->wbr_wh[i] = NULL; ++ } ++ ++ err = 0; ++ if (!au_br_writable(br->br_perm)) { ++ h_dir = d_inode(h_root); ++ au_wh_init_ro(h_dir, base, &path); ++ } else if (!au_br_wh_linkable(br->br_perm)) { ++ err = au_wh_init_rw_nolink(h_root, wbr, do_plink, base, &path); ++ if (err > 0) ++ goto out; ++ else if (err) ++ goto out_err; ++ } else { ++ err = au_wh_init_rw(h_root, wbr, do_plink, base, &path); ++ if (err > 0) ++ goto out; ++ else if (err) ++ goto out_err; ++ } ++ goto out; /* success */ ++ ++out_err: ++ pr_err("an error(%d) on the writable branch %pd(%s)\n", ++ err, h_root, au_sbtype(h_root->d_sb)); ++out: ++ for (i = 0; i < AuBrWh_Last; i++) ++ dput(base[i].dentry); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * whiteouts are all hard-linked usually. ++ * when its link count reaches a ceiling, we create a new whiteout base ++ * asynchronously. ++ */ ++ ++struct reinit_br_wh { ++ struct super_block *sb; ++ struct au_branch *br; ++}; ++ ++static void reinit_br_wh(void *arg) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct path h_path; ++ struct reinit_br_wh *a = arg; ++ struct au_wbr *wbr; ++ struct inode *dir, *delegated; ++ struct dentry *h_root; ++ struct au_hinode *hdir; ++ ++ err = 0; ++ wbr = a->br->br_wbr; ++ /* big aufs lock */ ++ si_noflush_write_lock(a->sb); ++ if (!au_br_writable(a->br->br_perm)) ++ goto out; ++ bindex = au_br_index(a->sb, a->br->br_id); ++ if (unlikely(bindex < 0)) ++ goto out; ++ ++ di_read_lock_parent(a->sb->s_root, AuLock_IR); ++ dir = d_inode(a->sb->s_root); ++ hdir = au_hi(dir, bindex); ++ h_root = au_h_dptr(a->sb->s_root, bindex); ++ AuDebugOn(h_root != au_br_dentry(a->br)); ++ ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ wbr_wh_write_lock(wbr); ++ err = au_h_verify(wbr->wbr_whbase, au_opt_udba(a->sb), hdir->hi_inode, ++ h_root, a->br); ++ if (!err) { ++ h_path.dentry = wbr->wbr_whbase; ++ h_path.mnt = au_br_mnt(a->br); ++ delegated = NULL; ++ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, ++ /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ } else { ++ pr_warn("%pd is moved, ignored\n", wbr->wbr_whbase); ++ err = 0; ++ } ++ dput(wbr->wbr_whbase); ++ wbr->wbr_whbase = NULL; ++ if (!err) ++ err = au_wh_init(a->br, a->sb); ++ wbr_wh_write_unlock(wbr); ++ au_hn_inode_unlock(hdir); ++ di_read_unlock(a->sb->s_root, AuLock_IR); ++ if (!err) ++ au_fhsm_wrote(a->sb, bindex, /*force*/0); ++ ++out: ++ if (wbr) ++ atomic_dec(&wbr->wbr_wh_running); ++ au_lcnt_dec(&a->br->br_count); ++ si_write_unlock(a->sb); ++ au_nwt_done(&au_sbi(a->sb)->si_nowait); ++ kfree(arg); ++ if (unlikely(err)) ++ AuIOErr("err %d\n", err); ++} ++ ++static void kick_reinit_br_wh(struct super_block *sb, struct au_branch *br) ++{ ++ int do_dec, wkq_err; ++ struct reinit_br_wh *arg; ++ ++ do_dec = 1; ++ if (atomic_inc_return(&br->br_wbr->wbr_wh_running) != 1) ++ goto out; ++ ++ /* ignore ENOMEM */ ++ arg = kmalloc(sizeof(*arg), GFP_NOFS); ++ if (arg) { ++ /* ++ * dec(wh_running), kfree(arg) and dec(br_count) ++ * in reinit function ++ */ ++ arg->sb = sb; ++ arg->br = br; ++ au_lcnt_inc(&br->br_count); ++ wkq_err = au_wkq_nowait(reinit_br_wh, arg, sb, /*flags*/0); ++ if (unlikely(wkq_err)) { ++ atomic_dec(&br->br_wbr->wbr_wh_running); ++ au_lcnt_dec(&br->br_count); ++ kfree(arg); ++ } ++ do_dec = 0; ++ } ++ ++out: ++ if (do_dec) ++ atomic_dec(&br->br_wbr->wbr_wh_running); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * create the whiteout @wh. ++ */ ++static int link_or_create_wh(struct super_block *sb, aufs_bindex_t bindex, ++ struct dentry *wh) ++{ ++ int err; ++ struct path h_path = { ++ .dentry = wh ++ }; ++ struct au_branch *br; ++ struct au_wbr *wbr; ++ struct dentry *h_parent; ++ struct inode *h_dir, *delegated; ++ ++ h_parent = wh->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ ++ br = au_sbr(sb, bindex); ++ h_path.mnt = au_br_mnt(br); ++ wbr = br->br_wbr; ++ wbr_wh_read_lock(wbr); ++ if (wbr->wbr_whbase) { ++ delegated = NULL; ++ err = vfsub_link(wbr->wbr_whbase, h_dir, &h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ if (!err || err != -EMLINK) ++ goto out; ++ ++ /* link count full. re-initialize br_whbase. */ ++ kick_reinit_br_wh(sb, br); ++ } ++ ++ /* return this error in this context */ ++ err = vfsub_create(h_dir, &h_path, WH_MASK, /*want_excl*/true); ++ if (!err) ++ au_fhsm_wrote(sb, bindex, /*force*/0); ++ ++out: ++ wbr_wh_read_unlock(wbr); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * create or remove the diropq. ++ */ ++static struct dentry *do_diropq(struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int flags) ++{ ++ struct dentry *opq_dentry, *h_dentry; ++ struct super_block *sb; ++ struct au_branch *br; ++ int err; ++ ++ sb = dentry->d_sb; ++ br = au_sbr(sb, bindex); ++ h_dentry = au_h_dptr(dentry, bindex); ++ opq_dentry = vfsub_lkup_one(&diropq_name, h_dentry); ++ if (IS_ERR(opq_dentry)) ++ goto out; ++ ++ if (au_ftest_diropq(flags, CREATE)) { ++ err = link_or_create_wh(sb, bindex, opq_dentry); ++ if (!err) { ++ au_set_dbdiropq(dentry, bindex); ++ goto out; /* success */ ++ } ++ } else { ++ struct path tmp = { ++ .dentry = opq_dentry, ++ .mnt = au_br_mnt(br) ++ }; ++ err = do_unlink_wh(au_h_iptr(d_inode(dentry), bindex), &tmp); ++ if (!err) ++ au_set_dbdiropq(dentry, -1); ++ } ++ dput(opq_dentry); ++ opq_dentry = ERR_PTR(err); ++ ++out: ++ return opq_dentry; ++} ++ ++struct do_diropq_args { ++ struct dentry **errp; ++ struct dentry *dentry; ++ aufs_bindex_t bindex; ++ unsigned int flags; ++}; ++ ++static void call_do_diropq(void *args) ++{ ++ struct do_diropq_args *a = args; ++ *a->errp = do_diropq(a->dentry, a->bindex, a->flags); ++} ++ ++struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int flags) ++{ ++ struct dentry *diropq, *h_dentry; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!au_test_h_perm_sio(d_inode(h_dentry), MAY_EXEC | MAY_WRITE)) ++ diropq = do_diropq(dentry, bindex, flags); ++ else { ++ int wkq_err; ++ struct do_diropq_args args = { ++ .errp = &diropq, ++ .dentry = dentry, ++ .bindex = bindex, ++ .flags = flags ++ }; ++ ++ wkq_err = au_wkq_wait(call_do_diropq, &args); ++ if (unlikely(wkq_err)) ++ diropq = ERR_PTR(wkq_err); ++ } ++ ++ return diropq; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * lookup whiteout dentry. ++ * @h_parent: lower parent dentry which must exist and be locked ++ * @base_name: name of dentry which will be whiteouted ++ * returns dentry for whiteout. ++ */ ++struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, ++ struct au_branch *br) ++{ ++ int err; ++ struct qstr wh_name; ++ struct dentry *wh_dentry; ++ ++ err = au_wh_name_alloc(&wh_name, base_name); ++ wh_dentry = ERR_PTR(err); ++ if (!err) { ++ wh_dentry = vfsub_lkup_one(&wh_name, h_parent); ++ kfree(wh_name.name); ++ } ++ return wh_dentry; ++} ++ ++/* ++ * link/create a whiteout for @dentry on @bindex. ++ */ ++struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent) ++{ ++ struct dentry *wh_dentry; ++ struct super_block *sb; ++ int err; ++ ++ sb = dentry->d_sb; ++ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, au_sbr(sb, bindex)); ++ if (!IS_ERR(wh_dentry) && d_is_negative(wh_dentry)) { ++ err = link_or_create_wh(sb, bindex, wh_dentry); ++ if (!err) { ++ au_set_dbwh(dentry, bindex); ++ au_fhsm_wrote(sb, bindex, /*force*/0); ++ } else { ++ dput(wh_dentry); ++ wh_dentry = ERR_PTR(err); ++ } ++ } ++ ++ return wh_dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* Delete all whiteouts in this directory on branch bindex. */ ++static int del_wh_children(struct dentry *h_dentry, struct au_nhash *whlist, ++ aufs_bindex_t bindex, struct au_branch *br) ++{ ++ int err; ++ unsigned long ul, n; ++ struct qstr wh_name; ++ char *p; ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ struct au_vdir_destr *str; ++ ++ err = -ENOMEM; ++ p = (void *)__get_free_page(GFP_NOFS); ++ wh_name.name = p; ++ if (unlikely(!wh_name.name)) ++ goto out; ++ ++ err = 0; ++ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); ++ p += AUFS_WH_PFX_LEN; ++ n = whlist->nh_num; ++ head = whlist->nh_head; ++ for (ul = 0; !err && ul < n; ul++, head++) { ++ hlist_for_each_entry(pos, head, wh_hash) { ++ if (pos->wh_bindex != bindex) ++ continue; ++ ++ str = &pos->wh_str; ++ if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) { ++ memcpy(p, str->name, str->len); ++ wh_name.len = AUFS_WH_PFX_LEN + str->len; ++ err = unlink_wh_name(h_dentry, &wh_name, br); ++ if (!err) ++ continue; ++ break; ++ } ++ AuIOErr("whiteout name too long %.*s\n", ++ str->len, str->name); ++ err = -EIO; ++ break; ++ } ++ } ++ free_page((unsigned long)wh_name.name); ++ ++out: ++ return err; ++} ++ ++struct del_wh_children_args { ++ int *errp; ++ struct dentry *h_dentry; ++ struct au_nhash *whlist; ++ aufs_bindex_t bindex; ++ struct au_branch *br; ++}; ++ ++static void call_del_wh_children(void *args) ++{ ++ struct del_wh_children_args *a = args; ++ *a->errp = del_wh_children(a->h_dentry, a->whlist, a->bindex, a->br); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp) ++{ ++ struct au_whtmp_rmdir *whtmp; ++ int err; ++ unsigned int rdhash; ++ ++ SiMustAnyLock(sb); ++ ++ whtmp = kzalloc(sizeof(*whtmp), gfp); ++ if (unlikely(!whtmp)) { ++ whtmp = ERR_PTR(-ENOMEM); ++ goto out; ++ } ++ ++ /* no estimation for dir size */ ++ rdhash = au_sbi(sb)->si_rdhash; ++ if (!rdhash) ++ rdhash = AUFS_RDHASH_DEF; ++ err = au_nhash_alloc(&whtmp->whlist, rdhash, gfp); ++ if (unlikely(err)) { ++ kfree(whtmp); ++ whtmp = ERR_PTR(err); ++ } ++ ++out: ++ return whtmp; ++} ++ ++void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp) ++{ ++ if (whtmp->br) ++ au_lcnt_dec(&whtmp->br->br_count); ++ dput(whtmp->wh_dentry); ++ iput(whtmp->dir); ++ au_nhash_wh_free(&whtmp->whlist); ++ kfree(whtmp); ++} ++ ++/* ++ * rmdir the whiteouted temporary named dir @h_dentry. ++ * @whlist: whiteouted children. ++ */ ++int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct au_nhash *whlist) ++{ ++ int err; ++ unsigned int h_nlink; ++ struct path h_tmp; ++ struct inode *wh_inode, *h_dir; ++ struct au_branch *br; ++ ++ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ ++ IMustLock(h_dir); ++ ++ br = au_sbr(dir->i_sb, bindex); ++ wh_inode = d_inode(wh_dentry); ++ inode_lock_nested(wh_inode, AuLsc_I_CHILD); ++ ++ /* ++ * someone else might change some whiteouts while we were sleeping. ++ * it means this whlist may have an obsoleted entry. ++ */ ++ if (!au_test_h_perm_sio(wh_inode, MAY_EXEC | MAY_WRITE)) ++ err = del_wh_children(wh_dentry, whlist, bindex, br); ++ else { ++ int wkq_err; ++ struct del_wh_children_args args = { ++ .errp = &err, ++ .h_dentry = wh_dentry, ++ .whlist = whlist, ++ .bindex = bindex, ++ .br = br ++ }; ++ ++ wkq_err = au_wkq_wait(call_del_wh_children, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ inode_unlock(wh_inode); ++ ++ if (!err) { ++ h_tmp.dentry = wh_dentry; ++ h_tmp.mnt = au_br_mnt(br); ++ h_nlink = h_dir->i_nlink; ++ err = vfsub_rmdir(h_dir, &h_tmp); ++ /* some fs doesn't change the parent nlink in some cases */ ++ h_nlink -= h_dir->i_nlink; ++ } ++ ++ if (!err) { ++ if (au_ibtop(dir) == bindex) { ++ /* todo: dir->i_mutex is necessary */ ++ au_cpup_attr_timesizes(dir); ++ if (h_nlink) ++ vfsub_drop_nlink(dir); ++ } ++ return 0; /* success */ ++ } ++ ++ pr_warn("failed removing %pd(%d), ignored\n", wh_dentry, err); ++ return err; ++} ++ ++static void call_rmdir_whtmp(void *args) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct au_whtmp_rmdir *a = args; ++ struct super_block *sb; ++ struct dentry *h_parent; ++ struct inode *h_dir; ++ struct au_hinode *hdir; ++ ++ /* rmdir by nfsd may cause deadlock with this i_mutex */ ++ /* inode_lock(a->dir); */ ++ err = -EROFS; ++ sb = a->dir->i_sb; ++ si_read_lock(sb, !AuLock_FLUSH); ++ if (!au_br_writable(a->br->br_perm)) ++ goto out; ++ bindex = au_br_index(sb, a->br->br_id); ++ if (unlikely(bindex < 0)) ++ goto out; ++ ++ err = -EIO; ++ ii_write_lock_parent(a->dir); ++ h_parent = dget_parent(a->wh_dentry); ++ h_dir = d_inode(h_parent); ++ hdir = au_hi(a->dir, bindex); ++ err = vfsub_mnt_want_write(au_br_mnt(a->br)); ++ if (unlikely(err)) ++ goto out_mnt; ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ err = au_h_verify(a->wh_dentry, au_opt_udba(sb), h_dir, h_parent, ++ a->br); ++ if (!err) ++ err = au_whtmp_rmdir(a->dir, bindex, a->wh_dentry, &a->whlist); ++ au_hn_inode_unlock(hdir); ++ vfsub_mnt_drop_write(au_br_mnt(a->br)); ++ ++out_mnt: ++ dput(h_parent); ++ ii_write_unlock(a->dir); ++out: ++ /* inode_unlock(a->dir); */ ++ au_whtmp_rmdir_free(a); ++ si_read_unlock(sb); ++ au_nwt_done(&au_sbi(sb)->si_nowait); ++ if (unlikely(err)) ++ AuIOErr("err %d\n", err); ++} ++ ++void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct au_whtmp_rmdir *args) ++{ ++ int wkq_err; ++ struct super_block *sb; ++ ++ IMustLock(dir); ++ ++ /* all post-process will be done in do_rmdir_whtmp(). */ ++ sb = dir->i_sb; ++ args->dir = au_igrab(dir); ++ args->br = au_sbr(sb, bindex); ++ au_lcnt_inc(&args->br->br_count); ++ args->wh_dentry = dget(wh_dentry); ++ wkq_err = au_wkq_nowait(call_rmdir_whtmp, args, sb, /*flags*/0); ++ if (unlikely(wkq_err)) { ++ pr_warn("rmdir error %pd (%d), ignored\n", wh_dentry, wkq_err); ++ au_whtmp_rmdir_free(args); ++ } ++} +diff --git a/fs/aufs/whout.h b/fs/aufs/whout.h +new file mode 100644 +index 000000000000..c790bfa66ea8 +--- /dev/null ++++ b/fs/aufs/whout.h +@@ -0,0 +1,73 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * whiteout for logical deletion and opaque directory ++ */ ++ ++#ifndef __AUFS_WHOUT_H__ ++#define __AUFS_WHOUT_H__ ++ ++#ifdef __KERNEL__ ++ ++#include "dir.h" ++ ++/* whout.c */ ++int au_wh_name_alloc(struct qstr *wh, const struct qstr *name); ++int au_wh_test(struct dentry *h_parent, struct qstr *wh_name, int try_sio); ++int au_diropq_test(struct dentry *h_dentry); ++struct au_branch; ++struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, ++ struct qstr *prefix); ++int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br); ++int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, ++ struct dentry *dentry); ++int au_wh_init(struct au_branch *br, struct super_block *sb); ++ ++/* diropq flags */ ++#define AuDiropq_CREATE 1 ++#define au_ftest_diropq(flags, name) ((flags) & AuDiropq_##name) ++#define au_fset_diropq(flags, name) \ ++ do { (flags) |= AuDiropq_##name; } while (0) ++#define au_fclr_diropq(flags, name) \ ++ do { (flags) &= ~AuDiropq_##name; } while (0) ++ ++struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int flags); ++struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, ++ struct au_branch *br); ++struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent); ++ ++/* real rmdir for the whiteout-ed dir */ ++struct au_whtmp_rmdir { ++ struct inode *dir; ++ struct au_branch *br; ++ struct dentry *wh_dentry; ++ struct au_nhash whlist; ++}; ++ ++struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp); ++void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp); ++int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct au_nhash *whlist); ++void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct au_whtmp_rmdir *args); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct dentry *au_diropq_create(struct dentry *dentry, ++ aufs_bindex_t bindex) ++{ ++ return au_diropq_sio(dentry, bindex, AuDiropq_CREATE); ++} ++ ++static inline int au_diropq_remove(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ return PTR_ERR(au_diropq_sio(dentry, bindex, !AuDiropq_CREATE)); ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_WHOUT_H__ */ +diff --git a/fs/aufs/wkq.c b/fs/aufs/wkq.c +new file mode 100644 +index 000000000000..597099ef2137 +--- /dev/null ++++ b/fs/aufs/wkq.c +@@ -0,0 +1,379 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * workqueue for asynchronous/super-io operations ++ * todo: try new credential scheme ++ */ ++ ++#include ++#include "aufs.h" ++ ++/* internal workqueue named AUFS_WKQ_NAME */ ++ ++static struct workqueue_struct *au_wkq; ++ ++struct au_wkinfo { ++ struct work_struct wk; ++ struct kobject *kobj; ++ ++ unsigned int flags; /* see wkq.h */ ++ ++ au_wkq_func_t func; ++ void *args; ++ ++#ifdef CONFIG_LOCKDEP ++ int dont_check; ++ struct held_lock **hlock; ++#endif ++ ++ struct completion *comp; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * Aufs passes some operations to the workqueue such as the internal copyup. ++ * This scheme looks rather unnatural for LOCKDEP debugging feature, since the ++ * job run by workqueue depends upon the locks acquired in the other task. ++ * Delegating a small operation to the workqueue, aufs passes its lockdep ++ * information too. And the job in the workqueue restores the info in order to ++ * pretend as if it acquired those locks. This is just to make LOCKDEP work ++ * correctly and expectedly. ++ */ ++ ++#ifndef CONFIG_LOCKDEP ++AuStubInt0(au_wkq_lockdep_alloc, struct au_wkinfo *wkinfo); ++AuStubVoid(au_wkq_lockdep_free, struct au_wkinfo *wkinfo); ++AuStubVoid(au_wkq_lockdep_pre, struct au_wkinfo *wkinfo); ++AuStubVoid(au_wkq_lockdep_post, struct au_wkinfo *wkinfo); ++AuStubVoid(au_wkq_lockdep_init, struct au_wkinfo *wkinfo); ++#else ++static void au_wkq_lockdep_init(struct au_wkinfo *wkinfo) ++{ ++ wkinfo->hlock = NULL; ++ wkinfo->dont_check = 0; ++} ++ ++/* ++ * 1: matched ++ * 0: unmatched ++ */ ++static int au_wkq_lockdep_test(struct lock_class_key *key, const char *name) ++{ ++ static DEFINE_SPINLOCK(spin); ++ static struct { ++ char *name; ++ struct lock_class_key *key; ++ } a[] = { ++ { .name = "&sbinfo->si_rwsem" }, ++ { .name = "&finfo->fi_rwsem" }, ++ { .name = "&dinfo->di_rwsem" }, ++ { .name = "&iinfo->ii_rwsem" } ++ }; ++ static int set; ++ int i; ++ ++ /* lockless read from 'set.' see below */ ++ if (set == ARRAY_SIZE(a)) { ++ for (i = 0; i < ARRAY_SIZE(a); i++) ++ if (a[i].key == key) ++ goto match; ++ goto unmatch; ++ } ++ ++ spin_lock(&spin); ++ if (set) ++ for (i = 0; i < ARRAY_SIZE(a); i++) ++ if (a[i].key == key) { ++ spin_unlock(&spin); ++ goto match; ++ } ++ for (i = 0; i < ARRAY_SIZE(a); i++) { ++ if (a[i].key) { ++ if (unlikely(a[i].key == key)) { /* rare but possible */ ++ spin_unlock(&spin); ++ goto match; ++ } else ++ continue; ++ } ++ if (strstr(a[i].name, name)) { ++ /* ++ * the order of these three lines is important for the ++ * lockless read above. ++ */ ++ a[i].key = key; ++ spin_unlock(&spin); ++ set++; ++ /* AuDbg("%d, %s\n", set, name); */ ++ goto match; ++ } ++ } ++ spin_unlock(&spin); ++ goto unmatch; ++ ++match: ++ return 1; ++unmatch: ++ return 0; ++} ++ ++static int au_wkq_lockdep_alloc(struct au_wkinfo *wkinfo) ++{ ++ int err, n; ++ struct task_struct *curr; ++ struct held_lock **hl, *held_locks, *p; ++ ++ err = 0; ++ curr = current; ++ wkinfo->dont_check = lockdep_recursing(curr); ++ if (wkinfo->dont_check) ++ goto out; ++ n = curr->lockdep_depth; ++ if (!n) ++ goto out; ++ ++ err = -ENOMEM; ++ wkinfo->hlock = kmalloc_array(n + 1, sizeof(*wkinfo->hlock), GFP_NOFS); ++ if (unlikely(!wkinfo->hlock)) ++ goto out; ++ ++ err = 0; ++#if 0 ++ if (0 && au_debug_test()) /* left for debugging */ ++ lockdep_print_held_locks(curr); ++#endif ++ held_locks = curr->held_locks; ++ hl = wkinfo->hlock; ++ while (n--) { ++ p = held_locks++; ++ if (au_wkq_lockdep_test(p->instance->key, p->instance->name)) ++ *hl++ = p; ++ } ++ *hl = NULL; ++ ++out: ++ return err; ++} ++ ++static void au_wkq_lockdep_free(struct au_wkinfo *wkinfo) ++{ ++ kfree(wkinfo->hlock); ++} ++ ++static void au_wkq_lockdep_pre(struct au_wkinfo *wkinfo) ++{ ++ struct held_lock *p, **hl = wkinfo->hlock; ++ int subclass; ++ ++ if (wkinfo->dont_check) ++ lockdep_off(); ++ if (!hl) ++ return; ++ while ((p = *hl++)) { /* assignment */ ++ subclass = lockdep_hlock_class(p)->subclass; ++ /* AuDbg("%s, %d\n", p->instance->name, subclass); */ ++ if (p->read) ++ rwsem_acquire_read(p->instance, subclass, 0, ++ /*p->acquire_ip*/_RET_IP_); ++ else ++ rwsem_acquire(p->instance, subclass, 0, ++ /*p->acquire_ip*/_RET_IP_); ++ } ++} ++ ++static void au_wkq_lockdep_post(struct au_wkinfo *wkinfo) ++{ ++ struct held_lock *p, **hl = wkinfo->hlock; ++ ++ if (wkinfo->dont_check) ++ lockdep_on(); ++ if (!hl) ++ return; ++ while ((p = *hl++)) /* assignment */ ++ rwsem_release(p->instance, 0, /*p->acquire_ip*/_RET_IP_); ++} ++#endif ++ ++static void wkq_func(struct work_struct *wk) ++{ ++ struct au_wkinfo *wkinfo = container_of(wk, struct au_wkinfo, wk); ++ ++ AuDebugOn(!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)); ++ AuDebugOn(rlimit(RLIMIT_FSIZE) != RLIM_INFINITY); ++ ++ au_wkq_lockdep_pre(wkinfo); ++ wkinfo->func(wkinfo->args); ++ au_wkq_lockdep_post(wkinfo); ++ if (au_ftest_wkq(wkinfo->flags, WAIT)) ++ complete(wkinfo->comp); ++ else { ++ kobject_put(wkinfo->kobj); ++ module_put(THIS_MODULE); /* todo: ?? */ ++ kfree(wkinfo); ++ } ++} ++ ++/* ++ * Since struct completion is large, try allocating it dynamically. ++ */ ++#if 1 /* defined(CONFIG_4KSTACKS) || defined(AuTest4KSTACKS) */ ++#define AuWkqCompDeclare(name) struct completion *comp = NULL ++ ++static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) ++{ ++ *comp = kmalloc(sizeof(**comp), GFP_NOFS); ++ if (*comp) { ++ init_completion(*comp); ++ wkinfo->comp = *comp; ++ return 0; ++ } ++ return -ENOMEM; ++} ++ ++static void au_wkq_comp_free(struct completion *comp) ++{ ++ kfree(comp); ++} ++ ++#else ++ ++/* no braces */ ++#define AuWkqCompDeclare(name) \ ++ DECLARE_COMPLETION_ONSTACK(_ ## name); \ ++ struct completion *comp = &_ ## name ++ ++static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) ++{ ++ wkinfo->comp = *comp; ++ return 0; ++} ++ ++static void au_wkq_comp_free(struct completion *comp __maybe_unused) ++{ ++ /* empty */ ++} ++#endif /* 4KSTACKS */ ++ ++static void au_wkq_run(struct au_wkinfo *wkinfo) ++{ ++ if (au_ftest_wkq(wkinfo->flags, NEST)) { ++ if (au_wkq_test()) { ++ AuWarn1("wkq from wkq, unless silly-rename on NFS," ++ " due to a dead dir by UDBA," ++ " or async xino write?\n"); ++ AuDebugOn(au_ftest_wkq(wkinfo->flags, WAIT)); ++ } ++ } else ++ au_dbg_verify_kthread(); ++ ++ if (au_ftest_wkq(wkinfo->flags, WAIT)) { ++ INIT_WORK_ONSTACK(&wkinfo->wk, wkq_func); ++ queue_work(au_wkq, &wkinfo->wk); ++ } else { ++ INIT_WORK(&wkinfo->wk, wkq_func); ++ schedule_work(&wkinfo->wk); ++ } ++} ++ ++/* ++ * Be careful. It is easy to make deadlock happen. ++ * processA: lock, wkq and wait ++ * processB: wkq and wait, lock in wkq ++ * --> deadlock ++ */ ++int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args) ++{ ++ int err; ++ AuWkqCompDeclare(comp); ++ struct au_wkinfo wkinfo = { ++ .flags = flags, ++ .func = func, ++ .args = args ++ }; ++ ++ err = au_wkq_comp_alloc(&wkinfo, &comp); ++ if (unlikely(err)) ++ goto out; ++ err = au_wkq_lockdep_alloc(&wkinfo); ++ if (unlikely(err)) ++ goto out_comp; ++ if (!err) { ++ au_wkq_run(&wkinfo); ++ /* no timeout, no interrupt */ ++ wait_for_completion(wkinfo.comp); ++ } ++ au_wkq_lockdep_free(&wkinfo); ++ ++out_comp: ++ au_wkq_comp_free(comp); ++out: ++ destroy_work_on_stack(&wkinfo.wk); ++ return err; ++} ++ ++/* ++ * Note: dget/dput() in func for aufs dentries are not supported. It will be a ++ * problem in a concurrent umounting. ++ */ ++int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, ++ unsigned int flags) ++{ ++ int err; ++ struct au_wkinfo *wkinfo; ++ ++ atomic_inc(&au_sbi(sb)->si_nowait.nw_len); ++ ++ /* ++ * wkq_func() must free this wkinfo. ++ * it highly depends upon the implementation of workqueue. ++ */ ++ err = 0; ++ wkinfo = kmalloc(sizeof(*wkinfo), GFP_NOFS); ++ if (wkinfo) { ++ wkinfo->kobj = &au_sbi(sb)->si_kobj; ++ wkinfo->flags = flags & ~AuWkq_WAIT; ++ wkinfo->func = func; ++ wkinfo->args = args; ++ wkinfo->comp = NULL; ++ au_wkq_lockdep_init(wkinfo); ++ kobject_get(wkinfo->kobj); ++ __module_get(THIS_MODULE); /* todo: ?? */ ++ ++ au_wkq_run(wkinfo); ++ } else { ++ err = -ENOMEM; ++ au_nwt_done(&au_sbi(sb)->si_nowait); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_nwt_init(struct au_nowait_tasks *nwt) ++{ ++ atomic_set(&nwt->nw_len, 0); ++ /* smp_mb(); */ /* atomic_set */ ++ init_waitqueue_head(&nwt->nw_wq); ++} ++ ++void au_wkq_fin(void) ++{ ++ destroy_workqueue(au_wkq); ++} ++ ++int __init au_wkq_init(void) ++{ ++ int err; ++ ++ err = 0; ++ au_wkq = alloc_workqueue(AUFS_WKQ_NAME, 0, WQ_DFL_ACTIVE); ++ if (IS_ERR(au_wkq)) ++ err = PTR_ERR(au_wkq); ++ else if (!au_wkq) ++ err = -ENOMEM; ++ ++ return err; ++} +diff --git a/fs/aufs/wkq.h b/fs/aufs/wkq.h +new file mode 100644 +index 000000000000..ec7bb8bd219c +--- /dev/null ++++ b/fs/aufs/wkq.h +@@ -0,0 +1,76 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * workqueue for asynchronous/super-io operations ++ * todo: try new credentials management scheme ++ */ ++ ++#ifndef __AUFS_WKQ_H__ ++#define __AUFS_WKQ_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++struct super_block; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * in the next operation, wait for the 'nowait' tasks in system-wide workqueue ++ */ ++struct au_nowait_tasks { ++ atomic_t nw_len; ++ wait_queue_head_t nw_wq; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++typedef void (*au_wkq_func_t)(void *args); ++ ++/* wkq flags */ ++#define AuWkq_WAIT 1 ++#define AuWkq_NEST (1 << 1) ++#define au_ftest_wkq(flags, name) ((flags) & AuWkq_##name) ++#define au_fset_wkq(flags, name) \ ++ do { (flags) |= AuWkq_##name; } while (0) ++#define au_fclr_wkq(flags, name) \ ++ do { (flags) &= ~AuWkq_##name; } while (0) ++ ++/* wkq.c */ ++int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args); ++int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, ++ unsigned int flags); ++void au_nwt_init(struct au_nowait_tasks *nwt); ++int __init au_wkq_init(void); ++void au_wkq_fin(void); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline int au_wkq_test(void) ++{ ++ return current->flags & PF_WQ_WORKER; ++} ++ ++static inline int au_wkq_wait(au_wkq_func_t func, void *args) ++{ ++ return au_wkq_do_wait(AuWkq_WAIT, func, args); ++} ++ ++static inline void au_nwt_done(struct au_nowait_tasks *nwt) ++{ ++ if (atomic_dec_and_test(&nwt->nw_len)) ++ wake_up_all(&nwt->nw_wq); ++} ++ ++static inline int au_nwt_flush(struct au_nowait_tasks *nwt) ++{ ++ wait_event(nwt->nw_wq, !atomic_read(&nwt->nw_len)); ++ return 0; ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_WKQ_H__ */ +diff --git a/fs/aufs/xattr.c b/fs/aufs/xattr.c +new file mode 100644 +index 000000000000..6c877651fff7 +--- /dev/null ++++ b/fs/aufs/xattr.c +@@ -0,0 +1,343 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2014-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * handling xattr functions ++ */ ++ ++#include ++#include ++#include ++#include "aufs.h" ++ ++static int au_xattr_ignore(int err, char *name, unsigned int ignore_flags) ++{ ++ if (!ignore_flags) ++ goto out; ++ switch (err) { ++ case -ENOMEM: ++ case -EDQUOT: ++ goto out; ++ } ++ ++ if ((ignore_flags & AuBrAttr_ICEX) == AuBrAttr_ICEX) { ++ err = 0; ++ goto out; ++ } ++ ++#define cmp(brattr, prefix) do { \ ++ if (!strncmp(name, XATTR_##prefix##_PREFIX, \ ++ XATTR_##prefix##_PREFIX_LEN)) { \ ++ if (ignore_flags & AuBrAttr_ICEX_##brattr) \ ++ err = 0; \ ++ goto out; \ ++ } \ ++ } while (0) ++ ++ cmp(SEC, SECURITY); ++ cmp(SYS, SYSTEM); ++ cmp(TR, TRUSTED); ++ cmp(USR, USER); ++#undef cmp ++ ++ if (ignore_flags & AuBrAttr_ICEX_OTH) ++ err = 0; ++ ++out: ++ return err; ++} ++ ++static const int au_xattr_out_of_list = AuBrAttr_ICEX_OTH << 1; ++ ++static int au_do_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, ++ char *name, char **buf, unsigned int ignore_flags, ++ unsigned int verbose) ++{ ++ int err; ++ ssize_t ssz; ++ struct inode *h_idst; ++ ++ ssz = vfs_getxattr_alloc(h_src, name, buf, 0, GFP_NOFS); ++ err = ssz; ++ if (unlikely(err <= 0)) { ++ if (err == -ENODATA ++ || (err == -EOPNOTSUPP ++ && ((ignore_flags & au_xattr_out_of_list) ++ || (au_test_nfs_noacl(d_inode(h_src)) ++ && (!strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) ++ || !strcmp(name, ++ XATTR_NAME_POSIX_ACL_DEFAULT)))) ++ )) ++ err = 0; ++ if (err && (verbose || au_debug_test())) ++ pr_err("%s, err %d\n", name, err); ++ goto out; ++ } ++ ++ /* unlock it temporary */ ++ h_idst = d_inode(h_dst); ++ inode_unlock(h_idst); ++ err = vfsub_setxattr(h_dst, name, *buf, ssz, /*flags*/0); ++ inode_lock_nested(h_idst, AuLsc_I_CHILD2); ++ if (unlikely(err)) { ++ if (verbose || au_debug_test()) ++ pr_err("%s, err %d\n", name, err); ++ err = au_xattr_ignore(err, name, ignore_flags); ++ } ++ ++out: ++ return err; ++} ++ ++int au_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, int ignore_flags, ++ unsigned int verbose) ++{ ++ int err, unlocked, acl_access, acl_default; ++ ssize_t ssz; ++ struct inode *h_isrc, *h_idst; ++ char *value, *p, *o, *e; ++ ++ /* try stopping to update the source inode while we are referencing */ ++ /* there should not be the parent-child relationship between them */ ++ h_isrc = d_inode(h_src); ++ h_idst = d_inode(h_dst); ++ inode_unlock(h_idst); ++ inode_lock_shared_nested(h_isrc, AuLsc_I_CHILD); ++ inode_lock_nested(h_idst, AuLsc_I_CHILD2); ++ unlocked = 0; ++ ++ /* some filesystems don't list POSIX ACL, for example tmpfs */ ++ ssz = vfs_listxattr(h_src, NULL, 0); ++ err = ssz; ++ if (unlikely(err < 0)) { ++ AuTraceErr(err); ++ if (err == -ENODATA ++ || err == -EOPNOTSUPP) ++ err = 0; /* ignore */ ++ goto out; ++ } ++ ++ err = 0; ++ p = NULL; ++ o = NULL; ++ if (ssz) { ++ err = -ENOMEM; ++ p = kmalloc(ssz, GFP_NOFS); ++ o = p; ++ if (unlikely(!p)) ++ goto out; ++ err = vfs_listxattr(h_src, p, ssz); ++ } ++ inode_unlock_shared(h_isrc); ++ unlocked = 1; ++ AuDbg("err %d, ssz %zd\n", err, ssz); ++ if (unlikely(err < 0)) ++ goto out_free; ++ ++ err = 0; ++ e = p + ssz; ++ value = NULL; ++ acl_access = 0; ++ acl_default = 0; ++ while (!err && p < e) { ++ acl_access |= !strncmp(p, XATTR_NAME_POSIX_ACL_ACCESS, ++ sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1); ++ acl_default |= !strncmp(p, XATTR_NAME_POSIX_ACL_DEFAULT, ++ sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) ++ - 1); ++ err = au_do_cpup_xattr(h_dst, h_src, p, &value, ignore_flags, ++ verbose); ++ p += strlen(p) + 1; ++ } ++ AuTraceErr(err); ++ ignore_flags |= au_xattr_out_of_list; ++ if (!err && !acl_access) { ++ err = au_do_cpup_xattr(h_dst, h_src, ++ XATTR_NAME_POSIX_ACL_ACCESS, &value, ++ ignore_flags, verbose); ++ AuTraceErr(err); ++ } ++ if (!err && !acl_default) { ++ err = au_do_cpup_xattr(h_dst, h_src, ++ XATTR_NAME_POSIX_ACL_DEFAULT, &value, ++ ignore_flags, verbose); ++ AuTraceErr(err); ++ } ++ ++ kfree(value); ++ ++out_free: ++ kfree(o); ++out: ++ if (!unlocked) ++ inode_unlock_shared(h_isrc); ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_smack_reentering(struct super_block *sb) ++{ ++#if IS_ENABLED(CONFIG_SECURITY_SMACK) ++ /* ++ * as a part of lookup, smack_d_instantiate() is called, and it calls ++ * i_op->getxattr(). ouch. ++ */ ++ return si_pid_test(sb); ++#else ++ return 0; ++#endif ++} ++ ++enum { ++ AU_XATTR_LIST, ++ AU_XATTR_GET ++}; ++ ++struct au_lgxattr { ++ int type; ++ union { ++ struct { ++ char *list; ++ size_t size; ++ } list; ++ struct { ++ const char *name; ++ void *value; ++ size_t size; ++ } get; ++ } u; ++}; ++ ++static ssize_t au_lgxattr(struct dentry *dentry, struct au_lgxattr *arg) ++{ ++ ssize_t err; ++ int reenter; ++ struct path h_path; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ reenter = au_smack_reentering(sb); ++ if (!reenter) { ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out; ++ } ++ err = au_h_path_getattr(dentry, /*force*/1, &h_path, reenter); ++ if (unlikely(err)) ++ goto out_si; ++ if (unlikely(!h_path.dentry)) ++ /* illegally overlapped or something */ ++ goto out_di; /* pretending success */ ++ ++ /* always topmost entry only */ ++ switch (arg->type) { ++ case AU_XATTR_LIST: ++ err = vfs_listxattr(h_path.dentry, ++ arg->u.list.list, arg->u.list.size); ++ break; ++ case AU_XATTR_GET: ++ AuDebugOn(d_is_negative(h_path.dentry)); ++ err = vfs_getxattr(h_path.dentry, ++ arg->u.get.name, arg->u.get.value, ++ arg->u.get.size); ++ break; ++ } ++ ++out_di: ++ if (!reenter) ++ di_read_unlock(dentry, AuLock_IR); ++out_si: ++ if (!reenter) ++ si_read_unlock(sb); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size) ++{ ++ struct au_lgxattr arg = { ++ .type = AU_XATTR_LIST, ++ .u.list = { ++ .list = list, ++ .size = size ++ }, ++ }; ++ ++ return au_lgxattr(dentry, &arg); ++} ++ ++static ssize_t au_getxattr(struct dentry *dentry, ++ struct inode *inode __maybe_unused, ++ const char *name, void *value, size_t size) ++{ ++ struct au_lgxattr arg = { ++ .type = AU_XATTR_GET, ++ .u.get = { ++ .name = name, ++ .value = value, ++ .size = size ++ }, ++ }; ++ ++ return au_lgxattr(dentry, &arg); ++} ++ ++static int au_setxattr(struct dentry *dentry, struct inode *inode, ++ const char *name, const void *value, size_t size, ++ int flags) ++{ ++ struct au_sxattr arg = { ++ .type = AU_XATTR_SET, ++ .u.set = { ++ .name = name, ++ .value = value, ++ .size = size, ++ .flags = flags ++ }, ++ }; ++ ++ return au_sxattr(dentry, inode, &arg); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_xattr_get(const struct xattr_handler *handler, ++ struct dentry *dentry, struct inode *inode, ++ const char *name, void *buffer, size_t size) ++{ ++ return au_getxattr(dentry, inode, name, buffer, size); ++} ++ ++static int au_xattr_set(const struct xattr_handler *handler, ++ struct dentry *dentry, struct inode *inode, ++ const char *name, const void *value, size_t size, ++ int flags) ++{ ++ return au_setxattr(dentry, inode, name, value, size, flags); ++} ++ ++static const struct xattr_handler au_xattr_handler = { ++ .name = "", ++ .prefix = "", ++ .get = au_xattr_get, ++ .set = au_xattr_set ++}; ++ ++static const struct xattr_handler *au_xattr_handlers[] = { ++#ifdef CONFIG_FS_POSIX_ACL ++ &posix_acl_access_xattr_handler, ++ &posix_acl_default_xattr_handler, ++#endif ++ &au_xattr_handler, /* must be last */ ++ NULL ++}; ++ ++void au_xattr_init(struct super_block *sb) ++{ ++ sb->s_xattr = au_xattr_handlers; ++} +diff --git a/fs/aufs/xino.c b/fs/aufs/xino.c +new file mode 100644 +index 000000000000..6b097908ede9 +--- /dev/null ++++ b/fs/aufs/xino.c +@@ -0,0 +1,1877 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++/* ++ * external inode number translation table and bitmap ++ * ++ * things to consider ++ * - the lifetime ++ * + au_xino object ++ * + XINO files (xino, xib, xigen) ++ * + dynamic debugfs entries (xiN) ++ * + static debugfs entries (xib, xigen) ++ * + static sysfs entry (xi_path) ++ * - several entry points to handle them. ++ * + mount(2) without xino option (default) ++ * + mount(2) with xino option ++ * + mount(2) with noxino option ++ * + umount(2) ++ * + remount with add/del branches ++ * + remount with xino/noxino options ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++static aufs_bindex_t sbr_find_shared(struct super_block *sb, aufs_bindex_t btop, ++ aufs_bindex_t bbot, ++ struct super_block *h_sb) ++{ ++ /* todo: try binary-search if the branches are many */ ++ for (; btop <= bbot; btop++) ++ if (h_sb == au_sbr_sb(sb, btop)) ++ return btop; ++ return -1; ++} ++ ++/* ++ * find another branch who is on the same filesystem of the specified ++ * branch{@btgt}. search until @bbot. ++ */ ++static aufs_bindex_t is_sb_shared(struct super_block *sb, aufs_bindex_t btgt, ++ aufs_bindex_t bbot) ++{ ++ aufs_bindex_t bindex; ++ struct super_block *tgt_sb; ++ ++ tgt_sb = au_sbr_sb(sb, btgt); ++ bindex = sbr_find_shared(sb, /*btop*/0, btgt - 1, tgt_sb); ++ if (bindex < 0) ++ bindex = sbr_find_shared(sb, btgt + 1, bbot, tgt_sb); ++ ++ return bindex; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * stop unnecessary notify events at creating xino files ++ */ ++ ++aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry) ++{ ++ aufs_bindex_t bfound, bindex, bbot; ++ struct dentry *parent; ++ struct au_branch *br; ++ ++ bfound = -1; ++ parent = dentry->d_parent; /* safe d_parent access */ ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_dentry(br) == parent) { ++ bfound = bindex; ++ break; ++ } ++ } ++ ++ AuDbg("bfound b%d\n", bfound); ++ return bfound; ++} ++ ++struct au_xino_lock_dir { ++ struct au_hinode *hdir; ++ struct dentry *parent; ++ struct inode *dir; ++}; ++ ++static struct dentry *au_dget_parent_lock(struct dentry *dentry, ++ unsigned int lsc) ++{ ++ struct dentry *parent; ++ struct inode *dir; ++ ++ parent = dget_parent(dentry); ++ dir = d_inode(parent); ++ inode_lock_nested(dir, lsc); ++#if 0 /* it should not happen */ ++ spin_lock(&dentry->d_lock); ++ if (unlikely(dentry->d_parent != parent)) { ++ spin_unlock(&dentry->d_lock); ++ inode_unlock(dir); ++ dput(parent); ++ parent = NULL; ++ goto out; ++ } ++ spin_unlock(&dentry->d_lock); ++ ++out: ++#endif ++ return parent; ++} ++ ++static void au_xino_lock_dir(struct super_block *sb, struct path *xipath, ++ struct au_xino_lock_dir *ldir) ++{ ++ aufs_bindex_t bindex; ++ ++ ldir->hdir = NULL; ++ bindex = au_xi_root(sb, xipath->dentry); ++ if (bindex >= 0) { ++ /* rw branch root */ ++ ldir->hdir = au_hi(d_inode(sb->s_root), bindex); ++ au_hn_inode_lock_nested(ldir->hdir, AuLsc_I_PARENT); ++ } else { ++ /* other */ ++ ldir->parent = au_dget_parent_lock(xipath->dentry, ++ AuLsc_I_PARENT); ++ ldir->dir = d_inode(ldir->parent); ++ } ++} ++ ++static void au_xino_unlock_dir(struct au_xino_lock_dir *ldir) ++{ ++ if (ldir->hdir) ++ au_hn_inode_unlock(ldir->hdir); ++ else { ++ inode_unlock(ldir->dir); ++ dput(ldir->parent); ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * create and set a new xino file ++ */ ++struct file *au_xino_create(struct super_block *sb, char *fpath, int silent) ++{ ++ struct file *file; ++ struct dentry *h_parent, *d; ++ struct inode *h_dir, *inode; ++ int err; ++ ++ /* ++ * at mount-time, and the xino file is the default path, ++ * hnotify is disabled so we have no notify events to ignore. ++ * when a user specified the xino, we cannot get au_hdir to be ignored. ++ */ ++ file = vfsub_filp_open(fpath, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE ++ /* | __FMODE_NONOTIFY */, ++ 0666); ++ if (IS_ERR(file)) { ++ if (!silent) ++ pr_err("open %s(%ld)\n", fpath, PTR_ERR(file)); ++ return file; ++ } ++ ++ /* keep file count */ ++ err = 0; ++ d = file->f_path.dentry; ++ h_parent = au_dget_parent_lock(d, AuLsc_I_PARENT); ++ /* mnt_want_write() is unnecessary here */ ++ h_dir = d_inode(h_parent); ++ inode = file_inode(file); ++ /* no delegation since it is just created */ ++ if (inode->i_nlink) ++ err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, ++ /*force*/0); ++ inode_unlock(h_dir); ++ dput(h_parent); ++ if (unlikely(err)) { ++ if (!silent) ++ pr_err("unlink %s(%d)\n", fpath, err); ++ goto out; ++ } ++ ++ err = -EINVAL; ++ if (unlikely(sb == d->d_sb)) { ++ if (!silent) ++ pr_err("%s must be outside\n", fpath); ++ goto out; ++ } ++ if (unlikely(au_test_fs_bad_xino(d->d_sb))) { ++ if (!silent) ++ pr_err("xino doesn't support %s(%s)\n", ++ fpath, au_sbtype(d->d_sb)); ++ goto out; ++ } ++ return file; /* success */ ++ ++out: ++ fput(file); ++ file = ERR_PTR(err); ++ return file; ++} ++ ++/* ++ * create a new xinofile at the same place/path as @base. ++ */ ++struct file *au_xino_create2(struct super_block *sb, struct path *base, ++ struct file *copy_src) ++{ ++ struct file *file; ++ struct dentry *dentry, *parent; ++ struct inode *dir, *delegated; ++ struct qstr *name; ++ struct path path; ++ int err, do_unlock; ++ struct au_xino_lock_dir ldir; ++ ++ do_unlock = 1; ++ au_xino_lock_dir(sb, base, &ldir); ++ dentry = base->dentry; ++ parent = dentry->d_parent; /* dir inode is locked */ ++ dir = d_inode(parent); ++ IMustLock(dir); ++ ++ name = &dentry->d_name; ++ path.dentry = vfsub_lookup_one_len(name->name, parent, name->len); ++ if (IS_ERR(path.dentry)) { ++ file = (void *)path.dentry; ++ pr_err("%pd lookup err %ld\n", dentry, PTR_ERR(path.dentry)); ++ goto out; ++ } ++ ++ /* no need to mnt_want_write() since we call dentry_open() later */ ++ err = vfs_create(dir, path.dentry, 0666, NULL); ++ if (unlikely(err)) { ++ file = ERR_PTR(err); ++ pr_err("%pd create err %d\n", dentry, err); ++ goto out_dput; ++ } ++ ++ path.mnt = base->mnt; ++ file = vfsub_dentry_open(&path, ++ O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE ++ /* | __FMODE_NONOTIFY */); ++ if (IS_ERR(file)) { ++ pr_err("%pd open err %ld\n", dentry, PTR_ERR(file)); ++ goto out_dput; ++ } ++ ++ delegated = NULL; ++ err = vfsub_unlink(dir, &file->f_path, &delegated, /*force*/0); ++ au_xino_unlock_dir(&ldir); ++ do_unlock = 0; ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ if (unlikely(err)) { ++ pr_err("%pd unlink err %d\n", dentry, err); ++ goto out_fput; ++ } ++ ++ if (copy_src) { ++ /* no one can touch copy_src xino */ ++ err = au_copy_file(file, copy_src, vfsub_f_size_read(copy_src)); ++ if (unlikely(err)) { ++ pr_err("%pd copy err %d\n", dentry, err); ++ goto out_fput; ++ } ++ } ++ goto out_dput; /* success */ ++ ++out_fput: ++ fput(file); ++ file = ERR_PTR(err); ++out_dput: ++ dput(path.dentry); ++out: ++ if (do_unlock) ++ au_xino_unlock_dir(&ldir); ++ return file; ++} ++ ++struct file *au_xino_file1(struct au_xino *xi) ++{ ++ struct file *file; ++ unsigned int u, nfile; ++ ++ file = NULL; ++ nfile = xi->xi_nfile; ++ for (u = 0; u < nfile; u++) { ++ file = xi->xi_file[u]; ++ if (file) ++ break; ++ } ++ ++ return file; ++} ++ ++static int au_xino_file_set(struct au_xino *xi, int idx, struct file *file) ++{ ++ int err; ++ struct file *f; ++ void *p; ++ ++ if (file) ++ get_file(file); ++ ++ err = 0; ++ f = NULL; ++ if (idx < xi->xi_nfile) { ++ f = xi->xi_file[idx]; ++ if (f) ++ fput(f); ++ } else { ++ p = au_kzrealloc(xi->xi_file, ++ sizeof(*xi->xi_file) * xi->xi_nfile, ++ sizeof(*xi->xi_file) * (idx + 1), ++ GFP_NOFS, /*may_shrink*/0); ++ if (p) { ++ MtxMustLock(&xi->xi_mtx); ++ xi->xi_file = p; ++ xi->xi_nfile = idx + 1; ++ } else { ++ err = -ENOMEM; ++ if (file) ++ fput(file); ++ goto out; ++ } ++ } ++ xi->xi_file[idx] = file; ++ ++out: ++ return err; ++} ++ ++/* ++ * if @xinew->xi is not set, then create new xigen file. ++ */ ++struct file *au_xi_new(struct super_block *sb, struct au_xi_new *xinew) ++{ ++ struct file *file; ++ int err; ++ ++ SiMustAnyLock(sb); ++ ++ file = au_xino_create2(sb, xinew->base, xinew->copy_src); ++ if (IS_ERR(file)) { ++ err = PTR_ERR(file); ++ pr_err("%s[%d], err %d\n", ++ xinew->xi ? "xino" : "xigen", ++ xinew->idx, err); ++ goto out; ++ } ++ ++ if (xinew->xi) ++ err = au_xino_file_set(xinew->xi, xinew->idx, file); ++ else { ++ BUG(); ++ /* todo: make xigen file an array */ ++ /* err = au_xigen_file_set(sb, xinew->idx, file); */ ++ } ++ fput(file); ++ if (unlikely(err)) ++ file = ERR_PTR(err); ++ ++out: ++ return file; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * truncate xino files ++ */ ++static int au_xino_do_trunc(struct super_block *sb, aufs_bindex_t bindex, ++ int idx, struct kstatfs *st) ++{ ++ int err; ++ blkcnt_t blocks; ++ struct file *file, *new_xino; ++ struct au_xi_new xinew = { ++ .idx = idx ++ }; ++ ++ err = 0; ++ xinew.xi = au_sbr(sb, bindex)->br_xino; ++ file = au_xino_file(xinew.xi, idx); ++ if (!file) ++ goto out; ++ ++ xinew.base = &file->f_path; ++ err = vfs_statfs(xinew.base, st); ++ if (unlikely(err)) { ++ AuErr1("statfs err %d, ignored\n", err); ++ err = 0; ++ goto out; ++ } ++ ++ blocks = file_inode(file)->i_blocks; ++ pr_info("begin truncating xino(b%d-%d), ib%llu, %llu/%llu free blks\n", ++ bindex, idx, (u64)blocks, st->f_bfree, st->f_blocks); ++ ++ xinew.copy_src = file; ++ new_xino = au_xi_new(sb, &xinew); ++ if (IS_ERR(new_xino)) { ++ err = PTR_ERR(new_xino); ++ pr_err("xino(b%d-%d), err %d, ignored\n", bindex, idx, err); ++ goto out; ++ } ++ ++ err = vfs_statfs(&new_xino->f_path, st); ++ if (!err) ++ pr_info("end truncating xino(b%d-%d), ib%llu, %llu/%llu free blks\n", ++ bindex, idx, (u64)file_inode(new_xino)->i_blocks, ++ st->f_bfree, st->f_blocks); ++ else { ++ AuErr1("statfs err %d, ignored\n", err); ++ err = 0; ++ } ++ ++out: ++ return err; ++} ++ ++int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin) ++{ ++ int err, i; ++ unsigned long jiffy; ++ aufs_bindex_t bbot; ++ struct kstatfs *st; ++ struct au_branch *br; ++ struct au_xino *xi; ++ ++ err = -ENOMEM; ++ st = kmalloc(sizeof(*st), GFP_NOFS); ++ if (unlikely(!st)) ++ goto out; ++ ++ err = -EINVAL; ++ bbot = au_sbbot(sb); ++ if (unlikely(bindex < 0 || bbot < bindex)) ++ goto out_st; ++ ++ err = 0; ++ jiffy = jiffies; ++ br = au_sbr(sb, bindex); ++ xi = br->br_xino; ++ for (i = idx_begin; !err && i < xi->xi_nfile; i++) ++ err = au_xino_do_trunc(sb, bindex, i, st); ++ if (!err) ++ au_sbi(sb)->si_xino_jiffy = jiffy; ++ ++out_st: ++ kfree(st); ++out: ++ return err; ++} ++ ++struct xino_do_trunc_args { ++ struct super_block *sb; ++ struct au_branch *br; ++ int idx; ++}; ++ ++static void xino_do_trunc(void *_args) ++{ ++ struct xino_do_trunc_args *args = _args; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct inode *dir; ++ int err, idx; ++ aufs_bindex_t bindex; ++ ++ err = 0; ++ sb = args->sb; ++ dir = d_inode(sb->s_root); ++ br = args->br; ++ idx = args->idx; ++ ++ si_noflush_write_lock(sb); ++ ii_read_lock_parent(dir); ++ bindex = au_br_index(sb, br->br_id); ++ err = au_xino_trunc(sb, bindex, idx); ++ ii_read_unlock(dir); ++ if (unlikely(err)) ++ pr_warn("err b%d, (%d)\n", bindex, err); ++ atomic_dec(&br->br_xino->xi_truncating); ++ au_lcnt_dec(&br->br_count); ++ si_write_unlock(sb); ++ au_nwt_done(&au_sbi(sb)->si_nowait); ++ kfree(args); ++} ++ ++/* ++ * returns the index in the xi_file array whose corresponding file is necessary ++ * to truncate, or -1 which means no need to truncate. ++ */ ++static int xino_trunc_test(struct super_block *sb, struct au_branch *br) ++{ ++ int err; ++ unsigned int u; ++ struct kstatfs st; ++ struct au_sbinfo *sbinfo; ++ struct au_xino *xi; ++ struct file *file; ++ ++ /* todo: si_xino_expire and the ratio should be customizable */ ++ sbinfo = au_sbi(sb); ++ if (time_before(jiffies, ++ sbinfo->si_xino_jiffy + sbinfo->si_xino_expire)) ++ return -1; ++ ++ /* truncation border */ ++ xi = br->br_xino; ++ for (u = 0; u < xi->xi_nfile; u++) { ++ file = au_xino_file(xi, u); ++ if (!file) ++ continue; ++ ++ err = vfs_statfs(&file->f_path, &st); ++ if (unlikely(err)) { ++ AuErr1("statfs err %d, ignored\n", err); ++ return -1; ++ } ++ if (div64_u64(st.f_bfree * 100, st.f_blocks) ++ >= AUFS_XINO_DEF_TRUNC) ++ return u; ++ } ++ ++ return -1; ++} ++ ++static void xino_try_trunc(struct super_block *sb, struct au_branch *br) ++{ ++ int idx; ++ struct xino_do_trunc_args *args; ++ int wkq_err; ++ ++ idx = xino_trunc_test(sb, br); ++ if (idx < 0) ++ return; ++ ++ if (atomic_inc_return(&br->br_xino->xi_truncating) > 1) ++ goto out; ++ ++ /* lock and kfree() will be called in trunc_xino() */ ++ args = kmalloc(sizeof(*args), GFP_NOFS); ++ if (unlikely(!args)) { ++ AuErr1("no memory\n"); ++ goto out; ++ } ++ ++ au_lcnt_inc(&br->br_count); ++ args->sb = sb; ++ args->br = br; ++ args->idx = idx; ++ wkq_err = au_wkq_nowait(xino_do_trunc, args, sb, /*flags*/0); ++ if (!wkq_err) ++ return; /* success */ ++ ++ pr_err("wkq %d\n", wkq_err); ++ au_lcnt_dec(&br->br_count); ++ kfree(args); ++ ++out: ++ atomic_dec(&br->br_xino->xi_truncating); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_xi_calc { ++ int idx; ++ loff_t pos; ++}; ++ ++static void au_xi_calc(struct super_block *sb, ino_t h_ino, ++ struct au_xi_calc *calc) ++{ ++ loff_t maxent; ++ ++ maxent = au_xi_maxent(sb); ++ calc->idx = div64_u64_rem(h_ino, maxent, &calc->pos); ++ calc->pos *= sizeof(ino_t); ++} ++ ++static int au_xino_do_new_async(struct super_block *sb, struct au_branch *br, ++ struct au_xi_calc *calc) ++{ ++ int err; ++ struct file *file; ++ struct au_xino *xi = br->br_xino; ++ struct au_xi_new xinew = { ++ .xi = xi ++ }; ++ ++ SiMustAnyLock(sb); ++ ++ err = 0; ++ if (!xi) ++ goto out; ++ ++ mutex_lock(&xi->xi_mtx); ++ file = au_xino_file(xi, calc->idx); ++ if (file) ++ goto out_mtx; ++ ++ file = au_xino_file(xi, /*idx*/-1); ++ AuDebugOn(!file); ++ xinew.idx = calc->idx; ++ xinew.base = &file->f_path; ++ /* xinew.copy_src = NULL; */ ++ file = au_xi_new(sb, &xinew); ++ if (IS_ERR(file)) ++ err = PTR_ERR(file); ++ ++out_mtx: ++ mutex_unlock(&xi->xi_mtx); ++out: ++ return err; ++} ++ ++struct au_xino_do_new_async_args { ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_xi_calc calc; ++ ino_t ino; ++}; ++ ++static int au_xino_do_write(vfs_writef_t write, struct file *file, ++ struct au_xi_calc *calc, ino_t ino); ++ ++static void au_xino_call_do_new_async(void *args) ++{ ++ struct au_xino_do_new_async_args *a = args; ++ struct au_branch *br; ++ struct super_block *sb; ++ struct au_sbinfo *sbi; ++ struct inode *root; ++ struct file *file; ++ int err; ++ ++ br = a->br; ++ sb = a->sb; ++ sbi = au_sbi(sb); ++ si_noflush_read_lock(sb); ++ root = d_inode(sb->s_root); ++ ii_read_lock_child(root); ++ err = au_xino_do_new_async(sb, br, &a->calc); ++ if (!err) { ++ file = au_xino_file(br->br_xino, a->calc.idx); ++ if (file) ++ err = au_xino_do_write(sbi->si_xwrite, file, &a->calc, ++ a->ino); ++ if (unlikely(err)) ++ AuIOErr("err %d\n", err); ++ } else ++ AuIOErr("err %d\n", err); ++ au_lcnt_dec(&br->br_count); ++ ii_read_unlock(root); ++ si_read_unlock(sb); ++ au_nwt_done(&sbi->si_nowait); ++ kfree(args); ++} ++ ++/* ++ * create a new xino file asynchronously ++ */ ++static int au_xino_new_async(struct super_block *sb, struct au_branch *br, ++ struct au_xi_calc *calc, ino_t ino) ++{ ++ int err; ++ struct au_xino_do_new_async_args *arg; ++ ++ err = -ENOMEM; ++ arg = kmalloc(sizeof(*arg), GFP_NOFS); ++ if (unlikely(!arg)) ++ goto out; ++ ++ arg->sb = sb; ++ arg->br = br; ++ arg->calc = *calc; ++ arg->ino = ino; ++ au_lcnt_inc(&br->br_count); ++ err = au_wkq_nowait(au_xino_call_do_new_async, arg, sb, AuWkq_NEST); ++ if (unlikely(err)) { ++ pr_err("wkq %d\n", err); ++ au_lcnt_dec(&br->br_count); ++ kfree(arg); ++ } ++ ++out: ++ return err; ++} ++ ++/* ++ * read @ino from xinofile for the specified branch{@sb, @bindex} ++ * at the position of @h_ino. ++ */ ++int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ ino_t *ino) ++{ ++ int err; ++ ssize_t sz; ++ struct au_xi_calc calc; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ ++ *ino = 0; ++ if (!au_opt_test(au_mntflags(sb), XINO)) ++ return 0; /* no xino */ ++ ++ err = 0; ++ au_xi_calc(sb, h_ino, &calc); ++ file = au_xino_file(au_sbr(sb, bindex)->br_xino, calc.idx); ++ if (!file ++ || vfsub_f_size_read(file) < calc.pos + sizeof(*ino)) ++ return 0; /* no ino */ ++ ++ sbinfo = au_sbi(sb); ++ sz = xino_fread(sbinfo->si_xread, file, ino, sizeof(*ino), &calc.pos); ++ if (sz == sizeof(*ino)) ++ return 0; /* success */ ++ ++ err = sz; ++ if (unlikely(sz >= 0)) { ++ err = -EIO; ++ AuIOErr("xino read error (%zd)\n", sz); ++ } ++ return err; ++} ++ ++static int au_xino_do_write(vfs_writef_t write, struct file *file, ++ struct au_xi_calc *calc, ino_t ino) ++{ ++ ssize_t sz; ++ ++ sz = xino_fwrite(write, file, &ino, sizeof(ino), &calc->pos); ++ if (sz == sizeof(ino)) ++ return 0; /* success */ ++ ++ AuIOErr("write failed (%zd)\n", sz); ++ return -EIO; ++} ++ ++/* ++ * write @ino to the xinofile for the specified branch{@sb, @bindex} ++ * at the position of @h_ino. ++ * even if @ino is zero, it is written to the xinofile and means no entry. ++ * if the size of the xino file on a specific filesystem exceeds the watermark, ++ * try truncating it. ++ */ ++int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ ino_t ino) ++{ ++ int err; ++ unsigned int mnt_flags; ++ struct au_xi_calc calc; ++ struct file *file; ++ struct au_branch *br; ++ struct au_xino *xi; ++ ++ SiMustAnyLock(sb); ++ ++ mnt_flags = au_mntflags(sb); ++ if (!au_opt_test(mnt_flags, XINO)) ++ return 0; ++ ++ au_xi_calc(sb, h_ino, &calc); ++ br = au_sbr(sb, bindex); ++ xi = br->br_xino; ++ file = au_xino_file(xi, calc.idx); ++ if (!file) { ++ /* create and write a new xino file asynchronously */ ++ err = au_xino_new_async(sb, br, &calc, ino); ++ if (!err) ++ return 0; /* success */ ++ goto out; ++ } ++ ++ err = au_xino_do_write(au_sbi(sb)->si_xwrite, file, &calc, ino); ++ if (!err) { ++ br = au_sbr(sb, bindex); ++ if (au_opt_test(mnt_flags, TRUNC_XINO) ++ && au_test_fs_trunc_xino(au_br_sb(br))) ++ xino_try_trunc(sb, br); ++ return 0; /* success */ ++ } ++ ++out: ++ AuIOErr("write failed (%d)\n", err); ++ return -EIO; ++} ++ ++static ssize_t xino_fread_wkq(vfs_readf_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos); ++ ++/* todo: unnecessary to support mmap_sem since kernel-space? */ ++ssize_t xino_fread(vfs_readf_t func, struct file *file, void *kbuf, size_t size, ++ loff_t *pos) ++{ ++ ssize_t err; ++ mm_segment_t oldfs; ++ union { ++ void *k; ++ char __user *u; ++ } buf; ++ int i; ++ const int prevent_endless = 10; ++ ++ i = 0; ++ buf.k = kbuf; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ do { ++ err = func(file, buf.u, size, pos); ++ if (err == -EINTR ++ && !au_wkq_test() ++ && fatal_signal_pending(current)) { ++ set_fs(oldfs); ++ err = xino_fread_wkq(func, file, kbuf, size, pos); ++ BUG_ON(err == -EINTR); ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ } ++ } while (i++ < prevent_endless ++ && (err == -EAGAIN || err == -EINTR)); ++ set_fs(oldfs); ++ ++#if 0 /* reserved for future use */ ++ if (err > 0) ++ fsnotify_access(file->f_path.dentry); ++#endif ++ ++ return err; ++} ++ ++struct xino_fread_args { ++ ssize_t *errp; ++ vfs_readf_t func; ++ struct file *file; ++ void *buf; ++ size_t size; ++ loff_t *pos; ++}; ++ ++static void call_xino_fread(void *args) ++{ ++ struct xino_fread_args *a = args; ++ *a->errp = xino_fread(a->func, a->file, a->buf, a->size, a->pos); ++} ++ ++static ssize_t xino_fread_wkq(vfs_readf_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos) ++{ ++ ssize_t err; ++ int wkq_err; ++ struct xino_fread_args args = { ++ .errp = &err, ++ .func = func, ++ .file = file, ++ .buf = buf, ++ .size = size, ++ .pos = pos ++ }; ++ ++ wkq_err = au_wkq_wait(call_xino_fread, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ ++ return err; ++} ++ ++static ssize_t xino_fwrite_wkq(vfs_writef_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos); ++ ++static ssize_t do_xino_fwrite(vfs_writef_t func, struct file *file, void *kbuf, ++ size_t size, loff_t *pos) ++{ ++ ssize_t err; ++ mm_segment_t oldfs; ++ union { ++ void *k; ++ const char __user *u; ++ } buf; ++ int i; ++ const int prevent_endless = 10; ++ ++ i = 0; ++ buf.k = kbuf; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ do { ++ err = func(file, buf.u, size, pos); ++ if (err == -EINTR ++ && !au_wkq_test() ++ && fatal_signal_pending(current)) { ++ set_fs(oldfs); ++ err = xino_fwrite_wkq(func, file, kbuf, size, pos); ++ BUG_ON(err == -EINTR); ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ } ++ } while (i++ < prevent_endless ++ && (err == -EAGAIN || err == -EINTR)); ++ set_fs(oldfs); ++ ++#if 0 /* reserved for future use */ ++ if (err > 0) ++ fsnotify_modify(file->f_path.dentry); ++#endif ++ ++ return err; ++} ++ ++struct do_xino_fwrite_args { ++ ssize_t *errp; ++ vfs_writef_t func; ++ struct file *file; ++ void *buf; ++ size_t size; ++ loff_t *pos; ++}; ++ ++static void call_do_xino_fwrite(void *args) ++{ ++ struct do_xino_fwrite_args *a = args; ++ *a->errp = do_xino_fwrite(a->func, a->file, a->buf, a->size, a->pos); ++} ++ ++static ssize_t xino_fwrite_wkq(vfs_writef_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos) ++{ ++ ssize_t err; ++ int wkq_err; ++ struct do_xino_fwrite_args args = { ++ .errp = &err, ++ .func = func, ++ .file = file, ++ .buf = buf, ++ .size = size, ++ .pos = pos ++ }; ++ ++ /* ++ * it breaks RLIMIT_FSIZE and normal user's limit, ++ * users should care about quota and real 'filesystem full.' ++ */ ++ wkq_err = au_wkq_wait(call_do_xino_fwrite, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ ++ return err; ++} ++ ++ssize_t xino_fwrite(vfs_writef_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos) ++{ ++ ssize_t err; ++ ++ if (rlimit(RLIMIT_FSIZE) == RLIM_INFINITY) { ++ lockdep_off(); ++ err = do_xino_fwrite(func, file, buf, size, pos); ++ lockdep_on(); ++ } else { ++ lockdep_off(); ++ err = xino_fwrite_wkq(func, file, buf, size, pos); ++ lockdep_on(); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * inode number bitmap ++ */ ++static const int page_bits = (int)PAGE_SIZE * BITS_PER_BYTE; ++static ino_t xib_calc_ino(unsigned long pindex, int bit) ++{ ++ ino_t ino; ++ ++ AuDebugOn(bit < 0 || page_bits <= bit); ++ ino = AUFS_FIRST_INO + pindex * page_bits + bit; ++ return ino; ++} ++ ++static void xib_calc_bit(ino_t ino, unsigned long *pindex, int *bit) ++{ ++ AuDebugOn(ino < AUFS_FIRST_INO); ++ ino -= AUFS_FIRST_INO; ++ *pindex = ino / page_bits; ++ *bit = ino % page_bits; ++} ++ ++static int xib_pindex(struct super_block *sb, unsigned long pindex) ++{ ++ int err; ++ loff_t pos; ++ ssize_t sz; ++ struct au_sbinfo *sbinfo; ++ struct file *xib; ++ unsigned long *p; ++ ++ sbinfo = au_sbi(sb); ++ MtxMustLock(&sbinfo->si_xib_mtx); ++ AuDebugOn(pindex > ULONG_MAX / PAGE_SIZE ++ || !au_opt_test(sbinfo->si_mntflags, XINO)); ++ ++ if (pindex == sbinfo->si_xib_last_pindex) ++ return 0; ++ ++ xib = sbinfo->si_xib; ++ p = sbinfo->si_xib_buf; ++ pos = sbinfo->si_xib_last_pindex; ++ pos *= PAGE_SIZE; ++ sz = xino_fwrite(sbinfo->si_xwrite, xib, p, PAGE_SIZE, &pos); ++ if (unlikely(sz != PAGE_SIZE)) ++ goto out; ++ ++ pos = pindex; ++ pos *= PAGE_SIZE; ++ if (vfsub_f_size_read(xib) >= pos + PAGE_SIZE) ++ sz = xino_fread(sbinfo->si_xread, xib, p, PAGE_SIZE, &pos); ++ else { ++ memset(p, 0, PAGE_SIZE); ++ sz = xino_fwrite(sbinfo->si_xwrite, xib, p, PAGE_SIZE, &pos); ++ } ++ if (sz == PAGE_SIZE) { ++ sbinfo->si_xib_last_pindex = pindex; ++ return 0; /* success */ ++ } ++ ++out: ++ AuIOErr1("write failed (%zd)\n", sz); ++ err = sz; ++ if (sz >= 0) ++ err = -EIO; ++ return err; ++} ++ ++static void au_xib_clear_bit(struct inode *inode) ++{ ++ int err, bit; ++ unsigned long pindex; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ ++ AuDebugOn(inode->i_nlink); ++ ++ sb = inode->i_sb; ++ xib_calc_bit(inode->i_ino, &pindex, &bit); ++ AuDebugOn(page_bits <= bit); ++ sbinfo = au_sbi(sb); ++ mutex_lock(&sbinfo->si_xib_mtx); ++ err = xib_pindex(sb, pindex); ++ if (!err) { ++ clear_bit(bit, sbinfo->si_xib_buf); ++ sbinfo->si_xib_next_bit = bit; ++ } ++ mutex_unlock(&sbinfo->si_xib_mtx); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * truncate a xino bitmap file ++ */ ++ ++/* todo: slow */ ++static int do_xib_restore(struct super_block *sb, struct file *file, void *page) ++{ ++ int err, bit; ++ ssize_t sz; ++ unsigned long pindex; ++ loff_t pos, pend; ++ struct au_sbinfo *sbinfo; ++ vfs_readf_t func; ++ ino_t *ino; ++ unsigned long *p; ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ MtxMustLock(&sbinfo->si_xib_mtx); ++ p = sbinfo->si_xib_buf; ++ func = sbinfo->si_xread; ++ pend = vfsub_f_size_read(file); ++ pos = 0; ++ while (pos < pend) { ++ sz = xino_fread(func, file, page, PAGE_SIZE, &pos); ++ err = sz; ++ if (unlikely(sz <= 0)) ++ goto out; ++ ++ err = 0; ++ for (ino = page; sz > 0; ino++, sz -= sizeof(ino)) { ++ if (unlikely(*ino < AUFS_FIRST_INO)) ++ continue; ++ ++ xib_calc_bit(*ino, &pindex, &bit); ++ AuDebugOn(page_bits <= bit); ++ err = xib_pindex(sb, pindex); ++ if (!err) ++ set_bit(bit, p); ++ else ++ goto out; ++ } ++ } ++ ++out: ++ return err; ++} ++ ++static int xib_restore(struct super_block *sb) ++{ ++ int err, i; ++ unsigned int nfile; ++ aufs_bindex_t bindex, bbot; ++ void *page; ++ struct au_branch *br; ++ struct au_xino *xi; ++ struct file *file; ++ ++ err = -ENOMEM; ++ page = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!page)) ++ goto out; ++ ++ err = 0; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; !err && bindex <= bbot; bindex++) ++ if (!bindex || is_sb_shared(sb, bindex, bindex - 1) < 0) { ++ br = au_sbr(sb, bindex); ++ xi = br->br_xino; ++ nfile = xi->xi_nfile; ++ for (i = 0; i < nfile; i++) { ++ file = au_xino_file(xi, i); ++ if (file) ++ err = do_xib_restore(sb, file, page); ++ } ++ } else ++ AuDbg("skip shared b%d\n", bindex); ++ free_page((unsigned long)page); ++ ++out: ++ return err; ++} ++ ++int au_xib_trunc(struct super_block *sb) ++{ ++ int err; ++ ssize_t sz; ++ loff_t pos; ++ struct au_sbinfo *sbinfo; ++ unsigned long *p; ++ struct file *file; ++ ++ SiMustWriteLock(sb); ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ if (!au_opt_test(sbinfo->si_mntflags, XINO)) ++ goto out; ++ ++ file = sbinfo->si_xib; ++ if (vfsub_f_size_read(file) <= PAGE_SIZE) ++ goto out; ++ ++ file = au_xino_create2(sb, &sbinfo->si_xib->f_path, NULL); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ fput(sbinfo->si_xib); ++ sbinfo->si_xib = file; ++ ++ p = sbinfo->si_xib_buf; ++ memset(p, 0, PAGE_SIZE); ++ pos = 0; ++ sz = xino_fwrite(sbinfo->si_xwrite, sbinfo->si_xib, p, PAGE_SIZE, &pos); ++ if (unlikely(sz != PAGE_SIZE)) { ++ err = sz; ++ AuIOErr("err %d\n", err); ++ if (sz >= 0) ++ err = -EIO; ++ goto out; ++ } ++ ++ mutex_lock(&sbinfo->si_xib_mtx); ++ /* mnt_want_write() is unnecessary here */ ++ err = xib_restore(sb); ++ mutex_unlock(&sbinfo->si_xib_mtx); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_xino *au_xino_alloc(unsigned int nfile) ++{ ++ struct au_xino *xi; ++ ++ xi = kzalloc(sizeof(*xi), GFP_NOFS); ++ if (unlikely(!xi)) ++ goto out; ++ xi->xi_nfile = nfile; ++ xi->xi_file = kcalloc(nfile, sizeof(*xi->xi_file), GFP_NOFS); ++ if (unlikely(!xi->xi_file)) ++ goto out_free; ++ ++ xi->xi_nondir.total = 8; /* initial size */ ++ xi->xi_nondir.array = kcalloc(xi->xi_nondir.total, sizeof(ino_t), ++ GFP_NOFS); ++ if (unlikely(!xi->xi_nondir.array)) ++ goto out_file; ++ ++ spin_lock_init(&xi->xi_nondir.spin); ++ init_waitqueue_head(&xi->xi_nondir.wqh); ++ mutex_init(&xi->xi_mtx); ++ /* init_waitqueue_head(&xi->xi_wq); */ ++ /* atomic_set(&xi->xi_pending, 0); */ ++ atomic_set(&xi->xi_truncating, 0); ++ kref_init(&xi->xi_kref); ++ goto out; /* success */ ++ ++out_file: ++ kfree(xi->xi_file); ++out_free: ++ kfree(xi); ++ xi = NULL; ++out: ++ return xi; ++} ++ ++static int au_xino_init(struct au_branch *br, int idx, struct file *file) ++{ ++ int err; ++ struct au_xino *xi; ++ ++ err = 0; ++ xi = au_xino_alloc(idx + 1); ++ if (unlikely(!xi)) { ++ err = -ENOMEM; ++ goto out; ++ } ++ ++ if (file) ++ get_file(file); ++ xi->xi_file[idx] = file; ++ AuDebugOn(br->br_xino); ++ br->br_xino = xi; ++ ++out: ++ return err; ++} ++ ++static void au_xino_release(struct kref *kref) ++{ ++ struct au_xino *xi; ++ int i; ++ ++ xi = container_of(kref, struct au_xino, xi_kref); ++ for (i = 0; i < xi->xi_nfile; i++) ++ if (xi->xi_file[i]) ++ fput(xi->xi_file[i]); ++ for (i = xi->xi_nondir.total - 1; i >= 0; i--) ++ AuDebugOn(xi->xi_nondir.array[i]); ++ mutex_destroy(&xi->xi_mtx); ++ kfree(xi->xi_file); ++ kfree(xi->xi_nondir.array); ++ kfree(xi); ++} ++ ++int au_xino_put(struct au_branch *br) ++{ ++ int ret; ++ struct au_xino *xi; ++ ++ ret = 0; ++ xi = br->br_xino; ++ if (xi) { ++ br->br_xino = NULL; ++ ret = kref_put(&xi->xi_kref, au_xino_release); ++ } ++ ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * xino mount option handlers ++ */ ++ ++/* xino bitmap */ ++static void xino_clear_xib(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ /* unnecessary to clear sbinfo->si_xread and ->si_xwrite */ ++ if (sbinfo->si_xib) ++ fput(sbinfo->si_xib); ++ sbinfo->si_xib = NULL; ++ if (sbinfo->si_xib_buf) ++ free_page((unsigned long)sbinfo->si_xib_buf); ++ sbinfo->si_xib_buf = NULL; ++} ++ ++static int au_xino_set_xib(struct super_block *sb, struct path *path) ++{ ++ int err; ++ loff_t pos; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ struct super_block *xi_sb; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ file = au_xino_create2(sb, path, sbinfo->si_xib); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ if (sbinfo->si_xib) ++ fput(sbinfo->si_xib); ++ sbinfo->si_xib = file; ++ sbinfo->si_xread = vfs_readf(file); ++ sbinfo->si_xwrite = vfs_writef(file); ++ xi_sb = file_inode(file)->i_sb; ++ sbinfo->si_ximaxent = xi_sb->s_maxbytes; ++ if (unlikely(sbinfo->si_ximaxent < PAGE_SIZE)) { ++ err = -EIO; ++ pr_err("s_maxbytes(%llu) on %s is too small\n", ++ (u64)sbinfo->si_ximaxent, au_sbtype(xi_sb)); ++ goto out_unset; ++ } ++ sbinfo->si_ximaxent /= sizeof(ino_t); ++ ++ err = -ENOMEM; ++ if (!sbinfo->si_xib_buf) ++ sbinfo->si_xib_buf = (void *)get_zeroed_page(GFP_NOFS); ++ if (unlikely(!sbinfo->si_xib_buf)) ++ goto out_unset; ++ ++ sbinfo->si_xib_last_pindex = 0; ++ sbinfo->si_xib_next_bit = 0; ++ if (vfsub_f_size_read(file) < PAGE_SIZE) { ++ pos = 0; ++ err = xino_fwrite(sbinfo->si_xwrite, file, sbinfo->si_xib_buf, ++ PAGE_SIZE, &pos); ++ if (unlikely(err != PAGE_SIZE)) ++ goto out_free; ++ } ++ err = 0; ++ goto out; /* success */ ++ ++out_free: ++ if (sbinfo->si_xib_buf) ++ free_page((unsigned long)sbinfo->si_xib_buf); ++ sbinfo->si_xib_buf = NULL; ++ if (err >= 0) ++ err = -EIO; ++out_unset: ++ fput(sbinfo->si_xib); ++ sbinfo->si_xib = NULL; ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* xino for each branch */ ++static void xino_clear_br(struct super_block *sb) ++{ ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ AuDebugOn(!br); ++ au_xino_put(br); ++ } ++} ++ ++static void au_xino_set_br_shared(struct super_block *sb, struct au_branch *br, ++ aufs_bindex_t bshared) ++{ ++ struct au_branch *brshared; ++ ++ brshared = au_sbr(sb, bshared); ++ AuDebugOn(!brshared->br_xino); ++ AuDebugOn(!brshared->br_xino->xi_file); ++ if (br->br_xino != brshared->br_xino) { ++ au_xino_get(brshared); ++ au_xino_put(br); ++ br->br_xino = brshared->br_xino; ++ } ++} ++ ++struct au_xino_do_set_br { ++ vfs_writef_t writef; ++ struct au_branch *br; ++ ino_t h_ino; ++ aufs_bindex_t bshared; ++}; ++ ++static int au_xino_do_set_br(struct super_block *sb, struct path *path, ++ struct au_xino_do_set_br *args) ++{ ++ int err; ++ struct au_xi_calc calc; ++ struct file *file; ++ struct au_branch *br; ++ struct au_xi_new xinew = { ++ .base = path ++ }; ++ ++ br = args->br; ++ xinew.xi = br->br_xino; ++ au_xi_calc(sb, args->h_ino, &calc); ++ xinew.copy_src = au_xino_file(xinew.xi, calc.idx); ++ if (args->bshared >= 0) ++ /* shared xino */ ++ au_xino_set_br_shared(sb, br, args->bshared); ++ else if (!xinew.xi) { ++ /* new xino */ ++ err = au_xino_init(br, calc.idx, xinew.copy_src); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ /* force re-creating */ ++ xinew.xi = br->br_xino; ++ xinew.idx = calc.idx; ++ mutex_lock(&xinew.xi->xi_mtx); ++ file = au_xi_new(sb, &xinew); ++ mutex_unlock(&xinew.xi->xi_mtx); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ AuDebugOn(!file); ++ ++ err = au_xino_do_write(args->writef, file, &calc, AUFS_ROOT_INO); ++ if (unlikely(err)) ++ au_xino_put(br); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_xino_set_br(struct super_block *sb, struct path *path) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct au_xino_do_set_br args; ++ struct inode *inode; ++ ++ SiMustWriteLock(sb); ++ ++ bbot = au_sbbot(sb); ++ inode = d_inode(sb->s_root); ++ args.writef = au_sbi(sb)->si_xwrite; ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ args.h_ino = au_h_iptr(inode, bindex)->i_ino; ++ args.br = au_sbr(sb, bindex); ++ args.bshared = is_sb_shared(sb, bindex, bindex - 1); ++ err = au_xino_do_set_br(sb, path, &args); ++ if (unlikely(err)) ++ break; ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_xino_clr(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ au_xigen_clr(sb); ++ xino_clear_xib(sb); ++ xino_clear_br(sb); ++ dbgaufs_brs_del(sb, 0); ++ sbinfo = au_sbi(sb); ++ /* lvalue, do not call au_mntflags() */ ++ au_opt_clr(sbinfo->si_mntflags, XINO); ++} ++ ++int au_xino_set(struct super_block *sb, struct au_opt_xino *xiopt, int remount) ++{ ++ int err, skip; ++ struct dentry *dentry, *parent, *cur_dentry, *cur_parent; ++ struct qstr *dname, *cur_name; ++ struct file *cur_xino; ++ struct au_sbinfo *sbinfo; ++ struct path *path, *cur_path; ++ ++ SiMustWriteLock(sb); ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ path = &xiopt->file->f_path; ++ dentry = path->dentry; ++ parent = dget_parent(dentry); ++ if (remount) { ++ skip = 0; ++ cur_xino = sbinfo->si_xib; ++ if (cur_xino) { ++ cur_path = &cur_xino->f_path; ++ cur_dentry = cur_path->dentry; ++ cur_parent = dget_parent(cur_dentry); ++ cur_name = &cur_dentry->d_name; ++ dname = &dentry->d_name; ++ skip = (cur_parent == parent ++ && au_qstreq(dname, cur_name)); ++ dput(cur_parent); ++ } ++ if (skip) ++ goto out; ++ } ++ ++ au_opt_set(sbinfo->si_mntflags, XINO); ++ err = au_xino_set_xib(sb, path); ++ /* si_x{read,write} are set */ ++ if (!err) ++ err = au_xigen_set(sb, path); ++ if (!err) ++ err = au_xino_set_br(sb, path); ++ if (!err) { ++ dbgaufs_brs_add(sb, 0, /*topdown*/1); ++ goto out; /* success */ ++ } ++ ++ /* reset all */ ++ AuIOErr("failed setting xino(%d).\n", err); ++ au_xino_clr(sb); ++ ++out: ++ dput(parent); ++ return err; ++} ++ ++/* ++ * create a xinofile at the default place/path. ++ */ ++struct file *au_xino_def(struct super_block *sb) ++{ ++ struct file *file; ++ char *page, *p; ++ struct au_branch *br; ++ struct super_block *h_sb; ++ struct path path; ++ aufs_bindex_t bbot, bindex, bwr; ++ ++ br = NULL; ++ bbot = au_sbbot(sb); ++ bwr = -1; ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_writable(br->br_perm) ++ && !au_test_fs_bad_xino(au_br_sb(br))) { ++ bwr = bindex; ++ break; ++ } ++ } ++ ++ if (bwr >= 0) { ++ file = ERR_PTR(-ENOMEM); ++ page = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!page)) ++ goto out; ++ path.mnt = au_br_mnt(br); ++ path.dentry = au_h_dptr(sb->s_root, bwr); ++ p = d_path(&path, page, PATH_MAX - sizeof(AUFS_XINO_FNAME)); ++ file = (void *)p; ++ if (!IS_ERR(p)) { ++ strcat(p, "/" AUFS_XINO_FNAME); ++ AuDbg("%s\n", p); ++ file = au_xino_create(sb, p, /*silent*/0); ++ } ++ free_page((unsigned long)page); ++ } else { ++ file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0); ++ if (IS_ERR(file)) ++ goto out; ++ h_sb = file->f_path.dentry->d_sb; ++ if (unlikely(au_test_fs_bad_xino(h_sb))) { ++ pr_err("xino doesn't support %s(%s)\n", ++ AUFS_XINO_DEFPATH, au_sbtype(h_sb)); ++ fput(file); ++ file = ERR_PTR(-EINVAL); ++ } ++ } ++ ++out: ++ return file; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * initialize the xinofile for the specified branch @br ++ * at the place/path where @base_file indicates. ++ * test whether another branch is on the same filesystem or not, ++ * if found then share the xinofile with another branch. ++ */ ++int au_xino_init_br(struct super_block *sb, struct au_branch *br, ino_t h_ino, ++ struct path *base) ++{ ++ int err; ++ struct au_xino_do_set_br args = { ++ .h_ino = h_ino, ++ .br = br ++ }; ++ ++ args.writef = au_sbi(sb)->si_xwrite; ++ args.bshared = sbr_find_shared(sb, /*btop*/0, au_sbbot(sb), ++ au_br_sb(br)); ++ err = au_xino_do_set_br(sb, base, &args); ++ if (unlikely(err)) ++ au_xino_put(br); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * get an unused inode number from bitmap ++ */ ++ino_t au_xino_new_ino(struct super_block *sb) ++{ ++ ino_t ino; ++ unsigned long *p, pindex, ul, pend; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ int free_bit, err; ++ ++ if (!au_opt_test(au_mntflags(sb), XINO)) ++ return iunique(sb, AUFS_FIRST_INO); ++ ++ sbinfo = au_sbi(sb); ++ mutex_lock(&sbinfo->si_xib_mtx); ++ p = sbinfo->si_xib_buf; ++ free_bit = sbinfo->si_xib_next_bit; ++ if (free_bit < page_bits && !test_bit(free_bit, p)) ++ goto out; /* success */ ++ free_bit = find_first_zero_bit(p, page_bits); ++ if (free_bit < page_bits) ++ goto out; /* success */ ++ ++ pindex = sbinfo->si_xib_last_pindex; ++ for (ul = pindex - 1; ul < ULONG_MAX; ul--) { ++ err = xib_pindex(sb, ul); ++ if (unlikely(err)) ++ goto out_err; ++ free_bit = find_first_zero_bit(p, page_bits); ++ if (free_bit < page_bits) ++ goto out; /* success */ ++ } ++ ++ file = sbinfo->si_xib; ++ pend = vfsub_f_size_read(file) / PAGE_SIZE; ++ for (ul = pindex + 1; ul <= pend; ul++) { ++ err = xib_pindex(sb, ul); ++ if (unlikely(err)) ++ goto out_err; ++ free_bit = find_first_zero_bit(p, page_bits); ++ if (free_bit < page_bits) ++ goto out; /* success */ ++ } ++ BUG(); ++ ++out: ++ set_bit(free_bit, p); ++ sbinfo->si_xib_next_bit = free_bit + 1; ++ pindex = sbinfo->si_xib_last_pindex; ++ mutex_unlock(&sbinfo->si_xib_mtx); ++ ino = xib_calc_ino(pindex, free_bit); ++ AuDbg("i%lu\n", (unsigned long)ino); ++ return ino; ++out_err: ++ mutex_unlock(&sbinfo->si_xib_mtx); ++ AuDbg("i0\n"); ++ return 0; ++} ++ ++/* for s_op->delete_inode() */ ++void au_xino_delete_inode(struct inode *inode, const int unlinked) ++{ ++ int err; ++ unsigned int mnt_flags; ++ aufs_bindex_t bindex, bbot, bi; ++ unsigned char try_trunc; ++ struct au_iinfo *iinfo; ++ struct super_block *sb; ++ struct au_hinode *hi; ++ struct inode *h_inode; ++ struct au_branch *br; ++ vfs_writef_t xwrite; ++ struct au_xi_calc calc; ++ struct file *file; ++ ++ AuDebugOn(au_is_bad_inode(inode)); ++ ++ sb = inode->i_sb; ++ mnt_flags = au_mntflags(sb); ++ if (!au_opt_test(mnt_flags, XINO) ++ || inode->i_ino == AUFS_ROOT_INO) ++ return; ++ ++ if (unlinked) { ++ au_xigen_inc(inode); ++ au_xib_clear_bit(inode); ++ } ++ ++ iinfo = au_ii(inode); ++ bindex = iinfo->ii_btop; ++ if (bindex < 0) ++ return; ++ ++ xwrite = au_sbi(sb)->si_xwrite; ++ try_trunc = !!au_opt_test(mnt_flags, TRUNC_XINO); ++ hi = au_hinode(iinfo, bindex); ++ bbot = iinfo->ii_bbot; ++ for (; bindex <= bbot; bindex++, hi++) { ++ h_inode = hi->hi_inode; ++ if (!h_inode ++ || (!unlinked && h_inode->i_nlink)) ++ continue; ++ ++ /* inode may not be revalidated */ ++ bi = au_br_index(sb, hi->hi_id); ++ if (bi < 0) ++ continue; ++ ++ br = au_sbr(sb, bi); ++ au_xi_calc(sb, h_inode->i_ino, &calc); ++ file = au_xino_file(br->br_xino, calc.idx); ++ if (IS_ERR_OR_NULL(file)) ++ continue; ++ ++ err = au_xino_do_write(xwrite, file, &calc, /*ino*/0); ++ if (!err && try_trunc ++ && au_test_fs_trunc_xino(au_br_sb(br))) ++ xino_try_trunc(sb, br); ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_xinondir_find(struct au_xino *xi, ino_t h_ino) ++{ ++ int found, total, i; ++ ++ found = -1; ++ total = xi->xi_nondir.total; ++ for (i = 0; i < total; i++) { ++ if (xi->xi_nondir.array[i] != h_ino) ++ continue; ++ found = i; ++ break; ++ } ++ ++ return found; ++} ++ ++static int au_xinondir_expand(struct au_xino *xi) ++{ ++ int err, sz; ++ ino_t *p; ++ ++ BUILD_BUG_ON(KMALLOC_MAX_SIZE > INT_MAX); ++ ++ err = -ENOMEM; ++ sz = xi->xi_nondir.total * sizeof(ino_t); ++ if (unlikely(sz > KMALLOC_MAX_SIZE / 2)) ++ goto out; ++ p = au_kzrealloc(xi->xi_nondir.array, sz, sz << 1, GFP_ATOMIC, ++ /*may_shrink*/0); ++ if (p) { ++ xi->xi_nondir.array = p; ++ xi->xi_nondir.total <<= 1; ++ AuDbg("xi_nondir.total %d\n", xi->xi_nondir.total); ++ err = 0; ++ } ++ ++out: ++ return err; ++} ++ ++void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, ++ ino_t h_ino, int idx) ++{ ++ struct au_xino *xi; ++ ++ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); ++ xi = au_sbr(sb, bindex)->br_xino; ++ AuDebugOn(idx < 0 || xi->xi_nondir.total <= idx); ++ ++ spin_lock(&xi->xi_nondir.spin); ++ AuDebugOn(xi->xi_nondir.array[idx] != h_ino); ++ xi->xi_nondir.array[idx] = 0; ++ spin_unlock(&xi->xi_nondir.spin); ++ wake_up_all(&xi->xi_nondir.wqh); ++} ++ ++int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ int *idx) ++{ ++ int err, found, empty; ++ struct au_xino *xi; ++ ++ err = 0; ++ *idx = -1; ++ if (!au_opt_test(au_mntflags(sb), XINO)) ++ goto out; /* no xino */ ++ ++ xi = au_sbr(sb, bindex)->br_xino; ++ ++again: ++ spin_lock(&xi->xi_nondir.spin); ++ found = au_xinondir_find(xi, h_ino); ++ if (found == -1) { ++ empty = au_xinondir_find(xi, /*h_ino*/0); ++ if (empty == -1) { ++ empty = xi->xi_nondir.total; ++ err = au_xinondir_expand(xi); ++ if (unlikely(err)) ++ goto out_unlock; ++ } ++ xi->xi_nondir.array[empty] = h_ino; ++ *idx = empty; ++ } else { ++ spin_unlock(&xi->xi_nondir.spin); ++ wait_event(xi->xi_nondir.wqh, ++ xi->xi_nondir.array[found] != h_ino); ++ goto again; ++ } ++ ++out_unlock: ++ spin_unlock(&xi->xi_nondir.spin); ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_xino_path(struct seq_file *seq, struct file *file) ++{ ++ int err; ++ ++ err = au_seq_path(seq, &file->f_path); ++ if (unlikely(err)) ++ goto out; ++ ++#define Deleted "\\040(deleted)" ++ seq->count -= sizeof(Deleted) - 1; ++ AuDebugOn(memcmp(seq->buf + seq->count, Deleted, ++ sizeof(Deleted) - 1)); ++#undef Deleted ++ ++out: ++ return err; ++} +diff --git a/fs/dcache.c b/fs/dcache.c +index 2e7e8d85e9b4..9f57bd87bce5 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -1238,7 +1238,7 @@ enum d_walk_ret { + * + * The @enter() callbacks are called with d_lock held. + */ +-static void d_walk(struct dentry *parent, void *data, ++void d_walk(struct dentry *parent, void *data, + enum d_walk_ret (*enter)(void *, struct dentry *)) + { + struct dentry *this_parent; +diff --git a/fs/fcntl.c b/fs/fcntl.c +index 4137d96534a6..c91b3e3c4580 100644 +--- a/fs/fcntl.c ++++ b/fs/fcntl.c +@@ -32,7 +32,7 @@ + + #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME) + +-static int setfl(int fd, struct file * filp, unsigned long arg) ++int setfl(int fd, struct file * filp, unsigned long arg) + { + struct inode * inode = file_inode(filp); + int error = 0; +@@ -63,6 +63,8 @@ static int setfl(int fd, struct file * filp, unsigned long arg) + + if (filp->f_op->check_flags) + error = filp->f_op->check_flags(arg); ++ if (!error && filp->f_op->setfl) ++ error = filp->f_op->setfl(filp, arg); + if (error) + return error; + +diff --git a/fs/inode.c b/fs/inode.c +index 42f6d25f32a5..fa6ae6a217fb 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -1657,7 +1657,7 @@ EXPORT_SYMBOL(generic_update_time); + * This does the actual work of updating an inodes time or version. Must have + * had called mnt_want_write() before calling this. + */ +-static int update_time(struct inode *inode, struct timespec64 *time, int flags) ++int update_time(struct inode *inode, struct timespec64 *time, int flags) + { + int (*update_time)(struct inode *, struct timespec64 *, int); + +diff --git a/fs/namespace.c b/fs/namespace.c +index 99186556f8d3..72c93f3e8647 100644 +--- a/fs/namespace.c ++++ b/fs/namespace.c +@@ -770,6 +770,12 @@ static inline int check_mnt(struct mount *mnt) + return mnt->mnt_ns == current->nsproxy->mnt_ns; + } + ++/* for aufs, CONFIG_AUFS_BR_FUSE */ ++int is_current_mnt_ns(struct vfsmount *mnt) ++{ ++ return check_mnt(real_mount(mnt)); ++} ++ + /* + * vfsmount lock must be held for write + */ +diff --git a/fs/proc/base.c b/fs/proc/base.c +index 7e9f07bf260d..3ab59011067e 100644 +--- a/fs/proc/base.c ++++ b/fs/proc/base.c +@@ -2016,7 +2016,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path) + down_read(&mm->mmap_sem); + vma = find_exact_vma(mm, vm_start, vm_end); + if (vma && vma->vm_file) { +- *path = vma->vm_file->f_path; ++ *path = vma_pr_or_file(vma)->f_path; + path_get(path); + rc = 0; + } +diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c +index 3b63be64e436..fb9913bf3d10 100644 +--- a/fs/proc/nommu.c ++++ b/fs/proc/nommu.c +@@ -45,7 +45,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region) + file = region->vm_file; + + if (file) { +- struct inode *inode = file_inode(region->vm_file); ++ struct inode *inode; ++ ++ file = vmr_pr_or_file(region); ++ inode = file_inode(file); + dev = inode->i_sb->s_dev; + ino = inode->i_ino; + } +diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c +index 5ea1d64cb0b4..7865a4707d23 100644 +--- a/fs/proc/task_mmu.c ++++ b/fs/proc/task_mmu.c +@@ -305,7 +305,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma) + const char *name = NULL; + + if (file) { +- struct inode *inode = file_inode(vma->vm_file); ++ struct inode *inode; ++ ++ file = vma_pr_or_file(vma); ++ inode = file_inode(file); + dev = inode->i_sb->s_dev; + ino = inode->i_ino; + pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; +@@ -1727,7 +1730,7 @@ static int show_numa_map(struct seq_file *m, void *v) + struct proc_maps_private *proc_priv = &numa_priv->proc_maps; + struct vm_area_struct *vma = v; + struct numa_maps *md = &numa_priv->md; +- struct file *file = vma->vm_file; ++ struct file *file = vma_pr_or_file(vma); + struct mm_struct *mm = vma->vm_mm; + struct mm_walk walk = { + .hugetlb_entry = gather_hugetlb_stats, +diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c +index 0b63d68dedb2..400d1c594ceb 100644 +--- a/fs/proc/task_nommu.c ++++ b/fs/proc/task_nommu.c +@@ -155,7 +155,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) + file = vma->vm_file; + + if (file) { +- struct inode *inode = file_inode(vma->vm_file); ++ struct inode *inode; ++ ++ file = vma_pr_or_file(vma); ++ inode = file_inode(file); + dev = inode->i_sb->s_dev; + ino = inode->i_ino; + pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT; +diff --git a/fs/read_write.c b/fs/read_write.c +index 8a2737f0d61d..42f64cc2eae9 100644 +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -489,6 +489,28 @@ ssize_t __vfs_write(struct file *file, const char __user *p, size_t count, + return -EINVAL; + } + ++vfs_readf_t vfs_readf(struct file *file) ++{ ++ const struct file_operations *fop = file->f_op; ++ ++ if (fop->read) ++ return fop->read; ++ if (fop->read_iter) ++ return new_sync_read; ++ return ERR_PTR(-ENOSYS); ++} ++ ++vfs_writef_t vfs_writef(struct file *file) ++{ ++ const struct file_operations *fop = file->f_op; ++ ++ if (fop->write) ++ return fop->write; ++ if (fop->write_iter) ++ return new_sync_write; ++ return ERR_PTR(-ENOSYS); ++} ++ + ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos) + { + mm_segment_t old_fs; +diff --git a/fs/splice.c b/fs/splice.c +index b3daa971f597..1dd7f96b22dc 100644 +--- a/fs/splice.c ++++ b/fs/splice.c +@@ -838,8 +838,8 @@ EXPORT_SYMBOL(generic_splice_sendpage); + /* + * Attempt to initiate a splice from pipe to file. + */ +-static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, +- loff_t *ppos, size_t len, unsigned int flags) ++long do_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags) + { + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, + loff_t *, size_t, unsigned int); +@@ -855,9 +855,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, + /* + * Attempt to initiate a splice from a file to a pipe. + */ +-static long do_splice_to(struct file *in, loff_t *ppos, +- struct pipe_inode_info *pipe, size_t len, +- unsigned int flags) ++long do_splice_to(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags) + { + ssize_t (*splice_read)(struct file *, loff_t *, + struct pipe_inode_info *, size_t, unsigned int); +diff --git a/fs/sync.c b/fs/sync.c +index b54e0541ad89..28607828e96f 100644 +--- a/fs/sync.c ++++ b/fs/sync.c +@@ -28,7 +28,7 @@ + * wait == 1 case since in that case write_inode() functions do + * sync_dirty_buffer() and thus effectively write one block at a time. + */ +-static int __sync_filesystem(struct super_block *sb, int wait) ++int __sync_filesystem(struct super_block *sb, int wait) + { + if (wait) + sync_inodes_sb(sb); +diff --git a/include/linux/fs.h b/include/linux/fs.h +index 897eae8faee1..7fb92a99efe8 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -1286,6 +1286,7 @@ extern void fasync_free(struct fasync_struct *); + /* can be called from interrupts */ + extern void kill_fasync(struct fasync_struct **, int, int); + ++extern int setfl(int fd, struct file * filp, unsigned long arg); + extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force); + extern int f_setown(struct file *filp, unsigned long arg, int force); + extern void f_delown(struct file *filp); +@@ -1747,6 +1748,7 @@ struct file_operations { + ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); + unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); + int (*check_flags)(int); ++ int (*setfl)(struct file *, unsigned long); + int (*flock) (struct file *, int, struct file_lock *); + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); + ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); +@@ -1818,6 +1820,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, + struct iovec *fast_pointer, + struct iovec **ret_pointer); + ++typedef ssize_t (*vfs_readf_t)(struct file *, char __user *, size_t, loff_t *); ++typedef ssize_t (*vfs_writef_t)(struct file *, const char __user *, size_t, ++ loff_t *); ++vfs_readf_t vfs_readf(struct file *file); ++vfs_writef_t vfs_writef(struct file *file); ++ + extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *); + extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); + extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); +@@ -2243,6 +2251,7 @@ extern int current_umask(void); + extern void ihold(struct inode * inode); + extern void iput(struct inode *); + extern int generic_update_time(struct inode *, struct timespec64 *, int); ++extern int update_time(struct inode *, struct timespec64 *, int); + + /* /sys/fs */ + extern struct kobject *fs_kobj; +@@ -2530,6 +2539,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb) + return false; + } + #endif ++extern int __sync_filesystem(struct super_block *, int); + extern int sync_filesystem(struct super_block *); + extern const struct file_operations def_blk_fops; + extern const struct file_operations def_chr_fops; +diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h +index b0d0b51c4d85..f73ffaa0199e 100644 +--- a/include/linux/lockdep.h ++++ b/include/linux/lockdep.h +@@ -313,6 +313,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock, + return lock->key == key; + } + ++struct lock_class *lockdep_hlock_class(struct held_lock *hlock); ++ + /* + * Acquire a lock. + * +@@ -439,6 +441,7 @@ struct lockdep_map { }; + + #define lockdep_depth(tsk) (0) + ++#define lockdep_is_held(lock) (1) + #define lockdep_is_held_type(l, r) (1) + + #define lockdep_assert_held(l) do { (void)(l); } while (0) +diff --git a/include/linux/mm.h b/include/linux/mm.h +index 0416a7204be3..4a298a92681b 100644 +--- a/include/linux/mm.h ++++ b/include/linux/mm.h +@@ -1440,6 +1440,28 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping, + unmap_mapping_range(mapping, holebegin, holelen, 0); + } + ++extern void vma_do_file_update_time(struct vm_area_struct *, const char[], int); ++extern struct file *vma_do_pr_or_file(struct vm_area_struct *, const char[], ++ int); ++extern void vma_do_get_file(struct vm_area_struct *, const char[], int); ++extern void vma_do_fput(struct vm_area_struct *, const char[], int); ++ ++#define vma_file_update_time(vma) vma_do_file_update_time(vma, __func__, \ ++ __LINE__) ++#define vma_pr_or_file(vma) vma_do_pr_or_file(vma, __func__, \ ++ __LINE__) ++#define vma_get_file(vma) vma_do_get_file(vma, __func__, __LINE__) ++#define vma_fput(vma) vma_do_fput(vma, __func__, __LINE__) ++ ++#ifndef CONFIG_MMU ++extern struct file *vmr_do_pr_or_file(struct vm_region *, const char[], int); ++extern void vmr_do_fput(struct vm_region *, const char[], int); ++ ++#define vmr_pr_or_file(region) vmr_do_pr_or_file(region, __func__, \ ++ __LINE__) ++#define vmr_fput(region) vmr_do_fput(region, __func__, __LINE__) ++#endif /* !CONFIG_MMU */ ++ + extern int access_process_vm(struct task_struct *tsk, unsigned long addr, + void *buf, int len, unsigned int gup_flags); + extern int access_remote_vm(struct mm_struct *mm, unsigned long addr, +diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h +index 5ed8f6292a53..01229754077f 100644 +--- a/include/linux/mm_types.h ++++ b/include/linux/mm_types.h +@@ -239,6 +239,7 @@ struct vm_region { + unsigned long vm_top; /* region allocated to here */ + unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */ + struct file *vm_file; /* the backing file or NULL */ ++ struct file *vm_prfile; /* the virtual backing file or NULL */ + + int vm_usage; /* region usage count (access under nommu_region_sem) */ + bool vm_icache_flushed : 1; /* true if the icache has been flushed for +@@ -313,6 +314,7 @@ struct vm_area_struct { + unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE + units */ + struct file * vm_file; /* File we map to (can be NULL). */ ++ struct file *vm_prfile; /* shadow of vm_file */ + void * vm_private_data; /* was vm_pte (shared mem) */ + + atomic_long_t swap_readahead_info; +diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h +index 35942084cd40..24f5fd1a789d 100644 +--- a/include/linux/mnt_namespace.h ++++ b/include/linux/mnt_namespace.h +@@ -6,11 +6,14 @@ + struct mnt_namespace; + struct fs_struct; + struct user_namespace; ++struct vfsmount; + + extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *, + struct user_namespace *, struct fs_struct *); + extern void put_mnt_ns(struct mnt_namespace *ns); + ++extern int is_current_mnt_ns(struct vfsmount *mnt); ++ + extern const struct file_operations proc_mounts_operations; + extern const struct file_operations proc_mountinfo_operations; + extern const struct file_operations proc_mountstats_operations; +diff --git a/include/linux/splice.h b/include/linux/splice.h +index 74b4911ac16d..19789fbea567 100644 +--- a/include/linux/splice.h ++++ b/include/linux/splice.h +@@ -87,4 +87,10 @@ extern void splice_shrink_spd(struct splice_pipe_desc *); + + extern const struct pipe_buf_operations page_cache_pipe_buf_ops; + extern const struct pipe_buf_operations default_pipe_buf_ops; ++ ++extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags); ++extern long do_splice_to(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags); + #endif +diff --git a/include/uapi/linux/aufs_type.h b/include/uapi/linux/aufs_type.h +new file mode 100644 +index 000000000000..5b21dd4f5738 +--- /dev/null ++++ b/include/uapi/linux/aufs_type.h +@@ -0,0 +1,435 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (C) 2005-2018 Junjiro R. Okajima ++ */ ++ ++#ifndef __AUFS_TYPE_H__ ++#define __AUFS_TYPE_H__ ++ ++#define AUFS_NAME "aufs" ++ ++#ifdef __KERNEL__ ++/* ++ * define it before including all other headers. ++ * sched.h may use pr_* macros before defining "current", so define the ++ * no-current version first, and re-define later. ++ */ ++#define pr_fmt(fmt) AUFS_NAME " %s:%d: " fmt, __func__, __LINE__ ++#include ++#undef pr_fmt ++#define pr_fmt(fmt) \ ++ AUFS_NAME " %s:%d:%.*s[%d]: " fmt, __func__, __LINE__, \ ++ (int)sizeof(current->comm), current->comm, current->pid ++#else ++#include ++#include ++#endif /* __KERNEL__ */ ++ ++#include ++ ++#define AUFS_VERSION "4.19" ++ ++/* todo? move this to linux-2.6.19/include/magic.h */ ++#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's') ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_BRANCH_MAX_127 ++typedef int8_t aufs_bindex_t; ++#define AUFS_BRANCH_MAX 127 ++#else ++typedef int16_t aufs_bindex_t; ++#ifdef CONFIG_AUFS_BRANCH_MAX_511 ++#define AUFS_BRANCH_MAX 511 ++#elif defined(CONFIG_AUFS_BRANCH_MAX_1023) ++#define AUFS_BRANCH_MAX 1023 ++#elif defined(CONFIG_AUFS_BRANCH_MAX_32767) ++#define AUFS_BRANCH_MAX 32767 ++#endif ++#endif ++ ++#ifdef __KERNEL__ ++#ifndef AUFS_BRANCH_MAX ++#error unknown CONFIG_AUFS_BRANCH_MAX value ++#endif ++#endif /* __KERNEL__ */ ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define AUFS_FSTYPE AUFS_NAME ++ ++#define AUFS_ROOT_INO 2 ++#define AUFS_FIRST_INO 11 ++ ++#define AUFS_WH_PFX ".wh." ++#define AUFS_WH_PFX_LEN ((int)sizeof(AUFS_WH_PFX) - 1) ++#define AUFS_WH_TMP_LEN 4 ++/* a limit for rmdir/rename a dir and copyup */ ++#define AUFS_MAX_NAMELEN (NAME_MAX \ ++ - AUFS_WH_PFX_LEN * 2 /* doubly whiteouted */\ ++ - 1 /* dot */\ ++ - AUFS_WH_TMP_LEN) /* hex */ ++#define AUFS_XINO_FNAME "." AUFS_NAME ".xino" ++#define AUFS_XINO_DEFPATH "/tmp/" AUFS_XINO_FNAME ++#define AUFS_XINO_DEF_SEC 30 /* seconds */ ++#define AUFS_XINO_DEF_TRUNC 45 /* percentage */ ++#define AUFS_DIRWH_DEF 3 ++#define AUFS_RDCACHE_DEF 10 /* seconds */ ++#define AUFS_RDCACHE_MAX 3600 /* seconds */ ++#define AUFS_RDBLK_DEF 512 /* bytes */ ++#define AUFS_RDHASH_DEF 32 ++#define AUFS_WKQ_NAME AUFS_NAME "d" ++#define AUFS_MFS_DEF_SEC 30 /* seconds */ ++#define AUFS_MFS_MAX_SEC 3600 /* seconds */ ++#define AUFS_FHSM_CACHE_DEF_SEC 30 /* seconds */ ++#define AUFS_PLINK_WARN 50 /* number of plinks in a single bucket */ ++ ++/* pseudo-link maintenace under /proc */ ++#define AUFS_PLINK_MAINT_NAME "plink_maint" ++#define AUFS_PLINK_MAINT_DIR "fs/" AUFS_NAME ++#define AUFS_PLINK_MAINT_PATH AUFS_PLINK_MAINT_DIR "/" AUFS_PLINK_MAINT_NAME ++ ++/* dirren, renamed dir */ ++#define AUFS_DR_INFO_PFX AUFS_WH_PFX ".dr." ++#define AUFS_DR_BRHINO_NAME AUFS_WH_PFX "hino" ++/* whiteouted doubly */ ++#define AUFS_WH_DR_INFO_PFX AUFS_WH_PFX AUFS_DR_INFO_PFX ++#define AUFS_WH_DR_BRHINO AUFS_WH_PFX AUFS_DR_BRHINO_NAME ++ ++#define AUFS_DIROPQ_NAME AUFS_WH_PFX ".opq" /* whiteouted doubly */ ++#define AUFS_WH_DIROPQ AUFS_WH_PFX AUFS_DIROPQ_NAME ++ ++#define AUFS_BASE_NAME AUFS_WH_PFX AUFS_NAME ++#define AUFS_PLINKDIR_NAME AUFS_WH_PFX "plnk" ++#define AUFS_ORPHDIR_NAME AUFS_WH_PFX "orph" ++ ++/* doubly whiteouted */ ++#define AUFS_WH_BASE AUFS_WH_PFX AUFS_BASE_NAME ++#define AUFS_WH_PLINKDIR AUFS_WH_PFX AUFS_PLINKDIR_NAME ++#define AUFS_WH_ORPHDIR AUFS_WH_PFX AUFS_ORPHDIR_NAME ++ ++/* branch permissions and attributes */ ++#define AUFS_BRPERM_RW "rw" ++#define AUFS_BRPERM_RO "ro" ++#define AUFS_BRPERM_RR "rr" ++#define AUFS_BRATTR_COO_REG "coo_reg" ++#define AUFS_BRATTR_COO_ALL "coo_all" ++#define AUFS_BRATTR_FHSM "fhsm" ++#define AUFS_BRATTR_UNPIN "unpin" ++#define AUFS_BRATTR_ICEX "icex" ++#define AUFS_BRATTR_ICEX_SEC "icexsec" ++#define AUFS_BRATTR_ICEX_SYS "icexsys" ++#define AUFS_BRATTR_ICEX_TR "icextr" ++#define AUFS_BRATTR_ICEX_USR "icexusr" ++#define AUFS_BRATTR_ICEX_OTH "icexoth" ++#define AUFS_BRRATTR_WH "wh" ++#define AUFS_BRWATTR_NLWH "nolwh" ++#define AUFS_BRWATTR_MOO "moo" ++ ++#define AuBrPerm_RW 1 /* writable, hardlinkable wh */ ++#define AuBrPerm_RO (1 << 1) /* readonly */ ++#define AuBrPerm_RR (1 << 2) /* natively readonly */ ++#define AuBrPerm_Mask (AuBrPerm_RW | AuBrPerm_RO | AuBrPerm_RR) ++ ++#define AuBrAttr_COO_REG (1 << 3) /* copy-up on open */ ++#define AuBrAttr_COO_ALL (1 << 4) ++#define AuBrAttr_COO_Mask (AuBrAttr_COO_REG | AuBrAttr_COO_ALL) ++ ++#define AuBrAttr_FHSM (1 << 5) /* file-based hsm */ ++#define AuBrAttr_UNPIN (1 << 6) /* rename-able top dir of ++ branch. meaningless since ++ linux-3.18-rc1 */ ++ ++/* ignore error in copying XATTR */ ++#define AuBrAttr_ICEX_SEC (1 << 7) ++#define AuBrAttr_ICEX_SYS (1 << 8) ++#define AuBrAttr_ICEX_TR (1 << 9) ++#define AuBrAttr_ICEX_USR (1 << 10) ++#define AuBrAttr_ICEX_OTH (1 << 11) ++#define AuBrAttr_ICEX (AuBrAttr_ICEX_SEC \ ++ | AuBrAttr_ICEX_SYS \ ++ | AuBrAttr_ICEX_TR \ ++ | AuBrAttr_ICEX_USR \ ++ | AuBrAttr_ICEX_OTH) ++ ++#define AuBrRAttr_WH (1 << 12) /* whiteout-able */ ++#define AuBrRAttr_Mask AuBrRAttr_WH ++ ++#define AuBrWAttr_NoLinkWH (1 << 13) /* un-hardlinkable whiteouts */ ++#define AuBrWAttr_MOO (1 << 14) /* move-up on open */ ++#define AuBrWAttr_Mask (AuBrWAttr_NoLinkWH | AuBrWAttr_MOO) ++ ++#define AuBrAttr_CMOO_Mask (AuBrAttr_COO_Mask | AuBrWAttr_MOO) ++ ++/* #warning test userspace */ ++#ifdef __KERNEL__ ++#ifndef CONFIG_AUFS_FHSM ++#undef AuBrAttr_FHSM ++#define AuBrAttr_FHSM 0 ++#endif ++#ifndef CONFIG_AUFS_XATTR ++#undef AuBrAttr_ICEX ++#define AuBrAttr_ICEX 0 ++#undef AuBrAttr_ICEX_SEC ++#define AuBrAttr_ICEX_SEC 0 ++#undef AuBrAttr_ICEX_SYS ++#define AuBrAttr_ICEX_SYS 0 ++#undef AuBrAttr_ICEX_TR ++#define AuBrAttr_ICEX_TR 0 ++#undef AuBrAttr_ICEX_USR ++#define AuBrAttr_ICEX_USR 0 ++#undef AuBrAttr_ICEX_OTH ++#define AuBrAttr_ICEX_OTH 0 ++#endif ++#endif ++ ++/* the longest combination */ ++/* AUFS_BRATTR_ICEX and AUFS_BRATTR_ICEX_TR don't affect here */ ++#define AuBrPermStrSz sizeof(AUFS_BRPERM_RW \ ++ "+" AUFS_BRATTR_COO_REG \ ++ "+" AUFS_BRATTR_FHSM \ ++ "+" AUFS_BRATTR_UNPIN \ ++ "+" AUFS_BRATTR_ICEX_SEC \ ++ "+" AUFS_BRATTR_ICEX_SYS \ ++ "+" AUFS_BRATTR_ICEX_USR \ ++ "+" AUFS_BRATTR_ICEX_OTH \ ++ "+" AUFS_BRWATTR_NLWH) ++ ++typedef struct { ++ char a[AuBrPermStrSz]; ++} au_br_perm_str_t; ++ ++static inline int au_br_writable(int brperm) ++{ ++ return brperm & AuBrPerm_RW; ++} ++ ++static inline int au_br_whable(int brperm) ++{ ++ return brperm & (AuBrPerm_RW | AuBrRAttr_WH); ++} ++ ++static inline int au_br_wh_linkable(int brperm) ++{ ++ return !(brperm & AuBrWAttr_NoLinkWH); ++} ++ ++static inline int au_br_cmoo(int brperm) ++{ ++ return brperm & AuBrAttr_CMOO_Mask; ++} ++ ++static inline int au_br_fhsm(int brperm) ++{ ++ return brperm & AuBrAttr_FHSM; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ioctl */ ++enum { ++ /* readdir in userspace */ ++ AuCtl_RDU, ++ AuCtl_RDU_INO, ++ ++ AuCtl_WBR_FD, /* pathconf wrapper */ ++ AuCtl_IBUSY, /* busy inode */ ++ AuCtl_MVDOWN, /* move-down */ ++ AuCtl_BR, /* info about branches */ ++ AuCtl_FHSM_FD /* connection for fhsm */ ++}; ++ ++/* borrowed from linux/include/linux/kernel.h */ ++#ifndef ALIGN ++#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) ++#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) ++#endif ++ ++/* borrowed from linux/include/linux/compiler-gcc3.h */ ++#ifndef __aligned ++#define __aligned(x) __attribute__((aligned(x))) ++#endif ++ ++#ifdef __KERNEL__ ++#ifndef __packed ++#define __packed __attribute__((packed)) ++#endif ++#endif ++ ++struct au_rdu_cookie { ++ uint64_t h_pos; ++ int16_t bindex; ++ uint8_t flags; ++ uint8_t pad; ++ uint32_t generation; ++} __aligned(8); ++ ++struct au_rdu_ent { ++ uint64_t ino; ++ int16_t bindex; ++ uint8_t type; ++ uint8_t nlen; ++ uint8_t wh; ++ char name[0]; ++} __aligned(8); ++ ++static inline int au_rdu_len(int nlen) ++{ ++ /* include the terminating NULL */ ++ return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1, ++ sizeof(uint64_t)); ++} ++ ++union au_rdu_ent_ul { ++ struct au_rdu_ent __user *e; ++ uint64_t ul; ++}; ++ ++enum { ++ AufsCtlRduV_SZ, ++ AufsCtlRduV_End ++}; ++ ++struct aufs_rdu { ++ /* input */ ++ union { ++ uint64_t sz; /* AuCtl_RDU */ ++ uint64_t nent; /* AuCtl_RDU_INO */ ++ }; ++ union au_rdu_ent_ul ent; ++ uint16_t verify[AufsCtlRduV_End]; ++ ++ /* input/output */ ++ uint32_t blk; ++ ++ /* output */ ++ union au_rdu_ent_ul tail; ++ /* number of entries which were added in a single call */ ++ uint64_t rent; ++ uint8_t full; ++ uint8_t shwh; ++ ++ struct au_rdu_cookie cookie; ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dirren. the branch is identified by the filename who contains this */ ++struct au_drinfo { ++ uint64_t ino; ++ union { ++ uint8_t oldnamelen; ++ uint64_t _padding; ++ }; ++ uint8_t oldname[0]; ++} __aligned(8); ++ ++struct au_drinfo_fdata { ++ uint32_t magic; ++ struct au_drinfo drinfo; ++} __aligned(8); ++ ++#define AUFS_DRINFO_MAGIC_V1 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x01) ++/* future */ ++#define AUFS_DRINFO_MAGIC_V2 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x02) ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct aufs_wbr_fd { ++ uint32_t oflags; ++ int16_t brid; ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct aufs_ibusy { ++ uint64_t ino, h_ino; ++ int16_t bindex; ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* error code for move-down */ ++/* the actual message strings are implemented in aufs-util.git */ ++enum { ++ EAU_MVDOWN_OPAQUE = 1, ++ EAU_MVDOWN_WHITEOUT, ++ EAU_MVDOWN_UPPER, ++ EAU_MVDOWN_BOTTOM, ++ EAU_MVDOWN_NOUPPER, ++ EAU_MVDOWN_NOLOWERBR, ++ EAU_Last ++}; ++ ++/* flags for move-down */ ++#define AUFS_MVDOWN_DMSG 1 ++#define AUFS_MVDOWN_OWLOWER (1 << 1) /* overwrite lower */ ++#define AUFS_MVDOWN_KUPPER (1 << 2) /* keep upper */ ++#define AUFS_MVDOWN_ROLOWER (1 << 3) /* do even if lower is RO */ ++#define AUFS_MVDOWN_ROLOWER_R (1 << 4) /* did on lower RO */ ++#define AUFS_MVDOWN_ROUPPER (1 << 5) /* do even if upper is RO */ ++#define AUFS_MVDOWN_ROUPPER_R (1 << 6) /* did on upper RO */ ++#define AUFS_MVDOWN_BRID_UPPER (1 << 7) /* upper brid */ ++#define AUFS_MVDOWN_BRID_LOWER (1 << 8) /* lower brid */ ++#define AUFS_MVDOWN_FHSM_LOWER (1 << 9) /* find fhsm attr for lower */ ++#define AUFS_MVDOWN_STFS (1 << 10) /* req. stfs */ ++#define AUFS_MVDOWN_STFS_FAILED (1 << 11) /* output: stfs is unusable */ ++#define AUFS_MVDOWN_BOTTOM (1 << 12) /* output: no more lowers */ ++ ++/* index for move-down */ ++enum { ++ AUFS_MVDOWN_UPPER, ++ AUFS_MVDOWN_LOWER, ++ AUFS_MVDOWN_NARRAY ++}; ++ ++/* ++ * additional info of move-down ++ * number of free blocks and inodes. ++ * subset of struct kstatfs, but smaller and always 64bit. ++ */ ++struct aufs_stfs { ++ uint64_t f_blocks; ++ uint64_t f_bavail; ++ uint64_t f_files; ++ uint64_t f_ffree; ++}; ++ ++struct aufs_stbr { ++ int16_t brid; /* optional input */ ++ int16_t bindex; /* output */ ++ struct aufs_stfs stfs; /* output when AUFS_MVDOWN_STFS set */ ++} __aligned(8); ++ ++struct aufs_mvdown { ++ uint32_t flags; /* input/output */ ++ struct aufs_stbr stbr[AUFS_MVDOWN_NARRAY]; /* input/output */ ++ int8_t au_errno; /* output */ ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++union aufs_brinfo { ++ /* PATH_MAX may differ between kernel-space and user-space */ ++ char _spacer[4096]; ++ struct { ++ int16_t id; ++ int perm; ++ char path[0]; ++ }; ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define AuCtlType 'A' ++#define AUFS_CTL_RDU _IOWR(AuCtlType, AuCtl_RDU, struct aufs_rdu) ++#define AUFS_CTL_RDU_INO _IOWR(AuCtlType, AuCtl_RDU_INO, struct aufs_rdu) ++#define AUFS_CTL_WBR_FD _IOW(AuCtlType, AuCtl_WBR_FD, \ ++ struct aufs_wbr_fd) ++#define AUFS_CTL_IBUSY _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy) ++#define AUFS_CTL_MVDOWN _IOWR(AuCtlType, AuCtl_MVDOWN, \ ++ struct aufs_mvdown) ++#define AUFS_CTL_BRINFO _IOW(AuCtlType, AuCtl_BR, union aufs_brinfo) ++#define AUFS_CTL_FHSM_FD _IOW(AuCtlType, AuCtl_FHSM_FD, int) ++ ++#endif /* __AUFS_TYPE_H__ */ +diff --git a/kernel/fork.c b/kernel/fork.c +index f0b58479534f..fa562c364d02 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -505,7 +505,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, + struct inode *inode = file_inode(file); + struct address_space *mapping = file->f_mapping; + +- get_file(file); ++ vma_get_file(tmp); + if (tmp->vm_flags & VM_DENYWRITE) + atomic_dec(&inode->i_writecount); + i_mmap_lock_write(mapping); +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index dd13f865ad40..fa6f5599a2a5 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -140,7 +140,7 @@ static struct lock_list list_entries[MAX_LOCKDEP_ENTRIES]; + unsigned long nr_lock_classes; + static struct lock_class lock_classes[MAX_LOCKDEP_KEYS]; + +-static inline struct lock_class *hlock_class(struct held_lock *hlock) ++inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock) + { + if (!hlock->class_idx) { + /* +@@ -151,6 +151,7 @@ static inline struct lock_class *hlock_class(struct held_lock *hlock) + } + return lock_classes + hlock->class_idx - 1; + } ++#define hlock_class(hlock) lockdep_hlock_class(hlock) + + #ifdef CONFIG_LOCK_STAT + static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], cpu_lock_stats); +diff --git a/mm/Makefile b/mm/Makefile +index 26ef77a3883b..b2869af1ef08 100644 +--- a/mm/Makefile ++++ b/mm/Makefile +@@ -39,7 +39,7 @@ obj-y := filemap.o mempool.o oom_kill.o fadvise.o \ + mm_init.o mmu_context.o percpu.o slab_common.o \ + compaction.o vmacache.o \ + interval_tree.o list_lru.o workingset.o \ +- debug.o $(mmu-y) ++ prfile.o debug.o $(mmu-y) + + obj-y += init-mm.o + +diff --git a/mm/filemap.c b/mm/filemap.c +index 52517f28e6f4..250f675dcfb2 100644 +--- a/mm/filemap.c ++++ b/mm/filemap.c +@@ -2700,7 +2700,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf) + vm_fault_t ret = VM_FAULT_LOCKED; + + sb_start_pagefault(inode->i_sb); +- file_update_time(vmf->vma->vm_file); ++ vma_file_update_time(vmf->vma); + lock_page(page); + if (page->mapping != inode->i_mapping) { + unlock_page(page); +diff --git a/mm/mmap.c b/mm/mmap.c +index f7cd9cb966c0..515e88a194bd 100644 +--- a/mm/mmap.c ++++ b/mm/mmap.c +@@ -180,7 +180,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma) + if (vma->vm_ops && vma->vm_ops->close) + vma->vm_ops->close(vma); + if (vma->vm_file) +- fput(vma->vm_file); ++ vma_fput(vma); + mpol_put(vma_policy(vma)); + vm_area_free(vma); + return next; +@@ -905,7 +905,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start, + if (remove_next) { + if (file) { + uprobe_munmap(next, next->vm_start, next->vm_end); +- fput(file); ++ vma_fput(vma); + } + if (next->anon_vma) + anon_vma_merge(vma, next); +@@ -1821,8 +1821,8 @@ unsigned long mmap_region(struct file *file, unsigned long addr, + return addr; + + unmap_and_free_vma: ++ vma_fput(vma); + vma->vm_file = NULL; +- fput(file); + + /* Undo any partial mapping done by a device driver. */ + unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end); +@@ -2641,7 +2641,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + goto out_free_mpol; + + if (new->vm_file) +- get_file(new->vm_file); ++ vma_get_file(new); + + if (new->vm_ops && new->vm_ops->open) + new->vm_ops->open(new); +@@ -2660,7 +2660,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + if (new->vm_ops && new->vm_ops->close) + new->vm_ops->close(new); + if (new->vm_file) +- fput(new->vm_file); ++ vma_fput(new); + unlink_anon_vmas(new); + out_free_mpol: + mpol_put(vma_policy(new)); +@@ -2822,7 +2822,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, + struct vm_area_struct *vma; + unsigned long populate = 0; + unsigned long ret = -EINVAL; +- struct file *file; ++ struct file *file, *prfile; + + pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/vm/remap_file_pages.rst.\n", + current->comm, current->pid); +@@ -2897,10 +2897,27 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, + } + } + +- file = get_file(vma->vm_file); ++ vma_get_file(vma); ++ file = vma->vm_file; ++ prfile = vma->vm_prfile; + ret = do_mmap_pgoff(vma->vm_file, start, size, + prot, flags, pgoff, &populate, NULL); ++ if (!IS_ERR_VALUE(ret) && file && prfile) { ++ struct vm_area_struct *new_vma; ++ ++ new_vma = find_vma(mm, ret); ++ if (!new_vma->vm_prfile) ++ new_vma->vm_prfile = prfile; ++ if (new_vma != vma) ++ get_file(prfile); ++ } ++ /* ++ * two fput()s instead of vma_fput(vma), ++ * coz vma may not be available anymore. ++ */ + fput(file); ++ if (prfile) ++ fput(prfile); + out: + up_write(&mm->mmap_sem); + if (populate) +@@ -3206,7 +3223,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, + if (anon_vma_clone(new_vma, vma)) + goto out_free_mempol; + if (new_vma->vm_file) +- get_file(new_vma->vm_file); ++ vma_get_file(new_vma); + if (new_vma->vm_ops && new_vma->vm_ops->open) + new_vma->vm_ops->open(new_vma); + vma_link(mm, new_vma, prev, rb_link, rb_parent); +diff --git a/mm/nommu.c b/mm/nommu.c +index e4aac33216ae..b27b200f1c4f 100644 +--- a/mm/nommu.c ++++ b/mm/nommu.c +@@ -625,7 +625,7 @@ static void __put_nommu_region(struct vm_region *region) + up_write(&nommu_region_sem); + + if (region->vm_file) +- fput(region->vm_file); ++ vmr_fput(region); + + /* IO memory and memory shared directly out of the pagecache + * from ramfs/tmpfs mustn't be released here */ +@@ -763,7 +763,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma) + if (vma->vm_ops && vma->vm_ops->close) + vma->vm_ops->close(vma); + if (vma->vm_file) +- fput(vma->vm_file); ++ vma_fput(vma); + put_nommu_region(vma->vm_region); + vm_area_free(vma); + } +@@ -1286,7 +1286,7 @@ unsigned long do_mmap(struct file *file, + goto error_just_free; + } + } +- fput(region->vm_file); ++ vmr_fput(region); + kmem_cache_free(vm_region_jar, region); + region = pregion; + result = start; +@@ -1361,7 +1361,7 @@ unsigned long do_mmap(struct file *file, + up_write(&nommu_region_sem); + error: + if (region->vm_file) +- fput(region->vm_file); ++ vmr_fput(region); + kmem_cache_free(vm_region_jar, region); + if (vma->vm_file) + fput(vma->vm_file); +diff --git a/mm/prfile.c b/mm/prfile.c +new file mode 100644 +index 000000000000..a27ac3688a35 +--- /dev/null ++++ b/mm/prfile.c +@@ -0,0 +1,86 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Mainly for aufs which mmap(2) different file and wants to print different ++ * path in /proc/PID/maps. ++ * Call these functions via macros defined in linux/mm.h. ++ * ++ * See Documentation/filesystems/aufs/design/06mmap.txt ++ * ++ * Copyright (c) 2014-2018 Junjro R. Okajima ++ * Copyright (c) 2014 Ian Campbell ++ */ ++ ++#include ++#include ++#include ++ ++/* #define PRFILE_TRACE */ ++static inline void prfile_trace(struct file *f, struct file *pr, ++ const char func[], int line, const char func2[]) ++{ ++#ifdef PRFILE_TRACE ++ if (pr) ++ pr_info("%s:%d: %s, %pD2\n", func, line, func2, f); ++#endif ++} ++ ++void vma_do_file_update_time(struct vm_area_struct *vma, const char func[], ++ int line) ++{ ++ struct file *f = vma->vm_file, *pr = vma->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ file_update_time(f); ++ if (f && pr) ++ file_update_time(pr); ++} ++ ++struct file *vma_do_pr_or_file(struct vm_area_struct *vma, const char func[], ++ int line) ++{ ++ struct file *f = vma->vm_file, *pr = vma->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ return (f && pr) ? pr : f; ++} ++ ++void vma_do_get_file(struct vm_area_struct *vma, const char func[], int line) ++{ ++ struct file *f = vma->vm_file, *pr = vma->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ get_file(f); ++ if (f && pr) ++ get_file(pr); ++} ++ ++void vma_do_fput(struct vm_area_struct *vma, const char func[], int line) ++{ ++ struct file *f = vma->vm_file, *pr = vma->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ fput(f); ++ if (f && pr) ++ fput(pr); ++} ++ ++#ifndef CONFIG_MMU ++struct file *vmr_do_pr_or_file(struct vm_region *region, const char func[], ++ int line) ++{ ++ struct file *f = region->vm_file, *pr = region->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ return (f && pr) ? pr : f; ++} ++ ++void vmr_do_fput(struct vm_region *region, const char func[], int line) ++{ ++ struct file *f = region->vm_file, *pr = region->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ fput(f); ++ if (f && pr) ++ fput(pr); ++} ++#endif /* !CONFIG_MMU */ diff --git a/kernel/tools/perf/pspec.xml b/kernel/tools/perf/pspec.xml index cbb1cbfb4a..896bf4191a 100644 --- a/kernel/tools/perf/pspec.xml +++ b/kernel/tools/perf/pspec.xml @@ -12,7 +12,7 @@ app:gui

    Performance analyser tool that makes full use of the Linux performance counter subsystem perf is a new tool which is used to optimize, validate and measure applications, workloads or the full system through the Linux performance counter subsystem. - https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.gz + https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.19.tar.gz libunwind-devel audit-devel @@ -38,13 +38,13 @@ - patches/linux/patch-4.14.90.xz + patches/linux/patch-4.19.34.xz - patches/mageia_4_14/fs-aufs-4.14.patch - patches/mageia_4_14/fs-aufs-4.14-modular.patch + patches/mageia_4_19/fs-aufs-4.19.patch + patches/mageia_4_19/fs-aufs-4.19-modular.patch patches/mageia_4_14/fs-aufs-include-vmalloc.patch @@ -77,6 +77,13 @@ + + 2019-04-06 + 4.19.34 + Version bump. + Ertuğrul Erata + ertugrulerata@gmail.com + 2018-12-22 4.14.90
  2. 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 j zHZPP1FE|PIK){qHs^Mm45)cY1a*##s(U$jMuTu7Cxz!Z?p7s4i#9>@@h4cML2t5R+ z`acf>Shgp}6Evqi+8g+4T9(IRDW8wDZ z1O0iZGgHCzh{gREc}^%_+cKda?Y(lJoTi9KvNk3$O6iN%EAJi{f`J_PkwdI^8kHcr zkr=0D_y;#ahqej+MaksQ*PRJ)OGSCVW`>gmEbBiY;yh)BJoRa8+I=vTcCy{ z2~!|E(ZSN1C?6$+HQS2H$D$kbOQu9qec6KfRdO&t?Q!%I{4U@v>DU%GG27V@Rw1@r ze4P|KrbW1k=%J)P;h`gB6YOWWMfqIxs4JU)#$04rUm2*QE}K_rGrefRMqa+q>6NX3 z7$jAQIaWeKs6&h;kq%S7#H#lC_RIa+^88T?uW#_$62HGeEM5fdA^vY_5@fQV)_wkk zcL-|Lu$p8D8i#}FIz~3h##rm)qIcVTvJK$is}%u{8L@Qs7?dR-?Mzmo#?a8T-rID0 z^~6xw(tbT!r%m==1cXMboPpHl-s9|bo^r-4n_EsroDNaIEO`3BFxOkPVx03R7eP3G z0bg%%QOy|X4DAoKO0lFVw$~7%(DA&1u1NbKJD^tKH3`mkg_+ba4xY;iDO275!4pw$ zh-+z0obqA)p=aVXR4g9?A8N}9%aaPeqc$T{p6fVmdx7JihU{{A<+<_{ zggqES?UHX!D-ix0V^0Z#;z;D$^GNg#nI2f9!-ZrIF;h#EEmj za|0J#1;j`=h*-K^tyVGfAMgjW<#rYI1q(og?&%sDiCpM<{ln;70*sNXm-aS3H+rli zyodtW{7`6T)l?uP)5o{{hZO%_RKTw4YVC({!?zi{D|}_-Pp%7%M^Z>4Y&P_Wi>Xj| zZZ|(pb@EBcAE;Y(>yP%USnfY|IbH!u=`C}+M6EO*GX|kP_U0K&<{NG1R%AId-3#S@ z=I{aITRItbJn@rna8h;ky8u>n_j?4AM^Z*0EIFxEc2_}A9u6;Ru8t>oZiVhA z@Y+18a%wX6!&SZG!pI7gYlcJf=EYifxtr{GLkS?kk<7yLd1y6%1N?ygik$4nzGt<1 zr+_bYE?fQ%R8th9+l@PvWvB#kn8*G#KpO>uEydDaI&?@|;gL0?bC0sAwX;o!`N0iwH`a)QqpW0{t_)YG)ZDdyLqnRqQx;cGA=gp-@Lsq{zTh=163GBFq|_|WFlaS94{Fi9}1cRj-$f+cR+YvcRKv3;_` z(>WA?gVwX0SpKi=hrtv|jX~AUx1rHZg1IJHhf-?0AucR0zsj*1cqqd*znpd&FK%s2 z@b*8+{d3{~LiP2w7FRKX&_)#ZPSGP}!Oj@xkakQCu$YdaGjpMBHr>xq0+uI#rJz7; zL)6(u3>w3S`iKC4$PUa$^a9MI$I6nA)oEOllHbSLY&$HiMn8uslsXAlfpGnr%=tO6 zh13uHXzS6!ZV6I-`Al@F-q!5QQ{z2vK{F>OlJjQi^8gG%NW*jtJKzvXSW_#NeU6-W<-%L1*GeI34BF`cIWQ4KGyR zT>GE9okL33mi|QrCqbQwN8D~NR0i#!jGe8~?3~+o8a`R0!*1Ot>4H%qZ!;nsN``I2 zkWG}_s%G}&1t*>$U#PXB<#7=z72p9a`5xCrCLY`makuoZzx{6d%HFn_)JG%k zTKB8F)!(z-BRY^=HJkxeG&AE-db7FPO9wvpTS$?7ENPvuyGTMK+-uv;bOAMpwbZ}8 z9Lg*lM3@)^A6DX;1{JP?M}XQb%fN~`8dAP%=B@f*LK7W{e|g3Wl;rv{wE~7~P|q>q zv3Je^_dYWmYYF!fOL7HFxS4NDbrFvf=qoQw6gu~IS*&M9V#tipl;1I@Z*2b}S?_mPL3qGTBl zQGNNZS{%P@*R!G}GjI2;()w>qk? zq!%e-b0J$?R-Bt$R~zQmUxEpC;n0M%g+-oiwHh^gCD#d9OASb^(?OSr78Ol=_9APT zoFN%N8gx$n3-Z;mLmgA*uzM>tLUKHNULMjDHvUkma%~sGhzts!4QYHPwcuovOkeP= zEJo7>?NLQh<3*daf7g)?@P<*pn8tPLP&ek`{leiHin#kv%i)~}Va4A&uhV>$W}MN^ zw;hv=qs@E)DsTp0!-Ki;2D}a+qe)LnluFMPmB@Hqk2#1G-}REEco}`lla1eZ5<@Dq z39xQQJlC9W1ME2@Ws5^J{xo3+cH30;wYxX%Qi1#;%YqrBe>p)|2xl+B>~GT;^Bznq zPwhEs+rOZ+#{Y$q;L=Y5cThQkg1&TR|zmw~>4W9XMcf&{nM~e?W{$> z^G(9rFfV4AUz6oIP9lyFcJ-dxqakIRi3Muf+`&JBl2_r?{zmp?h%?`s{wfh**PBk5 zt_M$<2>!(yg5HF!Q7wbDMWpzpTg3PZn&DfT_@AVDde>K<_fsHyIdc4L2$&I`I(?U{ zOMNwlfZK`h9U?WIjk=Ddiqyq<%Wf-Lecp9Rj3$25ebEaJ`f2<+6gRFPhN9pyz~^$> z*+UJ*bh#$G(~zc>LS7{m-I#)A57(NKl(^z#L$1pxRVxGexJ&t%a6Fvg2cv5`LP(s( zxM3Z%8gxQlY2{n)R1m&K{9qDc0HZE@fg(5`x3&%z4+V)JGPbSHXGW3^8h3^R(#>|! zhAHb8azey68$EP7$}(mPlw(tg)^qJ*kw>j4LUCfA;18DxQHYD^oSj?F)pu9iNx}$Y z=#uu@`xM*C#`fioWvinMIvCj22<|q{t-95U6SfLYYI9}xU}4Zsee<1u$rU2=Y5BOS zyyyDc7U5lP+LFlw?{hwKn3t$o_IFsx;p1*dz;4CXRQcRwC_A7V7Am-1?*DVvW_6+! zg6%}a9F4LoT^UCm5BwZy&de-(;Ox7u)R*%X4v=KKVw{R&8Z=8W?SSd1I=djLZh=X# zF%tUo`4Ho@#=)1cr3rG@LT?dT=8H4@wZ_^00}^t1~8I?u37r9 zy8YMXzrzH0?@)ukaqH$y1xIv)hzRs$xk0P)w9@KFJ|h+!uPEs}Z~b9J@x?%v>j3%W zZ*LNGNy|u{X9Bi&8={MLuPRTX2fpszwDm)5TBw@L)LOvVpG>Ucv~J%(RlBj_hyw;$ z5$|GV9vCJ0G=+w^$m+Igti`?o0XwUfwu)^$!Hmk|oXU-Q*{-+ZhKty*YhPE!BQw${uP)$QX1i zutx|C#w!Zk0)((XMLN8hv8MB&{C_Wo+v^pDb6-jJt5rA6o12uA*Yu$TEu{r17hVQV z27MLz?@d=J$P{6MBr)bK zg&Pk6n)97Ze$F|++9wW5bmrTMK=PjI6h$wDgzb zgVoq^B=4}f*haxgPblAkU8=ngO6~MXDDlBK1oz5{?eBlkyNy!f5CtUY;XpWe`2_61 z_|DQA+OPa$NgHWhKXPmhitW|S(Wpzpy1|Wlm86TU+V%5L)Elq;gyn7q5q?WePPI;nMLJJ$zPa7CH1lTlf8LQ`k zohflUswiq#!H4sB9vJ}uuQAWXm`YZtDBWq)zs`xoeI2@d^*G@Zlg4KFR~`b%UdvS@ zknXJ$b=WuG?AKNl5r$!#Ej}`H{*DQ8n#Z6ib9p(Pp4|!`shZr*2F-v>T`DO@IZX$6 zY>~}ynPXL2k*!QZ00~sBaT5mUYHMu&nX3=!Zxjg-169!A_ zU2pKoQ;LAgEZPZXXo0zn63>{x20HKjY@zLvu$Pg7rWzD9+0|_i7lI}XeAdvIdkHkA zBf(we3RN6Lw*`%zXixU-p?5mC@TOZTqoVoLe^zn!bGJt)tlMb8yd(U2ShW_mE7M4J zdxX04J#0fw7^CPX3k~?0j#W3Lk|w(0(1VWfqqlVy;nx5K`f|d(LaEv)ltp@7vKiJm z%!gat4<)3cb+W_V0b)W;FvpC}EBTi5Xr{)r+shQYR0=oi*^LhoJ>6--Ar9F>Lf@!# z(of9$>WeZUT9>#dgS>!7JlrtnL582r1;-$~LZL)&EpXn%>oml2{`iXRs;=2-(D)|m z98#p1`~5>2@HV#R7sf^IOVm3GB`TZi zphPC5?jt%KyB)C&uQ3XDC7(s9Gvf7@5}Z`scK?%*NydZooyuS`f~E{3sbv*(A&9)~ z2GRS#=SwI&rx|VehI3>v7u7DKBL{yHtpsTJ9veF7{cjE{m@vxxQPJ}#Y9+xtG7c8Mn1NT)6^#C}d*2ln zoPh5d6xX;Xx9Mb1en>L-b7|uRU7FmF>Unpyqu%AEeu