On Mon, 13 Feb 2012 16:40:03 +0900 dima <dolenin@xxxxxxxxxxxxx> wrote: > Hello Ralf-Peter, > > Actually it is possible. Check out David's response to my question from > some time ago: > http://permalink.gmane.org/gmane.comp.file-systems.btrfs/14227 > > The nocow.c script he attached does just the thing you want. The script > is really working. I needed nocow for different purpose but it did not > occur to me to try it on VM image and see if the performance would > improve. Sounds like a great idea. If you get around to try it, pls. > post your impressions here. Thanks for the link, this is indeed interesting. I made a couple of small changes, i.e. I wanted a way to unset nocow and to check that changing flags really worked. gcc -o /usr/local/bin/nocow nocow.c ln -sf /usr/local/bin/nocow /usr/local/bin/cow Perhaps the support for setting this flag should be added to the 'btrfs' utility. -- With respect, Roman ~~~~~~~~~~~~~~~~~~~~~~~~~~~ "Stallman had a printer, with code he could not see. So he began to tinker, and set the software free."
#include <fcntl.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <string.h>
#include <linux/types.h>
#include <stdio.h>
#include <errno.h>
#ifndef FS_IOC_SETFLAGS
#define FS_IOC_SETFLAGS _IOW('f', 2, long)
#warning defining SETFLAGS locally
#endif
#ifndef FS_IOC_GETFLAGS
#define FS_IOC_GETFLAGS _IOR('f', 1, long)
#warning defining GETFLAGS locally
#endif
#ifndef FS_NOCOW_FL
#define FS_NOCOW_FL 0x00800000 /* Do not cow file */
#endif
int main(int argc, char **argv)
{
int fd;
int r;
long flags;
if (argc < 2) {
printf("usage: %s file\n", argv[0]);
exit(1);
}
fd = open(argv[1], O_RDONLY);
if (fd == -1) {
perror("open()");
return 1;
}
printf("GETFLAGS ioctl 0x%x\n", FS_IOC_GETFLAGS);
printf("SETFLAGS ioctl 0x%x\n", FS_IOC_SETFLAGS);
r = ioctl(fd, FS_IOC_GETFLAGS, &flags);
if (r == -1) {
perror("ioctl(GETFLAGS)");
return 1;
} else {
printf("file flags before: 0x%lx\n", flags);
}
if(strcmp(argv[0], "cow")==0) {
printf("Remove NOCOW flag for %s\n", argv[1]);
flags ^= FS_NOCOW_FL;
} else {
printf("Set NOCOW flag for %s\n", argv[1]);
flags |= FS_NOCOW_FL;
}
r = ioctl(fd, FS_IOC_SETFLAGS, &flags);
printf("ioctl returned: %d\n", r);
if (r == -1) {
perror("ioctl()");
return 1;
}
r = ioctl(fd, FS_IOC_GETFLAGS, &flags);
if (r == -1) {
perror("ioctl(GETFLAGS)");
return 1;
} else {
printf("file flags after: 0x%lx\n", flags);
}
return 0;
}
Attachment:
signature.asc
Description: PGP signature
