)]}'
{
  "commit": "5f8415d6b87ecb4ebf1bbd02c538694ebb7fb57c",
  "tree": "d3764780b95675c7d834ae4ba0d3d834bb9fc6e9",
  "parents": [
    "59be09712ab98a3060f13e31343c7abb9bc4583d"
  ],
  "author": {
    "name": "Amir Goldstein",
    "email": "amir73il@gmail.com",
    "time": "Tue Jun 20 15:35:14 2017 +0300"
  },
  "committer": {
    "name": "Miklos Szeredi",
    "email": "mszeredi@redhat.com",
    "time": "Tue Jul 04 22:03:19 2017 +0200"
  },
  "message": "ovl: persistent overlay inode nlink for indexed inodes\n\nWith inodes index enabled, an overlay inode nlink counts the union of upper\nand non-covered lower hardlinks. During the lifetime of a non-pure upper\ninode, the following nlink modifying operations can happen:\n\n1. Lower hardlink copy up\n2. Upper hardlink created, unlinked or renamed over\n3. Lower hardlink whiteout or renamed over\n\nFor the first, copy up case, the union nlink does not change, whether the\noperation succeeds or fails, but the upper inode nlink may change.\nTherefore, before copy up, we store the union nlink value relative to the\nlower inode nlink in the index inode xattr trusted.overlay.nlink.\n\nFor the second, upper hardlink case, the union nlink should be incremented\nor decremented IFF the operation succeeds, aligned with nlink change of the\nupper inode. Therefore, before link/unlink/rename, we store the union nlink\nvalue relative to the upper inode nlink in the index inode.\n\nFor the last, lower cover up case, we simplify things by preceding the\nwhiteout or cover up with copy up. This makes sure that there is an index\nupper inode where the nlink xattr can be stored before the copied up upper\nentry is unlink.\n\nReturn the overlay inode nlinks for indexed upper inodes on stat(2).\n\nSigned-off-by: Amir Goldstein \u003camir73il@gmail.com\u003e\nSigned-off-by: Miklos Szeredi \u003cmszeredi@redhat.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9f5a47338e59bcf676f1ada5c796d76639475494",
      "old_mode": 33188,
      "old_path": "fs/overlayfs/copy_up.c",
      "new_id": "f193976560dee7b4da90963067de7669c73adfd2",
      "new_mode": 33188,
      "new_path": "fs/overlayfs/copy_up.c"
    },
    {
      "type": "modify",
      "old_id": "8b2b23181b19cfe26b692159ffac6f6fa230335c",
      "old_mode": 33188,
      "old_path": "fs/overlayfs/dir.c",
      "new_id": "641d9ee97f91fcc3a92b456e7007578dbe269d2e",
      "new_mode": 33188,
      "new_path": "fs/overlayfs/dir.c"
    },
    {
      "type": "modify",
      "old_id": "44d262a0a77edcfa742a15792966861e53cf027d",
      "old_mode": 33188,
      "old_path": "fs/overlayfs/inode.c",
      "new_id": "196a4e5450c07e4b79b0d3771a5dd7703e7af271",
      "new_mode": 33188,
      "new_path": "fs/overlayfs/inode.c"
    },
    {
      "type": "modify",
      "old_id": "751b36a5c22f253579fe643a5e33f335e6fd265f",
      "old_mode": 33188,
      "old_path": "fs/overlayfs/overlayfs.h",
      "new_id": "c1321ab3822476a9e0d3e7a4f377663234b27394",
      "new_mode": 33188,
      "new_path": "fs/overlayfs/overlayfs.h"
    },
    {
      "type": "modify",
      "old_id": "a290be449b8b69cb42f7a2a718a66ee939b37b94",
      "old_mode": 33188,
      "old_path": "fs/overlayfs/util.c",
      "new_id": "04d5018e728ea0cc186b37abdcba80ecf9843ca1",
      "new_mode": 33188,
      "new_path": "fs/overlayfs/util.c"
    }
  ]
}
