This prepares for the next patch. NOTE this doesn't really fix any current race, since layout going to NULL is OK. But layout changing from NULL to nonNULL is a real race that is not fixed Signed-off-by: Fred Isaman <iisaman@xxxxxxxxxx> --- fs/nfs/nfs4state.c | 5 +++-- fs/nfs/pnfs.c | 11 +++++++++++ include/linux/nfs4_pnfs.h | 2 ++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index d5144bd..8a7a64c 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -594,11 +594,12 @@ static void __nfs4_close(struct path *path, struct nfs4_state *state, } else { #ifdef CONFIG_NFS_V4_1 struct nfs_inode *nfsi = NFS_I(state->inode); + int roc = nfs4_roc_iomode(nfsi); - if (has_layout(nfsi) && nfsi->layout.roc_iomode) { + if (roc) { struct nfs4_pnfs_layout_segment range; - range.iomode = nfsi->layout.roc_iomode; + range.iomode = roc; range.offset = 0; range.length = NFS4_MAX_UINT64; pnfs_return_layout(state->inode, &range, NULL, diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 6def09c..bd11ec7 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -321,6 +321,17 @@ pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *ld_type) #define BUG_ON_UNLOCKED_LO(lo) do {} while (0) #endif /* CONFIG_SMP */ +int nfs4_roc_iomode(struct nfs_inode *nfsi) +{ + int rv = 0; + + spin_lock(&pnfs_spinlock); + if (has_layout(nfsi)) + rv = nfsi->layout.roc_iomode; + spin_unlock(&pnfs_spinlock); + return rv; +} + static inline void get_layout(struct pnfs_layout_type *lo) { diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h index 0eb9b16..2ea131f 100644 --- a/include/linux/nfs4_pnfs.h +++ b/include/linux/nfs4_pnfs.h @@ -86,6 +86,8 @@ layoutcommit_needed(struct nfs_inode *nfsi) return test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->pnfs_layout_state); } +int nfs4_roc_iomode(struct nfs_inode *nfs); + #else /* CONFIG_NFS_V4_1 */ static inline bool -- 1.6.6.1 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html