On Thu, Apr 9, 2015 at 11:02 AM, Peng Tao <tao.peng@xxxxxxxxxxxxxxx> wrote: > For direct read that has IO size larger than rsize, we'll split > it into several READ requests and nfs_direct_good_bytes() would > count completed bytes incorrectly by eating last zero count reply. > > Fix it by handling mirror and non-mirror cases differently such that > we only count mirrored writes differently. > > This fixes 5fadeb47("nfs: count DIO good bytes correctly with mirroring"). > > Reported-by: Jean Spector <jean@xxxxxxxxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> # v3.19+ > Signed-off-by: Peng Tao <tao.peng@xxxxxxxxxxxxxxx> This one (and 2/2 in the series) have been setting here with no comments for a while now. Are these going to get picked up for 4.1? We have a couple of bug reports against 3.19 that these should fix, so I'm curious if they're headed in-tree. josh > --- > fs/nfs/direct.c | 29 +++++++++++++++++------------ > 1 file changed, 17 insertions(+), 12 deletions(-) > > diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c > index e907c8c..5e451a7 100644 > --- a/fs/nfs/direct.c > +++ b/fs/nfs/direct.c > @@ -131,20 +131,25 @@ nfs_direct_good_bytes(struct nfs_direct_req *dreq, struct nfs_pgio_header *hdr) > > WARN_ON_ONCE(hdr->pgio_mirror_idx >= dreq->mirror_count); > > - count = dreq->mirrors[hdr->pgio_mirror_idx].count; > - if (count + dreq->io_start < hdr->io_start + hdr->good_bytes) { > - count = hdr->io_start + hdr->good_bytes - dreq->io_start; > - dreq->mirrors[hdr->pgio_mirror_idx].count = count; > - } > - > - /* update the dreq->count by finding the minimum agreed count from all > - * mirrors */ > - count = dreq->mirrors[0].count; > + if (dreq->mirror_count == 1) { > + dreq->mirrors[hdr->pgio_mirror_idx].count += hdr->good_bytes; > + dreq->count += hdr->good_bytes; > + } else { > + /* mirrored writes */ > + count = dreq->mirrors[hdr->pgio_mirror_idx].count; > + if (count + dreq->io_start < hdr->io_start + hdr->good_bytes) { > + count = hdr->io_start + hdr->good_bytes - dreq->io_start; > + dreq->mirrors[hdr->pgio_mirror_idx].count = count; > + } > + /* update the dreq->count by finding the minimum agreed count from all > + * mirrors */ > + count = dreq->mirrors[0].count; > > - for (i = 1; i < dreq->mirror_count; i++) > - count = min(count, dreq->mirrors[i].count); > + for (i = 1; i < dreq->mirror_count; i++) > + count = min(count, dreq->mirrors[i].count); > > - dreq->count = count; > + dreq->count = count; > + } > } > > /* > -- > 1.9.1 > > -- > To unsubscribe from this list: send the line "unsubscribe stable" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html