📄 inode.c
字号:
///////////////////////////////////////////////////
#include "general.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 sync_inodes(void){ struct m_inode * inode;
int i; for (i = 0, inode = inode_table; i < NR_INODE ; i++ , inode++)
{
if (inode->i_dirt)
{
if (inode->i_dev) write_inode(inode);
else
msdos_write_inode(inode);
} }
return;}int _bmap(struct m_inode * inode,int block,int create){ struct buffer_head * bh; unsigned long i; if ((block < 0) || (block >= 8 + 256 + 256 * 256)) return 0; if (block < 8) { if (create && !inode->i_zone[block]) if ((inode->i_zone[block] = new_block(inode->i_dev)) != 0){ inode->i_mtime = file_datetime; inode->i_dirt = 1; } return inode->i_zone[block]; } block -= 8; if (block < 256) { if (create && !inode->i_zone[8]) if ((inode->i_zone[8] = new_block(inode->i_dev)) != 0){ inode->i_mtime = file_datetime;
inode->i_dirt = 1; } if (!inode->i_zone[8]) return 0; if (!(bh = bread(inode->i_dev,inode->i_zone[8],0))) return 0; i = ((unsigned long *) (bh->b_data))[block]; if (create && !i) if ((i = new_block(inode->i_dev)) != 0){ ((unsigned long *) (bh->b_data))[block] = i; bh->b_dirt = 1;
inode->i_mtime = file_datetime;
inode->i_dirt = 1; } brelse(bh); return i; } block -= 256; if (create && !inode->i_zone[9]) if ((inode->i_zone[9] = new_block(inode->i_dev)) != 0){ inode->i_mtime = file_datetime;
inode->i_dirt = 1; } if (!inode->i_zone[9]) return 0; if (!(bh = bread(inode->i_dev,inode->i_zone[9],0))) return 0; i = ((unsigned long *)bh->b_data)[block >> 8]; if (create && !i) if ((i = new_block(inode->i_dev)) != 0){ ((unsigned long *) (bh->b_data))[block >> 8] = i; bh->b_dirt = 1;
inode->i_mtime = file_datetime;
inode->i_dirt = 1; } brelse(bh); if (!i) return 0; if (!(bh = bread(inode->i_dev,i,0))) return 0; i = ((unsigned long *)bh->b_data)[block & 255]; if (create && !i) if ((i = new_block(inode->i_dev)) != 0){ ((unsigned long *) (bh->b_data))[block & 255] = i; bh->b_dirt = 1;
inode->i_mtime = file_datetime;
inode->i_dirt = 1; } brelse(bh); return i;}int bmap(struct m_inode * inode,int block){ return _bmap(inode,block,0);}int create_block(struct m_inode * inode, int block){ return _bmap(inode,block,1);}
struct m_inode * get_empty_inode(void)
{
struct m_inode * inode;
int inr;
inr = last_allocated_inode;
do {
if (!inode_table[inr].i_count) {
last_allocated_inode = inr;
inode = inode_table + inr;
memset(inode,0,sizeof(*inode));
inode->i_count = 1;
return inode;
}
inr++;
if (inr == NR_INODE)
inr=0;
} while (inr != last_allocated_inode);
return NULL;
}
void iput(struct m_inode * inode){ if (!inode || (!inode->i_count)) return;
inode->i_count--;
if (inode->i_count)
return;
if (!inode->i_nlinks) { truncate(inode); free_inode(inode);
return; } if (inode->i_dirt) write_inode(inode); return;}struct m_inode * iget(int dev,int nr){ struct m_inode * inode; inode = inode_table; while (inode < inode_table + NR_INODE) { if (inode->i_dev == dev && inode->i_num == nr) { inode->i_count++; return inode; } inode++;
}
inode = get_empty_inode(); if (!inode) return NULL; inode->i_dev = dev; inode->i_num = nr; if (read_inode(inode)) return inode;
else
{
memset(inode,0,sizeof(*inode));
return NULL;
}}int read_inode(struct m_inode * inode){ struct super_block * sb; struct buffer_head * bh; int block;
if (!inode || (inode->i_dev >= nr_super_blocks))
return 0;
sb = &the_super_block[inode->i_dev];
block = 1 + sb->s_imap_blocks + sb->s_zmap_blocks + (inode->i_num - 1) / INODES_PER_BLOCK; bh = bread(inode->i_dev,block,0);
if (bh){ *(struct d_inode *)inode = ((struct d_inode *)bh->b_data)[(inode->i_num - 1) % INODES_PER_BLOCK]; brelse(bh);
inode->i_dirt = 0;
return 1;
}
return 0;}int write_inode(struct m_inode * inode){ struct super_block * sb; struct buffer_head * bh; int block; if (!inode || (inode->i_dev >= nr_super_blocks))
return 0;
sb = &the_super_block[inode->i_dev];
block = 1 + sb->s_imap_blocks + sb->s_zmap_blocks + (inode->i_num - 1) / INODES_PER_BLOCK; bh = bread(inode->i_dev,block,0);
if (bh){ ((struct d_inode *)bh->b_data)[(inode->i_num - 1) % INODES_PER_BLOCK] = *(struct d_inode *)inode; bh->b_dirt = 1;
brelse(bh);
inode->i_dirt = 0;
return 1;
}
return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -