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...