- </section>
- <section remap="h2">
- <title>34.6 Example <anchor xml:id="dbdoclet.50438215_marker-1297700" xreflabel=""/>Using the llapi Library</title>
- <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>
- <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>
- <para><anchor xml:id="dbdoclet.50438215_pgfId-1297710" xreflabel=""/><emphasis role="bold">A simple C program to demonstrate striping API - libtest.c</emphasis></para>
- <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297711" xreflabel=""/>/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
-<anchor xml:id="dbdoclet.50438215_pgfId-1297712" xreflabel=""/> * vim:expandtab:shiftwidth=8:tabstop=8:
-<anchor xml:id="dbdoclet.50438215_pgfId-1297713" xreflabel=""/> *
-<anchor xml:id="dbdoclet.50438215_pgfId-1297714" xreflabel=""/> * lustredemo - simple code examples of liblustreapi functions
-<anchor xml:id="dbdoclet.50438215_pgfId-1297715" xreflabel=""/> */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297716" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297717" xreflabel=""/>#include <stdio.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297718" xreflabel=""/>#include <fcntl.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297719" xreflabel=""/>#include <sys/stat.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297720" xreflabel=""/>#include <sys/types.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297721" xreflabel=""/>#include <dirent.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297722" xreflabel=""/>#include <errno.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297723" xreflabel=""/>#include <string.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297724" xreflabel=""/>#include <unistd.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297725" xreflabel=""/>#include <stdlib.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297726" xreflabel=""/>#include <lustre/liblustreapi.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297727" xreflabel=""/>#include <lustre/lustre_user.h>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297728" xreflabel=""/>#define MAX_OSTS 1024
-<anchor xml:id="dbdoclet.50438215_pgfId-1297729" xreflabel=""/>#define LOV_EA_SIZE(lum, num) (sizeof(*lum) + num * sizeof(*lum->lmm_objects\
-))
-<anchor xml:id="dbdoclet.50438215_pgfId-1297730" xreflabel=""/>#define LOV_EA_MAX(lum) LOV_EA_SIZE(lum, MAX_OSTS)
-<anchor xml:id="dbdoclet.50438215_pgfId-1297731" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297732" xreflabel=""/>/*
-<anchor xml:id="dbdoclet.50438215_pgfId-1297733" xreflabel=""/>This program provides crude examples of using the liblustre API functions
-<anchor xml:id="dbdoclet.50438215_pgfId-1297734" xreflabel=""/>*/
-<anchor xml:id="dbdoclet.50438215_pgfId-1297735" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297736" xreflabel=""/>/* Change these definitions to suit */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297737" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297738" xreflabel=""/>#define TESTDIR "/tmp" /* R\
-esults directory */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297739" xreflabel=""/>#define TESTFILE "lustre_dummy" \
- /* Name for the file we create/destroy */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297740" xreflabel=""/>#define FILESIZE 262144 \
-/* Size of the file in words */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297741" xreflabel=""/>#define DUMWORD "DEADBEEF" \
- /* Dummy word used to fill files */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297742" xreflabel=""/>#define MY_STRIPE_WIDTH 2 \
-/* Set this to the number of OST required */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297743" xreflabel=""/>#define MY_LUSTRE_DIR "/mnt/lustre/ftest"
-<anchor xml:id="dbdoclet.50438215_pgfId-1297744" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297745" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297746" xreflabel=""/>int close_file(int fd)
-<anchor xml:id="dbdoclet.50438215_pgfId-1297747" xreflabel=""/>{
-<anchor xml:id="dbdoclet.50438215_pgfId-1297748" xreflabel=""/> if (close(fd) < 0) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297749" xreflabel=""/> fprintf(stderr, "File close failed: %d (%s)\n", errno, strerror(er\
-rno));
-<anchor xml:id="dbdoclet.50438215_pgfId-1297750" xreflabel=""/> return -1;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297751" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297752" xreflabel=""/> return 0;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297753" xreflabel=""/>}
-<anchor xml:id="dbdoclet.50438215_pgfId-1297754" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297755" xreflabel=""/>int write_file(int fd)
-<anchor xml:id="dbdoclet.50438215_pgfId-1297756" xreflabel=""/>{
-<anchor xml:id="dbdoclet.50438215_pgfId-1297757" xreflabel=""/> char *stng = DUMWORD;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297758" xreflabel=""/> int cnt = 0;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297759" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297760" xreflabel=""/> for( cnt = 0; cnt < FILESIZE; cnt++) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297761" xreflabel=""/> write(fd, stng, sizeof(stng));
-<anchor xml:id="dbdoclet.50438215_pgfId-1297762" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297763" xreflabel=""/> return 0;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297764" xreflabel=""/>}
-<anchor xml:id="dbdoclet.50438215_pgfId-1297765" xreflabel=""/>/* Open a file, set a specific stripe count, size and starting OST
-<anchor xml:id="dbdoclet.50438215_pgfId-1297766" xreflabel=""/> Adjust the parameters to suit */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297767" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297768" xreflabel=""/>int open_stripe_file()
-<anchor xml:id="dbdoclet.50438215_pgfId-1297769" xreflabel=""/>{
-<anchor xml:id="dbdoclet.50438215_pgfId-1297770" xreflabel=""/> char *tfile = TESTFILE;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297771" xreflabel=""/> int stripe_size = 65536; \
- /* System default is 4M */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297772" xreflabel=""/> int stripe_offset = -1; \
- /* Start at default */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297773" xreflabel=""/> int stripe_count = MY_STRIPE_WIDTH; \
- /*Single stripe for this demo*/
-<anchor xml:id="dbdoclet.50438215_pgfId-1297774" xreflabel=""/> int stripe_pattern = 0; \
- /* only RAID 0 at this time */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297775" xreflabel=""/> int rc, fd;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297776" xreflabel=""/> /*
-<anchor xml:id="dbdoclet.50438215_pgfId-1297777" xreflabel=""/> */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297778" xreflabel=""/> rc = llapi_file_create(tfile,
-<anchor xml:id="dbdoclet.50438215_pgfId-1297779" xreflabel=""/>stripe_size,stripe_offset,stripe_count,stripe_pattern);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297780" xreflabel=""/> /* result code is inverted, we may return -EINVAL or an ioctl error.
-<anchor xml:id="dbdoclet.50438215_pgfId-1297781" xreflabel=""/> We borrow an error message from sanity.c
-<anchor xml:id="dbdoclet.50438215_pgfId-1297782" xreflabel=""/> */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297783" xreflabel=""/> if (rc) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297784" xreflabel=""/> fprintf(stderr,"llapi_file_create failed: %d (%s) \n", rc, st\
-rerror(-rc));
-<anchor xml:id="dbdoclet.50438215_pgfId-1297785" xreflabel=""/> return -1;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297786" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297787" xreflabel=""/> /* llapi_file_create closes the file descriptor, we must re-open */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297788" xreflabel=""/> fd = open(tfile, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297789" xreflabel=""/> if (fd < 0) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297790" xreflabel=""/> fprintf(stderr, "Can't open %s file: %d (%s)\n", tfile, errno\
-, strerror(errno));
-<anchor xml:id="dbdoclet.50438215_pgfId-1297791" xreflabel=""/> return -1;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297792" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297793" xreflabel=""/> return fd;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297794" xreflabel=""/>}
-<anchor xml:id="dbdoclet.50438215_pgfId-1297795" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297796" xreflabel=""/>/* output a list of uuids for this file */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297797" xreflabel=""/>int get_my_uuids(int fd)
-<anchor xml:id="dbdoclet.50438215_pgfId-1297798" xreflabel=""/>{
-<anchor xml:id="dbdoclet.50438215_pgfId-1297799" xreflabel=""/> struct obd_uuid uuids[1024], *uuidp; \
- /* Output var */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297800" xreflabel=""/> int obdcount = 1024;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297801" xreflabel=""/> int rc,i;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297802" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297803" xreflabel=""/> rc = llapi_lov_get_uuids(fd, uuids, &obdcount);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297804" xreflabel=""/> if (rc != 0) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297805" xreflabel=""/> fprintf(stderr, "get uuids failed: %d (%s)\n",errno, strerror(errn\
-o));
-<anchor xml:id="dbdoclet.50438215_pgfId-1297806" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297807" xreflabel=""/> printf("This file system has %d obds\n", obdcount);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297808" xreflabel=""/> for (i = 0, uuidp = uuids; i < obdcount; i++, uuidp++) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297809" xreflabel=""/> printf("UUID %d is %s\n",i, uuidp->uuid);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297810" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297811" xreflabel=""/> return 0;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297812" xreflabel=""/>}
-<anchor xml:id="dbdoclet.50438215_pgfId-1297813" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297814" xreflabel=""/>/* Print out some LOV attributes. List our objects */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297815" xreflabel=""/>int get_file_info(char *path)
-<anchor xml:id="dbdoclet.50438215_pgfId-1297816" xreflabel=""/>{
-<anchor xml:id="dbdoclet.50438215_pgfId-1297817" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297818" xreflabel=""/> struct lov_user_md *lump;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297819" xreflabel=""/> int rc;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297820" xreflabel=""/> int i;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297821" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297822" xreflabel=""/> lump = malloc(LOV_EA_MAX(lump));
-<anchor xml:id="dbdoclet.50438215_pgfId-1297823" xreflabel=""/> if (lump == NULL) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297824" xreflabel=""/> return -1;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297825" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297826" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297827" xreflabel=""/> rc = llapi_file_get_stripe(path, lump);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297828" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297829" xreflabel=""/> if (rc != 0) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297830" xreflabel=""/> fprintf(stderr, "get_stripe failed: %d (%s)\n",errno, strerror(err\
-no));
-<anchor xml:id="dbdoclet.50438215_pgfId-1297831" xreflabel=""/> return -1;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297832" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297833" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297834" xreflabel=""/> printf("Lov magic %u\n", lump->lmm_magic);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297835" xreflabel=""/> printf("Lov pattern %u\n", lump->lmm_pattern);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297836" xreflabel=""/> printf("Lov object id %llu\n", lump->lmm_object_id);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297837" xreflabel=""/> printf("Lov object group %llu\n", lump->lmm_object_gr);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297838" xreflabel=""/> printf("Lov stripe size %u\n", lump->lmm_stripe_size);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297839" xreflabel=""/> printf("Lov stripe count %hu\n", lump->lmm_stripe_count);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297840" xreflabel=""/> printf("Lov stripe offset %u\n", lump->lmm_stripe_offset);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297841" xreflabel=""/> for (i = 0; i < lump->lmm_stripe_count; i++) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297842" xreflabel=""/> printf("Object index %d Objid %llu\n", lump->lmm_objects[i].l_ost_i\
-dx, lump->lmm_objects[i].l_object_id);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297843" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297844" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297845" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297846" xreflabel=""/> free(lump);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297847" xreflabel=""/> return rc;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297848" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297849" xreflabel=""/>}
-<anchor xml:id="dbdoclet.50438215_pgfId-1297850" xreflabel=""/>/* Ping all OSTs that belong to this filesysem */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297851" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297852" xreflabel=""/>int ping_osts()
-<anchor xml:id="dbdoclet.50438215_pgfId-1297853" xreflabel=""/>{
-<anchor xml:id="dbdoclet.50438215_pgfId-1297854" xreflabel=""/> DIR *dir;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297855" xreflabel=""/> struct dirent *d;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297856" xreflabel=""/> char osc_dir[100];
-<anchor xml:id="dbdoclet.50438215_pgfId-1297857" xreflabel=""/> int rc;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297858" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297859" xreflabel=""/> sprintf(osc_dir, "/proc/fs/lustre/osc");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297860" xreflabel=""/> dir = opendir(osc_dir);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297861" xreflabel=""/> if (dir == NULL) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297862" xreflabel=""/> printf("Can't open dir\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297863" xreflabel=""/> return -1;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297864" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297865" xreflabel=""/> while((d = readdir(dir)) != NULL) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297866" xreflabel=""/> if ( d->d_type == DT_DIR ) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297867" xreflabel=""/> if (! strncmp(d->d_name, "OSC", 3)) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297868" xreflabel=""/> printf("Pinging OSC %s ", d->d_name);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297869" xreflabel=""/> rc = llapi_ping("osc", d->d_name);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297870" xreflabel=""/> if (rc) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297871" xreflabel=""/> printf(" bad\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297872" xreflabel=""/> } else {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297873" xreflabel=""/> printf(" good\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297874" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297875" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297876" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297877" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297878" xreflabel=""/> return 0;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297879" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297880" xreflabel=""/>}
-<anchor xml:id="dbdoclet.50438215_pgfId-1297881" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297882" xreflabel=""/>int main()
-<anchor xml:id="dbdoclet.50438215_pgfId-1297883" xreflabel=""/>{
-<anchor xml:id="dbdoclet.50438215_pgfId-1297884" xreflabel=""/> int file;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297885" xreflabel=""/> int rc;
-<anchor xml:id="dbdoclet.50438215_pgfId-1297886" xreflabel=""/> char filename[100];
-<anchor xml:id="dbdoclet.50438215_pgfId-1297887" xreflabel=""/> char sys_cmd[100];
-<anchor xml:id="dbdoclet.50438215_pgfId-1297888" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297889" xreflabel=""/> sprintf(filename, "%s/%s",MY_LUSTRE_DIR, TESTFILE);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297890" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297891" xreflabel=""/> printf("Open a file with striping\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297892" xreflabel=""/> file = open_stripe_file();
-<anchor xml:id="dbdoclet.50438215_pgfId-1297893" xreflabel=""/> if ( file < 0 ) {
-<anchor xml:id="dbdoclet.50438215_pgfId-1297894" xreflabel=""/> printf("Exiting\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297895" xreflabel=""/> exit(1);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297896" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297897" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297898" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297899" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297900" xreflabel=""/> }
-<anchor xml:id="dbdoclet.50438215_pgfId-1297901" xreflabel=""/> printf("Getting uuid list\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297902" xreflabel=""/> rc = get_my_uuids(file);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297903" xreflabel=""/> rintf("Write to the file\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297904" xreflabel=""/> rc = write_file(file);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297905" xreflabel=""/> rc = close_file(file);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297906" xreflabel=""/> printf("Listing LOV data\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297907" xreflabel=""/> rc = get_file_info(filename);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297908" xreflabel=""/> printf("Ping our OSTs\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297909" xreflabel=""/> rc = ping_osts();
-<anchor xml:id="dbdoclet.50438215_pgfId-1297910" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297911" xreflabel=""/> /* the results should match lfs getstripe */
-<anchor xml:id="dbdoclet.50438215_pgfId-1297912" xreflabel=""/> printf("Confirming our results with lfs getsrtipe\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297913" xreflabel=""/> sprintf(sys_cmd, "/usr/bin/lfs getstripe %s/%s", MY_LUSTRE_DIR, TESTFILE);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297914" xreflabel=""/> system(sys_cmd);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297915" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297916" xreflabel=""/> printf("All done\n");
-<anchor xml:id="dbdoclet.50438215_pgfId-1297917" xreflabel=""/> exit(rc);
-<anchor xml:id="dbdoclet.50438215_pgfId-1297918" xreflabel=""/>}
-</screen>
- <para><anchor xml:id="dbdoclet.50438215_pgfId-1297919" xreflabel=""/><emphasis role="bold">Makefile for sample application:</emphasis></para>
- <screen><anchor xml:id="dbdoclet.50438215_pgfId-1297920" xreflabel=""/>
-<anchor xml:id="dbdoclet.50438215_pgfId-1297921" xreflabel=""/>gcc -g -O2 -Wall -o lustredemo libtest.c -llustreapi
-<anchor xml:id="dbdoclet.50438215_pgfId-1297922" xreflabel=""/>clean:
-<anchor xml:id="dbdoclet.50438215_pgfId-1297923" xreflabel=""/>rm -f core lustredemo *.o
-<anchor xml:id="dbdoclet.50438215_pgfId-1297924" xreflabel=""/>run:
-<anchor xml:id="dbdoclet.50438215_pgfId-1297925" xreflabel=""/>make
-<anchor xml:id="dbdoclet.50438215_pgfId-1297926" xreflabel=""/>rm -f /mnt/lustre/ftest/lustredemo
-<anchor xml:id="dbdoclet.50438215_pgfId-1297927" xreflabel=""/>rm -f /mnt/lustre/ftest/lustre_dummy
-<anchor xml:id="dbdoclet.50438215_pgfId-1297928" xreflabel=""/>cp lustredemo /mnt/lustre/ftest/
+ </section>
+ <section xml:id="example_using_llapi">
+ <title>Example Using the <literal>llapi</literal> Library</title>
+ <para>Use <literal>llapi_file_create</literal> to set Lustre software properties for a new file.
+ For a synopsis and description of <literal>llapi_file_create</literal> 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 install the Lustre client source RPM.</para>
+ <para><emphasis role="bold">A simple C program to demonstrate striping API - libtest.c</emphasis></para>
+ <programlisting>
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * lustredemo - a simple example of lustreapi functions
+ */
+#include <stdio.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <errno.h>
+#include <stdlib.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 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;
+}
+
+int write_file(int fd)
+{
+ char *stng = DUMWORD;
+ int cnt = 0;
+
+ for( cnt = 0; cnt < FILESIZE; cnt++) {
+ write(fd, stng, sizeof(stng));
+ }
+ return 0;
+}
+/* Open a file, set a specific stripe count, size and starting OST
+ * 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) {
+ 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;
+ }
+ 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));
+ }
+ 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);
+ }
+ 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;
+ }
+
+ rc = llapi_file_get_stripe(path, lump);
+
+ if (rc != 0) {
+ 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 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;
+
+}
+
+/* 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;
+
+}
+
+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);
+}
+</programlisting>
+ <para><emphasis role="bold">Makefile for sample application:</emphasis></para>
+ <screen>
+gcc -g -O2 -Wall -o lustredemo libtest.c -llustreapi
+clean:
+rm -f core lustredemo *.o
+run:
+make
+rm -f /mnt/lustre/ftest/lustredemo
+rm -f /mnt/lustre/ftest/lustre_dummy
+cp lustredemo /mnt/lustre/ftest/