# YAFFS
YAFFS (Yet Another Flash File System) Yeni Zelanda'daki Whitecliffs şehrinden Charles Manning tarafından Aleph One şirketi için tasarlanmış ve yazılmış bir dosya sistemi türüdür.
Yaffs1, bu dosya sisteminin ilk sürümüdür ve 512 bayt boyutlu (+ 16 byte yedek (OOB; Out-of-Band) alana sahip o andaki NAND yongaları için tasarlanmıştır. İş 2002 yılında başladı ve ilk o yıl serbest bırakıldı. İlk çalışma Toby Churchill Ltd ve Brightstar Engineering tarafından finanse edildi.
Bu eski mikroçip genelde sayfa başına 2 veya 3 yazma döngüsüne izin verir. YAFFS bunun avantajlarından yararlanır: kirli sayfalar, belirli bir yedek alan baytına yazarak işaretlenir. Yeni NAND flaş çipleri, daha sıkı yazma gereksinimleri olan daha büyük sayfalara, ilk 2K sayfaya (+ 64 bayt OOB), daha sonra 4K'ya sahiptir. Bir silme bloğu içindeki her sayfa (128 kilobayt) sıralı sırada yazılmalıdır ve her sayfanın yalnızca bir kez yazılması gerekir.
YAFFS2 bu yeni yongaları barındıracak şekilde tasarlandı. YAFFS1 kaynak koduna dayanıyordu; büyük fark, iç yapıların 512 bayt boyutlandırmanın varsayacak şekilde sabitlenmemesi ve her yazılı sayfaya bir blok sıra numarası yerleştirilmesiydi. Bu şekilde, daha eski sayfalar "bir kez yaz" kuralı ihlal edilmeden mantıksal olarak üzerine yazılabilir. 2003 yılının sonlarında serbest bırakıldı.
YAFFS veri bütünlüğü yüksek önceliğe sahip tutan güçlü bir günlük yapılı dosya sistemidir. İkinci bir YAFFS hedefi yüksek performansdır. YAFFS, çoğu alternatifi geçemez. Ayrıca taşınabilir olacak şekilde tasarlanmıştır ve Linux, Windows CE, pSOS, ECos, ThreadX ve çeşitli özel amaçlı OS'lerde kullanılmıştır. Bir varyant olan 'YAFFS / Direct', gömülü sistem'ler veya bootloader bulunmayan durumlarda kullanılır: aynı çekirdek dosya sistemine sahiptir, ancak hem üst hem de alt düzey koda ve NAND flash donanımına daha basit arayüze sahiptir.
YAFFS kod tabanı, hem GNU Genel Kamu Lisansı kapsamında hem de Aleph One'dan edinilen her bir ürün lisansı altında lisanslıdır.


## YAFFS1.
YAFFS dosya sistemini basitçe flaş hafızasını silmenin ötesinde başlatmak için özel bir prosedür yoktur. Kötü bir blokla karşılaşıldığında YAFFS, bloğun yedek alanının beşinci baytını işaretleyen akıllı ortam şemasını izler. Bu şekilde işaretlenmiş bloklar, bundan sonra ayrılmamış olarak kalır.
Dosya verileri yazmak için, YAFFS başlangıçta Zaman Damgası, ad, yol gibi dosya meta verilerini açıklayan bütün bir sayfada (YAFFS terminolojisinde yığınlar) yazar. Yeni dosyaya benzersiz bir nesne kimlik numarası atanır; dosyadaki her veri yığını, yedek alan içindeki bu benzersiz nesne kimliğini içerecektir. YAFFS, bu parçaların fiziksel konumunun RAM'da bir ağaç yapısını korur. Bir yığın artık geçerli değilse (dosya silinir veya dosyanın bir kısmı üzerine yazılır), YAFFS, yığının yedek alanındaki belirli bir bayt'ı 'kirli' olarak işaretler. Bir blok (32 sayfa) kirli olarak işaretlendiğinde YAFFS bloğu silebilir ve alanı geri alabilir. Dosya sisteminin boş alanı düşük olduğunda, YAFFS bir grup iyi sayfayı yeni bir bloğa birleştirir. YAFFS daha sonra, orijinal blokların her birindeki kirli sayfaların kullandığı alanı geri ister.
YAFFS sistemi NAND flaş aygıtı taktığında, yedek alanını tarayarak geçerli verileri kontrol etmek için her bloğu ziyaret etmelidir. Bu bilgilerle birlikte, bellekte yerleşik ağaç veri yapısını yeniden yapılandırır.


## YAFFS2.
YAFFS2 kendi kavramında YAFFS1'e benzer ve aynı kodun çoğunu paylaşıyor; YAFFS2 kod tabanı YAFFS1 veri formatlarını geriye dönük uyumluluk ile destekler. Temel fark, YAFFS2'nin modern NAND flaşının "bir kez yaz" gerekliliğini karşılamak için önemli çemberleri atlaması gerektiğidir.
YAFFS2, her yeni yazılmış bloğu, monoton olarak artan bir sıra numarası ile işaretler. Parçaların dizisi, blok sıra numarası ve blok içindeki parçanın ofsetinden çıkarılabilir. Böylece, YAFFS2 flaşı taradığında ve aynı ObjectIDs ve ChunkNumbers'a sahip birden fazla parçayı tespit ettiğinde, en büyük sıra numarasını alarak hangisini kullanacağını seçebilir. Verimlilik sebeplerinden dolayı, YAFFS2 ayrıca shrink başlıkları kavramını da getirmektedir. Örneğin, bir dosya daha küçük bir boyuta yeniden boyutlandırıldığında, YAFFS1 etkilenen parçaların hepsini kirli olarak işaretleyecektir - YAFFS2 bunu "bir kez yaz" kuralı nedeniyle yapamaz. Bunun yerine, YAFFS2, o noktadan önceki belirli sayıda sayfanın geçersiz olduğunu belirten bir "shrink başlığı" yazar. Bu, YAFFS2'nin sistem yeniden başlatıldığında dosya sisteminin son durumunu yeniden yapılandırmasını sağlar.
YAFFS2, NAND flaşın daha soyut bir tanımını kullanır ve farklı geometrilere sahip daha çeşitli flash parçaları, kötü blok kullanım kuralları vb. ile kullanılmasını sağlar.
YAFFS2 daha sonra normal takma taramayı atlayan, çok hızlı montaj sürelerine izin veren kontrol noktası desteği ekledi. Performans değişir, ancak 2 GB için 3 saniyelik montaj süresi bildirilmiştir.