1 <?xml version="1.0" encoding="UTF-8"?>
2 <article version="5.0" xml:lang="en-US" xmlns="http://docbook.org/ns/docbook" xmlns:xl="http://www.w3.org/1999/xlink">
4 <title>Setting Lustre Properties in a C Program (llapi)</title>
6 <informaltable frame="none">
8 <colspec colname="c1" colwidth="50*"/>
9 <colspec colname="c2" colwidth="50*"/>
14 <entry align="left"><para>Lustre 2.0 Operations Manual</para></entry>
15 <entry align="right" valign="top"><para><link xl:href="index.html"><inlinemediaobject><imageobject role="html">
16 <imagedata contentdepth="26" contentwidth="30" fileref="./shared/toc01.gif" scalefit="1"/>
18 <imageobject role="fo">
19 <imagedata contentdepth="100%" contentwidth="" depth="" fileref="./shared/toc01.gif" scalefit="1" width="100%"/>
21 </inlinemediaobject></link><link xl:href="LustreProgrammingInterfaces.html"><inlinemediaobject><imageobject role="html">
22 <imagedata contentdepth="26" contentwidth="30" fileref="./shared/prev01.gif" scalefit="1"/>
24 <imageobject role="fo">
25 <imagedata contentdepth="100%" contentwidth="" depth="" fileref="./shared/prev01.gif" scalefit="1" width="100%"/>
27 </inlinemediaobject></link><link xl:href="ConfigurationFilesModuleParameters.html"><inlinemediaobject><imageobject role="html">
28 <imagedata contentdepth="26" contentwidth="30" fileref="./shared/next01.gif" scalefit="1"/>
30 <imageobject role="fo">
31 <imagedata contentdepth="100%" contentwidth="" depth="" fileref="./shared/next01.gif" scalefit="1" width="100%"/>
33 </inlinemediaobject></link><link xl:href="ix.html"><inlinemediaobject><imageobject role="html">
34 <imagedata contentdepth="26" contentwidth="30" fileref="./shared/index01.gif" scalefit="1"/>
36 <imageobject role="fo">
37 <imagedata contentdepth="100%" contentwidth="" depth="" fileref="./shared/index01.gif" scalefit="1" width="100%"/>
39 </inlinemediaobject></link></para></entry>
44 <para><link xl:href=""/></para>
45 <informaltable frame="none">
47 <colspec colname="c1" colwidth="100*"/>
51 <entry align="right"><para><anchor xml:id="dbdoclet.50438215_pgfId-874" xreflabel=""/>C H A P T E R 34</para></entry>
56 <informaltable frame="none">
58 <colspec colname="c1" colwidth="100*"/>
62 <entry align="right"><para><anchor xml:id="dbdoclet.50438215_pgfId-5529" xreflabel=""/><anchor xml:id="dbdoclet.50438215_66186" xreflabel=""/>Setting Lustre Properties in a C Program (llapi)</para></entry>
67 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297638" xreflabel=""/>This chapter describes the llapi 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>
68 <itemizedlist><listitem>
69 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296814" xreflabel=""/><link xl:href="SettingLustreProperties_HTML.html#50438215_30970">llapi_file_create</link></para>
75 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297652" xreflabel=""/><link xl:href="SettingLustreProperties_HTML.html#50438215_50149">llapi_file_get_stripe</link></para>
81 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297658" xreflabel=""/><link xl:href="SettingLustreProperties_HTML.html#50438215_86607">llapi_file_open</link></para>
87 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298853" xreflabel=""/><link xl:href="SettingLustreProperties_HTML.html#50438215_12433">llapi_quotactl</link></para>
93 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298974" xreflabel=""/><link xl:href="SettingLustreProperties_HTML.html#50438215_15718">llapi_path2fid</link></para>
99 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298854" xreflabel=""/> </para>
100 <informaltable frame="none">
102 <colspec colname="c1" colwidth="100*"/>
105 <entry><para><emphasis role="bold">Note -</emphasis><anchor xml:id="dbdoclet.50438215_pgfId-1298855" xreflabel=""/>Lustre programming interface man pages are found in the lustre/doc folder.</para></entry>
111 <title><anchor xml:id="dbdoclet.50438215_pgfId-1296828" xreflabel=""/></title>
113 <title>34.1 <anchor xml:id="dbdoclet.50438215_30970" xreflabel=""/>llapi_file_create</title>
114 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296829" xreflabel=""/>Use llapi_file_create to set Lustre properties for a new file.</para>
116 <title><anchor xml:id="dbdoclet.50438215_pgfId-1296830" xreflabel=""/>Synopsis</title>
117 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296831" xreflabel=""/>#include <lustre/liblustreapi.h>#include <lustre/lustre_user.h>
118 <anchor xml:id="dbdoclet.50438215_pgfId-1296832" xreflabel=""/>int llapi_file_create(char *name, long stripe_size, int stripe_offset, int \
119 stripe_count, int stripe_pattern);
123 <title><anchor xml:id="dbdoclet.50438215_pgfId-1296833" xreflabel=""/>Description</title>
124 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296834" xreflabel=""/>The llapi_file_create() function sets a file descriptor’s Lustre striping information. The file descriptor is then accessed with open ().</para>
125 <informaltable frame="all">
127 <colspec colname="c1" colwidth="50*"/>
128 <colspec colname="c2" colwidth="50*"/>
131 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1296837" xreflabel=""/>Option</emphasis></para></entry>
132 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1296839" xreflabel=""/>Description</emphasis></para></entry>
137 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296841" xreflabel=""/><emphasis role="bold">llapi_file_create()</emphasis></para></entry>
138 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296843" xreflabel=""/>If the file already exists, this parameter returns to ‘EEXIST’. If the stripe parameters are invalid, this parameter returns to ‘EINVAL’.</para></entry>
141 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296845" xreflabel=""/><emphasis role="bold">stripe_size</emphasis></para></entry>
142 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296847" xreflabel=""/>This value must be an even multiple of system page size, as shown by getpagesize (). The default Lustre stripe size is 4MB.</para></entry>
145 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296849" xreflabel=""/><emphasis role="bold">stripe_offset</emphasis></para></entry>
146 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296851" xreflabel=""/>Indicates the starting OST for this file.</para></entry>
149 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296853" xreflabel=""/><emphasis role="bold">stripe_count</emphasis></para></entry>
150 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296855" xreflabel=""/>Indicates the number of OSTs that this file will be striped across.</para></entry>
153 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296857" xreflabel=""/><emphasis role="bold">stripe_pattern</emphasis></para></entry>
154 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1296859" xreflabel=""/> Indicates the RAID pattern.</para></entry>
159 <informaltable frame="none">
161 <colspec colname="c1" colwidth="100*"/>
164 <entry><para><emphasis role="bold">Note -</emphasis><anchor xml:id="dbdoclet.50438215_pgfId-1296860" xreflabel=""/>Currently, only RAID 0 is supported. To use the system defaults, set these values: stripe_size = 0, stripe_offset = -1, stripe_count = 0, stripe_pattern = 0</para></entry>
171 <title><anchor xml:id="dbdoclet.50438215_pgfId-1296861" xreflabel=""/>Examples</title>
172 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296862" xreflabel=""/>System default size is 4 MB.</para>
173 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296863" xreflabel=""/>char *tfile = TESTFILE;
174 <anchor xml:id="dbdoclet.50438215_pgfId-1296864" xreflabel=""/>int stripe_size = 65536
176 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296865" xreflabel=""/>To start at default, run:</para>
177 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296866" xreflabel=""/>int stripe_offset = -1
179 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296867" xreflabel=""/>To start at the default, run:</para>
180 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296868" xreflabel=""/>int stripe_count = 1
182 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296869" xreflabel=""/>To set a single stripe for this example, run:</para>
183 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296870" xreflabel=""/>int stripe_pattern = 0
185 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296871" xreflabel=""/>Currently, only RAID 0 is supported.</para>
186 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296872" xreflabel=""/>int stripe_pattern = 0;
187 <anchor xml:id="dbdoclet.50438215_pgfId-1296873" xreflabel=""/>int rc, fd;
188 <anchor xml:id="dbdoclet.50438215_pgfId-1296874" xreflabel=""/>rc = llapi_file_create(tfile, stripe_size,stripe_offset, stripe_count,strip\
191 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296875" xreflabel=""/>Result code is inverted, you may return with ’EINVAL’ or an ioctl error.</para>
192 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296876" xreflabel=""/>if (rc) {
193 <anchor xml:id="dbdoclet.50438215_pgfId-1296877" xreflabel=""/>fprintf(stderr,"llapi_file_create failed: %d (%s) 0, rc, strerror(-rc));retu\
196 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296878" xreflabel=""/>llapi_file_create closes the file descriptor. You must re-open the descriptor. To do this, run:</para>
197 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296879" xreflabel=""/>fd = open(tfile, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644); if (fd < 0) \\
198 { fprintf(stderr, "Can’t open %s file: %s0, tfile,
199 <anchor xml:id="dbdoclet.50438215_pgfId-1296880" xreflabel=""/>str-
200 <anchor xml:id="dbdoclet.50438215_pgfId-1296881" xreflabel=""/>error(errno));
201 <anchor xml:id="dbdoclet.50438215_pgfId-1296882" xreflabel=""/>return -1;
202 <anchor xml:id="dbdoclet.50438215_pgfId-1296883" xreflabel=""/>}
207 <title>34.2 <anchor xml:id="dbdoclet.50438215_50149" xreflabel=""/>llapi_file_get_stripe</title>
208 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296886" xreflabel=""/>Use llapi_file_get_stripe to get striping information for a file or directory on a Lustre file system.</para>
210 <title><anchor xml:id="dbdoclet.50438215_pgfId-1296887" xreflabel=""/>Synopsis</title>
211 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296888" xreflabel=""/>#include <sys/types.h>
212 <anchor xml:id="dbdoclet.50438215_pgfId-1296889" xreflabel=""/>#include <sys/stat.h>
213 <anchor xml:id="dbdoclet.50438215_pgfId-1296890" xreflabel=""/>#include <fcntl.h>
214 <anchor xml:id="dbdoclet.50438215_pgfId-1296891" xreflabel=""/>#include <liblustre.h>
215 <anchor xml:id="dbdoclet.50438215_pgfId-1296892" xreflabel=""/>#include <lustre/lustre_idl.h>
216 <anchor xml:id="dbdoclet.50438215_pgfId-1296893" xreflabel=""/>#include <lustre/liblustreapi.h>
217 <anchor xml:id="dbdoclet.50438215_pgfId-1296894" xreflabel=""/>#include <lustre/lustre_user.h>
218 <anchor xml:id="dbdoclet.50438215_pgfId-1296895" xreflabel=""/>
219 <anchor xml:id="dbdoclet.50438215_pgfId-1296896" xreflabel=""/>int llapi_file_get_stripe(const char *<emphasis>path</emphasis>, void *<emphasis>lum</emphasis>);
223 <title><anchor xml:id="dbdoclet.50438215_pgfId-1296897" xreflabel=""/>Description</title>
224 <para><anchor xml:id="dbdoclet.50438215_pgfId-1296898" xreflabel=""/>The llapi_file_get_stripe() 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>
225 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1296899" xreflabel=""/>struct lov_user_md_v1 {
226 <anchor xml:id="dbdoclet.50438215_pgfId-1296900" xreflabel=""/>__u32 lmm_magic;
227 <anchor xml:id="dbdoclet.50438215_pgfId-1296901" xreflabel=""/>__u32 lmm_pattern;
228 <anchor xml:id="dbdoclet.50438215_pgfId-1296902" xreflabel=""/>__u64 lmm_object_id;
229 <anchor xml:id="dbdoclet.50438215_pgfId-1296903" xreflabel=""/>__u64 lmm_object_seq;
230 <anchor xml:id="dbdoclet.50438215_pgfId-1296904" xreflabel=""/>__u32 lmm_stripe_size;
231 <anchor xml:id="dbdoclet.50438215_pgfId-1296905" xreflabel=""/>__u16 lmm_stripe_count;
232 <anchor xml:id="dbdoclet.50438215_pgfId-1296906" xreflabel=""/>__u16 lmm_stripe_offset;
233 <anchor xml:id="dbdoclet.50438215_pgfId-1296907" xreflabel=""/>struct lov_user_ost_data_v1 lmm_objects[0];
234 <anchor xml:id="dbdoclet.50438215_pgfId-1296908" xreflabel=""/>} __attribute__((packed));
235 <anchor xml:id="dbdoclet.50438215_pgfId-1296909" xreflabel=""/>struct lov_user_md_v3 {
236 <anchor xml:id="dbdoclet.50438215_pgfId-1296910" xreflabel=""/>__u32 lmm_magic;
237 <anchor xml:id="dbdoclet.50438215_pgfId-1296911" xreflabel=""/>__u32 lmm_pattern;
238 <anchor xml:id="dbdoclet.50438215_pgfId-1296912" xreflabel=""/>__u64 lmm_object_id;
239 <anchor xml:id="dbdoclet.50438215_pgfId-1296913" xreflabel=""/>__u64 lmm_object_seq;
240 <anchor xml:id="dbdoclet.50438215_pgfId-1296914" xreflabel=""/>__u32 lmm_stripe_size;
241 <anchor xml:id="dbdoclet.50438215_pgfId-1296915" xreflabel=""/>__u16 lmm_stripe_count;
242 <anchor xml:id="dbdoclet.50438215_pgfId-1296916" xreflabel=""/>__u16 lmm_stripe_offset;
243 <anchor xml:id="dbdoclet.50438215_pgfId-1296917" xreflabel=""/>char lmm_pool_name[LOV_MAXPOOLNAME];
244 <anchor xml:id="dbdoclet.50438215_pgfId-1296918" xreflabel=""/>struct lov_user_ost_data_v1 lmm_objects[0];
245 <anchor xml:id="dbdoclet.50438215_pgfId-1297038" xreflabel=""/>} __attribute__((packed));
247 <informaltable frame="all">
249 <colspec colname="c1" colwidth="50*"/>
250 <colspec colname="c2" colwidth="50*"/>
253 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1298282" xreflabel=""/>Option</emphasis></para></entry>
254 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1298284" xreflabel=""/>Description</emphasis></para></entry>
259 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298286" xreflabel=""/><emphasis role="bold">lmm_magic</emphasis></para></entry>
260 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298288" xreflabel=""/>Specifies the format of the returned striping information. <emphasis role="bold">LOV_MAGIC_V1</emphasis> isused for lov_user_md_v1. <emphasis role="bold">LOV_MAGIC_V3</emphasis> is used for lov_user_md_v3.</para></entry>
263 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298290" xreflabel=""/><emphasis role="bold">lmm_pattern</emphasis></para></entry>
264 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298292" xreflabel=""/>Holds the striping pattern. Only <emphasis role="bold">LOV_PATTERN_RAID0</emphasis> is possible in this Lustre version.</para></entry>
267 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298294" xreflabel=""/><emphasis role="bold">lmm_object_id</emphasis></para></entry>
268 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298296" xreflabel=""/>Holds the MDS object ID.</para></entry>
271 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298298" xreflabel=""/><emphasis role="bold">lmm_object_gr</emphasis></para></entry>
272 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298300" xreflabel=""/>Holds the MDS object group.</para></entry>
275 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298302" xreflabel=""/><emphasis role="bold">lmm_stripe_size</emphasis></para></entry>
276 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298304" xreflabel=""/>Holds the stripe size in bytes.</para></entry>
279 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298306" xreflabel=""/><emphasis role="bold">lmm_stripe_count</emphasis></para></entry>
280 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298308" xreflabel=""/>Holds the number of OSTs over which the file is striped.</para></entry>
283 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298310" xreflabel=""/><emphasis role="bold">lmm_stripe_offset</emphasis></para></entry>
284 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298359" xreflabel=""/>Holds the OST index from which the file starts.</para></entry>
287 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298314" xreflabel=""/><emphasis role="bold">lmm_pool_name</emphasis></para></entry>
288 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298374" xreflabel=""/>Holds the OST pool name to which the file belongs.</para></entry>
291 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298318" xreflabel=""/><emphasis role="bold">lmm_objects</emphasis></para></entry>
292 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298390" xreflabel=""/>An array of lmm_stripe_count members containing per OST file information in</para><para><anchor xml:id="dbdoclet.50438215_pgfId-1298391" xreflabel=""/>the following format:</para><para><anchor xml:id="dbdoclet.50438215_pgfId-1298392" xreflabel=""/>struct lov_user_ost_data_v1 {</para><para><anchor xml:id="dbdoclet.50438215_pgfId-1298393" xreflabel=""/>__u64 l_object_id;</para><para><anchor xml:id="dbdoclet.50438215_pgfId-1298394" xreflabel=""/>__u64 l_object_seq;</para><para><anchor xml:id="dbdoclet.50438215_pgfId-1298395" xreflabel=""/>__u32 l_ost_gen;</para><para><anchor xml:id="dbdoclet.50438215_pgfId-1298396" xreflabel=""/>__u32 l_ost_idx;</para><para><anchor xml:id="dbdoclet.50438215_pgfId-1298397" xreflabel=""/>} __attribute__((packed));</para></entry>
295 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298322" xreflabel=""/><emphasis role="bold">l_object_id</emphasis></para></entry>
296 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298412" xreflabel=""/>Holds the OST’s object ID.</para></entry>
299 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298326" xreflabel=""/><emphasis role="bold">l_object_seq</emphasis></para></entry>
300 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298427" xreflabel=""/>Holds the OST’s object group.</para></entry>
303 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298330" xreflabel=""/><emphasis role="bold">l_ost_gen</emphasis></para></entry>
304 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298442" xreflabel=""/>Holds the OST’s index generation.</para></entry>
307 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298334" xreflabel=""/><emphasis role="bold">l_ost_idx</emphasis></para></entry>
308 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298461" xreflabel=""/>Holds the OST’s index in LOV.</para></entry>
315 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297039" xreflabel=""/>Return Values</title>
316 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297040" xreflabel=""/>llapi_file_get_stripe() returns:</para>
317 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297041" xreflabel=""/><emphasis role="bold">0</emphasis> On success</para>
318 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297042" xreflabel=""/><emphasis role="bold">!= 0</emphasis> On failure, <emphasis>errno</emphasis> is set appropriately</para>
321 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297043" xreflabel=""/>Errors</title>
322 <informaltable frame="all">
324 <colspec colname="c1" colwidth="50*"/>
325 <colspec colname="c2" colwidth="50*"/>
328 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1298797" xreflabel=""/>Errors</emphasis></para></entry>
329 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1298799" xreflabel=""/>Description</emphasis></para></entry>
334 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298801" xreflabel=""/><emphasis role="bold">ENOMEM</emphasis></para></entry>
335 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298803" xreflabel=""/><emphasis role="bold">Failed to allocate memory</emphasis></para></entry>
338 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298805" xreflabel=""/><emphasis role="bold">ENAMETOOLONG</emphasis></para></entry>
339 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298868" xreflabel=""/>Path was too long</para></entry>
342 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298809" xreflabel=""/><emphasis role="bold">ENOENT</emphasis></para></entry>
343 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298870" xreflabel=""/>Path does not point to a file or directory</para></entry>
346 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298813" xreflabel=""/><emphasis role="bold">ENOTTY</emphasis></para></entry>
347 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298872" xreflabel=""/>Path does not point to a Lustre file system</para></entry>
350 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298817" xreflabel=""/><emphasis role="bold">EFAULT</emphasis></para></entry>
351 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298819" xreflabel=""/>Memory region pointed by lum is not properly mapped</para></entry>
358 <title><anchor xml:id="dbdoclet.50438215_pgfId-1298829" xreflabel=""/>Examples</title>
359 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297050" xreflabel=""/>#include <sys/vfs.h>
360 <anchor xml:id="dbdoclet.50438215_pgfId-1297051" xreflabel=""/>#include <liblustre.h>
361 <anchor xml:id="dbdoclet.50438215_pgfId-1297052" xreflabel=""/>#include <lnet/lnetctl.h>
362 <anchor xml:id="dbdoclet.50438215_pgfId-1297053" xreflabel=""/>#include <obd.h>
363 <anchor xml:id="dbdoclet.50438215_pgfId-1297054" xreflabel=""/>#include <lustre_lib.h>
364 <anchor xml:id="dbdoclet.50438215_pgfId-1297055" xreflabel=""/>#include <lustre/liblustreapi.h>
365 <anchor xml:id="dbdoclet.50438215_pgfId-1297056" xreflabel=""/>#include <obd_lov.h>
366 <anchor xml:id="dbdoclet.50438215_pgfId-1297057" xreflabel=""/>static inline int maxint(int a, int b)
367 <anchor xml:id="dbdoclet.50438215_pgfId-1297058" xreflabel=""/>{
368 <anchor xml:id="dbdoclet.50438215_pgfId-1297059" xreflabel=""/>return a > b ? a : b;
369 <anchor xml:id="dbdoclet.50438215_pgfId-1297060" xreflabel=""/>}
370 <anchor xml:id="dbdoclet.50438215_pgfId-1297061" xreflabel=""/>static void *alloc_lum()
371 <anchor xml:id="dbdoclet.50438215_pgfId-1297062" xreflabel=""/>{
372 <anchor xml:id="dbdoclet.50438215_pgfId-1297063" xreflabel=""/>int v1, v3, join;
373 <anchor xml:id="dbdoclet.50438215_pgfId-1297064" xreflabel=""/>v1 = sizeof(struct lov_user_md_v1) +
374 <anchor xml:id="dbdoclet.50438215_pgfId-1297065" xreflabel=""/>LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1);
375 <anchor xml:id="dbdoclet.50438215_pgfId-1297066" xreflabel=""/>v3 = sizeof(struct lov_user_md_v3) +
376 <anchor xml:id="dbdoclet.50438215_pgfId-1297067" xreflabel=""/>LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1);
377 <anchor xml:id="dbdoclet.50438215_pgfId-1297068" xreflabel=""/>return malloc(maxint(v1, v3));
378 <anchor xml:id="dbdoclet.50438215_pgfId-1297069" xreflabel=""/>}
379 <anchor xml:id="dbdoclet.50438215_pgfId-1297070" xreflabel=""/>int main(int argc, char** argv)
380 <anchor xml:id="dbdoclet.50438215_pgfId-1297071" xreflabel=""/>{
381 <anchor xml:id="dbdoclet.50438215_pgfId-1297072" xreflabel=""/>struct lov_user_md *lum_file = NULL;
382 <anchor xml:id="dbdoclet.50438215_pgfId-1297073" xreflabel=""/>int rc;
383 <anchor xml:id="dbdoclet.50438215_pgfId-1297074" xreflabel=""/>int lum_size;
384 <anchor xml:id="dbdoclet.50438215_pgfId-1297075" xreflabel=""/>if (argc != 2) {
385 <anchor xml:id="dbdoclet.50438215_pgfId-1297076" xreflabel=""/>fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
386 <anchor xml:id="dbdoclet.50438215_pgfId-1297077" xreflabel=""/>return 1;
387 <anchor xml:id="dbdoclet.50438215_pgfId-1297078" xreflabel=""/>}
388 <anchor xml:id="dbdoclet.50438215_pgfId-1297079" xreflabel=""/>lum_file = alloc_lum();
389 <anchor xml:id="dbdoclet.50438215_pgfId-1297080" xreflabel=""/>if (lum_file == NULL) {
390 <anchor xml:id="dbdoclet.50438215_pgfId-1297081" xreflabel=""/>rc = ENOMEM;
391 <anchor xml:id="dbdoclet.50438215_pgfId-1297082" xreflabel=""/>goto cleanup;
392 <anchor xml:id="dbdoclet.50438215_pgfId-1297083" xreflabel=""/>}
393 <anchor xml:id="dbdoclet.50438215_pgfId-1297084" xreflabel=""/>rc = llapi_file_get_stripe(argv[1], lum_file);
394 <anchor xml:id="dbdoclet.50438215_pgfId-1297085" xreflabel=""/>if (rc) {
395 <anchor xml:id="dbdoclet.50438215_pgfId-1297086" xreflabel=""/>rc = errno;
396 <anchor xml:id="dbdoclet.50438215_pgfId-1297087" xreflabel=""/>goto cleanup;
397 <anchor xml:id="dbdoclet.50438215_pgfId-1297088" xreflabel=""/>}
398 <anchor xml:id="dbdoclet.50438215_pgfId-1297089" xreflabel=""/>/* stripe_size stripe_count */
399 <anchor xml:id="dbdoclet.50438215_pgfId-1297090" xreflabel=""/>printf("%d %d\n",
400 <anchor xml:id="dbdoclet.50438215_pgfId-1297091" xreflabel=""/>lum_file->lmm_stripe_size,
401 <anchor xml:id="dbdoclet.50438215_pgfId-1297092" xreflabel=""/>lum_file->lmm_stripe_count);
402 <anchor xml:id="dbdoclet.50438215_pgfId-1297093" xreflabel=""/>cleanup:
403 <anchor xml:id="dbdoclet.50438215_pgfId-1297094" xreflabel=""/>if (lum_file != NULL)
404 <anchor xml:id="dbdoclet.50438215_pgfId-1297095" xreflabel=""/>free(lum_file);
405 <anchor xml:id="dbdoclet.50438215_pgfId-1297096" xreflabel=""/>return rc;
406 <anchor xml:id="dbdoclet.50438215_pgfId-1297097" xreflabel=""/>}
411 <title>34.3 <anchor xml:id="dbdoclet.50438215_86607" xreflabel=""/>llapi_file_open</title>
412 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298469" xreflabel=""/>The llapi_file_open command opens (or creates) a file or device on a Lustre filesystem.</para>
414 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297361" xreflabel=""/>Synopsis</title>
415 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297362" xreflabel=""/>#include <sys/types.h>
416 <anchor xml:id="dbdoclet.50438215_pgfId-1297363" xreflabel=""/>#include <sys/stat.h>
417 <anchor xml:id="dbdoclet.50438215_pgfId-1297364" xreflabel=""/>#include <fcntl.h>
418 <anchor xml:id="dbdoclet.50438215_pgfId-1297365" xreflabel=""/>#include <liblustre.h>
419 <anchor xml:id="dbdoclet.50438215_pgfId-1297366" xreflabel=""/>#include <lustre/lustre_idl.h>
420 <anchor xml:id="dbdoclet.50438215_pgfId-1297367" xreflabel=""/>#include <lustre/liblustreapi.h>
421 <anchor xml:id="dbdoclet.50438215_pgfId-1297368" xreflabel=""/>#include <lustre/lustre_user.h>
422 <anchor xml:id="dbdoclet.50438215_pgfId-1297369" xreflabel=""/>int llapi_file_open(const char *<emphasis>name</emphasis>, int <emphasis>flags</emphasis>, int <emphasis>mode</emphasis>,
423 <anchor xml:id="dbdoclet.50438215_pgfId-1297370" xreflabel=""/> unsigned long long <emphasis>stripe_size</emphasis>, int <emphasis>stripe_offset</emphasis>,
424 <anchor xml:id="dbdoclet.50438215_pgfId-1297371" xreflabel=""/> int <emphasis>stripe_count</emphasis>, int <emphasis>stripe_pattern</emphasis>);
425 <anchor xml:id="dbdoclet.50438215_pgfId-1297372" xreflabel=""/>int llapi_file_create(const char *<emphasis>name</emphasis>, unsigned long long <emphasis>stripe_size</emphasis>,
426 <anchor xml:id="dbdoclet.50438215_pgfId-1297373" xreflabel=""/> int <emphasis>stripe_offset</emphasis>, int <emphasis>stripe_count</emphasis>,
427 <anchor xml:id="dbdoclet.50438215_pgfId-1297374" xreflabel=""/> int <emphasis>stripe_pattern</emphasis>);
431 <title><anchor xml:id="dbdoclet.50438215_pgfId-1298000" xreflabel=""/>Description</title>
432 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298001" xreflabel=""/>The llapi_file_create() call is equivalent to the llapi_file_open call with <emphasis>flags</emphasis> equal to O_CREAT|O_WRONLY and <emphasis>mode</emphasis> equal to 0644, followed by file close.</para>
433 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298510" xreflabel=""/>llapi_file_open() opens a file with a given name on a Lustre filesystem.</para>
434 <informaltable frame="all">
436 <colspec colname="c1" colwidth="50*"/>
437 <colspec colname="c2" colwidth="50*"/>
440 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1298598" xreflabel=""/>Option</emphasis></para></entry>
441 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1298600" xreflabel=""/>Description</emphasis></para></entry>
446 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298602" xreflabel=""/><emphasis role="bold">flags</emphasis></para></entry>
447 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298636" xreflabel=""/>Can be a combination of O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, FASYNC, O_DIRECT, O_LARGEFILE, O_DIRECTORY, O_NOFOLLOW, O_NOATIME.</para></entry>
450 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298606" xreflabel=""/><emphasis role="bold">mode</emphasis></para></entry>
451 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298656" xreflabel=""/>Specifies the permission bits to be used for a new file when O_CREAT is used.</para></entry>
454 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298610" xreflabel=""/><emphasis role="bold">stripe_size</emphasis></para></entry>
455 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298669" xreflabel=""/>Specifies stripe size (in bytes). Should be multiple of 64 KB, not exceeding 4 GB.</para></entry>
458 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298614" xreflabel=""/><emphasis role="bold">stripe_offset</emphasis></para></entry>
459 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298678" xreflabel=""/>Specifies an OST index from which the file should start. The default value is -1.</para></entry>
462 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298618" xreflabel=""/><emphasis role="bold">stripe_count</emphasis></para></entry>
463 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298687" xreflabel=""/>Specifies the number of OSTs to stripe the file across. The default value is -1.</para></entry>
466 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298693" xreflabel=""/><emphasis role="bold">stripe_pattern</emphasis></para></entry>
467 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298705" xreflabel=""/>Specifies the striping pattern. In this version of Lustre, only LOV_PATTERN_RAID0 is available. The default value is 0.</para></entry>
474 <title><anchor xml:id="dbdoclet.50438215_pgfId-1298592" xreflabel=""/>Return Values</title>
475 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297430" xreflabel=""/>llapi_file_open() and llapi_file_create() return:</para>
476 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297431" xreflabel=""/><emphasis role="bold">>=0</emphasis> On success, for llapi_file_open the return value is a file descriptor</para>
477 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297432" xreflabel=""/><emphasis role="bold"><0</emphasis> On failure, the absolute value is an error code</para>
480 <title><anchor xml:id="dbdoclet.50438215_pgfId-1298750" xreflabel=""/>Errors</title>
481 <informaltable frame="all">
483 <colspec colname="c1" colwidth="50*"/>
484 <colspec colname="c2" colwidth="50*"/>
487 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1297435" xreflabel=""/>Errors</emphasis></para></entry>
488 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1297437" xreflabel=""/>Description</emphasis></para></entry>
493 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297439" xreflabel=""/><emphasis role="bold">EINVAL</emphasis></para></entry>
494 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297441" xreflabel=""/><emphasis role="bold">stripe_size</emphasis> or <emphasis role="bold">stripe_offset</emphasis> or <emphasis role="bold">stripe_count</emphasis> or <emphasis role="bold">stripe_pattern</emphasis> is invalid.</para></entry>
497 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297443" xreflabel=""/><emphasis role="bold">EEXIST</emphasis></para></entry>
498 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298878" xreflabel=""/>Striping information has already been set and cannot be altered; <emphasis role="bold">name</emphasis> already exists.</para></entry>
501 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297447" xreflabel=""/><emphasis role="bold">EALREADY</emphasis></para></entry>
502 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297449" xreflabel=""/>Striping information has already been set and cannot be altered</para></entry>
505 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297451" xreflabel=""/><emphasis role="bold">ENOTTY</emphasis></para></entry>
506 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297453" xreflabel=""/><emphasis role="bold">name</emphasis> may not point to a Lustre filesystem.</para></entry>
513 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297462" xreflabel=""/>Example</title>
514 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297463" xreflabel=""/>#include <sys/types.h>
515 <anchor xml:id="dbdoclet.50438215_pgfId-1297464" xreflabel=""/>#include <sys/stat.h>
516 <anchor xml:id="dbdoclet.50438215_pgfId-1297465" xreflabel=""/>#include <fcntl.h>
517 <anchor xml:id="dbdoclet.50438215_pgfId-1297466" xreflabel=""/>#include <errno.h>
518 <anchor xml:id="dbdoclet.50438215_pgfId-1297467" xreflabel=""/>#include <stdio.h>
519 <anchor xml:id="dbdoclet.50438215_pgfId-1297468" xreflabel=""/>#include <liblustre.h>
520 <anchor xml:id="dbdoclet.50438215_pgfId-1297469" xreflabel=""/>#include <lustre/lustre_idl.h>
521 <anchor xml:id="dbdoclet.50438215_pgfId-1297470" xreflabel=""/>#include <lustre/liblustreapi.h>
522 <anchor xml:id="dbdoclet.50438215_pgfId-1297471" xreflabel=""/>#include <lustre/lustre_user.h>
523 <anchor xml:id="dbdoclet.50438215_pgfId-1297472" xreflabel=""/>int main(int argc, char *argv[])
524 <anchor xml:id="dbdoclet.50438215_pgfId-1297473" xreflabel=""/>{
525 <anchor xml:id="dbdoclet.50438215_pgfId-1297474" xreflabel=""/> int rc;
526 <anchor xml:id="dbdoclet.50438215_pgfId-1297475" xreflabel=""/> if (argc != 2)
527 <anchor xml:id="dbdoclet.50438215_pgfId-1297476" xreflabel=""/> return -1;
528 <anchor xml:id="dbdoclet.50438215_pgfId-1297477" xreflabel=""/> rc = llapi_file_create(argv[1], 1048576, 0, 2, LOV_PATTERN_RAID0);
529 <anchor xml:id="dbdoclet.50438215_pgfId-1297478" xreflabel=""/> if (rc < 0) {
530 <anchor xml:id="dbdoclet.50438215_pgfId-1297479" xreflabel=""/> fprintf(stderr, "file creation has failed, %s\n", strerror\
532 <anchor xml:id="dbdoclet.50438215_pgfId-1297480" xreflabel=""/> return -1;
533 <anchor xml:id="dbdoclet.50438215_pgfId-1297481" xreflabel=""/> }
534 <anchor xml:id="dbdoclet.50438215_pgfId-1297482" xreflabel=""/> printf("%s with stripe size 1048576, striped across 2 OSTs,"
535 <anchor xml:id="dbdoclet.50438215_pgfId-1297483" xreflabel=""/> " has been created!\n", argv[1]);
536 <anchor xml:id="dbdoclet.50438215_pgfId-1297484" xreflabel=""/> return 0;
537 <anchor xml:id="dbdoclet.50438215_pgfId-1297485" xreflabel=""/>}
542 <title>34.4 <anchor xml:id="dbdoclet.50438215_12433" xreflabel=""/>llapi_quotactl</title>
543 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297144" xreflabel=""/>Use llapi_quotactl to manipulate disk quotas on a Lustre file system.</para>
545 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297145" xreflabel=""/>Synopsis</title>
546 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297146" xreflabel=""/>#include <liblustre.h>
547 <anchor xml:id="dbdoclet.50438215_pgfId-1297147" xreflabel=""/>#include <lustre/lustre_idl.h>
548 <anchor xml:id="dbdoclet.50438215_pgfId-1297148" xreflabel=""/>#include <lustre/liblustreapi.h>
549 <anchor xml:id="dbdoclet.50438215_pgfId-1297149" xreflabel=""/>#include <lustre/lustre_user.h>
550 <anchor xml:id="dbdoclet.50438215_pgfId-1297150" xreflabel=""/>int llapi_quotactl(char" " *mnt," " struct if_quotactl" " *qctl)
551 <anchor xml:id="dbdoclet.50438215_pgfId-1297151" xreflabel=""/>
552 <anchor xml:id="dbdoclet.50438215_pgfId-1297152" xreflabel=""/>struct if_quotactl {
553 <anchor xml:id="dbdoclet.50438215_pgfId-1297153" xreflabel=""/> __u32 qc_cmd;
554 <anchor xml:id="dbdoclet.50438215_pgfId-1297154" xreflabel=""/> __u32 qc_type;
555 <anchor xml:id="dbdoclet.50438215_pgfId-1297155" xreflabel=""/> __u32 qc_id;
556 <anchor xml:id="dbdoclet.50438215_pgfId-1297156" xreflabel=""/> __u32 qc_stat;
557 <anchor xml:id="dbdoclet.50438215_pgfId-1297157" xreflabel=""/> struct obd_dqinfo qc_dqinfo;
558 <anchor xml:id="dbdoclet.50438215_pgfId-1297158" xreflabel=""/> struct obd_dqblk qc_dqblk;
559 <anchor xml:id="dbdoclet.50438215_pgfId-1297159" xreflabel=""/> char obd_type[16];
560 <anchor xml:id="dbdoclet.50438215_pgfId-1297160" xreflabel=""/> struct obd_uuid obd_uuid;
561 <anchor xml:id="dbdoclet.50438215_pgfId-1297161" xreflabel=""/>};
562 <anchor xml:id="dbdoclet.50438215_pgfId-1297162" xreflabel=""/>struct obd_dqblk {
563 <anchor xml:id="dbdoclet.50438215_pgfId-1297163" xreflabel=""/> __u64 dqb_bhardlimit;
564 <anchor xml:id="dbdoclet.50438215_pgfId-1297164" xreflabel=""/> __u64 dqb_bsoftlimit;
565 <anchor xml:id="dbdoclet.50438215_pgfId-1297165" xreflabel=""/> __u64 dqb_curspace;
566 <anchor xml:id="dbdoclet.50438215_pgfId-1297166" xreflabel=""/> __u64 dqb_ihardlimit;
567 <anchor xml:id="dbdoclet.50438215_pgfId-1297167" xreflabel=""/> __u64 dqb_isoftlimit;
568 <anchor xml:id="dbdoclet.50438215_pgfId-1297168" xreflabel=""/> __u64 dqb_curinodes;
569 <anchor xml:id="dbdoclet.50438215_pgfId-1297169" xreflabel=""/> __u64 dqb_btime;
570 <anchor xml:id="dbdoclet.50438215_pgfId-1297170" xreflabel=""/> __u64 dqb_itime;
571 <anchor xml:id="dbdoclet.50438215_pgfId-1297171" xreflabel=""/> __u32 dqb_valid;
572 <anchor xml:id="dbdoclet.50438215_pgfId-1297172" xreflabel=""/> __u32 padding;
573 <anchor xml:id="dbdoclet.50438215_pgfId-1297173" xreflabel=""/>};
574 <anchor xml:id="dbdoclet.50438215_pgfId-1297174" xreflabel=""/>struct obd_dqinfo {
575 <anchor xml:id="dbdoclet.50438215_pgfId-1297175" xreflabel=""/> __u64 dqi_bgrace;
576 <anchor xml:id="dbdoclet.50438215_pgfId-1297176" xreflabel=""/> __u64 dqi_igrace;
577 <anchor xml:id="dbdoclet.50438215_pgfId-1297177" xreflabel=""/> __u32 dqi_flags;
578 <anchor xml:id="dbdoclet.50438215_pgfId-1297178" xreflabel=""/> __u32 dqi_valid;
579 <anchor xml:id="dbdoclet.50438215_pgfId-1297179" xreflabel=""/>};
580 <anchor xml:id="dbdoclet.50438215_pgfId-1297180" xreflabel=""/>struct obd_uuid {
581 <anchor xml:id="dbdoclet.50438215_pgfId-1297181" xreflabel=""/> char uuid[40];
582 <anchor xml:id="dbdoclet.50438215_pgfId-1297182" xreflabel=""/>};
586 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297183" xreflabel=""/>Description</title>
587 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297184" xreflabel=""/>The llapi_quotactl() command manipulates disk quotas on a Lustre file system mount. qc_cmd indicates a command to be applied to UID qc_id or GID qc_id.</para>
588 <informaltable frame="all">
590 <colspec colname="c1" colwidth="50*"/>
591 <colspec colname="c2" colwidth="50*"/>
594 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1297187" xreflabel=""/>Option</emphasis></para></entry>
595 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1297189" xreflabel=""/>Description</emphasis></para></entry>
600 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297191" xreflabel=""/><emphasis role="bold">LUSTRE_Q_QUOTAON</emphasis></para></entry>
601 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297193" xreflabel=""/>Turns on quotas for a Lustre file system. <emphasis>qc_type</emphasis> is USRQUOTA, GRPQUOTA or UGQUOTA (both user and group quota). The quota files must exist. They are normally created with the llapi_quotacheck call. This call is restricted to the super user privilege.</para></entry>
604 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297195" xreflabel=""/><emphasis role="bold">LUSTRE_Q_QUOTAOFF</emphasis></para></entry>
605 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297197" xreflabel=""/>Turns off quotas for a Lustre file system. <emphasis>qc_type</emphasis> is USRQUOTA, GRPQUOTA or UGQUOTA (both user and group quota). This call is restricted to the super user privilege.</para></entry>
608 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297199" xreflabel=""/><emphasis role="bold">LUSTRE_Q_GETQUOTA</emphasis></para></entry>
609 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297201" xreflabel=""/>Gets disk quota limits and current usage for user or group <emphasis>qc_id</emphasis>. <emphasis>qc_type</emphasis> is USRQUOTA or GRPQUOTA. <emphasis>uuid</emphasis> may be filled with OBD UUID 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></entry>
612 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297203" xreflabel=""/><emphasis role="bold">LUSTRE_Q_SETQUOTA</emphasis></para></entry>
613 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297205" xreflabel=""/>Sets disk quota limits for user or group <emphasis>qc_id</emphasis>. <emphasis>qc_type</emphasis> is USRQUOTA or GRPQUOTA. <emphasis>dqb_valid</emphasis> must be set to QIF_ILIMITS, QIF_BLIMITS or QIF_LIMITS (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></entry>
616 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297207" xreflabel=""/><emphasis role="bold">LUSTRE_Q_GETINFO</emphasis></para></entry>
617 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297209" xreflabel=""/>Gets information about quotas. <emphasis>qc_type</emphasis> is either USRQUOTA or GRPQUOTA. On return, <emphasis>dqi_igrace</emphasis> is inode grace time (in seconds), <emphasis>dqi_bgrace</emphasis> is block grace time (in seconds), <emphasis>dqi_flags</emphasis> is not used by the current Lustre version.</para></entry>
620 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297211" xreflabel=""/><emphasis role="bold">LUSTRE_Q_SETINFO</emphasis></para></entry>
621 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297213" xreflabel=""/>Sets quota information (like grace times). <emphasis>qc_type</emphasis> is either USRQUOTA or GRPQUOTA. <emphasis>dqi_igrace</emphasis> is inode grace time (in seconds), <emphasis>dqi_bgrace</emphasis> is block grace time (in seconds), <emphasis>dqi_flags</emphasis> is not used by the current Lustre version and must be zeroed.</para></entry>
628 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297216" xreflabel=""/>Return Values</title>
629 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298911" xreflabel=""/>llapi_quotactl() returns:</para>
630 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298922" xreflabel=""/><emphasis role="bold">0</emphasis> On success</para>
631 <para><anchor xml:id="dbdoclet.50438215_pgfId-1298923" xreflabel=""/><emphasis role="bold">-1</emphasis> On failure and sets error number (errno) to indicate the error</para>
634 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297220" xreflabel=""/>Errors</title>
635 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297258" xreflabel=""/>llapi_quotactl errors are described below.</para>
636 <informaltable frame="all">
638 <colspec colname="c1" colwidth="50*"/>
639 <colspec colname="c2" colwidth="50*"/>
642 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1297223" xreflabel=""/>Errors</emphasis></para></entry>
643 <entry><para><emphasis role="bold"><anchor xml:id="dbdoclet.50438215_pgfId-1297225" xreflabel=""/>Description</emphasis></para></entry>
648 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297227" xreflabel=""/><emphasis role="bold">EFAULT</emphasis></para></entry>
649 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298931" xreflabel=""/><emphasis>qctl</emphasis> is invalid.</para></entry>
652 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297231" xreflabel=""/><emphasis role="bold">ENOSYS</emphasis></para></entry>
653 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298933" xreflabel=""/>Kernel or Lustre modules have not been compiled with the QUOTA option.</para></entry>
656 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297235" xreflabel=""/><emphasis role="bold">ENOMEM</emphasis></para></entry>
657 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298935" xreflabel=""/>Insufficient memory to complete operation.</para></entry>
660 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297239" xreflabel=""/><emphasis role="bold">ENOTTY</emphasis></para></entry>
661 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298937" xreflabel=""/><emphasis>qc_cmd</emphasis> is invalid.</para></entry>
664 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297243" xreflabel=""/><emphasis role="bold">EBUSY</emphasis></para></entry>
665 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298939" xreflabel=""/> Cannot process during quotacheck.</para></entry>
668 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297247" xreflabel=""/><emphasis role="bold">ENOENT</emphasis></para></entry>
669 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298941" xreflabel=""/><emphasis>uuid</emphasis> does not correspond to OBD or <emphasis>mnt</emphasis> does not exist.</para></entry>
672 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297251" xreflabel=""/><emphasis role="bold">EPERM</emphasis></para></entry>
673 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298943" xreflabel=""/> The call is privileged and the caller is not the super user.</para></entry>
676 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1297255" xreflabel=""/><emphasis role="bold">ESRCH</emphasis></para></entry>
677 <entry><para> <anchor xml:id="dbdoclet.50438215_pgfId-1298945" xreflabel=""/> No disk quota is found for the indicated user. Quotas have not been turned on for this file system.</para></entry>
685 <title>34.5 <anchor xml:id="dbdoclet.50438215_15718" xreflabel=""/>llapi_path2fid</title>
686 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297262" xreflabel=""/>Use llapi_path2fid to get the FID from the pathname.</para>
688 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297263" xreflabel=""/>Synopsis</title>
689 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297264" xreflabel=""/>#include <lustre/liblustreapi.h>
690 <anchor xml:id="dbdoclet.50438215_pgfId-1297265" xreflabel=""/>#include <lustre/lustre_user.h>
691 <anchor xml:id="dbdoclet.50438215_pgfId-1297266" xreflabel=""/>
692 <anchor xml:id="dbdoclet.50438215_pgfId-1297267" xreflabel=""/>int llapi_path2fid(const char *path, unsigned long long *seq, unsigned long\
693 *oid, unsigned long *ver)
697 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297268" xreflabel=""/>Description</title>
698 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297269" xreflabel=""/>The llapi_path2fid function returns the FID (sequence : object ID : version) for the pathname.</para>
701 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297270" xreflabel=""/>Return Values</title>
702 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297271" xreflabel=""/>llapi_path2fid returns:</para>
703 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297272" xreflabel=""/><emphasis role="bold">0</emphasis> On success</para>
704 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297273" xreflabel=""/>non-zero value On failure</para>
708 <title>34.6 Example <anchor xml:id="dbdoclet.50438215_marker-1297700" xreflabel=""/>Using the llapi Library</title>
709 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297702" xreflabel=""/>Use llapi_file_create to set Lustre properties for a new file. For a synopsis and description of llapi_file_create and examples of how to use it, see <link xl:href="ConfigurationFilesModuleParameters.html#50438293_72504">Chapter 35</link>: <link xl:href="ConfigurationFilesModuleParameters.html#50438293_66186">Configuration Files and Module Parameters</link>.</para>
710 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297709" xreflabel=""/>You can set striping from inside programs like ioctl. To compile the sample program, you need to download libtest.c and liblustreapi.c files from the Lustre source tree.</para>
711 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297710" xreflabel=""/><emphasis role="bold">A simple C program to demonstrate striping API - libtest.c</emphasis></para>
712 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297711" xreflabel=""/>/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
713 <anchor xml:id="dbdoclet.50438215_pgfId-1297712" xreflabel=""/> * vim:expandtab:shiftwidth=8:tabstop=8:
714 <anchor xml:id="dbdoclet.50438215_pgfId-1297713" xreflabel=""/> *
715 <anchor xml:id="dbdoclet.50438215_pgfId-1297714" xreflabel=""/> * lustredemo - simple code examples of liblustreapi functions
716 <anchor xml:id="dbdoclet.50438215_pgfId-1297715" xreflabel=""/> */
717 <anchor xml:id="dbdoclet.50438215_pgfId-1297716" xreflabel=""/>
718 <anchor xml:id="dbdoclet.50438215_pgfId-1297717" xreflabel=""/>#include <stdio.h>
719 <anchor xml:id="dbdoclet.50438215_pgfId-1297718" xreflabel=""/>#include <fcntl.h>
720 <anchor xml:id="dbdoclet.50438215_pgfId-1297719" xreflabel=""/>#include <sys/stat.h>
721 <anchor xml:id="dbdoclet.50438215_pgfId-1297720" xreflabel=""/>#include <sys/types.h>
722 <anchor xml:id="dbdoclet.50438215_pgfId-1297721" xreflabel=""/>#include <dirent.h>
723 <anchor xml:id="dbdoclet.50438215_pgfId-1297722" xreflabel=""/>#include <errno.h>
724 <anchor xml:id="dbdoclet.50438215_pgfId-1297723" xreflabel=""/>#include <string.h>
725 <anchor xml:id="dbdoclet.50438215_pgfId-1297724" xreflabel=""/>#include <unistd.h>
726 <anchor xml:id="dbdoclet.50438215_pgfId-1297725" xreflabel=""/>#include <stdlib.h>
727 <anchor xml:id="dbdoclet.50438215_pgfId-1297726" xreflabel=""/>#include <lustre/liblustreapi.h>
728 <anchor xml:id="dbdoclet.50438215_pgfId-1297727" xreflabel=""/>#include <lustre/lustre_user.h>
729 <anchor xml:id="dbdoclet.50438215_pgfId-1297728" xreflabel=""/>#define MAX_OSTS 1024
730 <anchor xml:id="dbdoclet.50438215_pgfId-1297729" xreflabel=""/>#define LOV_EA_SIZE(lum, num) (sizeof(*lum) + num * sizeof(*lum->lmm_objects\
732 <anchor xml:id="dbdoclet.50438215_pgfId-1297730" xreflabel=""/>#define LOV_EA_MAX(lum) LOV_EA_SIZE(lum, MAX_OSTS)
733 <anchor xml:id="dbdoclet.50438215_pgfId-1297731" xreflabel=""/>
734 <anchor xml:id="dbdoclet.50438215_pgfId-1297732" xreflabel=""/>/*
735 <anchor xml:id="dbdoclet.50438215_pgfId-1297733" xreflabel=""/>This program provides crude examples of using the liblustre API functions
736 <anchor xml:id="dbdoclet.50438215_pgfId-1297734" xreflabel=""/>*/
737 <anchor xml:id="dbdoclet.50438215_pgfId-1297735" xreflabel=""/>
738 <anchor xml:id="dbdoclet.50438215_pgfId-1297736" xreflabel=""/>/* Change these definitions to suit */
739 <anchor xml:id="dbdoclet.50438215_pgfId-1297737" xreflabel=""/>
740 <anchor xml:id="dbdoclet.50438215_pgfId-1297738" xreflabel=""/>#define TESTDIR "/tmp" /* R\
742 <anchor xml:id="dbdoclet.50438215_pgfId-1297739" xreflabel=""/>#define TESTFILE "lustre_dummy" \
743 /* Name for the file we create/destroy */
744 <anchor xml:id="dbdoclet.50438215_pgfId-1297740" xreflabel=""/>#define FILESIZE 262144 \
745 /* Size of the file in words */
746 <anchor xml:id="dbdoclet.50438215_pgfId-1297741" xreflabel=""/>#define DUMWORD "DEADBEEF" \
747 /* Dummy word used to fill files */
748 <anchor xml:id="dbdoclet.50438215_pgfId-1297742" xreflabel=""/>#define MY_STRIPE_WIDTH 2 \
749 /* Set this to the number of OST required */
750 <anchor xml:id="dbdoclet.50438215_pgfId-1297743" xreflabel=""/>#define MY_LUSTRE_DIR "/mnt/lustre/ftest"
751 <anchor xml:id="dbdoclet.50438215_pgfId-1297744" xreflabel=""/>
752 <anchor xml:id="dbdoclet.50438215_pgfId-1297745" xreflabel=""/>
753 <anchor xml:id="dbdoclet.50438215_pgfId-1297746" xreflabel=""/>int close_file(int fd)
754 <anchor xml:id="dbdoclet.50438215_pgfId-1297747" xreflabel=""/>{
755 <anchor xml:id="dbdoclet.50438215_pgfId-1297748" xreflabel=""/> if (close(fd) < 0) {
756 <anchor xml:id="dbdoclet.50438215_pgfId-1297749" xreflabel=""/> fprintf(stderr, "File close failed: %d (%s)\n", errno, strerror(er\
758 <anchor xml:id="dbdoclet.50438215_pgfId-1297750" xreflabel=""/> return -1;
759 <anchor xml:id="dbdoclet.50438215_pgfId-1297751" xreflabel=""/> }
760 <anchor xml:id="dbdoclet.50438215_pgfId-1297752" xreflabel=""/> return 0;
761 <anchor xml:id="dbdoclet.50438215_pgfId-1297753" xreflabel=""/>}
762 <anchor xml:id="dbdoclet.50438215_pgfId-1297754" xreflabel=""/>
763 <anchor xml:id="dbdoclet.50438215_pgfId-1297755" xreflabel=""/>int write_file(int fd)
764 <anchor xml:id="dbdoclet.50438215_pgfId-1297756" xreflabel=""/>{
765 <anchor xml:id="dbdoclet.50438215_pgfId-1297757" xreflabel=""/> char *stng = DUMWORD;
766 <anchor xml:id="dbdoclet.50438215_pgfId-1297758" xreflabel=""/> int cnt = 0;
767 <anchor xml:id="dbdoclet.50438215_pgfId-1297759" xreflabel=""/>
768 <anchor xml:id="dbdoclet.50438215_pgfId-1297760" xreflabel=""/> for( cnt = 0; cnt < FILESIZE; cnt++) {
769 <anchor xml:id="dbdoclet.50438215_pgfId-1297761" xreflabel=""/> write(fd, stng, sizeof(stng));
770 <anchor xml:id="dbdoclet.50438215_pgfId-1297762" xreflabel=""/> }
771 <anchor xml:id="dbdoclet.50438215_pgfId-1297763" xreflabel=""/> return 0;
772 <anchor xml:id="dbdoclet.50438215_pgfId-1297764" xreflabel=""/>}
773 <anchor xml:id="dbdoclet.50438215_pgfId-1297765" xreflabel=""/>/* Open a file, set a specific stripe count, size and starting OST
774 <anchor xml:id="dbdoclet.50438215_pgfId-1297766" xreflabel=""/> Adjust the parameters to suit */
775 <anchor xml:id="dbdoclet.50438215_pgfId-1297767" xreflabel=""/>
776 <anchor xml:id="dbdoclet.50438215_pgfId-1297768" xreflabel=""/>int open_stripe_file()
777 <anchor xml:id="dbdoclet.50438215_pgfId-1297769" xreflabel=""/>{
778 <anchor xml:id="dbdoclet.50438215_pgfId-1297770" xreflabel=""/> char *tfile = TESTFILE;
779 <anchor xml:id="dbdoclet.50438215_pgfId-1297771" xreflabel=""/> int stripe_size = 65536; \
780 /* System default is 4M */
781 <anchor xml:id="dbdoclet.50438215_pgfId-1297772" xreflabel=""/> int stripe_offset = -1; \
782 /* Start at default */
783 <anchor xml:id="dbdoclet.50438215_pgfId-1297773" xreflabel=""/> int stripe_count = MY_STRIPE_WIDTH; \
784 /*Single stripe for this demo*/
785 <anchor xml:id="dbdoclet.50438215_pgfId-1297774" xreflabel=""/> int stripe_pattern = 0; \
786 /* only RAID 0 at this time */
787 <anchor xml:id="dbdoclet.50438215_pgfId-1297775" xreflabel=""/> int rc, fd;
788 <anchor xml:id="dbdoclet.50438215_pgfId-1297776" xreflabel=""/> /*
789 <anchor xml:id="dbdoclet.50438215_pgfId-1297777" xreflabel=""/> */
790 <anchor xml:id="dbdoclet.50438215_pgfId-1297778" xreflabel=""/> rc = llapi_file_create(tfile,
791 <anchor xml:id="dbdoclet.50438215_pgfId-1297779" xreflabel=""/>stripe_size,stripe_offset,stripe_count,stripe_pattern);
792 <anchor xml:id="dbdoclet.50438215_pgfId-1297780" xreflabel=""/> /* result code is inverted, we may return -EINVAL or an ioctl error.
793 <anchor xml:id="dbdoclet.50438215_pgfId-1297781" xreflabel=""/> We borrow an error message from sanity.c
794 <anchor xml:id="dbdoclet.50438215_pgfId-1297782" xreflabel=""/> */
795 <anchor xml:id="dbdoclet.50438215_pgfId-1297783" xreflabel=""/> if (rc) {
796 <anchor xml:id="dbdoclet.50438215_pgfId-1297784" xreflabel=""/> fprintf(stderr,"llapi_file_create failed: %d (%s) \n", rc, st\
798 <anchor xml:id="dbdoclet.50438215_pgfId-1297785" xreflabel=""/> return -1;
799 <anchor xml:id="dbdoclet.50438215_pgfId-1297786" xreflabel=""/> }
800 <anchor xml:id="dbdoclet.50438215_pgfId-1297787" xreflabel=""/> /* llapi_file_create closes the file descriptor, we must re-open */
801 <anchor xml:id="dbdoclet.50438215_pgfId-1297788" xreflabel=""/> fd = open(tfile, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644);
802 <anchor xml:id="dbdoclet.50438215_pgfId-1297789" xreflabel=""/> if (fd < 0) {
803 <anchor xml:id="dbdoclet.50438215_pgfId-1297790" xreflabel=""/> fprintf(stderr, "Can't open %s file: %d (%s)\n", tfile, errno\
805 <anchor xml:id="dbdoclet.50438215_pgfId-1297791" xreflabel=""/> return -1;
806 <anchor xml:id="dbdoclet.50438215_pgfId-1297792" xreflabel=""/> }
807 <anchor xml:id="dbdoclet.50438215_pgfId-1297793" xreflabel=""/> return fd;
808 <anchor xml:id="dbdoclet.50438215_pgfId-1297794" xreflabel=""/>}
809 <anchor xml:id="dbdoclet.50438215_pgfId-1297795" xreflabel=""/>
810 <anchor xml:id="dbdoclet.50438215_pgfId-1297796" xreflabel=""/>/* output a list of uuids for this file */
811 <anchor xml:id="dbdoclet.50438215_pgfId-1297797" xreflabel=""/>int get_my_uuids(int fd)
812 <anchor xml:id="dbdoclet.50438215_pgfId-1297798" xreflabel=""/>{
813 <anchor xml:id="dbdoclet.50438215_pgfId-1297799" xreflabel=""/> struct obd_uuid uuids[1024], *uuidp; \
815 <anchor xml:id="dbdoclet.50438215_pgfId-1297800" xreflabel=""/> int obdcount = 1024;
816 <anchor xml:id="dbdoclet.50438215_pgfId-1297801" xreflabel=""/> int rc,i;
817 <anchor xml:id="dbdoclet.50438215_pgfId-1297802" xreflabel=""/>
818 <anchor xml:id="dbdoclet.50438215_pgfId-1297803" xreflabel=""/> rc = llapi_lov_get_uuids(fd, uuids, &obdcount);
819 <anchor xml:id="dbdoclet.50438215_pgfId-1297804" xreflabel=""/> if (rc != 0) {
820 <anchor xml:id="dbdoclet.50438215_pgfId-1297805" xreflabel=""/> fprintf(stderr, "get uuids failed: %d (%s)\n",errno, strerror(errn\
822 <anchor xml:id="dbdoclet.50438215_pgfId-1297806" xreflabel=""/> }
823 <anchor xml:id="dbdoclet.50438215_pgfId-1297807" xreflabel=""/> printf("This file system has %d obds\n", obdcount);
824 <anchor xml:id="dbdoclet.50438215_pgfId-1297808" xreflabel=""/> for (i = 0, uuidp = uuids; i < obdcount; i++, uuidp++) {
825 <anchor xml:id="dbdoclet.50438215_pgfId-1297809" xreflabel=""/> printf("UUID %d is %s\n",i, uuidp->uuid);
826 <anchor xml:id="dbdoclet.50438215_pgfId-1297810" xreflabel=""/> }
827 <anchor xml:id="dbdoclet.50438215_pgfId-1297811" xreflabel=""/> return 0;
828 <anchor xml:id="dbdoclet.50438215_pgfId-1297812" xreflabel=""/>}
829 <anchor xml:id="dbdoclet.50438215_pgfId-1297813" xreflabel=""/>
830 <anchor xml:id="dbdoclet.50438215_pgfId-1297814" xreflabel=""/>/* Print out some LOV attributes. List our objects */
831 <anchor xml:id="dbdoclet.50438215_pgfId-1297815" xreflabel=""/>int get_file_info(char *path)
832 <anchor xml:id="dbdoclet.50438215_pgfId-1297816" xreflabel=""/>{
833 <anchor xml:id="dbdoclet.50438215_pgfId-1297817" xreflabel=""/>
834 <anchor xml:id="dbdoclet.50438215_pgfId-1297818" xreflabel=""/> struct lov_user_md *lump;
835 <anchor xml:id="dbdoclet.50438215_pgfId-1297819" xreflabel=""/> int rc;
836 <anchor xml:id="dbdoclet.50438215_pgfId-1297820" xreflabel=""/> int i;
837 <anchor xml:id="dbdoclet.50438215_pgfId-1297821" xreflabel=""/>
838 <anchor xml:id="dbdoclet.50438215_pgfId-1297822" xreflabel=""/> lump = malloc(LOV_EA_MAX(lump));
839 <anchor xml:id="dbdoclet.50438215_pgfId-1297823" xreflabel=""/> if (lump == NULL) {
840 <anchor xml:id="dbdoclet.50438215_pgfId-1297824" xreflabel=""/> return -1;
841 <anchor xml:id="dbdoclet.50438215_pgfId-1297825" xreflabel=""/> }
842 <anchor xml:id="dbdoclet.50438215_pgfId-1297826" xreflabel=""/>
843 <anchor xml:id="dbdoclet.50438215_pgfId-1297827" xreflabel=""/> rc = llapi_file_get_stripe(path, lump);
844 <anchor xml:id="dbdoclet.50438215_pgfId-1297828" xreflabel=""/>
845 <anchor xml:id="dbdoclet.50438215_pgfId-1297829" xreflabel=""/> if (rc != 0) {
846 <anchor xml:id="dbdoclet.50438215_pgfId-1297830" xreflabel=""/> fprintf(stderr, "get_stripe failed: %d (%s)\n",errno, strerror(err\
848 <anchor xml:id="dbdoclet.50438215_pgfId-1297831" xreflabel=""/> return -1;
849 <anchor xml:id="dbdoclet.50438215_pgfId-1297832" xreflabel=""/> }
850 <anchor xml:id="dbdoclet.50438215_pgfId-1297833" xreflabel=""/>
851 <anchor xml:id="dbdoclet.50438215_pgfId-1297834" xreflabel=""/> printf("Lov magic %u\n", lump->lmm_magic);
852 <anchor xml:id="dbdoclet.50438215_pgfId-1297835" xreflabel=""/> printf("Lov pattern %u\n", lump->lmm_pattern);
853 <anchor xml:id="dbdoclet.50438215_pgfId-1297836" xreflabel=""/> printf("Lov object id %llu\n", lump->lmm_object_id);
854 <anchor xml:id="dbdoclet.50438215_pgfId-1297837" xreflabel=""/> printf("Lov object group %llu\n", lump->lmm_object_gr);
855 <anchor xml:id="dbdoclet.50438215_pgfId-1297838" xreflabel=""/> printf("Lov stripe size %u\n", lump->lmm_stripe_size);
856 <anchor xml:id="dbdoclet.50438215_pgfId-1297839" xreflabel=""/> printf("Lov stripe count %hu\n", lump->lmm_stripe_count);
857 <anchor xml:id="dbdoclet.50438215_pgfId-1297840" xreflabel=""/> printf("Lov stripe offset %u\n", lump->lmm_stripe_offset);
858 <anchor xml:id="dbdoclet.50438215_pgfId-1297841" xreflabel=""/> for (i = 0; i < lump->lmm_stripe_count; i++) {
859 <anchor xml:id="dbdoclet.50438215_pgfId-1297842" xreflabel=""/> printf("Object index %d Objid %llu\n", lump->lmm_objects[i].l_ost_i\
860 dx, lump->lmm_objects[i].l_object_id);
861 <anchor xml:id="dbdoclet.50438215_pgfId-1297843" xreflabel=""/> }
862 <anchor xml:id="dbdoclet.50438215_pgfId-1297844" xreflabel=""/>
863 <anchor xml:id="dbdoclet.50438215_pgfId-1297845" xreflabel=""/>
864 <anchor xml:id="dbdoclet.50438215_pgfId-1297846" xreflabel=""/> free(lump);
865 <anchor xml:id="dbdoclet.50438215_pgfId-1297847" xreflabel=""/> return rc;
866 <anchor xml:id="dbdoclet.50438215_pgfId-1297848" xreflabel=""/>
867 <anchor xml:id="dbdoclet.50438215_pgfId-1297849" xreflabel=""/>}
868 <anchor xml:id="dbdoclet.50438215_pgfId-1297850" xreflabel=""/>/* Ping all OSTs that belong to this filesysem */
869 <anchor xml:id="dbdoclet.50438215_pgfId-1297851" xreflabel=""/>
870 <anchor xml:id="dbdoclet.50438215_pgfId-1297852" xreflabel=""/>int ping_osts()
871 <anchor xml:id="dbdoclet.50438215_pgfId-1297853" xreflabel=""/>{
872 <anchor xml:id="dbdoclet.50438215_pgfId-1297854" xreflabel=""/> DIR *dir;
873 <anchor xml:id="dbdoclet.50438215_pgfId-1297855" xreflabel=""/> struct dirent *d;
874 <anchor xml:id="dbdoclet.50438215_pgfId-1297856" xreflabel=""/> char osc_dir[100];
875 <anchor xml:id="dbdoclet.50438215_pgfId-1297857" xreflabel=""/> int rc;
876 <anchor xml:id="dbdoclet.50438215_pgfId-1297858" xreflabel=""/>
877 <anchor xml:id="dbdoclet.50438215_pgfId-1297859" xreflabel=""/> sprintf(osc_dir, "/proc/fs/lustre/osc");
878 <anchor xml:id="dbdoclet.50438215_pgfId-1297860" xreflabel=""/> dir = opendir(osc_dir);
879 <anchor xml:id="dbdoclet.50438215_pgfId-1297861" xreflabel=""/> if (dir == NULL) {
880 <anchor xml:id="dbdoclet.50438215_pgfId-1297862" xreflabel=""/> printf("Can't open dir\n");
881 <anchor xml:id="dbdoclet.50438215_pgfId-1297863" xreflabel=""/> return -1;
882 <anchor xml:id="dbdoclet.50438215_pgfId-1297864" xreflabel=""/> }
883 <anchor xml:id="dbdoclet.50438215_pgfId-1297865" xreflabel=""/> while((d = readdir(dir)) != NULL) {
884 <anchor xml:id="dbdoclet.50438215_pgfId-1297866" xreflabel=""/> if ( d->d_type == DT_DIR ) {
885 <anchor xml:id="dbdoclet.50438215_pgfId-1297867" xreflabel=""/> if (! strncmp(d->d_name, "OSC", 3)) {
886 <anchor xml:id="dbdoclet.50438215_pgfId-1297868" xreflabel=""/> printf("Pinging OSC %s ", d->d_name);
887 <anchor xml:id="dbdoclet.50438215_pgfId-1297869" xreflabel=""/> rc = llapi_ping("osc", d->d_name);
888 <anchor xml:id="dbdoclet.50438215_pgfId-1297870" xreflabel=""/> if (rc) {
889 <anchor xml:id="dbdoclet.50438215_pgfId-1297871" xreflabel=""/> printf(" bad\n");
890 <anchor xml:id="dbdoclet.50438215_pgfId-1297872" xreflabel=""/> } else {
891 <anchor xml:id="dbdoclet.50438215_pgfId-1297873" xreflabel=""/> printf(" good\n");
892 <anchor xml:id="dbdoclet.50438215_pgfId-1297874" xreflabel=""/> }
893 <anchor xml:id="dbdoclet.50438215_pgfId-1297875" xreflabel=""/> }
894 <anchor xml:id="dbdoclet.50438215_pgfId-1297876" xreflabel=""/> }
895 <anchor xml:id="dbdoclet.50438215_pgfId-1297877" xreflabel=""/> }
896 <anchor xml:id="dbdoclet.50438215_pgfId-1297878" xreflabel=""/> return 0;
897 <anchor xml:id="dbdoclet.50438215_pgfId-1297879" xreflabel=""/>
898 <anchor xml:id="dbdoclet.50438215_pgfId-1297880" xreflabel=""/>}
899 <anchor xml:id="dbdoclet.50438215_pgfId-1297881" xreflabel=""/>
900 <anchor xml:id="dbdoclet.50438215_pgfId-1297882" xreflabel=""/>int main()
901 <anchor xml:id="dbdoclet.50438215_pgfId-1297883" xreflabel=""/>{
902 <anchor xml:id="dbdoclet.50438215_pgfId-1297884" xreflabel=""/> int file;
903 <anchor xml:id="dbdoclet.50438215_pgfId-1297885" xreflabel=""/> int rc;
904 <anchor xml:id="dbdoclet.50438215_pgfId-1297886" xreflabel=""/> char filename[100];
905 <anchor xml:id="dbdoclet.50438215_pgfId-1297887" xreflabel=""/> char sys_cmd[100];
906 <anchor xml:id="dbdoclet.50438215_pgfId-1297888" xreflabel=""/>
907 <anchor xml:id="dbdoclet.50438215_pgfId-1297889" xreflabel=""/> sprintf(filename, "%s/%s",MY_LUSTRE_DIR, TESTFILE);
908 <anchor xml:id="dbdoclet.50438215_pgfId-1297890" xreflabel=""/>
909 <anchor xml:id="dbdoclet.50438215_pgfId-1297891" xreflabel=""/> printf("Open a file with striping\n");
910 <anchor xml:id="dbdoclet.50438215_pgfId-1297892" xreflabel=""/> file = open_stripe_file();
911 <anchor xml:id="dbdoclet.50438215_pgfId-1297893" xreflabel=""/> if ( file < 0 ) {
912 <anchor xml:id="dbdoclet.50438215_pgfId-1297894" xreflabel=""/> printf("Exiting\n");
913 <anchor xml:id="dbdoclet.50438215_pgfId-1297895" xreflabel=""/> exit(1);
914 <anchor xml:id="dbdoclet.50438215_pgfId-1297896" xreflabel=""/>
915 <anchor xml:id="dbdoclet.50438215_pgfId-1297897" xreflabel=""/>
916 <anchor xml:id="dbdoclet.50438215_pgfId-1297898" xreflabel=""/>
917 <anchor xml:id="dbdoclet.50438215_pgfId-1297899" xreflabel=""/>
918 <anchor xml:id="dbdoclet.50438215_pgfId-1297900" xreflabel=""/> }
919 <anchor xml:id="dbdoclet.50438215_pgfId-1297901" xreflabel=""/> printf("Getting uuid list\n");
920 <anchor xml:id="dbdoclet.50438215_pgfId-1297902" xreflabel=""/> rc = get_my_uuids(file);
921 <anchor xml:id="dbdoclet.50438215_pgfId-1297903" xreflabel=""/> rintf("Write to the file\n");
922 <anchor xml:id="dbdoclet.50438215_pgfId-1297904" xreflabel=""/> rc = write_file(file);
923 <anchor xml:id="dbdoclet.50438215_pgfId-1297905" xreflabel=""/> rc = close_file(file);
924 <anchor xml:id="dbdoclet.50438215_pgfId-1297906" xreflabel=""/> printf("Listing LOV data\n");
925 <anchor xml:id="dbdoclet.50438215_pgfId-1297907" xreflabel=""/> rc = get_file_info(filename);
926 <anchor xml:id="dbdoclet.50438215_pgfId-1297908" xreflabel=""/> printf("Ping our OSTs\n");
927 <anchor xml:id="dbdoclet.50438215_pgfId-1297909" xreflabel=""/> rc = ping_osts();
928 <anchor xml:id="dbdoclet.50438215_pgfId-1297910" xreflabel=""/>
929 <anchor xml:id="dbdoclet.50438215_pgfId-1297911" xreflabel=""/> /* the results should match lfs getstripe */
930 <anchor xml:id="dbdoclet.50438215_pgfId-1297912" xreflabel=""/> printf("Confirming our results with lfs getsrtipe\n");
931 <anchor xml:id="dbdoclet.50438215_pgfId-1297913" xreflabel=""/> sprintf(sys_cmd, "/usr/bin/lfs getstripe %s/%s", MY_LUSTRE_DIR, TESTFILE);
932 <anchor xml:id="dbdoclet.50438215_pgfId-1297914" xreflabel=""/> system(sys_cmd);
933 <anchor xml:id="dbdoclet.50438215_pgfId-1297915" xreflabel=""/>
934 <anchor xml:id="dbdoclet.50438215_pgfId-1297916" xreflabel=""/> printf("All done\n");
935 <anchor xml:id="dbdoclet.50438215_pgfId-1297917" xreflabel=""/> exit(rc);
936 <anchor xml:id="dbdoclet.50438215_pgfId-1297918" xreflabel=""/>}
938 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297919" xreflabel=""/><emphasis role="bold">Makefile for sample application:</emphasis></para>
939 <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297920" xreflabel=""/>
940 <anchor xml:id="dbdoclet.50438215_pgfId-1297921" xreflabel=""/>gcc -g -O2 -Wall -o lustredemo libtest.c -llustreapi
941 <anchor xml:id="dbdoclet.50438215_pgfId-1297922" xreflabel=""/>clean:
942 <anchor xml:id="dbdoclet.50438215_pgfId-1297923" xreflabel=""/>rm -f core lustredemo *.o
943 <anchor xml:id="dbdoclet.50438215_pgfId-1297924" xreflabel=""/>run:
944 <anchor xml:id="dbdoclet.50438215_pgfId-1297925" xreflabel=""/>make
945 <anchor xml:id="dbdoclet.50438215_pgfId-1297926" xreflabel=""/>rm -f /mnt/lustre/ftest/lustredemo
946 <anchor xml:id="dbdoclet.50438215_pgfId-1297927" xreflabel=""/>rm -f /mnt/lustre/ftest/lustre_dummy
947 <anchor xml:id="dbdoclet.50438215_pgfId-1297928" xreflabel=""/>cp lustredemo /mnt/lustre/ftest/
950 <title><anchor xml:id="dbdoclet.50438215_pgfId-1297929" xreflabel=""/>See Also</title>
951 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297942" xreflabel=""/><link xl:href="SettingLustreProperties_HTML.html#50438215_30970">llapi_file_create</link>, <link xl:href="SettingLustreProperties_HTML.html#50438215_50149">llapi_file_get_stripe</link>, <link xl:href="SettingLustreProperties_HTML.html#50438215_86607">llapi_file_open</link>, <link xl:href="SettingLustreProperties_HTML.html#50438215_12433">llapi_quotactl</link></para>
952 <para><anchor xml:id="dbdoclet.50438215_pgfId-1297943" xreflabel=""/> </para>
954 Begin SiteCatalyst code version: G.5.
957 End SiteCatalyst code version: G.5.
959 <informaltable frame="none">
961 <colspec colname="c1" colwidth="33*"/>
962 <colspec colname="c2" colwidth="33*"/>
963 <colspec colname="c3" colwidth="33*"/>
969 <entry align="left"><para>Lustre 2.0 Operations Manual</para></entry>
970 <entry align="right"><para>821-2076-10</para></entry>
971 <entry align="right" valign="top"><para><link xl:href="index.html"><inlinemediaobject><imageobject role="html">
972 <imagedata contentdepth="26" contentwidth="30" fileref="./shared/toc01.gif" scalefit="1"/>
974 <imageobject role="fo">
975 <imagedata contentdepth="100%" contentwidth="" depth="" fileref="./shared/toc01.gif" scalefit="1" width="100%"/>
977 </inlinemediaobject></link><link xl:href="LustreProgrammingInterfaces.html"><inlinemediaobject><imageobject role="html">
978 <imagedata contentdepth="26" contentwidth="30" fileref="./shared/prev01.gif" scalefit="1"/>
980 <imageobject role="fo">
981 <imagedata contentdepth="100%" contentwidth="" depth="" fileref="./shared/prev01.gif" scalefit="1" width="100%"/>
983 </inlinemediaobject></link><link xl:href="ConfigurationFilesModuleParameters.html"><inlinemediaobject><imageobject role="html">
984 <imagedata contentdepth="26" contentwidth="30" fileref="./shared/next01.gif" scalefit="1"/>
986 <imageobject role="fo">
987 <imagedata contentdepth="100%" contentwidth="" depth="" fileref="./shared/next01.gif" scalefit="1" width="100%"/>
989 </inlinemediaobject></link><link xl:href="ix.html"><inlinemediaobject><imageobject role="html">
990 <imagedata contentdepth="26" contentwidth="30" fileref="./shared/index01.gif" scalefit="1"/>
992 <imageobject role="fo">
993 <imagedata contentdepth="100%" contentwidth="" depth="" fileref="./shared/index01.gif" scalefit="1" width="100%"/>
995 </inlinemediaobject></link></para></entry>
1000 <para><link xl:href=""/></para>
1001 <para><link xl:href="copyright.html">Copyright</link> © 2011, Oracle and/or its affiliates. All rights reserved.</para>