From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A88923081D6; Mon, 13 Apr 2026 15:11:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776093119; cv=none; b=M5Rc7APRBPQBI3VNmcoO1CGsV6OivkTEUsgB1QH2nmuiDvPfgHRGAIRFuAYOTMPSakqEQ/tbMp29kjK4cIt4Xz0Zys5TYCrAHP0bruSp33BOzWRPT1U4tEzz43wODTMfyCikkxpcKq02t94UrcAai7fYZwbHSQLnhCaFNaxqjHI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776093119; c=relaxed/simple; bh=eJD7egjFYJiVC9BU14DvlaovLNojvYSBgIpOLcttoGU=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=WZIFRJRDwNVzepHA1jXbk3/SfIZCgRtBpaVj20X6WczldaGqruNZ9q5x1po9H9l0EBgARJ5MhBpPk04YKEqSJakcCMEEK9Jb430fjUfLkMa9pJhfGZyMQU9xJ/uz50BOMOdQh0lAlCEe7D+WAG8jeDb8LHgXhXKRaKtzfSrBUds= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MDWFragv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MDWFragv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 41F74C2BCAF; Mon, 13 Apr 2026 15:11:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1776093119; bh=eJD7egjFYJiVC9BU14DvlaovLNojvYSBgIpOLcttoGU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=MDWFragvDzZjBJa/d1imGKLSXvNqur1HHWiwHfi1FlMZ5x0rIs9Nz9lV6eq5CKMx2 gK1tZqVu1KVQG36vLt6TmYYyVPsx+q3q2gsCYyceEDKqfrwy4tmFPoqmvSvVZyR4FT 6MawS3IyFVmbd9ntKxDDaxHVJsKPA1PHXXrNjL+nE/PcR6hwLkRcUO1EcGVhXQHVyo yOqg2o25WUgVpfJRLbdcbB0a8CX7Hl2UfUMAzdjqZBkdKCVv+4crERc27YsdJAb8vi kwdBDS1wRFKLmbITffAL2g+3WcbHKDwN+q9tpWFWQlOxYinxWZuOmhV4PC3sS4XG+0 sreeZ63GVKo2g== Date: Mon, 13 Apr 2026 08:11:58 -0700 From: "Darrick J. Wong" To: Aurelien DESBRIERES Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org Subject: Re: [RFC PATCH 01/10] ftrfs: add on-disk format and in-memory data structures Message-ID: <20260413151158.GW6202@frogsfrogsfrogs> References: <20260413142357.515792-1-aurelien@hackers.camp> <20260413142357.515792-2-aurelien@hackers.camp> Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20260413142357.515792-2-aurelien@hackers.camp> On Mon, Apr 13, 2026 at 04:23:47PM +0200, Aurelien DESBRIERES wrote: > From: Aurélien DESBRIERES > > Add the core header defining FTRFS on-disk layout and in-memory > VFS structures. > > On-disk layout: > Block 0 : superblock (magic 0x46545246, CRC32-protected) > Block 1..N : inode table (128 bytes/inode, CRC32 per inode) > Block N+1..end : data blocks (CRC32 per block, RS FEC planned) > > Structures: > ftrfs_super_block : on-disk superblock > ftrfs_inode : on-disk inode (12 direct + 1 indirect + 1 dindirect) > ftrfs_dir_entry : on-disk directory entry (256-byte name) > ftrfs_sb_info : in-memory superblock info (VFS sb->s_fs_info) > ftrfs_inode_info : in-memory inode (embedded VFS inode) > > FTRFS targets POSIX-compatible block devices (MRAM, NOR flash, eMMC) > for use in radiation-intensive environments (space applications). > > Signed-off-by: Aurélien DESBRIERES > --- > fs/ftrfs/ftrfs.h | 168 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 168 insertions(+) > create mode 100644 fs/ftrfs/ftrfs.h > > diff --git a/fs/ftrfs/ftrfs.h b/fs/ftrfs/ftrfs.h > new file mode 100644 > index 000000000..82502c9fb > --- /dev/null > +++ b/fs/ftrfs/ftrfs.h > @@ -0,0 +1,168 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * FTRFS — Fault-Tolerant Radiation-Robust Filesystem > + * Based on: Fuchs, Langer, Trinitis — ARCS 2015 > + * > + * Author: roastercode - Aurelien DESBRIERES > + */ > + > +#ifndef _FTRFS_H > +#define _FTRFS_H > + > +#include > +#include > +#include > + > +/* Magic number: 'FTRF' */ > +#define FTRFS_MAGIC 0x46545246 > + > +/* Block size: 4096 bytes */ > +#define FTRFS_BLOCK_SIZE 4096 > +#define FTRFS_BLOCK_SHIFT 12 > + > +/* RS FEC: 16 parity bytes per 239-byte subblock (RS(255,239)) */ > +#define FTRFS_RS_PARITY 16 > +#define FTRFS_SUBBLOCK_DATA 239 > +#define FTRFS_SUBBLOCK_TOTAL (FTRFS_SUBBLOCK_DATA + FTRFS_RS_PARITY) > + > +/* Filesystem limits */ > +#define FTRFS_MAX_FILENAME 255 > +#define FTRFS_DIRECT_BLOCKS 12 > +#define FTRFS_INDIRECT_BLOCKS 1 > +#define FTRFS_DINDIRECT_BLOCKS 1 > + > +/* > + * On-disk superblock — block 0 > + * Total size: fits in one 4096-byte block > + */ > +struct ftrfs_super_block { > + __le32 s_magic; /* FTRFS_MAGIC */ > + __le32 s_block_size; /* Block size in bytes */ > + __le64 s_block_count; /* Total blocks */ > + __le64 s_free_blocks; /* Free blocks */ > + __le64 s_inode_count; /* Total inodes */ > + __le64 s_free_inodes; /* Free inodes */ > + __le64 s_inode_table_blk; /* Block where inode table starts */ > + __le64 s_data_start_blk; /* First data block */ > + __le32 s_version; /* Filesystem version */ > + __le32 s_flags; /* Flags */ > + __le32 s_crc32; /* CRC32 of this superblock */ > + __u8 s_uuid[16]; /* UUID */ > + __u8 s_label[32]; /* Volume label */ > + __u8 s_pad[3948]; /* Padding to 4096 bytes */ > +} __packed; > + > +/* > + * On-disk inode > + * Size: 128 bytes > + */ > +struct ftrfs_inode { > + __le16 i_mode; /* File mode */ > + __le16 i_uid; /* Owner UID */ > + __le16 i_gid; /* Owner GID */ > + __le16 i_nlink; /* Hard link count */ https://www.tomshardware.com/service-providers/web-hosting/friends-gif-cripples-website-discussion-platform-backup-with-377-gigabytes-of-rachels-happy-dance-1-6mb-animation-was-replicated-246-173-times-breaking-filesystem-limit > + __le64 i_size; /* File size in bytes */ > + __le64 i_atime; /* Access time (ns) */ > + __le64 i_mtime; /* Modification time (ns) */ > + __le64 i_ctime; /* Change time (ns) */ > + __le32 i_blocks; /* Block count */ > + __le32 i_flags; /* Inode flags */ > + __le64 i_direct[FTRFS_DIRECT_BLOCKS]; /* Direct block pointers */ > + __le64 i_indirect; /* Single indirect */ > + __le64 i_dindirect; /* Double indirect */ I don't see a block header for indirect blocks, so I guess this filesystem only supports mapping ... ($block_size / 4) ^ 2 + ($block_size / 4) + 12 blocks? IOWs, 1049612 of 4KiB blocks, or about 4GB of data? Why is isize 64-bit then? --D > + __le32 i_crc32; /* CRC32 of inode */ > + __u8 i_pad[2]; /* Padding to 128 bytes */ > +} __packed; > + > +/* Inode flags */ > +#define FTRFS_INODE_FL_RS_ENABLED 0x0001 /* RS FEC enabled */ > +#define FTRFS_INODE_FL_VERIFIED 0x0002 /* Integrity verified */ > + > +/* > + * On-disk directory entry > + */ > +struct ftrfs_dir_entry { > + __le64 d_ino; /* Inode number */ > + __le16 d_rec_len; /* Record length */ > + __u8 d_name_len; /* Name length */ > + __u8 d_file_type; /* File type */ > + char d_name[FTRFS_MAX_FILENAME + 1]; /* Filename */ > +} __packed; > + > +/* > + * In-memory superblock info (stored in sb->s_fs_info) > + */ > +struct ftrfs_sb_info { > + /* Block allocator */ > + unsigned long *s_block_bitmap; /* In-memory free block bitmap */ > + unsigned long s_nblocks; /* Number of data blocks */ > + unsigned long s_data_start; /* First data block number */ > + struct ftrfs_super_block *s_ftrfs_sb; /* On-disk superblock copy */ > + struct buffer_head *s_sbh; /* Buffer head for superblock */ > + spinlock_t s_lock; /* Superblock lock */ > + unsigned long s_free_blocks; > + unsigned long s_free_inodes; > +}; > + > +/* > + * In-memory inode info (embedded in VFS inode via container_of) > + */ > +struct ftrfs_inode_info { > + __le64 i_direct[FTRFS_DIRECT_BLOCKS]; > + __le64 i_indirect; > + __le64 i_dindirect; > + __u32 i_flags; > + struct inode vfs_inode; /* Must be last */ > +}; > + > +static inline struct ftrfs_inode_info *FTRFS_I(struct inode *inode) > +{ > + return container_of(inode, struct ftrfs_inode_info, vfs_inode); > +} > + > +static inline struct ftrfs_sb_info *FTRFS_SB(struct super_block *sb) > +{ > + return sb->s_fs_info; > +} > + > +/* Function prototypes */ > +/* super.c */ > +int ftrfs_fill_super(struct super_block *sb, struct fs_context *fc); > + > +/* inode.c */ > +struct inode *ftrfs_iget(struct super_block *sb, unsigned long ino); > +struct inode *ftrfs_new_inode(struct inode *dir, umode_t mode); > + > +/* dir.c */ > +extern const struct file_operations ftrfs_dir_operations; > +extern const struct inode_operations ftrfs_dir_inode_operations; > + > +/* file.c */ > +extern const struct file_operations ftrfs_file_operations; > +extern const struct inode_operations ftrfs_file_inode_operations; > + > +/* edac.c */ > +__u32 ftrfs_crc32(const void *buf, size_t len); > +int ftrfs_rs_encode(uint8_t *data, uint8_t *parity); > +int ftrfs_rs_decode(uint8_t *data, uint8_t *parity); > + > +/* block.c */ > + > +#endif /* _FTRFS_H */ > + > +/* > + */ > + > +/* alloc.c */ > +int ftrfs_setup_bitmap(struct super_block *sb); > +void ftrfs_destroy_bitmap(struct super_block *sb); > +u64 ftrfs_alloc_block(struct super_block *sb); > +void ftrfs_free_block(struct super_block *sb, u64 block); > +u64 ftrfs_alloc_inode_num(struct super_block *sb); > + > +/* dir.c */ > +struct dentry *ftrfs_lookup(struct inode *dir, struct dentry *dentry, > + unsigned int flags); > + > +/* namei.c */ > +int ftrfs_write_inode(struct inode *inode, struct writeback_control *wbc); > -- > 2.52.0 > >