Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0382b744 authored by Andy Adamson's avatar Andy Adamson Committed by Trond Myklebust
Browse files

NFSv4.1: implement generic pnfs layer write switch

parent 44b83799
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -238,6 +238,12 @@ filelayout_read_pagelist(struct nfs_read_data *data)
	return PNFS_ATTEMPTED;
}

static enum pnfs_try_status
filelayout_write_pagelist(struct nfs_write_data *data, int sync)
{
	return PNFS_NOT_ATTEMPTED;
}

/*
 * filelayout_check_layout()
 *
@@ -455,6 +461,7 @@ static struct pnfs_layoutdriver_type filelayout_type = {
	.free_lseg		= filelayout_free_lseg,
	.pg_test		= filelayout_pg_test,
	.read_pagelist		= filelayout_read_pagelist,
	.write_pagelist		= filelayout_write_pagelist,
};

static int __init nfs4filelayout_init(void)
+24 −0
Original line number Diff line number Diff line
@@ -895,6 +895,30 @@ pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *inode)
	pgio->pg_test = (ld && ld->pg_test) ? pnfs_write_pg_test : NULL;
}

enum pnfs_try_status
pnfs_try_to_write_data(struct nfs_write_data *wdata,
			const struct rpc_call_ops *call_ops, int how)
{
	struct inode *inode = wdata->inode;
	enum pnfs_try_status trypnfs;
	struct nfs_server *nfss = NFS_SERVER(inode);

	wdata->mds_ops = call_ops;

	dprintk("%s: Writing ino:%lu %u@%llu (how %d)\n", __func__,
		inode->i_ino, wdata->args.count, wdata->args.offset, how);

	trypnfs = nfss->pnfs_curr_ld->write_pagelist(wdata, how);
	if (trypnfs == PNFS_NOT_ATTEMPTED) {
		put_lseg(wdata->lseg);
		wdata->lseg = NULL;
	} else
		nfs_inc_stats(inode, NFSIOS_PNFS_WRITE);

	dprintk("%s End (trypnfs:%d)\n", __func__, trypnfs);
	return trypnfs;
}

/*
 * Call the appropriate parallel I/O subsystem read function.
 */
+10 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ struct pnfs_layoutdriver_type {
	 * I/O, else return PNFS_NOT_ATTEMPTED to fall back to normal NFS
	 */
	enum pnfs_try_status (*read_pagelist) (struct nfs_read_data *nfs_data);
	enum pnfs_try_status (*write_pagelist) (struct nfs_write_data *nfs_data, int how);
};

struct pnfs_layout_hdr {
@@ -120,6 +121,8 @@ pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
		   enum pnfs_iomode access_type);
void set_pnfs_layoutdriver(struct nfs_server *, u32 id);
void unset_pnfs_layoutdriver(struct nfs_server *);
enum pnfs_try_status pnfs_try_to_write_data(struct nfs_write_data *,
					     const struct rpc_call_ops *, int);
enum pnfs_try_status pnfs_try_to_read_data(struct nfs_read_data *,
					    const struct rpc_call_ops *);
void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *);
@@ -200,6 +203,13 @@ pnfs_try_to_read_data(struct nfs_read_data *data,
	return PNFS_NOT_ATTEMPTED;
}

static inline enum pnfs_try_status
pnfs_try_to_write_data(struct nfs_write_data *data,
		       const struct rpc_call_ops *call_ops, int how)
{
	return PNFS_NOT_ATTEMPTED;
}

static inline bool
pnfs_roc(struct inode *ino)
{
+4 −0
Original line number Diff line number Diff line
@@ -873,6 +873,10 @@ static int nfs_write_rpcsetup(struct nfs_page *req,
	data->res.verf    = &data->verf;
	nfs_fattr_init(&data->fattr);

	if (data->lseg &&
	    (pnfs_try_to_write_data(data, call_ops, how) == PNFS_ATTEMPTED))
		return 0;

	return nfs_initiate_write(data, NFS_CLIENT(inode), call_ops, how);
}

+1 −0
Original line number Diff line number Diff line
@@ -114,6 +114,7 @@ enum nfs_stat_eventcounters {
	NFSIOS_SHORTWRITE,
	NFSIOS_DELAY,
	NFSIOS_PNFS_READ,
	NFSIOS_PNFS_WRITE,
	__NFSIOS_COUNTSMAX,
};

Loading