On Mon, 13 Feb 2012 16:40:03 +0900 dima <dole...@parallels.com> 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; }
signature.asc
Description: PGP signature