On 2019/8/16 9:02, Jaegeuk Kim wrote:
> On 08/16, Chao Yu wrote:
>> On 2019/8/16 6:21, Jaegeuk Kim wrote:
>>> On 08/12, Chao Yu wrote:
>>>> On 2019/8/9 23:12, Jaegeuk Kim wrote:
>>>>> We actually don't need to issue trim on entire disk by checking first
>>>>> blocks having zeros.
>>>>
>>>> In heap mode, we locate node log header to tail end of device, should we
>>>> consider to check block contain according to heap option?
>>>
>>> I wanted to check F2FS metadata mainly.
>>
>> Oh, I thought you mean main area. :P
>>
>>>
>>>>
>>>> BTW, if we changed cp_ver whenever mkfs, why should we still issue trim to
>>>> obsolete old data in node remained in image?
>>>
>>> For simplicity. :P
>>
>> I didn't get why we can assume all metadata are zeroed if first 16MB are all 
>> zero...
>>
>> BTW, if first 16MB are non-zero, why not just trim F2FS metadata rather than
>> whole area?
> 
> Trim the entire space so that we can skip discard in runtime by the flag, 
> right?

You're right, thanks helping recall. ;)

Thanks,

> 
>>
>> Thanks,
>>
>>>
>>>>
>>>> Thanks,
>>>>
>>>>>
>>>>> Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org>
>>>>> ---
>>>>> v2 from v1:
>>>>>  - clean up
>>>>>
>>>>>  mkfs/f2fs_format_utils.c | 53 ++++++++++++++++++++++++++++++++++++++--
>>>>>  1 file changed, 51 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/mkfs/f2fs_format_utils.c b/mkfs/f2fs_format_utils.c
>>>>> index 8bf128c..f2d55ad 100644
>>>>> --- a/mkfs/f2fs_format_utils.c
>>>>> +++ b/mkfs/f2fs_format_utils.c
>>>>> @@ -25,6 +25,7 @@
>>>>>  #include <stdio.h>
>>>>>  #include <unistd.h>
>>>>>  #include <stdlib.h>
>>>>> +#include <stdbool.h>
>>>>>  #ifndef ANDROID_WINDOWS_HOST
>>>>>  #include <sys/ioctl.h>
>>>>>  #endif
>>>>> @@ -110,13 +111,61 @@ static int trim_device(int i)
>>>>>   return 0;
>>>>>  }
>>>>>  
>>>>> +static bool is_wiped_device(int i)
>>>>> +{
>>>>> +#ifdef WITH_ANDROID
>>>>> + struct device_info *dev = c.devices + i;
>>>>> + int fd = dev->fd;
>>>>> + char *buf, *zero_buf;
>>>>> + bool wiped = true;
>>>>> + int nblocks = 4096;     /* 16MB size */
>>>>> + int j;
>>>>> +
>>>>> + buf = malloc(F2FS_BLKSIZE);
>>>>> + if (buf == NULL) {
>>>>> +         MSG(1, "\tError: Malloc Failed for buf!!!\n");
>>>>> +         return false;
>>>>> + }
>>>>> + zero_buf = calloc(1, F2FS_BLKSIZE);
>>>>> + if (zero_buf == NULL) {
>>>>> +         MSG(1, "\tError: Calloc Failed for zero buf!!!\n");
>>>>> +         free(buf);
>>>>> +         return false;
>>>>> + }
>>>>> +
>>>>> + if (lseek(fd, 0, SEEK_SET) < 0) {
>>>>> +         free(zero_buf);
>>>>> +         free(buf);
>>>>> +         return false;
>>>>> + }
>>>>> +
>>>>> + /* check first n blocks */
>>>>> + for (j = 0; j < nblocks; j++) {
>>>>> +         if (read(fd, buf, F2FS_BLKSIZE) != F2FS_BLKSIZE ||
>>>>> +                         memcmp(buf, zero_buf, F2FS_BLKSIZE)) {
>>>>> +                 wiped = false;
>>>>> +                 break;
>>>>> +         }
>>>>> + }
>>>>> + free(zero_buf);
>>>>> + free(buf);
>>>>> +
>>>>> + if (wiped)
>>>>> +         MSG(0, "Info: Found all zeros in first %d blocks\n", nblocks);
>>>>> + return wiped;
>>>>> +#else
>>>>> + return false;
>>>>> +#endif
>>>>> +}
>>>>> +
>>>>>  int f2fs_trim_devices(void)
>>>>>  {
>>>>>   int i;
>>>>>  
>>>>> - for (i = 0; i < c.ndevs; i++)
>>>>> -         if (trim_device(i))
>>>>> + for (i = 0; i < c.ndevs; i++) {
>>>>> +         if (!is_wiped_device(i) && trim_device(i))
>>>>>                   return -1;
>>>>> + }
>>>>>   c.trimmed = 1;
>>>>>   return 0;
>>>>>  }
>>>>>
>>> .
>>>
> .
> 


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to