)]}'
{
  "commit": "751ebd76e654bd1e65da08ecf694325282b4cfcc",
  "tree": "e4a1a824f63fc24501480faec35a388c7df22f18",
  "parents": [
    "199667a8c843d268f0fe80f09041b8c7193f1ba5"
  ],
  "author": {
    "name": "Fam Zheng",
    "email": "famz@redhat.com",
    "time": "Fri Apr 03 22:05:18 2015 +0800"
  },
  "committer": {
    "name": "Kevin Wolf",
    "email": "kwolf@redhat.com",
    "time": "Tue Apr 28 15:36:09 2015 +0200"
  },
  "message": "blockjob: Allow nested pause\n\nThis patch changes block_job_pause to increase the pause counter and\nblock_job_resume to decrease it.\n\nThe counter will allow calling block_job_pause/block_job_resume\nunconditionally on a job when we need to suspend the IO temporarily.\n\nFrom now on, each block_job_resume must be paired with a block_job_pause\nto keep the counter balanced.\n\nThe user pause from QMP or HMP will only trigger block_job_pause once\nuntil it\u0027s resumed, this is achieved by adding a user_paused flag in\nBlockJob.\n\nOne occurrence of block_job_resume in mirror_complete is replaced with\nblock_job_enter which does what is necessary.\n\nIn block_job_cancel, the cancel flag is good enough to instruct\ncoroutines to quit loop, so use block_job_enter to replace the unpaired\nblock_job_resume.\n\nUpon block job IO error, user is notified about the entering to the\npause state, so this pause belongs to user pause, set the flag\naccordingly and expect a matching QMP resume.\n\n[Extended doc comments as suggested by Paolo Bonzini\n\u003cpbonzini@redhat.com\u003e.\n--Stefan]\n\nSigned-off-by: Fam Zheng \u003cfamz@redhat.com\u003e\nReviewed-by: Stefan Hajnoczi \u003cstefanha@redhat.com\u003e\nReviewed-by: Paolo Bonzini \u003cpbonzini@redhat.com\u003e\nReviewed-by: Alberto Garcia \u003cberto@igalia.com\u003e\nMessage-id: 1428069921-2957-2-git-send-email-famz@redhat.com\nSigned-off-by: Stefan Hajnoczi \u003cstefanha@redhat.com\u003e\nSigned-off-by: Kevin Wolf \u003ckwolf@redhat.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "405616422b1dc864ab20c49c7b89bc8776c15041",
      "old_mode": 33188,
      "old_path": "block/mirror.c",
      "new_id": "65b1718671294cf91682a8d363568a5f74b1e158",
      "new_mode": 33188,
      "new_path": "block/mirror.c"
    },
    {
      "type": "modify",
      "old_id": "fbb3a7997887f5728dc3182e36cdc4b2508c20c2",
      "old_mode": 33188,
      "old_path": "blockdev.c",
      "new_id": "9132d69e0974b200ce90520f98a378ec259667ae",
      "new_mode": 33188,
      "new_path": "blockdev.c"
    },
    {
      "type": "modify",
      "old_id": "ba2255d91f71ec9b93059b38014205eee9d1927e",
      "old_mode": 33188,
      "old_path": "blockjob.c",
      "new_id": "2755465259ec4a5ee4f3fd8314211bf6a3c1b051",
      "new_mode": 33188,
      "new_path": "blockjob.c"
    },
    {
      "type": "modify",
      "old_id": "b6d4ebbe03c5c7f198baea74c72846a8b2e4c618",
      "old_mode": 33188,
      "old_path": "include/block/blockjob.h",
      "new_id": "57d8ef13e21bde3878062074e1dcdfc970301b5c",
      "new_mode": 33188,
      "new_path": "include/block/blockjob.h"
    }
  ]
}
