Az fallocate() rendszerhívás hosszú ideje biztosít lehetőséget fájlterületek előfoglalására, azonban a legtöbb fájlrendszer esetében ez az előkészítés íratlan blokkokkal történik, még akkor is, ha a FALLOC_FL_ZERO_RANGE jelző aktív. Emiatt, amikor az alkalmazás valódi adatokat ír ezekbe a tartományokba, a kernelnek további műveleteket kell végeznie: a blokkokat „írottá” kell tennie, a metaadatokat frissítenie kell, ami megnövekedett írási műveletmennyiséghez, journalhoz való hozzáféréshez és jelentős teljesítményvesztéshez vezethet, különösen szinkron írás esetén.
Tartalomjegyzék

Modern hardvertámogatás: DEAC, UNMAP és write zeroes
Eddig a hatékony zeroingra (nullázásra) a leggyakoribb kerülő megoldás az volt, hogy az üres fájlokat például a dd segítségével zéró adatokkal töltötték fel nagy blokk mérettel, ami lassú folyamat és feleslegesen terheli a háttértárat. A modern flash-alapú háttértárak megjelenésével azonban lehetőség nyílt arra, hogy a fájl nullázását a hardver saját, optimalizált parancsaival végezzük el, anélkül hogy ténylegesen adatírás történne a lemezre.
Az új fejlesztés a Linux 6.17 kernelben lehetővé teszi, hogy a fallocate() közvetlenül és hatékonyan végezzen nullázást, ha a háttértár is támogatja ezt. Az NVMe SSD-k esetében a DEAC bit, a SCSI SSD-knél az UNMAP képesség segítségével a rendszer „zéróként” jelölheti ki a kívánt tartományokat, de ezek nem kerülnek fizikailag kiírásra, így gyorsabb a művelet és szinte semmilyen írási sávszélességet nem igényel.
A fejlesztések során több blokkeszköz-meghajtó (NVMe, SCSI, dm) bővítést kapott annak érdekében, hogy jelezni tudják az unmap write zeroes képességet. A blokk alrendszer új mezőkkel bővült, így a kernel már jelezni tudja, mekkora maximális szektorszámot lehet ilyen módon egyszerre nullázni, hardveres vagy felhasználói szinten.
Az új FALLOC_FL_WRITE_ZEROES zászló és annak haszna a kernelben
A Linux 6.17 kernelben bevezetett FALLOC_FL_WRITE_ZEROES zászló az fallocate() hívás új kiterjesztése, amely az előző nullázási módszereknél hatékonyabb módot kínál. Használatával a fájl adott tartományát úgy nullázhatjuk, hogy a későbbi írások során nem szükséges a fájltérkép újrakonfigurálása vagy további metaadat-műveletek végrehajtása. Ez ideálissá teszi az olyan alkalmazások számára, amelyek előre meghatározott fájlterületekre írnak, különösen ha ezek gyakorian nullázandók, majd újraíródnak.
A fejlesztés az ext4 fájlrendszer és a nyers blokkeszközök támogatását is magában foglalja, így már az első fázisban is széles körű használatra alkalmas. Emellett a STATX_ATTR_WRITE_ZEROES_UNMAP attribútum segítségével lekérdezhető a fájlok ilyen típusú kezelésének támogatottsága is. Ezzel együtt a rendszer a jövőben képes lesz optimalizálni a fájlkezelési műveleteket az alkalmazások és a háttértárak képességei alapján.
Ez a változtatás tehát nem csupán újabb zászló a rendszerhívásban, hanem egy átgondolt fejlesztés, amely a modern hardverek lehetőségeire építve csökkenti a felesleges I/O műveleteket, javítja a fájlkezelés sebességét, és csökkenti az SSD-k élettartamát csökkentő írási terhelést. A fallocate() így még hasznosabb eszközzé válik a teljesítményérzékeny alkalmazások és tárolórendszerek számára.
