Portál AbcLinuxu, 28. března 2024 13:10

Jaderné noviny - 19. 3. 2015: Změny ve virtuálním souborovém systému, minulost a budoucnost

5. 7. 2015 | Redakce
Články - Jaderné noviny - 19. 3. 2015: Změny ve virtuálním souborovém systému, minulost a budoucnost  

Stav vydání jádra. Citáty týdne. Změny ve virtuálním souborovém systému, minulost a budoucnost.

Stav vydání jádra

Aktuální vývojové jádro je 4.0.rc4, vydané 15. března. Linus k tomu řekl: "Nic zvláštního se neděje. Shortlog je otevřený, myslím, že na to, v jaké fázi cyklu jsme, si vedeme dobře."

Stabilní aktualizace: 3.19.2, 3.14.36 a 3.10.72 byly vydané 18. března.

Kdbus na dobré cestě pro 4.1

Greg Kroah-Hartman přidal strom kdbus do linux-next se záměrem sloučit jej v průběhu příštího začleňovacího okna. "Ten kód byl přepracován a přezkoumán již mnohokrát, poslední kolo bylo bez závad, takže je ve frontě na sloučení do verze 4.1-rc1."

Změny ve virtuálním souborovém systému, minulost a budoucnost

Zatímco většina letošního summitu Linux Storage, Filesystem and Memory Management byla věnována diskuzi o subsystému, některá další témata vyvolala takový zájem, že bylo třeba je projednat na plenárních zasedáních. Al Virova přednáška o vývoji virtuálního souborového systému kernelu (VFS) patřila k těmto tématům. Bez VFS by se toho v systému moc nestalo. Tak či onak, v rychle se vyjíjejícím kernelu, je třeba rychle měnit i VFS.

Jedna z věcí, kterou se ještě, navzdory přáním, nepodařilo uskutečnit, je zajištění lepší sady systémových volání, které by nahradily mount(). Al na tom sice pracoval, ale jeho patche byly zamítnuty ještě než mohly být revidovány. V této oblasti se o pokroku nedá mluvit. Na druhou stranu se trochu podařilo zapracovat na vzniku systémového volání revoke(). Plné přijetí je ještě daleko, ale něco se již podařilo udělat.

Více se pracovalo na přechodu k iov_iter interface. Al doufá, že než se uzavře začleňovací okno 4.1, bude přechod z aio_read() a aio_write() (část asynchronní implementace I/O) na iov_iter dokončen. Některé instance stále potřebují převedení, ale Al je toho názoru, že již nejsou žádné významné překážky.

V minulém roce se konverze iov_iter dočkaly send and recieve cesty síťového zásobníku. Stále chybí sendpages(), ale vypadá to, že v cestě nejsou žádné kompilace. Konverze systémového volání splice() bude mnohem těžší. Kód na straně zápisu byl již téměř celý vyměněn - s jednou výjimkou: Filesystem in Userspace (FUSE). Potíž s FUSE je zero-copy, přesouvání stránek přímo mezi splice() bufferem a cache stránky.

Když byl splice() do kernelu přidán poprvé, bylo "kradení stran" původně záměrem; šlo o užitečnou optimalizaci. Nevýhodou byla spousta chyb, například zmatek v kódu souborového systému v okamžiku kdy se aktualizované stránky dostanou do cache stránky. Nick Piggin tuto vlastnost odstranil v roce 2007 a od té doby se nikdo neměl k tomu ji tam vrátit. Al poznamenal, že Nick popsal některé z problémů ve své zprávě, ale jsou další, ke kterým se Nick v minulých letech nedostal a zdá se, že zůstanou tajemstvím, dokud je někdo znovu neobjeví.

Operace zero-copy jsou ve splice() zablokované s jednou výjimkou: FUSE. Problém, který ovlivňoval kradení stránek u jiných souborových systémů se u FUSE neobjevuje, takže nebyl důvod k zablokování. Kromě toho FUSE vyžaduje zero-copy operace, jina dochází k problémům s výkonem. Toto je důvod, který FUSE zatím ochránil od konverze na iov_iter. Alovým řešením problému by bylo obnovení zero-copy pro všechny případy, to však bude vyžadovat další výzkum.

Strana read (zastoupená splice_read() fire_operations) bude pravděpodobně konvertována někdy letos. Al je překvapen, kolik instancí iovec (předchůdců iov_iter) v kernelu nadále zůstává. A jen tak z něj nezmizí, ale používají se stále méně.

Další novou změnou, mimo virtuální souborový systém, je struktura nameidata, která se stane zcela neviditelnou. Bude definována v kódu VFS. Al by se časem rád zbavil ukazatelů k této struktuře a místo ní zavedl používání ukazatelů ze struktury úloh. Tato změna by neměla výrazně ovlivnit kód mimo VFS, ale Al považoval za dobré toto zmínit, jelikož to poškodí některé patche.

Pokračují i práce na projektu, který má za úkol zbavit se mnoha variant d_add(), základní funkce, která přidává záznam struktuře adresáře (dentry) do dentry cache. Jedna z těchto variant, — d_materialise_unique() — byla odstraněna již ve verzi 3.19. Jiné, jako například d_splice_alias() zůstaly. Ideální by bylo mít jediný základní prvek, který by sdružil dentry a inode. Matthew Wilcox se zeptal, zda by jiné variant stále měly význam pro účely dokumentace, ale Al mu odpověděl, že v takových případech by se mělo pracovat důrazně.

Několik dalších nedávných změn zahrnuje unmount souborových systémů při neplatnosti a lepší zpracování vypínání. Změna při odpojení (unmount) způsobuje automatické odebrání souborových systémů, je li zrušen přípojný bod - tato změna byla zařazena před několika měsíci. Velkou změnou je zpracování vypínaní souborového systému, které je nyní zpožděné a odehrává se v (shallow) zásobníku. To by mělo rozptýlit obavy o přetékání zásobníků, které by se jinak mohly objevit během vypínání.

Poslední Alovo téma se týkalo předávání informací o procesu BSD. Co se stává, když začne předávání informací do souboru a dojde k odpojení (unmount) základního FS. Na BSD systému způsobí odebrání EBUSY chybu. Na Linuxu se "někdo rozhodl, že bude nápomocný" a myslel, že by bylo hezkým gestem automaticky zastavit předávání a povolit odpojení (unmount). Tato taktika vypadá užitečně, ale má háček. Vytváří situace, kdy otevřený soubor na souborovém systému nezpůsobí zaneprázdnění souborového systému. To vedlo ke spoustám zajímavým souběhům "race conditions" zpět do roku 2000 nebo tak nějak. Podle Ala je to "pořádný oříšek".

Tento mechanismus byl z kernelu odebrán. Na jeho místě je mechanismus, který umožňuje přidat objekt do struktury vsmount (která zde zastupuje připojený souborový systém); tento objekt podporuje pouze jediný způsob: kill(). Tyto "pin" objekty zůstávají, dokud nezmizí konečný odkaz vfsmount a v tomto okamžiku jsou volány jejich funkce kill(). Jedná se tedy o čistý mechanismus pro provádění čištění, když zmizí souborový systém.

První využití tohoto mechanismu se využívá při ukončování BSD zápisu procesu informací. Dobré využití se nabízí také v případě, že je třeba odpojit velký strom s několika souborovými systémy. Pokud jsou na sobě souborové systémy závislé, lze vložit pin a ujistit se, že bude vyčistění provedeno ve správném pořadí. Tato funkcionalita, nachází se v fs/fs_pin.c vypadá užitečně, ale, jak poznamenal Ted Ts´o, je v současné době nezdokumentovaná. Al skončil svůj výstup s potvrzením (uznáním), že některé komentáře budou dalším uživatelům k užitku.

Odkazy a zdroje

LWN.net

Další články z této rubriky

Jaderné noviny – přehled za únor 2024
Jaderné noviny – přehled za leden 2024
Jaderné noviny – přehled za prosinec 2023
Jaderné noviny – přehled za listopad 2023
Jaderné noviny – přehled za říjen 2023

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.