)]}'
{
  "commit": "79feb521a44705262d15cc819a4117a447b11ea7",
  "tree": "a4de6ed084b7a68c0885049d94841ce8334b64a7",
  "parents": [
    "a78bb11d7acd525623c6a0c2ff4e213d527573fa"
  ],
  "author": {
    "name": "Jan Kara",
    "email": "jack@suse.cz",
    "time": "Tue Mar 13 22:22:54 2012 -0400"
  },
  "committer": {
    "name": "Theodore Ts\u0027o",
    "email": "tytso@mit.edu",
    "time": "Tue Mar 13 22:22:54 2012 -0400"
  },
  "message": "jbd2: issue cache flush after checkpointing even with internal journal\n\nWhen we reach jbd2_cleanup_journal_tail(), there is no guarantee that\ncheckpointed buffers are on a stable storage - especially if buffers were\nwritten out by jbd2_log_do_checkpoint(), they are likely to be only in disk\u0027s\ncaches. Thus when we update journal superblock effectively removing old\ntransaction from journal, this write of superblock can get to stable storage\nbefore those checkpointed buffers which can result in filesystem corruption\nafter a crash. Thus we must unconditionally issue a cache flush before we\nupdate journal superblock in these cases.\n\nA similar problem can also occur if journal superblock is written only in\ndisk\u0027s caches, other transaction starts reusing space of the transaction\ncleaned from the log and power failure happens. Subsequent journal replay would\nstill try to replay the old transaction but some of it\u0027s blocks may be already\noverwritten by the new transaction. For this reason we must use WRITE_FUA when\nupdating log tail and we must first write new log tail to disk and update\nin-memory information only after that.\n\nSigned-off-by: Jan Kara \u003cjack@suse.cz\u003e\nSigned-off-by: \"Theodore Ts\u0027o\" \u003ctytso@mit.edu\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "19dcd0b86bca1b5bffd18836c4d25c3e3e84e342",
      "old_mode": 33188,
      "old_path": "fs/jbd2/checkpoint.c",
      "new_id": "7f7ee5b904026e1e68387636426e2a192563001e",
      "new_mode": 33188,
      "new_path": "fs/jbd2/checkpoint.c"
    },
    {
      "type": "modify",
      "old_id": "6705717d9b7ffa2cb5c221e9b51f16f77776ba95",
      "old_mode": 33188,
      "old_path": "fs/jbd2/commit.c",
      "new_id": "b89ef84786a75e14c6c4147bfae10b99b8d07beb",
      "new_mode": 33188,
      "new_path": "fs/jbd2/commit.c"
    },
    {
      "type": "modify",
      "old_id": "fc5f2acc9f18c649ca98302b9257302b91309bcf",
      "old_mode": 33188,
      "old_path": "fs/jbd2/journal.c",
      "new_id": "c5ff177400ff52e07d802cccf7b7ce870ccb3d3a",
      "new_mode": 33188,
      "new_path": "fs/jbd2/journal.c"
    },
    {
      "type": "modify",
      "old_id": "da6d7baf1390c401cc52b1cb005cde1ff7776483",
      "old_mode": 33188,
      "old_path": "fs/jbd2/recovery.c",
      "new_id": "c1a03354a22ff1b5a787251b422afcb5225ca2c9",
      "new_mode": 33188,
      "new_path": "fs/jbd2/recovery.c"
    },
    {
      "type": "modify",
      "old_id": "5f05c77438e5642364b27f359040863ca2363544",
      "old_mode": 33188,
      "old_path": "include/linux/jbd2.h",
      "new_id": "876a7d87192bc7807c0df3cb913df7608999a700",
      "new_mode": 33188,
      "new_path": "include/linux/jbd2.h"
    },
    {
      "type": "modify",
      "old_id": "e05a362bf3f14f7fb3d9bde4ebd9f929122dd27a",
      "old_mode": 33188,
      "old_path": "include/trace/events/jbd2.h",
      "new_id": "127993dbf322efa40bc68222551ff181132122b4",
      "new_mode": 33188,
      "new_path": "include/trace/events/jbd2.h"
    }
  ]
}
