📄 msdos_iget.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"
//////////////////////////////////////////////////////////////////////////////////////////
struct buffer_head * msdos_iget0(int dir_firstsector, struct msdos_dir_entry ** res_dir)
{
struct buffer_head * temp_bh;
struct msdos_dir_entry * temp_de, * temp_de0;
int temp_sector;
*res_dir = NULL;
if (!dir_firstsector)
return NULL;
temp_sector = dir_firstsector + 31;
if (!(temp_bh = sread(temp_sector, &temp_de, 0x80)))
return NULL;
temp_de++;
temp_sector = temp_de->dir_firstsector;
srelse(temp_bh);
msdos_smap0(temp_sector);
if (!(temp_sector = msdos_smap1()))
return NULL;
if (!(temp_bh = sread(temp_sector,&temp_de,0x80)))
return NULL;
temp_de0 = temp_de;
while (1)
{
if (temp_de >= temp_de0 + 16)
{
srelse(temp_bh);
if (!(temp_sector = msdos_smap1()))
return NULL;
if (!(temp_bh = sread(temp_sector,&temp_de,0x80)))
return NULL;
temp_de0 = temp_de;
}
if (temp_de->dir_name[0] == 0)
break;
if ((temp_de->dir_name[0] != 0xe5) && (temp_de->dir_name[0] != 0x05) && (temp_de->dir_firstsector == dir_firstsector))
{
*res_dir = temp_de;
return temp_bh;
}
temp_de++;
}
srelse(temp_bh);
return NULL;
}
struct m_inode * msdos_iget(struct msdos_dir_entry * de, unsigned long inr, int parent_flag)
{
struct m_inode * temp_inode;
struct buffer_head * temp_bh;
struct msdos_dir_entry * temp_de;
int temp_firstsector;
temp_firstsector = de->dir_firstsector;
temp_inode = inode_table;
while (temp_inode < inode_table + NR_INODE) {
if (temp_inode->i_dev == 0 && temp_inode->i_num && temp_inode->i_zone[0] == temp_firstsector) {
temp_inode->i_count++;
return temp_inode;
}
temp_inode++;
}
temp_inode = get_empty_inode();
if (!temp_inode)
return NULL;
if (parent_flag)
{
if (!(temp_bh = msdos_iget0(temp_firstsector,&temp_de)))
{
temp_inode->i_count = 0;
return NULL;
}
else
{
temp_inode->i_mode = temp_de->dir_mode;
temp_inode->i_nlinks = 1;
temp_inode->i_mtime = temp_de->dir_mtime;
temp_inode->i_size = temp_de->dir_size;
temp_inode->i_zone[0] = temp_de->dir_firstsector;
temp_inode->i_dev = 0;
temp_inode->i_num = temp_bh->b_blocknr * BLOCK_SIZE + ((unsigned long)temp_de) - ((unsigned long)(temp_bh->b_data));
srelse(temp_bh);
}
}
else
{
temp_inode->i_mode = de->dir_mode;
temp_inode->i_nlinks = 1;
temp_inode->i_mtime = de->dir_mtime;
temp_inode->i_size = de->dir_size;
temp_inode->i_zone[0] = de->dir_firstsector;
temp_inode->i_dev = 0;
temp_inode->i_num = inr;
}
return temp_inode;
}
void msdos_iput(struct m_inode * inode)
{
struct buffer_head * temp_bh;
struct msdos_dir_entry * temp_de;
unsigned long temp_block, temp_offset;
if (!inode || (!inode->i_count))
return;
inode->i_count--;
if (inode->i_count)
return;
if (inode->i_dirt || !inode->i_nlinks)
{
temp_block = inode->i_num;
temp_offset = temp_block % BLOCK_SIZE;
temp_block = temp_block / BLOCK_SIZE;
if (!(temp_bh = bread(0,temp_block,0x80)))
return;
temp_de = (struct msdos_dir_entry *)(temp_bh->b_data + temp_offset);
if (inode->i_dirt)
{
temp_de->dir_mode = inode->i_mode;
temp_de->dir_mtime = inode->i_mtime;
temp_de->dir_firstsector = inode->i_zone[0];
temp_de->dir_size = inode->i_size;
temp_bh->b_dirt = 1;
inode->i_dirt = 0;
}
if (!inode->i_nlinks)
{
temp_de->dir_name[0] = 0xe5;
temp_bh->b_dirt = 1;
memset(inode,0,sizeof(*inode));
}
brelse(temp_bh);
}
return;
}
/////////////////////////////////////////////////////////////////////
int msdos_read_inode(struct m_inode * inode)
{
struct buffer_head * temp_bh;
struct msdos_dir_entry * temp_de;
unsigned long temp_block, temp_offset;
if (!inode || (inode->i_dev != 0) || (inode->i_num <= MSDOS_ROOT_INO))
return 0;
temp_block = inode->i_num;
temp_offset = temp_block % BLOCK_SIZE;
temp_block = temp_block / BLOCK_SIZE;
if (!(temp_bh = bread(0,temp_block,0x80)))
return 0;
temp_de = (struct msdos_dir_entry *)(temp_bh->b_data + temp_offset);
inode->i_mode = temp_de->dir_mode;
inode->i_nlinks = 1;
inode->i_mtime = temp_de->dir_mtime;
inode->i_size = temp_de->dir_size;
inode->i_zone[0] = temp_de->dir_firstsector;
brelse(temp_bh);
inode->i_dirt = 0;
return 1;
}
int msdos_write_inode(struct m_inode * inode)
{
struct buffer_head * temp_bh;
struct msdos_dir_entry * temp_de;
unsigned long temp_block, temp_offset;
if (!inode || (inode->i_dev != 0) || (inode->i_num <= MSDOS_ROOT_INO))
return 0;
if (inode->i_dirt == 0)
return 1;
temp_block = inode->i_num;
temp_offset = temp_block % BLOCK_SIZE;
temp_block = temp_block / BLOCK_SIZE;
if (!(temp_bh = bread(0,temp_block,0x80)))
return 0;
temp_de = (struct msdos_dir_entry *)(temp_bh->b_data + temp_offset);
temp_de->dir_mode = inode->i_mode;
temp_de->dir_mtime = inode->i_mtime;
temp_de->dir_firstsector = inode->i_zone[0];
temp_de->dir_size = inode->i_size;
temp_bh->b_dirt = 1;
brelse(temp_bh);
inode->i_dirt = 0;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -