162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/buffer_head.h>
362306a36Sopenharmony_ci#include <linux/slab.h>
462306a36Sopenharmony_ci#include "minix.h"
562306a36Sopenharmony_ci
662306a36Sopenharmony_cienum {DEPTH = 3, DIRECT = 7};	/* Only double indirect */
762306a36Sopenharmony_ci
862306a36Sopenharmony_citypedef u16 block_t;	/* 16 bit, host order */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistatic inline unsigned long block_to_cpu(block_t n)
1162306a36Sopenharmony_ci{
1262306a36Sopenharmony_ci	return n;
1362306a36Sopenharmony_ci}
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic inline block_t cpu_to_block(unsigned long n)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	return n;
1862306a36Sopenharmony_ci}
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic inline block_t *i_data(struct inode *inode)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	return (block_t *)minix_i(inode)->u.i1_data;
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic int block_to_path(struct inode * inode, long block, int offsets[DEPTH])
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	int n = 0;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	if (block < 0) {
3062306a36Sopenharmony_ci		printk("MINIX-fs: block_to_path: block %ld < 0 on dev %pg\n",
3162306a36Sopenharmony_ci			block, inode->i_sb->s_bdev);
3262306a36Sopenharmony_ci		return 0;
3362306a36Sopenharmony_ci	}
3462306a36Sopenharmony_ci	if ((u64)block * BLOCK_SIZE >= inode->i_sb->s_maxbytes)
3562306a36Sopenharmony_ci		return 0;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	if (block < 7) {
3862306a36Sopenharmony_ci		offsets[n++] = block;
3962306a36Sopenharmony_ci	} else if ((block -= 7) < 512) {
4062306a36Sopenharmony_ci		offsets[n++] = 7;
4162306a36Sopenharmony_ci		offsets[n++] = block;
4262306a36Sopenharmony_ci	} else {
4362306a36Sopenharmony_ci		block -= 512;
4462306a36Sopenharmony_ci		offsets[n++] = 8;
4562306a36Sopenharmony_ci		offsets[n++] = block>>9;
4662306a36Sopenharmony_ci		offsets[n++] = block & 511;
4762306a36Sopenharmony_ci	}
4862306a36Sopenharmony_ci	return n;
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#include "itree_common.c"
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciint V1_minix_get_block(struct inode * inode, long block,
5462306a36Sopenharmony_ci			struct buffer_head *bh_result, int create)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	return get_block(inode, block, bh_result, create);
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_civoid V1_minix_truncate(struct inode * inode)
6062306a36Sopenharmony_ci{
6162306a36Sopenharmony_ci	truncate(inode);
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciunsigned V1_minix_blocks(loff_t size, struct super_block *sb)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	return nblocks(size, sb);
6762306a36Sopenharmony_ci}
68