1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * include/linux/bfs_fs.h - BFS data structures on disk. 4*4882a593Smuzhiyun * Copyright (C) 1999-2018 Tigran Aivazian <aivazian.tigran@gmail.com> 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _LINUX_BFS_FS_H 8*4882a593Smuzhiyun #define _LINUX_BFS_FS_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/types.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define BFS_BSIZE_BITS 9 13*4882a593Smuzhiyun #define BFS_BSIZE (1<<BFS_BSIZE_BITS) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define BFS_MAGIC 0x1BADFACE 16*4882a593Smuzhiyun #define BFS_ROOT_INO 2 17*4882a593Smuzhiyun #define BFS_INODES_PER_BLOCK 8 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* SVR4 vnode type values (bfs_inode->i_vtype) */ 20*4882a593Smuzhiyun #define BFS_VDIR 2L 21*4882a593Smuzhiyun #define BFS_VREG 1L 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* BFS inode layout on disk */ 24*4882a593Smuzhiyun struct bfs_inode { 25*4882a593Smuzhiyun __le16 i_ino; 26*4882a593Smuzhiyun __u16 i_unused; 27*4882a593Smuzhiyun __le32 i_sblock; 28*4882a593Smuzhiyun __le32 i_eblock; 29*4882a593Smuzhiyun __le32 i_eoffset; 30*4882a593Smuzhiyun __le32 i_vtype; 31*4882a593Smuzhiyun __le32 i_mode; 32*4882a593Smuzhiyun __le32 i_uid; 33*4882a593Smuzhiyun __le32 i_gid; 34*4882a593Smuzhiyun __le32 i_nlink; 35*4882a593Smuzhiyun __le32 i_atime; 36*4882a593Smuzhiyun __le32 i_mtime; 37*4882a593Smuzhiyun __le32 i_ctime; 38*4882a593Smuzhiyun __u32 i_padding[4]; 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define BFS_NAMELEN 14 42*4882a593Smuzhiyun #define BFS_DIRENT_SIZE 16 43*4882a593Smuzhiyun #define BFS_DIRS_PER_BLOCK 32 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun struct bfs_dirent { 46*4882a593Smuzhiyun __le16 ino; 47*4882a593Smuzhiyun char name[BFS_NAMELEN]; 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* BFS superblock layout on disk */ 51*4882a593Smuzhiyun struct bfs_super_block { 52*4882a593Smuzhiyun __le32 s_magic; 53*4882a593Smuzhiyun __le32 s_start; 54*4882a593Smuzhiyun __le32 s_end; 55*4882a593Smuzhiyun __le32 s_from; 56*4882a593Smuzhiyun __le32 s_to; 57*4882a593Smuzhiyun __s32 s_bfrom; 58*4882a593Smuzhiyun __s32 s_bto; 59*4882a593Smuzhiyun char s_fsname[6]; 60*4882a593Smuzhiyun char s_volume[6]; 61*4882a593Smuzhiyun __u32 s_padding[118]; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define BFS_OFF2INO(offset) \ 66*4882a593Smuzhiyun ((((offset) - BFS_BSIZE) / sizeof(struct bfs_inode)) + BFS_ROOT_INO) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define BFS_INO2OFF(ino) \ 69*4882a593Smuzhiyun ((__u32)(((ino) - BFS_ROOT_INO) * sizeof(struct bfs_inode)) + BFS_BSIZE) 70*4882a593Smuzhiyun #define BFS_NZFILESIZE(ip) \ 71*4882a593Smuzhiyun ((le32_to_cpu((ip)->i_eoffset) + 1) - le32_to_cpu((ip)->i_sblock) * BFS_BSIZE) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #define BFS_FILESIZE(ip) \ 74*4882a593Smuzhiyun ((ip)->i_sblock == 0 ? 0 : BFS_NZFILESIZE(ip)) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define BFS_FILEBLOCKS(ip) \ 77*4882a593Smuzhiyun ((ip)->i_sblock == 0 ? 0 : (le32_to_cpu((ip)->i_eblock) + 1) - le32_to_cpu((ip)->i_sblock)) 78*4882a593Smuzhiyun #define BFS_UNCLEAN(bfs_sb, sb) \ 79*4882a593Smuzhiyun ((le32_to_cpu(bfs_sb->s_from) != -1) && (le32_to_cpu(bfs_sb->s_to) != -1) && !(sb->s_flags & SB_RDONLY)) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #endif /* _LINUX_BFS_FS_H */ 83