<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.old.lustre.org/index.php?action=history&amp;feed=atom&amp;title=Architecture_-_Metadata_API</id>
	<title>Architecture - Metadata API - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.old.lustre.org/index.php?action=history&amp;feed=atom&amp;title=Architecture_-_Metadata_API"/>
	<link rel="alternate" type="text/html" href="http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;action=history"/>
	<updated>2026-04-15T00:22:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=10593&amp;oldid=prev</id>
		<title>Docadmin at 21:16, 22 January 2010</title>
		<link rel="alternate" type="text/html" href="http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=10593&amp;oldid=prev"/>
		<updated>2010-01-22T21:16:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:16, 22 January 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; The content on this page reflects the state of design of a Lustre feature at a particular point in time and may contain outdated information.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Note:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#039;&amp;#039;&lt;/ins&gt;&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;The content on this page reflects the state of design of a Lustre feature at a particular point in time and may contain outdated information.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#039;&amp;#039; &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Summary ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Summary ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Docadmin</name></author>
	</entry>
	<entry>
		<id>http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=10519&amp;oldid=prev</id>
		<title>Docadmin: Protected &quot;Architecture - Metadata API&quot; ([edit=sysop] (indefinite) [move=sysop] (indefinite))</title>
		<link rel="alternate" type="text/html" href="http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=10519&amp;oldid=prev"/>
		<updated>2010-01-22T18:05:44Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/index.php?title=Architecture_-_Metadata_API&quot; title=&quot;Architecture - Metadata API&quot;&gt;Architecture - Metadata API&lt;/a&gt;&amp;quot; ([edit=sysop] (indefinite) [move=sysop] (indefinite))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:05, 22 January 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Docadmin</name></author>
	</entry>
	<entry>
		<id>http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=10193&amp;oldid=prev</id>
		<title>Docadmin: /* final lookup */</title>
		<link rel="alternate" type="text/html" href="http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=10193&amp;oldid=prev"/>
		<updated>2010-01-19T18:48:43Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;final lookup&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:48, 19 January 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l377&quot;&gt;Line 377:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 377:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== final lookup ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== final lookup ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Architecture - New_Metadata_API|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;New_Metadata_API&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Architecture - New_Metadata_API|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;New Metadata API&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Docadmin</name></author>
	</entry>
	<entry>
		<id>http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=10140&amp;oldid=prev</id>
		<title>Docadmin at 00:01, 19 January 2010</title>
		<link rel="alternate" type="text/html" href="http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=10140&amp;oldid=prev"/>
		<updated>2010-01-19T00:01:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:01, 18 January 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&#039;&#039;&#039;Note:&#039;&#039;&#039;&#039;&#039; The content on this page reflects the state of design of a Lustre feature at a particular point in time and may contain outdated information. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Summary ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Summary ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Docadmin</name></author>
	</entry>
	<entry>
		<id>http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=9926&amp;oldid=prev</id>
		<title>Docadmin: /* final lookup */</title>
		<link rel="alternate" type="text/html" href="http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=9926&amp;oldid=prev"/>
		<updated>2010-01-14T23:24:38Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;final lookup&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:24, 14 January 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l375&quot;&gt;Line 375:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 375:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== final lookup ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== final lookup ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Architecture &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;- New_Metadata_API&lt;/ins&gt;|New_Metadata_API]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Category:&lt;/del&gt;Architecture|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Metadata API]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;New_Metadata_API]]&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Docadmin</name></author>
	</entry>
	<entry>
		<id>http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=9874&amp;oldid=prev</id>
		<title>Docadmin: moved Metadata API to Architecture - Metadata API</title>
		<link rel="alternate" type="text/html" href="http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=9874&amp;oldid=prev"/>
		<updated>2010-01-14T21:54:46Z</updated>

		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/index.php?title=Metadata_API&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Metadata API (page does not exist)&quot;&gt;Metadata API&lt;/a&gt; to &lt;a href=&quot;/index.php?title=Architecture_-_Metadata_API&quot; title=&quot;Architecture - Metadata API&quot;&gt;Architecture - Metadata API&lt;/a&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:54, 14 January 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Docadmin</name></author>
	</entry>
	<entry>
		<id>http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=9814&amp;oldid=prev</id>
		<title>Docadmin: 1 revision</title>
		<link rel="alternate" type="text/html" href="http://wiki.old.lustre.org/index.php?title=Architecture_-_Metadata_API&amp;diff=9814&amp;oldid=prev"/>
		<updated>2010-01-14T21:01:10Z</updated>

		<summary type="html">&lt;p&gt;1 revision&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Summary ==&lt;br /&gt;
&lt;br /&gt;
Metadata API is a set of methods llite layer uses to access and manipulate metadata. This page starts from describing existing API. As time goes MdAPI should evolve to become clear and sufficiently portable. &lt;br /&gt;
&lt;br /&gt;
== Definitions ==&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Lock&amp;#039;&amp;#039;&amp;#039;: LDLM lock&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;resolving&amp;#039;&amp;#039;&amp;#039;: a triple of parent/name pointing to child&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
# clear and sufficient (no tricks needed to use it)&lt;br /&gt;
# portable&lt;br /&gt;
&lt;br /&gt;
== Cache Model ==&lt;br /&gt;
&lt;br /&gt;
Current implementation supposes four types of cache:&lt;br /&gt;
# resolving (dentry in linux)&lt;br /&gt;
# attributes (inode in linux)&lt;br /&gt;
# directory (pagecache to store directory entries in linux)&lt;br /&gt;
# open files&lt;br /&gt;
&lt;br /&gt;
All of them expect open files are maintained by the kernel with help from filesystem driver (llite module of lustre).&lt;br /&gt;
&lt;br /&gt;
All these caches are protected by DLM locks. A special type of lock - inode bitlock - was introduced. Each lock may have 3 bits:&lt;br /&gt;
# LOOKUP - protects all resolvings to given object (all because of hardlinks) + permissions&lt;br /&gt;
# UPDATE - protects all metadata attributes except permissions&lt;br /&gt;
# OPEN - allows client to cache open state of a file&lt;br /&gt;
&lt;br /&gt;
Depending on actual operation client combines bits to access data. For example,&lt;br /&gt;
to do intermediate lookup where we only need to make sure the component still exists and permissions haven&amp;#039;t changed, LOOKUP bit is required. Once resolving of intermediate component is cached, client doesn&amp;#039;t need to lookup it on server again. And given operations within directory don&amp;#039;t need LOOKUP bit, client&amp;#039;s resolving is still in cache even if another client create/unlink file in that directory.&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
&lt;br /&gt;
Intents is a mechanism to save RPCs which is the most expensive part of metadata handling due to network latency.&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s imagine open(&amp;quot;file&amp;quot;, O_CREAT). Linux VFS breaks this request into series of calls to filesystem driver:&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;lookup&amp;#039;&amp;#039;&amp;#039; to find &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; if it exists&lt;br /&gt;
# if &amp;#039;&amp;#039;&amp;#039;file&amp;#039;&amp;#039;&amp;#039; doesn&amp;#039;t exist, then &amp;#039;&amp;#039;&amp;#039;create&amp;#039;&amp;#039;&amp;#039; is called&lt;br /&gt;
# then &amp;#039;&amp;#039;&amp;#039;open&amp;#039;&amp;#039;&amp;#039; is called&lt;br /&gt;
&lt;br /&gt;
Thus, 2 or 3 RPCs could be needed, if we follow usual model. Instead, we send lookup RPC with a special structure called &amp;#039;&amp;#039;&amp;#039;intent&amp;#039;&amp;#039;&amp;#039; which describes real intent of the operation, MDS does all required work, then &amp;#039;&amp;#039;&amp;#039;create&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;open&amp;#039;&amp;#039;&amp;#039; use results returned to the first operation.&lt;br /&gt;
&lt;br /&gt;
In reality any operation starts with locking, so usually it&amp;#039;s ENQUEUE RPC which carries intent.&lt;br /&gt;
&lt;br /&gt;
There are few intents defined currently:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! intent !! purpose !! details&lt;br /&gt;
|-&lt;br /&gt;
| IT_OPEN&lt;br /&gt;
| open file/directory&lt;br /&gt;
| may return LOOKUP + OPEN lock&lt;br /&gt;
|-&lt;br /&gt;
| IT_CREAT&lt;br /&gt;
| create file&lt;br /&gt;
| used with IT_OPEN, may return LOOKUP + OPEN lock&lt;br /&gt;
|-&lt;br /&gt;
| IT_READDIR&lt;br /&gt;
| readdir&lt;br /&gt;
| used to access/cache directories, may return LOOKUP + UPDATE lock&lt;br /&gt;
|-&lt;br /&gt;
| IT_GETATTR&lt;br /&gt;
| lookup/getattr&lt;br /&gt;
| used to lookup and get attr (final lookup), may return LOOKUP + UPDATE lock&lt;br /&gt;
|-&lt;br /&gt;
| IT_LOOKUP&lt;br /&gt;
| lookup&lt;br /&gt;
| used for intermediate lookups, may return LOOKUP lock&lt;br /&gt;
|-&lt;br /&gt;
| IT_UNLINK&lt;br /&gt;
| unused&lt;br /&gt;
| --&lt;br /&gt;
|-&lt;br /&gt;
| IT_TRUNC&lt;br /&gt;
| unused&lt;br /&gt;
| --&lt;br /&gt;
|-&lt;br /&gt;
| IT_GETXATTR&lt;br /&gt;
| unused&lt;br /&gt;
| --&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Recovery ==&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! ID !! Quality Attribute !! Summary&lt;br /&gt;
|-&lt;br /&gt;
| intermediate lookup&lt;br /&gt;
| usability&lt;br /&gt;
| lookup of intermediate component of filename&lt;br /&gt;
|-&lt;br /&gt;
| final lookup&lt;br /&gt;
| usability&lt;br /&gt;
| lookup of final component of filename&lt;br /&gt;
|-&lt;br /&gt;
| cached lookup&lt;br /&gt;
| performance&lt;br /&gt;
| how can user check resolving is still valid&lt;br /&gt;
|-&lt;br /&gt;
| resolving invalidate&lt;br /&gt;
| usability&lt;br /&gt;
| how to invalidate cached resolving&lt;br /&gt;
|-&lt;br /&gt;
| cached negative resolving&lt;br /&gt;
| performance&lt;br /&gt;
| how can user check name still does not exist&lt;br /&gt;
|-&lt;br /&gt;
| negative resolving invalidate&lt;br /&gt;
| usability&lt;br /&gt;
| how can user check name is created now&lt;br /&gt;
|-&lt;br /&gt;
| mkdir&lt;br /&gt;
| usability&lt;br /&gt;
| creating of new directory&lt;br /&gt;
|-&lt;br /&gt;
| rmdir&lt;br /&gt;
| usability&lt;br /&gt;
| directory removal&lt;br /&gt;
|-&lt;br /&gt;
| link&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| unlink&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| unlink open file&lt;br /&gt;
| usability, availability&lt;br /&gt;
| file should be protected from removal until it&amp;#039;s closed&lt;br /&gt;
|-&lt;br /&gt;
| rename&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| stat&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| cached stat&lt;br /&gt;
| performance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| stat invalidate&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| readdir&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| cached readdir&lt;br /&gt;
| performance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| readdir invalidate&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| open&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| cached open&lt;br /&gt;
| performance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| open invalidate&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| close&lt;br /&gt;
| usability&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| open recovery&lt;br /&gt;
| availability&lt;br /&gt;
| during MDS failover, clients recover opens to provide posix semantics of unlink&lt;br /&gt;
|-&lt;br /&gt;
| open by fid&lt;br /&gt;
| availability&lt;br /&gt;
| used by nfsd&lt;br /&gt;
|-&lt;br /&gt;
| lockless&lt;br /&gt;
| usability&lt;br /&gt;
| in some cases results can return with no lock&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Existing MdAPI ==&lt;br /&gt;
&lt;br /&gt;
=== Data Structures ===&lt;br /&gt;
&lt;br /&gt;
 struct lustre_intent_data {&lt;br /&gt;
         int       it_disposition;&lt;br /&gt;
         int       it_status;&lt;br /&gt;
         __u64     it_lock_handle;&lt;br /&gt;
         void     *it_data;&lt;br /&gt;
         int       it_lock_mode;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct lookup_intent {&lt;br /&gt;
         int     it_op;&lt;br /&gt;
         int     it_flags; &lt;br /&gt;
         int     it_create_mode;&lt;br /&gt;
         union {&lt;br /&gt;
                 struct lustre_intent_data lustre;&lt;br /&gt;
         } d;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct mdc_op_data {&lt;br /&gt;
         struct ll_fid    fid1;&lt;br /&gt;
         struct ll_fid    fid2;&lt;br /&gt;
         struct ll_fid    fid3;&lt;br /&gt;
         struct ll_fid    fid4;&lt;br /&gt;
         __u64            mod_time;&lt;br /&gt;
         const char      *name;&lt;br /&gt;
         int              namelen;&lt;br /&gt;
         __u32            create_mode;&lt;br /&gt;
         __u32            suppgids[2];&lt;br /&gt;
         void            *data;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
 struct lustre_md {&lt;br /&gt;
         struct mds_body         *body;&lt;br /&gt;
         struct lov_stripe_md    *lsm;&lt;br /&gt;
 #ifdef CONFIG_FS_POSIX_ACL&lt;br /&gt;
         struct posix_acl        *posix_acl;&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== mdc_intent_lock ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_intent_lock(struct obd_export *exp, struct mdc_op_data *op_data,&lt;br /&gt;
                     void *lmm, int lmmsize, struct lookup_intent *it,&lt;br /&gt;
                     int lookup_flags, struct ptlrpc_request **reqp,&lt;br /&gt;
                     ldlm_blocking_callback cb_blocking, int extra_lock_flags)&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;exp&amp;#039;&amp;#039;&amp;#039;: export for the connection to MDS&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;op_data&amp;#039;&amp;#039;&amp;#039;: fids/name/etc - operation args&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;lmm&amp;#039;&amp;#039;&amp;#039;: buffer to store striping info&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;lmmsize&amp;#039;&amp;#039;&amp;#039;: available space in lmm buffer&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;it&amp;#039;&amp;#039;&amp;#039;: intent&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;lookup_flags&amp;#039;&amp;#039;&amp;#039;: unused currently&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;reqp&amp;#039;&amp;#039;&amp;#039;: where to store address of request (to be used to access server&amp;#039;s reply)&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;cb_blocking&amp;#039;&amp;#039;&amp;#039;: callback routine, called when correspondent lock is being cacelled - to invalidate cache&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;extra_flags&amp;#039;&amp;#039;&amp;#039;: extra flags to be passed LDLM&lt;br /&gt;
&lt;br /&gt;
mdc_intent_lock() is the major entry point for many metadata operations. as it was described above, some metadata operations are implemented with intents. if we didn&amp;#039;t have intents, then operation could look like the following:&lt;br /&gt;
&lt;br /&gt;
 lock(dir);&lt;br /&gt;
 lookup(dir, name);&lt;br /&gt;
 unlock(dir);&lt;br /&gt;
&lt;br /&gt;
with intents (and currently) it looks this way:&lt;br /&gt;
&lt;br /&gt;
 lock(dir, intent, reply);&lt;br /&gt;
 find lookup result in reply;&lt;br /&gt;
&lt;br /&gt;
mdc_intent_lock() is that lock() in pseudo-code.&lt;br /&gt;
&lt;br /&gt;
mdc_intent_lock() is used to lookup name, retrieve attributes, create regular files and open files/directories. it usually returns DLM lock for result object. actual bits of the lock may depend on intent and server&amp;#039;s policy. if mdc_intent_lock() returns with a lock, then data in reply is subject to cache.&lt;br /&gt;
&lt;br /&gt;
=== mdc_set_lock_data ===&lt;br /&gt;
&lt;br /&gt;
 void mdc_set_lock_data(__u64 *l, void *data)&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;l&amp;#039;&amp;#039;&amp;#039;: lock handle&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;data&amp;#039;&amp;#039;&amp;#039;: data to be stored in lock&amp;#039;s private field&lt;br /&gt;
&lt;br /&gt;
the function is used to associate lock with some cache entity so that at time lock is being cancelled we can find that entity easily&lt;br /&gt;
&lt;br /&gt;
=== mdc_readpage ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_readpage(struct obd_export *exp, struct ll_fid *fid, __u64 offset,&lt;br /&gt;
                  struct page *page, struct ptlrpc_request **request)&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;exp&amp;#039;&amp;#039;&amp;#039;: export for connection to MDS&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;fid&amp;#039;&amp;#039;&amp;#039;: fid of the directory to be read&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;offset&amp;#039;&amp;#039;&amp;#039;: where to start reading from&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;page&amp;#039;&amp;#039;&amp;#039;: where to store result (&amp;#039;&amp;#039;&amp;#039;LINUX-SPECIFIC YET&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;request&amp;#039;&amp;#039;&amp;#039;: request where newer attributes of the directory can be fetched from&lt;br /&gt;
&lt;br /&gt;
=== mdc_setattr ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_setattr(struct obd_export *exp, struct mdc_op_data *op_data,&lt;br /&gt;
                 struct iattr *iattr, void *ea, int ealen, void *ea2, int ea2len,&lt;br /&gt;
                 struct ptlrpc_request **request)&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;exp&amp;#039;&amp;#039;&amp;#039;: connection to MDS&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;op_data&amp;#039;&amp;#039;&amp;#039;: operation arguments&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;iattr&amp;#039;&amp;#039;&amp;#039;: new attributes (platform specific yet)&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;ea&amp;#039;&amp;#039;&amp;#039;: striping info buffer&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;ealen&amp;#039;&amp;#039;&amp;#039;: striping info buffer length&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;ea2&amp;#039;&amp;#039;&amp;#039;: currently unused&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;ea2len&amp;#039;&amp;#039;&amp;#039;: currently unused&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;request&amp;#039;&amp;#039;&amp;#039;: where address of request will be stored&lt;br /&gt;
&lt;br /&gt;
mdc_setattr() sends sync RPC to MDS to change attributes. it does not return any lock, so attributes in reply isn&amp;#039;t subject to cache.&lt;br /&gt;
&lt;br /&gt;
=== mdc_getattr ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_getattr(struct obd_export *exp, struct ll_fid *fid,&lt;br /&gt;
                 obd_valid valid, unsigned int ea_size,&lt;br /&gt;
                 struct ptlrpc_request **request)&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;exp&amp;#039;&amp;#039;&amp;#039;: connection to MDS&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;fid&amp;#039;&amp;#039;&amp;#039;: object of interest&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;valid&amp;#039;&amp;#039;&amp;#039;: attributes of interest&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;ea_size&amp;#039;&amp;#039;&amp;#039;: how many bytes of striping info client can store&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;reuqest&amp;#039;&amp;#039;&amp;#039;: where address of request will be stored (to access reply)&lt;br /&gt;
&lt;br /&gt;
mdc_getattr() sends synchronous RPC to MDS. it never returns lock.&lt;br /&gt;
&lt;br /&gt;
=== mdc_close ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_close(struct obd_export *exp, struct obdo *oa,&lt;br /&gt;
               struct obd_client_handle *och, struct ptlrpc_request **request)&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;exp&amp;#039;&amp;#039;&amp;#039;: export for connection to MDS&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;oa&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;och&amp;#039;&amp;#039;&amp;#039;: openhandle returned by mdc_intent_lock() at open time&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;request&amp;#039;&amp;#039;&amp;#039;: where address of request will be stored (to access reply)&lt;br /&gt;
&lt;br /&gt;
=== mdc_link ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_link(struct obd_export *exp, struct mdc_op_data *op_data,&lt;br /&gt;
              struct ptlrpc_request **request)&lt;br /&gt;
&lt;br /&gt;
=== mdc_unlink ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_unlink(struct obd_export *exp, struct mdc_op_data *op_data,&lt;br /&gt;
               struct ptlrpc_request **request)&lt;br /&gt;
&lt;br /&gt;
=== mdc_create ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_create(struct obd_export *exp, struct mdc_op_data *op_data,&lt;br /&gt;
                const void *data, int datalen, int mode, __u32 uid, __u32 gid,&lt;br /&gt;
                __u32 cap_effective, __u64 rdev, struct ptlrpc_request **request)&lt;br /&gt;
&lt;br /&gt;
=== mdc_rename ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_rename(struct obd_export *exp, struct mdc_op_data *op_data,&lt;br /&gt;
                const char *old, int oldlen, const char *new, int newlen,&lt;br /&gt;
                struct ptlrpc_request **request)&lt;br /&gt;
&lt;br /&gt;
=== mdc_req2lustre_md ===&lt;br /&gt;
&lt;br /&gt;
 int mdc_req2lustre_md(struct ptlrpc_request *req, int offset,&lt;br /&gt;
                       struct obd_export *exp,&lt;br /&gt;
                       struct lustre_md *md)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== intermediate lookup ===&lt;br /&gt;
&lt;br /&gt;
VFS parses filename, finds intermediate (not last) component and starts lookup:&lt;br /&gt;
# local cache (dcache) is checked&lt;br /&gt;
# if dentry is found in dcache, then revalidation is called (llite&amp;#039;s revalidation check whether lock with LOOKUP bit is still granted to the client)&lt;br /&gt;
# if dentry isn&amp;#039;t found in dcache, then lookup method is called&lt;br /&gt;
# llite&amp;#039;s lookup prepares intent and sends ENQUEUE RPC with the intent&lt;br /&gt;
# MDS receives RPC, finds intent and execute it: name is looked up to fid, correspondent attributes are fetched, DLM lock is acquired for this resolving (LOOKUP). all this is put in the reply&lt;br /&gt;
# client gets fid and attributes, finds or creates new inode for given fid, adds one more entry into dcache&lt;br /&gt;
&lt;br /&gt;
 ll_lookup_it()&lt;br /&gt;
   mdc_intent_lock(IT_LOOKUP)&lt;br /&gt;
     mdc_enqueue()&lt;br /&gt;
   iget()&lt;br /&gt;
   ldlm_lock_decref()&lt;br /&gt;
&lt;br /&gt;
=== final lookup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Architecture|Metadata API]]&lt;br /&gt;
[[New_Metadata_API]]&lt;/div&gt;</summary>
		<author><name>Docadmin</name></author>
	</entry>
</feed>