From: Eryu Guan <guaneryu@gmail.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: Eryu Guan <eguan@linux.alibaba.com>, fstests@vger.kernel.org
Subject: Re: [PATCH] ltp/fsx: avoid infinite loop while finding offset2 in clone/dedupe/copy range ops
Date: Sat, 24 Aug 2019 09:07:38 +0800 [thread overview]
Message-ID: <20190824010738.GD2845@desktop> (raw)
In-Reply-To: <20190823143354.GL1037422@magnolia>
On Fri, Aug 23, 2019 at 07:33:54AM -0700, Darrick J. Wong wrote:
> On Fri, Aug 23, 2019 at 03:22:59PM +0800, Eryu Guan wrote:
> > In CLONE/DEDUPE/COPY RANGE operations, we pick a "offset" and "size"
> > first, then find a suitable "offset2" by looping if there's overlap
> > (|offset2-offset| < size) or final file size is greater than max file
> > size (offset2 + size > maxfilelen).
> >
> > But it's possible that there's no such suitable offset2 and we loop
> > forever. e.g. block_size = 4096, offset = 0, size = 4096 and maxfilelen
> > is a value smaller than 8212 (which could be set via '-l' option).
> >
> > Fix it by making sure maxfilelen/file_size is big enough to hold 'size'
> > bytes from 'offset2', and just skip this operation if not.
> >
> > Signed-off-by: Eryu Guan <eguan@linux.alibaba.com>
> > ---
> > ltp/fsx.c | 11 +++++++++++
> > 1 file changed, 11 insertions(+)
> >
> > diff --git a/ltp/fsx.c b/ltp/fsx.c
> > index 06d08e4e93f3..f6eb3308e8bc 100644
> > --- a/ltp/fsx.c
> > +++ b/ltp/fsx.c
> > @@ -1825,6 +1825,14 @@ do { \
> > TRIM_LEN(off, len, size); \
> > } while (0)
> >
> > +#define CHECK_RANGE(off, len, size) \
> > +do { \
> > + if ((off + len * 2) > size) { \
> > + log5(op, offset, size, -1, FL_SKIPPED); \
> > + goto out; \
> > + } \
> > +} while (0)
>
> Eww, macros.
>
> Worse, macros that don't parenthesize the arguments.
>
> Worse^2, macros that require variables to be defined in the caller's
> scope that aren't passed as explicit parameters.
>
> Worse^3, macros with gotos.
Yeah, these are ugly :) I was meant to define this macro in the context
where it's used, and undefine it when it's out of scope.
>
> Why not:
>
> static inline bool CHECK_RANGE(...)
> {
> bool ret = ((off + len * 2) <= size);
>
> if (!ret)
> log5(...);
> return ret;
> }
>
> and then
>
> if (!CHECK_RANGE(offset, size, maxfilelen))
> goto out;
Looks good, will rework. Thanks for the review!
Eryu
>
> --D
>
> }
> > +
> > void
> > cleanup(int sig)
> > {
> > @@ -1989,6 +1997,7 @@ test(void)
> > TRIM_OFF_LEN(offset, size, file_size);
> > offset = offset & ~(block_size - 1);
> > size = size & ~(block_size - 1);
> > + CHECK_RANGE(offset, size, maxfilelen);
> > do {
> > offset2 = random();
> > TRIM_OFF(offset2, maxfilelen);
> > @@ -2003,6 +2012,7 @@ test(void)
> > TRIM_OFF_LEN(offset, size, file_size);
> > offset = offset & ~(block_size - 1);
> > size = size & ~(block_size - 1);
> > + CHECK_RANGE(offset, size, file_size);
> > do {
> > if (tries++ >= 30) {
> > size = 0;
> > @@ -2020,6 +2030,7 @@ test(void)
> > offset -= offset % readbdy;
> > if (o_direct)
> > size -= size % readbdy;
> > + CHECK_RANGE(offset, size, maxfilelen);
> > do {
> > offset2 = random();
> > TRIM_OFF(offset2, maxfilelen);
> > --
> > 2.14.4.44.g2045bb6
> >
prev parent reply other threads:[~2019-08-24 1:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-23 7:22 [PATCH] ltp/fsx: avoid infinite loop while finding offset2 in clone/dedupe/copy range ops Eryu Guan
2019-08-23 7:27 ` Eryu Guan
2019-08-23 14:33 ` Darrick J. Wong
2019-08-24 1:07 ` Eryu Guan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190824010738.GD2845@desktop \
--to=guaneryu@gmail.com \
--cc=darrick.wong@oracle.com \
--cc=eguan@linux.alibaba.com \
--cc=fstests@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.