)]}'
{
  "commit": "044b9414c7caf9a26192c73a5b88fa1a8a32a1c1",
  "tree": "9596bb669a68b04eebc40864c3b3fd71d3d1e273",
  "parents": [
    "0143832cc96d0bf78486297aad5c8fb2c2ead02a"
  ],
  "author": {
    "name": "Steven Whitehouse",
    "email": "swhiteho@redhat.com",
    "time": "Wed Nov 03 20:01:07 2010 +0000"
  },
  "committer": {
    "name": "Steven Whitehouse",
    "email": "swhiteho@redhat.com",
    "time": "Mon Nov 15 12:44:42 2010 +0000"
  },
  "message": "GFS2: Fix inode deallocation race\n\nThis area of the code has always been a bit delicate due to the\nsubtleties of lock ordering. The problem is that for \"normal\"\nalloc/dealloc, we always grab the inode locks first and the rgrp lock\nlater.\n\nIn order to ensure no races in looking up the unlinked, but still\nallocated inodes, we need to hold the rgrp lock when we do the lookup,\nwhich means that we can\u0027t take the inode glock.\n\nThe solution is to borrow the technique already used by NFS to solve\nwhat is essentially the same problem (given an inode number, look up\nthe inode carefully, checking that it really is in the expected\nstate).\n\nWe cannot do that directly from the allocation code (lock ordering\nagain) so we give the job to the pre-existing delete workqueue and\ncarry on with the allocation as normal.\n\nIf we find there is no space, we do a journal flush (required anyway\nif space from a deallocation is to be released) which should block\nagainst the pending deallocations, so we should always get the space\nback.\n\nSigned-off-by: Steven Whitehouse \u003cswhiteho@redhat.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "06d582732d3427a058864d03ca6cb667c5063481",
      "old_mode": 33188,
      "old_path": "fs/gfs2/export.c",
      "new_id": "5ab3839dfcb97719d3b9e2f96e99062eef3b3c5f",
      "new_mode": 33188,
      "new_path": "fs/gfs2/export.c"
    },
    {
      "type": "modify",
      "old_id": "87778857f0994fa504224d93c7c5611d10bc1e8c",
      "old_mode": 33188,
      "old_path": "fs/gfs2/glock.c",
      "new_id": "f92c1770416981df8b625b6f918bac6c061c6e5e",
      "new_mode": 33188,
      "new_path": "fs/gfs2/glock.c"
    },
    {
      "type": "modify",
      "old_id": "06370f8bd8cf4aafa95fd4df64e93ec8d657328d",
      "old_mode": 33188,
      "old_path": "fs/gfs2/inode.c",
      "new_id": "e1213f7f92179aa2472304ff0db4294be66040d8",
      "new_mode": 33188,
      "new_path": "fs/gfs2/inode.c"
    },
    {
      "type": "modify",
      "old_id": "6720d7d5fbc6aac91083b399b95ba6c978922c67",
      "old_mode": 33188,
      "old_path": "fs/gfs2/inode.h",
      "new_id": "d8499fadcc53915837a8ae7e7bdcc77213f825cc",
      "new_mode": 33188,
      "new_path": "fs/gfs2/inode.h"
    },
    {
      "type": "modify",
      "old_id": "bef3ab6cf5c1aeb2d0f28d7955e4e62c8cb34be2",
      "old_mode": 33188,
      "old_path": "fs/gfs2/rgrp.c",
      "new_id": "33c8407b876f00ceef0741221ebae4ba46ecb426",
      "new_mode": 33188,
      "new_path": "fs/gfs2/rgrp.c"
    }
  ]
}
