<para>Use <literal>llapi_file_create</literal> to set Lustre properties for a new file.</para>
<section remap="h5">
<title>Synopsis</title>
- <screen>#include <lustre/liblustreapi.h>
-#include <lustre/lustre_user.h>
+ <screen>#include <lustre/lustreapi.h>
int llapi_file_create(char *name, long stripe_size, int stripe_offset, int stripe_count, int stripe_pattern);
</screen>
<para>Use <literal>llapi_file_get_stripe</literal> to get striping information for a file or directory on a Lustre file system.</para>
<section remap="h5">
<title>Synopsis</title>
- <screen>#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <liblustre.h>
-#include <lustre/lustre_idl.h>
-#include <lustre/liblustreapi.h>
-#include <lustre/lustre_user.h>
+ <screen>
+#include <lustre/lustreapi.h>
int llapi_file_get_stripe(const char *<emphasis>path</emphasis>, void *<emphasis>lum</emphasis>);</screen>
</section>
</section>
<section remap="h5">
<title>Examples</title>
- <screen>#include <sys/vfs.h>
-#include <liblustre.h>
-#include <lnet/lnetctl.h>
-#include <obd.h>
-#include <lustre_lib.h>
-#include <lustre/liblustreapi.h>
-#include <obd_lov.h>
+ <programlisting>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <lustre/lustreapi.h>
+
static inline int maxint(int a, int b)
{
-return a > b ? a : b;
+ return a > b ? a : b;
}
static void *alloc_lum()
{
-int v1, v3, join;
-v1 = sizeof(struct lov_user_md_v1) +
-LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1);
-v3 = sizeof(struct lov_user_md_v3) +
-LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1);
-return malloc(maxint(v1, v3));
+ int v1, v3, join;
+ v1 = sizeof(struct lov_user_md_v1) +
+ LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1);
+ v3 = sizeof(struct lov_user_md_v3) +
+ LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1);
+ return malloc(maxint(v1, v3));
}
int main(int argc, char** argv)
{
-struct lov_user_md *lum_file = NULL;
-int rc;
-int lum_size;
-if (argc != 2) {
-fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
-return 1;
-}
-lum_file = alloc_lum();
-if (lum_file == NULL) {
-rc = ENOMEM;
-goto cleanup;
-}
-rc = llapi_file_get_stripe(argv[1], lum_file);
-if (rc) {
-rc = errno;
-goto cleanup;
-}
-/* stripe_size stripe_count */
-printf("%d %d\n",
-lum_file->lmm_stripe_size,
-lum_file->lmm_stripe_count);
+ struct lov_user_md *lum_file = NULL;
+ int rc;
+ int lum_size;
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
+ return 1;
+ }
+ lum_file = alloc_lum();
+ if (lum_file == NULL) {
+ rc = ENOMEM;
+ goto cleanup;
+ }
+ rc = llapi_file_get_stripe(argv[1], lum_file);
+ if (rc) {
+ rc = errno;
+ goto cleanup;
+ }
+ /* stripe_size stripe_count */
+ printf("%d %d\n",
+ lum_file->lmm_stripe_size,
+ lum_file->lmm_stripe_count);
cleanup:
-if (lum_file != NULL)
-free(lum_file);
-return rc;
-}</screen>
+ if (lum_file != NULL)
+ free(lum_file);
+ return rc;
+}
+</programlisting>
</section>
</section>
<section xml:id="dbdoclet.50438215_86607">
<para>The <literal>llapi_file_open</literal> command opens (or creates) a file or device on a Lustre filesystem.</para>
<section remap="h5">
<title>Synopsis</title>
- <screen>#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <liblustre.h>
-#include <lustre/lustre_idl.h>
-#include <lustre/liblustreapi.h>
-#include <lustre/lustre_user.h>
+ <screen>#include <lustre/lustreapi.h>
int llapi_file_open(const char *<emphasis>name</emphasis>, int <emphasis>flags</emphasis>, int <emphasis>mode</emphasis>,
unsigned long long <emphasis>stripe_size</emphasis>, int <emphasis>stripe_offset</emphasis>,
int <emphasis>stripe_count</emphasis>, int <emphasis>stripe_pattern</emphasis>);
</section>
<section remap="h5">
<title>Example</title>
- <screen>#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
+ <programlisting>
#include <stdio.h>
-#include <liblustre.h>
-#include <lustre/lustre_idl.h>
-#include <lustre/liblustreapi.h>
-#include <lustre/lustre_user.h>
+#include <lustre/lustreapi.h>
+
int main(int argc, char *argv[])
{
- int rc;
- if (argc != 2)
- return -1;
- rc = llapi_file_create(argv[1], 1048576, 0, 2, LOV_PATTERN_RAID0);
- if (rc < 0) {
- fprintf(stderr, "file creation has failed, %s\n", strerror(-rc));
- return -1;
- }
- printf("%s with stripe size 1048576, striped across 2 OSTs,"
- " has been created!\n", argv[1]);
- return 0;
-}</screen>
+ int rc;
+ if (argc != 2)
+ return -1;
+ rc = llapi_file_create(argv[1], 1048576, 0, 2, LOV_PATTERN_RAID0);
+ if (rc < 0) {
+ fprintf(stderr, "file creation has failed, %s\n", strerror(-rc));
+ return -1;
+ }
+ printf("%s with stripe size 1048576, striped across 2 OSTs,"
+ " has been created!\n", argv[1]);
+ return 0;
+}
+</programlisting>
</section>
</section>
<section xml:id="dbdoclet.50438215_12433">
<para>Use <literal>llapi_quotact</literal>l to manipulate disk quotas on a Lustre file system.</para>
<section remap="h5">
<title>Synopsis</title>
- <screen>#include <liblustre.h>
-#include <lustre/lustre_idl.h>
-#include <lustre/liblustreapi.h>
-#include <lustre/lustre_user.h>
+ <screen>#include <lustre/lustreapi.h>
int llapi_quotactl(char" " *mnt," " struct if_quotactl" " *qctl)
struct if_quotactl {
<para>Use <literal>llapi_path2fid</literal> to get the FID from the pathname.</para>
<section remap="h5">
<title>Synopsis</title>
- <screen>#include <lustre/liblustreapi.h>
-#include <lustre/lustre_user.h>
+ <screen>#include <lustre/lustreapi.h>
int llapi_path2fid(const char *path, unsigned long long *seq, unsigned long *oid, unsigned long *ver)</screen>
</section>
<section xml:id="dbdoclet.50438215_marker-1297700">
<title>Example Using the <literal>llapi</literal> Library</title>
<para>Use <literal>llapi_file_create</literal> 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 <xref linkend="configurationfilesmoduleparameters"/>.</para>
- <para>You can set striping from inside programs like <literal>ioctl</literal>. To compile the sample program, you need to download libtest.c and liblustreapi.c files from the Lustre source tree.</para>
+ <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>
<para><emphasis role="bold">A simple C program to demonstrate striping API - libtest.c</emphasis></para>
- <screen>/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ <programlisting>
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
- * lustredemo - simple code examples of liblustreapi functions
+ * lustredemo - a simple example of lustreapi functions
*/
-
#include <stdio.h>
#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
-#include <string.h>
-#include <unistd.h>
#include <stdlib.h>
-#include <lustre/liblustreapi.h>
-#include <lustre/lustre_user.h>
+#include <lustre/lustreapi.h>
#define MAX_OSTS 1024
#define LOV_EA_SIZE(lum, num) (sizeof(*lum) + num * sizeof(*lum->lmm_objects))
#define LOV_EA_MAX(lum) LOV_EA_SIZE(lum, MAX_OSTS)
-
-
-
-
-/*
-This program provides crude examples of using the liblustre API functions
-*/
-
+/*
+ * This program provides crude examples of using the lustreapi API functions
+ */
/* Change these definitions to suit */
-
-
-
#define TESTDIR "/tmp" /* Results directory */
#define TESTFILE "lustre_dummy" /* Name for the file we create/destroy */
#define FILESIZE 262144 /* Size of the file in words */
#define DUMWORD "DEADBEEF" /* Dummy word used to fill files */
#define MY_STRIPE_WIDTH 2 /* Set this to the number of OST required */
#define MY_LUSTRE_DIR "/mnt/lustre/ftest"
-
-
+
int close_file(int fd)
-{
- if (close(fd) < 0) {
- fprintf(stderr, "File close failed: %d (%s)\n", errno, strerror(errno));
- return -1;
- }
- return 0;
+{
+ if (close(fd) < 0) {
+ fprintf(stderr, "File close failed: %d (%s)\n", errno, strerror(errno));
+ return -1;
+ }
+ return 0;
}
-
+
int write_file(int fd)
{
- char *stng = DUMWORD;
- int cnt = 0;
-
- for( cnt = 0; cnt < FILESIZE; cnt++) {
+ char *stng = DUMWORD;
+ int cnt = 0;
+
+ for( cnt = 0; cnt < FILESIZE; cnt++) {
write(fd, stng, sizeof(stng));
- }
- return 0;
+ }
+ return 0;
}
/* Open a file, set a specific stripe count, size and starting OST
- Adjust the parameters to suit */
-
+ * Adjust the parameters to suit */
int open_stripe_file()
{
- char *tfile = TESTFILE;
- int stripe_size = 65536; /* System default is 4M */
- int stripe_offset = -1; /* Start at default */
- int stripe_count = MY_STRIPE_WIDTH; /*Single stripe for this demo*/
- int stripe_pattern = 0; /* only RAID 0 at this time */
- int rc, fd;
- /*
- */
- rc = llapi_file_create(tfile,
-stripe_size,stripe_offset,stripe_count,stripe_pattern);
- /* result code is inverted, we may return -EINVAL or an ioctl error.
- We borrow an error message from sanity.c
- */
- if (rc) {
+ char *tfile = TESTFILE;
+ int stripe_size = 65536; /* System default is 4M */
+ int stripe_offset = -1; /* Start at default */
+ int stripe_count = MY_STRIPE_WIDTH; /*Single stripe for this demo*/
+ int stripe_pattern = 0; /* only RAID 0 at this time */
+ int rc, fd;
+
+ rc = llapi_file_create(tfile,
+ stripe_size,stripe_offset,stripe_count,stripe_pattern);
+ /* result code is inverted, we may return -EINVAL or an ioctl error.
+ * We borrow an error message from sanity.c
+ */
+ if (rc) {
fprintf(stderr,"llapi_file_create failed: %d (%s) \n", rc, strerror(-rc));
return -1;
}
/* llapi_file_create closes the file descriptor, we must re-open */
fd = open(tfile, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644);
if (fd < 0) {
- fprintf(stderr, "Can't open %s file: %d (%s)\n", tfile, errno, strerror(errno));
- return -1;
+ fprintf(stderr, "Can't open %s file: %d (%s)\n", tfile, errno, strerror(errno));
+ return -1;
}
return fd;
}
-
+
/* output a list of uuids for this file */
int get_my_uuids(int fd)
{
- struct obd_uuid uuids[1024], *uuidp; /* Output var */
- int obdcount = 1024;
- int rc,i;
-
- rc = llapi_lov_get_uuids(fd, uuids, &obdcount);
- if (rc != 0) {
- fprintf(stderr, "get uuids failed: %d (%s)\n",errno, strerror(errno));
+ struct obd_uuid uuids[1024], *uuidp; /* Output var */
+ int obdcount = 1024;
+ int rc,i;
+
+ rc = llapi_lov_get_uuids(fd, uuids, &obdcount);
+ if (rc != 0) {
+ fprintf(stderr, "get uuids failed: %d (%s)\n",errno, strerror(errno));
}
printf("This file system has %d obds\n", obdcount);
for (i = 0, uuidp = uuids; i < obdcount; i++, uuidp++) {
- printf("UUID %d is %s\n",i, uuidp->uuid);
+ printf("UUID %d is %s\n",i, uuidp->uuid);
}
return 0;
}
-
+
/* Print out some LOV attributes. List our objects */
int get_file_info(char *path)
{
-
- struct lov_user_md *lump;
- int rc;
- int i;
-
- lump = malloc(LOV_EA_MAX(lump));
- if (lump == NULL) {
- return -1;
+
+ struct lov_user_md *lump;
+ int rc;
+ int i;
+
+ lump = malloc(LOV_EA_MAX(lump));
+ if (lump == NULL) {
+ return -1;
}
-
+
rc = llapi_file_get_stripe(path, lump);
-
+
if (rc != 0) {
- fprintf(stderr, "get_stripe failed: %d (%s)\n",errno, strerror(errno));
- return -1;
+ fprintf(stderr, "get_stripe failed: %d (%s)\n",errno, strerror(errno));
+ return -1;
}
-
- printf("Lov magic %u\n", lump->lmm_magic);
- printf("Lov pattern %u\n", lump->lmm_pattern);
- printf("Lov object id %llu\n", lump->lmm_object_id);
- printf("Lov object group %llu\n", lump->lmm_object_gr);
- printf("Lov stripe size %u\n", lump->lmm_stripe_size);
- printf("Lov stripe count %hu\n", lump->lmm_stripe_count);
- printf("Lov stripe offset %u\n", lump->lmm_stripe_offset);
- for (i = 0; i < lump->lmm_stripe_count; i++) {
- printf("Object index %d Objid %llu\n", lump->lmm_objects[i].l_ost_idx, lump->lmm_objects[i].l_object_id);
+
+ printf("Lov magic %u\n", lump->lmm_magic);
+ printf("Lov pattern %u\n", lump->lmm_pattern);
+ printf("Lov object id %llu\n", lump->lmm_object_id);
+ printf("Lov stripe size %u\n", lump->lmm_stripe_size);
+ printf("Lov stripe count %hu\n", lump->lmm_stripe_count);
+ printf("Lov stripe offset %u\n", lump->lmm_stripe_offset);
+ for (i = 0; i < lump->lmm_stripe_count; i++) {
+ printf("Object index %d Objid %llu\n", lump->lmm_objects[i].l_ost_idx, lump->lmm_objects[i].l_object_id);
}
-
-
- free(lump);
- return rc;
-
+
+ free(lump);
+ return rc;
+
}
+
/* Ping all OSTs that belong to this filesystem */
-
int ping_osts()
{
- DIR *dir;
- struct dirent *d;
- char osc_dir[100];
- int rc;
-
- sprintf(osc_dir, "/proc/fs/lustre/osc");
- dir = opendir(osc_dir);
- if (dir == NULL) {
- printf("Can't open dir\n");
- return -1;
- }
- while((d = readdir(dir)) != NULL) {
- if ( d->d_type == DT_DIR ) {
- if (! strncmp(d->d_name, "OSC", 3)) {
- printf("Pinging OSC %s ", d->d_name);
- rc = llapi_ping("osc", d->d_name);
- if (rc) {
- printf(" bad\n");
- } else {
- printf(" good\n");
- }
- }
- }
- }
- return 0;
-
+ DIR *dir;
+ struct dirent *d;
+ char osc_dir[100];
+ int rc;
+
+ sprintf(osc_dir, "/proc/fs/lustre/osc");
+ dir = opendir(osc_dir);
+ if (dir == NULL) {
+ printf("Can't open dir\n");
+ return -1;
+ }
+ while((d = readdir(dir)) != NULL) {
+ if ( d->d_type == DT_DIR ) {
+ if (! strncmp(d->d_name, "OSC", 3)) {
+ printf("Pinging OSC %s ", d->d_name);
+ rc = llapi_ping("osc", d->d_name);
+ if (rc) {
+ printf(" bad\n");
+ } else {
+ printf(" good\n");
+ }
+ }
+ }
+ }
+ return 0;
+
}
-
+
int main()
{
- int file;
- int rc;
- char filename[100];
- char sys_cmd[100];
-
- sprintf(filename, "%s/%s",MY_LUSTRE_DIR, TESTFILE);
-
- printf("Open a file with striping\n");
- file = open_stripe_file();
- if ( file < 0 ) {
- printf("Exiting\n");
- exit(1);
-
-
-
-
- }
- printf("Getting uuid list\n");
- rc = get_my_uuids(file);
- printf("Write to the file\n");
- rc = write_file(file);
- rc = close_file(file);
- printf("Listing LOV data\n");
- rc = get_file_info(filename);
- printf("Ping our OSTs\n");
- rc = ping_osts();
-
- /* the results should match lfs getstripe */
- printf("Confirming our results with lfs getstripe\n");
- sprintf(sys_cmd, "/usr/bin/lfs getstripe %s/%s", MY_LUSTRE_DIR, TESTFILE);
- system(sys_cmd);
-
- printf("All done\n");
- exit(rc);
-}
-</screen>
+ int file;
+ int rc;
+ char filename[100];
+ char sys_cmd[100];
+
+ sprintf(filename, "%s/%s",MY_LUSTRE_DIR, TESTFILE);
+
+ printf("Open a file with striping\n");
+ file = open_stripe_file();
+ if ( file < 0 ) {
+ printf("Exiting\n");
+ exit(1);
+ }
+ printf("Getting uuid list\n");
+ rc = get_my_uuids(file);
+ printf("Write to the file\n");
+ rc = write_file(file);
+ rc = close_file(file);
+ printf("Listing LOV data\n");
+ rc = get_file_info(filename);
+ printf("Ping our OSTs\n");
+ rc = ping_osts();
+
+ /* the results should match lfs getstripe */
+ printf("Confirming our results with lfs getstripe\n");
+ sprintf(sys_cmd, "/usr/bin/lfs getstripe %s/%s", MY_LUSTRE_DIR, TESTFILE);
+ system(sys_cmd);
+
+ printf("All done\n");
+ exit(rc);
+}
+</programlisting>
<para><emphasis role="bold">Makefile for sample application:</emphasis></para>
<screen>
gcc -g -O2 -Wall -o lustredemo libtest.c -llustreapi