)]}'
{
  "commit": "e0a115e5aa554b93150a8dc1c3fe15467708abb2",
  "tree": "c8d869cba362f3728c528d696e3985f1c30b0a7b",
  "parents": [
    "b2c8daddcbe03a22402ecf943bb88302601c6835"
  ],
  "author": {
    "name": "Dan Williams",
    "email": "dan.j.williams@intel.com",
    "time": "Thu Jun 05 22:45:52 2008 -0700"
  },
  "committer": {
    "name": "Linus Torvalds",
    "email": "torvalds@linux-foundation.org",
    "time": "Fri Jun 06 11:29:08 2008 -0700"
  },
  "message": "md: fix prexor vs sync_request race\n\nDuring the initial array synchronization process there is a window between\nwhen a prexor operation is scheduled to a specific stripe and when it\ncompletes for a sync_request to be scheduled to the same stripe.  When\nthis happens the prexor completes and the stripe is unconditionally marked\n\"insync\", effectively canceling the sync_request for the stripe.  Prior to\n2.6.23 this was not a problem because the prexor operation was done under\nsh-\u003elock.  The effect in older kernels being that the prexor would still\nerroneously mark the stripe \"insync\", but sync_request would be held off\nand re-mark the stripe as \"!in_sync\".\n\nChange the write completion logic to not mark the stripe \"in_sync\" if a\nprexor was performed.  The effect of the change is to sometimes not set\nSTRIPE_INSYNC.  The worst this can do is cause the resync to stall waiting\nfor STRIPE_INSYNC to be set.  If this were happening, then STRIPE_SYNCING\nwould be set and handle_issuing_new_read_requests would cause all\navailable blocks to eventually be read, at which point prexor would never\nbe used on that stripe any more and STRIPE_INSYNC would eventually be set.\n\necho repair \u003e /sys/block/mdN/md/sync_action will correct arrays that may\nhave lost this race.\n\nCc: \u003cstable@kernel.org\u003e\nSigned-off-by: Dan Williams \u003cdan.j.williams@intel.com\u003e\nSigned-off-by: Neil Brown \u003cneilb@suse.de\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "425958a76b84afc9d7608509f6c06954db342745",
      "old_mode": 33188,
      "old_path": "drivers/md/raid5.c",
      "new_id": "f0f0585c107ef4d79315b09efd171946c0201b70",
      "new_mode": 33188,
      "new_path": "drivers/md/raid5.c"
    }
  ]
}
