用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備和方法
【專利摘要】公開了一種用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備和方法。用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備包括存儲裝置,用于存儲文件系統(tǒng)的對象,該文件系統(tǒng)包括快照對象和文件系統(tǒng)對象,快照對象包括引用數(shù)據(jù)塊的第一指針,并且文件系統(tǒng)對象包括引用數(shù)據(jù)塊的第二指針。通過快照對象的第一指針所引用的數(shù)據(jù)塊包括由快照對象擁有的數(shù)據(jù)塊;并且用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備還包括處理裝置,用于執(zhí)行:針對由快照對象擁有的并且通過快照對象的第一指針以及文件系統(tǒng)對象的第二指針所引用的每個數(shù)據(jù)塊,將每個數(shù)據(jù)塊的所有權從快照對象轉移到文件系統(tǒng)對象,以及在這樣的所有權轉移之后,從文件系統(tǒng)中移除快照對象。
【專利說明】用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備和方法
[0001 ]本申請是2011年11月21日提出的、申請?zhí)枮?01180056305.9、名稱為“數(shù)據(jù)存儲系統(tǒng)中的文件克隆和去克隆”的發(fā)明申請的分案申請。
[0002]相關申請的交叉引用
[0003]本專利申請要求于2010年11 月22日以Daniel J.N.Picken和Neil Berrington的名義提交的(代理機構卷號 N0.2337/126)題為 FILING CLONING IN A DATA STORAGESYSTEM(數(shù)據(jù)存儲系統(tǒng)中編檔克隆)的美國臨時專利申請N0.61/415,928的優(yōu)先權權益,通過引用將其全部內容合并在本文中。
[0004]本專利申請與下列專利申請相關,通過引用將他們中的每個的全部內容都合并在本文中:
[0005]于2008年6月30日以ChristopherJ.Aston,Simon L.Benham和Neil Berrington的名義提交的題為MULT1-WAY CHECKPOINTS IN A DATA STORAGE SYSTEM(數(shù)據(jù)存儲系統(tǒng)中的多向檢查點)的美國專利申請N0.12/164,730(代理機構卷號N0.2337/110),其是于2008年I 月16 日以Christopher J.Aston名義提出的,題為VALIDATING OBJECTS IN A DATASTORAGE SYSTEM(數(shù)據(jù)存儲系統(tǒng)中證實對象)的美國專利申請N0.12/015,192的部分繼續(xù)申請(代理機構卷號N0.2337/113),并因此要求后者的優(yōu)先權。
[0006]本專利申請還可能與一個或多個下列專利申請相關,通過引用將他們中的每個的全部內容合并在本文中:
[0007]于本申請同一日期提出的,題為DYNAMICWRITE BALANCING IN A DATA STORAGESYSTEM(數(shù)據(jù)存儲系統(tǒng)中的動態(tài)寫入平衡)的美國專利申請(代理機構卷號N0.2337/111);
[0008]于2008年10月9日以John C.Holtom名義提交的,題為SYSTEM,DEVICE,AND METHODFOR VALIDATING DATA STRUCTURES IN A STORAGE SYSTEM(存儲系統(tǒng)中的用于驗證數(shù)據(jù)結構的系統(tǒng)、裝置和方法)的美國專利申請N0.12/248,300(代理機構卷號N0.2337/117),其要求于2007年 10月 12 日提出的,題為SYSTEM,DEVICE,AND METHOD FOR VALIDATING DATASTRUCTURES IN A STORAGE SYSTEM(在存儲系統(tǒng)中用于驗證數(shù)據(jù)結構的系統(tǒng)、裝置和方法)的美國臨時專利申請N0.60/979,561 (代理機構卷號N0.2337/118)的權益。
[0009]于2001 年6 月12 日提出的,題為 APPARATUS AND METHOD FOR HARDWAREIMPLEMENTAT1N OR ACCELERAT1N OF OPERATING SYSTEM FUNCT1NS(用于硬件實現(xiàn)或操作系統(tǒng)功能加速的設備和方法)的美國專利申請N0.09/879,798,即現(xiàn)在的美國專利N0.6,826,615(代理機構卷號 N0.2337/103);
[0010]于2004年 7 月12 日提出的,題為 APPARATUS AND METHOD FOR HARDWAREIMPLEMENTAT1N OR ACCELERAT1N OF OPERATING SYSTEM FUNCT1NS(用于硬件實現(xiàn)或操作系統(tǒng)功能加速的設備和方法)的美國專利申請N0.10/889 ,158(代理機構卷號N0.2337/108);
[0011]于2002年11月 I 日以Geoffrey S.Barrall等人名義提出的,題為APPARATUS ANDMETHOD FOR HARDWARE-BA SED FILE SYSTEM(用于基于硬件的文件系統(tǒng)的設備和方法)的美國專利申請N0.10/286,015(代理機構卷號N0.2337/104);和
[0012]于2007年8月20日以Geoffrey S.Barrall等人名義提出的,題為APPARATUS ANDMETHOD FOR HARDWARE-BA SED FILE SYSTEM(用于基于硬件的文件系統(tǒng)的設備和方法)的美國專利申請N0.11/841,353(代理機構卷號N0.2337/117)。
技術領域
[0013]本發(fā)明涉及數(shù)據(jù)存儲系統(tǒng),尤其涉及數(shù)據(jù)存儲系統(tǒng)中的克隆和去克隆文件。
【背景技術】
[0014]于2002年11月 I 日以Geoffrey S.Barrall 等人名義提交的,題為 Apparatus andMethod for Hardware-Based File System(用于基于硬件的文件系統(tǒng)的設備和方法)的美國專利申請N0.10/286,015(代理機構卷號N0.2337/104)和于2007年8月20日以GeoffreyS.BarralI等人名義提交的,題為Apparatus and Method for Hardware-Based FileSystem(用于基于硬件的文件系統(tǒng)的設備和方法)的美國專利申請N0.11/841,353(代理機構卷號N0.2337/117),通過引用將兩者的全部內容合并在本文中,它們描述了各種文件系統(tǒng)結構,除此之外,所述文件系統(tǒng)結構還允許文件服務器維護文件系統(tǒng)的兩個副本,即文件系統(tǒng)的當前版本和文件系統(tǒng)之前的“檢驗點”版本。特別是使用包括特定根節(jié)點的樹結構來維護文件系統(tǒng),所述特定根節(jié)點實際上是被稱為左手側(LHS)和右手側(RHS)的一對結構。在實踐中,一側被用來保持文件系統(tǒng)的“檢驗點”副本,同時另一側被用于文件系統(tǒng)的持續(xù)管理(包括文件系統(tǒng)對象的創(chuàng)建、刪除和修改)。有時,兩側的角色倒轉,使得用于文件系統(tǒng)的持續(xù)管理的一側結構執(zhí)行“檢驗點”,并且文件系統(tǒng)的持續(xù)管理繼續(xù)使用持有之前“檢驗點”的一側結構。保持兩個所謂的動態(tài)超級塊(dynamic superblock)來保持文件系統(tǒng)的當前版本和檢驗點版本的蹤跡。
[0015]“檢驗點”的一個目的在于,一旦文件系統(tǒng)的持續(xù)管理過程中發(fā)生錯誤,則存儲文件系統(tǒng)的副本。在某些情況下,文件系統(tǒng)可以被恢復到“檢驗點”版本。在這種系統(tǒng)中的一個風險在于,文件系統(tǒng)的當前版本和“檢驗點”版本都可能會損壞。另一個風險在于,一條重要的信息將被移除或被改變,并且文件系統(tǒng)的當前版本和“檢驗點”版本都將不包括那條原始
?目息O
【發(fā)明內容】
[0016]在本發(fā)明的某些實施例中,例如當用戶制作文件副本時,采用文件克隆機制來允許在文件系統(tǒng)內快速創(chuàng)建文件的副本(克隆)。在示例性實施例中,源對象的克隆至少最初表述為包含對源對象的各種元素(例如,間接onode節(jié)點、直接onode節(jié)點和數(shù)據(jù)塊)的引用的結構??梢詣?chuàng)建只讀和可變克隆。源文件和克隆最初共享這種元素并且當更改源文件或可變克隆時繼續(xù)共享未修改的元素。在創(chuàng)建克隆時,不需要復制用戶數(shù)據(jù)塊或描述與源文件相關聯(lián)的數(shù)據(jù)流(即間接/直接onode節(jié)點)的元數(shù)據(jù)塊。這種文件克隆的一些特點包括:
[0017]-由于不需要復制構成數(shù)據(jù)流的用戶數(shù)據(jù)塊,因此無論源對象的數(shù)據(jù)流的大小如何,文件系統(tǒng)對象的數(shù)據(jù)流都可以被迅速地并且是在相對固定的時間量中有效克隆。而且,不需要復制用于描述數(shù)據(jù)流的元數(shù)據(jù)塊(即,間接/直接onode節(jié)點)。非常小的和固定數(shù)量的元數(shù)據(jù)塊被突變。
[0018]-對克隆的/克隆對象操作I/O的復雜性相當于對普通對象的操作。
[0019]-可以被克隆的文件或克隆的次數(shù)僅受限于文件系統(tǒng)中空閑空間的數(shù)量。
[0020]-文件系統(tǒng)可支持的克隆數(shù)目僅受限于文件系統(tǒng)中空閑空間的數(shù)量。
[0021]-該文件克隆具有固有的文件去復制,其特征在于,克隆實際上是被創(chuàng)建為與源文件共享數(shù)據(jù)和元數(shù)據(jù)塊的去復制化文件,而不是創(chuàng)建源文件的完整副本并且后續(xù)執(zhí)行去復制。
[0022]-盡管通過冗余存儲(即,RAID控制器)和其他機制,數(shù)據(jù)損壞得到減輕,但是共享塊的損壞會影響多個文件。
[0023]根據(jù)本發(fā)明的一個方面,提供一種在文件存儲系統(tǒng)中克隆源文件系統(tǒng)對象的方法。源文件系統(tǒng)對象包括至少一個數(shù)據(jù)塊和直接或間接引用至少一個數(shù)據(jù)塊的指針組。該方法包括在文件存儲系統(tǒng)中創(chuàng)建只讀的數(shù)據(jù)流快照對象并且在數(shù)據(jù)流快照對象中存儲指針組的副本;并且在文件存儲系統(tǒng)中創(chuàng)建可變克隆對象并在克隆對象中存儲指針組的副本,其中,數(shù)據(jù)流快照對象和克隆對象與源文件系統(tǒng)對象共享至少一個數(shù)據(jù)塊,而不為數(shù)據(jù)流快照對象和克隆對象制作至少一個數(shù)據(jù)塊的單獨副本,并且其中,源文件系統(tǒng)對象和克隆對象有效地成為數(shù)據(jù)流快照對象的可變版本并有效地存儲數(shù)據(jù)流快照對象所代表的對象的只讀副本中的改變。
[0024]根據(jù)本發(fā)明的另一方面,提供用于克隆文件系統(tǒng)對象的裝置,該文件系統(tǒng)對象包括文件存儲系統(tǒng)中的源文件系統(tǒng)對象。源文件系統(tǒng)對象包括至少一個數(shù)據(jù)塊和直接或間接引用至少一個數(shù)據(jù)塊的指針組。該裝置包括至少一個存儲設備;并且存儲處理器與至少一個存儲設備通信,該存儲處理器被配置為在文件存儲系統(tǒng)中創(chuàng)建只讀的數(shù)據(jù)流快照對象并在數(shù)據(jù)流快照對象中存儲指針組的副本;以及在文件存儲系統(tǒng)中創(chuàng)建可變克隆對象并在克隆對象中存儲指針組的副本,其中,數(shù)據(jù)流快照對象和克隆對象與源文件系統(tǒng)對象共享至少一個數(shù)據(jù)塊,而不為數(shù)據(jù)流快照對象和克隆對象制作至少一個數(shù)據(jù)塊的單獨副本,并且其中,源文件系統(tǒng)對象和克隆對象有效地成為數(shù)據(jù)流快照對象的可變版本并有效地存儲數(shù)據(jù)流快照對象所代表的對象的只讀副本的改變。
[0025]在多種替選實施例中,每個對象可以包括根onode節(jié)點,并且指針組可以被存儲在對象根onode節(jié)點中。指針組可以從源文件系統(tǒng)對象被復制到數(shù)據(jù)流快照對象,并且然后從數(shù)據(jù)流快照對象被復制到克隆對象。
[0026]實施例還可以包含在數(shù)據(jù)流快照對象中存儲對源文件系統(tǒng)對象的引用和克隆對象的引用;在源文件系統(tǒng)對象中存儲對數(shù)據(jù)流快照對象的引用;和在克隆對象中存儲對數(shù)據(jù)流快照對象的引用。
[0027]實施例還可以包含保持數(shù)據(jù)流快照對象中的引用計數(shù),該引用計數(shù)用于指示引用數(shù)據(jù)流快照對象的文件系統(tǒng)中的對象的數(shù)量。
[0028]實施例還可以包含將源文件系統(tǒng)對象的尺寸作為克隆對象的屬性,其中從所述源文件系統(tǒng)對象創(chuàng)建所述克隆對象。
[0029]實施例還可以包含,當可變源文件系統(tǒng)對象或可變克隆對象被修改時,分配至少一個數(shù)據(jù)塊用于存儲所述修改并且將至少一個分配的數(shù)據(jù)塊與修改后的對象進行關聯(lián),修改后的對象包括修改后的指針組。修改后的對象可以被克隆,例如,通過在文件存儲系統(tǒng)中創(chuàng)建第二只讀數(shù)據(jù)流快照對象并且在第二數(shù)據(jù)流快照對象中存儲修改后的指針組的副本;以及在文件存儲系統(tǒng)中創(chuàng)建第二可變克隆對象并在第二克隆對象中存儲修改后的指針組的副本。該克隆還可以包含在第二數(shù)據(jù)流快照對象中存儲對修改后的對象的引用、對第二克隆對象的引用、和對第一數(shù)據(jù)流快照對象的引用;在修改后的文件系統(tǒng)對象中存儲對第二數(shù)據(jù)流快照對象的引用;并且在第二克隆對象中存儲對第二數(shù)據(jù)流快照對象的引用。
[0030]實施例還可以包含使用數(shù)據(jù)流快照對象進一步創(chuàng)建源對象的克隆。
[0031]實施例還可以包含去克隆對象。
【附圖說明】
[0032]通過參照下面的【具體實施方式】,參考附圖,本發(fā)明的上述特征將會更容易理解,其中:
[0033]圖1是依照本發(fā)明示例性實施例的文件存儲系統(tǒng)的示意框圖;
[0034]圖2是顯示了依照本發(fā)明示例性實施例的文件系統(tǒng)的普通格式的示意框圖;
[0035]圖3是顯示依照本發(fā)明示例性實施例的對象樹結構的普通格式的示意框圖;
[0036]圖4是顯示依照本發(fā)明示例性實施例,使用沒有其他onode節(jié)點的根onode節(jié)點的示意框圖;
[0037]圖5是顯示依照本發(fā)明示例性實施例,具有直接onode節(jié)點的根onode節(jié)點的使用的方框圖;
[0038]圖6是顯示依照本發(fā)明示例性實施例,具有間接onode節(jié)點和直接onode節(jié)點的根onode節(jié)點的使用的方框圖;
[0039]圖7是示出依照本發(fā)明示例性實施例,使用位于根onode節(jié)點和直接onode節(jié)點之間的多層間接onode節(jié)點的方框圖;
[0040]圖8顯示了對于本發(fā)明示例性實施例,對象編號分配的表述;
[0041]圖9是顯示依照本發(fā)明示例性實施例的間接對象的普通格式的示意框圖;
[0042]圖10是依照本發(fā)明示例性實施例,演示DSB、間接對象、根直接對象和文件對象之間的普通關系的示意框圖;
[0043]圖11是顯示依照本發(fā)明示例性實施例,在I號檢查點的包括四個數(shù)據(jù)塊和各種onode節(jié)點的示例性對象的結構的示意圖;
[0044]圖12是顯示依照本發(fā)明實施例,為經(jīng)修改的對象創(chuàng)建新的根節(jié)點之后,圖11的示例性對象的結構的示意圖;
[0045]圖13是顯示依照本發(fā)明實施例,在創(chuàng)建數(shù)據(jù)塊的經(jīng)修改的副本之后,圖12的示例性對象的結構的示意圖;
[0046]圖14是顯示依照本發(fā)明實施例,在創(chuàng)建新的直接onode節(jié)點以指向數(shù)據(jù)塊的經(jīng)修改的副本之后,圖13的示例性對象的結構的示意圖;
[0047]圖15是顯示依照本發(fā)明實施例,在創(chuàng)建新的間接onode節(jié)點以指向新的直接onode節(jié)點之后,圖14的示例性對象的結構的示意圖;
[0048]圖16是顯示依照本發(fā)明實施例,在更新新的根節(jié)點以指向新的間接onode節(jié)點之后,圖15的示例性對象的結構的示意圖;
[0049]圖17是顯示依照使用DSB的循環(huán)列表來記錄檢查點的本發(fā)明的示例性實施,在執(zhí)行檢查點之前各種文件系統(tǒng)結構的示意圖;
[0050]圖18是顯示依照使用DSB的循環(huán)列表來記錄檢查點的本發(fā)明示例性實施例,在執(zhí)行檢查點之后,圖17的各種文件系統(tǒng)結構的示意圖;
[0051 ]圖19是顯示依照使用DSB循環(huán)列表來記錄檢查點的本發(fā)明示例性實施例,在修改間接對象之后,圖18的各種文件系統(tǒng)結構的示意圖;
[0052]圖20是顯示依照本發(fā)明示例性實施例,其中再次使用一個DSB以創(chuàng)建繼承檢查點,在執(zhí)行檢查點之前的各種文件系統(tǒng)結構的示意圖;
[0053]圖21是顯示依照本發(fā)明示例性實施例,其中再次使用一個DSB以創(chuàng)建繼承檢查點,在執(zhí)行檢查點之后,圖20的各種文件系統(tǒng)結構的示意圖;
[0054]圖22是顯示依照本發(fā)明示例性實施例,其中再次使用一個DSB以創(chuàng)建繼承檢查點,在修改間接對象之后,圖21的各種文件系統(tǒng)結構的示意圖;
[0055]圖23示意性地顯示了依照本發(fā)明示例性實施例,源對象(文件A)2802、隱藏的數(shù)據(jù)流快照對象2803、和可變副本2805之間的關系;
[0056]圖24示意性地顯示了依照本發(fā)明示例性實施例,在4號概念性檢查點上的,克隆圖11中表述的文件系統(tǒng)對象的之后的對象2802、2803和2805;
[0057]圖25示意性地顯示了依照本發(fā)明示例性實施例,源對象(文件A)2802、隱藏的數(shù)據(jù)流快照對象2803、以及兩個可變副本2805和2807之間的關系;
[0058]圖26示意性地顯示了依照本發(fā)明示例性實施例,在6號概念性檢查點上,克隆第二可變副本之后的對象2802、2803、2805和2807;
[0059]圖27示意性地示出了經(jīng)修改的源對象2802’(由單引號代表源對象的修改版本)、具有兩個原始源對象克隆2805和2807的第一數(shù)據(jù)流快照對象2803、第二數(shù)據(jù)流快照對象2809、以及第二數(shù)據(jù)流快照對象2809的可變副本2811之間的關系;
[0060]圖28示意性地顯示了依照本發(fā)明示例性實施例,在8號概念性檢查點上,克隆經(jīng)修改的源對象2802 ’之后的對象2802 ’、2803、2809和2811 ;
[0061]圖29示意性地顯示了依照本發(fā)明示例性實施例,與特定源對象相關聯(lián)的DSS對象是如何保留在文件系統(tǒng)中,直到源對象和所有副本都被刪除;和
[0062]圖30(包含子部分30A-30C)示例性顯示了依照示例性實施例的對象去克隆。
[0063]應該注意的是,前述的附圖和其中描述的元素不一定被畫成一致的比例或任何比例。除非上下文給出相反的暗示,否則類似的元素用類似的附圖標記指代。
【具體實施方式】
[0064]用于本說明和所附權利要求中,除非上下文做出相反的要求,下列術語應當具有所指示出的含義:
[0065]“存儲設備”是用于存儲數(shù)據(jù)的設備或系統(tǒng)。存儲設備可以包括一個或多個磁性或磁光或光盤驅動器、固態(tài)存儲設備、或者磁帶。為了方便,存儲設備有時被稱為“磁盤”或“硬盤”。數(shù)據(jù)存儲系統(tǒng)可以包括具有相同或不同存儲容量的相同或不同類型的存儲設備。
[0066]“RAID控制器”是將幾個存儲設備的存儲容量合并到一塊虛擬的存儲空間中的設備或系統(tǒng),所述虛擬的存儲空間可以被替選地稱為是“系統(tǒng)驅動器” (“SD” )、“邏輯單元”(“LU”或“LUN”)或者是“卷”。通常,SD比單一存儲設備大,從幾個存儲設備提取空間,并且包括冗余信息,以便它能承受磁盤的一定數(shù)量的故障而不丟失數(shù)據(jù)。在示例性實施例中,每個SD與下文中被稱為“邏輯單元標識符”或“LUID”的唯一標識符相關聯(lián),并且每個SD將不會大于預定的最大尺寸,諸如2TB-64TB或更多。當命令被發(fā)送至SD時,RAID控制器典型地在同一時間將命令轉發(fā)至SD的所有存儲設備。RAID控制器有助于克服典型的存儲設備的三個主要局限,即存儲設備典型地是存儲系統(tǒng)中最慢的組件,他們典型地最可能經(jīng)歷災難性故障,并且他們典型地具有相對較小的存儲容量。
[0067]“RAID系統(tǒng)”是包括一個或多個RAID控制器和多個存儲設備的設備或系統(tǒng)。通常,RAID系統(tǒng)將包含兩個RAID控制器(以便如果一個發(fā)生故障,另一個可以繼續(xù)工作,并且當兩個都正常時還可以分擔負荷)和數(shù)十個存儲設備。在示例性實施例中,RAID系統(tǒng)典型地被配置有兩個到三十二個之間的SD。當文件服務器需要存儲或檢索數(shù)據(jù)時,它將指令發(fā)送到RAID系統(tǒng)的RAID控制器,其繼而負責將命令向前路由到單個存儲設備并且按需要存儲或檢索數(shù)據(jù)。使用一些RAID系統(tǒng),可以建立SD之間的鏡像關系,以使得為了冗余的目的,被寫入一個SD(被稱為“主SD”)的數(shù)據(jù)被RAID系統(tǒng)自動地寫入另一個SD(本文中被稱為“次SD”或“鏡像SD”)。次SD可以由和主SD—樣的相同的RAID系統(tǒng)或由不同的本地或遠程RAID系統(tǒng)管理。為了從在某些情況下SD或者可能是甚至多個SD的丟失或損壞中提供恢復,鏡像SD有效地提供了SD之間的RAID 1+0功能。
[0068]“文件系統(tǒng)”是在文件存儲系統(tǒng)中存儲的文件和目錄(文件夾)的結構。在文件存儲系統(tǒng)中,典型地使用多個虛擬存儲結構來管理文件系統(tǒng),并且在示例性實施例中,使用被稱為范圍(range)、條帶集(stripeset)和跨度(span)的虛擬存儲結構的層次管理文件系統(tǒng)。“范圍”由主SD自身或者由主/次SD對組成,所述主/次SD對應當包含同樣的數(shù)據(jù),并且因此提供與單一SD相同的存儲容量。“條帶集”由一個或多個范圍組成?!翱缍取庇梢粋€或多個條帶集組成。因此,最終,跨度由一個或多個SD(典型地是四至五十個SD)組成??缍瓤梢员环譃橐粋€或多個文件系統(tǒng),每個文件系統(tǒng)具有單獨的名稱和標識符以及潛在不同的特征(諸如,一個文件系統(tǒng)可以被格式化為具有多個32KB集群并且另一個具有多個4KB集群,一個文件系統(tǒng)可以是“一寫多讀”存儲器(Worm)而另一個不是,等等)??缍壬系拿總€文件系統(tǒng)被單獨格式化、安裝和卸載。文件系統(tǒng)可以以任何順序和在任何時間被創(chuàng)建和刪除。文件系統(tǒng)可以被配置為自動擴展(或者替選地,防止或限制自動擴展)或可以手動擴展。
[0069]值的“集合”可以包含一個或多個值。
[0070]在下面使用的標題是為了方便,并且不被理解為以任何方式限制本發(fā)明。
[0071]在本發(fā)明的某些實施例中,例如當用戶制作文件的副本時,采用文件克隆機制來允許在文件系統(tǒng)內快速創(chuàng)建文件的副本(克隆)。在示例性實施例中,源對象的克隆至少最初被表述為包含涉及源對象的各種元素的結構(例如間接onode節(jié)點、直接onode節(jié)點和數(shù)據(jù)塊)。只讀和可變克隆都可以被創(chuàng)建。源文件和克隆最初共享這種元素并且在對源文件或可變克隆進行改變時繼續(xù)共享未修改的元素。在創(chuàng)建克隆時,不需要復制描述與源文件相關的數(shù)據(jù)流(即間接/直接onode節(jié)點)的元數(shù)據(jù)塊或用戶數(shù)據(jù)塊。在適當?shù)臅r間,克隆的文件可以被“去克隆”。
[0072]雖然結合示例性文件系統(tǒng)描述本發(fā)明示例性實施例,但是應該注意各種克隆和去克隆的概念還可以被應用到其他類型的文件系統(tǒng)。
[0073]示例性文件系統(tǒng)
[0074]圖1是依照本發(fā)明示例性實施例的文件存儲系統(tǒng)的示意性方框圖。除此之外,文件存儲系統(tǒng)包括許多文件服務器(為了簡單和方便,顯示了單一文件服務器9002),所述服務器在例如互聯(lián)網(wǎng)協(xié)議網(wǎng)絡(如互聯(lián)網(wǎng))的通信網(wǎng)絡9004上與多種客戶端裝置9006^90061?通信以及在例如光纖通道網(wǎng)絡的存儲網(wǎng)絡9010上與各種RAID系統(tǒng)9008^9008〃通信??蛻舳搜b置9006^9006(^和文件服務器9002利用例如CIFS和/或NFS的一個或多個網(wǎng)絡文件協(xié)議進行通信。文件服務器9002和RAID系統(tǒng)9008^9008〃利用例如SCSI的存儲協(xié)議進行通信。應該注意的是,文件存儲系統(tǒng)可以包括以多種配置互聯(lián)的多個文件服務器和多個RAID系統(tǒng),包括全網(wǎng)狀配置,其中任何文件服務器可以與任何RAID系統(tǒng)在冗余的和切換的光纖通道網(wǎng)絡上進行通?目。
[0075]文件服務器9002包括用來管理一個或多個文件系統(tǒng)的存儲處理器。文件服務器9002可以被配置為允許客戶端訪問文件系統(tǒng)的部分,如在指定名稱下的樹或子樹。在CIFS用語中,這樣的訪問可以被稱作“共享”而在NFS用語中,這樣的訪問可以被稱作“輸出”。在內部,文件服務器9002可以包括多種硬件實現(xiàn)和/或硬件加速子系統(tǒng),例如,如同以上以引用的方式合并于本文中的美國專利申請N0.09/879,798和N0.10/889,158所描述的一樣,并且可以包括包含多個鏈接的子模塊的基于硬件的文件系統(tǒng),例如,如同以上以引用的方式合并于本文中的美國專利申請N0.10/286,015和N0.11/841,353所描述的一樣。
[0076]每個RAID系統(tǒng)9008典型地包括至少一個RAID控制器(并且通常是兩個RAID控制器用于冗余),還包括由RAID控制器管理的許多物理存儲設備(如磁盤)AAID系統(tǒng)9008將其存儲資源聚合成許多SD。例如,每個RAID系統(tǒng)9008可以被配置為具有2到32個之間的SD。每個SD可以被限制為預定的最大尺寸(如,2TB-64TB或更多)。將幾個存儲設備組合到SD可以提供許多好處,包括提高的速度(單個存儲設備相對較慢,但數(shù)據(jù)可以是跨越幾個存儲設備的以擴大瓶頸)、增加的容量(單個的存儲設備比較小,但是可以組合幾個存儲設備來提供更多的可用空間)、抽象(所使用的空間量可以大于或小于單一存儲設備的尺寸)和恢復能力(奇偶校驗或冗余信息可以被存儲在每個存儲設備上,以便SD能承受存儲設備的丟失)。
[0077]文件服務器9002被配置為使用一個或多個SD,所述SD可以來自單一的RAID系統(tǒng)或來自多個RAID系統(tǒng)。文件服務器9002通??梢栽儐朢AID系統(tǒng)來找出每個SD是主的還是次的。文件服務器9002使用SD進行控制的方法在本文中被稱為“許可(licensing)”。因此,實際上,文件服務器9002典型地對于一些SD是被許可的,而對于其他的則是不被許可的。
[0078]在內部,文件服務器9002能夠將幾個SD組合成更大的在本文中被稱為“跨度”的存儲池。跨度本質上是幾個SD的RAID O陣列。將幾個SD組合成跨度可以提供許多類似于通過將多個物理磁盤組合成SD所獲得的好處,包括提高的速度(在多個RAID系統(tǒng)的多個SD之間鋪開I/O可以進一步擴大存儲瓶頸)、增加的存儲容量(跨度可以比單一的SD大,該SD可以被限制為兩百萬兆字節(jié))和附加的抽象,它允許更靈活的存儲空間分配。
[0079]文件系統(tǒng)樹結構
[0080]文件服務器9002將多種類型的對象存儲在文件系統(tǒng)里。對象一般可以被分為系統(tǒng)對象和文件對象。文件對象被創(chuàng)建用于存儲用戶數(shù)據(jù)和相關屬性,比如文字處理器或電子表格文件。系統(tǒng)對象由文件存儲系統(tǒng)創(chuàng)建用來管理信息,并且包括諸如根目錄對象、空閑空間分配對象、修改的檢查點對象列表對象、修改的保留對象列表對象和軟件元數(shù)據(jù)對象之類的東西,這里僅舉一些例子。更具體來說,目錄對象被創(chuàng)建用于存儲目錄信息。空閑空間分配對象被創(chuàng)建用于存儲空閑空間分配信息。修改的檢查點對象列表對象和修改的保留對象列表對象(兩者在下面都將更詳細的描述)分別被創(chuàng)建用來存儲涉及檢查點和保留的檢查點的信息。軟件元數(shù)據(jù)對象(在下面將更詳細的描述)是特殊的對象,被用來保持與文件或目錄對象有關的過量文件屬性(即,如下面所描述的,不能符合文件或目錄對象內的預先指定區(qū)域內的文件屬性,如CIFS安全屬性),并且,該軟件元數(shù)據(jù)對象是由文件或目錄對象的創(chuàng)建者所創(chuàng)建,它包含對文件或目錄對象內軟件元數(shù)據(jù)對象的引用。
[0081]使用具有根節(jié)點的樹結構(被稱為動態(tài)超級數(shù)據(jù)塊或DSB)管理文件系統(tǒng)的實例,所述樹結構優(yōu)選地被存儲在存儲系統(tǒng)內的固定位置。除此之外,將DSB存儲在固定位置使得文件服務器9002很容易定位DSB。文件服務器9002可以維護多個DSB以存儲代表不同檢查點的文件系統(tǒng)的不同版本(如,當前的“工作”版本和一個或多個“檢查點”版本)。在示例性實施例中,DSB包括指向間接對象的指針(在下面詳細描述),間接對象繼而包括指向其他對象的指針。
[0082]圖2是顯示依照本發(fā)明示例性實施例的文件系統(tǒng)實例的一般格式的示意性方框圖。DSB 202是表示文件系統(tǒng)樹結構的根的特殊結構。除此之外,DSB 202包括指向間接對象204的指針,其繼而包括指向包括系統(tǒng)對象206和文件對象208的文件系統(tǒng)中的其他對象的指針。
[0083]在本發(fā)明的實施例中,N個動態(tài)超級數(shù)據(jù)塊(N>2)被保持用于文件系統(tǒng),只有其中一個被認為是在任何給定的時間點上最新的。DSB的數(shù)量可以是固定的或是可配置的。DSB位于固定位置上并且被用來記錄磁盤上的檢查點的狀態(tài)。每個DSB指向一個間接對象。
[0084]除此之外,以下的信息被存儲在每個動態(tài)超級數(shù)據(jù)塊中:
[0085]?與此動態(tài)超級數(shù)據(jù)塊相關的檢查點編號。
[0086]?用于該檢查點的修改后檢查點對象列表對象的句柄。
[0087]?來自最后的保留檢查點的修改的保留對象列表對象的對象編號。
[0088]?此檢查點的狀態(tài)(S卩,是否已經(jīng)創(chuàng)建檢查點)。
[0089 ] ?允許檢查DSB和其他結構(如間接對象)有效性的CRC和多種其他信息。
[0090]在示例性實施例中,DSB被當作循環(huán)列表(S卩,第一動態(tài)超級數(shù)據(jù)塊被認為連續(xù)地跟隨最后的動態(tài)超級數(shù)據(jù)塊),并且在循環(huán)列表中,每個連續(xù)的檢查點使用下一個連續(xù)的動態(tài)超級數(shù)據(jù)塊。當文件服務器9002打開卷時,它通常讀入所有動態(tài)超級數(shù)據(jù)塊并且在DSB上執(zhí)行多種檢查。具有檢查點狀態(tài)被標記為完成的最新檢查點編號和通過了多種其他完整性檢查(sanity check)的DSB被認為代表了這個卷上最新的有效檢查點。對于下一個檢查點,文件服務器9002開始使用循環(huán)列表中的下一個DSB。
[0091 ]在下面討論間接對象204的一般格式。
[0092]對象樹結構
[0093]一般來說,包括間接對象204的文件系統(tǒng)里的每個對象、每個系統(tǒng)對象206和每個文件對象208,都是使用包括單獨的對象根節(jié)點和可選地包括許多間接節(jié)點、直接節(jié)點和存儲塊的單獨的樹結構來實現(xiàn)的。DSB 202包括指向間接對象204的根節(jié)點的指針。間接對象204包括指向其他對象的根節(jié)點的指針。
[0094]圖3是顯示依照本發(fā)明示例性實施例的對象樹結構的一般格式的示意性方框圖。根(“R”)節(jié)點302可以指向多個的間接(“I”)節(jié)點304,其中的每一個間接節(jié)點304可以指向許多直接(“D”)節(jié)點306,其中的每一個直接節(jié)點306可以指向許多存儲塊(“B”)308。實際上,對象樹結構可以例如根據(jù)對象的尺寸廣泛地變化。并且,當信息被添加到對象或從對象中被刪除時,特定對象的樹結構可以隨著時間變化。例如,當更多存儲空間被用于對象時,節(jié)點可以被動態(tài)地添加到樹結構,并且可以按照需要使用不同程度的間接(例如,間接節(jié)點可以指向直接節(jié)點或其他間接節(jié)點)。
[0095]當創(chuàng)建對象時,為對象創(chuàng)建對象根節(jié)點。最初,這種“空”對象的根節(jié)點沒有指向任何間接節(jié)點、直接節(jié)點、或者數(shù)據(jù)塊的指針。
[0096]當數(shù)據(jù)被添加到對象時,它首先被放入從根節(jié)點直接指向的數(shù)據(jù)塊中。這在圖4的圖表中被示出,顯示了沒有其他節(jié)點的根節(jié)點的使用。要注意的是,在該圖和所有以下的圖表中,為了簡單起見,根節(jié)點和直接節(jié)點被顯示為只有兩個數(shù)據(jù)指針,并且間接節(jié)點被顯示為只有兩個間接或直接節(jié)點指針。
[0097]—旦根節(jié)點內的所有直接塊指針被填滿,那么直接節(jié)點A被創(chuàng)建為具有從根節(jié)點指向直接節(jié)點的指針。圖5顯示了具有這種直接節(jié)點A的根節(jié)點的使用。要注意的是,根節(jié)點具有多個數(shù)據(jù)塊指針,但是只具有指向直接或間接節(jié)點的單一指針。
[0098]如果對象中的數(shù)據(jù)增長到填滿直接節(jié)點內的所有數(shù)據(jù)指針,那么創(chuàng)建間接節(jié)點B,如圖6所示。圖6顯示了具有間接節(jié)點和直接節(jié)點的根節(jié)點的使用。指向直接節(jié)點A的根節(jié)點中的指針被更改為指向間接節(jié)點B,并且在間接節(jié)點B中的第一指針被設置為指向直接節(jié)點A。同時,創(chuàng)建新的直接節(jié)點C,它也被從間接節(jié)點B所指向。隨著更多的數(shù)據(jù)被創(chuàng)建,更多的直接節(jié)點被創(chuàng)建,所有這些直接節(jié)點都被從間接節(jié)點所指向。
[0099]一旦間接節(jié)點B中的所有直接節(jié)點指針都已經(jīng)被使用了,另一個間接節(jié)點D被創(chuàng)建,其被插入在根節(jié)點和第一間接節(jié)點B之間。另一個間接節(jié)點E和直接節(jié)點F也被創(chuàng)建,以允許更多的數(shù)據(jù)塊被引用。這些情況都在圖7中被顯示,說明了被放置在根節(jié)點和直接節(jié)點之間的多個層的間接節(jié)點的使用。
[0100]添加間接節(jié)點以創(chuàng)建更高程度的間接的過程被重復,以容納對象所包含的無論多少的數(shù)據(jù)。
[0101]對象根節(jié)點包括檢查點編號以標識最后修改的對象所在的檢查點(檢查點編號最初標識被創(chuàng)建的對象所在的檢查點,其后,在新檢查點中,每次修改對象時,檢查點編號都發(fā)生改變)。在示例性實施例中,被創(chuàng)建的對象所在的檢查點編號也被存儲在對象根節(jié)點中。同樣,在對象根節(jié)點內的是標識對象類型的參數(shù),對象根節(jié)點為該對象提供元數(shù)據(jù)。對象類型可以是例如任何空閑空間、文件或目錄。除了對象類型以外,對象根節(jié)點還具有針對塊中對象長度的參數(shù)。
[0102]對象根節(jié)點還具有一系列的指針。其中之一是指向對象根節(jié)點的任何上一個版本的指針。如果出現(xiàn)保留的檢查點已經(jīng)被合適的檢查點所替換,那么存在那里有可能已經(jīng)存儲了對象根節(jié)點的上一個版本的疑問,并且指針標識對象根節(jié)點的這種前一個版本的扇區(qū)編號。
[0103]對于對象根節(jié)點對應的實際數(shù)據(jù),對象根節(jié)點包括指向與相應對象相關的每個數(shù)據(jù)塊的單獨的指針。多達18塊數(shù)據(jù)塊的位置被存儲在對象根節(jié)點內。對于數(shù)據(jù)超出18塊,額外地需要直接節(jié)點,在這種情況下,對象根節(jié)點還具有指向直接節(jié)點的指針,所述直接節(jié)點在對象根節(jié)點中被磁盤上的扇區(qū)編號所識別。
[0104]直接節(jié)點包括檢查點編號并且被布置為存儲與對象相一致的一定數(shù)量的塊(例如約60或61塊)的位置。
[0105]當?shù)谝恢苯庸?jié)點被充分利用于標識數(shù)據(jù)塊時,那么一個或多個間接節(jié)點被用來標識第一直接節(jié)點以及具有與該對象相對應的數(shù)據(jù)塊的額外的直接節(jié)點。在這種情況下,對象根節(jié)點具有指向間接節(jié)點的指針,并且間接節(jié)點具有指向相對應的直接節(jié)點的指針。當間接節(jié)點被充分利用時,隨后當必要時,額外的介入間接節(jié)點被利用。這種結構允許部分文件的快速識別,而無關于文件的分片。
[0106]本發(fā)明的多種實施例可以包括促進大型文件創(chuàng)建的機制,他們通常是在最初被創(chuàng)建時,用零填充的稀疏文件。
[0107]—種這樣的機制允許分配由零填充的數(shù)據(jù)塊而不將零實際地寫入數(shù)據(jù)塊。具體來說,對象根節(jié)點和直接節(jié)點包括用于每個塊指針來指示是否相應的塊被邏輯上用零填充(塊并不需要實際用零填充)的標志。因此,例如,當數(shù)據(jù)塊被分配而不是用零填充該數(shù)據(jù)塊時,與數(shù)據(jù)塊有關的比特可以被設置為指示數(shù)據(jù)塊被零填充,并且對數(shù)據(jù)塊的讀取訪問將返回零,而并不從數(shù)據(jù)塊實際上讀取數(shù)據(jù)。
[0108]類似的機制允許在不為文件實際分配所有數(shù)據(jù)塊和節(jié)點的情況下創(chuàng)建文件。具體來說,指向塊和其他節(jié)點的指針可以包括用來指示是否塊或其他節(jié)點已經(jīng)被實際創(chuàng)建的比特。在相關的塊和節(jié)點還沒有被創(chuàng)建的情況下,那么塊和節(jié)點被創(chuàng)建為需要適應寫入需求,并且分配比特被相應地切換。注意,創(chuàng)建塊需要空間的分配,將數(shù)據(jù)寫入塊,并為合適的節(jié)點設置比特標志。在一個特定的示例性實施例中,這種機制僅僅被用來創(chuàng)建文件而不分配所有的數(shù)據(jù)塊;其他文件節(jié)點如上所述被分配。
[0109]事務日志,也在元數(shù)據(jù)高速緩存內被保持為運行。
[0110]在示例性實施例中,也可以以進一步減少與節(jié)點結構有關的磁盤寫入的方式建立節(jié)點結構。最后,節(jié)點結構不僅需要容納文件內容的存儲還容納文件屬性的存儲。文件屬性包括多種參數(shù),包括文件尺寸、文件創(chuàng)建時間和日期,文件修改時間和日期,只讀狀態(tài)和訪問權限,以及其他。這種聯(lián)系利用這樣的事實:由于對象根節(jié)點尚未被寫入磁盤(即,如上所述,因為對象根節(jié)點的磁盤寫入被延遲),所以在給定的檢查點期間可以頻繁執(zhí)行對象根節(jié)點的內容的改變。因此,在示例性實施例中,一部分對象根節(jié)點被保留用于文件屬性的存儲。
[0111]更為普遍地,在示例性實施例中定義下面用于文件屬性存儲的結構:
[0112]以太網(wǎng)節(jié)點(enode)(更新的開銷少,容量有限)。在示例性實施例中,這個結構被限定在對象根節(jié)點中并且是128字節(jié)。
[0113]軟件元數(shù)據(jù)對象(更新的開銷高,接近無限容量)。這是一種用于元數(shù)據(jù)存儲的專門對象,因此在磁盤上有它自己的存儲位置;在以太網(wǎng)節(jié)點中識別對象。
[0114]因此,在示例性實施例中,每個對象根節(jié)點存儲以下類型的信息:
[0115]?檢查點的編號。
[0116]?用于該對象版本的數(shù)據(jù)長度。
[0117]?在運行列表中,用于該對象的間接程度的編號。
[0118]籲對象的類型。在請求進入訪問對象時,這主要被用作完整性檢查。
[0119]?為保留的檢查點(如果存在的話)制作的指向較舊的根節(jié)點版本的指針。
[0120]?指向較新的根節(jié)點版本的指針(僅僅在這是為保留的檢查點所做的根節(jié)點的副本時有效)。
[0121]?多達19個數(shù)據(jù)塊描述符。每個數(shù)據(jù)塊描述符包括指向數(shù)據(jù)塊的指針、檢查點編號、和表示塊是否被零填充的比特。
[0122]?指向直接節(jié)點或者指向間接節(jié)點的單一指針。
[0123]?用于該對象的以太網(wǎng)節(jié)點數(shù)據(jù)的128字節(jié)。
[0124]?允許根節(jié)點被檢查有效性的CRC和多種完整性雙字。
[0125]如下面所討論的,對象可以包括每次執(zhí)行保留的檢查點時所創(chuàng)建的根節(jié)點的副本。指向較舊根節(jié)點版本的指針和指向較新根節(jié)點版本的指針允許根節(jié)點的雙鏈表被創(chuàng)建為包括當前根節(jié)點以及為保留的檢查點所創(chuàng)建的根節(jié)點的任何副本。雙鏈表輔助保留的檢查點的創(chuàng)建和刪除。
[0126]如上面所討論的,間接節(jié)點提供了根節(jié)點和直接節(jié)點之間的間接程度。在示例性實施例中,下列信息被存儲在間接節(jié)點中:
[0127]?檢查點的編號。
[0128]?指向間接節(jié)點或者指向直接節(jié)點的指針(如,多達122個這樣的指針)。
[0129]籲允許間接節(jié)點被檢查有效性的CRC和多種完整性雙字。
[0130]如上面所討論的,直接節(jié)點提供了指向磁盤上的數(shù)據(jù)塊的直接指針。在示例性實施例中,以下信息被存儲在直接節(jié)點中:
[0131]?檢查點的編號。
[0132]?許多數(shù)據(jù)塊描述符(如,多達62個這樣的描述符)。每個數(shù)據(jù)塊描述符包括指向數(shù)據(jù)塊的指針、檢查點編號、和表示塊是否被零填充的比特。
[0133]籲允許間接節(jié)點被檢查有效性的CRC和多種完整性雙字。
[0134]從對象和數(shù)據(jù)塊和直接以及間接節(jié)點刪除的數(shù)據(jù)是不再需要的,它們被返回到空閑空間分配控制器。
[0135]根據(jù)一個實施例,間接程度的編號隨著對象的變小而減少,直到對象中的所有數(shù)據(jù)通過根節(jié)點中的直接塊指針可以被引用時,其余的直接和間接節(jié)點全部被釋放并且間接程度將被設置為零。
[0136]如果向特定文件對象的寫入操作具有超出對象當前末尾的開始偏移或對象的長度被設置為大于當前長度,那么對象的未定義部分(例如,在對象當前的末尾和新寫入數(shù)據(jù)的開始之間)通常用零填充。在典型的實施中,這涉及到為對象的所有由零填充的部分分配磁盤塊并且用零填充那些磁盤塊。對于IGB的文件,這可能要花10秒鐘的量級。對于ITB的文件,可能要花3小時的量級。
[0137]在本發(fā)明的示例性實施例中,并不實際上用零填充與對象的未定義部分相關的數(shù)據(jù)塊,而是那些數(shù)據(jù)塊的內容是被保留未被寫入,并且每個數(shù)據(jù)塊指針內的比特被用來說明塊是被認為由零填充的。如果文件服務器9002(并且,特別是對象存儲子模塊)看到這個比特設置,那么,即使在磁盤上,塊可以包含完全不同的東西,文件服務器也知道塊應該被零填充。如果塊被讀取,那么文件服務器9002為這個塊返回零,而不返回其實際存在于磁盤上的內容。如果塊以不填滿整個塊的方式被寫入,那么文件服務器9002將零寫入到?jīng)]有被寫入的塊的部分,并且,隨后為這個塊重置“由零填充”比特。
[0138]另一個與將對象的長度設置為一些非常大的值相關的考慮是分配數(shù)據(jù)塊和創(chuàng)建所需的直接和間接節(jié)點結構所花費的時間。例如,在示例性實施例中,使用尺寸為4K的磁盤塊,ITB對象需要大約4百萬個直接節(jié)點以及較少數(shù)量的間接節(jié)點。這可以花費40秒的量級來向磁盤寫入。所有所需數(shù)據(jù)塊的空閑空間分配、以及后續(xù)更新到空閑空間位圖也將大大增加這個時間。如果在文件創(chuàng)建開始之后立即執(zhí)行檢查點,那么整個系統(tǒng)通常會在整個這個時間中停止服務請求(至任何卷)。
[0139]在本發(fā)明的替選實施例中,這個問題可以通過不實際為文件的由零填充的部分分配磁盤塊被解決,如上所述的。這意味著當對象存儲看到對零填充塊的寫入時,它首先必須將磁盤空間分配給那個塊,并且把指向它的指針放入相關的節(jié)點結構。
[0140]在另一個替選實施例中,除了不實際將磁盤塊分配給文件的由零填充的部分以夕卜,這個問題也可以通過不創(chuàng)建相應的節(jié)點結構而被解決。要實施這個方面,每個節(jié)點指針可以包括用來表示它指向的節(jié)點是否被分配的比特。如果節(jié)點沒被分配,那么當出現(xiàn)要求節(jié)點是有效的操作時,只有那時,磁盤空間才會被分配給它,并且插入正確的指針。通過這種方式,巨大的由零填充的對象可以只有能夠很快被創(chuàng)建的根節(jié)點。
[0141]對象編號和間接對象
[0142]在文件存儲系統(tǒng)內,每個對象都和用于引用該對象的對象編號相關聯(lián)。系統(tǒng)對象通常有固定的、預定義的對象編號,因為他們通??偸谴嬖谟谙到y(tǒng)內的。文件對象通常是從有效的對象編號池中被動態(tài)分配的對象編號。這些文件對象編號在某些情況下可以被重復使用(例如,當文件被刪除時,它的對象編號可以被釋放以便由后來的文件對象重復使用)。
[0143]圖8顯示了本發(fā)明示例性實施例中的對象編號分配的表現(xiàn)。具體來說,文件系統(tǒng)可以包括Z對象編號(其中,Z是可變的,并且可以隨對象數(shù)量的增加而隨著時間增長)。一定范圍的對象編號被保留給系統(tǒng)對象206(在這個例子中,對象編號1-J),并且其余對象編號(在這個例子中,對象編號K-Z)被分配給文件對象208。通常,系統(tǒng)對象206的編號是固定的,而文件對象208的編號可以變化。
[0144]在示例性實施例中,間接對象204邏輯上被組織為表格,用對象編號索引的每個對象有一個表項目。如圖9所示,表格中的每個項目502包括對象類型字段和指針字段。對象類型字段定義許多不同的值,但為了討論,一組值被定義為“已使用”對象并且另一組值被定義為“空閑”對象。因此,特定表項目的對象類型字段中的值將表明相應的對象編號是否已使用還是空閑。
[0145]每個已使用的表項目的指針字段包括指向對象的根節(jié)點的指針。當對象被創(chuàng)建時,對象根節(jié)點被創(chuàng)建(如上面所討論的),并且對象編號被分配給對象。指向對象根節(jié)點的指針被存儲在間接對象204中,特別是被存儲在與已分配的對象編號相關的表項目內。因此,基于對象的對象編號,特別是通過索引間接對象表格結構并且訪問指針字段,文件服務器9002可以容易地定位任何對象的對象根節(jié)點。最初,這種“空”對象的根節(jié)點沒有指向任何間接節(jié)點、直接節(jié)點、或者數(shù)據(jù)塊的指針,盡管數(shù)據(jù)塊、間接節(jié)點和直接節(jié)點可以隨著時間被添加到對象樹結構。
[0146]空閑表項目的指針字段被用來維持一個或多個空閑對象編號列表(并且最好兩個單一鏈接的、非循環(huán)的空閑對象編號列表,例如,在于2007年10月12日提交的、題為uSystemiDevice?and Method for Validating Data Structures in a Storage System(存儲系統(tǒng)中驗證數(shù)據(jù)結構的系統(tǒng)、裝置和方法)”的美國臨時專利申請N0.60/979,561中所描述的,并且通過引用將其全部合并于此。
[0147]具體來說,與每個空閑對象編號相關聯(lián)的表項目包括對在其空閑對象編號列表中的下一個空閑對象編號的引用,而不是指向對象的根節(jié)點的指針。因為在示例性實施例中空閑對象編號列表是單一鏈接的、非循環(huán)列表,因此在空閑對象編號列表內與最后空閑對象編號相關聯(lián)的表項目包括“空”引用(例如,該值為零)。
[0148]從理論上說,在間接對象中維持單一空閑對象列表編號是可能的。隨著新對象被創(chuàng)建,列表中的空閑對象編號可以被重復利用和從列表中移除,并且隨著將對象從系統(tǒng)刪除,空閑對象編號可以被加入到列表中。
[0149]然而,在本發(fā)明示例性實施例中,兩個單獨的空閑對象編號列表被維持在間接對象中,一個列出可立即被用于重復利用的空閑對象編號,另一個列出不能立即被用于重復利用的最新釋放為空閑的對象編號。在這個示例性實施例中,文件服務器有時執(zhí)行文件系統(tǒng)的“檢查點”或“快照”,(例如,以下描述的,或于2002年11月I日以Geoffrey S.Barrall等人名義提交的題為“Apparatus and Method for Hardware-Based File System(用于基于硬件的文件系統(tǒng)的設備和方法)”的美國專利申請N0.10/286,015和于2007年8月20日以Geoffrey S.Barrall等人名義提交的題為“Apparatus and Method for Hardware-BasedFile System(用于基于硬件的文件系統(tǒng)的設備和方法)”的美國專利申請N0.11/841,353所討論的,通過引用的方式將這兩個申請全部合并于此),這樣,在任何給定的時間,文件服務器都具有文件系統(tǒng)的“工作副本”,例如當對象被創(chuàng)建、刪除和修改時,該文件系統(tǒng)的“工作副本”都可以改變。由于種種原因,對于這個示例性實施例來說很重要的是確保隨著時間的推移,對被分配了特定重復利用的對象編號的不同對象給予不同的對象句柄。因此,在這個示例性實施例中,兩個空閑對象編號列表被用于確保特定的對象編號不能在文件系統(tǒng)的相同的工作副本內被釋放和被重復利用(即,通過將已被釋放的對象編號添加到一個列表,但是從其他列表分配對象編號),并且當對象被創(chuàng)建時,當前檢查點編號的后面32比特被包括在對象句柄中,以便在不同檢查點中創(chuàng)建的對象會有不同的句柄。因此,在文件系統(tǒng)的任何特定的工作副本期間,文件服務器重復利用來自一個列表的空閑對象編號,同時將新釋放的對象編號添加到其他列表。在每個“檢查點”,兩個列表的角色都被“交換”,以便在以前的檢查點期間被釋放的對象編號可以被重復利用,同時在當前的檢查點期間被釋放的新的對象編號不可以在該檢查點期間被重復利用。在新對象被創(chuàng)建時,如果被重復利用的空閑對象編號所在的列表是空的,那么為了提供額外的空閑對象編號,間接對象被擴展(即便在另一列表中可能實際上存在一些空閑對象編號)。然而實際上,由于在每個檢查點上的角色交換,兩個列表通常都會隨著時間的推移積累許多空閑對象編號,所以在穩(wěn)定狀態(tài)下間接對象應該不需要經(jīng)常被擴展。
[0150]在示例性實施例中,DSB202包括指向間接對象204(并且,更具體地說,指向間接對象204的根節(jié)點)的指針,并且還包括兩個指針,每個指針用于間接對象204中的一個空閑對象編號列表。每個指針指向表項目的各自空閑對象編號列表的開始處。因為DSB 202被存儲在存儲系統(tǒng)內的固定位置上,并且包括指向間接對象204和間接對象204內的空閑對象編號列表的指針,因此文件服務器9002可以容易地定位間接對象204(并因此定位任何其他對象的根節(jié)點)以及使用DSB 202的空閑對象編號列表。
[0151]因此,再次參照圖4中所示的間接對象204的表格結構,特定表項目的對象類型字段的值將表示相應的對象編號是否被使用還是空閑的。如果該對象編號被使用了,那么該表項目的指針字段將包括指向相應對象的根節(jié)點的指針。然而,如果該對象編號是空閑的,那么該表項目的指針字段將包括對在其空閑對象編號列表中的下一個空閑對象編號的引用。
[0152]一般來說,已釋放的對象編號被添加到空閑對象編號列表的頭部部分,并且被重復利用的對象編號也來自空閑對象編號列表的頭部部分。
[0153]如在題為“System,Device,andMethod for Validating Data Structures in aStorage System(存儲系統(tǒng)中驗證數(shù)據(jù)結構的系統(tǒng)、裝置和方法)”的美國臨時專利申請N0.60/979,561中所述的,有時,為了確保所有空閑對象編號被包括在空閑對象編號列表中并且沒有“已使用”的對象編號被包括在空閑對象編號列表中,驗證間接對象204(包括空閑對象編號列表)可能是必要或期望的。驗證間接對象204(包括空閑對象編號列表)的一種方法是從開始到結束遍歷每個空閑對象編號列表,以確保不存在循環(huán)并確保列表末尾具有空引用。然而,在工作數(shù)據(jù)存儲系統(tǒng)中,大量的對象隨著時間被創(chuàng)建和刪除并不罕見,從而空閑對象編號列表可以變得相當長。此外,空閑對象編號列表沒有被排序,而是隨著對象編號發(fā)生被使用和被釋放而更新,所以遍歷空閑對象編號列表通常需要根據(jù)對單一鏈接列表的引用,逐一跳躍間接對象204。空閑對象編號列表的這種遍歷通常是緩慢和低效的。
[0154]因此,在本發(fā)明的示例性實施例中,間接對象表格結構被從頂?shù)降椎匮虮闅v,并且使用位圖或其他適當?shù)臄?shù)據(jù)結構跟蹤“已使用”和“空閑”對象編號。具體來說,如果特定的對象編號被使用,那么位圖中相應的比特被標記;如果該比特已經(jīng)被標記了,那么間接對象是損壞的(如,因為“已使用”的對象編號被較早的“空閑”項目錯誤地引用)。如果特定對象編號是空閑的,那么在間接對象表格結構中的相應項目包括對空閑對象編號列表中下一個空閑對象編號的引用,所以對應于這種下一個空閑對象編號的比特被標記在位圖中;如果該比特已經(jīng)被標記,那么間接對象是損壞的(如,因為空閑對象編號列表包括了“已使用”對象編號或因為空閑對象編號列表包括循環(huán)引用)。在整個間接對象表格結構已經(jīng)被遍歷后,由DSB 202中的指針所指向的兩個開始表格條目被檢查,如果任一表格項目是“已使用”,那么間接對象是損壞的。此外,在整個間接對象表格結構被遍歷后,應該被保留為不做標記的唯一比特是與兩個空閑對象編號列表的兩個開始表項目相關聯(lián)的比特,該兩個比特由DSB 202中的指針所指。如果這些比特中的任一個被標記,那么間接對象是損壞的。如果位圖中任何其他比特是未被標記的,那么相應的對象編號既沒有被使用也沒有被包括在空閑對象編號列表中,在這種情況下,間接對象是可用的(因為在正常過程中,這種“未鏈接”的空閑項目不會被重復利用)??梢詧?zhí)行額外的處理以確保每個空閑對象編號列表以空引用終止。
[0155]在多種替選實施例中,位圖可以被初始化為全部是零,并且位圖中的比特可以通過設置比特(即,設置成一)被“標記”;就這一點而言,所謂的“測試并設置”操作既可被用于測試比特的值又可被用于在單一操作中設置比特。替選地,位圖可以被初始化為全部為一,并且位圖中的比特可以通過清空比特(即,為零)被“標記”。當然,其他類型的數(shù)據(jù)結構和其他類型的標記方案可以被用于其他實施例。本發(fā)明并不局限于位圖的使用或數(shù)據(jù)結構或標記方案的任何特定類型。
[0156]在示例性實施例中,間接對象可以被實現(xiàn)為沒有實際存儲塊的“偽文件”。在示例性實施例中,不具有指向對象樹結構中的實際數(shù)據(jù)塊的指針(例如,如圖2所示),而是在間接對象樹結構中的這種指針指向對應對象的根節(jié)點。因此,在示例性實施例中,間接對象將每個對象編號映射為與對應的文件系統(tǒng)對象相關的根節(jié)點的扇區(qū)地址。間接對象樹結構可以基于對象編號隨后被遍歷,以獲取指向對應對象的根節(jié)點的指針。
[0157]在示例性實施例中,間接對象“偽文件”被結構化,以便一個共用的代碼可以被用來基于對象編號遍歷間接對象樹結構,以獲取指向對應對象的根節(jié)點的指針并且基于文件偏移遍歷其他對象樹結構,以獲取指向對應數(shù)據(jù)塊的指針。在這種實施例中,對象編號基本上被轉換成虛擬文件偏移,然后間接對象樹結構以使用實際文件偏移遍歷其他對象樹結構相同的方式被遍歷。具有可用于遍歷間接對象“偽文件”樹結構和其他對象樹結構的共用代碼的一個優(yōu)勢在于,單一邏輯塊可以被用于兩個函數(shù),這對于硬件中的樹遍歷函數(shù)是特別有利的。示例性系統(tǒng)對象
[0158]如上所述,文件系統(tǒng)包括多種類型的系統(tǒng)對象。一般來說,盡管某些系統(tǒng)對象可以具有可變的對象編號,但是系統(tǒng)對象有固定的、預定義的對象編號。以下是本發(fā)明示例性實施例中的一些系統(tǒng)對象的描述。
[0159]根目錄對象是系統(tǒng)對象(S卩,它具有根節(jié)點和固定的預定義對象編號),其將文件名稱映射為對應的對象編號。因此,當文件被創(chuàng)建時,文件存儲系統(tǒng)為文件分配根節(jié)點,為文件指定對象編號,將項目添加到將文件名映射為對象編號的根目錄對象,并且為文件向將項目添加到將對象編號映射為根節(jié)點的磁盤地址的間接對象。間接對象中的項目將根目錄對象編號映射為根目錄對象的根節(jié)點的磁盤地址。
[0160]圖10是原理方框圖,展示了根據(jù)本發(fā)明示例性實施例,DSB202、間接對象204、根目錄對象606和文件對象208之間的一般關系。如上所述,間接對象中的項目將根目錄對象編號映射為根目錄對象的根節(jié)點的磁盤地址,根目錄對象將文件名映射為對象編號,并且間接對象將對象編號映射為對象。因此,當文件服務器9002需要基于對象的文件名稱定位對象時,文件服務器9002可以通過間接對象定位根目錄對象606(即,使用與根目錄對象606相關的對象編號),使用根目錄對象606將文件名映射為與其對應的對象編號,然后使用對象編號通過間接對象定位對象。
[0161]空閑空間位圖對象是系統(tǒng)對象(S卩,它具有根節(jié)點和固定的預定義的對象編號),其顯示文件存儲系統(tǒng)中的空閑存儲塊。間接對象中的項目將空閑空間位圖對象編號映射為空閑空間位圖對象的根節(jié)點的磁盤地址。
[0162]修改后的檢查點對象列表對象是系統(tǒng)對象(S卩,它具有根節(jié)點和固定的預定義的對象編號),其識別在檢查點循環(huán)期間已經(jīng)被創(chuàng)建或修改的對象。在每個檢查點的開始,修改后的檢查點對象列表對象被創(chuàng)建。當每次作為該檢查點的一部分創(chuàng)建或修改不同的對象時,其對象編號被寫入到修改后的檢查點對象列表對象,以便在檢查點被創(chuàng)建時,存在列出在那個檢查點中所有被創(chuàng)建或修改的對象的對象。
[0163]空閑塊對象是系統(tǒng)對象,其被用于在特定的檢查點期間,由文件系統(tǒng)已經(jīng)變?yōu)槲幢皇褂玫臄?shù)據(jù)塊的跟蹤??臻e塊對象列出了可被釋放的扇區(qū)地址。特定數(shù)據(jù)塊被文件系統(tǒng)已經(jīng)變?yōu)槲幢皇褂玫氖聦嵅⒉灰欢ㄒ馕吨鴶?shù)據(jù)塊可以被釋放以重復使用,因為數(shù)據(jù)塊可以與較早的檢查點和/或保留的檢查點相關聯(lián)。因此,其他機制(如,后臺清理任務)通常被用于決定如何以及何時可以釋放塊。
[0164]在一個預期的實施例中,文件存儲系統(tǒng)會為N個檢查點保持N個空閑塊對象(其中N通常大于二),而間接對象包括用于使用固定的預定空閑塊對象編號的N個空閑塊對象的單獨的項目(即,在間接對象中的N個項目)。在這種實施例中,當特定檢查點(如,第N+1個檢查點)被刪除時,文件存儲系統(tǒng)會處理與那個檢查點相關聯(lián)的空閑塊對象,以便包含在其中的ig息不會丟失。
[0165]在一個替換的實施例中,文件存儲系統(tǒng)可以保持超過N個空閑塊對象(即使只有N個檢查點被保持),以便空閑塊對象可以使用后臺清理過程而不是運行時過程被處理。在這種實施例中,由于系統(tǒng)中空閑塊對象的數(shù)量可以變化,所以在間接對象中具有固定數(shù)量的項目并不實用,因此空閑塊對象的目錄(如,空閑塊目錄對象)可以被替代使用。在這里,間接對象中的單一項目可以被用于空閑塊目錄對象,并且空閑塊目錄對象可以保持指向單個空閑塊對象的指針。
[0166]保留的檢查點配置對象是系統(tǒng)對象,其被用于維持保留的檢查點的列表。在間接對象中的項目將保留的檢查點配置對象編號映射為保留的檢查點配置對象的根節(jié)點的磁盤地址。保留的檢查點配置對象在下面進一步詳細討論。
[0167]多路檢查點
[0168]在特定實施例中,多個檢查點可以被執(zhí)行以便文件系統(tǒng)的多個版本可以隨著時間而被保持。例如,多個單獨的根結構(在下文中被稱為“動態(tài)超級塊”或“DSB”)被用于管理文件系統(tǒng)的多個實例。為了易于訪問,DSB優(yōu)選地被存儲在存儲系統(tǒng)中的固定位置中以便于訪問,雖然DSB可以替選地以其他方式被存儲。通常存在超過兩個DSB,DSB的數(shù)量可以是固定的或變化的。對于DSB的數(shù)量沒有理論上的限制(雖然對于多種實施可以有實際上的限制)。通過這種方式,如果必須或希望將文件系統(tǒng)恢復回之前的“檢查點”,那么存在多個可供選擇的“檢查點”,這提供存在將文件系統(tǒng)可以恢復成的文件系統(tǒng)的完整版本或存在包含文件系統(tǒng)特定版本的檢查點的更好機會。
[0169]文件系統(tǒng)請求的處理由一系列檢查點描述,以不少于一些用戶指定時間間隔的頻繁程度,比如每10秒預定出現(xiàn)檢查點。檢查點可以在其他時間被執(zhí)行,例如,如果超過一半的正用于當前檢查點的非易失性RAM已經(jīng)滿了、如果扇區(qū)高速緩存正在變滿、如果用戶請求保留檢查點(下面討論)、或在其他適當?shù)那闆r下。
[0170]對每個連續(xù)的檢查點,存在在磁盤上存儲的當前文件結構信息,其取代來自前一個檢查點的以前存儲的文件結構信息。檢查點被循序編號并被用于文件請求的臨時分組處理。
[0171]如上所述,本發(fā)明的示例性實施例保持N個DSB(其中N大于二,例如,16)ASB被用來執(zhí)行連續(xù)的檢查點。
[0172]因此,在任何給定的時間,存在文件系統(tǒng)的當前(工作)版本和文件系統(tǒng)的一個或多個檢查點版本。由于存儲系統(tǒng)通常是非常動態(tài)的,所以文件系統(tǒng)的當前版本幾乎肯定會在執(zhí)行檢查點之后幾乎立即開始改變。例如,文件系統(tǒng)對象可以隨時間被添加、刪除或修改。然而,為了保持檢查點,沒有一種與存儲的檢查點相關聯(lián)的結構可以被允許改變,至少直至特定的檢查點被刪除或重寫。因此,隨著文件系統(tǒng)的當前版本中的對象被添加、刪除和修改,對象樹結構的新版本根據(jù)需要被創(chuàng)建,并且多種指針被相應的更新。
[0173]例如,圖11示意性顯示了在I號檢查點被創(chuàng)建的示例性對象的對象結構。該對象包括四個數(shù)據(jù)塊,即數(shù)據(jù)塊0(2310),數(shù)據(jù)塊1(2312),數(shù)據(jù)塊2(2314)和數(shù)據(jù)塊3(2316)。直接節(jié)點2306包括指向數(shù)據(jù)塊O (2310)的指針和指向數(shù)據(jù)塊I (2312)的指針。直接節(jié)點2308包括指向數(shù)據(jù)塊2 (2314)的指針和指向數(shù)據(jù)塊3 (2316)的指針。間接節(jié)點2304包括指向直接節(jié)點2306的指針和指向直接節(jié)點2308的指針。根節(jié)點2302包括指向間接節(jié)點2304的指針。所有節(jié)點和所有數(shù)據(jù)塊都被標記有I號檢查點。
[0174]假設現(xiàn)在,數(shù)據(jù)塊0(2310)要在3號檢查點被修改。因為根節(jié)點2402是較早檢查點的部分,它不能被修改。相反,文件服務器9002的對象存儲子模塊保存舊的根節(jié)點2302的副本存儲到磁盤上的空閑空間,并將這個新的根節(jié)點標記為3號檢查點(S卩,新的根節(jié)點被創(chuàng)建的檢查點)。圖12示意性地顯示了創(chuàng)建新的根節(jié)點2403后的對象結構。在這個點上,根節(jié)點2402和新的根節(jié)點2403都指向間接節(jié)點2304。
[0175]對象存儲子模塊隨后遍歷在根節(jié)點開始的對象結構,直到它到達數(shù)據(jù)塊0(2310)的描述符。由于數(shù)據(jù)塊0(2310)是較早檢查點的部分,因此它不能被修改。相反,對象存儲子模塊在磁盤上的空閑空間中創(chuàng)建數(shù)據(jù)塊2310的修改后的副本,并將這個新的數(shù)據(jù)塊標記為3號檢查點(S卩,新的數(shù)據(jù)塊被創(chuàng)建的檢查點)。圖13示意性地顯示了新的數(shù)據(jù)塊2510的創(chuàng)建之后的對象結構。
[0176]對象存儲子模塊現(xiàn)在需要將指向新的數(shù)據(jù)塊2510的指針放入直接節(jié)點,但是對象存儲子模塊不能將指向新的數(shù)據(jù)塊2510的指針放入直接節(jié)點2306,因為直接節(jié)點2306是較早檢查點的組件。對象存儲子模塊因此將直接節(jié)點2306的修改后的副本創(chuàng)建到包括指向新的數(shù)據(jù)塊0(2510)和舊的數(shù)據(jù)塊1(2312)的指針的磁盤上的空閑空間中,并將這個新的直接節(jié)點標記為3號檢查點(S卩,新的數(shù)據(jù)塊被創(chuàng)建的檢查點)。圖14示意性地顯示了新的直接節(jié)點2606被創(chuàng)建后的對象結構,新的直接節(jié)點2606包括指向新的數(shù)據(jù)塊O (2510)和舊的數(shù)據(jù)塊I (2312)的指針。
[0177]對象存儲子模塊現(xiàn)在需要將指向新的直接節(jié)點2606的指針放入間接節(jié)點,但是對象存儲子模塊不能將指向新的直接節(jié)點2606的指針放入間接節(jié)點2304,因為間接節(jié)點2304是較早檢查點的組件。對象存儲子模塊因此創(chuàng)建具有指向新的直接節(jié)點2606和舊的直接節(jié)點2308的指針的間接節(jié)點2304的修改后的副本。圖15示意性地顯示了新的間接節(jié)點被創(chuàng)建后的對象結構,該新的間接節(jié)點包括指向新的直接節(jié)點2606和舊的直接節(jié)點2308的指針。
[0178]最后,對象存儲子模塊將指向新的間接節(jié)點2704的指針寫入新的根節(jié)點2403。圖16示意性地顯示了指向新的間接節(jié)點2704的指針被寫入新的根節(jié)點2403后的對象結構。
[0179]應該注意的是,在完成數(shù)據(jù)塊O的修改后,塊2402、2304、2306和2310是對象的檢查點I版本的組件但不是當前檢查點3版本的組件;塊2308、2312、2314和2316既是對象的檢查點I版本的組件也是當前檢查點3版本的組件;塊2403、2704、2606和2510是對象的當前檢查點3版本的組件但不是檢查點I版本的組件。
[0180]還應當注意的是,新節(jié)點并不必需要按照上述的順序被創(chuàng)建。例如,新的根節(jié)點可以最后被創(chuàng)建而不是最先被創(chuàng)建。
[0181 ]因此,當文件系統(tǒng)對象被修改時,通過對象樹結構傳播修改,因此對已修改的對象創(chuàng)建新的根節(jié)點。只需要在給定的檢查點中為對象創(chuàng)建一次新的根節(jié)點;新的根節(jié)點可以在單一的檢查點期間被修訂多次。
[0182]為了在文件系統(tǒng)的當前版本中包括對象的新版本,當前的間接對象被修改為指向已修改對象的根節(jié)點,而不指向對象的之前版本的根節(jié)點。例如,再次參照圖16,對于與該對象相關聯(lián)的對象編號,當前間接對象可以被更新為指向根節(jié)點2403而非指向根節(jié)點2402 ο
[0183]相似的,如果在文件系統(tǒng)當前版本中創(chuàng)建新的對象或刪除現(xiàn)有對象時,當前的間接對象被相應的更新。例如,如果新的對象被創(chuàng)建,則間接對象被修改為包括指向新對象的根節(jié)點的指針。如果現(xiàn)有的對象被刪除,則間接對象被修改為將相應的對象編號標記為空閑的。
[0184]由于間接對象也是具有根節(jié)點的樹結構,所以間接對象的修改也通過樹結構傳播,以使得可以為修改后的間接對象創(chuàng)建新的根節(jié)點。同樣,只需要在給定的檢查點中為間接對象創(chuàng)建一次新的根節(jié)點;新的根節(jié)點在單一的檢查點期間可以被修訂多次。
[0185]因此,在特定的檢查點期間創(chuàng)建間接對象的新版本時,對于修改后的間接對象,與檢查點相關聯(lián)的DSB被更新為指向用于修改后的間接對象的新的根節(jié)點。因此,文件系統(tǒng)的每個版本(即,當前版本和每個檢查點版本)通常將包括間接對象的單獨版本,每個版本具有不同的間接對象根節(jié)點(但可能共享一個或多個間接節(jié)點、直接節(jié)點、和/或數(shù)據(jù)塊)。
[0186]在一個示例性實施例中,DSB被當作循環(huán)列表處理,并且在預定的時間間隔繼續(xù)執(zhí)行檢查點,這樣在穩(wěn)定狀態(tài)期間,每個新的檢查點“重寫”舊的檢查點,造成由“重寫的”檢查點所表述的文件系統(tǒng)的舊版本的丟失。
[0187]圖17是顯示了根據(jù)本發(fā)明示例性實施例的,在執(zhí)行檢查點之前的多種文件系統(tǒng)結構的示意圖。具體來說,顯示了編號202和203的兩個DSB JSB 202與文件系統(tǒng)的當前版本相關聯(lián),并包括指向間接對象204的當前版本的根節(jié)點的指針。DSB 203是下一個可用的DSB。
[0188]為了從文件系統(tǒng)的當前版本創(chuàng)建檢查點,在循環(huán)列表中的下一個DSB(即,本示例中的DSB 203)為新的檢查點被初始化。除此之外,這種初始化包括將下一個檢查點編號寫入到DSB 203中并且將指向間接對象204的根節(jié)點的指針存儲到DSB 203中。圖18顯示了依據(jù)本發(fā)明示例性實施例的,在執(zhí)行檢查點之后的多種文件系統(tǒng)結構的示意圖。在該點上,DSB 202代表文件系統(tǒng)的最近的檢查點版本,而DSB 203代表文件系統(tǒng)的當前(工作)版本。
[0189]如上所述,當對象被創(chuàng)建、修改和刪除時,文件系統(tǒng)的當前版本可以改變。此外,如上所述,當文件系統(tǒng)的當前版本改變時,間接對象的新版本(具有新的根節(jié)點)被創(chuàng)建。因此,如在圖18中所描述的,當間接對象的當前版本在執(zhí)行檢查點之后變化時,從而新的間接對象根節(jié)點被創(chuàng)建,當前文件系統(tǒng)版本的DSB(S卩,圖18中的DSB 203)被更新為指向新的間接對象根節(jié)點而不是指向之前的間接對象根節(jié)點。圖19是顯示了根據(jù)本發(fā)明示例性實施例的,在間接對象的修改之后的多種文件系統(tǒng)結構的示意圖。在這里,與文件系統(tǒng)的檢查點版本相關聯(lián)的DSB 202指向間接對象204的檢查點版本,同時與文件系統(tǒng)的當前版本相關聯(lián)的DSB 203指向新的間接對象205的根節(jié)點。
[0190]如上所述,通常定期執(zhí)行檢查點,以便文件系統(tǒng)的多個版本隨著時間被保持。在每個檢查點,文件系統(tǒng)的當前(工作)版本移到循環(huán)列表中的下一個連續(xù)的DSB。當從系統(tǒng)刪除特定檢查點版本時(例如,因為它的DSB已經(jīng)被重復使用),與已刪除的檢查點相關聯(lián)的存儲器在適當?shù)臅r候可以被恢復,例如,使用標識并釋放不再被使用的存儲器的后臺任務。
[0191]在一個替選實施例中,特定DSB可以作為連續(xù)檢查點的當前的DSB被重復使用,其他DSB被用于保存文件系統(tǒng)的檢查點版本。
[0192]圖20是顯示依據(jù)本發(fā)明示例性實施例的,在執(zhí)行檢查點之前的多種文件系統(tǒng)結構的示意圖。具體來說,顯示了編號202和203的兩個DSB JSB 202與文件系統(tǒng)的當前版本有關,并包括指向間接對象204的當前版本的根節(jié)點的指針。DSB 203是下一個可用的DSB。
[0193]為了從文件系統(tǒng)的當前版本創(chuàng)建檢查點,為新的檢查點初始化下一個DSB203。除此之外,這種初始化包括將下一個檢查點編號寫入DSB 203中并將指向間接對象204的根節(jié)點的指針存儲到DSB 203中。圖18是顯示依據(jù)本發(fā)明示例性實施例的,在執(zhí)行檢查點之后的多種文件系統(tǒng)結構的示意圖。在該點中,DSB 203代表文件系統(tǒng)最新的檢查點版本,同時DSB202繼續(xù)代表文件系統(tǒng)的當前(工作)版本。
[0194]如上所述,當對象被創(chuàng)建、修改和刪除時,文件系統(tǒng)的當前版本可以改變。同樣,如上所述,當文件系統(tǒng)的當前版本改變時,間接對象的新版本(具有新的根節(jié)點)被創(chuàng)建。因此,當間接對象的當前版本在執(zhí)行圖21所示的檢查點之后變化時,這種新的間接對象根節(jié)點被創(chuàng)建,當前文件系統(tǒng)版本的DSB(即,圖21中的DSB 202)被更新為指向新的間接對象根節(jié)點而不指向之前的間接對象根節(jié)點。圖22是顯示依據(jù)本發(fā)明示例性實施例的,在間接對象的修改之后的多種文件系統(tǒng)結構的示意圖。在這里,與文件系統(tǒng)的檢查點版本相關聯(lián)的DSB 203指向間接對象204的檢查點版本,同時繼續(xù)與文件系統(tǒng)的當前版本相關聯(lián)的DSB202指向新的間接對象205的根節(jié)點。
[0195]當卷被安裝好時,系統(tǒng)通常將要回到最后的有效檢查點。然而,可能會有系統(tǒng)或用戶選擇恢復到較早的有效檢查點的時候。在本發(fā)明的實施例中,文件服務器9002能夠保持超過一個的檢查點,所以可以存在文件系統(tǒng)可被恢復到的文件系統(tǒng)的多個版本??梢蕴峁嵱贸绦?,以允許操作者檢驗多種檢查點版本的內容,以便輔助用于返回文件系統(tǒng)的檢查點版本的選擇。
[0196]盡管N個檢查點可以被保持在系統(tǒng)中(其中,N通常大于二,并且可以是用戶可配置的),可以提供用戶觸發(fā)機制以保留檢查點,以便它將維持有效并可訪問(只讀),直到用戶選擇刪除它。保留的檢查點基本上是在特定檢查點上的文件系統(tǒng)結構的只讀版本??梢詧?zhí)行多個保留的檢查點,并且包括用于刪除所選定的保留的檢查點或將文件系統(tǒng)返回到所選定的保留的檢查點的機制(例如,將文件系統(tǒng)返回到緊隨災難的已知狀態(tài))。只要保留的檢查點仍然有效,包含保留的檢查點的節(jié)點和數(shù)據(jù)塊就不能被修改或返回到空閑空間。應該注意的是,節(jié)點或數(shù)據(jù)塊可以是多個保留的檢查點的組件,并且只要節(jié)點或數(shù)據(jù)塊是至少一個保留的檢查點的組件,則特定的節(jié)點或數(shù)據(jù)塊就不能被返回到空閑空間。
[0197]在示例性實施例中,除了別的之外,執(zhí)行保留的檢查點涉及在磁盤上的空閑空間中存儲相應的DSB的副本并且在保留的檢查點配置對象中存儲所存儲的DSB副本的引用。只要保留的檢查點被存儲在文件系統(tǒng)中,與保留的檢查點相關聯(lián)的結構就不能被刪除。即使從執(zhí)行保留的檢查點的檢查點已經(jīng)被重寫了,也是這樣。在示例性實施例中,文件服務器9002包括用于防止與保留的檢查點相關聯(lián)的結構被刪除的機制。
[0198]文件克隆
[0199]在本發(fā)明的某些實施例中,比如當用戶制作文件的副本時,采用文件克隆機制,以允許在文件系統(tǒng)內快速創(chuàng)建文件的副本(克隆)。在示例性實施例中,源對象的克隆至少最初是由包含源對源對象的多種元素(例如間接onode節(jié)點、直接onode節(jié)點和數(shù)據(jù)塊)的引用的結構來表述的。只讀和可變的克隆都可以被創(chuàng)建。源文件和克隆起初共享這種元素,并且在更改源文件或更改可變克隆時繼續(xù)共享未被修改的元素。在克隆被創(chuàng)建時,沒有一個用戶數(shù)據(jù)塊或描述與源文件相關聯(lián)的數(shù)據(jù)流(即,間接/直接onode節(jié)點)的元數(shù)據(jù)塊需要被復制。這種文件克隆的一些特點包括:
[0200]-文件系統(tǒng)對象的數(shù)據(jù)流可以被有效地迅速克隆,并且在相對固定量的時間中而無關于源對象數(shù)據(jù)流的尺寸,因為沒有一個包含數(shù)據(jù)流的用戶數(shù)據(jù)塊需要被復制。此外,沒有一個描述數(shù)據(jù)流(即,間接/直接onode節(jié)點)的元數(shù)據(jù)塊需要被復制。非常小的和固定數(shù)量的元數(shù)據(jù)塊被改變。
[0201 ]-對克隆的/克隆對象的I/O句柄的復雜性相當于對普通對象。
[0202]-可以被克隆的文件或克隆的次數(shù)僅受限于文件系統(tǒng)中空閑空間的數(shù)量。
[0203]-文件系統(tǒng)可以支持的克隆數(shù)目僅受限于文件系統(tǒng)中空閑空間的數(shù)量。
[0204]-該文件克隆具有固有的文件去復制的特征,因為克隆實際上是被創(chuàng)建為與源文件共享數(shù)據(jù)和元數(shù)據(jù)塊的去復制化文件,而不是創(chuàng)建源文件的完全副本并且稍后執(zhí)行去復制。
[0205]-盡管通過冗余存儲(即RAID控制器)和其他機制,數(shù)據(jù)損壞得到減輕,但是共享塊的損壞會影響多個文件。
[0206]在示例性實施例中,首先通過創(chuàng)建代表源對象的只讀克隆(快照)的新對象,在下文中被稱為“數(shù)據(jù)流快照”對象或“DSS”,然后創(chuàng)建對象的可變克隆,從而文件系統(tǒng)對象被克隆。在克隆對象的根onode節(jié)點中的塊指針和onode節(jié)點塊指針最初被設置為指向與源對象相同的塊。來自源對象的某些元數(shù)據(jù)(如,文件時間、安全等)和命名的數(shù)據(jù)流不被復制到克隆對象。元數(shù)據(jù)被保持在源對象和克隆對象中,以將數(shù)據(jù)流快照對象與源對象和可變的克隆對象聯(lián)系起來,也將源對象和可變的克隆對象與數(shù)據(jù)流快照對象聯(lián)系起來。在示例性實施例中,數(shù)據(jù)流快照對象是“隱藏”的對象,因為它是對于文件系統(tǒng)用戶不可見的。源對象和可變的克隆對象都有效地成為DSS對象的可寫入版本并有效存儲他們與DSS對象的差異。
[0207]在創(chuàng)建數(shù)據(jù)流快照對象之前,系統(tǒng)優(yōu)選地確保源對象是靜態(tài)的。在示例性實施例中,這包括以下步驟:
[0208]步驟Al.將源對象鎖定以不發(fā)生突變。
[0209]步驟A2.執(zhí)行文件系統(tǒng)檢查點,這有效地串行化在給定文件系統(tǒng)上的克隆的創(chuàng)建(雖然創(chuàng)建的速度將受限于文件系統(tǒng)可以將之前的檢查點提交到磁盤的速度,從而致使存儲側延誤將導致更長的創(chuàng)建時間)。
[0210]然后,在檢查點完成后,系統(tǒng)創(chuàng)建數(shù)據(jù)流快照對象,這包括以下步驟:
[0211 ]步驟A3.創(chuàng)建數(shù)據(jù)流快照對象。
[0212]步驟A4.將塊指針從源對象的根onode節(jié)點復制到數(shù)據(jù)流快照對象的根onode節(jié)點。
[0213]步驟A5.將當前檢查點編號記錄在源對象的根onode節(jié)點中。這是對象的檢查點內克隆的編號(“CCN”);它定義了最早的檢查點,其中對象的數(shù)據(jù)流可以與其相關聯(lián)的數(shù)據(jù)流快照對象的數(shù)據(jù)流不同。
[0214]系統(tǒng)還保持以下元數(shù)據(jù),以使源對象與數(shù)據(jù)流快照對象相聯(lián)系:
[0215]步驟A6.數(shù)據(jù)流快照對象的句柄被記錄在源對象的元數(shù)據(jù)中。
[0216]步驟A7.引用數(shù)據(jù)流快照對象的對象引用計數(shù)和列表被記錄在數(shù)據(jù)流快照對象的元數(shù)據(jù)中。
[0217]如果源對象已經(jīng)是克隆(S卩,正在被克隆的克隆),那么在步驟4和5之間存在兩個額外的步驟:
[0218]步驟A4a.把新的數(shù)據(jù)流快照對象與源文件的當前數(shù)據(jù)流快照對象相關聯(lián)。
[0219]步驟A4b.將源文件的當前檢查點內克隆的編號記錄在新的數(shù)據(jù)流快照對象的根onode節(jié)點中。
[0220]具有數(shù)據(jù)流快照對象的數(shù)據(jù)流的可變克隆的另一個對象可以如下方式被創(chuàng)建:[0221 ]步驟B1.創(chuàng)建新的文件系統(tǒng)對象。
[0222]步驟B2.將塊指針從數(shù)據(jù)流快照對象的根onode節(jié)點復制到新對象的根onode節(jié)點。
[0223]步驟B3.將當前檢查點編號記錄在新對象的根onode節(jié)點中。
[0224]步驟B4.將數(shù)據(jù)流快照對象的句柄記錄在新對象的元數(shù)據(jù)中。
[0225]步驟B5.遞增數(shù)據(jù)流快照對象的引用計數(shù)并將新對象的句柄添加到數(shù)據(jù)流快照對象的引用列表。
[0226]應該注意的是,檢查點內克隆的編號(CCN)不同于對象的檢查點編號(在圖11中被標記為“CN”),后者記錄了對象的最后修改的檢查點。兩者都被存儲在對象根onode節(jié)點中。
[0227]當修改用戶數(shù)據(jù)或元數(shù)據(jù)塊時,當決定是否必須將塊寫入新空間時,文件系統(tǒng)考慮塊是否已經(jīng)偏離了克隆對象相關聯(lián)的數(shù)據(jù)流快照對象:
[0228]?通過具有小于克隆的檢查點內克隆編號的檢查點編號(未偏離的塊)的指針對用戶/元數(shù)據(jù)塊進行的改變必須被寫入新空間。
[0229]?通過具有大于或等于克隆的檢查點內克隆編號的檢查點編號(已偏離的塊)的指針對用戶/元數(shù)據(jù)塊進行的改變基本上遵循如上所述的針對“有效的”文件系統(tǒng)中的對象的通常規(guī)則。
[0230]以上所描述的一些文件克隆概念可以由下列示例說明,所述示例基于圖11中所呈現(xiàn)的文件系統(tǒng)對象。
[0231]圖23示意性地顯示了依據(jù)本發(fā)明示例性實施例的,源對象(文件A)2802、隱藏的數(shù)據(jù)流快照對象2803和可變克隆2805之間的關系。
[0232]圖24示意性地顯示了依據(jù)本發(fā)明示例性實施例的,圖11中所呈現(xiàn)的在概念層次的4號檢查點的文件系統(tǒng)對象的克隆之后,對象2802、2803和2805。
[0233]如上所述,在源對象被鎖定并且檢查點被執(zhí)行(步驟Al和A2)之后,數(shù)據(jù)流快照對象2803被創(chuàng)建(步驟A3),并且來自源對象的根onode節(jié)點2302的塊指針被復制到數(shù)據(jù)流快照對象2803根onode節(jié)點(步驟A4)。當前檢查點編號被記錄在源對象2802根onode節(jié)點中(步驟A5)。數(shù)據(jù)流快照對象2803的句柄被記錄在源對象2802元數(shù)據(jù)中(步驟A6)。引用數(shù)據(jù)流快照對象2803的對象的引用計數(shù)和列表被記錄在數(shù)據(jù)流快照對象2803元數(shù)據(jù)中(步驟A7)。此時,只有源對象2802引用數(shù)據(jù)流快照對象2803,并且引用計數(shù)(暫時)被設置為一。
[0234]同樣如上所述,可變克隆2805被創(chuàng)建(步驟BI),并且來自數(shù)據(jù)流快照對象2803根onode節(jié)點的塊指針被復制到對象2805根onode節(jié)點(步驟B2)。當前檢查點編號被記錄在對象2805根onode節(jié)點中(步驟B3)。數(shù)據(jù)流快照對象2803的句柄被記錄在對象2805元數(shù)據(jù)中(步驟B4)。數(shù)據(jù)流快照對象2803中的引用計數(shù)被遞增,并且對象2805的句柄被記錄在引用的數(shù)據(jù)流快照對象2803列表中(步驟B5)。
[0235]應該注意的是,2802和2803之間的虛線的雙面箭頭代表了這兩個結構之間的鏈接,并且相似地,2803和2805之間的虛線的雙面箭頭代表了這兩個結構之間的鏈接。
[0236]應該注意的是,當可變克隆2805被創(chuàng)建時,例如塊指針的信息可以從源對象2802被復制而不是從DSS對象2803被復制,雖然從DSS對象2803復制是優(yōu)選的,并且可以允許源對象2803從靜態(tài)狀態(tài)更快地被釋放(如,在DSS對象2803創(chuàng)建后但是在可變克隆2805創(chuàng)建前)。
[0237]如果在被修改之前再次克隆源對象2802,則第二可變克隆被創(chuàng)建。圖25示意性地顯示了依據(jù)本發(fā)明示例性實施例的,源對象(文件A)2802、隱藏的數(shù)據(jù)流快照對象2803、以及兩個可變克隆2805和2807之間的關系。
[0238]圖26示意性地顯示了依據(jù)本發(fā)明示例性實施例的,在概念層次6號檢查點,第二可變克隆創(chuàng)建之后的對象2802、2803、2805和2807。具體來說,第二可變克隆2807被創(chuàng)建,并且來自數(shù)據(jù)流快照對象2803根onode節(jié)點的塊指針被復制到對象2807根onode節(jié)點。當前檢查點編號被記錄在對象2807根onode節(jié)點中。數(shù)據(jù)流快照對象2803的句柄被記錄在對象2807元數(shù)據(jù)中。數(shù)據(jù)流快照對象2803中的引用計數(shù)被遞增,并且對象2807的句柄被記錄在引用的數(shù)據(jù)流快照對象2803的列表中。
[0239]由于源對象2802是有效的數(shù)據(jù)流快照對象2803的可變副本,因此源對象2802可以隨著時間的推移被修改,這使源對象2802的數(shù)據(jù)流偏離數(shù)據(jù)流快照對象和其他的文件克隆的數(shù)據(jù)流。例如,再次參照圖24和圖11-16中所示的對象結構,比如說,來源于2802的源對象的數(shù)據(jù)塊0(2310)在概念性的5號檢查點中的修改會導致發(fā)散的樹結構,使根onode節(jié)點2802指向新的間接onode節(jié)點(類似于在圖12_16所示的概念性的3號檢查點中,當圖11中所示的對象被修改時,根onode節(jié)點2403最終指向間接onode節(jié)點2704的方法),使根onode節(jié)點2803和2805繼續(xù)指向間接onode節(jié)點2304。相似的,數(shù)據(jù)流快照對象的可變克隆可以隨著時間的推移被修改,這使可變的副本的數(shù)據(jù)流偏離數(shù)據(jù)流快照對象和其他克隆的數(shù)據(jù)流。
[0240]如果源對象被修改后,修改后的源對象的副本被制作,那么使用包括額外的步驟A4a和A4b的上述過程,為修改后的源對象創(chuàng)建第二數(shù)據(jù)流快照對象,并且隨后第二數(shù)據(jù)流快照對象的可變克隆被創(chuàng)建。
[0241]圖27示意性顯示了修改后的源對象2802’(單引號代表源對象的修改后的版本)、具有兩個原始源對象克隆2805和2807的第一數(shù)據(jù)流快照對象2803、第二數(shù)據(jù)流快照對象2809、以及第二數(shù)據(jù)流快照對象2809的可變克隆2811之間的關系??梢钥吹剑瑪?shù)據(jù)流快照對象2803和2809在邏輯上被分等級地鏈接。
[0242]圖28示意性地顯示了依據(jù)本發(fā)明示例性實施例的,在概念層次的8號檢查點,已修改的源對象2802’的克隆之后的對象2802’、2803、2809和2811。
[0243]如上所述,數(shù)據(jù)流快照對象2809被創(chuàng)建(步驟A3),并且來自源對象2802 ’根onode節(jié)點的塊指針被復制到數(shù)據(jù)流快照對象2809根onode節(jié)點(步驟A4)。數(shù)據(jù)流快照對象2809與源對象的當前數(shù)據(jù)流快照對象2803相關聯(lián)(步驟A4a),具體來說,通過將DSS 2803的句柄記錄到DSS 2809中,將DSS 2809的句柄記錄到DSS 2803的對象列表,并且遞增DSS 2803中的引用計數(shù)。源文件2802’的當前檢查點內克隆的編號被記錄在DSS 2809根onode節(jié)點中(步驟A4b)。當前檢查點編號被記錄在源對象2802’根onode節(jié)點中(步驟A5)。數(shù)據(jù)流快照對象2809的句柄被記錄在源對象2802’的元數(shù)據(jù)中(步驟A6)。引用數(shù)據(jù)流快照對象2809的對象的引用計數(shù)和列表被記錄在數(shù)據(jù)流快照對象2809元數(shù)據(jù)中(步驟A7)。此時,只有源對象2802’引用數(shù)據(jù)流快照對象2809,并且引用計數(shù)被(暫時)設置為一。
[0244]同樣如上所述,可變文件副本2811被創(chuàng)建(步驟BI),并且來自數(shù)據(jù)流快照對象2809根onode節(jié)點的塊指針被復制到對象2811根onode節(jié)點(步驟B2)。當前檢查點編號被記錄在對象2811根onode節(jié)點中(步驟B3)。數(shù)據(jù)流快照對象2809的句柄被記錄在對象2811元數(shù)據(jù)中(步驟B4)。數(shù)據(jù)流快照對象2809的引用計數(shù)被遞增,并且對象2811的句柄被記錄在數(shù)據(jù)流快照對象2809的引用列表中(步驟B5)。
[0245]應該注意的是,源對象2802’可進一步隨著時間的推移被修改,并且對象的未來版本的克隆會導致額外的數(shù)據(jù)流快照對象分等級地與第一DSS 2803和第二DSS 2809鏈接。相似地,克隆2805和/或克隆2807可隨時間的推移被修改,并且這些克隆的副本(包括未修改的和已修改的)可以不時地基本上如上所述相同地被制作,使額外的DSS對象根據(jù)需要被分等級地添加。未修改的對象2805的克隆基本上與未修改的源對象2802的克隆一樣,這會導致與第一 DSS對象2803鏈接的另一個可變克隆,而對象2805的修改版本的克隆會導致與新的DSS鏈接的修改后對象的可變副本的創(chuàng)建,其繼而被鏈接到第一 DSS對象2803。
[0246]在示例性實施例中,DSS對象與特定源對象相關聯(lián)保留在文件系統(tǒng)中,直到源對象和所有克隆被刪除。因此,例如,即使圖27中所示的克隆2805、2807和2811被刪除,DSS2803,DSS 2809和對象2802’依然保留,如圖29中示意性呈現(xiàn)的。在這個示例中,文件系統(tǒng)包括對象的當前版本以及兩個之前的快照版本。除非和直到源對象明顯地偏離對象的快照版本,對象應該共享許多數(shù)據(jù)和元數(shù)據(jù)塊,并且因此保持快照對象不應消耗大量的存儲空間。如果有必要或期望,快照對象可以例如通過去克隆操作被移除,該操作基本上重新構造對象2802’,以如同原始的(S卩,未被克隆的)對象出現(xiàn)并且移除DSS對象,并從DSS對象釋放不與對象2802’共享的數(shù)據(jù)和元數(shù)據(jù)塊。一些或所有這些功能可以作為“后臺”任務被執(zhí)行。
[0247]應該注意的是,以上參照步驟A1-A7所述的包括步驟A4a和A4b的邏輯流,被用于演示在本發(fā)明示例性實施例中多種對象是如何被創(chuàng)建和鏈接的。實際上,可選步驟A4a和A4b可以是虛擬的步驟,因為常見的邏輯可以被用于初始克隆和對克隆進行克隆兩者。例如,每個根onode節(jié)點基本上包括“向上指針”以指向在等級上更高的根onode節(jié)點。最初,源對象中的向上指針是空(NULL)的,因為源對象不指向等級上更高的DSS對象。當源對象被克隆時,常見的邏輯可以從源對象根onode節(jié)點將向上指針復制到新創(chuàng)建的DSS對象(S卩,第一DSS對象),然后設置源對象根onode節(jié)點中的向上指針指向DSS對象,并且相似地,可以從源對象將當前檢查點編號復制到第一DSS對象,然后將當前檢查點編號記錄到源對象中。在圖24中呈現(xiàn)了作為結果得到的向上指針。源對象可以隨后被修改。當修改后的源對象被克隆時,常見的邏輯可以從修改后的源對象(其指向第一 DSS對象)將向上指針復制到新創(chuàng)建的第二 DSS對象,然后設置在修改后的源對象中的向上指針指向第二 DSS對象,相似的,可以從修改后的對象將檢查點編號復制到第二 DSS對象并記錄修改后的對象中的當前檢查點編號。在圖28中呈現(xiàn)了作為結果得到的向上指針。因此,這種公用代碼高效地,不需要在克隆未被克隆的文件和克隆已被克隆的文件之間進行區(qū)分,并且這種公用代碼將創(chuàng)建任何數(shù)量的鏈接的等級程度。這種公用代碼的特別優(yōu)勢在于,在基于硬件的文件系統(tǒng)中易于實現(xiàn)。
[0248]在如上所述的示例性實施例中,使用與多種對象相關的文件句柄,DSS對象被鏈接到源對象和一個或多個克隆對象,反之亦然。除此以外,這種鏈接允許存儲系統(tǒng)控制器快速地識別特定的文件是否已經(jīng)被克隆并且還定位與已克隆文件相關的對象。應該注意的是,本發(fā)明并不局限于使用文件句柄來鏈接根onode節(jié)點。相反,比如對象編號的其他信息可以被用于補充或代替文件句柄。
[0249]應該注意的是,在示例性實施例中,成為已克隆文件屬性的是源文件的尺寸,從所述源文件創(chuàng)建克隆。因此,例如,克隆IG字節(jié)的文件將導致IG字節(jié)被占用為與已克隆的文件相關的配額。配額不考慮在克隆文件之間共享的任何塊。
[0250]依據(jù)性能,克隆對象的讀取和寫入應符合常規(guī)非克隆文件的讀取和寫入。與未克隆的文件一樣,基于硬件的文件系統(tǒng)可以自動查詢和自動應答相對于克隆的文件的NFS/CIFS操作。客戶端側對已克隆文件的刪除(如,使用“rm”命令)可以立即完成,隨之,已克隆文件被實際刪除并且在后臺執(zhí)行DSS對象。
[0251]應該注意的是,克隆對象可以被不同的用戶和組“擁有”,并且除了源對象和其他克隆以外,可以位于不同的目錄樹。
[0252]應該的注意的是,如上所述的文件克隆結構被用于管理文件系統(tǒng)內的文件,且不影響如何在文件系統(tǒng)外訪問文件。與非克隆的文件一樣,已克隆文件的轉移(如,HSR/NDMP)轉移整個文件內容,導致了在目的地的“臃腫(fat)”的文件。
[0253]應該注意的是,在本發(fā)明的示例性實施例中,上面所描述的克隆邏輯優(yōu)選地主要在作為基于硬件的文件系統(tǒng)的一部分的硬件中實施。
[0254]已克隆對象的去克隆
[0255]如上所述,在示例性實施例中,與特定源對象相關的DSS對象保留在文件系統(tǒng)中,直到源對象和所有克隆被刪除。除非和直到源對象明顯偏離對象的快照版本,對象應該共享許多數(shù)據(jù)和元數(shù)據(jù)塊,因此保持快照對象不應消耗大量的存儲空間。如果有必要或希望,快照對象可以通過去克隆操作被移除,去克隆操作基本上將對象重構為以原始的(即,未克隆的)對象出現(xiàn)并且移除DSS對象并從DSS對象釋放不與對象共享的數(shù)據(jù)和元數(shù)據(jù)塊。一些或所有這些功能可以作為“后臺”任務被執(zhí)行。
[0256]在示例性實施例中,這種“去克隆”被執(zhí)行如下。當DSS對象的引用計數(shù)變?yōu)橐?如在圖29中)并且依然存在的引用是克隆(不是另一個DSS對象)時,克隆可以從DSS對象被“去克隆”并且DSS對象可以被刪除。
[0257]在示例性實施例中,這種“去克隆”是通過從DSS將用戶數(shù)據(jù)塊所有權轉移到其最后存在的有效文件可變克隆來執(zhí)行的。就這一點而言,如果塊指針的檢查點編號大于或等于對象的檢查點內克隆編號(其中所有權意味著負責釋放),那么對象(DSS或可變克隆)被認為擁有塊。共享用戶數(shù)據(jù)塊的所有權可以通過以下方法被轉移到有效文件:
[0258]1.制作有效文件的塊指針的檢查點編號:
[0259]a.大于或等于有效文件的檢查點內克隆編號。
[0260]b.并且小于文件系統(tǒng)的當前CP編號(例如,如果它隨后在當前檢查點被修改,為了損壞時的一致性,確保塊被保存)。
[0261 ] 2.使DSS的塊指針稀疏。
[0262]在示例性實施例中,為了滿足步驟I中的條件,有效文件的檢查點內克隆編號被使用。在改變任何塊指針之前發(fā)出檢查點,以確保檢查點內克隆編號小于文件系統(tǒng)的當前的CP編號。
[0263]在示例性實施例中,這兩個步驟的順序很重要,因為到DSS的更新將潛在地釋放一些它擁有的(和在步驟I之前,可能已經(jīng)與有效文件共享的)onode節(jié)點。
[0264]圖30(包含子部分的30A-30C)被用來演示如本發(fā)明示例性實施例的文件去克隆的多方面。
[0265]圖30A示意性地顯示了描述在每個對象的根onode節(jié)點中最初的三個塊指針的對象鏈。
[0266]具體來說,第一快照對象具有10號檢查點內克隆。其塊指針分別指向存儲在塊1-3中的數(shù)據(jù)。
[0267]第二快照對象具有20號檢查點內克隆。它(仍然)與第一快照對象共享它的第一個塊。它的第二和第三塊已經(jīng)偏離,所以它的第二和第三塊指針現(xiàn)在分別指向存儲在塊4和5中的數(shù)據(jù)。
[0268]有效文件對象具有30號檢查點內克隆。它與第一快照和第二快照對象共享它的第一塊并且與第二快照對象共享它的第二塊。它的第三塊已經(jīng)偏離,所以它的第三塊指針現(xiàn)在指向存儲在塊6中的數(shù)據(jù)。
[0269]如果第二快照對象(S卩,父DSS對象)的引用計數(shù)下降到一,那么它擁有并與有效文件對象共享的用戶數(shù)據(jù)塊所有權可以通過自動改變相應的塊指針被轉移到有效文件對象。具體來說,對于被DSS對象擁有并與有效文件對象共享的每個數(shù)據(jù)塊,在DSS對象中的相應塊指針被形成為“稀疏”的(如下面更多討論的,更新塊指針的檢查點編號),并且與有效文件對象中相應的塊指針相關的檢查點編號被更新為有效文件對象的檢查點內克隆編號。圖30B示意性地描述了從第二快照對象(即,DSS對象)將塊4的所有權轉移到有效文件對象。具體來說,指向塊4的第二快照指針被形成為“稀疏”的,并且指向塊4的有效文件指針的檢查點編號被更新為有效文件對象的檢查點內克隆編號。
[0270]遵循著保留修改后的onode節(jié)點的通常規(guī)則,執(zhí)行這些轉移。具體來說,無論塊指針何時被更新,與塊指針相關的檢查點編號被更新為當前的檢查點編號。因為塊指針已被修改,包含的onode節(jié)點被寫入到新的空間。如果該onode節(jié)點是直接或間接的onode節(jié)點,那么指向父onode節(jié)點中的onode節(jié)點的塊指針也被更新,這樣父onode節(jié)點被修改并且被寫入新的空間,以此類推,直到根onode節(jié)點被處理。在所有權轉移過程結束時,有效文件對象和DSS對象不再共享任何onode節(jié)點。
[0271]因此,在示例性實施例中,為了從DSS對象將共享塊的所有權轉移到有效文件對象,有效文件對象被遍歷,并且對于發(fā)現(xiàn)的由DSS對象共享的并且所擁有的每個區(qū)域,在有效文件對象中的相關塊指針被“觸及”(這更新了受影響的塊指針的檢查點編號,類似于在相應的塊被寫入但是沒有任何數(shù)據(jù)被實際寫入時更新檢查點編號,以便有效文件對象現(xiàn)在擁有這些塊),以及在DSS對象中的相關塊指針被形成為稀疏(這使受影響的塊指針不指向任何東西,并且也更新了檢查點編號,實際上在DSS對象中創(chuàng)建了 “洞”,以便當DSS對象最終被刪除時,它不再指向被轉移到有效文件對象的用戶數(shù)據(jù)塊)。一旦以前由DSS對象所擁有的所有共享的用戶數(shù)據(jù)塊的塊指針已經(jīng)以這種方式被轉換,DSS對象就可以被安全地刪除。
[0272]再次參照圖30B,在第二快照對象的刪除開始之前,有效文件對象被從第二快照對象的引用列表刪除并被添加到第一快照對象的引用列表,借此使第一快照對象成為有效文件對象的父DSS。如果并且當?shù)谝豢煺諏ο蟮囊糜嫈?shù)達到一(S卩,以至于有效文件對象是第一快照的獨子),那么第一快照對象可以如上所述被去克隆。例如,如圖30C示意性的描述,塊I的所有權從第一快照對象被轉移到有效的文件對象。在第一快照對象所擁有并且與有效文件對象共享的所有塊的所有權被轉移之后,第一快照對象可以被刪除。
[0273]在示例性實施例中,通過每次有效文件被鎖定時轉移有限數(shù)量的用戶數(shù)據(jù)塊的所有權,“去克隆”過程應對被同時改變的有效文件。同樣,如果在這個過程中有效文件被克隆,則這個過程將被中止。這種“去克隆”過程潛在的“弄臟”許多間接/直接onode節(jié)點,但沒有“弄臟”用戶數(shù)據(jù)塊。雖然,一個有益的副產(chǎn)品是它留下了有效文件與“正確”的對象編號和重復使用計數(shù)以前共享的onode節(jié)點。在刪除所有有效文件的前任DSS對象之后,有效文件可以被轉換回普通(非克隆)文件。
[0274]其他方面
[0275]應該注意的是,“服務器”這個屬于在本文中可以被用來描述用于本發(fā)明某些實施例中的設備,并且除非上下文做出相反的指示,否則不應被解釋為將本發(fā)明限制于任何特定的設備類型。因此,設備可以包括但不限于,橋、路由器、橋-路由器(橋路器)、開關、節(jié)點、服務器、計算機、電器、或其他類型的設備。這樣的設備通常包括用于在通信網(wǎng)絡上通信的一個或多個網(wǎng)絡接口和被配置為相應地執(zhí)行設備功能的處理器(例如,具有存儲器和其他外圍設備和/或應用程序專用硬件的微處理器)。通信網(wǎng)絡通??梢园ü埠?或私人網(wǎng)絡;可以包括局域網(wǎng)、廣域網(wǎng)、城域網(wǎng)、存儲器、和/或其他類型的網(wǎng)絡;并且可以采用的通信技術包括但不限于,模擬技術、數(shù)字技術、光學技術、無線技術(如,藍牙)、網(wǎng)絡技術和網(wǎng)絡互連技術。
[0276]還應該注意的是設備可以使用通信協(xié)議和消息(例如,被該設備創(chuàng)建、傳輸、接收、存儲、和/或處理的消息),這些消息可以由通信網(wǎng)絡或介質傳送。除非上下文做出相反要求,否則本發(fā)明不應被解釋為限制于任何特定的通信消息類型、通信消息格式,或通信協(xié)議。因此,通信消息通??梢园ǖ幌抻?,框架、分組、數(shù)據(jù)電報、用戶數(shù)據(jù)報、存儲格或其他類型的通信消息。除非上下文做出相反要求,否則,具體的通信協(xié)議的引用是作為示例的,并且應該可以理解的是,可選實施例可以酌情使用這種通信協(xié)議的變形(例如,可以不時制作協(xié)議修改或擴展)或其他已知的或者將來開發(fā)的協(xié)議。
[0277]還應該注意的是,邏輯流可以在本文中被描述來演示本發(fā)明的多個方面,不應被解釋為將本發(fā)明限制為任何特定的邏輯流或邏輯的實施。所描述的邏輯可以被劃分成不同的邏輯塊(如,程序、模塊、功能或子程序),而不改變整體結果或者不偏離本發(fā)明的真正范圍。很多時候,邏輯元素可以被添加、修改、省略、以不同的順序執(zhí)行、或使用不同的邏輯結構來實施(例如,邏輯門、循環(huán)基元、條件邏輯、和其他邏輯結構)而不改變整體的結果或者不偏離本發(fā)明的真正范圍。
[0278]本發(fā)明可以以許多不同的形式體現(xiàn),包括但不限于,與處理器一起使用的計算機程序邏輯(例如,微處理器、微控制器、數(shù)字信號處理器、或通用計算機)、與可編程邏輯器件一起使用的可編程邏輯(例如,現(xiàn)場可編程門陣列(FPGA)或其他PLD)、離散組件、集成電路(例如,專用集成電路(ASIC))、或包括他們的任何組合的任何其他設備。實施一些或全部所描述功能的計算機程序邏輯通常實現(xiàn)為這樣一組計算機程序指令:被轉換成計算機可執(zhí)行格式、這樣存儲在計算機可讀介質中、并且在操作系統(tǒng)控制下被微處理器執(zhí)行。實施一些或全部所描述功能的基于硬件的邏輯可以使用一個或多個適當配置的FPGA來實現(xiàn)。
[0279]實施全部或部分本文中之前所描述的功能的計算機程序邏輯可以以多種形式體現(xiàn)實施,包括但絕不限于,源代碼形式、計算機可執(zhí)行形式、以及多種中間形式(例如,由匯編器、編譯器、鏈接器、或定位器所產(chǎn)生的形式)。源代碼可以包括以多種編程語言實施的一系列計算機程序指令(例如,對象代碼、匯編語言、或例如Fortran、C、C++、JAVA或HTML的高級語言)以便與不同的操作系統(tǒng)或操作環(huán)境一起使用。源代碼可以定義和使用多種數(shù)據(jù)結構和通信消息。源代碼可以是計算機可執(zhí)行形式(例如,通過解釋程序)、或可以被轉換(例如,通過翻譯器、匯編程序、或者編譯器)為計算機可執(zhí)行形式的源代碼。
[0280]實施全部或部分本文中之前所述功能的計算機程序邏輯可以在單一處理器上(例如,同時地)在不同的時間被執(zhí)行,或者可以在多個處理器上在相同的或不同的時間被執(zhí)行,并且可以在單一操作系統(tǒng)進程/線程下或在不同的操作系統(tǒng)進程/線程下運行。因此,術語“計算機進程”通常指一組計算機程序指令的執(zhí)行,而不管不同的計算機進程是否在相同或不同的處理器上執(zhí)行并且不管不同計算機進程是否在相同的操作系統(tǒng)進程/線程或者不同的操作系統(tǒng)進程/線程下運行。
[0281]計算機程序可以以任何形式永久或者暫時地被固定(例如,源代碼形式、計算機可執(zhí)行形式、或者中間形式)在有形的存儲介質中,如半導體存儲器裝置(例如,RAM、R0M、PR0M、EEPR0M或Flash可編程RAM)、磁性存儲器設備(例如,軟盤或硬盤)、光學存儲設備(例如,CD-ROM)、PC卡(例如,PCMCIA卡)、或其他存儲設備。計算機程序可以以任何形式被固定在使用多種通信技術中的任何技術可傳送到計算機的信號內,這種通信技術包括但不限于,模擬技術、數(shù)字技術、光學技術、無線技術(例如,藍牙)、網(wǎng)絡技術和網(wǎng)絡互連技術。計算機程序可以以任何形式被分發(fā)作為可移動存儲介質(例如,縮繞軟件(shrink wrappedsoftware)),伴隨有打印的或電子文檔、被計算機系統(tǒng)預先加載(例如,在系統(tǒng)ROM或硬盤上)、或在通信系統(tǒng)上(例如,互聯(lián)網(wǎng)或萬維網(wǎng))從服務器或者電子公告板上被分發(fā)。
[0282]實施全部或部分本文中之前所描述功能的硬件邏輯(包括與可編程邏輯器件一起使用的可編程邏輯)可以使用傳統(tǒng)的手工方法被設計,或可以使用各種工具設計、捕獲、模擬或電子存檔,這種工具例如是計算機輔助設計(CAD)、硬件描述語言(例如,VHDL或AHDL)、或PLD編程語言(例如,PALASM、ABEL、或CUPL)。
[0283]可編程邏輯可以被永久地或者暫時地固定在有形的存儲介質中,例如半導體存儲設備(例如,RAM、ROM、PROM、EEPROM或Flash可編程RAM)、磁性存儲設備(例如,軟盤或硬盤)、光學存儲設備(例如,CD-ROM)、或其他存儲設備。可編程邏輯可以被固定在可使用多種通信技術中的任何技術傳送到計算機的信號中,這種通信技術包括但不限于,模擬技術、數(shù)字技術、光學技術、無線技術(例如,藍牙)、網(wǎng)絡技術和網(wǎng)絡互連技術??删幊踢壿嬁梢员环职l(fā)作為可移動存儲介質,伴隨有打印的或電子文檔(例如,縮繞軟件)、,計算機系統(tǒng)預先加載的(例如,在系統(tǒng)ROM或硬盤上)、或在通信系統(tǒng)上(例如,互聯(lián)網(wǎng)或萬維網(wǎng))從服務器或者電子公告板分發(fā)。當然,本發(fā)明的一些實施例可以被實現(xiàn)為軟件(例如,計算機程序產(chǎn)品)和硬件兩者的結合。本發(fā)明的其他實施例是被實現(xiàn)為完全硬件或完全軟件。
[0284]本發(fā)明可以以其他特定形式被實施,而不偏離本發(fā)明的真正范圍。任何對“發(fā)明”的引用都意指本發(fā)明示例性實施例,不應被解釋為指本發(fā)明的所有實施例,除非上下文做出相反要求。所描述的實施例在所有方面都被視為只是說明性的和非限制性的。
【主權項】
1.一種用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備, 所述用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備包括存儲裝置,所述存儲裝置用于存儲文件系統(tǒng)的對象,所述文件系統(tǒng)包括快照對象(2809)和文件系統(tǒng)對象(2802 ’),所述快照對象包括引用一個或多個數(shù)據(jù)塊的一個或多個第一指針,并且所述文件系統(tǒng)對象(2802’)包括引用一個或多個數(shù)據(jù)塊的一個或多個第二指針, 其中,通過所述快照對象(2809)的一個或多個第一指針所引用的一個或多個數(shù)據(jù)塊包括由所述快照對象(2809)擁有的一個或多個數(shù)據(jù)塊;并且 所述用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備還包括一處理裝置,所述處理裝置用于執(zhí)行: -針對由所述快照對象(2809)擁有的并且通過所述快照對象(2809)的一個或多個第一指針以及所述文件系統(tǒng)對象(2802’)的一個或多個第二指針所引用的每個數(shù)據(jù)塊,將每個數(shù)據(jù)塊的所有權從所述快照對象(2809)轉移到所述文件系統(tǒng)對象(2802’),以及 -在這樣的從所述快照對象(2809)到所述文件系統(tǒng)對象(2802’)的所有權轉移之后,從所述文件系統(tǒng)中移除所述快照對象(2809)。2.根據(jù)權利要求1所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 所擁有的數(shù)據(jù)塊的所有權指示負責釋放所擁有的數(shù)據(jù)塊。3.根據(jù)權利要求1或2所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 所述文件系統(tǒng)對象(2802’)與檢查點內克隆編號(CCN)相關聯(lián),并且一個或多個第二指針中的每個指針與相應的檢查點編號(CN)相關聯(lián),并且 所述將每個數(shù)據(jù)塊的所有權從所述快照對象(2809)轉移到所述文件系統(tǒng)對象(2802’)包括: 將與引用每個檢查點的一個或多個第二指針中的指針相關聯(lián)的檢查點編號(CN)設定為大于或等于與所述文件系統(tǒng)對象(2802’)相關聯(lián)的檢查點內克隆編號(CCN)的并且小于所述文件系統(tǒng)的當前檢查點編號的值;以及 使得所述快照對象(2809)的一個或多個第一指針不指向任何東西。4.根據(jù)權利要求3所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 所述快照對象(2809)與另一檢查點內克隆編號(CCN)相關聯(lián),并且一個或多個第一指針中的每個指針與每個檢查點編號(CN)相關聯(lián)。5.根據(jù)權利要求3或4所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 如果對象包括指針,則所述對象擁有數(shù)據(jù)塊,所述指針引用每個數(shù)據(jù)塊,并且每個數(shù)據(jù)塊與一檢查點編號相關聯(lián),所述檢查點編號大于或等于與所述對象相關聯(lián)的檢查點內克隆編號。6.根據(jù)權利要求3至5中任一項所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 與所述文件系統(tǒng)對象(2802’)相關聯(lián)的檢查點內克隆編號指示所述文件系統(tǒng)對象(2802’)的數(shù)據(jù)偏離所述快照對象(2809)的數(shù)據(jù)的文件系統(tǒng)的最早檢查點。7.根據(jù)權利要求1至6中任一項所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 所述文件系統(tǒng)對象(2802 ’)與所述快照對象(2809)鏈接,并且所述快照對象(2809)與另一快照對象(2803)鏈接;并且 當從所述文件系統(tǒng)移除所述快照對象(2809)時,所述文件系統(tǒng)對象(2802,)被鏈接到另一快照對象(2803)。8.根據(jù)權利要求1至7中任一項所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 當確定所述快照對象(2809)的引用計數(shù)變?yōu)橐粫r,執(zhí)行從所述快照對象(2809)到所述文件系統(tǒng)對象(2802’)的所有權轉移以及移除所述快照對象(2809)。9.根據(jù)權利要求8所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 當刪除與所述快照對象(2809)鏈接的另一文件系統(tǒng)對象(2811)時,所述快照對象(2809)的引用計數(shù)變?yōu)橐?,并且另一文件系統(tǒng)對象(2811)先前被創(chuàng)建為所述文件系統(tǒng)對象(2802’)的克隆。10.根據(jù)權利要求9所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 另一文件系統(tǒng)對象(2811)與另一檢查點內克隆編號相關聯(lián),所述另一檢查點內克隆編號指示另一文件系統(tǒng)對象(2811)的數(shù)據(jù)偏離所述快照對象(2809)的數(shù)據(jù)和所述文件系統(tǒng)對象(2802’)的數(shù)據(jù)的文件系統(tǒng)的最早檢查點。11.根據(jù)權利要求1至10中任一項所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 所述文件系統(tǒng)對象(2802’)是文件系統(tǒng)的可寫入文件。12.根據(jù)權利要求1至11中任一項所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 所述快照對象(2809)是文件系統(tǒng)的隱藏文件系統(tǒng)對象。13.根據(jù)權利要求1至12中任一項所述的用于管理文件系統(tǒng)中的文件系統(tǒng)對象的設備,其中, 所述快照對象(2809)是文件系統(tǒng)的只讀文件系統(tǒng)對象。14.一種用于管理文件系統(tǒng)中的文件系統(tǒng)對象的方法, 所述文件系統(tǒng)包括快照對象(2809)和文件系統(tǒng)對象(2802’),所述快照對象(2809)包括引用一個或多個數(shù)據(jù)塊的一個或多個第一指針,并且所述文件系統(tǒng)對象(2802’)包括引用一個或多個數(shù)據(jù)塊的一個或多個第二指針,其中,通過所述快照對象(2809)的一個或多個第一指針所引用的一個或多個數(shù)據(jù)塊包括由所述快照對象(2809)擁有的一個或多個數(shù)據(jù)塊;并且 所述方法包括: -針對由所述快照對象(2809)擁有的并且通過所述快照對象(2809)的一個或多個第一指針以及所述文件系統(tǒng)對象(2802’)的一個或多個第二指針所引用的每個數(shù)據(jù)塊,將每個數(shù)據(jù)塊的所有權從所述快照對象(2809)轉移到所述文件系統(tǒng)對象(2802’),以及 -在這樣的從所述快照對象(2809)到所述文件系統(tǒng)對象(2802’)的所有權轉移之后,從所述文件系統(tǒng)中移除所述快照對象(2809)。
【文檔編號】G06F17/30GK105843905SQ201610169762
【公開日】2016年8月10日
【申請日】2011年11月21日
【發(fā)明人】丹尼爾·J·N·皮肯, 尼爾·柏林頓
【申請人】日立數(shù)據(jù)系統(tǒng)工程英國有限公司