> -----Original Message----- > From: linux-nfs-owner@xxxxxxxxxxxxxxx [mailto:linux-nfs-owner@xxxxxxxxxxxxxxx] On Behalf Of Myklebust, > Trond > Sent: Monday, May 28, 2012 12:30 AM > To: Peng Tao > Cc: linux-nfs@xxxxxxxxxxxxxxx; Peng, Tao > Subject: Re: [PATCH 1/3] NFS41: add pnfs_dio_begin/dio_end > > On Sun, 2012-05-27 at 13:32 +0800, Peng Tao wrote: > > To allow layout driver specific preparation for DIO. > > > > Signed-off-by: Peng Tao <tao.peng@xxxxxxx> > > --- > > fs/nfs/direct.c | 43 +++++++++++++++++++++++++++++++++++++++---- > > fs/nfs/pnfs.h | 38 ++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 77 insertions(+), 4 deletions(-) > > > > diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c > > index ad2775d..8e9c8e1 100644 > > --- a/fs/nfs/direct.c > > +++ b/fs/nfs/direct.c > > @@ -383,6 +383,37 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor > *de > > return result < 0 ? (ssize_t) result : -EFAULT; > > } > > > > +static void nfs_direct_read_init(struct nfs_pageio_descriptor *pgio, > > + struct inode *inode, const struct iovec *iov, > > + unsigned long nr_segs, loff_t pos, > > + struct blk_plug *plug) > > +{ > > + if (pnfs_dio_begin(inode, iov, nr_segs, pos, plug)) > > + pnfs_pageio_init_read(pgio, inode, > > + &nfs_direct_read_completion_ops); > > + else > > + nfs_pageio_init_read_mds(pgio, inode, > > + &nfs_direct_read_completion_ops); > > +} > > + > > +static void nfs_direct_write_init(struct nfs_pageio_descriptor *pgio, > > + struct inode *inode, const struct iovec *iov, > > + unsigned long nr_segs, loff_t pos, > > + struct blk_plug *plug) > > +{ > > + if (pnfs_dio_begin(inode, iov, nr_segs, pos, plug)) > > + pnfs_pageio_init_write(pgio, inode, FLUSH_COND_STABLE, > > + &nfs_direct_write_completion_ops); > > + else > > + nfs_pageio_init_write_mds(pgio, inode, FLUSH_COND_STABLE, > > + &nfs_direct_write_completion_ops); > > +} > > + > > +static void nfs_dio_end(struct inode *inode, struct blk_plug *plug) > > +{ > > + pnfs_dio_end(inode, plug); > > +} > > + > > static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, > > const struct iovec *iov, > > unsigned long nr_segs, > > @@ -392,9 +423,10 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, > > ssize_t result = -EINVAL; > > size_t requested_bytes = 0; > > unsigned long seg; > > + struct blk_plug plug; > > + > > + nfs_direct_read_init(&desc, dreq->inode, iov, nr_segs, pos, &plug); > > > > - nfs_pageio_init_read(&desc, dreq->inode, > > - &nfs_direct_read_completion_ops); > > get_dreq(dreq); > > desc.pg_dreq = dreq; > > > > @@ -410,6 +442,7 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, > > } > > > > nfs_pageio_complete(&desc); > > + nfs_dio_end(dreq->inode, &plug); > > Why can't you just put this in pg_init/pg_doio? There is already a flag > in the nfs_pageio_descriptor that tells you if more i/o is due (see > pg_moreio). > There should be no need to add extra callbacks in the generic code for > any of this. > I'm afraid there is. There is no way to pass struct blk_plug around pg_init/pg_doio, unless we put it in struct nfs_pageio_descriptor, which I think is more intrusive and less efficient as it is only useful for block layout driver in DIO case. Thanks, Tao ��.n��������+%������w��{.n�����{��w���jg��������ݢj����G�������j:+v���w�m������w�������h�����٥