struct inode *minix_new_inode(const struct inode *dir, int mode, int *error) { struct super_block *sb = dir->i_sb; struct minix_sb_info *sbi = minix_sb(sb); struct inode *inode = new_inode(sb); struct buffer_head * bh; int bits_per_zone = 8 * sb->s_blocksize; unsigned long j; int i; printk(KERN_INFO "bitmap: minix_new_inode\n"); if (!inode) { *error = -ENOMEM; return NULL; } j = bits_per_zone; bh = NULL; *error = -ENOSPC; spin_lock(&bitmap_lock); for (i = 0; i < sbi->s_imap_blocks; i++) { bh = sbi->s_imap[i]; j = minix_find_first_zero_bit(bh->b_data, bits_per_zone); if (j < bits_per_zone) break; } if (!bh || j >= bits_per_zone) { spin_unlock(&bitmap_lock); iput(inode); return NULL; } if (minix_test_and_set_bit(j, bh->b_data)) { /* shouldn't happen */ spin_unlock(&bitmap_lock); printk("minix_new_inode: bit already set\n"); iput(inode); return NULL; } spin_unlock(&bitmap_lock); mark_buffer_dirty(bh); j += i * bits_per_zone; if (!j || j > sbi->s_ninodes) { iput(inode); return NULL; } inode_init_owner(inode, dir, mode); inode->i_ino = j; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; inode->i_blocks = 0; memset(&minix_i(inode)->u, 0, sizeof(minix_i(inode)->u)); insert_inode_hash(inode); mark_inode_dirty(inode); *error = 0; return inode; }
struct minix_inode_info *minix_new_inode(const struct minix_inode_info *dir,mode_t mode,int *error) { struct minix_sb_info *sbi = dir->i_sb; struct minix_inode_info *inode; u8 *ib; unsigned long i,j, bits_per_zone = 8 * sbi->s_blocksize; inode = kalloc(sizeof(*inode)); memset(inode,0,sizeof(*inode)); if(!inode) { *error = -ENOMEM; return NULL; } j = bits_per_zone; *error = -ENOSPC; lock(); for(i = 0;i < sbi->s_imap_blocks;i++) { ib = sbi->s_imap[0]; j = minix_find_first_zero_bit(ib,bits_per_zone); if(j < bits_per_zone) break; } if(!ib || j >= bits_per_zone) { unlock(); kfree(inode); return NULL; } if (minix_test_and_set_bit(j,ib)) { unlock(); mfs_err("bit already set.\n"); kfree(inode); return NULL; } unlock(); j += i * bits_per_zone; if(!j || j > sbi->s_ninodes) { kfree(inode); return NULL; } minix_inode_init_owner(inode,dir,mode); inode->i_inr = j; inode->i_mtime = inode->i_atime = inode->i_ctime = time(NULL); *error = 0; return inode; }