EXT檔案系統

2022-02-23 16:44:26 字數 3653 閱讀 8260

1、ext2_add_link的執行過程,函式的定義如下:

int ext2_add_link (struct dentry *dentry, struct inode *inode)

if (de->rec_len == 0)

err = -eexist;

//如果名字匹配

if (ext2_match (namelen, name, de))

goto out_unlock;

name_len = ext2_dir_rec_len(de->name_len);

rec_len = ext2_rec_len_from_disk(de->rec_len);

//取得了乙個沒有用的目錄相

if (!de->inode && rec_len >= reclen)

goto got_it;

//或者說這裡是又乙個間隔能放下該目錄項

if (rec_len >= name_len + reclen)

goto got_it;

//沒有找到就跳轉到下乙個位置

de = (ext2_dirent *) ((char *) de + rec_len);

}unlock_page(page);

ext2_put_page(page);

}bug();

return -einval;

got_it:

//pos有兩種可能,第一是足夠大的間隔前面的目錄項,第二是廢棄的目錄項

pos = page_offset(page) +(char*)de - (char*)page_address(page);

//寫塊

如果是間隔前的目錄項

if (de->inode)

de->name_len = namelen;

memcpy(de->name, name, namelen);

de->inode = cpu_to_le32(inode->i_ino);

ext2_set_de_type (de, inode);

err = ext2_commit_chunk(page, pos, rec_len);

dir->i_mtime = dir->i_ctime = current_time_sec;

ext2_i(dir)->i_flags &= ~ext2_btree_fl;

//標記為臟準備回寫

mark_inode_dirty(dir);

out_put:

ext2_put_page(page);

out:

return err;

out_unlock:

unlock_page(page);

goto out_put;

}

大體的過程就是不斷的遍歷目錄項的塊,從中查詢乙個廢棄的目錄項或者是乙個足夠大的間隔。具體的執行過程從注釋中就很好看懂了。

2、索引節點分配的過程ext2_new_inode,函式的具體定義如下:

//

單純地分配乙個inode

struct inode *ext2_new_inode(struct inode *dir, int mode)

else

group = find_group_other(sb, dir);

if (group == -1)

//設定位圖,這個操作最多把所有的塊組遍歷一次

for (i = 0; i < sbi->s_groups_count; i++)

ino = 0;

repeat_in_this_group:

//找到空閒的位

ino = ext2_find_next_zero_bit((unsigned long *)bitmap_bh->b_data,

ext2_inodes_per_group(sb), ino);

//如果到了最後乙個塊組,那就回去嘗試第乙個塊組

if (ino >= ext2_inodes_per_group(sb))

if (ext2_set_bit_atomic(sb_bgl_lock(sbi, group),ino, bitmap_bh->b_data))

goto repeat_in_this_group;

}goto got;

}err = -enospc;

goto fail;

got:

//設定點陣圖的bh為臟的

mark_buffer_dirty(bitmap_bh);

if (sb->s_flags & ms_synchronous)

sync_dirty_buffer(bitmap_bh);

brelse(bitmap_bh);

ino += group * ext2_inodes_per_group(sb) + 1;

if (ino < ext2_first_ino(sb) || ino > le32_to_cpu(es->s_inodes_count))

percpu_counter_add(&sbi->s_freeinodes_counter, -1);

if (s_isdir(mode))

percpu_counter_inc(&sbi->s_dirs_counter);

spin_lock(sb_bgl_lock(sbi, group));

gdp->bg_free_inodes_count =cpu_to_le16(le16_to_cpu(gdp->bg_free_inodes_count) - 1);

if (s_isdir(mode)) else

spin_unlock(sb_bgl_lock(sbi, group));

sb->s_dirt = 1;

mark_buffer_dirty(bh2);

inode->i_uid = current->fsuid;

if (test_opt (sb, grpid))

inode->i_gid = dir->i_gid;

else

if (dir->i_mode & s_isgid) else

inode->i_gid = current->fsgid;

//設定inode的屬性

allocating inode %lu\n

", inode->i_ino);

ext2_preread_inode(inode);

return inode;

fail_free_drop:

dquot_free_inode(inode);

fail_drop:

dquot_drop(inode);

inode->i_flags |= s_noquota;

inode->i_nlink = 0;

iput(inode);

return err_ptr(err);

fail:

make_bad_inode(inode);

iput(inode);

return err_ptr(err);

}

這個函式總的過程還是很簡單的,先分配vfs中的索引節點(這是最容易的事情了),然後找到適合的塊組,從該塊組的點陣圖中找到空閒位。初始化索引節點的一些屬性。最後把他們都標記成髒的,以便被寫回硬碟。關於找塊組的過程還是挺有意思的。

ext檔案系統

ext檔案系統 1.採用名為索引節點的系統來存放虛擬目錄中所儲存檔案的資訊。2.索引節點系統在每個物理裝置中建立乙個單獨的表 稱為索引節點表 來儲存這些檔案的資訊。3.儲存在虛擬目錄中的每乙個檔案在索引節點表中都有乙個條目 缺點 1.檔案大小不得超過2 gb 2.儲存資料用的塊很容易分散在整個裝置中...

EXT檔案系統

產生背景 linux kernel最初使用的是minix檔案系統,其內部使用的是16位的內部偏移,大小限制在64mb,檔名長度限制在14個字元以內,為了解除這些限制,需要新的檔案系統來替代 起源1992年4月由 r my card 公司專門為linux kernel 所設計,採用中介資料結 meta...

Ext系列檔案系統

1 ext3 ext4檔案系統基本結構 inode table 儲存檔案的元資料 檔案許可權,時間戳,指向block的指標等資訊 data block 儲存檔案的實際資料 linux正統的檔案系統 如ext2 ext3 ext4 乙個檔案由目錄項 inode和資料塊組成 目錄項 包括檔名和inode...