162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/buffer_head.h>
362306a36Sopenharmony_ci#include "minix.h"
462306a36Sopenharmony_ci
562306a36Sopenharmony_cienum {DIRECT = 7, DEPTH = 4};	/* Have triple indirect */
662306a36Sopenharmony_ci
762306a36Sopenharmony_citypedef u32 block_t;	/* 32 bit, host order */
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistatic inline unsigned long block_to_cpu(block_t n)
1062306a36Sopenharmony_ci{
1162306a36Sopenharmony_ci	return n;
1262306a36Sopenharmony_ci}
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic inline block_t cpu_to_block(unsigned long n)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	return n;
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic inline block_t *i_data(struct inode *inode)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	return (block_t *)minix_i(inode)->u.i2_data;
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define DIRCOUNT 7
2562306a36Sopenharmony_ci#define INDIRCOUNT(sb) (1 << ((sb)->s_blocksize_bits - 2))
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic int block_to_path(struct inode * inode, long block, int offsets[DEPTH])
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	int n = 0;
3062306a36Sopenharmony_ci	struct super_block *sb = inode->i_sb;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	if (block < 0) {
3362306a36Sopenharmony_ci		printk("MINIX-fs: block_to_path: block %ld < 0 on dev %pg\n",
3462306a36Sopenharmony_ci			block, sb->s_bdev);
3562306a36Sopenharmony_ci		return 0;
3662306a36Sopenharmony_ci	}
3762306a36Sopenharmony_ci	if ((u64)block * (u64)sb->s_blocksize >= sb->s_maxbytes)
3862306a36Sopenharmony_ci		return 0;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	if (block < DIRCOUNT) {
4162306a36Sopenharmony_ci		offsets[n++] = block;
4262306a36Sopenharmony_ci	} else if ((block -= DIRCOUNT) < INDIRCOUNT(sb)) {
4362306a36Sopenharmony_ci		offsets[n++] = DIRCOUNT;
4462306a36Sopenharmony_ci		offsets[n++] = block;
4562306a36Sopenharmony_ci	} else if ((block -= INDIRCOUNT(sb)) < INDIRCOUNT(sb) * INDIRCOUNT(sb)) {
4662306a36Sopenharmony_ci		offsets[n++] = DIRCOUNT + 1;
4762306a36Sopenharmony_ci		offsets[n++] = block / INDIRCOUNT(sb);
4862306a36Sopenharmony_ci		offsets[n++] = block % INDIRCOUNT(sb);
4962306a36Sopenharmony_ci	} else {
5062306a36Sopenharmony_ci		block -= INDIRCOUNT(sb) * INDIRCOUNT(sb);
5162306a36Sopenharmony_ci		offsets[n++] = DIRCOUNT + 2;
5262306a36Sopenharmony_ci		offsets[n++] = (block / INDIRCOUNT(sb)) / INDIRCOUNT(sb);
5362306a36Sopenharmony_ci		offsets[n++] = (block / INDIRCOUNT(sb)) % INDIRCOUNT(sb);
5462306a36Sopenharmony_ci		offsets[n++] = block % INDIRCOUNT(sb);
5562306a36Sopenharmony_ci	}
5662306a36Sopenharmony_ci	return n;
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#include "itree_common.c"
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ciint V2_minix_get_block(struct inode * inode, long block,
6262306a36Sopenharmony_ci			struct buffer_head *bh_result, int create)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	return get_block(inode, block, bh_result, create);
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_civoid V2_minix_truncate(struct inode * inode)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	truncate(inode);
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciunsigned V2_minix_blocks(loff_t size, struct super_block *sb)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	return nblocks(size, sb);
7562306a36Sopenharmony_ci}
76