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

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

From
Jeff King <peff@peff.net>
Date
Jul 16, 2017, 14:04 UTC
Message-ID
<20170716140409.3ywepgvo5c6ognsy@sigill.intra.peff.net>
In-Reply-To
<d3db2984-f238-7166-affa-f1f7df566404@web.de>
On Sun, Jul 16, 2017 at 02:17:37PM +0200, René Scharfe wrote:
Show 23 quoted lines
> -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:

Show 5 quoted lines
> 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. :(

-Peff
Previous: René ScharfeNext: René Scharfe
Message 2 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.