📄 bitmap.c
字号:
///////////////////////////////////////////////////////////////////////////
#include "general.h"
#include "clear_block.h"
#include "set_clear_bit.h"
#include "find_first_zero.h"
#include "hd_info_struct.h"
#include "dir_entry.h"
#include "msdos_dir_entry.h"
#include "d_inode.h"
#include "m_inode.h"
#include "buffer_head.h"
#include "fat_cache.h"
#include "file.h"
#include "hd_request_struct.h"
#include "super_block.h"
#include "common_head.h"
///////////////////////////////////////////////////////////////////////////
void free_block(int dev, int block){ struct super_block * sb; struct buffer_head * bh;
if (dev >= nr_super_blocks)
return;
sb = &the_super_block[dev];
if ((block < sb->s_firstdatazone) || (block >= sb->s_nzones))
return; block -= sb->s_firstdatazone;
if (!(bh = sb->s_zmap[block >> 13]))
return;
while (bh->b_lock);
if (clear_bit(block & 8191,bh->b_data))
return;
bh->b_dirt = 1;
return;}int new_block(int dev){ struct super_block * sb;
struct buffer_head * bh, * bh0; int i,j,j0;
if (dev >= nr_super_blocks)
return 0;
sb = &the_super_block[dev];
j = 8192; for (i = 0 ; i<8 ; i++) if ((bh = sb->s_zmap[i]) != NULL){
while (bh->b_lock); if ((j = find_first_zero(bh->b_data)) < 8192) break;
} if ((j >= 8192) || ((j0 = sb->s_firstdatazone + i * 8192 + j) >= sb->s_nzones)) return 0;
if (!(bh0 = bread(dev,j0,0)))
return 0;
clear_block(bh0->b_data);
bh0->b_dirt = 1;
brelse(bh0);
set_bit(j,bh->b_data); bh->b_dirt = 1; return j0;}void free_inode(struct m_inode * inode){ struct super_block * sb; struct buffer_head * bh; if (!inode || (inode->i_dev >= nr_super_blocks))
return;
sb = &the_super_block[inode->i_dev];
if ((inode->i_num < 1) || (inode->i_num > sb->s_ninodes))
return; if (!(bh = sb->s_imap[inode->i_num >> 13]))
return;
while (bh->b_lock); if (clear_bit(inode->i_num & 8191,bh->b_data))
return; bh->b_dirt = 1; memset(inode,0,sizeof(*inode));
return;}struct m_inode * new_inode(int dev){ struct super_block * sb;
struct buffer_head * bh;
struct m_inode * inode; int i,j;
if (dev >= nr_super_blocks)
return NULL;
sb = &the_super_block[dev];
if (!(inode = get_empty_inode())) return NULL;
j = 8192; for (i = 0 ; i < 8 ; i++) if ((bh = sb->s_imap[i]) != NULL){
while (bh->b_lock); if ((j = find_first_zero(bh->b_data)) < 8192) break;
} if ((j >= 8192) || (i * 8192 + j > sb->s_ninodes)) { inode->i_count = 0; return NULL; }
set_bit(j,bh->b_data);
bh->b_dirt = 1;
inode->i_nlinks = 1;
inode->i_mtime = file_datetime; inode->i_dev = dev;
inode->i_num = i * 8192 + j;
inode->i_dirt = 1; return inode;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -