When instantiating a layout, the server interprets the
write intent from the client as the range [start, end), not
including the last byte.
This is correct for writes because the last byte given for
a write is actually 'endpos', the resulting file pointer
position, and so is not included.
However, truncate is specifiying a size, not an endpos, so
truncate is [start, size]. To make this work with the
[start, end) processing for write_intents, we have to add
1 to the size when sending a write intent.
Without this, a truncate operation to the first byte of a
new layout component fails silently because the component
is not instantiated.
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: Id2b07abe73455bf1f0ed841ad08c5f381a871315
Reviewed-on: https://review.whamcloud.com/35607
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Mike Pershin <mpershin@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
*/
if (cl_io_is_trunc(io)) {
io->ci_write_intent.e_start = 0;
*/
if (cl_io_is_trunc(io)) {
io->ci_write_intent.e_start = 0;
- io->ci_write_intent.e_end = io->u.ci_setattr.sa_attr.lvb_size;
+ /* for writes, e_end is endpos, the location of the file
+ * pointer after the write is completed, so it is not accessed.
+ * For truncate, 'end' is the size, and *is* acccessed.
+ * In other words, writes are [start, end), but truncate is
+ * [start, size], where both are included. So add 1 to the
+ * size when creating the write intent to account for this.
+ */
+ io->ci_write_intent.e_end =
+ io->u.ci_setattr.sa_attr.lvb_size + 1;
} else {
io->ci_write_intent.e_start = lio->lis_pos;
io->ci_write_intent.e_end = lio->lis_endpos;
} else {
io->ci_write_intent.e_start = lio->lis_pos;
io->ci_write_intent.e_end = lio->lis_endpos;
[[ -n $f4 ]] && error "1: 4th component instantiated"
# the first 2 components instantiated
[[ -n $f4 ]] && error "1: 4th component instantiated"
# the first 2 components instantiated
- $TRUNCATE $comp_file $((1024*1024*1+1))
+ # Truncate to exact start of new component - LU-12586
+ $TRUNCATE $comp_file $((1024*1024*1))
f2=$($LFS getstripe -I2 $comp_file | grep "l_fid")
[[ -z $f2 ]] && error "2: 2nd component uninstantiated"
f2=$($LFS getstripe -I2 $comp_file | grep "l_fid")
[[ -z $f2 ]] && error "2: 2nd component uninstantiated"
[[ -n $f4 ]] && error "2: 4th component instantiated"
# the first 3 components instantiated
[[ -n $f4 ]] && error "2: 4th component instantiated"
# the first 3 components instantiated
- $TRUNCATE $comp_file $((1024*1024*3))
+ $TRUNCATE $comp_file $((1024*1024*3 - 1))
$TRUNCATE $comp_file $((1024*1024*1+1))
f2=$($LFS getstripe -I2 $comp_file | grep "l_fid")
$TRUNCATE $comp_file $((1024*1024*1+1))
f2=$($LFS getstripe -I2 $comp_file | grep "l_fid")