bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#9157: [PATCH] dd: sparse conv flag


From: Roman Rybalko (devel)
Subject: bug#9157: [PATCH] dd: sparse conv flag
Date: Mon, 12 Dec 2011 00:02:51 +0400
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.23) Gecko/20110922 Thunderbird/3.1.15

On 10.12.2011 14:09, Jim Meyering wrote:
> Here are some things we'll have to consider before
> adding a new hole-punching option to dd:
>
> Your patch may create a hole in the destination for each sequence of
> length seek_size or greater of zero bytes in the input.
> As you may have seen in the cp-related discussion, one may
> want different options:
>   - preserve a file's hole/non-hole structure
>   - efficiently detect existing holes and fill them with explicit zeros in 
> dest
>   - efficiently detect existing holes and seek-in-dest for each sequence of
>         zeros (longer than some minimum) in non-hole input
Okay, I'll think about that.
That's a clear task.
>> diff --git a/doc/coreutils.texi b/doc/coreutils.texi
>> index 424446c..761c698 100644
>> --- a/doc/coreutils.texi
>> +++ b/doc/coreutils.texi
>> @@ -8127,6 +8127,10 @@ Pad every input block to size of @samp{ibs} with 
>> trailing zero bytes.
>>  When used with @samp{block} or @samp{unblock}, pad with spaces instead of
>>  zero bytes.
>>
>> address@hidden sparse
>> address@hidden sparse
>> +Make sparse output file.
> Please say a little more here.
> I.e., when might a hole be introduced?
> When is this option useful?
Okay.
>> @@ -985,6 +990,21 @@ iwrite (int fd, char const *buf, size_t size)
>>      {
>>        ssize_t nwritten;
>>        process_signals ();
>> +      if (conversions_mask & C_SPARSE)
>> +        {
>> +          off_t seek_size = 0;
>> +          while (total_written + seek_size < size && buf[total_written + 
>> seek_size] == 0)
>> +            ++seek_size;
>> +          if (seek_size)
>> +            {
>> +              off_t cur_off = 0;
>> +              cur_off = lseek(fd, seek_size, SEEK_CUR);
>> +              if (cur_off < 0)
>> +                break;
> dd must not ignore lseek failure.
That's a problem for me.
How would be suitable to handle lseek failure?
Perhaps with new kernel API this code may be obsoleted.
>> @@ -0,0 +1,70 @@
>> +#!/bin/sh
>> +# Ensure that dd conv=sparse works.
>> +
>> +# Copyright (C) 2003, 2005-2011 Free Software Foundation, Inc.
> Use only 2011 as the copyright year.
Okay.
>> +# sometimes we may read less than 1M
>> +dd if=/dev/zero of=sample0 count=1 bs=1M 2> /dev/null || fail=1
>> +[ "`stat -c %s sample0`" = "1048576" ] || fail=1
> We'd write that like this instead:
> (note use of test, not "[...]", use of $(...), not `...`)
>
> test "$(stat -c %s sample0)" = 1048576 || fail=1
Okay.

-- 
WBR,
Roman Rybalko






reply via email to

[Prev in Thread] Current Thread [Next in Thread]