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