RE: [PATCH v8 11/11] xfstests: fsx: Add fallocate insert range operation

2015-01-15 Thread Namjae Jeon

> >
> > > > }
> > > > do_collapse_range(offset, size);
> > > > break;
> > > > +   case OP_INSERT_RANGE:
> > > > +   TRIM_OFF(offset, file_size);
> > > > +   TRIM_LEN(offset, size, maxfilelen - file_size);
> > >
> > > Ugh, I hit a crash down in do_insert_range() due to the memset() on
> > > good_buf going off the end of the buffer. It looks like the TRIM_LEN()
> > > here is not correct and can result in a really large length value.
> > >
> > > Perhaps something like TRIM_LEN(file_size, length, maxfilelen) is what
> > > we want for insert range ops?
> > Hi Brian,
> > Oops, Sorry about that.
> > And your change is correct.
> >
> > Could you review the below updated patch ?
> >
> 
> This one looks good. Also, I ran overnight with the same change and it
> went for 23m ops. Not sure why it ended up stopping as the output files
> compare fine. I'll get it running on another box and see if I can
> repeat.
> 
> Reviewed-by: Brian Foster 
Thanks you. If you find any issue, Please share with me.

> 
> > Thanks!
> >
> > --
> > Subject: [PATCH v9 11/11] xfstests: fsx: Add fallocate insert range 
> > operation
> >
> > This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx.
> >
> > Signed-off-by: Namjae Jeon 
> > Signed-off-by: Ashish Sangwan 
> > ---
> >  ltp/fsx.c |  124 
> > -
> >  1 files changed, 114 insertions(+), 10 deletions(-)
> >
> > diff --git a/ltp/fsx.c b/ltp/fsx.c
> > index 3709419..9fed5b2 100644
> > --- a/ltp/fsx.c
> > +++ b/ltp/fsx.c
> > @@ -95,7 +95,8 @@ int   logcount = 0;   /* total ops */
> >  #define OP_PUNCH_HOLE  6
> >  #define OP_ZERO_RANGE  7
> >  #define OP_COLLAPSE_RANGE  8
> > -#define OP_MAX_FULL9
> > +#define OP_INSERT_RANGE9
> > +#define OP_MAX_FULL10
> >
> >  /* operation modifiers */
> >  #define OP_CLOSEOPEN   100
> > @@ -145,6 +146,7 @@ int fallocate_calls = 1;/* -F flag 
> > disables */
> >  int punch_hole_calls = 1;   /* -H flag disables */
> >  int zero_range_calls = 1;   /* -z flag disables */
> >  intcollapse_range_calls = 1;   /* -C flag disables */
> > +intinsert_range_calls = 1; /* -i flag disables */
> >  intmapped_reads = 1;   /* -R flag disables it */
> >  intfsxgoodfd = 0;
> >  into_direct;   /* -Z */
> > @@ -339,6 +341,14 @@ logdump(void)
> >  lp->args[0] + lp->args[1])
> > prt("\t**");
> > break;
> > +   case OP_INSERT_RANGE:
> > +   prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)",
> > +   lp->args[0], lp->args[0] + lp->args[1] - 1,
> > +   lp->args[1]);
> > +   if (badoff >= lp->args[0] && badoff <
> > +lp->args[0] + lp->args[1])
> > +   prt("\t**");
> > +   break;
> > case OP_SKIPPED:
> > prt("SKIPPED (no operation)");
> > break;
> > @@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length)
> >  }
> >  #endif
> >
> > +#ifdef FALLOC_FL_INSERT_RANGE
> > +void
> > +do_insert_range(unsigned offset, unsigned length)
> > +{
> > +   unsigned end_offset;
> > +   int mode = FALLOC_FL_INSERT_RANGE;
> > +
> > +   if (length == 0) {
> > +   if (!quiet && testcalls > simulatedopcount)
> > +   prt("skipping zero length insert range\n");
> > +   log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
> > +   return;
> > +   }
> > +
> > +   if ((loff_t)offset >= file_size) {
> > +   if (!quiet && testcalls > simulatedopcount)
> > +   prt("skipping insert range behind EOF\n");
> > +   log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
> > +   return;
> > +   }
> > +
> > +   log4(OP_INSERT_RANGE, offset, length, 0);
> > +
> > +   if (testcalls <= simulatedopcount)
> > +   return;
> > +
> > +   end_offset = offset + length;
> > +   if ((progressinterval && testcalls % progressinterval == 0) ||
> > +   (debug && (monitorstart == -1 || monitorend == -1 ||
> > + end_offset <= monitorend))) {
> > +   prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
> > +   offset, offset+length, length);
> > +   }
> > +   if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
> > +   prt("insert range: %x to %x\n", offset, length);
> > +   prterr("do_insert_range: fallocate");
> > +   report_failure(161);
> > +   }
> > +
> > +   memmove(good_buf + end_offset, good_buf + offset

Re: [PATCH v8 11/11] xfstests: fsx: Add fallocate insert range operation

2015-01-15 Thread Brian Foster
On Thu, Jan 15, 2015 at 07:14:11PM +0900, Namjae Jeon wrote:
> 
> > >   }
> > >   do_collapse_range(offset, size);
> > >   break;
> > > + case OP_INSERT_RANGE:
> > > + TRIM_OFF(offset, file_size);
> > > + TRIM_LEN(offset, size, maxfilelen - file_size);
> > 
> > Ugh, I hit a crash down in do_insert_range() due to the memset() on
> > good_buf going off the end of the buffer. It looks like the TRIM_LEN()
> > here is not correct and can result in a really large length value.
> > 
> > Perhaps something like TRIM_LEN(file_size, length, maxfilelen) is what
> > we want for insert range ops?
> Hi Brian,
> Oops, Sorry about that.
> And your change is correct.
> 
> Could you review the below updated patch ?
> 

This one looks good. Also, I ran overnight with the same change and it
went for 23m ops. Not sure why it ended up stopping as the output files
compare fine. I'll get it running on another box and see if I can
repeat.

Reviewed-by: Brian Foster 

> Thanks!
> 
> --
> Subject: [PATCH v9 11/11] xfstests: fsx: Add fallocate insert range operation
> 
> This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx.
> 
> Signed-off-by: Namjae Jeon 
> Signed-off-by: Ashish Sangwan 
> ---
>  ltp/fsx.c |  124 
> -
>  1 files changed, 114 insertions(+), 10 deletions(-)
> 
> diff --git a/ltp/fsx.c b/ltp/fsx.c
> index 3709419..9fed5b2 100644
> --- a/ltp/fsx.c
> +++ b/ltp/fsx.c
> @@ -95,7 +95,8 @@ int logcount = 0;   /* total ops */
>  #define OP_PUNCH_HOLE6
>  #define OP_ZERO_RANGE7
>  #define OP_COLLAPSE_RANGE8
> -#define OP_MAX_FULL  9
> +#define OP_INSERT_RANGE  9
> +#define OP_MAX_FULL  10
>  
>  /* operation modifiers */
>  #define OP_CLOSEOPEN 100
> @@ -145,6 +146,7 @@ int fallocate_calls = 1;/* -F flag 
> disables */
>  int punch_hole_calls = 1;   /* -H flag disables */
>  int zero_range_calls = 1;   /* -z flag disables */
>  int  collapse_range_calls = 1;   /* -C flag disables */
> +int  insert_range_calls = 1; /* -i flag disables */
>  int  mapped_reads = 1;   /* -R flag disables it */
>  int  fsxgoodfd = 0;
>  int  o_direct;   /* -Z */
> @@ -339,6 +341,14 @@ logdump(void)
>lp->args[0] + lp->args[1])
>   prt("\t**");
>   break;
> + case OP_INSERT_RANGE:
> + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)",
> + lp->args[0], lp->args[0] + lp->args[1] - 1,
> + lp->args[1]);
> + if (badoff >= lp->args[0] && badoff <
> +  lp->args[0] + lp->args[1])
> + prt("\t**");
> + break;
>   case OP_SKIPPED:
>   prt("SKIPPED (no operation)");
>   break;
> @@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length)
>  }
>  #endif
>  
> +#ifdef FALLOC_FL_INSERT_RANGE
> +void
> +do_insert_range(unsigned offset, unsigned length)
> +{
> + unsigned end_offset;
> + int mode = FALLOC_FL_INSERT_RANGE;
> +
> + if (length == 0) {
> + if (!quiet && testcalls > simulatedopcount)
> + prt("skipping zero length insert range\n");
> + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
> + return;
> + }
> +
> + if ((loff_t)offset >= file_size) {
> + if (!quiet && testcalls > simulatedopcount)
> + prt("skipping insert range behind EOF\n");
> + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
> + return;
> + }
> +
> + log4(OP_INSERT_RANGE, offset, length, 0);
> +
> + if (testcalls <= simulatedopcount)
> + return;
> +
> + end_offset = offset + length;
> + if ((progressinterval && testcalls % progressinterval == 0) ||
> + (debug && (monitorstart == -1 || monitorend == -1 ||
> +   end_offset <= monitorend))) {
> + prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
> + offset, offset+length, length);
> + }
> + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
> + prt("insert range: %x to %x\n", offset, length);
> + prterr("do_insert_range: fallocate");
> + report_failure(161);
> + }
> +
> + memmove(good_buf + end_offset, good_buf + offset,
> + file_size - offset);
> + memset(good_buf + offset, '\0', length);
> + file_size += length;
> +}
> +
> +#else
> +void
> +do_insert_range(unsigned offset, unsigned length)
> +{
> + return;
> +}
> +#endif

RE: [PATCH v8 11/11] xfstests: fsx: Add fallocate insert range operation

2015-01-15 Thread Namjae Jeon

> > }
> > do_collapse_range(offset, size);
> > break;
> > +   case OP_INSERT_RANGE:
> > +   TRIM_OFF(offset, file_size);
> > +   TRIM_LEN(offset, size, maxfilelen - file_size);
> 
> Ugh, I hit a crash down in do_insert_range() due to the memset() on
> good_buf going off the end of the buffer. It looks like the TRIM_LEN()
> here is not correct and can result in a really large length value.
> 
> Perhaps something like TRIM_LEN(file_size, length, maxfilelen) is what
> we want for insert range ops?
Hi Brian,
Oops, Sorry about that.
And your change is correct.

Could you review the below updated patch ?

Thanks!

--
Subject: [PATCH v9 11/11] xfstests: fsx: Add fallocate insert range operation

This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx.

Signed-off-by: Namjae Jeon 
Signed-off-by: Ashish Sangwan 
---
 ltp/fsx.c |  124 -
 1 files changed, 114 insertions(+), 10 deletions(-)

diff --git a/ltp/fsx.c b/ltp/fsx.c
index 3709419..9fed5b2 100644
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -95,7 +95,8 @@ int   logcount = 0;   /* total ops */
 #define OP_PUNCH_HOLE  6
 #define OP_ZERO_RANGE  7
 #define OP_COLLAPSE_RANGE  8
-#define OP_MAX_FULL9
+#define OP_INSERT_RANGE9
+#define OP_MAX_FULL10
 
 /* operation modifiers */
 #define OP_CLOSEOPEN   100
@@ -145,6 +146,7 @@ int fallocate_calls = 1;/* -F flag disables 
*/
 int punch_hole_calls = 1;   /* -H flag disables */
 int zero_range_calls = 1;   /* -z flag disables */
 intcollapse_range_calls = 1;   /* -C flag disables */
+intinsert_range_calls = 1; /* -i flag disables */
 intmapped_reads = 1;   /* -R flag disables it */
 intfsxgoodfd = 0;
 into_direct;   /* -Z */
@@ -339,6 +341,14 @@ logdump(void)
 lp->args[0] + lp->args[1])
prt("\t**");
break;
+   case OP_INSERT_RANGE:
+   prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)",
+   lp->args[0], lp->args[0] + lp->args[1] - 1,
+   lp->args[1]);
+   if (badoff >= lp->args[0] && badoff <
+lp->args[0] + lp->args[1])
+   prt("\t**");
+   break;
case OP_SKIPPED:
prt("SKIPPED (no operation)");
break;
@@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length)
 }
 #endif
 
+#ifdef FALLOC_FL_INSERT_RANGE
+void
+do_insert_range(unsigned offset, unsigned length)
+{
+   unsigned end_offset;
+   int mode = FALLOC_FL_INSERT_RANGE;
+
+   if (length == 0) {
+   if (!quiet && testcalls > simulatedopcount)
+   prt("skipping zero length insert range\n");
+   log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
+   return;
+   }
+
+   if ((loff_t)offset >= file_size) {
+   if (!quiet && testcalls > simulatedopcount)
+   prt("skipping insert range behind EOF\n");
+   log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
+   return;
+   }
+
+   log4(OP_INSERT_RANGE, offset, length, 0);
+
+   if (testcalls <= simulatedopcount)
+   return;
+
+   end_offset = offset + length;
+   if ((progressinterval && testcalls % progressinterval == 0) ||
+   (debug && (monitorstart == -1 || monitorend == -1 ||
+ end_offset <= monitorend))) {
+   prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
+   offset, offset+length, length);
+   }
+   if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
+   prt("insert range: %x to %x\n", offset, length);
+   prterr("do_insert_range: fallocate");
+   report_failure(161);
+   }
+
+   memmove(good_buf + end_offset, good_buf + offset,
+   file_size - offset);
+   memset(good_buf + offset, '\0', length);
+   file_size += length;
+}
+
+#else
+void
+do_insert_range(unsigned offset, unsigned length)
+{
+   return;
+}
+#endif
+
 #ifdef HAVE_LINUX_FALLOC_H
 /* fallocate is basically a no-op unless extending, then a lot like a truncate 
*/
 void
@@ -1117,14 +1180,25 @@ docloseopen(void)
}
 }
 
-#define TRIM_OFF_LEN(off, len, size)   \
-do {   \
-   if (size)   \
-   (off) %= (size);\
-   else\
-   (off) = 0;  \
-   if ((off) 

Re: [PATCH v8 11/11] xfstests: fsx: Add fallocate insert range operation

2015-01-14 Thread Brian Foster
On Wed, Jan 14, 2015 at 01:05:26AM +0900, Namjae Jeon wrote:
> From: Namjae Jeon 
> 
> This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx.
> 
> Signed-off-by: Namjae Jeon 
> Signed-off-by: Ashish Sangwan 
> Cc: Brian Foster
> ---
> Changelog
> v8:
>  - create TRIM_OFF() and TRIM_LEN() and redeine redefine TRIM_OFF_LEN().
> 
>  ltp/fsx.c |  122 
> -
>  1 file changed, 113 insertions(+), 9 deletions(-)
> 
> diff --git a/ltp/fsx.c b/ltp/fsx.c
> index 3709419..741af34 100644
> --- a/ltp/fsx.c
> +++ b/ltp/fsx.c
> @@ -95,7 +95,8 @@ int logcount = 0;   /* total ops */
>  #define OP_PUNCH_HOLE6
>  #define OP_ZERO_RANGE7
>  #define OP_COLLAPSE_RANGE8
> -#define OP_MAX_FULL  9
> +#define OP_INSERT_RANGE  9
> +#define OP_MAX_FULL  10
>  
>  /* operation modifiers */
>  #define OP_CLOSEOPEN 100
> @@ -145,6 +146,7 @@ int fallocate_calls = 1;/* -F flag 
> disables */
>  int punch_hole_calls = 1;   /* -H flag disables */
>  int zero_range_calls = 1;   /* -z flag disables */
>  int  collapse_range_calls = 1;   /* -C flag disables */
> +int  insert_range_calls = 1; /* -i flag disables */
>  int  mapped_reads = 1;   /* -R flag disables it */
>  int  fsxgoodfd = 0;
>  int  o_direct;   /* -Z */
> @@ -339,6 +341,14 @@ logdump(void)
>lp->args[0] + lp->args[1])
>   prt("\t**");
>   break;
> + case OP_INSERT_RANGE:
> + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)",
> + lp->args[0], lp->args[0] + lp->args[1] - 1,
> + lp->args[1]);
> + if (badoff >= lp->args[0] && badoff <
> +  lp->args[0] + lp->args[1])
> + prt("\t**");
> + break;
>   case OP_SKIPPED:
>   prt("SKIPPED (no operation)");
>   break;
> @@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length)
>  }
>  #endif
>  
> +#ifdef FALLOC_FL_INSERT_RANGE
> +void
> +do_insert_range(unsigned offset, unsigned length)
> +{
> + unsigned end_offset;
> + int mode = FALLOC_FL_INSERT_RANGE;
> +
> + if (length == 0) {
> + if (!quiet && testcalls > simulatedopcount)
> + prt("skipping zero length insert range\n");
> + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
> + return;
> + }
> +
> + if ((loff_t)offset >= file_size) {
> + if (!quiet && testcalls > simulatedopcount)
> + prt("skipping insert range behind EOF\n");
> + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
> + return;
> + }
> +
> + log4(OP_INSERT_RANGE, offset, length, 0);
> +
> + if (testcalls <= simulatedopcount)
> + return;
> +
> + end_offset = offset + length;
> + if ((progressinterval && testcalls % progressinterval == 0) ||
> + (debug && (monitorstart == -1 || monitorend == -1 ||
> +   end_offset <= monitorend))) {
> + prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
> + offset, offset+length, length);
> + }
> + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
> + prt("insert range: %x to %x\n", offset, length);
> + prterr("do_insert_range: fallocate");
> + report_failure(161);
> + }
> +
> + memmove(good_buf + end_offset, good_buf + offset,
> + file_size - offset);
> + memset(good_buf + offset, '\0', length);
> + file_size += length;
> +}
> +
> +#else
> +void
> +do_insert_range(unsigned offset, unsigned length)
> +{
> + return;
> +}
> +#endif
> +
>  #ifdef HAVE_LINUX_FALLOC_H
>  /* fallocate is basically a no-op unless extending, then a lot like a 
> truncate */
>  void
> @@ -1117,14 +1180,25 @@ docloseopen(void)
>   }
>  }
>  
> -#define TRIM_OFF_LEN(off, len, size) \
> -do { \
> - if (size)   \
> +
> +#define TRIM_OFF(off, size)  \
> +do { \
> + if (size)   \
>   (off) %= (size);\
> - else\
> - (off) = 0;  \
> - if ((off) + (len) > (size)) \
> - (len) = (size) - (off); \
> + else\
> + (off) = 0;  \
> +} while (0)
> +
> +#define TRIM_LEN(off, len, size) \
> +do { \
> + if ((off) + (len) > (size)) \
> + (len) = (size) 

[PATCH v8 11/11] xfstests: fsx: Add fallocate insert range operation

2015-01-13 Thread Namjae Jeon
From: Namjae Jeon 

This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx.

Signed-off-by: Namjae Jeon 
Signed-off-by: Ashish Sangwan 
Cc: Brian Foster
---
Changelog
v8:
 - create TRIM_OFF() and TRIM_LEN() and redeine redefine TRIM_OFF_LEN().

 ltp/fsx.c |  122 -
 1 file changed, 113 insertions(+), 9 deletions(-)

diff --git a/ltp/fsx.c b/ltp/fsx.c
index 3709419..741af34 100644
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -95,7 +95,8 @@ int   logcount = 0;   /* total ops */
 #define OP_PUNCH_HOLE  6
 #define OP_ZERO_RANGE  7
 #define OP_COLLAPSE_RANGE  8
-#define OP_MAX_FULL9
+#define OP_INSERT_RANGE9
+#define OP_MAX_FULL10
 
 /* operation modifiers */
 #define OP_CLOSEOPEN   100
@@ -145,6 +146,7 @@ int fallocate_calls = 1;/* -F flag disables 
*/
 int punch_hole_calls = 1;   /* -H flag disables */
 int zero_range_calls = 1;   /* -z flag disables */
 intcollapse_range_calls = 1;   /* -C flag disables */
+intinsert_range_calls = 1; /* -i flag disables */
 intmapped_reads = 1;   /* -R flag disables it */
 intfsxgoodfd = 0;
 into_direct;   /* -Z */
@@ -339,6 +341,14 @@ logdump(void)
 lp->args[0] + lp->args[1])
prt("\t**");
break;
+   case OP_INSERT_RANGE:
+   prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)",
+   lp->args[0], lp->args[0] + lp->args[1] - 1,
+   lp->args[1]);
+   if (badoff >= lp->args[0] && badoff <
+lp->args[0] + lp->args[1])
+   prt("\t**");
+   break;
case OP_SKIPPED:
prt("SKIPPED (no operation)");
break;
@@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length)
 }
 #endif
 
+#ifdef FALLOC_FL_INSERT_RANGE
+void
+do_insert_range(unsigned offset, unsigned length)
+{
+   unsigned end_offset;
+   int mode = FALLOC_FL_INSERT_RANGE;
+
+   if (length == 0) {
+   if (!quiet && testcalls > simulatedopcount)
+   prt("skipping zero length insert range\n");
+   log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
+   return;
+   }
+
+   if ((loff_t)offset >= file_size) {
+   if (!quiet && testcalls > simulatedopcount)
+   prt("skipping insert range behind EOF\n");
+   log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length);
+   return;
+   }
+
+   log4(OP_INSERT_RANGE, offset, length, 0);
+
+   if (testcalls <= simulatedopcount)
+   return;
+
+   end_offset = offset + length;
+   if ((progressinterval && testcalls % progressinterval == 0) ||
+   (debug && (monitorstart == -1 || monitorend == -1 ||
+ end_offset <= monitorend))) {
+   prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
+   offset, offset+length, length);
+   }
+   if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
+   prt("insert range: %x to %x\n", offset, length);
+   prterr("do_insert_range: fallocate");
+   report_failure(161);
+   }
+
+   memmove(good_buf + end_offset, good_buf + offset,
+   file_size - offset);
+   memset(good_buf + offset, '\0', length);
+   file_size += length;
+}
+
+#else
+void
+do_insert_range(unsigned offset, unsigned length)
+{
+   return;
+}
+#endif
+
 #ifdef HAVE_LINUX_FALLOC_H
 /* fallocate is basically a no-op unless extending, then a lot like a truncate 
*/
 void
@@ -1117,14 +1180,25 @@ docloseopen(void)
}
 }
 
-#define TRIM_OFF_LEN(off, len, size)   \
-do {   \
-   if (size)   \
+
+#define TRIM_OFF(off, size)\
+do {   \
+   if (size)   \
(off) %= (size);\
-   else\
-   (off) = 0;  \
-   if ((off) + (len) > (size)) \
-   (len) = (size) - (off); \
+   else\
+   (off) = 0;  \
+} while (0)
+
+#define TRIM_LEN(off, len, size)   \
+do {   \
+   if ((off) + (len) > (size)) \
+   (len) = (size) - (off); \
+} while (0)
+
+#define TRIM_OFF_LEN(off, len, size)   \
+do {   \
+   TRIM_OFF(off, size);