Whamcloud - gitweb
LUDOC-394 manual: Remove extra 'held' word
[doc/manual.git] / SettingLustreProperties.xml
1 <?xml version='1.0' encoding='UTF-8'?>
2 <chapter xmlns="http://docbook.org/ns/docbook"
3  xmlns:xl="http://www.w3.org/1999/xlink" version="5.0" xml:lang="en-US"
4  xml:id="settinglustreproperties">
5   <title xml:id="settinglustreproperties.title">Setting Lustre Properties in a C Program (<literal>llapi</literal>)</title>
6   <para>This chapter describes the <literal>llapi</literal> library of commands used for setting Lustre file properties within a C program running in a cluster environment, such as a data processing or MPI application. The commands described in this chapter are:</para>
7   <itemizedlist>
8     <listitem>
9       <para><xref linkend="llapi_file_create"/></para>
10     </listitem>
11     <listitem>
12       <para><xref linkend="llapi_file_get_stripe"/></para>
13     </listitem>
14     <listitem>
15       <para><xref linkend="llapi_file_open"/></para>
16     </listitem>
17     <listitem>
18       <para><xref linkend="llapi_quotactl"/></para>
19     </listitem>
20     <listitem>
21       <para><xref linkend="llapi_path2fid"/></para>
22     </listitem>
23   </itemizedlist>
24   <note>
25     <para>Lustre programming interface man pages are found in the <literal>lustre/doc</literal> folder.</para>
26   </note>
27   <section xml:id="llapi_file_create">
28     <title>
29       <literal>llapi_file_create</literal>
30     </title>
31     <para>Use <literal>llapi_file_create</literal> to set Lustre properties for a new file.</para>
32     <section remap="h5">
33       <title>Synopsis</title>
34       <screen>#include &lt;lustre/lustreapi.h&gt;
35
36 int llapi_file_create(char *name, long stripe_size, int stripe_offset, int stripe_count, int stripe_pattern);
37 </screen>
38     </section>
39     <section remap="h5">
40       <title>Description</title>
41       <para>The <literal>llapi_file_create()</literal> function sets a file descriptor&apos;s Lustre
42         file system striping information. The file descriptor is then accessed with
43           <literal>open()</literal>.</para>
44       <informaltable frame="all">
45         <tgroup cols="2">
46           <colspec colname="c1" colwidth="50*"/>
47           <colspec colname="c2" colwidth="50*"/>
48           <thead>
49             <row>
50               <entry>
51                 <para><emphasis role="bold">Option</emphasis></para>
52               </entry>
53               <entry>
54                 <para><emphasis role="bold">Description</emphasis></para>
55               </entry>
56             </row>
57           </thead>
58           <tbody>
59             <row>
60               <entry>
61                 <para> <literal>llapi_file_create()</literal></para>
62               </entry>
63               <entry>
64                 <para>If the file already exists, this parameter returns to &apos;<literal>EEXIST</literal>&apos;. If the stripe parameters are invalid, this parameter returns to &apos;<literal>EINVAL</literal>&apos;.</para>
65               </entry>
66             </row>
67             <row>
68               <entry>
69                 <para> <literal>stripe_size</literal></para>
70               </entry>
71               <entry>
72                 <para>This value must be an even multiple of system page size, as shown by <literal>getpagesize()</literal>. The default Lustre stripe size is 4MB.</para>
73               </entry>
74             </row>
75             <row>
76               <entry>
77                 <para> <literal>stripe_offset</literal></para>
78               </entry>
79               <entry>
80                 <para>Indicates the starting OST for this file.</para>
81               </entry>
82             </row>
83             <row>
84               <entry>
85                 <para> <literal>stripe_count</literal></para>
86               </entry>
87               <entry>
88                 <para>Indicates the number of OSTs that this file will be striped across.</para>
89               </entry>
90             </row>
91             <row>
92               <entry>
93                 <para> <literal>stripe_pattern</literal></para>
94               </entry>
95               <entry>
96                 <para>Indicates the RAID pattern.</para>
97               </entry>
98             </row>
99           </tbody>
100         </tgroup>
101       </informaltable>
102       <note>
103         <para>Currently, only RAID 0 is supported. To use the system defaults, set these values: <literal>stripe_size</literal> = 0, <literal>stripe_offset</literal> = -1, <literal>stripe_count</literal> = 0, <literal>stripe_pattern</literal> = 0</para>
104       </note>
105     </section>
106     <section remap="h5">
107       <title>Examples</title>
108       <para>System default size is 4 MB.</para>
109       <screen>char *tfile = TESTFILE;
110 int stripe_size = 65536</screen>
111       <para>To start at default, run:</para>
112       <screen>int stripe_offset = -1</screen>
113       <para>To start at the default, run:</para>
114       <screen>int stripe_count = 1</screen>
115       <para>To set a single stripe for this example, run:</para>
116       <screen>int stripe_pattern = 0</screen>
117       <para>Currently, only RAID 0 is supported.</para>
118       <screen>int stripe_pattern = 0; 
119 int rc, fd; 
120 rc = llapi_file_create(tfile, stripe_size,stripe_offset, stripe_count,stripe_pattern);</screen>
121       <para>Result code is inverted, you may return with &apos;<literal>EINVAL</literal>&apos; or an ioctl error.</para>
122       <screen>if (rc) {
123 fprintf(stderr,&quot;llapi_file_create failed: %d (%s) 0, rc, strerror(-rc));return -1; }</screen>
124       <para><literal>llapi_file_create</literal> closes the file descriptor. You must re-open the descriptor. To do this, run:</para>
125       <screen>fd = open(tfile, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644); if (fd &lt; 0) \ { 
126 fprintf(stderr, &quot;Can&apos;t open %s file: %s0, tfile,
127 str-
128 error(errno));
129 return -1;
130 }</screen>
131     </section>
132   </section>
133   <section xml:id="llapi_file_get_stripe">
134     <title>llapi_file_get_stripe</title>
135     <para>Use <literal>llapi_file_get_stripe</literal> to get striping information for a file or directory on a Lustre file system.</para>
136     <section remap="h5">
137       <title>Synopsis</title>
138       <screen>
139 #include &lt;lustre/lustreapi.h&gt;
140  
141 int llapi_file_get_stripe(const char *<emphasis>path</emphasis>, void *<emphasis>lum</emphasis>);</screen>
142     </section>
143     <section remap="h5">
144       <title>Description</title>
145       <para>The <literal>llapi_file_get_stripe()</literal> function returns striping information for a file or directory <emphasis>path</emphasis> in <emphasis>lum</emphasis> (which should point to a large enough memory region) in one of the following formats:</para>
146       <screen>struct lov_user_md_v1 {
147 __u32 lmm_magic;
148 __u32 lmm_pattern;
149 __u64 lmm_object_id;
150 __u64 lmm_object_seq;
151 __u32 lmm_stripe_size;
152 __u16 lmm_stripe_count;
153 __u16 lmm_stripe_offset;
154 struct lov_user_ost_data_v1 lmm_objects[0];
155 } __attribute__((packed));
156 struct lov_user_md_v3 {
157 __u32 lmm_magic;
158 __u32 lmm_pattern;
159 __u64 lmm_object_id;
160 __u64 lmm_object_seq;
161 __u32 lmm_stripe_size;
162 __u16 lmm_stripe_count;
163 __u16 lmm_stripe_offset;
164 char lmm_pool_name[LOV_MAXPOOLNAME];
165 struct lov_user_ost_data_v1 lmm_objects[0];
166 } __attribute__((packed));</screen>
167       <informaltable frame="all">
168         <tgroup cols="2">
169           <colspec colname="c1" colwidth="50*"/>
170           <colspec colname="c2" colwidth="50*"/>
171           <thead>
172             <row>
173               <entry>
174                 <para><emphasis role="bold">Option</emphasis></para>
175               </entry>
176               <entry>
177                 <para><emphasis role="bold">Description</emphasis></para>
178               </entry>
179             </row>
180           </thead>
181           <tbody>
182             <row>
183               <entry>
184                 <para> <literal>lmm_magic</literal></para>
185               </entry>
186               <entry>
187                 <para>Specifies the format of the returned striping information. <literal>LOV_MAGIC_V1</literal> is used for lov_user_md_v1. LOV_MAGIC_V3 is used for <literal>lov_user_md_v3</literal>.</para>
188               </entry>
189             </row>
190             <row>
191               <entry>
192                 <para> <literal>lmm_pattern</literal></para>
193               </entry>
194               <entry>
195                 <para>Holds the striping pattern. Only <literal>LOV_PATTERN_RAID0</literal> is
196                   possible in this Lustre software release.</para>
197               </entry>
198             </row>
199             <row>
200               <entry>
201                 <para> <literal>lmm_object_id</literal></para>
202               </entry>
203               <entry>
204                 <para>Holds the MDS object ID.</para>
205               </entry>
206             </row>
207             <row>
208               <entry>
209                 <para> <literal>lmm_object_gr</literal></para>
210               </entry>
211               <entry>
212                 <para>Holds the MDS object group.</para>
213               </entry>
214             </row>
215             <row>
216               <entry>
217                 <para> <literal>lmm_stripe_size</literal></para>
218               </entry>
219               <entry>
220                 <para>Holds the stripe size in bytes.</para>
221               </entry>
222             </row>
223             <row>
224               <entry>
225                 <para> <literal>lmm_stripe_count</literal></para>
226               </entry>
227               <entry>
228                 <para>Holds the number of OSTs over which the file is striped.</para>
229               </entry>
230             </row>
231             <row>
232               <entry>
233                 <para> <literal>lmm_stripe_offset</literal></para>
234               </entry>
235               <entry>
236                 <para>Holds the OST index from which the file starts.</para>
237               </entry>
238             </row>
239             <row>
240               <entry>
241                 <para> <literal>lmm_pool_name</literal></para>
242               </entry>
243               <entry>
244                 <para>Holds the OST pool name to which the file belongs.</para>
245               </entry>
246             </row>
247             <row>
248               <entry>
249                 <para> <literal>lmm_objects</literal></para>
250               </entry>
251               <entry>
252                 <para>An array of <literal>lmm_stripe_count</literal> members containing per OST file information in</para>
253                 <para>the following format:</para>
254                 <screen>struct lov_user_ost_data_v1 {
255                 __u64 l_object_id;
256                 __u64 l_object_seq;
257                 __u32 l_ost_gen;
258                 __u32 l_ost_idx;
259                 } __attribute__((packed));</screen>
260               </entry>
261             </row>
262             <row>
263               <entry>
264                 <para> <literal>l_object_id</literal></para>
265               </entry>
266               <entry>
267                 <para>Holds the OST&apos;s object ID.</para>
268               </entry>
269             </row>
270             <row>
271               <entry>
272                 <para> <literal>l_object_seq</literal></para>
273               </entry>
274               <entry>
275                 <para>Holds the OST&apos;s object group.</para>
276               </entry>
277             </row>
278             <row>
279               <entry>
280                 <para> <literal>l_ost_gen</literal></para>
281               </entry>
282               <entry>
283                 <para>Holds the OST&apos;s index generation.</para>
284               </entry>
285             </row>
286             <row>
287               <entry>
288                 <para> <literal>l_ost_idx</literal></para>
289               </entry>
290               <entry>
291                 <para>Holds the OST&apos;s index in LOV.</para>
292               </entry>
293             </row>
294           </tbody>
295         </tgroup>
296       </informaltable>
297     </section>
298     <section remap="h5">
299       <title>Return Values</title>
300       <para><literal>llapi_file_get_stripe()</literal> returns:</para>
301       <para><literal>0</literal> On success</para>
302       <para><literal>!= 0</literal> On failure, <literal>errno</literal> is set appropriately</para>
303     </section>
304     <section remap="h5">
305       <title>Errors</title>
306       <informaltable frame="all">
307         <tgroup cols="2">
308           <colspec colname="c1" colwidth="50*"/>
309           <colspec colname="c2" colwidth="50*"/>
310           <thead>
311             <row>
312               <entry>
313                 <para><emphasis role="bold">Errors</emphasis></para>
314               </entry>
315               <entry>
316                 <para><emphasis role="bold">Description</emphasis></para>
317               </entry>
318             </row>
319           </thead>
320           <tbody>
321             <row>
322               <entry>
323                 <para> <literal>ENOMEM</literal></para>
324               </entry>
325               <entry>
326                 <para>Failed to allocate memory</para>
327               </entry>
328             </row>
329             <row>
330               <entry>
331                 <para> <literal>ENAMETOOLONG</literal></para>
332               </entry>
333               <entry>
334                 <para>Path was too long</para>
335               </entry>
336             </row>
337             <row>
338               <entry>
339                 <para> <literal>ENOENT</literal></para>
340               </entry>
341               <entry>
342                 <para>Path does not point to a file or directory</para>
343               </entry>
344             </row>
345             <row>
346               <entry>
347                 <para> <literal>ENOTTY</literal></para>
348               </entry>
349               <entry>
350                 <para>Path does not point to a Lustre file system</para>
351               </entry>
352             </row>
353             <row>
354               <entry>
355                 <para> <literal>EFAULT</literal></para>
356               </entry>
357               <entry>
358                 <para>Memory region pointed by lum is not properly mapped</para>
359               </entry>
360             </row>
361           </tbody>
362         </tgroup>
363       </informaltable>
364     </section>
365     <section remap="h5">
366       <title>Examples</title>
367       <programlisting>
368 #include &lt;stdio.h&gt;
369 #include &lt;stdlib.h&gt;
370 #include &lt;errno.h&gt;
371 #include &lt;lustre/lustreapi.h&gt;
372
373 static inline int maxint(int a, int b)
374 {
375         return a &gt; b ? a : b;
376 }
377 static void *alloc_lum()
378 {
379         int v1, v3, join;
380         v1 = sizeof(struct lov_user_md_v1) +
381                 LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1);
382         v3 = sizeof(struct lov_user_md_v3) +
383                 LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1);
384         return malloc(maxint(v1, v3));
385 }
386 int main(int argc, char** argv)
387 {
388         struct lov_user_md *lum_file = NULL;
389         int rc;
390         int lum_size;
391         if (argc != 2) {
392                 fprintf(stderr, &quot;Usage: %s &lt;filename&gt;\n&quot;, argv[0]);
393                 return 1;
394         }
395         lum_file = alloc_lum();
396         if (lum_file == NULL) {
397                 rc = ENOMEM;
398                 goto cleanup;
399         }
400         rc = llapi_file_get_stripe(argv[1], lum_file);
401         if (rc) {
402                 rc = errno;
403                 goto cleanup;
404         }
405         /* stripe_size stripe_count */
406         printf(&quot;%d %d\n&quot;,
407                         lum_file-&gt;lmm_stripe_size,
408                         lum_file-&gt;lmm_stripe_count);
409 cleanup:
410         if (lum_file != NULL)
411                 free(lum_file);
412         return rc;
413 }
414 </programlisting>
415     </section>
416   </section>
417   <section xml:id="llapi_file_open">
418     <title>
419       <literal>llapi_file_open</literal>
420     </title>
421     <para>The <literal>llapi_file_open</literal> command opens (or creates) a file or device on a
422       Lustre file system.</para>
423     <section remap="h5">
424       <title>Synopsis</title>
425       <screen>#include &lt;lustre/lustreapi.h&gt;
426 int llapi_file_open(const char *<emphasis>name</emphasis>, int <emphasis>flags</emphasis>, int <emphasis>mode</emphasis>, 
427    unsigned long long <emphasis>stripe_size</emphasis>, int <emphasis>stripe_offset</emphasis>, 
428    int <emphasis>stripe_count</emphasis>, int <emphasis>stripe_pattern</emphasis>);
429 int llapi_file_create(const char *<emphasis>name</emphasis>, unsigned long long <emphasis>stripe_size</emphasis>, 
430    int <emphasis>stripe_offset</emphasis>, int <emphasis>stripe_count</emphasis>, 
431    int <emphasis>stripe_pattern</emphasis>);
432 </screen>
433     </section>
434     <section remap="h5">
435       <title>Description</title>
436       <para>The <literal>llapi_file_create()</literal> call is equivalent to the <literal>llapi_file_open</literal> call with <emphasis>flags</emphasis> equal to <literal>O_CREAT|O_WRONLY</literal> and <emphasis>mode</emphasis> equal to <literal>0644</literal>, followed by file close.</para>
437       <para><literal>llapi_file_open()</literal> opens a file with a given name on a Lustre file
438         system.</para>
439       <informaltable frame="all">
440         <tgroup cols="2">
441           <colspec colname="c1" colwidth="50*"/>
442           <colspec colname="c2" colwidth="50*"/>
443           <thead>
444             <row>
445               <entry>
446                 <para><emphasis role="bold">Option</emphasis></para>
447               </entry>
448               <entry>
449                 <para><emphasis role="bold">Description</emphasis></para>
450               </entry>
451             </row>
452           </thead>
453           <tbody>
454             <row>
455               <entry>
456                 <para> <literal>flags</literal></para>
457               </entry>
458               <entry>
459                 <para>Can be a combination of <literal>O_RDONLY</literal>, <literal>O_WRONLY</literal>, <literal>O_RDWR</literal>, <literal>O_CREAT</literal>, <literal>O_EXCL</literal>, <literal>O_NOCTTY</literal>, <literal>O_TRUNC</literal>, <literal>O_APPEND</literal>, <literal>O_NONBLOCK</literal>, <literal>O_SYNC</literal>, <literal>FASYNC</literal>, <literal>O_DIRECT</literal>, <literal>O_LARGEFILE</literal>, <literal>O_DIRECTORY</literal>, <literal>O_NOFOLLOW</literal>, <literal>O_NOATIME</literal>.</para>
460               </entry>
461             </row>
462             <row>
463               <entry>
464                 <para> <literal>mode</literal></para>
465               </entry>
466               <entry>
467                 <para>Specifies the permission bits to be used for a new file when <literal>O_CREAT</literal> is used.</para>
468               </entry>
469             </row>
470             <row>
471               <entry>
472                 <para> <literal>stripe_size</literal></para>
473               </entry>
474               <entry>
475                 <para>Specifies stripe size (in bytes). Should be multiple of 64 KB, not exceeding 4 GB.</para>
476               </entry>
477             </row>
478             <row>
479               <entry>
480                 <para> <literal>stripe_offset</literal></para>
481               </entry>
482               <entry>
483                 <para>Specifies an OST index from which the file should start. The default value is -1.</para>
484               </entry>
485             </row>
486             <row>
487               <entry>
488                 <para> <literal>stripe_count</literal></para>
489               </entry>
490               <entry>
491                 <para>Specifies the number of OSTs to stripe the file across. The default value is -1.</para>
492               </entry>
493             </row>
494             <row>
495               <entry>
496                 <para> <literal>stripe_pattern</literal></para>
497               </entry>
498               <entry>
499                 <para>Specifies the striping pattern. In this release of the Lustre software, only
500                     <literal>LOV_PATTERN_RAID0</literal> is available. The default value is
501                   0.</para>
502               </entry>
503             </row>
504           </tbody>
505         </tgroup>
506       </informaltable>
507     </section>
508     <section remap="h5">
509       <title>Return Values</title>
510       <para><literal>llapi_file_open()</literal> and <literal>llapi_file_create()</literal> return:</para>
511       <para><literal>&gt;=0</literal> On success, for <literal>llapi_file_open</literal> the return value is a file descriptor</para>
512       <para><literal>&lt;0</literal> On failure, the absolute value is an error code</para>
513     </section>
514     <section remap="h5">
515       <title>Errors</title>
516       <informaltable frame="all">
517         <tgroup cols="2">
518           <colspec colname="c1" colwidth="50*"/>
519           <colspec colname="c2" colwidth="50*"/>
520           <thead>
521             <row>
522               <entry>
523                 <para><emphasis role="bold">Errors</emphasis></para>
524               </entry>
525               <entry>
526                 <para><emphasis role="bold">Description</emphasis></para>
527               </entry>
528             </row>
529           </thead>
530           <tbody>
531             <row>
532               <entry>
533                 <para> <literal>EINVAL</literal></para>
534               </entry>
535               <entry>
536                 <para><literal>stripe_size</literal> or <literal>stripe_offset</literal> or <literal>stripe_count</literal> or <literal>stripe_pattern</literal> is invalid.</para>
537               </entry>
538             </row>
539             <row>
540               <entry>
541                 <para> <literal>EEXIST</literal></para>
542               </entry>
543               <entry>
544                 <para>Striping information has already been set and cannot be altered; <literal>name</literal> already exists.</para>
545               </entry>
546             </row>
547             <row>
548               <entry>
549                 <para> <literal>EALREADY</literal></para>
550               </entry>
551               <entry>
552                 <para>Striping information has already been set and cannot be altered</para>
553               </entry>
554             </row>
555             <row>
556               <entry>
557                 <para> <literal>ENOTTY</literal></para>
558               </entry>
559               <entry>
560                 <para>
561                   <literal>name</literal> may not point to a Lustre file system.</para>
562               </entry>
563             </row>
564           </tbody>
565         </tgroup>
566       </informaltable>
567     </section>
568     <section remap="h5">
569       <title>Example</title>
570       <programlisting>
571 #include &lt;stdio.h&gt;
572 #include &lt;lustre/lustreapi.h&gt;
573
574 int main(int argc, char *argv[])
575 {
576         int rc;
577         if (argc != 2)
578                 return -1;
579         rc = llapi_file_create(argv[1], 1048576, 0, 2, LOV_PATTERN_RAID0);
580         if (rc &lt; 0) {
581                 fprintf(stderr, &quot;file creation has failed, %s\n&quot;,         strerror(-rc));
582                 return -1;
583         }
584         printf(&quot;%s with stripe size 1048576, striped across 2 OSTs,&quot;
585                         &quot; has been created!\n&quot;, argv[1]);
586         return 0;
587 }
588 </programlisting>
589     </section>
590   </section>
591   <section xml:id="llapi_quotactl">
592     <title>
593       <literal>llapi_quotactl</literal>
594     </title>
595     <para>Use <literal>llapi_quotact</literal>l to manipulate disk quotas on a Lustre file system.</para>
596     <section remap="h5">
597       <title>Synopsis</title>
598       <screen>#include &lt;lustre/lustreapi.h&gt;
599 int llapi_quotactl(char&quot; &quot; *mnt,&quot; &quot; struct if_quotactl&quot; &quot; *qctl)
600  
601 struct if_quotactl {
602         __u32                   qc_cmd;
603         __u32                   qc_type;
604         __u32                   qc_id;
605         __u32                   qc_stat;
606         struct obd_dqinfo       qc_dqinfo;
607         struct obd_dqblk        qc_dqblk;
608         char                    obd_type[16];
609         struct obd_uuid         obd_uuid;
610 };
611 struct obd_dqblk {
612         __u64 dqb_bhardlimit;
613         __u64 dqb_bsoftlimit;
614         __u64 dqb_curspace;
615         __u64 dqb_ihardlimit;
616         __u64 dqb_isoftlimit;
617         __u64 dqb_curinodes;
618         __u64 dqb_btime;
619         __u64 dqb_itime;
620         __u32 dqb_valid;
621         __u32 padding;
622 };
623 struct obd_dqinfo {
624         __u64 dqi_bgrace;
625         __u64 dqi_igrace;
626         __u32 dqi_flags;
627         __u32 dqi_valid;
628 };
629 struct obd_uuid {
630         char uuid[40];
631 };</screen>
632     </section>
633     <section remap="h5">
634       <title>Description</title>
635       <para>The <literal>llapi_quotactl()</literal> command manipulates disk quotas on a Lustre file system mount. qc_cmd indicates a command to be applied to UID <literal>qc_id</literal> or GID <literal>qc_id</literal>.</para>
636       <informaltable frame="all">
637         <tgroup cols="2">
638           <colspec colname="c1" colwidth="50*"/>
639           <colspec colname="c2" colwidth="50*"/>
640           <thead>
641             <row>
642               <entry>
643                 <para><emphasis role="bold">Option</emphasis></para>
644               </entry>
645               <entry>
646                 <para><emphasis role="bold">Description</emphasis></para>
647               </entry>
648             </row>
649           </thead>
650           <tbody>
651             <row>
652               <entry>
653                 <para> <literal>LUSTRE_Q_GETQUOTA</literal></para>
654               </entry>
655               <entry>
656                 <para>Gets disk quota limits and current usage for user or group <emphasis>qc_id</emphasis>. <emphasis>qc_type</emphasis> is <literal>USRQUOTA</literal> or <literal>GRPQUOTA</literal>. <emphasis>uuid</emphasis> may be filled with <literal>OBD UUID</literal> string to query quota information from a specific node. <emphasis>dqb_valid</emphasis> may be set nonzero to query information only from MDS. If <emphasis>uuid</emphasis> is an empty string and <emphasis>dqb_valid</emphasis> is zero then cluster-wide limits and usage are returned. On return, <emphasis>obd_dqblk</emphasis> contains the requested information (block limits unit is kilobyte). Quotas must be turned on before using this command.</para>
657               </entry>
658             </row>
659             <row>
660               <entry>
661                 <para> <literal>LUSTRE_Q_SETQUOTA</literal></para>
662               </entry>
663               <entry>
664                 <para>Sets disk quota limits for user or group <emphasis>qc_id</emphasis>. <emphasis>qc_type</emphasis> is <literal>USRQUOTA</literal> or <literal>GRPQUOTA</literal>. <emphasis>dqb_valid</emphasis> must be set to <literal>QIF_ILIMITS</literal>, <literal>QIF_BLIMITS</literal> or <literal>QIF_LIMITS</literal> (both inode limits and block limits) dependent on updating limits. <emphasis>obd_dqblk</emphasis> must be filled with limits values (as set in <emphasis>dqb_valid</emphasis>, block limits unit is kilobyte). Quotas must be turned on before using this command.</para>
665               </entry>
666             </row>
667             <row>
668               <entry>
669                 <para> <literal>LUSTRE_Q_GETINFO</literal></para>
670               </entry>
671               <entry>
672                 <para>Gets information about quotas. <emphasis>qc_type</emphasis> is either
673                     <literal>USRQUOTA</literal> or <literal>GRPQUOTA</literal>. On return,
674                     <emphasis>dqi_igrace</emphasis> is inode grace time (in seconds),
675                     <emphasis>dqi_bgrace</emphasis> is block grace time (in seconds),
676                     <emphasis>dqi_flags</emphasis> is not used by the current release of the Lustre
677                   software.</para>
678               </entry>
679             </row>
680             <row>
681               <entry>
682                 <para> <literal>LUSTRE_Q_SETINFO</literal></para>
683               </entry>
684               <entry>
685                 <para>Sets quota information (like grace times). <emphasis>qc_type</emphasis> is
686                   either <literal>USRQUOTA</literal> or <literal>GRPQUOTA</literal>.
687                     <emphasis>dqi_igrace</emphasis> is inode grace time (in seconds),
688                     <emphasis>dqi_bgrace</emphasis> is block grace time (in seconds),
689                     <emphasis>dqi_flags</emphasis> is not used by the current release of the Lustre
690                   software and must be zeroed.</para>
691               </entry>
692             </row>
693           </tbody>
694         </tgroup>
695       </informaltable>
696     </section>
697     <section remap="h5">
698       <title>Return Values</title>
699       <para><literal>llapi_quotactl()</literal> returns:</para>
700       <para><literal>0</literal> On success</para>
701       <para><literal> -1 </literal> On failure and sets error number (<literal>errno</literal>) to indicate the error</para>
702     </section>
703     <section remap="h5">
704       <title>Errors</title>
705       <para><literal>llapi_quotactl</literal> errors are described below.</para>
706       <informaltable frame="all">
707         <tgroup cols="2">
708           <colspec colname="c1" colwidth="50*"/>
709           <colspec colname="c2" colwidth="50*"/>
710           <thead>
711             <row>
712               <entry>
713                 <para><emphasis role="bold">Errors</emphasis></para>
714               </entry>
715               <entry>
716                 <para><emphasis role="bold">Description</emphasis></para>
717               </entry>
718             </row>
719           </thead>
720           <tbody>
721             <row>
722               <entry>
723                 <para> <literal>EFAULT</literal></para>
724               </entry>
725               <entry>
726                 <para><emphasis>qctl</emphasis> is invalid.</para>
727               </entry>
728             </row>
729             <row>
730               <entry>
731                 <para> <literal>ENOSYS</literal></para>
732               </entry>
733               <entry>
734                 <para>Kernel or Lustre modules have not been compiled with the <literal>QUOTA</literal> option.</para>
735               </entry>
736             </row>
737             <row>
738               <entry>
739                 <para> <literal>ENOMEM</literal></para>
740               </entry>
741               <entry>
742                 <para>Insufficient memory to complete operation.</para>
743               </entry>
744             </row>
745             <row>
746               <entry>
747                 <para> <literal>ENOTTY</literal></para>
748               </entry>
749               <entry>
750                 <para> <emphasis>qc_cmd</emphasis> is invalid.</para>
751               </entry>
752             </row>
753             <row>
754               <entry>
755                 <para> <literal>ENOENT</literal></para>
756               </entry>
757               <entry>
758                 <para> <emphasis>uuid</emphasis> does not correspond to OBD or <emphasis>mnt</emphasis> does not exist.</para>
759               </entry>
760             </row>
761             <row>
762               <entry>
763                 <para> <literal>EPERM</literal></para>
764               </entry>
765               <entry>
766                 <para>The call is privileged and the caller is not the super user.</para>
767               </entry>
768             </row>
769             <row>
770               <entry>
771                 <para> <literal>ESRCH</literal></para>
772               </entry>
773               <entry>
774                 <para>No disk quota is found for the indicated user. Quotas have not been turned on for this file system.</para>
775               </entry>
776             </row>
777           </tbody>
778         </tgroup>
779       </informaltable>
780     </section>
781   </section>
782   <section xml:id="llapi_path2fid">
783     <title>
784       <literal>llapi_path2fid</literal>
785     </title>
786     <para>Use <literal>llapi_path2fid</literal> to get the FID from the pathname.</para>
787     <section remap="h5">
788       <title>Synopsis</title>
789       <screen>#include &lt;lustre/lustreapi.h&gt;
790  
791 int llapi_path2fid(const char *path, unsigned long long *seq, unsigned long *oid, unsigned long *ver)</screen>
792     </section>
793     <section remap="h5">
794       <title>Description</title>
795       <para>The <literal>llapi_path2fid</literal> function returns the FID (sequence : object ID : version) for the pathname.</para>
796     </section>
797     <section remap="h5">
798       <title>Return Values</title>
799       <para><literal>llapi_path2fid</literal> returns:</para>
800       <para><literal>0</literal> On success</para>
801       <para>non-zero value On failure</para>
802     </section>
803   </section>
804   <section condition="l29">
805       <title>
806           <literal>llapi_ladvise</literal>
807       </title>
808       <para>Use <literal>llapi_ladvise</literal> to give IO advice/hints on a
809       Lustre file to the server.</para>
810       <section remap="h5">
811           <title>Synopsis</title>
812           <screen>
813 #include &lt;lustre/lustreapi.h&gt;
814 int llapi_ladvise(int fd, unsigned long long flags,
815                   int num_advise, struct llapi_lu_ladvise *ladvise);
816                                 
817 struct llapi_lu_ladvise {
818   __u16 lla_advice;       /* advice type */
819   __u16 lla_value1;       /* values for different advice types */
820   __u32 lla_value2;
821   __u64 lla_start;        /* first byte of extent for advice */
822   __u64 lla_end;          /* last byte of extent for advice */
823   __u32 lla_value3;
824   __u32 lla_value4;
825 };
826           </screen>
827       </section>
828       <section remap="h5">
829           <title>Description</title>
830           <para>The <literal>llapi_ladvise</literal> function passes an array of
831           <emphasis>num_advise</emphasis> I/O hints (up to a maximum of
832           <emphasis>LAH_COUNT_MAX</emphasis> items) in ladvise for the file
833           descriptor <emphasis>fd</emphasis> from an application to one or more
834           Lustre servers.  Optionally, <emphasis>flags</emphasis> can modify how
835           the advice will be processed via bitwise-or'd values:</para>
836           <itemizedlist>
837           <listitem>
838           <para><literal>LF_ASYNC</literal>: Clients return to userspace
839           immediately after submitting ladvise RPCs, leaving server threads to
840           handle the advices asynchronously.</para>
841           </listitem>
842           <listitem>
843           <para><literal>LF_UNSET</literal>: Unset/clear a previous advice
844           (Currently only supports LU_ADVISE_LOCKNOEXPAND).</para>
845           </listitem>
846           </itemizedlist>
847           <para>Each of the <emphasis>ladvise</emphasis> elements is an
848           <emphasis>llapi_lu_ladvise</emphasis> structure, which contains the
849           following fields:
850           <informaltable frame="all">
851             <tgroup cols="2">
852               <colspec colname="c1" colwidth="50*"/>
853               <colspec colname="c2" colwidth="50*"/>
854               <thead>
855                 <row>
856                   <entry>
857                     <para><emphasis role="bold">Field</emphasis></para>
858                   </entry>
859                   <entry>
860                     <para><emphasis role="bold">Description</emphasis></para>
861                   </entry>
862                 </row>
863               </thead>
864               <tbody>
865               <row>
866               <entry>
867                 <para> <literal>lla_ladvice</literal></para>
868               </entry>
869               <entry>
870                 <para>Specifies the advice for the given file range, currently
871                 one of:</para>
872                 <para><literal>LU_LADVISE_WILLREAD</literal>:  Prefetch data
873                 into server cache using optimum I/O size for the server.</para>
874                 <para><literal>LU_LADVISE_DONTNEED</literal>:  Clean cached data
875                 for the specified file range(s) on the server.</para>
876               </entry>
877               </row>
878               <row>
879                 <entry>
880                   <para> <literal>lla_start</literal></para>
881                 </entry>
882                 <entry>
883                   <para>The offset in bytes for the start of this advice.</para>
884                 </entry>
885               </row>
886               <row>
887                 <entry>
888                   <para> <literal>lla_end</literal></para>
889                 </entry>
890                 <entry>
891                   <para>The offset in bytes (non-inclusive) for the end of this
892                   advice.</para>
893                 </entry>
894               </row>
895               <row>
896                 <entry>
897                   <para> <literal>lla_value1</literal></para>
898                   <para> <literal>lla_value2</literal></para>
899                   <para> <literal>lla_value3</literal></para>
900                   <para> <literal>lla_value4</literal></para>
901                 </entry>
902                 <entry>
903                     <para>Additional arguments for future advice types and
904                     should be set to zero if not explicitly required for a given
905                     advice type.  Advice-specific names for these fields
906                     follow.</para>
907                 </entry>
908               </row>
909               <row>
910                 <entry>
911                   <para> <literal>lla_lockahead_mode</literal></para>
912                 </entry>
913                 <entry>
914                   <para>When using LU_ADVISE_LOCKAHEAD, the 'lla_value1' field
915                   is used to communicate the requested lock mode, and can be
916                   referred to as lla_lockahead_mode.</para>
917                 </entry>
918               </row>
919               <row>
920                 <entry>
921                   <para> <literal>lla_peradvice_flags</literal></para>
922                 </entry>
923                 <entry>
924                   <para>When using advices which support them, the 'lla_value2'
925                   field is used to communicate per-advice flags and can be
926                   referred to as 'lla_peradvice_flags'. Both LF_ASYNC and
927                   LF_UNSET are supported as peradvice flags.</para>
928                 </entry>
929               </row>
930               <row>
931                 <entry>
932                   <para> <literal>lla_lockahead_result</literal></para>
933                 </entry>
934                 <entry>
935                   <para>When using LU_ADVISE_LOCKAHEAD, the 'lla_value3' field
936                   is used to communicate the result of the request, and can be
937                   referred to as lla_lockahead_result.</para>
938                 </entry>
939               </row>
940               </tbody>
941               </tgroup>
942           </informaltable>
943           </para>
944           <para><literal>llapi_ladvise()</literal> forwards the advice to Lustre
945           servers without guaranteeing how and when servers will react to the
946           advice. Actions may or may not be triggered when the advices are
947           received, depending on the type of the advice as well as the real-time
948           decision of the affected server-side components.
949           </para>
950           <para> A typical usage of <literal>llapi_ladvise()</literal> is to
951           enable applications and users (via <literal>lfs ladvise</literal>)
952           with external knowledge about application I/O patterns to intervene in
953           server-side I/O handling. For example, if a group of different clients
954           are doing small random reads of a file, prefetching pages into OSS
955           cache with big linear reads before the random IO is an overall net
956           benefit.  Fetching that data into each client cache with
957           <emphasis>fadvise()</emphasis> may not be beneficial, due to much more
958           data being sent to the clients.
959           </para>
960           <para>
961           LU_LADVISE_LOCKAHEAD merits a special comment.  While it is possible
962           and encouraged to use it directly in your application to avoid lock
963           contention (primarily for writing to a single file from multiple
964           clients), it will also be available in the MPI-I/O / MPICH library
965           from ANL for use with the i/o aggregation mode of that library.  This
966           is intended (eventually) to be the primary way this feature is used.
967           </para>
968           <para>
969           At the time of writing, this support is proposed as a patch but is
970           not yet merged in to the public ANL code base.  Users are encouraged
971           to check their MPICH documentation and/or check with their library
972           provider about support.
973           </para>
974           <para>While conceptually similar to the
975           <emphasis>posix_fadvise</emphasis> and Linux
976           <emphasis>fadvise</emphasis> system calls, the main difference of
977           <literal>llapi_ladvise()</literal> is that
978           <emphasis>fadvise() / posix_fadvise()</emphasis> are client side
979           mechanisms that do not pass advice to the filesystem, while
980           <literal>llapi_ladvise()</literal> sends advice or hints to one or
981           more Lustre servers on which the file is stored.  In some cases it may
982           be desirable to use both interfaces.
983           </para>
984       </section>
985       <section remap="h5">
986           <title>Return Values</title>
987           <para><literal>llapi_ladvise</literal> returns:</para>
988           <para><literal>0</literal> On success</para>
989           <para><literal>-1</literal> if an error occurred (in which case, errno
990           is set appropriately).</para>
991       </section>
992       <section remap="h5">
993           <title>Errors</title>
994         <para>
995           <informaltable frame="all">
996             <tgroup cols="2">
997               <colspec colname="c1" colwidth="50*"/>
998               <colspec colname="c2" colwidth="50*"/>
999               <thead>
1000                 <row>
1001                   <entry>
1002                     <para><emphasis role="bold">Error</emphasis></para>
1003                   </entry>
1004                   <entry>
1005                     <para><emphasis role="bold">Description</emphasis></para>
1006                   </entry>
1007                 </row>
1008               </thead>
1009               <tbody>
1010                 <row>
1011                   <entry>
1012                     <para> <literal>ENOMEM</literal></para>
1013                   </entry>
1014                   <entry>
1015                     <para>Insufficient memory to complete operation.</para>
1016                   </entry>
1017                 </row>
1018                 <row>
1019                   <entry>
1020                     <para> <literal>EINVAL</literal></para>
1021                   </entry>
1022                   <entry>
1023                     <para>One or more invalid arguments are given.</para>
1024                   </entry>
1025                 </row>
1026                 <row>
1027                   <entry>
1028                     <para> <literal>EFAULT</literal></para>
1029                   </entry>
1030                   <entry>
1031                     <para>Memory region pointed by
1032                     <literal>ladvise</literal> is not properly mapped.
1033                     </para>
1034                   </entry>
1035                 </row>
1036                 <row>
1037                   <entry>
1038                     <para> <literal>ENOTSUPP</literal></para>
1039                   </entry>
1040                   <entry>
1041                     <para>Advice type is not supported.</para>
1042                   </entry>
1043                 </row>
1044               </tbody>
1045             </tgroup>
1046           </informaltable>
1047           </para>
1048       </section>
1049   </section>
1050   <section xml:id="example_using_llapi">
1051     <title>Example Using the <literal>llapi</literal> Library</title>
1052     <para>Use <literal>llapi_file_create</literal> to set Lustre software properties for a new file.
1053       For a synopsis and description of <literal>llapi_file_create</literal> and examples of how to
1054       use it, see <xref linkend="configurationfilesmoduleparameters"/>.</para>
1055     <para>You can set striping from inside programs like <literal>ioctl</literal>. To compile the sample program, you need to install the Lustre client source RPM.</para>
1056     <para><emphasis role="bold">A simple C program to demonstrate striping API - libtest.c</emphasis></para>
1057     <programlisting>
1058 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
1059  * vim:expandtab:shiftwidth=8:tabstop=8:
1060  *
1061  * lustredemo - a simple example of lustreapi functions
1062  */
1063 #include &lt;stdio.h&gt;
1064 #include &lt;fcntl.h&gt;
1065 #include &lt;dirent.h&gt;
1066 #include &lt;errno.h&gt;
1067 #include &lt;stdlib.h&gt;
1068 #include &lt;lustre/lustreapi.h&gt;
1069 #define MAX_OSTS 1024
1070 #define LOV_EA_SIZE(lum, num) (sizeof(*lum) + num * sizeof(*lum-&gt;lmm_objects))
1071 #define LOV_EA_MAX(lum) LOV_EA_SIZE(lum, MAX_OSTS)
1072
1073 /*
1074  * This program provides crude examples of using the lustreapi API functions
1075  */
1076 /* Change these definitions to suit */
1077
1078 #define TESTDIR &quot;/tmp&quot;           /* Results directory */
1079 #define TESTFILE &quot;lustre_dummy&quot;  /* Name for the file we create/destroy */
1080 #define FILESIZE 262144                    /* Size of the file in words */
1081 #define DUMWORD &quot;DEADBEEF&quot;       /* Dummy word used to fill files */
1082 #define MY_STRIPE_WIDTH 2                  /* Set this to the number of OST required */
1083 #define MY_LUSTRE_DIR &quot;/mnt/lustre/ftest&quot;
1084
1085 int close_file(int fd)
1086 {
1087         if (close(fd) &lt; 0) {
1088                 fprintf(stderr, &quot;File close failed: %d (%s)\n&quot;, errno, strerror(errno));
1089                 return -1;
1090         }
1091         return 0;
1092 }
1093
1094 int write_file(int fd)
1095 {
1096         char *stng =  DUMWORD;
1097         int cnt = 0;
1098
1099         for( cnt = 0; cnt &lt; FILESIZE; cnt++) {
1100                 write(fd, stng, sizeof(stng));
1101         }
1102         return 0;
1103 }
1104 /* Open a file, set a specific stripe count, size and starting OST
1105  *    Adjust the parameters to suit */
1106 int open_stripe_file()
1107 {
1108         char *tfile = TESTFILE;
1109         int stripe_size = 65536;    /* System default is 4M */
1110         int stripe_offset = -1;     /* Start at default */
1111         int stripe_count = MY_STRIPE_WIDTH;  /*Single stripe for this demo*/
1112         int stripe_pattern = 0;     /* only RAID 0 at this time */
1113         int rc, fd;
1114
1115         rc = llapi_file_create(tfile,
1116                         stripe_size,stripe_offset,stripe_count,stripe_pattern);
1117         /* result code is inverted, we may return -EINVAL or an ioctl error.
1118          * We borrow an error message from sanity.c
1119          */
1120         if (rc) {
1121                 fprintf(stderr,&quot;llapi_file_create failed: %d (%s) \n&quot;, rc, strerror(-rc));
1122                 return -1;
1123         }
1124         /* llapi_file_create closes the file descriptor, we must re-open */
1125         fd = open(tfile, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644);
1126         if (fd &lt; 0) {
1127                 fprintf(stderr, &quot;Can't open %s file: %d (%s)\n&quot;, tfile, errno, strerror(errno));
1128                 return -1;
1129         }
1130         return fd;
1131 }
1132
1133 /* output a list of uuids for this file */
1134 int get_my_uuids(int fd)
1135 {
1136         struct obd_uuid uuids[1024], *uuidp;        /* Output var */
1137         int obdcount = 1024;
1138         int rc,i;
1139
1140         rc = llapi_lov_get_uuids(fd, uuids, &amp;obdcount);
1141         if (rc != 0) {
1142                 fprintf(stderr, &quot;get uuids failed: %d (%s)\n&quot;,errno, strerror(errno));
1143         }
1144         printf(&quot;This file system has %d obds\n&quot;, obdcount);
1145         for (i = 0, uuidp = uuids; i &lt; obdcount; i++, uuidp++) {
1146                 printf(&quot;UUID %d is %s\n&quot;,i, uuidp-&gt;uuid);
1147         }
1148         return 0;
1149 }
1150
1151 /* Print out some LOV attributes. List our objects */
1152 int get_file_info(char *path)
1153 {
1154
1155         struct lov_user_md *lump;
1156         int rc;
1157         int i;
1158
1159         lump = malloc(LOV_EA_MAX(lump));
1160         if (lump == NULL) {
1161                 return -1;
1162         }
1163
1164         rc = llapi_file_get_stripe(path, lump);
1165
1166         if (rc != 0) {
1167                 fprintf(stderr, &quot;get_stripe failed: %d (%s)\n&quot;,errno, strerror(errno));
1168                 return -1;
1169         }
1170
1171         printf(&quot;Lov magic %u\n&quot;, lump-&gt;lmm_magic);
1172         printf(&quot;Lov pattern %u\n&quot;, lump-&gt;lmm_pattern);
1173         printf(&quot;Lov object id %llu\n&quot;, lump-&gt;lmm_object_id);
1174         printf(&quot;Lov stripe size %u\n&quot;, lump-&gt;lmm_stripe_size);
1175         printf(&quot;Lov stripe count %hu\n&quot;, lump-&gt;lmm_stripe_count);
1176         printf(&quot;Lov stripe offset %u\n&quot;, lump-&gt;lmm_stripe_offset);
1177         for (i = 0; i &lt; lump-&gt;lmm_stripe_count; i++) {
1178                 printf(&quot;Object index %d Objid %llu\n&quot;, lump-&gt;lmm_objects[i].l_ost_idx, lump-&gt;lmm_objects[i].l_object_id);
1179         }
1180
1181         free(lump);
1182         return rc;
1183
1184 }
1185
1186 /* Ping all OSTs that belong to this filesystem */
1187 int ping_osts()
1188 {
1189         DIR *dir;
1190         struct dirent *d;
1191         char osc_dir[100];
1192         int rc;
1193
1194         sprintf(osc_dir, &quot;/proc/fs/lustre/osc&quot;);
1195         dir = opendir(osc_dir);
1196         if (dir == NULL) {
1197                 printf(&quot;Can't open dir\n&quot;);
1198                 return -1;
1199         }
1200         while((d = readdir(dir)) != NULL) {
1201                 if ( d-&gt;d_type == DT_DIR ) {
1202                         if (! strncmp(d-&gt;d_name, &quot;OSC&quot;, 3)) {
1203                                 printf(&quot;Pinging OSC %s &quot;, d-&gt;d_name);
1204                                 rc = llapi_ping(&quot;osc&quot;, d-&gt;d_name);
1205                                 if (rc) {
1206                                         printf(&quot;  bad\n&quot;);
1207                                 } else {
1208                                         printf(&quot;  good\n&quot;);
1209                                 }
1210                         }
1211                 }
1212         }
1213         return 0;
1214
1215 }
1216
1217 int main()
1218 {
1219         int file;
1220         int rc;
1221         char filename[100];
1222         char sys_cmd[100];
1223
1224         sprintf(filename, &quot;%s/%s&quot;,MY_LUSTRE_DIR, TESTFILE);
1225
1226         printf(&quot;Open a file with striping\n&quot;);
1227         file = open_stripe_file();
1228         if ( file &lt; 0 ) {
1229                 printf(&quot;Exiting\n&quot;);
1230                 exit(1);
1231         }
1232         printf(&quot;Getting uuid list\n&quot;);
1233         rc = get_my_uuids(file);
1234         printf(&quot;Write to the file\n&quot;);
1235         rc = write_file(file);
1236         rc = close_file(file);
1237         printf(&quot;Listing LOV data\n&quot;);
1238         rc = get_file_info(filename);
1239         printf(&quot;Ping our OSTs\n&quot;);
1240         rc = ping_osts();
1241
1242         /* the results should match lfs getstripe */
1243         printf(&quot;Confirming our results with lfs getstripe\n&quot;);
1244         sprintf(sys_cmd, &quot;/usr/bin/lfs getstripe %s/%s&quot;, MY_LUSTRE_DIR, TESTFILE);
1245         system(sys_cmd);
1246
1247         printf(&quot;All done\n&quot;);
1248         exit(rc);
1249 }
1250 </programlisting>
1251     <para><emphasis role="bold">Makefile for sample application:</emphasis></para>
1252     <screen> 
1253 gcc -g -O2 -Wall -o lustredemo libtest.c -llustreapi
1254 clean:
1255 rm -f core lustredemo *.o
1256 run: 
1257 make
1258 rm -f /mnt/lustre/ftest/lustredemo
1259 rm -f /mnt/lustre/ftest/lustre_dummy
1260 cp lustredemo /mnt/lustre/ftest/
1261 </screen>
1262     <section remap="h5">
1263       <title>See Also</title>
1264       <itemizedlist>
1265         <listitem>
1266           <para>
1267             <xref linkend="llapi_file_create"/>
1268     </para>
1269         </listitem>
1270         <listitem>
1271           <para>
1272             <xref linkend="llapi_file_get_stripe"/>
1273     </para>
1274         </listitem>
1275         <listitem>
1276           <para>
1277             <xref linkend="llapi_file_open"/>
1278     </para>
1279         </listitem>
1280         <listitem>
1281           <para>
1282             <xref linkend="llapi_quotactl"/>
1283     </para>
1284         </listitem>
1285       </itemizedlist>
1286     </section>
1287   </section>
1288 </chapter>
1289 <!--
1290   vim:expandtab:shiftwidth=2:tabstop=8:
1291   -->