)]}'
{
  "commit": "695f6ae0dcea3dd83bfbb9634ff067f780649ba8",
  "tree": "0c97d92bfdc0791d0456faad6ef93b88e5739247",
  "parents": [
    "de18f3b2d68c1f3481839be760a5ff93f6a9a5e5"
  ],
  "author": {
    "name": "Jan Kara",
    "email": "jack@suse.cz",
    "time": "Thu Apr 02 16:57:17 2009 -0700"
  },
  "committer": {
    "name": "Linus Torvalds",
    "email": "torvalds@linux-foundation.org",
    "time": "Thu Apr 02 19:04:52 2009 -0700"
  },
  "message": "ext3: avoid false EIO errors\n\nSometimes block_write_begin() can map buffers in a page but later we\nfail to copy data into those buffers (because the source page has been\npaged out in the mean time).  We then end up with !uptodate mapped\nbuffers.  To add a bit more to the confusion, block_write_end() does\nnot commit any data (and thus does not any mark buffers as uptodate) if\nwe didn\u0027t succeed with copying all the data.\n\nCommit f4fc66a894546bdc88a775d0e83ad20a65210bcb (ext3: convert to new\naops) missed these cases and thus we were inserting non-uptodate\nbuffers to transaction\u0027s list which confuses JBD code and it reports IO\nerrors, aborts a transaction and generally makes users afraid about\ntheir data ;-P.\n\nThis patch fixes the problem by reorganizing ext3_..._write_end() code\nto first call block_write_end() to mark buffers with valid data\nuptodate and after that we file only uptodate buffers to transaction\u0027s\nlists.\n\nWe also fix a problem where we could leave blocks allocated beyond i_size\n(i_disksize in fact) because of failed write. We now add inode to orphan\nlist when write fails (to be safe in case we crash) and then truncate blocks\nbeyond i_size in a separate transaction.\n\nSigned-off-by: Jan Kara \u003cjack@suse.cz\u003e\nReviewed-by: Aneesh Kumar K.V \u003caneesh.kumar@linux.vnet.ibm.com\u003e\nCc: Nick Piggin \u003cnickpiggin@yahoo.com.au\u003e\nCc: \u003clinux-ext4@vger.kernel.org\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": "4a09ff169870517b13f65e0d26507c6505e465b2",
      "old_mode": 33188,
      "old_path": "fs/ext3/inode.c",
      "new_id": "d3ef6566b0190340b21f94402a811f5a45d4f38d",
      "new_mode": 33188,
      "new_path": "fs/ext3/inode.c"
    }
  ]
}
