Hey, I was looking at the wiki 'unclaimed projects' list and I thought I'd take a look at what might be needed to use the swap-over-n{fs,bd} functionality in order to implement swapfile support. It *looks* like it's surprisingly uncomplicated - to the point where I suspect I'm missing something, and would like some sanity checking.
My primary references for this are the patch[1] implementing swap-over-NFS and HEAD of cmason's for-linus branch. I'm going to go over the sections of the commitdiff from top to bottom (and hunk-by-hunk where I feel it necessary), and I'd like it if people could correct any mistakes I make. Kconfig: Simple enough that I'm not worried. direct.c: The first hunk seems to serve to factor out the difference between rw={READ,WRITE} and the KERNEL_ equivalents into a 'uio' parameter, so I'll view it as being mostly a code organization thing. The second hunk just adds that uio param to read_schedule_segment(), which it is given secondhand via direct_read(). The third hunk seems to be where the actual reading occurs in read_schedule_segment(), and the differences between uio and !uio seem to boil down to that KERNEL_READ is only allowed to operate one page at a time under penalty of BUG, and that it uses get_kernel_page instead of get_user_pages. Since btrfs calls into __blockdev_direct_IO(), I suspect that fs/direct-io.c would (in this case) be the right place to implement both the {READ,WRITE} vs KERNEL_* logic and those checks in this case. Also, check_direct_IO() in fs/btrfs/inode.c may want to treat KERNEL_WRITE similarly to WRITE - I'm not completely sure of that, however. Hunks 4-8 are just dealing with passing the additional uio parameter around. Hunk 9 is the write-side equivalent of hunk 3, and seems to correspond pretty exactly. It's looking like fs/direct_io.c is definitely the place to implement this. Hunks 10-17 are more uio parameter passing. file.c: Pretty simple - as far as I can tell, the activate() sets the span to what the swap header expects, the xs_swapper call basically sets the appropriate kmalloc flags for the network stuff (irrelevant here), and the deactivate() just resets those flags. All the smarts seem to be in the DIO code. The rest: The remainder of the patch seems to just be a.) handing that uio parameter around and b.) stuff specific to swapping over the network. Did I miss anything important? If not, I may well decide to tackle this as my first non-trivial kernel contribution. Does anyone have any suggestions on how I should stresstest this? I figure a good starting point would be running xfstests under memory pressure with such a swapfile. [1] http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;h=a564b8f -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html