2016-06-13 52 views
-1

在ext2文件系統中創建文件的過程如何?Ext2 - 如何創建文件

我想做一個簡單的系統調用,它需要一個路徑並創建給定的文件 - 如觸摸。

例如,代碼:

int main(void) 
{ 
    syscall(MY_SYSCALL_NUMBER, "/tmp/file"); 
} 

應該創建一個在/ tmp中名爲 「文件」 的文件。

現在系統調用本身應該如何工作?

我的工作至今(我中省略錯誤在這裏檢查可讀性):

asmlinkage long sys_ccp(const char __user *arg) 
{ 
    struct path path; 
    struct inode *new_inode; 
    struct qstring qname; 

    //ommited copy from user for simplicity 
    qname.name = arg; 
    qname.len = length(arg); 

    kern_path(src, LOOKUP_FOLLOW, &path); 
    new_inode = ext2_new_inode(path.dentry->d_parent->d_inode, S_IFREG, &qname); 
} 

這似乎是工作(我可以在一個inode分配日誌中看到),但是,當我打電話ls上目錄我看不到那裏的文件。

我的想法是新的索引節點添加到目錄的struct dentry,所以我加了這段代碼:

struct dentry *new_dentry; 

new_dentry = d_alloc(path.dentry->d_parent, &qname); 
d_instantiate(new_dentry, new_inode); 

然而,這似乎仍然沒有工作(我無法看到使用ls文件)。

如何正確實現這個系統調用,我錯過了什麼?

編輯: 關於R ..答案 - 這個系統調用的purpuse是玩弄ext2並瞭解它的設計,所以我們可以假設路徑總是有效的,文件系統確實是ext2等等。

+0

如果您沒有回答或問題已關閉,請不要重新發布問題!相反,如果它現在符合網站規則,請修改原件並要求重新打開。見[問]。 – Olaf

+0

添加Linux系統調用不是「玩弄ext2並學習其設計」的方法。如果你想這樣做,寫一個獨立的實用程序,可以處理ext2文件系統(作爲圖像文件或直接訪問塊設備)。你似乎試圖做的是*在內核*上執行ext2 fs的內核內部編程接口,這與內核vfs層的工作方式有關,而不是ext2如何工作。這不是一個有用的練習。 –

回答

1

你完全混淆了涉及的抽象層。如果你的代碼甚至可以工作(不知道它是否可以),那麼它會很糟糕地崩潰並且崩潰內核,或者導致錯誤的代碼執行失控,如果有人碰巧在一個實際上不對應的路徑上使用這個系統調用到ext2文件系統。

在內核的fs抽象中,底層文件系統是ext2(或其它)的事實與在其上創建文件的任務無關。相反,所有這些都必須通過fs類型不可知的層,最後使用fs類型特定的後端來安裝路徑上的fs。

+0

另外,假設路徑始終是ext2 - 爲什麼這樣的東西不起作用,以及如何使其工作? – Josh

+1

@Josh:「爲什麼這樣的事情不行,以及如何使其發揮作用」 - 在同一句話中陳述和相反。你甚至讀過你在這裏寫的東西嗎? – Olaf