專利名稱::一種在線收縮ext2/3文件系統(tǒng)的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計算機操作系統(tǒng)領(lǐng)域,特別涉及Linux操作系統(tǒng)中一種在線4史縮(onlineshrink)ext2/3文件系纟克的方法。
背景技術(shù):
:Linux操作系統(tǒng)中最主要的文件系統(tǒng)是ext2或ext3,以下簡稱ext2/3文件系統(tǒng),它們的硬盤分區(qū)組織結(jié)構(gòu)如圖1所示。從圖1中可以看出,ext2/3文件系統(tǒng)對硬盤分區(qū)進(jìn)行組織如下在分區(qū)開始設(shè)置一個用于描述分區(qū)硬件信息的引導(dǎo)塊,在引導(dǎo)塊之后又將其余部分劃分成若干個塊組(blockgroup),在每個blockgroup中都保存了ext2/3文件系統(tǒng)的一個數(shù)據(jù)塊位圖塊(BB)、一個索引節(jié)點位圖塊(IB)、若干個索引節(jié)點表(IT)和若干個數(shù)據(jù)塊(DB),同時,在blockgroup0以及若干個用于故障恢復(fù)的blockgroup,如blockgroup1、blockgroup3等中還保存了ext2/3文件系統(tǒng)的一個超級塊(SB)和若干個組描述符塊(GDB)。其中,SB用于保存文件系統(tǒng)的元數(shù)據(jù)信息,如索引節(jié)點數(shù)、DB數(shù)、空閑的索引節(jié)點數(shù)、空閑的數(shù)據(jù)塊數(shù)等等;GDB用于保存文件系統(tǒng)中所有blockgroup的元數(shù)據(jù)信息,如每個blockgroup的索引節(jié)點數(shù),DB數(shù),空閑的索引節(jié)點數(shù),空閑的DB數(shù),BB的位置,IB的位置,IT的起始位置等;BB用于描述blockgroup中哪些DB是有效的;IB用于描述blockgroup內(nèi)IT中哪些索引節(jié)點是有效的;IT為blockgroup中所有索引節(jié)點的集合,一個索引節(jié)點用于描述一個文件,且在每個索引節(jié)點中都有一個只包含了15個元素的數(shù)組,其中前12個元素用于保存文件中前12個DB的塊號,后三個元素則用于保存文件中其余DB的索引塊的塊號,為了方便起見,后續(xù)將索引節(jié)點中保存的DB的塊號以及其余DB的索引塊的塊號均稱為索引節(jié)點中的數(shù)據(jù),同時,將索引到DB的索引節(jié)點和所述索引到DB的索引節(jié)點的索引塊均稱為所述DB的索引塊,也即DB都存在索引塊;DB中保存的是數(shù)據(jù),其中所述數(shù)據(jù)包含了目錄項。目前,Linux內(nèi)核以及文件系統(tǒng)管理工具ext2online僅僅支持在線地(online)或者掛載地(mounted)擴展ext2/3文件系統(tǒng),ext2resize<又<又支持非在線地(offline)或者卸載地(unmounted)收縮ext2/3文件系統(tǒng)。圖2為采用現(xiàn)有工具offline收縮ext2/3文件系統(tǒng)的方法流程圖,如圖2所示,該方法包括以下步驟步驟201:掃描文件系統(tǒng)收縮邊界外的部分,標(biāo)記出邊界外的有效DB和有效索引節(jié)點。當(dāng)前采用的收縮文件系統(tǒng)的工具即為前面所提到的ext2resize,采用該工具來收縮文件系統(tǒng)時,首先需要掃描待收縮的文件系統(tǒng)邊界外的部分,查找到邊界外的DB和索引節(jié)點,并分別根據(jù)保存在blockgroup中的BB和IB在所述查找到的DB和索引節(jié)點中將其中的有效DB和有效索引節(jié)點標(biāo)記出來,以便后續(xù)收縮時使用。步驟202:掃描整個文件系統(tǒng),找到有效DB的索引塊和有效索引節(jié)點的硬鏈接塊。需要i兌明的是,前面已經(jīng)指出了,在ext2/3文件系統(tǒng)中,索引到DB的索引節(jié)點和所述索引到DB的索引節(jié)點的索引塊均稱為所述DB的索引塊,因此,在后面對DB進(jìn)行索引的時候均指所述DB的索引塊。步驟203:找出收縮邊界內(nèi)的空閑位置,將邊界外的有效DB中的數(shù)據(jù)和有效索引節(jié)點中的數(shù)據(jù)轉(zhuǎn)移到邊界內(nèi)的空閑位置處。在需要收縮的文件系統(tǒng)邊界內(nèi)找出空閑的位置用于存儲原本在邊界外的有效DB中的數(shù)據(jù)和有效索引節(jié)點中的數(shù)據(jù),并將步驟201中標(biāo)記出的所有有效DB中的數(shù)據(jù)和有效索引節(jié)點中的數(shù)據(jù)轉(zhuǎn)移到所找到的邊界內(nèi)的空閑位置處。具體如何找出文件系統(tǒng)收縮邊界內(nèi)的空閑位置為現(xiàn)有技術(shù),這里不再對其進(jìn)行贅述。還需要說明的是,在這里對數(shù)據(jù)進(jìn)行轉(zhuǎn)移實際上就是對數(shù)據(jù)進(jìn)行拷貝。步驟204:更新有效DB的索引塊到新位置處的DB、有效索引節(jié)點的硬鏈接塊到新位置處的索引節(jié)點的索引關(guān)系,并更新blockgroup中的相應(yīng)參數(shù)。在本步驟中,對blockgroup中的相應(yīng)參數(shù)進(jìn)行更新是對文件系統(tǒng)SB中文件系統(tǒng)的大小、DB數(shù)、索引節(jié)點數(shù)、空閑的DB數(shù)、空閑的索引節(jié)點數(shù)等進(jìn)行相應(yīng)地修改。在完成對所有參數(shù)的更新才喿作后,就完成了對整個文件系統(tǒng)的收縮,也即減小了整個文件系統(tǒng)的大小。由于ext2/3文件系統(tǒng)分區(qū)塊組分配的特點,有效DB和有效索引節(jié)點可能分布在文件系統(tǒng)的任何部分,即有可能分布在文件系統(tǒng)要收縮的部分,如果此時對文件系統(tǒng)進(jìn)行offline收縮的時候有讀寫請求,可能會產(chǎn)生硬盤中該部分的有效DB中的數(shù)據(jù)已經(jīng)凈皮轉(zhuǎn)移成功,而內(nèi)存中相應(yīng)的部分仍為原來DB中的數(shù)據(jù)的情況;又由于現(xiàn)有Linux操作系統(tǒng)的讀進(jìn)程或?qū)戇M(jìn)程并不是直接通過硬盤中的元數(shù)據(jù)來查找DB中的數(shù)據(jù)的,而是通過硬盤中的元數(shù)據(jù)在內(nèi)存中對應(yīng)的元數(shù)據(jù)來查找DB中的數(shù)據(jù)的。因此,在讀寫該部分DB中的數(shù)據(jù)的時候,從內(nèi)存中讀出的DB中的數(shù)據(jù)與硬盤中相應(yīng)部分的DB中的數(shù)據(jù)已經(jīng)不一致了,從而造成讀寫錯誤??梢?,現(xiàn)有offline收縮方法并不能保證在線收縮的正確性,因此,采用現(xiàn)有方法對文件系統(tǒng)進(jìn)行收縮時,必須保證整個收縮過程是offline,若檢測到文件系統(tǒng)仍然在線,則不會對文件系統(tǒng)進(jìn)行收縮。為了使得讀寫準(zhǔn)確,必須保證硬盤中的元數(shù)據(jù)與其在內(nèi)存中的元數(shù)據(jù)同步保持一致,也即保證它們之間是對應(yīng)的,下面以ext2為例說明各元數(shù)據(jù)在石更盤與內(nèi)存中的對應(yīng)關(guān)系,如表l所示。<table>tableseeoriginaldocumentpage8</column></row><table>要保證文件系統(tǒng)在線收縮的正確性,必須在轉(zhuǎn)移每個有效DB中的數(shù)據(jù)和有效索引節(jié)點中的數(shù)據(jù)的同時,保證對應(yīng)的內(nèi)存中的這些有效DB中的數(shù)據(jù)和有效索引節(jié)點中的數(shù)據(jù)也要同時得到正確地更新。由于在讀寫數(shù)據(jù)時的具體操作是不完全一致的,下面分別對現(xiàn)有讀數(shù)據(jù)和寫數(shù)據(jù)的過程進(jìn)行簡單地描述。圖3為現(xiàn)有讀數(shù)據(jù)時的方法流程圖。如圖3所示,該方法包括以下步驟步驟301:根據(jù)讀系統(tǒng)調(diào)用參數(shù),獲取需要讀取的數(shù)據(jù)在硬盤中對應(yīng)的塊。步驟302:判斷該塊中的數(shù)據(jù)是否已經(jīng)在該塊對應(yīng)的內(nèi)存緩沖區(qū)中,如果數(shù)據(jù)已經(jīng)在內(nèi)存緩沖區(qū)中,則執(zhí)行步驟304;否則,執(zhí)行步驟303。步驟303:把數(shù)據(jù)調(diào)入硬盤中的塊對應(yīng)的內(nèi)存緩沖區(qū)中。步驟304:對內(nèi)存緩沖區(qū)中的數(shù)據(jù)進(jìn)行相應(yīng)的讀操作。步驟305:判斷是否已經(jīng)讀完所有的數(shù)據(jù),如果已經(jīng)讀完,則成功退出讀過程;否則,重復(fù)執(zhí)行步驟301及其以后的步驟,直至所有的數(shù)據(jù)全部被讀完。圖4為現(xiàn)有寫數(shù)據(jù)時的方法流程圖。如圖4所示,該方法包括以下步驟步驟401:根據(jù)寫系統(tǒng)調(diào)用參數(shù),獲取要寫的數(shù)據(jù)在硬盤中對應(yīng)的塊。步驟402:判斷是否找到該數(shù)據(jù)在硬盤中對應(yīng)的塊,如果是,則執(zhí)行步驟404;否則#^亍步驟403。步驟403:為數(shù)據(jù)分配一個新的塊。步驟404:判斷塊中的數(shù)據(jù)是否已經(jīng)在該塊對應(yīng)的內(nèi)存緩沖區(qū)中,如果是,則直接執(zhí)行步驟406及其以后的步驟;否則執(zhí)行步驟405。步驟405:把硬盤的塊中的數(shù)據(jù)調(diào)入該塊對應(yīng)的內(nèi)存緩沖區(qū)中。步驟406:對該塊對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行相應(yīng)的寫數(shù)據(jù)操作,也即將該塊對應(yīng)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)修改為現(xiàn)在正在寫入的數(shù)據(jù)。同時,將該塊對應(yīng)的內(nèi)存緩沖區(qū)標(biāo)記為臟緩沖區(qū),以便后續(xù)將修改了的數(shù)據(jù)寫回硬盤。步驟407:判斷是否所有的數(shù)據(jù)都被寫完,如果已經(jīng)被寫完,則將所有標(biāo)記為臟緩沖區(qū)中的數(shù)據(jù)直接寫回硬盤后成功退出即可;否則,重復(fù)執(zhí)行步驟401及其以后的步驟,直至所有數(shù)據(jù)全部被寫完后再將其寫回硬盤。通過上面的描述可以看出,現(xiàn)有offline收縮ext2/3文件系統(tǒng)時,如果有讀進(jìn)程或?qū)戇M(jìn)程訪問待收縮的文件系統(tǒng)邊界外的數(shù)據(jù),則可能會出現(xiàn)硬盤中有效DB中的數(shù)據(jù)已經(jīng)被轉(zhuǎn)移,而讀寫時卻仍按照原來內(nèi)存中未轉(zhuǎn)移的數(shù)據(jù)進(jìn)行,從而使得硬盤中的數(shù)據(jù)與內(nèi)存中的數(shù)據(jù)不一致,從而造成讀寫錯誤。也即現(xiàn)有offline收縮不能保證收縮時對lt據(jù)進(jìn)行正確地讀寫。
發(fā)明內(nèi)容有鑒于此,本發(fā)明提供了一種onlineshrinkext2/3文件系統(tǒng)的方法,能夠支持在讀寫數(shù)據(jù)的同時對文件系統(tǒng)進(jìn)行收縮,并且能夠保證讀寫結(jié)果的正確性。為達(dá)到上述目的,本發(fā)明的技術(shù)方案具體是這樣實現(xiàn)的一種在線收縮onlineshrinkext2/3文件系統(tǒng)的方法,該方法包4舌al.標(biāo)記所述文件系統(tǒng)收縮邊界外的數(shù)據(jù),將其中的某個數(shù)據(jù)作為當(dāng)前數(shù)據(jù);bl.對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,防止所述當(dāng)前數(shù)據(jù)被讀進(jìn)程或?qū)戇M(jìn)程訪問,如果上鎖成功,則將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi);如果上鎖失敗,則繼續(xù)對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,直至上鎖成功后,再將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi)。由上述的技術(shù)方案可見,本發(fā)明所采用的onlineshrinkext2/3文件系統(tǒng)的方法,是通過將所述文件系統(tǒng)收縮邊界外的數(shù)據(jù)轉(zhuǎn)移到所述文件系統(tǒng)收縮邊界內(nèi)來實現(xiàn)的,并且,在轉(zhuǎn)移數(shù)據(jù)之前,首先對所述數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,從而使得在轉(zhuǎn)移其中的某個數(shù)據(jù)時,其它進(jìn)程如讀進(jìn)程或?qū)戇M(jìn)程不能訪問該數(shù)據(jù),直至該數(shù)據(jù)被轉(zhuǎn)移完之后,讀進(jìn)程或?qū)戇M(jìn)程才能對其進(jìn)行訪問,也就保證了能對文件系統(tǒng)進(jìn)行在線收縮。圖1為現(xiàn)有ext2Z3文件系統(tǒng)的硬盤分區(qū)組織結(jié)構(gòu)示意圖。圖2為采用現(xiàn)有工具offline收縮ext2/3文件系統(tǒng)的方法流程圖。圖3為現(xiàn)有讀數(shù)據(jù)時的方法流程圖。圖4為現(xiàn)有寫數(shù)據(jù)時的方法流程圖。圖5為本發(fā)明onlineshrinkext2/3文件系統(tǒng)方法中收縮文件系統(tǒng)部分的方法流程圖。圖6為本發(fā)明onlineshrinkext2/3文件系統(tǒng)方法中讀^:據(jù)部分的方法流程圖。圖7為本發(fā)明onlineshrinkext2/3文件系統(tǒng)方法中寫數(shù)據(jù)部分的方法流程圖。具體實施例方式為解決現(xiàn)有技術(shù)中存在的問題,本發(fā)明提出一種onlineshrinkext2/3文件系統(tǒng)的方法,即在對文件系統(tǒng)進(jìn)行收縮時采用了將所述文件系統(tǒng)收縮邊界外的數(shù)據(jù)轉(zhuǎn)移到所述文件系統(tǒng)收縮邊界內(nèi),并且,在轉(zhuǎn)移每個數(shù)據(jù)之前,都要對所述數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,以防讀進(jìn)程或?qū)戇M(jìn)程對該數(shù)據(jù)進(jìn)行讀寫;同樣地,在對數(shù)據(jù)進(jìn)行讀寫的時候,也要判斷所要讀寫的數(shù)據(jù)在硬盤中對應(yīng)的塊是否位于所述文件系統(tǒng)收縮邊界外,并進(jìn)一步地對可以進(jìn)行讀寫的數(shù)據(jù)在石更盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,以防收縮進(jìn)程對其進(jìn)行收縮。因此,本發(fā)明采用的方法能夠支持在對數(shù)據(jù)進(jìn)行讀寫的同時對文件系統(tǒng)進(jìn)行收縮,并且能夠保證讀寫結(jié)果的正確性。在介紹具體的實現(xiàn)方案之前,首先介紹一下文件系統(tǒng)對象的概念。文件系統(tǒng)對象也即文件系統(tǒng)SB中的各個參數(shù),例如DB數(shù)、索引節(jié)點數(shù)、空閑的數(shù)據(jù)塊數(shù)以及空閑的索引節(jié)點數(shù)等等,硬盤中的文件系統(tǒng)對象與內(nèi)存中的文件系統(tǒng)對象需要保持一致,當(dāng)其中某一個參數(shù)改變時,另一個中相應(yīng)的參數(shù)也要進(jìn)行相應(yīng)的改變。經(jīng)過上述介紹可以看出,本發(fā)明所述方案主要由文件系統(tǒng)中虛擬的兩大模塊組成,一是收縮ext2/3文件系統(tǒng)的收縮模塊,二是與收縮部分相對應(yīng)的讀寫模塊。這兩大模塊是為了描述收縮文件系統(tǒng)與讀寫數(shù)據(jù)時文件系統(tǒng)所虛擬出來的,是兩種虛擬模塊,目的是為了更好地列舉實施例,并不是真實存在的。本發(fā)明所述方案的具體實現(xiàn)包括標(biāo)記所述文件系統(tǒng)收縮邊界外的數(shù)據(jù),將其中的某個數(shù)據(jù)作為當(dāng)前數(shù)據(jù);對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,防止所述當(dāng)前數(shù)據(jù)被讀進(jìn)程或?qū)戇M(jìn)程訪問,如果上鎖成功,則將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi);如果上鎖失敗,則繼續(xù)對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,直至上鎖成功后,再將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi)。為使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下參照附圖并舉實施例,對本發(fā)明進(jìn)一步詳細(xì)"i兌明。圖5為本發(fā)明onlineshrinkext2/3文件系統(tǒng)方法中收縮文件系統(tǒng)部分的方法流程圖。如圖5所示,該方法包括以下步驟步驟501502:收縮模塊接收收縮參數(shù),并根據(jù)所述接收到的收縮參數(shù)判斷是否可以收縮文件系統(tǒng),如果不可以,則結(jié)束整個流程;如果可以,則執(zhí)行步驟503。在本實施例中,收縮模塊接收到的收縮參數(shù)包括需要收縮的文件系統(tǒng)以及所述需要收縮的文件系統(tǒng)需要收縮的大小,然后從所述需要收縮的文件系統(tǒng)的SB中獲得所述需要收縮的文件系統(tǒng)的當(dāng)前空閑量,并進(jìn)一步根據(jù)所述需要收縮的大小以及所述需要收縮的文件系統(tǒng)的當(dāng)前空閑量來判斷是否可以收縮文件系統(tǒng)當(dāng)所述需要收縮的大小與所述需要收縮的文件系統(tǒng)的當(dāng)前空閑量相比小于某個閾值時,則可以對文件系統(tǒng)進(jìn)行收縮;反之,則不能收縮所述文件系統(tǒng)。需要說明的是,所述閾值是根據(jù)實際需要人為設(shè)定的,通過設(shè)置該閾值,不僅可以方便地完成對文件系統(tǒng)是否可以進(jìn)行收縮的判斷,而且通過對閾值的調(diào)整能夠避免收縮后不久文件系統(tǒng)當(dāng)前空閑量不足又需要擴展的情況。步驟503:設(shè)置收縮標(biāo)識和收縮大小。本實施例是通過在Linux文件系統(tǒng)的SB中增加一個標(biāo)識字^R(field)來設(shè)置收縮標(biāo)識的,該標(biāo)識field設(shè)置為0時,表示不收縮或收縮過程已經(jīng)結(jié)束;反之,則表示收縮系統(tǒng)需要收縮的大小。并且,讀寫模塊在讀寫每一個數(shù)據(jù)時都要訪問這一標(biāo)識field來判斷文件系統(tǒng)是否正3皮收縮,在整個收縮過程結(jié)束后,這一項需要清零。在設(shè)置了收縮標(biāo)識和收縮大小后,即可對文件系統(tǒng)進(jìn)行收縮,對文件系統(tǒng)進(jìn)行收縮的過程實際是將待收縮的文件系統(tǒng)邊界外的數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)邊界內(nèi)空閑位置處的過程,具體為首先,檢查文件系統(tǒng)邊界外,找到并標(biāo)記出所述文件系統(tǒng)邊界外的數(shù)據(jù),將其中的某個數(shù)據(jù)作為當(dāng)前數(shù)據(jù),同時,還需掃描整個文件系統(tǒng)邊界內(nèi),在其中找出空閑位置用于存放文件系統(tǒng)邊界外的數(shù)據(jù);然后,將所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,如果上鎖成功,則將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至已找到的文件系統(tǒng)邊界內(nèi)的空閑位置處;如果上鎖失敗,則說明讀寫模塊正在對該數(shù)據(jù)進(jìn)行相應(yīng)的讀寫操作,此時需要繼續(xù)對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,直至上鎖成功后,再將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至已找到的文件系統(tǒng)邊界內(nèi)的空閑位置處;最后,判斷是否所有的數(shù)據(jù)都已被轉(zhuǎn)移至文件系統(tǒng)邊界內(nèi),如果是,則結(jié)束收縮過程;否則,將當(dāng)前數(shù)據(jù)的下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù),并對其重復(fù)執(zhí)行上鎖、轉(zhuǎn)移或上鎖、繼續(xù)上鎖以及轉(zhuǎn)移的操作。-需要說明的是,硬盤中的每一個塊,在內(nèi)存中都有唯一的一個緩沖區(qū)與其相對應(yīng)。在將硬盤的塊中的數(shù)據(jù)進(jìn)行轉(zhuǎn)移時,都要先將待轉(zhuǎn)移的塊中的數(shù)據(jù)讀到該塊對應(yīng)的內(nèi)存緩沖區(qū)中,再將該塊對應(yīng)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)拷貝到目的位置的塊所對應(yīng)的內(nèi)存緩沖區(qū)中,然后再寫回到硬盤中的目的位置處。并且,在將數(shù)據(jù)進(jìn)行轉(zhuǎn)移時,還需要將待轉(zhuǎn)移的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,以保證轉(zhuǎn)移不會影響到可能正在對該塊中的數(shù)據(jù)進(jìn)行讀寫的讀寫操作,也保證了可能的讀寫操作不會影響到后續(xù)進(jìn)行的轉(zhuǎn)移操作。在本實施例中,對內(nèi)存緩沖區(qū)進(jìn)行上鎖是通過Li皿X操作系統(tǒng)中固有的函數(shù)來實現(xiàn)的,該函數(shù)的應(yīng)用保證了在同一時間只能有收縮模塊或讀寫模塊中的一個來對數(shù)據(jù)進(jìn)行操作。其中,所述數(shù)據(jù)包括所述文件系統(tǒng)收縮邊界外的有效DB中的數(shù)據(jù)和所述文件系統(tǒng)收縮邊界外的有效索引節(jié)點中的數(shù)據(jù)兩種,步驟504~511為對文件系統(tǒng)收縮邊界外的有效DB中的數(shù)據(jù)進(jìn)行處理的過程;步驟512~519為對文件系統(tǒng)收縮邊界外的有效索引節(jié)點中的數(shù)據(jù)進(jìn)行處理的過程,它們之間是沒有先后次序之分的。首先詳細(xì)描述對有效DB中的數(shù)據(jù)進(jìn)行處理的過程。步驟504:標(biāo)記邊界外有效DB及其索引塊,在邊界內(nèi)查找空閑塊作為目的位置。在本步驟中,首先需要遍歷文件系統(tǒng)邊界外的部分,也即要刪除的部分,標(biāo)記出其中的有效DB;再從文件系統(tǒng)開始處遍歷,找到索引到這些有效DB的索引塊,并在所述文件系統(tǒng)邊界內(nèi)查找空閑塊作為有效DB中的數(shù)據(jù)轉(zhuǎn)移的目的位置,將其中的某個有效DB作為當(dāng)前有效DB,將所述當(dāng)前有效DB的索引塊作為當(dāng)前索引塊,將用于存放所述當(dāng)前有效DB中的數(shù)據(jù)的空閑塊作為當(dāng)前空閑塊。步驟505~506:對當(dāng)前有效DB所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,并判斷上鎖是否成功,如果上鎖成功,則執(zhí)行步驟507;否則,繼續(xù)執(zhí)行步驟505506。在本步驟中對內(nèi)存緩沖區(qū)進(jìn)行上鎖也是通過Linux操作系統(tǒng)中固有的函數(shù)來體現(xiàn)的,當(dāng)上鎖成功時,即可進(jìn)行后續(xù)的相關(guān)操作;當(dāng)上鎖失敗時,說明有讀寫模塊正在訪問該內(nèi)存緩沖區(qū)中的數(shù)據(jù),此時,需要等待一段時間后繼續(xù)對該內(nèi)存緩沖區(qū)進(jìn)行上鎖,直至上鎖成功。需要說明的是,前后兩次上鎖之間的時間間隔大約為幾個微秒,在本實施例中也可認(rèn)為是持續(xù)地對該內(nèi)存緩沖區(qū)進(jìn)行上鎖的。步驟507:將當(dāng)前有效DB中的數(shù)據(jù)轉(zhuǎn)移至當(dāng)前空閑塊所對應(yīng)的內(nèi)存緩沖區(qū)中,并將其寫回當(dāng)前空閑塊。通過前面的描述可以知道,要轉(zhuǎn)移當(dāng)前有效DB中的數(shù)據(jù),首先要將該有效DB中的數(shù)據(jù)調(diào)入該有效DB所對應(yīng)的內(nèi)存緩沖區(qū)中,然后將該內(nèi)存緩沖區(qū)中的數(shù)據(jù)拷貝到空閑塊所對應(yīng)的內(nèi)存緩沖區(qū)中,最后將空閑所對應(yīng)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)寫回到空閑塊中。步驟508:對當(dāng)前索引塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,將索引的位置進(jìn)行修改,將所述修改更新到硬盤后,并將所述修改同步更新到內(nèi)存,再對上鎖的內(nèi)存緩沖區(qū)進(jìn)行解鎖。將當(dāng)前有效DB中的數(shù)據(jù)進(jìn)行轉(zhuǎn)移之后,索引到當(dāng)前有效DB的當(dāng)前索引塊的位置也要進(jìn)行相應(yīng)地修改,以保證索引的正確性,在對索引的位置進(jìn)行修改時,也要將當(dāng)前索引塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖后再修改,這樣也是為了保證讀寫模塊不能對該部分進(jìn)行讀寫操作。同時,還需將修改后的索引的新位置更新到硬盤中,并將所述修改后的索引的新位置同步更新到內(nèi)存中,再對上鎖的當(dāng)前索引塊的所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行解鎖。這樣就保證了文件系統(tǒng)在硬盤中的對象與在內(nèi)存中的對象的一致性,使得讀寫模塊在對數(shù)據(jù)進(jìn)行讀寫時能從內(nèi)存緩沖區(qū)中讀取到正確的數(shù)據(jù)。步驟509511:解鎖當(dāng)前有效DB所對應(yīng)的內(nèi)存緩沖區(qū),并判斷是否所有有效DB中的數(shù)據(jù)都被轉(zhuǎn)移完成,如果是,則執(zhí)行步驟520;否則,將下一個有效DB作為當(dāng)前有效DB,并返回扭j亍步-驟505。在將當(dāng)前有效DB中的數(shù)據(jù)轉(zhuǎn)移完成并將當(dāng)前索引塊中索引的位置更新后,即完成了對當(dāng)前有效DB中的數(shù)據(jù)的操作,也就可以解鎖當(dāng)前有效DB所對應(yīng)的內(nèi)存緩沖區(qū),以便讀寫模塊可以對當(dāng)前有效DB中的數(shù)據(jù)進(jìn)行相應(yīng)的讀寫操作。解鎖之后還需進(jìn)一步判斷是否所有有效DB中的數(shù)據(jù)都被轉(zhuǎn)移完成,如果是的話,執(zhí)行步驟520;否則,將下一個有效DB作為當(dāng)前有效DB,并返回步驟505,對當(dāng)前有效DB進(jìn)行相同的操作,直至所有有效DB中的數(shù)據(jù)都被轉(zhuǎn)移完。由此,即完成了對文件系統(tǒng)收縮邊界外有效DB中的數(shù)據(jù)進(jìn)行處理的過程,下面對有效索引節(jié)點中的數(shù)據(jù)進(jìn)行處理的過程作具體的說明,如步驟512~步驟519。步驟512:標(biāo)記邊界外索引節(jié)點及其硬鏈接塊,在邊界內(nèi)查找空閑塊作為目的位置。同步驟504中的操作一樣,在本步驟中,首先需要遍歷文件系統(tǒng)邊界外的部分,標(biāo)記出其中的有效索引節(jié)點;再從文件系統(tǒng)開始處遍歷,找到索引到這些有效索引節(jié)點的所有硬鏈接塊,并在邊界內(nèi)查找空閑塊作為有效索引節(jié)點中的數(shù)據(jù)轉(zhuǎn)移的目的位置。進(jìn)一步地,將其中的某個有效索引節(jié)點作為當(dāng)前有效索引節(jié)點,將所述當(dāng)前有效索引節(jié)點的硬鏈接塊作為當(dāng)前硬鏈接塊,將用于存放所述當(dāng)前有效索引節(jié)點中的數(shù)據(jù)的空閑塊作為當(dāng)前空閑塊。步驟513514:對當(dāng)前有效索引節(jié)點所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,并判斷上鎖是否成功,如果上鎖成功,則執(zhí)行步驟515;否則,繼續(xù)執(zhí)行這兩個步驟的操作。在本步驟中,上鎖^/L制的實現(xiàn)以及判斷同步驟505~506。步驟515:將當(dāng)前有效索引節(jié)點中的數(shù)據(jù)轉(zhuǎn)移至當(dāng)前空閑塊所對應(yīng)的內(nèi)存緩沖區(qū)中,并將其寫回當(dāng)前空閑塊。步驟516:對當(dāng)前硬鏈接塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,將索引的位置進(jìn)行修改,將所述修改更新到硬盤后,并將所述修改同步更新到內(nèi)存,再對上鎖的內(nèi)存緩沖區(qū)進(jìn)行解鎖。在本步驟中,對文件系統(tǒng)在硬盤中的對象進(jìn)行修改與所述文件系統(tǒng)在內(nèi)存中的對象進(jìn)行修改保持一致,也是為了后續(xù)讀寫模塊對數(shù)據(jù)讀寫時能從內(nèi)存緩沖區(qū)中得到正確的數(shù)據(jù)。步驟517519:解鎖當(dāng)前有效索引節(jié)點所對應(yīng)的內(nèi)存緩沖區(qū),并判斷是否所有有效索引節(jié)點中的數(shù)據(jù)都被轉(zhuǎn)移完成,如果是,則執(zhí)行步驟520;否則,將下一個有效索引節(jié)點作為當(dāng)前有效索引節(jié)點,并返回執(zhí)行步驟513??梢钥闯觯瑢Ξ?dāng)前有效索引節(jié)點和當(dāng)前有效DB的處理過程是"-^羊的,因此,在步驟513519中沒有對其進(jìn)行詳細(xì)的闡述。還需說明的是,上述步驟5045U與步驟512519是不能同時進(jìn)行的,一般的操作是先將有效DB處理完后,再對有效索引節(jié)點進(jìn)行相應(yīng)的操作,并且,當(dāng)所有有效DB和所有有效索引節(jié)點都處理完后,才可以執(zhí)行步驟520的操作。步驟520:修改內(nèi)存緩沖區(qū)中文件系統(tǒng)各對象的參數(shù),并將所述修改同步更新到-更盤和內(nèi)存。在將文件系統(tǒng)收縮邊界外有效DB中的數(shù)據(jù)和收縮邊界外有效索引節(jié)點中的數(shù)據(jù)全部處理完后,即可刪除所述文件系統(tǒng)邊界外的部分了,具體是先對內(nèi)存緩沖區(qū)中文件系統(tǒng)各對象的參數(shù)進(jìn)行修改,如SB中索引節(jié)點的個數(shù)、DB的個數(shù)、空閑的索引節(jié)點個數(shù)以及空閑的DB個數(shù)等等;將上述作的修改更新到硬盤中的文件系統(tǒng)中后,并將所述修改同步更新到內(nèi)存,以保證文件系統(tǒng)在硬盤中的對象和所述文件系統(tǒng)在內(nèi)存中的對象的一致。步驟521:將收縮標(biāo)識和收縮大小清零。在本實施例,若在步驟503的標(biāo)識field設(shè)置的是非零值,也即需要對文件系統(tǒng)進(jìn)行收縮,在執(zhí)行完收縮操作后,需要將該標(biāo)識field清零,以免影響讀寫操作。至此,即完成了本發(fā)明所述收縮文件系統(tǒng)的整個過程。為了在收縮文件系統(tǒng)的同時保證讀寫結(jié)果的準(zhǔn)確性,本實施例對現(xiàn)有的讀寫模塊對數(shù)據(jù)進(jìn)行讀寫的過程也進(jìn)行了改進(jìn)。圖6即為本發(fā)明onlineshrinkext2/3文件系統(tǒng)方法中讀數(shù)據(jù)部分的方法流程圖。如圖6所示,該方法包括以下步驟步驟601602:讀模塊獲取當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊,并判斷收縮模塊是否正在收縮文件系統(tǒng),如果是,則執(zhí)行步驟603;否則執(zhí)行步驟607。將需要讀取的數(shù)據(jù)作為當(dāng)前數(shù)據(jù),讀模塊在讀寫當(dāng)前數(shù)據(jù)時,并不是在硬盤中對當(dāng)前數(shù)據(jù)進(jìn)行讀取的,而是通過當(dāng)前數(shù)據(jù)在硬盤中的塊所對應(yīng)的內(nèi)存緩沖區(qū)中來讀取的。當(dāng)獲取到當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊后,還需進(jìn)一步判斷文件系統(tǒng)是否正在被收縮,如果是,則執(zhí)行步驟603;否則,執(zhí)行步驟607。在本實施例中,對收縮模塊是否正在收縮文件系統(tǒng)的判斷是通過在SB中增加的標(biāo)識field來判斷的,當(dāng)該標(biāo)識field中的值為非零時,表示正在收縮文件系統(tǒng);如果為零值,則表示沒有收縮文件系統(tǒng)或已經(jīng)結(jié)束收縮文件系統(tǒng),此時,可以對當(dāng)前數(shù)據(jù)進(jìn)行相應(yīng)的其它操作。具體如何獲取當(dāng)前數(shù)據(jù)已為現(xiàn)有技術(shù),這里不再贅述。步驟603:判斷所述當(dāng)前數(shù)據(jù)是否在文件系統(tǒng)收縮邊界外,如果是,則執(zhí)行步驟604;否則,執(zhí)行步驟607。文件系統(tǒng)SB中記錄的整個文件系統(tǒng)的大小減去SB中增加的標(biāo)識field中文件系統(tǒng)需要收縮的大小即可得到收縮后的文件系統(tǒng)的大小,將所述當(dāng)前數(shù)據(jù)在硬盤中的塊所對應(yīng)的塊號與收縮后的文件系統(tǒng)的大小進(jìn)行比較,如果所述當(dāng)前數(shù)據(jù)在硬盤中的塊所對應(yīng)的塊號大,則說明所述當(dāng)前數(shù)據(jù)在文件系統(tǒng)收縮邊界外,則執(zhí)行步驟604;否則,所述當(dāng)前數(shù)據(jù)就在文件系統(tǒng)收縮邊界內(nèi),并執(zhí)行步驟607。步驟604605:對當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,并判斷上鎖是否成功,如果是,則執(zhí)行步驟607;否則,步驟606。在本實施例中,對內(nèi)存緩沖區(qū)進(jìn)行上鎖的具體操作同收縮模塊中對文件進(jìn)行收縮時上鎖的操作一致,都是通過Linux系統(tǒng)中固有的函數(shù)來實現(xiàn)的。步驟606:等待所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行解鎖。'如果對當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)上鎖失敗,則表示收縮模塊正在對該數(shù)據(jù)進(jìn)行處理,因此,需要等待所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)被解鎖后,返回執(zhí)行步驟601。內(nèi)存緩沖區(qū)是否被解鎖是根據(jù)所述當(dāng)前數(shù)據(jù)在硬盤中的塊所對應(yīng)的內(nèi)存緩沖區(qū)中的固有的標(biāo)識位來進(jìn)行判斷的,該標(biāo)識位是Linux操作系統(tǒng)的內(nèi)存緩沖區(qū)中固有的。這里同對文件系統(tǒng)進(jìn)行收縮時是不一樣的,對文件系統(tǒng)收縮時,如果上鎖不成功,則會繼續(xù)對當(dāng)前有效DB或當(dāng)前有效索引節(jié)點對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,而讀寫數(shù)據(jù)時如果上鎖失敗,則會等待該內(nèi)存緩沖區(qū)被解鎖后,再對當(dāng)前數(shù)據(jù)進(jìn)行讀寫。這里等待該內(nèi)存緩沖區(qū)被解鎖,是為了保證后續(xù)讀取數(shù)據(jù)的準(zhǔn)確。步驟607:判斷當(dāng)前數(shù)據(jù)是否在內(nèi)存緩沖區(qū)中,如果是,則執(zhí)行步驟609;m'l"J4r^;j^ii取《no力;m.jwijy-年uuo。如果當(dāng)前數(shù)據(jù)已經(jīng)在當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)中,則直接執(zhí)行步驟609;否則,4丸行步驟608。步驟608:將當(dāng)前數(shù)據(jù)調(diào)入內(nèi)存緩沖區(qū)中。由于讀取數(shù)據(jù)時是從內(nèi)存緩沖區(qū)中讀取的,因此,在當(dāng)前數(shù)據(jù)不在內(nèi)存緩沖區(qū)中時,需要先將當(dāng)前數(shù)據(jù)調(diào)入所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)中。步驟609610:從內(nèi)存緩沖區(qū)中讀取當(dāng)前數(shù)據(jù),并判斷當(dāng)前數(shù)據(jù)的內(nèi)存緩沖區(qū)是否被上鎖,如果是,則執(zhí)行步驟611;否則,執(zhí)行步驟612。從當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)中讀取完數(shù)據(jù)后,還需進(jìn)一步判斷該內(nèi)存緩沖區(qū)是否被上鎖,如果是,則執(zhí)行步驟611;否則,直接執(zhí)行步驟612。步驟611:解鎖當(dāng)前數(shù)據(jù)的內(nèi)存緩沖區(qū)。當(dāng)讀取完當(dāng)前數(shù)據(jù)后,需要將上鎖的內(nèi)存緩沖區(qū)進(jìn)行解鎖,使得其它進(jìn)程可以對該數(shù)據(jù)進(jìn)行訪問。步驟612613:判斷是否所有數(shù)據(jù)都被讀完,如果是,則結(jié)束;否則,將當(dāng)前數(shù)據(jù)的下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù),并返回步驟601。當(dāng)所有數(shù)據(jù)都被讀取完后,即可結(jié)束讀數(shù)據(jù)過程;否則,還需將當(dāng)前數(shù)據(jù)的下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù),并返回執(zhí)行步驟601,直至所有數(shù)據(jù)都被讀至此,即完成了本發(fā)明所述讀數(shù)據(jù)的整個過程。下面對寫數(shù)據(jù)的過程進(jìn)行詳細(xì)描述,圖7為本發(fā)明onlineshrinkext2/3文件系統(tǒng)方法中寫數(shù)據(jù)部分的方法流程圖。如圖7所示,該方法包括以下步驟步驟701702:寫模塊獲取當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊,并判斷是否獲取到所述塊,如果沒有獲取到,執(zhí)行步驟703;如果獲取到,則執(zhí)行步驟707。步驟703-704:為當(dāng)前數(shù)據(jù)分配一個新塊,并進(jìn)一步判斷是否正在收縮士乂也鄉(xiāng)厶^Ji"繭5_3二A成*,n《工m'i3二tut*。,on,下"u,個>^,"zvjqjy一pn/v/j,一o"g,"q,、njy>斧/丄厶o當(dāng)在硬盤中沒有獲取到所需的塊時,寫模塊會為當(dāng)前數(shù)據(jù)在硬盤中分配一個新塊,之后會對文件系統(tǒng)是否正在收縮進(jìn)行判斷,并根據(jù)是否在收縮文件系統(tǒng)進(jìn)行不同的處理,當(dāng)判斷出正在收縮文件系統(tǒng)時,執(zhí)行步驟705;否則,執(zhí)行步驟712。需要說明的是,在本實施例中,對文件系統(tǒng)是否正在收縮判斷的依據(jù)也是文件系統(tǒng)SB中增加的標(biāo)識field,當(dāng)該標(biāo)識field為非零值時,文件系統(tǒng)正在被進(jìn)行收縮,其它進(jìn)程不能訪問該當(dāng)前數(shù)據(jù);當(dāng)標(biāo)識field為零時,表示不收縮文件系統(tǒng)或文件系統(tǒng)》|欠縮結(jié)束。步驟705:判斷所述新塊是否在文件系統(tǒng)邊界外,當(dāng)在文件系統(tǒng)邊界外時,執(zhí)行步驟706;否則,執(zhí)行步驟712。步驟706:在文件系統(tǒng)收縮邊界內(nèi)為當(dāng)前數(shù)據(jù)分配一個新塊。在為當(dāng)前數(shù)據(jù)分配的新塊在文件系統(tǒng)收縮邊界外時,為了避免在邊界外的數(shù)據(jù)還要再轉(zhuǎn)移至邊界內(nèi)的復(fù)雜情況,需要在文件系統(tǒng)收縮邊界內(nèi)為當(dāng)前數(shù)據(jù)重新分配一個新塊,之后,再執(zhí)行步驟712。步驟707711:'具體操作同步驟602606,此處不再進(jìn)行贅述。需要說明的是,步驟703-706與步驟707~711是對是否獲取到數(shù)據(jù)的兩種不同的處理方法,在處理完任何一個流程后,都要執(zhí)行步驟712。步驟712:判斷判斷當(dāng)前數(shù)據(jù)是否在內(nèi)存緩沖區(qū)中,如果是,則執(zhí)行步20驟714;否則,執(zhí)行步驟713。步驟713:將當(dāng)前數(shù)據(jù)調(diào)入內(nèi)存緩沖區(qū)中。同對數(shù)據(jù)進(jìn)行讀取時一樣,在寫數(shù)據(jù)時,也是將數(shù)據(jù)寫入內(nèi)存緩沖區(qū)中的,在當(dāng)前數(shù)據(jù)不在內(nèi)存緩沖區(qū)中時,需要先將當(dāng)前數(shù)據(jù)調(diào)入所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)中。步驟714715:將待寫數(shù)據(jù)寫入內(nèi)存緩沖區(qū),并將所述內(nèi)存緩沖區(qū)標(biāo)記為臟緩沖區(qū),再進(jìn)一步判斷當(dāng)前數(shù)據(jù)的內(nèi)存緩沖區(qū)是否上鎖,如果是,執(zhí)行步驟716;否則,執(zhí)行步驟717。在本步驟中,將內(nèi)存緩沖區(qū)標(biāo)記為臟緩沖區(qū)是為了服務(wù)后續(xù)寫回硬盤。步驟716:解鎖當(dāng)前數(shù)據(jù)的內(nèi)存緩沖區(qū)。同讀數(shù)據(jù)時的步驟611,在本步驟中,當(dāng)寫完數(shù)據(jù)后,也需要將上鎖的內(nèi)存緩沖區(qū)進(jìn)行解鎖,使得其它進(jìn)程可以對該數(shù)據(jù)進(jìn)行訪問。步驟717718:判斷是否所有數(shù)據(jù)都被寫完,如果是,執(zhí)行步驟719;否則,將當(dāng)前數(shù)據(jù)的下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù),并返回執(zhí)行步驟701。步驟719:判斷是否正在收縮文件系統(tǒng),如果是,執(zhí)行步驟720;否則,執(zhí)行步驟721。當(dāng)所有數(shù)據(jù)都被寫完后,還需進(jìn)一步判斷文件系統(tǒng)是否正在進(jìn)行收縮,如果是的話,執(zhí)行步驟720的操作;否則,執(zhí)行步驟721。在本步驟中,對是否正在收縮文件系統(tǒng)的判斷也是通過文件系統(tǒng)SB中增加的標(biāo)識field,具體判斷過程同前面描述,不再贅述。步驟720:如果文件系統(tǒng)正在被收縮,則等待文件系統(tǒng)的收縮過程,直至收縮過程結(jié)束。步驟721:將步驟714中標(biāo)記的臟緩沖區(qū)中的數(shù)據(jù)寫回到硬盤中。這里需要說明的是,一般情況下,需要馬上寫回硬盤,但有時需要等待正在進(jìn)行收縮的文件系統(tǒng),等文件系統(tǒng)被收縮完畢后,再將標(biāo)記的臟緩沖區(qū)中的數(shù)據(jù)寫回硬盤。至此,即完成了本發(fā)明所述寫數(shù)據(jù)的全部過程。同時也完成了本發(fā)明所述收縮文件系統(tǒng)和讀寫數(shù)據(jù)的全部過程。通過上述實施例可以看出,本發(fā)明在讀寫數(shù)據(jù)時若需要讀寫文件系統(tǒng)收縮邊界外的數(shù)據(jù),則首先會試圖獲取該數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)上的鎖,若獲取不到,則說明收縮進(jìn)程正在對該數(shù)據(jù)進(jìn)行轉(zhuǎn)移,需要等到該內(nèi)存緩沖區(qū)上的鎖被解開后,再重新查找該數(shù)據(jù)在硬盤中對應(yīng)的新的塊,并重新對該數(shù)據(jù)進(jìn)行讀寫;如果獲取到了該數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)上的鎖,則可以直接對該數(shù)據(jù)進(jìn)行相應(yīng)的讀寫操作,與此同時,收縮進(jìn)程若要轉(zhuǎn)移該數(shù)據(jù),則需要等到該數(shù)據(jù)被讀寫完畢之后再重新對乾;并;^"在i4《人大A^f妄;n:了老務(wù)士&沾一S4",MtA"JJM妄TTi'i官MfFS罷欣微犧牲了讀寫進(jìn)程的性能。但是,本實施例以下幾個方面的特點又保證了讀寫進(jìn)程的性能不會犧牲很大1)Linux操作系統(tǒng)中的預(yù)讀策略,使得相當(dāng)一部分的數(shù)據(jù)已經(jīng)在內(nèi)存中,從而使得收縮與讀寫同一個數(shù)據(jù)這樣的情況機率比較低;2)轉(zhuǎn)移一個數(shù)據(jù)的時間不會很長,這樣由收縮造成的讀寫延遲也就較?。?)若寫進(jìn)程需要新的數(shù)據(jù)塊保存數(shù)據(jù),則新的數(shù)據(jù)塊要保證在文件系統(tǒng)收縮邊界內(nèi)分配,這樣就避免了在邊界外分配后還要將數(shù)據(jù)再轉(zhuǎn)移至界內(nèi)的復(fù)雜過程;4)寫進(jìn)程最后要寫回硬盤時,要等到收縮進(jìn)程結(jié)束再進(jìn)行,這樣也延續(xù)了Linux操作系統(tǒng)延遲寫的思想??傊?,本發(fā)明所采用的onlineshrinkext2/3文件系統(tǒng)的技術(shù)方案,在對文件系統(tǒng)進(jìn)行收縮時采用了將所述文件系統(tǒng)收縮邊界外的數(shù)據(jù)轉(zhuǎn)移到所述文件系統(tǒng)收縮邊界內(nèi),并且,在轉(zhuǎn)移每個數(shù)據(jù)之前,都要對所述數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,以防讀進(jìn)程或?qū)戇M(jìn)程對該數(shù)據(jù)進(jìn)行讀寫;同樣地,在對數(shù)據(jù)進(jìn)行讀寫的時候,也要判斷所要讀寫的數(shù)據(jù)在硬盤中對應(yīng)的塊是否位于所述文件系統(tǒng)收縮邊界外,并進(jìn)一步地對可以進(jìn)行讀寫的數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,以防收縮進(jìn)程對其進(jìn)行收縮。因此,本發(fā)明采用的方法能夠支持在對數(shù)據(jù)進(jìn)行讀寫的同時對文件系統(tǒng)進(jìn)行收縮,并且能夠保證讀寫結(jié)果的正確性。綜上所述,以上僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1、一種在線收縮onlineshrinkext2/3文件系統(tǒng)的方法,其特征在于,該方法包括a1.標(biāo)記所述文件系統(tǒng)收縮邊界外的數(shù)據(jù),將其中的某個數(shù)據(jù)作為當(dāng)前數(shù)據(jù);b1.對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,防止所述當(dāng)前數(shù)據(jù)被讀進(jìn)程或?qū)戇M(jìn)程訪問,如果上鎖成功,則將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi);如果上鎖失敗,則繼續(xù)對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,直至上鎖成功后,再將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi)。2、如權(quán)利要求l所述的方法,其特征在于,所述步驟bl中所述上鎖失敗時,讀進(jìn)程或?qū)戇M(jìn)程正在訪問所述當(dāng)前數(shù)據(jù)。3、如權(quán)利要求2所述的方法,其特征在于,所述讀進(jìn)程訪問所述當(dāng)前l(fā)t據(jù)包括a3.獲取所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊,并判斷是否正在收縮文件系統(tǒng),如果是,則執(zhí)行步驟b3;否則執(zhí)行步驟d3;b3.判斷所述當(dāng)前數(shù)據(jù)是否在所述文件系統(tǒng)收縮邊界外,如果在,則執(zhí)行步驟c3;如果不在,則執(zhí)行步驟d3;c3.對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,防止所述當(dāng)前數(shù)據(jù)被收縮進(jìn)程訪問,如果上鎖成功,則執(zhí)行步驟d3;否則,等待所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)被解鎖后,返回執(zhí)行步驟a3;d3.判斷所述當(dāng)前數(shù)據(jù)是否在所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)中,如果是,則從所述內(nèi)存緩沖區(qū)中讀取當(dāng)前數(shù)據(jù);否則,將所述當(dāng)前數(shù)據(jù)調(diào)入所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)中,再從所述內(nèi)存緩沖區(qū)中讀取當(dāng)前數(shù)據(jù);e3.判斷所述內(nèi)存緩沖區(qū)是否被鎖住,如果是,則解鎖所述內(nèi)存緩沖區(qū),將下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù)再返回執(zhí)行步驟a3,直至所有數(shù)據(jù)被讀完;否則直接將下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù),并返回執(zhí)行步驟a3,直至所有數(shù)據(jù)被讀完。4、如權(quán)利要求2所述的方法,其特征在于,所述寫進(jìn)程訪問所述當(dāng)前數(shù)據(jù)包括a4.獲取所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊,如果沒有獲取到,則執(zhí)行步驟b4;如果獲取到,則執(zhí)行步驟c4;b4.在硬盤中為所述當(dāng)前數(shù)據(jù)分配一個新塊,并判斷收縮模塊是否正在收縮文件系統(tǒng),如果沒有,則執(zhí)行步驟e4;如果是,則進(jìn)一步判斷所述新塊是否在所述文件系統(tǒng)收縮邊界外,如果在邊界外,則在邊界內(nèi)為所述當(dāng)前數(shù)據(jù)分配另一塊作為新塊,并執(zhí)行步驟e4;否則,直接執(zhí)行步驟e4;c4.判斷收縮模塊是否正在收縮文件系統(tǒng),如果沒有,則執(zhí)行步驟e4;如果是,則進(jìn)一步判斷所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊是否在所述文件系統(tǒng)收縮邊界外,如果在邊界外,則執(zhí)行步驟d4;如果不在,則執(zhí)行步驟e4;d4.對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊進(jìn)行上鎖,防止所述當(dāng)前數(shù)據(jù)被收縮進(jìn)程訪問,如果上鎖成功,則執(zhí)行步驟e4;否則,等待所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)被解鎖后,返回執(zhí)行步驟a4;e4.判斷所述當(dāng)前數(shù)據(jù)是否在所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)中,如果是,則將待寫數(shù)據(jù)寫入所述內(nèi)存緩沖區(qū)中,并將所述內(nèi)存緩沖區(qū)標(biāo)記為臟緩沖區(qū);否則,將所述當(dāng)前數(shù)據(jù)調(diào)入所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)中,再將所述待寫數(shù)據(jù)寫入所述內(nèi)存緩沖區(qū)中,并將所述內(nèi)存緩沖區(qū)標(biāo)記為臟緩沖區(qū);f4.判斷所述內(nèi)存緩沖區(qū)是否被鎖住,如果是,則解鎖所述內(nèi)存緩沖區(qū),將下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù)再返回執(zhí)行步驟a4,直至所有數(shù)據(jù)被寫完;否則直接將下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù),并返回執(zhí)行步驟a4,直至所有數(shù)據(jù)被寫完;g4.判斷是否正在收縮文件系統(tǒng),如果是,則等待收縮文件系統(tǒng)結(jié)束,并將所述臟緩沖區(qū)中的數(shù)據(jù)寫回硬盤;否則,直接將所述臟緩沖區(qū)中的數(shù)據(jù)寫回硬盤。5、如權(quán)利要求l所述的方法,其特征在于,所述數(shù)據(jù)為所述文件系統(tǒng)收縮邊界外有效數(shù)據(jù)塊DB中的數(shù)據(jù)或所述文件系統(tǒng)收縮邊界外有效索引節(jié)點中的數(shù)據(jù)。6、如權(quán)利要求5所述的方法,其特征在于,當(dāng)所述數(shù)據(jù)為所述文件系統(tǒng)收縮邊界外有效DB中的數(shù)據(jù)時,所述步驟bl包括a6.標(biāo)記所述文件系統(tǒng)收縮邊界外的有效DB,在所述文件系統(tǒng)中找到所述有效DB的索引塊,并在所述文件系統(tǒng)邊界內(nèi)找到用于存放所述有效DB中的數(shù)據(jù)的空閑塊,將其中的某個有效DB作為當(dāng)前有效DB,將所述當(dāng)前有效DB的索引塊作為當(dāng)前索引塊,將用于存放所述當(dāng)前有效DB中的數(shù)據(jù)的空閑塊作為當(dāng)前空閑塊;b6.對當(dāng)前有效DB所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)4亍上鎖,如果上鎖成功,則#1行步驟c6;否則,重復(fù)執(zhí)行步驟b6;c6.將當(dāng)前有效DB中的數(shù)據(jù)調(diào)入所述當(dāng)前有效DB所對應(yīng)的內(nèi)存緩沖區(qū)中,并將所述當(dāng)前有效DB所對應(yīng)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)移到所述當(dāng)前空閑塊所對應(yīng)的內(nèi)存緩沖區(qū)中,再將所述當(dāng)前空閑塊所對應(yīng)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)寫回到所述當(dāng)前空閑塊中;d6.對所述當(dāng)前索引塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,將所述當(dāng)前索引塊索引到當(dāng)前有效DB的位置修改為索引到所述當(dāng)前空閑塊,并將所述修改同步更新到硬盤和內(nèi)存后,解鎖當(dāng)前索引塊所對應(yīng)的內(nèi)存緩沖區(qū);e6.解鎖所述當(dāng)前有效DB所對應(yīng)的內(nèi)存緩沖區(qū)。7、如權(quán)利要求5所述的方法,其特征在于,當(dāng)所述數(shù)據(jù)為所述文件系統(tǒng)收縮邊界外有效索引節(jié)點中的數(shù)據(jù)時,所述步驟bl包括a7.標(biāo)記所述文件系統(tǒng)收縮邊界外的有效索引節(jié)點,在所述文件系統(tǒng)中找到所述有效索引節(jié)點的硬鏈接塊,并在所述文件系統(tǒng)邊界內(nèi)找到用于存放所述有效索引節(jié)點中的數(shù)據(jù)的空閑塊,將其中的某個有效索引節(jié)點作為當(dāng)前有效索引節(jié)點,將所述當(dāng)前有效索引節(jié)點的硬鏈接塊作為當(dāng)前硬鏈接塊,將用于存放所述當(dāng)前有效索引節(jié)點中的數(shù)據(jù)的空閑塊作為當(dāng)前空閑塊;b7.對當(dāng)前有效索引節(jié)點所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,如果上鎖成功,則執(zhí)行步驟c7;否則,繼續(xù)對當(dāng)前有效索引節(jié)點所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,直至上鎖成功后,再執(zhí)行步驟c7;c7.將當(dāng)前有效索引節(jié)點中的數(shù)據(jù)調(diào)入所述當(dāng)前有效索引節(jié)點所對應(yīng)的內(nèi)存緩沖區(qū)中,并將所述當(dāng)前有效索引節(jié)點所對應(yīng)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)移到所述當(dāng)前空閑塊所對應(yīng)的內(nèi)存緩沖區(qū)中,再將所述當(dāng)前空閑塊所對應(yīng)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)寫回到所述當(dāng)前空閑塊中;d7.對所述當(dāng)前硬鏈接塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,將所述當(dāng)前硬鏈接塊索引到當(dāng)前有效索引節(jié)點的位置修改為索引到所述當(dāng)前空閑塊,并將所述^f'務(wù)改同步更新到硬盤和內(nèi)存后,解鎖當(dāng)前硬鏈接塊所對應(yīng)的內(nèi)存緩沖區(qū);e6.解鎖所述當(dāng)前有效索引節(jié)點所對應(yīng)的內(nèi)存緩沖區(qū)。8、如權(quán)利要求1所述的方法,其特征在于,步驟al之前該方法還包括接收包括需要收縮的文件系統(tǒng)和所述需要收縮的文件系統(tǒng)需要收縮的大小的收縮參數(shù),當(dāng)所述需要收縮的文件系統(tǒng)需要收縮的大小與需要收縮的文件系統(tǒng)的當(dāng)前空閑量相比小于閣值,則可以進(jìn)行收縮所述需要收縮的文件系統(tǒng);反之,則不可以進(jìn)行收縮所述需要收縮的文件系統(tǒng),其中,所述閾值根據(jù)實際情況來定。9、如權(quán)利要求l所述的方法,其特征在于,步驟bl之后該方法還包括判斷是否所有的數(shù)據(jù)都被轉(zhuǎn)移至所述文件系統(tǒng)收縮邊界內(nèi),如果是,則結(jié)束;否則,將所述當(dāng)前數(shù)據(jù)的下一個數(shù)據(jù)作為當(dāng)前數(shù)據(jù),并返回執(zhí)行步驟bl。10、如權(quán)利要求9所述的方法,其特征在于,所述所有的數(shù)據(jù)都被轉(zhuǎn)移至所述文件系統(tǒng)收縮邊界內(nèi)之后該方法進(jìn)一步包括刪除所述文件系統(tǒng)收縮邊界外的部分。全文摘要本發(fā)明公開了一種在線收縮onlineshrinkext2/3文件系統(tǒng)的方法標(biāo)記所述文件系統(tǒng)收縮邊界外的數(shù)據(jù),將其中的某個數(shù)據(jù)作為當(dāng)前數(shù)據(jù);對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,防止所述當(dāng)前數(shù)據(jù)被讀進(jìn)程或?qū)戇M(jìn)程訪問,如果上鎖成功,則將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi);如果上鎖失敗,則繼續(xù)對所述當(dāng)前數(shù)據(jù)在硬盤中對應(yīng)的塊所對應(yīng)的內(nèi)存緩沖區(qū)進(jìn)行上鎖,直至上鎖成功后,再將所述當(dāng)前數(shù)據(jù)轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi),并保證所有的數(shù)據(jù)都被轉(zhuǎn)移至文件系統(tǒng)收縮邊界內(nèi)。應(yīng)用本發(fā)明所述的方法,能夠支持在對數(shù)據(jù)進(jìn)行讀寫的同時對文件系統(tǒng)進(jìn)行收縮,并且能夠保證讀寫結(jié)果的正確性。文檔編號G06F17/30GK101556607SQ20091008476公開日2009年10月14日申請日期2009年5月19日優(yōu)先權(quán)日2009年5月19日發(fā)明者宋振華申請人:宋振華