1 // SPDX-License-Identifier: GPL-2.0-only
4 * BFS superblock and inode operations.
5 * Copyright (C) 1999-2018 Tigran Aivazian <aivazian.tigran@gmail.com>
6 * From fs/minix, Copyright (C) 1991, 1992 Linus Torvalds.
7 * Made endianness-clean by Andrew Stribblehill <ads@wompom.org>, 2005.
10 #include <linux/module.h>
12 #include <linux/slab.h>
13 #include <linux/init.h>
15 #include <linux/buffer_head.h>
16 #include <linux/vfs.h>
17 #include <linux/writeback.h>
18 #include <linux/uio.h>
19 #include <linux/uaccess.h>
22 MODULE_AUTHOR("Tigran Aivazian <aivazian.tigran@gmail.com>");
23 MODULE_DESCRIPTION("SCO UnixWare BFS filesystem for Linux");
24 MODULE_LICENSE("GPL");
29 #define dprintf(x...) printf(x)
34 struct inode
*bfs_iget(struct super_block
*sb
, unsigned long ino
)
38 struct buffer_head
*bh
;
41 inode
= iget_locked(sb
, ino
);
43 return ERR_PTR(-ENOMEM
);
44 if (!(inode
->i_state
& I_NEW
))
47 if ((ino
< BFS_ROOT_INO
) || (ino
> BFS_SB(inode
->i_sb
)->si_lasti
)) {
48 printf("Bad inode number %s:%08lx\n", inode
->i_sb
->s_id
, ino
);
52 block
= (ino
- BFS_ROOT_INO
) / BFS_INODES_PER_BLOCK
+ 1;
53 bh
= sb_bread(inode
->i_sb
, block
);
55 printf("Unable to read inode %s:%08lx\n", inode
->i_sb
->s_id
,
60 off
= (ino
- BFS_ROOT_INO
) % BFS_INODES_PER_BLOCK
;
61 di
= (struct bfs_inode
*)bh
->b_data
+ off
;
63 inode
->i_mode
= 0x0000FFFF & le32_to_cpu(di
->i_mode
);
64 if (le32_to_cpu(di
->i_vtype
) == BFS_VDIR
) {
65 inode
->i_mode
|= S_IFDIR
;
66 inode
->i_op
= &bfs_dir_inops
;
67 inode
->i_fop
= &bfs_dir_operations
;
68 } else if (le32_to_cpu(di
->i_vtype
) == BFS_VREG
) {
69 inode
->i_mode
|= S_IFREG
;
70 inode
->i_op
= &bfs_file_inops
;
71 inode
->i_fop
= &bfs_file_operations
;
72 inode
->i_mapping
->a_ops
= &bfs_aops
;
75 BFS_I(inode
)->i_sblock
= le32_to_cpu(di
->i_sblock
);
76 BFS_I(inode
)->i_eblock
= le32_to_cpu(di
->i_eblock
);
77 BFS_I(inode
)->i_dsk_ino
= le16_to_cpu(di
->i_ino
);
78 i_uid_write(inode
, le32_to_cpu(di
->i_uid
));
79 i_gid_write(inode
, le32_to_cpu(di
->i_gid
));
80 set_nlink(inode
, le32_to_cpu(di
->i_nlink
));
81 inode
->i_size
= BFS_FILESIZE(di
);
82 inode
->i_blocks
= BFS_FILEBLOCKS(di
);
83 inode_set_atime(inode
, le32_to_cpu(di
->i_atime
), 0);
84 inode_set_mtime(inode
, le32_to_cpu(di
->i_mtime
), 0);
85 inode_set_ctime(inode
, le32_to_cpu(di
->i_ctime
), 0);
88 unlock_new_inode(inode
);
96 static struct bfs_inode
*find_inode(struct super_block
*sb
, u16 ino
, struct buffer_head
**p
)
98 if ((ino
< BFS_ROOT_INO
) || (ino
> BFS_SB(sb
)->si_lasti
)) {
99 printf("Bad inode number %s:%08x\n", sb
->s_id
, ino
);
100 return ERR_PTR(-EIO
);
105 *p
= sb_bread(sb
, 1 + ino
/ BFS_INODES_PER_BLOCK
);
107 printf("Unable to read inode %s:%08x\n", sb
->s_id
, ino
);
108 return ERR_PTR(-EIO
);
111 return (struct bfs_inode
*)(*p
)->b_data
+ ino
% BFS_INODES_PER_BLOCK
;
114 static int bfs_write_inode(struct inode
*inode
, struct writeback_control
*wbc
)
116 struct bfs_sb_info
*info
= BFS_SB(inode
->i_sb
);
117 unsigned int ino
= (u16
)inode
->i_ino
;
118 unsigned long i_sblock
;
119 struct bfs_inode
*di
;
120 struct buffer_head
*bh
;
123 dprintf("ino=%08x\n", ino
);
125 di
= find_inode(inode
->i_sb
, ino
, &bh
);
129 mutex_lock(&info
->bfs_lock
);
131 if (ino
== BFS_ROOT_INO
)
132 di
->i_vtype
= cpu_to_le32(BFS_VDIR
);
134 di
->i_vtype
= cpu_to_le32(BFS_VREG
);
136 di
->i_ino
= cpu_to_le16(ino
);
137 di
->i_mode
= cpu_to_le32(inode
->i_mode
);
138 di
->i_uid
= cpu_to_le32(i_uid_read(inode
));
139 di
->i_gid
= cpu_to_le32(i_gid_read(inode
));
140 di
->i_nlink
= cpu_to_le32(inode
->i_nlink
);
141 di
->i_atime
= cpu_to_le32(inode_get_atime_sec(inode
));
142 di
->i_mtime
= cpu_to_le32(inode_get_mtime_sec(inode
));
143 di
->i_ctime
= cpu_to_le32(inode_get_ctime_sec(inode
));
144 i_sblock
= BFS_I(inode
)->i_sblock
;
145 di
->i_sblock
= cpu_to_le32(i_sblock
);
146 di
->i_eblock
= cpu_to_le32(BFS_I(inode
)->i_eblock
);
147 di
->i_eoffset
= cpu_to_le32(i_sblock
* BFS_BSIZE
+ inode
->i_size
- 1);
149 mark_buffer_dirty(bh
);
150 if (wbc
->sync_mode
== WB_SYNC_ALL
) {
151 sync_dirty_buffer(bh
);
152 if (buffer_req(bh
) && !buffer_uptodate(bh
))
156 mutex_unlock(&info
->bfs_lock
);
160 static void bfs_evict_inode(struct inode
*inode
)
162 unsigned long ino
= inode
->i_ino
;
163 struct bfs_inode
*di
;
164 struct buffer_head
*bh
;
165 struct super_block
*s
= inode
->i_sb
;
166 struct bfs_sb_info
*info
= BFS_SB(s
);
167 struct bfs_inode_info
*bi
= BFS_I(inode
);
169 dprintf("ino=%08lx\n", ino
);
171 truncate_inode_pages_final(&inode
->i_data
);
172 invalidate_inode_buffers(inode
);
178 di
= find_inode(s
, inode
->i_ino
, &bh
);
182 mutex_lock(&info
->bfs_lock
);
183 /* clear on-disk inode */
184 memset(di
, 0, sizeof(struct bfs_inode
));
185 mark_buffer_dirty(bh
);
190 info
->si_freeb
+= bi
->i_eblock
+ 1 - bi
->i_sblock
;
192 clear_bit(ino
, info
->si_imap
);
193 bfs_dump_imap("evict_inode", s
);
197 * If this was the last file, make the previous block
198 * "last block of the last file" even if there is no
199 * real file there, saves us 1 gap.
201 if (info
->si_lf_eblk
== bi
->i_eblock
)
202 info
->si_lf_eblk
= bi
->i_sblock
- 1;
203 mutex_unlock(&info
->bfs_lock
);
206 static void bfs_put_super(struct super_block
*s
)
208 struct bfs_sb_info
*info
= BFS_SB(s
);
213 mutex_destroy(&info
->bfs_lock
);
218 static int bfs_statfs(struct dentry
*dentry
, struct kstatfs
*buf
)
220 struct super_block
*s
= dentry
->d_sb
;
221 struct bfs_sb_info
*info
= BFS_SB(s
);
222 u64 id
= huge_encode_dev(s
->s_bdev
->bd_dev
);
223 buf
->f_type
= BFS_MAGIC
;
224 buf
->f_bsize
= s
->s_blocksize
;
225 buf
->f_blocks
= info
->si_blocks
;
226 buf
->f_bfree
= buf
->f_bavail
= info
->si_freeb
;
227 buf
->f_files
= info
->si_lasti
+ 1 - BFS_ROOT_INO
;
228 buf
->f_ffree
= info
->si_freei
;
229 buf
->f_fsid
= u64_to_fsid(id
);
230 buf
->f_namelen
= BFS_NAMELEN
;
234 static struct kmem_cache
*bfs_inode_cachep
;
236 static struct inode
*bfs_alloc_inode(struct super_block
*sb
)
238 struct bfs_inode_info
*bi
;
239 bi
= alloc_inode_sb(sb
, bfs_inode_cachep
, GFP_KERNEL
);
242 return &bi
->vfs_inode
;
245 static void bfs_free_inode(struct inode
*inode
)
247 kmem_cache_free(bfs_inode_cachep
, BFS_I(inode
));
250 static void init_once(void *foo
)
252 struct bfs_inode_info
*bi
= foo
;
254 inode_init_once(&bi
->vfs_inode
);
257 static int __init
init_inodecache(void)
259 bfs_inode_cachep
= kmem_cache_create("bfs_inode_cache",
260 sizeof(struct bfs_inode_info
),
261 0, (SLAB_RECLAIM_ACCOUNT
|
264 if (bfs_inode_cachep
== NULL
)
269 static void destroy_inodecache(void)
272 * Make sure all delayed rcu free inodes are flushed before we
276 kmem_cache_destroy(bfs_inode_cachep
);
279 static const struct super_operations bfs_sops
= {
280 .alloc_inode
= bfs_alloc_inode
,
281 .free_inode
= bfs_free_inode
,
282 .write_inode
= bfs_write_inode
,
283 .evict_inode
= bfs_evict_inode
,
284 .put_super
= bfs_put_super
,
285 .statfs
= bfs_statfs
,
288 void bfs_dump_imap(const char *prefix
, struct super_block
*s
)
292 char *tmpbuf
= (char *)get_zeroed_page(GFP_KERNEL
);
296 for (i
= BFS_SB(s
)->si_lasti
; i
>= 0; i
--) {
297 if (i
> PAGE_SIZE
- 100) break;
298 if (test_bit(i
, BFS_SB(s
)->si_imap
))
303 printf("%s: lasti=%08lx <%s>\n", prefix
, BFS_SB(s
)->si_lasti
, tmpbuf
);
304 free_page((unsigned long)tmpbuf
);
308 static int bfs_fill_super(struct super_block
*s
, void *data
, int silent
)
310 struct buffer_head
*bh
, *sbh
;
311 struct bfs_super_block
*bfs_sb
;
314 struct bfs_sb_info
*info
;
316 unsigned long i_sblock
, i_eblock
, i_eoff
, s_size
;
318 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
321 mutex_init(&info
->bfs_lock
);
324 s
->s_time_max
= U32_MAX
;
326 sb_set_blocksize(s
, BFS_BSIZE
);
328 sbh
= sb_bread(s
, 0);
331 bfs_sb
= (struct bfs_super_block
*)sbh
->b_data
;
332 if (le32_to_cpu(bfs_sb
->s_magic
) != BFS_MAGIC
) {
334 printf("No BFS filesystem on %s (magic=%08x)\n", s
->s_id
, le32_to_cpu(bfs_sb
->s_magic
));
337 if (BFS_UNCLEAN(bfs_sb
, s
) && !silent
)
338 printf("%s is unclean, continuing\n", s
->s_id
);
340 s
->s_magic
= BFS_MAGIC
;
342 if (le32_to_cpu(bfs_sb
->s_start
) > le32_to_cpu(bfs_sb
->s_end
) ||
343 le32_to_cpu(bfs_sb
->s_start
) < sizeof(struct bfs_super_block
) + sizeof(struct bfs_dirent
)) {
344 printf("Superblock is corrupted on %s\n", s
->s_id
);
348 info
->si_lasti
= (le32_to_cpu(bfs_sb
->s_start
) - BFS_BSIZE
) / sizeof(struct bfs_inode
) + BFS_ROOT_INO
- 1;
349 if (info
->si_lasti
== BFS_MAX_LASTI
)
350 printf("NOTE: filesystem %s was created with 512 inodes, the real maximum is 511, mounting anyway\n", s
->s_id
);
351 else if (info
->si_lasti
> BFS_MAX_LASTI
) {
352 printf("Impossible last inode number %lu > %d on %s\n", info
->si_lasti
, BFS_MAX_LASTI
, s
->s_id
);
355 for (i
= 0; i
< BFS_ROOT_INO
; i
++)
356 set_bit(i
, info
->si_imap
);
359 inode
= bfs_iget(s
, BFS_ROOT_INO
);
361 ret
= PTR_ERR(inode
);
364 s
->s_root
= d_make_root(inode
);
370 info
->si_blocks
= (le32_to_cpu(bfs_sb
->s_end
) + 1) >> BFS_BSIZE_BITS
;
371 info
->si_freeb
= (le32_to_cpu(bfs_sb
->s_end
) + 1 - le32_to_cpu(bfs_sb
->s_start
)) >> BFS_BSIZE_BITS
;
373 info
->si_lf_eblk
= 0;
375 /* can we read the last block? */
376 bh
= sb_bread(s
, info
->si_blocks
- 1);
378 printf("Last block not available on %s: %lu\n", s
->s_id
, info
->si_blocks
- 1);
385 for (i
= BFS_ROOT_INO
; i
<= info
->si_lasti
; i
++) {
386 struct bfs_inode
*di
;
387 int block
= (i
- BFS_ROOT_INO
) / BFS_INODES_PER_BLOCK
+ 1;
388 int off
= (i
- BFS_ROOT_INO
) % BFS_INODES_PER_BLOCK
;
389 unsigned long eblock
;
393 bh
= sb_bread(s
, block
);
399 di
= (struct bfs_inode
*)bh
->b_data
+ off
;
401 /* test if filesystem is not corrupted */
403 i_eoff
= le32_to_cpu(di
->i_eoffset
);
404 i_sblock
= le32_to_cpu(di
->i_sblock
);
405 i_eblock
= le32_to_cpu(di
->i_eblock
);
406 s_size
= le32_to_cpu(bfs_sb
->s_end
);
408 if (i_sblock
> info
->si_blocks
||
409 i_eblock
> info
->si_blocks
||
410 i_sblock
> i_eblock
||
411 (i_eoff
!= le32_to_cpu(-1) && i_eoff
> s_size
) ||
412 i_sblock
* BFS_BSIZE
> i_eoff
) {
414 printf("Inode 0x%08x corrupted on %s\n", i
, s
->s_id
);
425 set_bit(i
, info
->si_imap
);
426 info
->si_freeb
-= BFS_FILEBLOCKS(di
);
428 eblock
= le32_to_cpu(di
->i_eblock
);
429 if (eblock
> info
->si_lf_eblk
)
430 info
->si_lf_eblk
= eblock
;
434 bfs_dump_imap("fill_super", s
);
443 mutex_destroy(&info
->bfs_lock
);
449 static struct dentry
*bfs_mount(struct file_system_type
*fs_type
,
450 int flags
, const char *dev_name
, void *data
)
452 return mount_bdev(fs_type
, flags
, dev_name
, data
, bfs_fill_super
);
455 static struct file_system_type bfs_fs_type
= {
456 .owner
= THIS_MODULE
,
459 .kill_sb
= kill_block_super
,
460 .fs_flags
= FS_REQUIRES_DEV
,
462 MODULE_ALIAS_FS("bfs");
464 static int __init
init_bfs_fs(void)
466 int err
= init_inodecache();
469 err
= register_filesystem(&bfs_fs_type
);
474 destroy_inodecache();
479 static void __exit
exit_bfs_fs(void)
481 unregister_filesystem(&bfs_fs_type
);
482 destroy_inodecache();
485 module_init(init_bfs_fs
)
486 module_exit(exit_bfs_fs
)