NFSv4.1/pnfs: Separate out metadata and data consistency for pNFS

The LAYOUTCOMMIT operation means different things to different layout types.
For blocks and objects, it is both a data and metadata consistency operation.
For files and flexfiles, it is only a metadata consistency operation.

This patch separates out the 2 cases, allowing the files/flexfiles layout
drivers to optimise away the data consistency calls to layoutcommit.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Trond Myklebust 2015-03-25 14:14:42 -04:00
Родитель 7140171ea9
Коммит 5bb89b4702
9 изменённых файлов: 47 добавлений и 8 удалений

Просмотреть файл

@ -890,6 +890,7 @@ static struct pnfs_layoutdriver_type blocklayout_type = {
.free_deviceid_node = bl_free_deviceid_node, .free_deviceid_node = bl_free_deviceid_node,
.pg_read_ops = &bl_pg_read_ops, .pg_read_ops = &bl_pg_read_ops,
.pg_write_ops = &bl_pg_write_ops, .pg_write_ops = &bl_pg_write_ops,
.sync = pnfs_generic_sync,
}; };
static int __init nfs4blocklayout_init(void) static int __init nfs4blocklayout_init(void)

Просмотреть файл

@ -1139,6 +1139,7 @@ static struct pnfs_layoutdriver_type filelayout_type = {
.write_pagelist = filelayout_write_pagelist, .write_pagelist = filelayout_write_pagelist,
.alloc_deviceid_node = filelayout_alloc_deviceid_node, .alloc_deviceid_node = filelayout_alloc_deviceid_node,
.free_deviceid_node = filelayout_free_deviceid_node, .free_deviceid_node = filelayout_free_deviceid_node,
.sync = pnfs_nfs_generic_sync,
}; };
static int __init nfs4filelayout_init(void) static int __init nfs4filelayout_init(void)

Просмотреть файл

@ -1509,6 +1509,7 @@ static struct pnfs_layoutdriver_type flexfilelayout_type = {
.write_pagelist = ff_layout_write_pagelist, .write_pagelist = ff_layout_write_pagelist,
.alloc_deviceid_node = ff_layout_alloc_deviceid_node, .alloc_deviceid_node = ff_layout_alloc_deviceid_node,
.encode_layoutreturn = ff_layout_encode_layoutreturn, .encode_layoutreturn = ff_layout_encode_layoutreturn,
.sync = pnfs_nfs_generic_sync,
}; };
static int __init nfs4flexfilelayout_init(void) static int __init nfs4flexfilelayout_init(void)

Просмотреть файл

@ -112,7 +112,7 @@ nfs4_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
mutex_lock(&inode->i_mutex); mutex_lock(&inode->i_mutex);
ret = nfs_file_fsync_commit(file, start, end, datasync); ret = nfs_file_fsync_commit(file, start, end, datasync);
if (!ret) if (!ret)
ret = pnfs_layoutcommit_inode(inode, true); ret = pnfs_sync_inode(inode, !!datasync);
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
/* /*
* If nfs_file_fsync_commit detected a server reboot, then * If nfs_file_fsync_commit detected a server reboot, then

Просмотреть файл

@ -637,6 +637,8 @@ static struct pnfs_layoutdriver_type objlayout_type = {
.pg_read_ops = &objio_pg_read_ops, .pg_read_ops = &objio_pg_read_ops,
.pg_write_ops = &objio_pg_write_ops, .pg_write_ops = &objio_pg_write_ops,
.sync = pnfs_generic_sync,
.free_deviceid_node = objio_free_deviceid_node, .free_deviceid_node = objio_free_deviceid_node,
.encode_layoutcommit = objlayout_encode_layoutcommit, .encode_layoutcommit = objlayout_encode_layoutcommit,

Просмотреть файл

@ -2231,6 +2231,13 @@ clear_layoutcommitting:
} }
EXPORT_SYMBOL_GPL(pnfs_layoutcommit_inode); EXPORT_SYMBOL_GPL(pnfs_layoutcommit_inode);
int
pnfs_generic_sync(struct inode *inode, bool datasync)
{
return pnfs_layoutcommit_inode(inode, true);
}
EXPORT_SYMBOL_GPL(pnfs_generic_sync);
struct nfs4_threshold *pnfs_mdsthreshold_alloc(void) struct nfs4_threshold *pnfs_mdsthreshold_alloc(void)
{ {
struct nfs4_threshold *thp; struct nfs4_threshold *thp;

Просмотреть файл

@ -155,6 +155,8 @@ struct pnfs_layoutdriver_type {
int how, int how,
struct nfs_commit_info *cinfo); struct nfs_commit_info *cinfo);
int (*sync)(struct inode *inode, bool datasync);
/* /*
* Return PNFS_ATTEMPTED to indicate the layout code has attempted * Return PNFS_ATTEMPTED to indicate the layout code has attempted
* I/O, else return PNFS_NOT_ATTEMPTED to fall back to normal NFS * I/O, else return PNFS_NOT_ATTEMPTED to fall back to normal NFS
@ -267,6 +269,8 @@ bool pnfs_roc_drain(struct inode *ino, u32 *barrier, struct rpc_task *task);
void pnfs_set_layoutcommit(struct inode *, struct pnfs_layout_segment *, loff_t); void pnfs_set_layoutcommit(struct inode *, struct pnfs_layout_segment *, loff_t);
void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data); void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data);
int pnfs_layoutcommit_inode(struct inode *inode, bool sync); int pnfs_layoutcommit_inode(struct inode *inode, bool sync);
int pnfs_generic_sync(struct inode *inode, bool datasync);
int pnfs_nfs_generic_sync(struct inode *inode, bool datasync);
int _pnfs_return_layout(struct inode *); int _pnfs_return_layout(struct inode *);
int pnfs_commit_and_return_layout(struct inode *); int pnfs_commit_and_return_layout(struct inode *);
void pnfs_ld_write_done(struct nfs_pgio_header *); void pnfs_ld_write_done(struct nfs_pgio_header *);
@ -488,6 +492,14 @@ pnfs_ld_read_whole_page(struct inode *inode)
return NFS_SERVER(inode)->pnfs_curr_ld->flags & PNFS_READ_WHOLE_PAGE; return NFS_SERVER(inode)->pnfs_curr_ld->flags & PNFS_READ_WHOLE_PAGE;
} }
static inline int
pnfs_sync_inode(struct inode *inode, bool datasync)
{
if (!pnfs_enabled_sb(NFS_SERVER(inode)))
return 0;
return NFS_SERVER(inode)->pnfs_curr_ld->sync(inode, datasync);
}
static inline bool static inline bool
pnfs_layoutcommit_outstanding(struct inode *inode) pnfs_layoutcommit_outstanding(struct inode *inode)
{ {
@ -570,6 +582,12 @@ pnfs_ld_read_whole_page(struct inode *inode)
return false; return false;
} }
static inline int
pnfs_sync_inode(struct inode *inode, bool datasync)
{
return 0;
}
static inline bool static inline bool
pnfs_roc(struct inode *ino) pnfs_roc(struct inode *ino)
{ {

Просмотреть файл

@ -868,3 +868,13 @@ pnfs_layout_mark_request_commit(struct nfs_page *req,
nfs_request_add_commit_list(req, list, cinfo); nfs_request_add_commit_list(req, list, cinfo);
} }
EXPORT_SYMBOL_GPL(pnfs_layout_mark_request_commit); EXPORT_SYMBOL_GPL(pnfs_layout_mark_request_commit);
int
pnfs_nfs_generic_sync(struct inode *inode, bool datasync)
{
if (datasync)
return 0;
return pnfs_layoutcommit_inode(inode, true);
}
EXPORT_SYMBOL_GPL(pnfs_nfs_generic_sync);

Просмотреть файл

@ -1840,17 +1840,16 @@ EXPORT_SYMBOL_GPL(nfs_write_inode);
*/ */
int nfs_wb_all(struct inode *inode) int nfs_wb_all(struct inode *inode)
{ {
struct writeback_control wbc = {
.sync_mode = WB_SYNC_ALL,
.nr_to_write = LONG_MAX,
.range_start = 0,
.range_end = LLONG_MAX,
};
int ret; int ret;
trace_nfs_writeback_inode_enter(inode); trace_nfs_writeback_inode_enter(inode);
ret = sync_inode(inode, &wbc); ret = filemap_write_and_wait(inode->i_mapping);
if (!ret) {
ret = nfs_commit_inode(inode, FLUSH_SYNC);
if (!ret)
pnfs_sync_inode(inode, true);
}
trace_nfs_writeback_inode_exit(inode, ret); trace_nfs_writeback_inode_exit(inode, ret);
return ret; return ret;