On 10/17/2012 06:40 PM, Ben Myers wrote: > Hi Fellas, > > On Tue, Oct 16, 2012 at 12:39:01PM +1100, Dave Chinner wrote: >> On Tue, Oct 16, 2012 at 10:49:02AM +1100, Dave Chinner wrote: >>> On Mon, Oct 15, 2012 at 05:46:26PM -0500, Ben Myers wrote: >>>> Hey Brian, >>>> ... >>>> I do think it is preferable to have a test case go in with the code where >>>> possible. Since you don't mind waiting a bit, that seems to be the way to go. >>>> The other option could be to look for a volunteer to work on the test. ;) >>> >>> FWIW, given the background cleanup code can be trivially verified to >>> work (open, apend, close, repeat, wait 5 minutes) and is the >>> functionality that is needed in mainline, having something to test >>> the ioctls should not stop the patchset from being merged. > > Can we be assured that we'll get an xfstest for it eventually? > Absolutely. Getting a command into xfs_io to support such a test is now the top of my todo list with regard to XFS. :) > I think we can pull this in if Brian is willing post his test code. Initially > it needn't be posted as an xfstest, that's fine. As it stands today it appears > that Brian is the only one to ever use the ioctl and there is no way for anyone > else to test it. Not an ideal situation. > The impetus for this work was some prototype quota work for the gluster distributed filesystem. Beyond testing via that, I just had a very simple/stupid program with the command and data structure bits copy/pasted in to open a file and invoke an xfsctl() with hardcoded parameters. I don't consider it post-worthy or very useful, but attached nonetheless since I have a couple things to deal with before I get a chance to play with xfs_io. > I think this is a reasonable request. Usually it's Christoph who asks for a > test case. ;) > Agree. Brian >> i.e.: >> >> $ for i in `seq 0 512`; do >>> xfs_io -f -c "pwrite $((i * 4096)) 4096" /mnt/scratch/foo >>> done >> $ stat -c %b /mnt/scratch/foo >> 8192 >> $ sync; stat -c %b /mnt/scratch/foo >> 8192 >> $ sleep 30; stat -c %b /mnt/scratch/foo >> 8192 >> $ sleep 300; stat -c %b /mnt/scratch/foo >> 4104 >> >> It works. ;) > > Nice! > > Regards, > Ben >
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <xfs/xfs.h> #include <sys/quota.h> #ifndef PRJQUOTA #define PRJQUOTA 2 #endif /* * Speculative preallocation trimming. */ #define XFS_EOFBLOCKS_VERSION 1 struct xfs_eofblocks { __s32 eof_version; __u32 eof_flags; __u32 eof_q_id; __u32 eof_q_type; __u32 eof_min_file_size; unsigned char pad[12]; }; /* eof_flags values */ #define XFS_EOF_FLAGS_SYNC 0x01 /* sync/wait mode scan */ #define XFS_EOF_FLAGS_QUOTA 0x02 /* filter by quota id */ #define XFS_EOF_FLAGS_MINFILESIZE 0x04 /* filter by min file size */ #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) int main(int argc, char *argv[]) { int ret, fd; struct xfs_eofblocks eofb; fd = open(argv[1], O_RDONLY); if (fd < 0) { perror("open"); return -1; } memset(&eofb, 0, sizeof(struct xfs_eofblocks)); eofb.eof_version = XFS_EOFBLOCKS_VERSION; eofb.eof_flags |= XFS_EOF_FLAGS_SYNC; //eofb.eof_flags |= XFS_EOF_FLAGS_QUOTA; //eofb.eof_q_id = 42; //eofb.eof_q_type = PRJQUOTA; eofb.eof_flags |= XFS_EOF_FLAGS_MINFILESIZE; eofb.eof_min_file_size = 1024 * 1024 * 101; ret = xfsctl(NULL, fd, XFS_IOC_FREE_EOFBLOCKS, &eofb); if (ret < 0) perror("xfsctl"); if (close(fd) < 0) perror("close"); return 0; }
_______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs