git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] dir: support platforms that require aligned reads

From
René Scharfe <l.s.r@web.de>
Date
Jul 16, 2017, 15:18 UTC
Message-ID
<84b4d5aa-956f-932b-4e95-f181243215bc@web.de>
In-Reply-To
<20170716140409.3ywepgvo5c6ognsy@sigill.intra.peff.net>
Am 16.07.2017 um 16:04 schrieb Jeff King:
Show 47 quoted lines
> On Sun, Jul 16, 2017 at 02:17:37PM +0200, René Scharfe wrote:
> 
>> -static void stat_data_from_disk(struct stat_data *to, const struct stat_data *from)
>> +static void stat_data_from_disk(struct stat_data *to, const unsigned char *data)
>>   {
>> -	to->sd_ctime.sec  = get_be32(&from->sd_ctime.sec);
>> -	to->sd_ctime.nsec = get_be32(&from->sd_ctime.nsec);
>> -	to->sd_mtime.sec  = get_be32(&from->sd_mtime.sec);
>> -	to->sd_mtime.nsec = get_be32(&from->sd_mtime.nsec);
>> -	to->sd_dev	  = get_be32(&from->sd_dev);
>> -	to->sd_ino	  = get_be32(&from->sd_ino);
>> -	to->sd_uid	  = get_be32(&from->sd_uid);
>> -	to->sd_gid	  = get_be32(&from->sd_gid);
>> -	to->sd_size	  = get_be32(&from->sd_size);
>> +	memcpy(to, data, sizeof(*to));
>> +	to->sd_ctime.sec  = ntohl(to->sd_ctime.sec);
>> +	to->sd_ctime.nsec = ntohl(to->sd_ctime.nsec);
>> +	to->sd_mtime.sec  = ntohl(to->sd_mtime.sec);
>> +	to->sd_mtime.nsec = ntohl(to->sd_mtime.nsec);
>> +	to->sd_dev	  = ntohl(to->sd_dev);
>> +	to->sd_ino	  = ntohl(to->sd_ino);
>> +	to->sd_uid	  = ntohl(to->sd_uid);
>> +	to->sd_gid	  = ntohl(to->sd_gid);
>> +	to->sd_size	  = ntohl(to->sd_size);
>>   }
> 
> Hmm. I would have written this to pull the bytes directly out of the
> array, like:
> 
>    to->sd_ctime.sec  = get_be32(data); data += 4;
>    to->sd_ctime.nsec = get_be32(data); data += 4;
> 
> etc. Or even a helper to do the advancing like:
> 
>    to->sd_ctime.sec = parse_be32(&data);
> 
> That reduces assumptions about padding in "struct stat_data". But
> looking more at this code, and reading your comment:
> 
>> Side note: The OS name is not enough for determining the layout of
>> struct ondisk_untracked_cache.  Different platforms can have different
>> int sizes and padding.  Adding the machine type could help, but that
>> would be a breaking change.  At that point we would be better off
>> defining a machine-independent format, no?
> 
> it looks like assumptions about struct layout are pervasive and part of
> the on-disk format. Yuck. :(

Assuming that there is no padding probably even works for the platforms the code currently supports (basically x86), but I don't know about others. We'd need to change the writing side as well to match, though. Which is probably a good idea, but I tried to keep the patch small and its impact low. Cross-machine usability is currently explicitly not supported -- not sure why, though.

René
Previous: Jeff KingNext: Jeff King
Message 3 of 4 in “dir: support platforms that require aligned reads”
  1. dir: support platforms that require aligned readsRené Scharfe, Jul 16, 2017
  2. Jeff KingJul 16, 2017
  3. René ScharfeJul 16, 2017
  4. Jeff KingJul 16, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.