bitmap.c (6823B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * linux/fs/minix/bitmap.c 4 * 5 * Copyright (C) 1991, 1992 Linus Torvalds 6 */ 7 8/* 9 * Modified for 680x0 by Hamish Macdonald 10 * Fixed for 680x0 by Andreas Schwab 11 */ 12 13/* bitmap.c contains the code that handles the inode and block bitmaps */ 14 15#include "minix.h" 16#include <linux/buffer_head.h> 17#include <linux/bitops.h> 18#include <linux/sched.h> 19 20static DEFINE_SPINLOCK(bitmap_lock); 21 22/* 23 * bitmap consists of blocks filled with 16bit words 24 * bit set == busy, bit clear == free 25 * endianness is a mess, but for counting zero bits it really doesn't matter... 26 */ 27static __u32 count_free(struct buffer_head *map[], unsigned blocksize, __u32 numbits) 28{ 29 __u32 sum = 0; 30 unsigned blocks = DIV_ROUND_UP(numbits, blocksize * 8); 31 32 while (blocks--) { 33 unsigned words = blocksize / 2; 34 __u16 *p = (__u16 *)(*map++)->b_data; 35 while (words--) 36 sum += 16 - hweight16(*p++); 37 } 38 39 return sum; 40} 41 42void minix_free_block(struct inode *inode, unsigned long block) 43{ 44 struct super_block *sb = inode->i_sb; 45 struct minix_sb_info *sbi = minix_sb(sb); 46 struct buffer_head *bh; 47 int k = sb->s_blocksize_bits + 3; 48 unsigned long bit, zone; 49 50 if (block < sbi->s_firstdatazone || block >= sbi->s_nzones) { 51 printk("Trying to free block not in datazone\n"); 52 return; 53 } 54 zone = block - sbi->s_firstdatazone + 1; 55 bit = zone & ((1<<k) - 1); 56 zone >>= k; 57 if (zone >= sbi->s_zmap_blocks) { 58 printk("minix_free_block: nonexistent bitmap buffer\n"); 59 return; 60 } 61 bh = sbi->s_zmap[zone]; 62 spin_lock(&bitmap_lock); 63 if (!minix_test_and_clear_bit(bit, bh->b_data)) 64 printk("minix_free_block (%s:%lu): bit already cleared\n", 65 sb->s_id, block); 66 spin_unlock(&bitmap_lock); 67 mark_buffer_dirty(bh); 68 return; 69} 70 71int minix_new_block(struct inode * inode) 72{ 73 struct minix_sb_info *sbi = minix_sb(inode->i_sb); 74 int bits_per_zone = 8 * inode->i_sb->s_blocksize; 75 int i; 76 77 for (i = 0; i < sbi->s_zmap_blocks; i++) { 78 struct buffer_head *bh = sbi->s_zmap[i]; 79 int j; 80 81 spin_lock(&bitmap_lock); 82 j = minix_find_first_zero_bit(bh->b_data, bits_per_zone); 83 if (j < bits_per_zone) { 84 minix_set_bit(j, bh->b_data); 85 spin_unlock(&bitmap_lock); 86 mark_buffer_dirty(bh); 87 j += i * bits_per_zone + sbi->s_firstdatazone-1; 88 if (j < sbi->s_firstdatazone || j >= sbi->s_nzones) 89 break; 90 return j; 91 } 92 spin_unlock(&bitmap_lock); 93 } 94 return 0; 95} 96 97unsigned long minix_count_free_blocks(struct super_block *sb) 98{ 99 struct minix_sb_info *sbi = minix_sb(sb); 100 u32 bits = sbi->s_nzones - sbi->s_firstdatazone + 1; 101 102 return (count_free(sbi->s_zmap, sb->s_blocksize, bits) 103 << sbi->s_log_zone_size); 104} 105 106struct minix_inode * 107minix_V1_raw_inode(struct super_block *sb, ino_t ino, struct buffer_head **bh) 108{ 109 int block; 110 struct minix_sb_info *sbi = minix_sb(sb); 111 struct minix_inode *p; 112 113 if (!ino || ino > sbi->s_ninodes) { 114 printk("Bad inode number on dev %s: %ld is out of range\n", 115 sb->s_id, (long)ino); 116 return NULL; 117 } 118 ino--; 119 block = 2 + sbi->s_imap_blocks + sbi->s_zmap_blocks + 120 ino / MINIX_INODES_PER_BLOCK; 121 *bh = sb_bread(sb, block); 122 if (!*bh) { 123 printk("Unable to read inode block\n"); 124 return NULL; 125 } 126 p = (void *)(*bh)->b_data; 127 return p + ino % MINIX_INODES_PER_BLOCK; 128} 129 130struct minix2_inode * 131minix_V2_raw_inode(struct super_block *sb, ino_t ino, struct buffer_head **bh) 132{ 133 int block; 134 struct minix_sb_info *sbi = minix_sb(sb); 135 struct minix2_inode *p; 136 int minix2_inodes_per_block = sb->s_blocksize / sizeof(struct minix2_inode); 137 138 *bh = NULL; 139 if (!ino || ino > sbi->s_ninodes) { 140 printk("Bad inode number on dev %s: %ld is out of range\n", 141 sb->s_id, (long)ino); 142 return NULL; 143 } 144 ino--; 145 block = 2 + sbi->s_imap_blocks + sbi->s_zmap_blocks + 146 ino / minix2_inodes_per_block; 147 *bh = sb_bread(sb, block); 148 if (!*bh) { 149 printk("Unable to read inode block\n"); 150 return NULL; 151 } 152 p = (void *)(*bh)->b_data; 153 return p + ino % minix2_inodes_per_block; 154} 155 156/* Clear the link count and mode of a deleted inode on disk. */ 157 158static void minix_clear_inode(struct inode *inode) 159{ 160 struct buffer_head *bh = NULL; 161 162 if (INODE_VERSION(inode) == MINIX_V1) { 163 struct minix_inode *raw_inode; 164 raw_inode = minix_V1_raw_inode(inode->i_sb, inode->i_ino, &bh); 165 if (raw_inode) { 166 raw_inode->i_nlinks = 0; 167 raw_inode->i_mode = 0; 168 } 169 } else { 170 struct minix2_inode *raw_inode; 171 raw_inode = minix_V2_raw_inode(inode->i_sb, inode->i_ino, &bh); 172 if (raw_inode) { 173 raw_inode->i_nlinks = 0; 174 raw_inode->i_mode = 0; 175 } 176 } 177 if (bh) { 178 mark_buffer_dirty(bh); 179 brelse (bh); 180 } 181} 182 183void minix_free_inode(struct inode * inode) 184{ 185 struct super_block *sb = inode->i_sb; 186 struct minix_sb_info *sbi = minix_sb(inode->i_sb); 187 struct buffer_head *bh; 188 int k = sb->s_blocksize_bits + 3; 189 unsigned long ino, bit; 190 191 ino = inode->i_ino; 192 if (ino < 1 || ino > sbi->s_ninodes) { 193 printk("minix_free_inode: inode 0 or nonexistent inode\n"); 194 return; 195 } 196 bit = ino & ((1<<k) - 1); 197 ino >>= k; 198 if (ino >= sbi->s_imap_blocks) { 199 printk("minix_free_inode: nonexistent imap in superblock\n"); 200 return; 201 } 202 203 minix_clear_inode(inode); /* clear on-disk copy */ 204 205 bh = sbi->s_imap[ino]; 206 spin_lock(&bitmap_lock); 207 if (!minix_test_and_clear_bit(bit, bh->b_data)) 208 printk("minix_free_inode: bit %lu already cleared\n", bit); 209 spin_unlock(&bitmap_lock); 210 mark_buffer_dirty(bh); 211} 212 213struct inode *minix_new_inode(const struct inode *dir, umode_t mode, int *error) 214{ 215 struct super_block *sb = dir->i_sb; 216 struct minix_sb_info *sbi = minix_sb(sb); 217 struct inode *inode = new_inode(sb); 218 struct buffer_head * bh; 219 int bits_per_zone = 8 * sb->s_blocksize; 220 unsigned long j; 221 int i; 222 223 if (!inode) { 224 *error = -ENOMEM; 225 return NULL; 226 } 227 j = bits_per_zone; 228 bh = NULL; 229 *error = -ENOSPC; 230 spin_lock(&bitmap_lock); 231 for (i = 0; i < sbi->s_imap_blocks; i++) { 232 bh = sbi->s_imap[i]; 233 j = minix_find_first_zero_bit(bh->b_data, bits_per_zone); 234 if (j < bits_per_zone) 235 break; 236 } 237 if (!bh || j >= bits_per_zone) { 238 spin_unlock(&bitmap_lock); 239 iput(inode); 240 return NULL; 241 } 242 if (minix_test_and_set_bit(j, bh->b_data)) { /* shouldn't happen */ 243 spin_unlock(&bitmap_lock); 244 printk("minix_new_inode: bit already set\n"); 245 iput(inode); 246 return NULL; 247 } 248 spin_unlock(&bitmap_lock); 249 mark_buffer_dirty(bh); 250 j += i * bits_per_zone; 251 if (!j || j > sbi->s_ninodes) { 252 iput(inode); 253 return NULL; 254 } 255 inode_init_owner(&init_user_ns, inode, dir, mode); 256 inode->i_ino = j; 257 inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode); 258 inode->i_blocks = 0; 259 memset(&minix_i(inode)->u, 0, sizeof(minix_i(inode)->u)); 260 insert_inode_hash(inode); 261 mark_inode_dirty(inode); 262 263 *error = 0; 264 return inode; 265} 266 267unsigned long minix_count_free_inodes(struct super_block *sb) 268{ 269 struct minix_sb_info *sbi = minix_sb(sb); 270 u32 bits = sbi->s_ninodes + 1; 271 272 return count_free(sbi->s_imap, sb->s_blocksize, bits); 273}