mbox series

[00/22] Fix NFS commit to DS

Message ID 20200324234728.8997-1-trondmy@kernel.org (mailing list archive)
Headers show
Series Fix NFS commit to DS | expand

Message

Trond Myklebust March 24, 2020, 11:47 p.m. UTC
From: Trond Myklebust <trond.myklebust@hammerspace.com>

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(-)