mirror of https://gitee.com/openkylin/linux.git
nfs42: serialize LAYOUTSTATS calls of the same file
There is no need to report concurrently. Reviewed-by: Jeff Layton <jeff.layton@primarydata.com> Signed-off-by: Peng Tao <tao.peng@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
27c4306443
commit
1bfe3b259f
|
@ -204,6 +204,9 @@ nfs42_layoutstat_release(void *calldata)
|
|||
nfss->pnfs_curr_ld->cleanup_layoutstats(data);
|
||||
|
||||
pnfs_put_layout_hdr(NFS_I(data->args.inode)->layout);
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(NFS_INO_LAYOUTSTATS, &NFS_I(data->args.inode)->flags);
|
||||
smp_mb__after_atomic();
|
||||
nfs_iput_and_deactive(data->inode);
|
||||
kfree(data->args.devinfo);
|
||||
kfree(data);
|
||||
|
|
|
@ -2257,6 +2257,7 @@ pnfs_report_layoutstat(struct inode *inode)
|
|||
{
|
||||
struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
|
||||
struct nfs_server *server = NFS_SERVER(inode);
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
struct nfs42_layoutstat_data *data;
|
||||
struct pnfs_layout_hdr *hdr;
|
||||
int status = 0;
|
||||
|
@ -2264,6 +2265,9 @@ pnfs_report_layoutstat(struct inode *inode)
|
|||
if (!pnfs_enabled_sb(server) || !ld->prepare_layoutstats)
|
||||
goto out;
|
||||
|
||||
if (test_and_set_bit(NFS_INO_LAYOUTSTATS, &nfsi->flags))
|
||||
goto out;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
if (!NFS_I(inode)->layout) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
|
@ -2296,6 +2300,9 @@ pnfs_report_layoutstat(struct inode *inode)
|
|||
kfree(data);
|
||||
out_put:
|
||||
pnfs_put_layout_hdr(hdr);
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(NFS_INO_LAYOUTSTATS, &nfsi->flags);
|
||||
smp_mb__after_atomic();
|
||||
goto out;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pnfs_report_layoutstat);
|
||||
|
|
|
@ -219,6 +219,7 @@ struct nfs_inode {
|
|||
#define NFS_INO_COMMIT (7) /* inode is committing unstable writes */
|
||||
#define NFS_INO_LAYOUTCOMMIT (9) /* layoutcommit required */
|
||||
#define NFS_INO_LAYOUTCOMMITTING (10) /* layoutcommit inflight */
|
||||
#define NFS_INO_LAYOUTSTATS (11) /* layoutstats inflight */
|
||||
|
||||
static inline struct nfs_inode *NFS_I(const struct inode *inode)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue