[Lustre-discuss] supporting fcntl, byte-range file locking

Wei-keng Liao wkliao at ece.northwestern.edu
Tue May 13 09:37:52 PDT 2008


What versions of Lustre support fcntl for byte-range file locking? 
Attached is a test program extracted from ROMIO to test fcntl() for 
locking. It ran fine on some Lustre versions.

Wei-keng
-------------- next part --------------
#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#include <mpi.h>

static int rank;

void ADIOI_Set_lock(int fd, int cmd, int type, long long offset, int whence, long long len)
{
    int err;
    struct flock lock;
    char *cmd_str, *type_str;

    if (len == 0) return;

    lock.l_type   = type;
    lock.l_whence = whence;
    lock.l_start  = offset;
    lock.l_len    = len;

    cmd_str = (cmd == F_GETLK )? "F_GETLK" :
             ((cmd == F_SETLK )? "F_SETLK" :
             ((cmd == F_SETLKW)? "F_SETLKW" : "UNEXPECTED"));
    type_str = (type == F_RDLCK)? "F_RDLCK" :
              ((type == F_WRLCK)? "F_WRLCK" :
              ((type == F_UNLCK)? "F_UNLOCK" : "UNEXPECTED"));
    errno = 0;
    do {
        err = fcntl(fd, cmd, &lock);
    } while (err && (errno == EINTR));

    if (err && (errno != EBADF))
        printf("%d: File locking failed in (fd %X,cmd %s/%X,type %s/%X,whence %X) with return value %X and errno %X.\n",
               rank, fd, cmd_str, cmd, type_str, type, whence, err, errno);
    else
        printf("%d: File locking succeed in (fd %X,cmd %s/%X,type %s/%X,whence %X)\n",
               rank, fd, cmd_str, cmd, type_str, type, whence);

    return;
}

int main(int argc, char **argv)
{
    int fd, buf[100];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    if (argc != 2) {
        printf("Usage: %s <filename>\n", argv[0]);
        return 1;
    }

    if ((fd = open(argv[1], O_CREAT|O_RDWR, 0600)) == -1) {
        printf("Error: opening file %s\n", argv[1]);
        return 1;
    }

    MPI_Barrier(MPI_COMM_WORLD);
    ADIOI_Set_lock(fd, F_SETLKW, F_WRLCK, 0, SEEK_SET, 10);
    write(fd, buf, 100);
    ADIOI_Set_lock(fd, F_SETLK,  F_UNLCK, 0, SEEK_SET, 10);

    close(fd);

    MPI_Finalize();
    return 0;
}



More information about the lustre-discuss mailing list