Reported-by: Olga Kornievskaia <aglo@xxxxxxxxxxxxxx> Signed-off-by: Benny Halevy <bhalevy@xxxxxxxxxx> --- fs/nfsd/export.c | 2 ++ fs/nfsd/nfs4proc.c | 10 ++++------ fs/nfsd/nfsd4_block.h | 18 ++++++++++++++++-- fs/nfsd/vfs.c | 7 +++---- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index a38713e..730f395 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c @@ -381,6 +381,7 @@ static int pnfsd_check_export(struct inode *inode, int *flags) return 0; #endif /* CONFIG_PNFSD_LOCAL_EXPORT */ +#if defined(CONFIG_PNFSD_BLOCK) if (pnfs_block_enabled(inode, *flags)) { if (!inode->i_sb->s_pnfs_op) { dprintk("set pnfs block export structure\n"); @@ -392,6 +393,7 @@ static int pnfsd_check_export(struct inode *inode, int *flags) return 0; } +#endif /* CONFIG_PNFSD_BLOCK */ #endif /* CONFIG_PNFSD */ diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 7b5d897..aa79a45 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -904,12 +904,10 @@ static __be32 nfsd4_do_lookupp(struct svc_rqst *rqstp, struct svc_fh *fh) nfsd4_get_verifier(cstate->current_fh.fh_dentry->d_inode->i_sb, &write->wr_verifier); - if (pnfs_block_enabled(cstate->current_fh.fh_dentry->d_inode, 0)) { - status = bl_layoutrecall(cstate->current_fh.fh_dentry->d_inode, - RETURN_FILE, write->wr_offset, write->wr_buflen, false); - if (status) - goto out_put; - } + status = bl_recall_layout(cstate->current_fh.fh_dentry->d_inode, + RETURN_FILE, write->wr_offset, write->wr_buflen, false); + if (status) + goto out_put; status = nfsd_write(rqstp, &cstate->current_fh, filp, write->wr_offset, rqstp->rq_vec, write->wr_vlen, &cnt, &write->wr_how_written); diff --git a/fs/nfsd/nfsd4_block.h b/fs/nfsd/nfsd4_block.h index 9c2941f..38387de 100644 --- a/fs/nfsd/nfsd4_block.h +++ b/fs/nfsd/nfsd4_block.h @@ -77,7 +77,7 @@ #ifdef CONFIG_PNFSD_BLOCK -bool pnfs_block_enabled(struct inode *, int); +bool pnfs_block_enabled(struct inode *, int ex_flags); void nfsd_bl_init(void); int bl_layout_type(struct super_block *sb); int bl_getdeviceiter(struct super_block *, u32 layout_type, @@ -97,13 +97,27 @@ int bl_layoutreturn(struct inode *, int bl_init_proc(void); int bl_upcall(bl_comm_t *, bl_comm_msg_t *, bl_comm_res_t **); + +static inline int +bl_recall_layout(struct inode *inode, int type, u64 offset, u64 len, bool with_nfs4_state_lock) +{ + if (pnfs_block_enabled(inode, 0)) + return bl_layoutrecall(inode, type, offset, len, with_nfs4_state_lock); +} + extern bl_comm_t *bl_comm_global; // Ugly... #else -static inline bool pnfs_block_enabled(struct inode *, int) { return false; } +static inline bool pnfs_block_enabled(struct inode *i, int ex_flags) { return false; } static inline void nfsd_bl_init(void) {} +static inline int bl_recall_layout(struct inode *inode, int type, u64 offset, + u64 len, bool with_nfs4_state_lock) +{ + return 0; +} + #endif /* CONFIG_PNFSD_BLOCK */ #endif /* __KERNEL__ */ diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index c4629fb..24091be 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -385,10 +385,9 @@ static int nfsd_break_lease(struct inode *inode) if (is_inode_pnfsd_lexp(inode)) pnfsd_lexp_recall_layout(inode, with_nfs4_state_lock); #endif /* CONFIG_PNFSD_LOCAL_EXPORT */ - if (pnfs_block_enabled(inode, 0)) - err = bl_layoutrecall(inode, RETURN_FILE, - iap->ia_size, inode->i_size - iap->ia_size, - with_nfs4_state_lock); + err = bl_recall_layout(inode, RETURN_FILE, iap->ia_size, + inode->i_size - iap->ia_size, + with_nfs4_state_lock); } host_err = get_write_access(inode); -- 1.7.6 -- 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