From: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> The commit to DS code is currently broken in the face of layout segments that do not cover the full file case. In particular, if the layout is a flexfile mirrored layout, we see that if two layout segments have differing numbers of mirrors, or just have different ordering of mirrors, then the current code can lead to data corruption and even kernel Oopses on the client. The root cause of these problems is the fact that we have one array of commit lists per struct pnfs_ds_commit_info, and that once that array is set up, it cannot change. This despite the fact that layout segments can be recalled and changed on the fly. This patch set attempts to fix that problem by changing the array of commit lists into a list of lists. It does so in a way that ensures 1-1 correspondence between a layout segment and a set of commits for the case of buffered writes, and a similar setup for a collection of O_DIRECT writes. Since most of this work is acting on code that is currently common to both the files layout and the flexfiles layout, I've fixed up both layout types in the same way. Trond Myklebust (22): pNFS/flexfiles: Simplify allocation of the mirror array NFS/pNFS: Refactor pnfs_generic_commit_pagelist() pNFS: Add a helper to allocate the array of buckets NFSv4/pnfs: Support a list of commit arrays in struct pnfs_ds_commit_info NFSv4/pNFS: Scan the full list of commit arrays when committing pNFS: Support per-layout segment commits in pnfs_generic_recover_commit_reqs() pNFS: Support per-layout segment commits in pnfs_generic_commit_pagelist() NFS/pNFS: Allow O_DIRECT to release the DS commitinfo NFS: commit errors should be fatal NFS: Fix O_DIRECT commit verifier handling NFS/pNFS: Support commit arrays in nfs_clear_pnfs_ds_commit_verifiers() pNFS: Add infrastructure for cleaning up per-layout commit structures pNFS: Enable per-layout segment commit structures NFS/pNFS: Add a helper pnfs_generic_search_commit_reqs() NFS: Remove bucket array from struct pnfs_ds_commit_info NFS/pNFS: Clean up pNFS commit operations NFS/pNFS: Simplify bucket layout segment reference counting NFS/pNFS: Fix pnfs_layout_mark_request_commit() invalid layout segment handling pNFS/flexfile: Don't merge layout segments if the mirrors don't match pNFS/flexfiles: Check the layout segment range before doing I/O pNFS/flexfiles: remove requirement for whole file layouts pNFS/flexfiles: Specify the layout segment range in LAYOUTGET fs/nfs/direct.c | 174 +++------ fs/nfs/filelayout/filelayout.c | 163 +++----- fs/nfs/flexfilelayout/flexfilelayout.c | 203 ++++------ fs/nfs/flexfilelayout/flexfilelayout.h | 2 +- fs/nfs/internal.h | 26 +- fs/nfs/pnfs.c | 4 +- fs/nfs/pnfs.h | 127 ++++-- fs/nfs/pnfs_nfs.c | 514 ++++++++++++++++++------- fs/nfs/write.c | 16 +- include/linux/nfs_xdr.h | 32 +- 10 files changed, 699 insertions(+), 562 deletions(-) -- 2.25.1