#include #include #include #include #include #include #include #include #define PVFS_IMMUTABLE_XATTR_KEY "user.pvfs2.meta_hint" #define PVFS_IMMUTABLE_XATTR_VALUE "+immutable" int do_read(int fd, void *buff, int size); int main(int argc, char *argv[]) { int size, fd, i, ret; char *buff; if(argc < 3) { fprintf(stderr, "usage: %s \n", argv[0]); exit(1); } size = atoi(argv[2]) * 1024 * 1024; fd = open(argv[1], O_RDWR|O_CREAT, 0644); if(fd < 0) { fprintf(stderr, "Failed opening file: %s: %s\n", argv[1], strerror(errno)); exit(1); } buff = malloc(size); if(!buff) { fprintf(stderr, "Failed allocating %dMB for buffer\n", argv[2]); close(fd); exit(1); } for(i = 0; i < atoi(argv[2]); ++i) { memset(buff+(i*1024*1024), i, 1024*1024); } ret = write(fd, buff, size); if(ret < 0) { fprintf(stderr, "Failed writing %dMB to file: %s\n", atoi(argv[2]), strerror(errno)); goto error; } printf("BEFORE IMMUTABLE: "); ret = do_read(fd, buff, size); if(ret != 0) { goto error; } /* set the extended attribute to make the file immutable */ ret = fsetxattr(fd, PVFS_IMMUTABLE_XATTR_KEY, PVFS_IMMUTABLE_XATTR_VALUE, sizeof(PVFS_IMMUTABLE_XATTR_VALUE), XATTR_CREATE); if(ret != 0) { fprintf(stderr, "Failed setting file to immutable: %s\n", strerror(errno)); goto error; } printf("AFTER IMMUTABLE: "); ret = do_read(fd, buff, size); if(ret != 0) { goto error; } printf("AFTER IMMUTABLE 2x: "); ret = do_read(fd, buff, size); if(ret != 0) { goto error; } close(fd); fd = open(argv[1], O_RDWR, 0644); if(fd < 0) { fprintf(stderr, "Failed opening file: %s: %s\n", argv[1], strerror(errno)); free(buff); exit(1); } printf("AFTER CLOSE/OPEN: "); ret = do_read(fd, buff, size); if(ret != 0) { goto error; } close(fd); return 0; error: close(fd); free(buff); exit(1); } int do_read(int fd, void *buff, int size) { int ret; struct timeval start, end; double bw; gettimeofday(&start, NULL); ret = pread(fd, buff, size, 0); if(ret < 0) { fprintf(stderr, "Failed reading the file: %s\n", strerror(errno)); return ret; } if(ret < size) { fprintf(stderr, "Short read. Only able to read: %d bytes\n", ret); return ret; } gettimeofday(&end, NULL); bw = (size * 1e-6) / (end.tv_sec + end.tv_usec * 1e-6 - start.tv_sec - start.tv_usec * 1e-6); printf("%f MB/s\n", bw); return 0; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * End: * * vim: ts=8 sts=4 sw=4 expandtab */