pnfs/blocklayout: update last_write_offset atomically with extents
Block/SCSI layout write completion may add committable extents to the extent tree before updating the layout's last-written byte under the inode lock. If a sync happens before this value is updated, then prepare_layoutcommit may find and encode these extents which would produce a LAYOUTCOMMIT request whose encoded extents are larger than the request's loca_length. Fix this by using a last-written byte value that is updated atomically with the extent tree so that commitable extents always match. Signed-off-by: Benjamin Coddington <bcodding@redhat.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:

committed by
Trond Myklebust

parent
b88fa69eaa
commit
41963c10c4
@@ -141,6 +141,7 @@ struct pnfs_block_layout {
|
||||
struct rb_root bl_ext_ro;
|
||||
spinlock_t bl_ext_lock; /* Protects list manipulation */
|
||||
bool bl_scsi_layout;
|
||||
u64 bl_lwb;
|
||||
};
|
||||
|
||||
static inline struct pnfs_block_layout *
|
||||
@@ -182,7 +183,7 @@ int ext_tree_insert(struct pnfs_block_layout *bl,
|
||||
int ext_tree_remove(struct pnfs_block_layout *bl, bool rw, sector_t start,
|
||||
sector_t end);
|
||||
int ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start,
|
||||
sector_t len);
|
||||
sector_t len, u64 lwb);
|
||||
bool ext_tree_lookup(struct pnfs_block_layout *bl, sector_t isect,
|
||||
struct pnfs_block_extent *ret, bool rw);
|
||||
int ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg);
|
||||
|
Reference in New Issue
Block a user