)]}'
{
  "commit": "14a51045e10d3087b8374deef02a9d3a694132d6",
  "tree": "1a9e4b5aeb22f2f7025abc2f1b2ab250ccc5495c",
  "parents": [
    "5408c22b816f7012cc5ba80469389a088ab13663"
  ],
  "author": {
    "name": "Al Viro",
    "email": "viro@zeniv.linux.org.uk",
    "time": "Wed Jan 21 18:17:12 2026 -0500"
  },
  "committer": {
    "name": "Al Viro",
    "email": "viro@zeniv.linux.org.uk",
    "time": "Sat Apr 04 04:03:56 2026 -0400"
  },
  "message": "get rid of busy-waiting in shrink_dcache_tree()\n\nIf shrink_dcache_tree() runs into a potential victim that is already\ndying, it must wait for that dentry to go away.  To avoid busy-waiting\nwe need some object to wait on and a way for dentry_unlist() to see that\nwe need to be notified.\n\nThe obvious place for the object to wait on would be on our stack frame.\nWe will store a pointer to that object (struct completion_list) in victim\ndentry; if there\u0027s more than one thread wanting to wait for the same\ndentry to finish dying, we\u0027ll have their instances linked into a list,\nwith reference in dentry pointing to the head of that list.\n\n* new object - struct completion_list.  A pair of struct completion and\npointer to the next instance.  That\u0027s what shrink_dcache_tree() will wait\non if needed.\n\n* add a new member (-\u003ewaiters, opaque pointer to struct completion_list)\nto struct dentry.  It is defined for negative live dentries that are\nnot in-lookup ones and it will remain NULL for almost all of them.\n\nIt does not conflict with -\u003ed_rcu (defined for killed dentries), -\u003ed_alias\n(defined for positive dentries, all live) or -\u003ed_in_lookup_hash (defined\nfor in-lookup dentries, all live negative).  That allows to colocate\nall four members.\n\n* make sure that all places where dentry enters the state where -\u003ewaiters\nis defined (live, negative, not-in-lookup) initialize -\u003ewaiters to NULL.\n\n* if select_collect2() runs into a dentry that is already dying, have\nits caller insert a local instance of struct completion_list into the\nhead of the list hanging off dentry-\u003ewaiters and wait for completion.\n\n* if dentry_unlist() sees non-NULL -\u003ewaiters, have it carefully walk\nthrough the completion_list instances in that list, calling complete()\nfor each.\n\nFor now struct completion_list is local to fs/dcache.c; it\u0027s obviously\ndentry-agnostic, and it can be trivially lifted into linux/completion.h\nif somebody finds a reason to do so...\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "616a445ec7207afd1d66880f602a8992137eb9a7",
      "old_mode": 33188,
      "old_path": "fs/dcache.c",
      "new_id": "0c8faeee02e22ce9a1ca59aee55aab002402a970",
      "new_mode": 33188,
      "new_path": "fs/dcache.c"
    },
    {
      "type": "modify",
      "old_id": "f939d2ed10a36cbe13c6a587ef334a6b6e32c978",
      "old_mode": 33188,
      "old_path": "include/linux/dcache.h",
      "new_id": "19098253f2dd93b4a876a69e5a921d00c37c8253",
      "new_mode": 33188,
      "new_path": "include/linux/dcache.h"
    }
  ]
}
