0001
0002 #include <linux/buffer_head.h>
0003 #include "minix.h"
0004
0005 enum {DIRECT = 7, DEPTH = 4};
0006
0007 typedef u32 block_t;
0008
0009 static inline unsigned long block_to_cpu(block_t n)
0010 {
0011 return n;
0012 }
0013
0014 static inline block_t cpu_to_block(unsigned long n)
0015 {
0016 return n;
0017 }
0018
0019 static inline block_t *i_data(struct inode *inode)
0020 {
0021 return (block_t *)minix_i(inode)->u.i2_data;
0022 }
0023
0024 #define DIRCOUNT 7
0025 #define INDIRCOUNT(sb) (1 << ((sb)->s_blocksize_bits - 2))
0026
0027 static int block_to_path(struct inode * inode, long block, int offsets[DEPTH])
0028 {
0029 int n = 0;
0030 struct super_block *sb = inode->i_sb;
0031
0032 if (block < 0) {
0033 printk("MINIX-fs: block_to_path: block %ld < 0 on dev %pg\n",
0034 block, sb->s_bdev);
0035 return 0;
0036 }
0037 if ((u64)block * (u64)sb->s_blocksize >= sb->s_maxbytes)
0038 return 0;
0039
0040 if (block < DIRCOUNT) {
0041 offsets[n++] = block;
0042 } else if ((block -= DIRCOUNT) < INDIRCOUNT(sb)) {
0043 offsets[n++] = DIRCOUNT;
0044 offsets[n++] = block;
0045 } else if ((block -= INDIRCOUNT(sb)) < INDIRCOUNT(sb) * INDIRCOUNT(sb)) {
0046 offsets[n++] = DIRCOUNT + 1;
0047 offsets[n++] = block / INDIRCOUNT(sb);
0048 offsets[n++] = block % INDIRCOUNT(sb);
0049 } else {
0050 block -= INDIRCOUNT(sb) * INDIRCOUNT(sb);
0051 offsets[n++] = DIRCOUNT + 2;
0052 offsets[n++] = (block / INDIRCOUNT(sb)) / INDIRCOUNT(sb);
0053 offsets[n++] = (block / INDIRCOUNT(sb)) % INDIRCOUNT(sb);
0054 offsets[n++] = block % INDIRCOUNT(sb);
0055 }
0056 return n;
0057 }
0058
0059 #include "itree_common.c"
0060
0061 int V2_minix_get_block(struct inode * inode, long block,
0062 struct buffer_head *bh_result, int create)
0063 {
0064 return get_block(inode, block, bh_result, create);
0065 }
0066
0067 void V2_minix_truncate(struct inode * inode)
0068 {
0069 truncate(inode);
0070 }
0071
0072 unsigned V2_minix_blocks(loff_t size, struct super_block *sb)
0073 {
0074 return nblocks(size, sb);
0075 }