)]}'
{
  "log": [
    {
      "commit": "e980b50cda1610f1c17978d9b7fd311a9dd93877",
      "tree": "a5ab72fa4b791758e25fd6ece6f1aedd29954e7b",
      "parents": [
        "9601e3f6336f6ca66929f451b1f66085e68e36e3"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Apr 24 14:39:24 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Apr 24 15:46:05 2009 -0400"
      },
      "message": "Btrfs: fix fallocate deadlock on inode extent lock\n\nThe btrfs fallocate call takes an extent lock on the entire range\nbeing fallocated, and then runs through insert_reserved_extent on each\nextent as they are allocated.\n\nThe problem with this is that btrfs_drop_extents may decide to try\nand take the same extent lock fallocate was already holding.  The solution\nused here is to push down knowledge of the range that is already locked\ngoing into btrfs_drop_extents.\n\nIt turns out that at least one other caller had the same bug.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "c293498be69816087746161338de4b81efdf69fc",
      "tree": "32b856b67ca63e2649c8574c9a09352666362ec8",
      "parents": [
        "3e7ad38d20ad113158d1b4c9de0f51c04f50d4f7"
      ],
      "author": {
        "name": "Stoyan Gaydarov",
        "email": "stoyboyker@gmail.com",
        "time": "Thu Apr 02 17:05:11 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Apr 02 17:05:11 2009 -0400"
      },
      "message": "Btrfs: BUG to BUG_ON changes\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n\n"
    },
    {
      "commit": "3a5e14048a0a81276d284cbda441507a17e26147",
      "tree": "42464c2455216b008bf27c13496d001bb85d3564",
      "parents": [
        "a9572a15a854bd40453a6b7b4dd9d29132f64c64"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Thu Apr 02 16:49:40 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Apr 02 16:49:40 2009 -0400"
      },
      "message": "Btrfs: notreelog mount option\n\nAdd a \u0027notreelog\u0027 mount option to disable the tree log (used by fsync,\nO_SYNC writes).  This is much slower, but the tree logging produces\ninconsistent views into the FS for ceph.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n\n"
    },
    {
      "commit": "04018de5d41e6490840de9399e029fd30e78576f",
      "tree": "4fcb979cee830884ca0d3f9636cc70ed17b3364a",
      "parents": [
        "6226cb0a5ea3f6289883753c15d53f48a6c6bbfb"
      ],
      "author": {
        "name": "Josef Bacik",
        "email": "jbacik@redhat.com",
        "time": "Fri Apr 03 10:14:18 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Apr 03 10:14:18 2009 -0400"
      },
      "message": "Btrfs: kill the pinned_mutex\n\nThis patch removes the pinned_mutex.  The extent io map has an internal tree\nlock that protects the tree itself, and since we only copy the extent io map\nwhen we are committing the transaction we don\u0027t need it there.  We also don\u0027t\nneed it when caching the block group since searching through the tree is also\nprotected by the internal map spin lock.\n\nSigned-off-by: Josef Bacik \u003cjbacik@redhat.com\u003e\n\n"
    },
    {
      "commit": "af4176b49c5ee15a9c9b10720c92456b28e7aac7",
      "tree": "a8f763a172e6fc19ef6ac24f04d6b88337c8a1b6",
      "parents": [
        "12fcfd22fe5bf4fe74710232098bc101af497995"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 10:24:31 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 16:14:52 2009 -0400"
      },
      "message": "Btrfs: optimize fsyncs on old files\n\nThe fsync log has code to make sure all of the parents of a file are in the\nlog along with the file.  It uses a minimal log of the parent directory\ninodes, just enough to get the parent directory on disk.\n\nIf the transaction that originally created a file is fully on disk,\nand the file hasn\u0027t been renamed or linked into other directories, we\ncan safely skip the parent directory walk.  We know the file is on disk\nsomewhere and we can go ahead and just log that single file.\n\nThis is more important now because unrelated unlinks in the parent directory\nmight make us force a commit if we try to log the parent.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "12fcfd22fe5bf4fe74710232098bc101af497995",
      "tree": "b01ba82147ea76c89149e54d475ed97121387261",
      "parents": [
        "a74ac3220774d33db967088906dc3351829e2d3a"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 10:24:20 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 16:14:52 2009 -0400"
      },
      "message": "Btrfs: tree logging unlink/rename fixes\n\nThe tree logging code allows individual files or directories to be logged\nwithout including operations on other files and directories in the FS.\nIt tries to commit the minimal set of changes to disk in order to\nfsync the single file or directory that was sent to fsync or O_SYNC.\n\nThe tree logging code was allowing files and directories to be unlinked\nif they were part of a rename operation where only one directory\nin the rename was in the fsync log.  This patch adds a few new rules\nto the tree logging.\n\n1) on rename or unlink, if the inode being unlinked isn\u0027t in the fsync\nlog, we must force a full commit before doing an fsync of the directory\nwhere the unlink was done.  The commit isn\u0027t done during the unlink,\nbut it is forced the next time we try to log the parent directory.\n\nSolution: record transid of last unlink/rename per directory when the\ndirectory wasn\u0027t already logged.  For renames this is only done when\nrenaming to a different directory.\n\nmkdir foo/some_dir\nnormal commit\nrename foo/some_dir foo2/some_dir\nmkdir foo/some_dir\nfsync foo/some_dir/some_file\n\nThe fsync above will unlink the original some_dir without recording\nit in its new location (foo2).  After a crash, some_dir will be gone\nunless the fsync of some_file forces a full commit\n\n2) we must log any new names for any file or dir that is in the fsync\nlog.  This way we make sure not to lose files that are unlinked during\nthe same transaction.\n\n2a) we must log any new names for any file or dir during rename\nwhen the directory they are being removed from was logged.\n\n2a is actually the more important variant.  Without the extra logging\na crash might unlink the old name without recreating the new one\n\n3) after a crash, we must go through any directories with a link count\nof zero and redo the rm -rf\n\nmkdir f1/foo\nnormal commit\nrm -rf f1/foo\nfsync(f1)\n\nThe directory f1 was fully removed from the FS, but fsync was never\ncalled on f1, only its parent dir.  After a crash the rm -rf must\nbe replayed.  This must be able to recurse down the entire\ndirectory tree.  The inode link count fixup code takes care of the\nugly details.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "a74ac3220774d33db967088906dc3351829e2d3a",
      "tree": "292fe0b88a5917d3b282b6a1cdfca170f9405132",
      "parents": [
        "a4b6e07d1a8a9b907e82b9acbf51a026fbb9301c"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 10:24:13 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 16:14:51 2009 -0400"
      },
      "message": "Btrfs: Make sure i_nlink doesn\u0027t hit zero too soon during log replay\n\nDuring log replay, inodes are copied from the log to the main filesystem\nbtrees.  Sometimes they have a zero link count in the log but they actually\ngain links during the replay or have some in the main btree.\n\nThis patch updates the link count to be at least one after copying the\ninode out of the log.  This makes sure the inode is deleted during an\niput while the rest of the replay code is still working on it.\n\nThe log replay has fixup code to make sure that link counts are correct\nat the end of the replay, so we could use any non-zero number here and\nit would work fine.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "b9473439d3e84d9fc1a0a83faca69cc1b7566341",
      "tree": "bef8321b80589026b617d61d0fabaf545d459269",
      "parents": [
        "89573b9c516b24af8a3b9958dd5afca8fa874e3d"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Mar 13 11:00:37 2009 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Mar 24 16:14:28 2009 -0400"
      },
      "message": "Btrfs: leave btree locks spinning more often\n\nbtrfs_mark_buffer dirty would set dirty bits in the extent_io tree\nfor the buffers it was dirtying.  This may require a kmalloc and it\nwas not atomic.  So, anyone who called btrfs_mark_buffer_dirty had to\nset any btree locks they were holding to blocking first.\n\nThis commit changes dirty tracking for extent buffers to just use a flag\nin the extent buffer.  Now that we have one and only one extent buffer\nper page, this can be safely done without losing dirty bits along the way.\n\nThis also introduces a path-\u003eleave_spinning flag that callers of\nbtrfs_search_slot can use to indicate they will properly deal with a\npath returned where all the locks are spinning instead of blocking.\n\nMany of the btree search callers now expect spinning paths,\nresulting in better btree concurrency overall.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "2456242530a21cfee82646ebeeda65d3f74faa4c",
      "tree": "c0e8f5eda96cefeb44a48f05a248ea22b4259ad2",
      "parents": [
        "4008c04a07c73ec3cb1be4c1391d2159a8f75d6d"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Thu Feb 12 14:14:53 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Feb 12 14:14:53 2009 -0500"
      },
      "message": "Btrfs: hold trans_mutex when using btrfs_record_root_in_trans\n\nbtrfs_record_root_in_trans needs the trans_mutex held to make sure two\ncallers don\u0027t race to setup the root in a given transaction.  This adds\nit to all the places that were missing it.\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "b4ce94de9b4d64e8ab3cf155d13653c666e22b9b",
      "tree": "ebc44a9554a50b495b091cb0979d79fd29e50fe7",
      "parents": [
        "c487685d7c18a8481900755aa5c56a7a74193101"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Feb 04 09:25:08 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Feb 04 09:25:08 2009 -0500"
      },
      "message": "Btrfs: Change btree locking to use explicit blocking points\n\nMost of the btrfs metadata operations can be protected by a spinlock,\nbut some operations still need to schedule.\n\nSo far, btrfs has been using a mutex along with a trylock loop,\nmost of the time it is able to avoid going for the full mutex, so\nthe trylock loop is a big performance gain.\n\nThis commit is step one for getting rid of the blocking locks entirely.\nbtrfs_tree_lock takes a spinlock, and the code explicitly switches\nto a blocking lock when it starts an operation that can schedule.\n\nWe\u0027ll be able get rid of the blocking locks in smaller pieces over time.\nTracing allows us to find the most common cause of blocking, so we\ncan start with the hot spots first.\n\nThe basic idea is:\n\nbtrfs_tree_lock() returns with the spin lock held\n\nbtrfs_set_lock_blocking() sets the EXTENT_BUFFER_BLOCKING bit in\nthe extent buffer flags, and then drops the spin lock.  The buffer is\nstill considered locked by all of the btrfs code.\n\nIf btrfs_tree_lock gets the spinlock but finds the blocking bit set, it drops\nthe spin lock and waits on a wait queue for the blocking bit to go away.\n\nMuch of the code that needs to set the blocking bit finishes without actually\nblocking a good percentage of the time.  So, an adaptive spin is still\nused against the blocking bit to avoid very high context switch rates.\n\nbtrfs_clear_lock_blocking() clears the blocking bit and returns\nwith the spinlock held again.\n\nbtrfs_tree_unlock() can be called on either blocking or spinning locks,\nit does the right thing based on the blocking bit.\n\nctree.c has a helper function to set/clear all the locked buffers in a\npath as blocking.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "7237f1833601dcc435a64176c2c347ec4bd959f9",
      "tree": "5e12b9a7655f03181605e02fd91b42e68ee92c2e",
      "parents": [
        "7e6628544abad773222d8b177f738ac2db1859de"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Wed Jan 21 12:54:03 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Jan 21 12:54:03 2009 -0500"
      },
      "message": "Btrfs: fix tree logs parallel sync\n\nTo improve performance, btrfs_sync_log merges tree log sync\nrequests. But it wrongly merges sync requests for different\ntree logs. If multiple tree logs are synced at the same time,\nonly one of them actually gets synced.\n\nThis patch has following changes to fix the bug:\n\nMove most tree log related fields in btrfs_fs_info to\nbtrfs_root. This allows merging sync requests separately\nfor each tree log.\n\nDon\u0027t insert root item into the log root tree immediately\nafter log tree is allocated. Root item for log tree is\ninserted when log tree get synced for the first time. This\nallows syncing the log root tree without first syncing all\nlog trees.\n\nAt tree-log sync, btrfs_sync_log first sync the log tree;\nthen updates corresponding root item in the log root tree;\nsync the log root tree; then update the super block.\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "e293e97e363e419d8a3628a927321e3f75206a0b",
      "tree": "067fb82bb4cabba35429b28c9e43f9614aea6274",
      "parents": [
        "755efdc3c4d3b42d5ffcef0f4d6e5b37ecd3bf21"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Jan 09 13:14:17 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Jan 09 13:14:17 2009 -0500"
      },
      "message": "Btrfs: explicitly mark the tree log root for writeback\n\nEach subvolume has an extent_state_tree used to mark metadata\nthat needs to be sent to disk while syncing the tree.  This is\nused in addition to the dirty bits on the pages themselves so that\na single subvolume can be sent to disk efficiently in disk order.\n\nNormally this marking happens in btrfs_alloc_free_block, which also does\nspecial recording of dirty tree blocks for the tree log roots.\n\nYan Zheng noticed that when the root of the log tree is allocated, it is added\nto the wrong writeback list.  The fix used here is to explicitly set\nit dirty as part of tree log creation.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n\n"
    },
    {
      "commit": "07d400a6df4767a90d49a153fdb7f4cfa1e3f23e",
      "tree": "8ca61bb87ffb72343b8d392a26fb7a6265f6fa3d",
      "parents": [
        "1ba12553f3600ffebad226c5204ab0e46df98161"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Tue Jan 06 11:42:00 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Jan 06 11:42:00 2009 -0500"
      },
      "message": "Btrfs: tree logging checksum fixes\n\nThis patch contains following things.\n\n1) Limit the max size of btrfs_ordered_sum structure to PAGE_SIZE.  This\nstruct is kmalloced so we want to keep it reasonable.\n\n2) Replace copy_extent_csums by btrfs_lookup_csums_range.  This was\nduplicated code in tree-log.c\n\n3) Remove replay_one_csum. csum items are replayed at the same time as\n   replaying file extents. This guarantees we only replay useful csums.\n\n4) nbytes accounting fix.\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "d397712bcc6a759a560fd247e6053ecae091f958",
      "tree": "9da8daebb870d8b8b1843507c4621715e23dd31a",
      "parents": [
        "1f3c79a28c8837e8572b98f6d14142d9a6133c56"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Jan 05 21:25:51 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Jan 05 21:25:51 2009 -0500"
      },
      "message": "Btrfs: Fix checkpatch.pl warnings\n\nThere were many, most are fixed now.  struct-funcs.c generates some warnings\nbut these are bogus.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "ec051c0f929afe5c42c24bb07abf577c616c208c",
      "tree": "a9b75cd422cf7dde92c9dbb8828feb062e2c35ec",
      "parents": [
        "2d69a0f88459fae35df3ddef4934a2dad67e2765"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Mon Jan 05 15:43:42 2009 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Jan 05 15:43:42 2009 -0500"
      },
      "message": "Btrfs: avoid orphan inode caused by log replay\n\ndrop_one_dir_item does not properly update inode\u0027s link count. It can be\nreproduced by executing following commands:\n\n#touch test\n#sync\n#rm -f test\n#dd if\u003d/dev/zero bs\u003d4k count\u003d1 of\u003dtest conv\u003dfsync\n#echo b \u003e /proc/sysrq-trigger\n\nThis fixes it by adding an BTRFS_ORPHAN_ITEM_KEY for the inode\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "87b29b208c6c38f3446d2de6ece946e2459052cf",
      "tree": "43e717289e1e8446fced4093ab39667bba9ea60a",
      "parents": [
        "d7f735d0bc68c411abda0a612e1421bdade649cc"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Wed Dec 17 10:21:48 2008 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Dec 17 10:21:48 2008 -0500"
      },
      "message": "Btrfs: properly check free space for tree balancing\n\nbtrfs_insert_empty_items takes the space needed by the btrfs_item\nstructure into account when calculating the required free space.\n\nSo the tree balancing code shouldn\u0027t add sizeof(struct btrfs_item)\nto the size when checking the free space. This patch removes these\nsuperfluous additions.\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "580afd76e451deb6772d0507de580fb1df14da6c",
      "tree": "ea112be78807b07f617efffefb532e19778dc9bb",
      "parents": [
        "c3027eb5523d6983f12628f3fe13d8a7576db701"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Dec 08 19:15:39 2008 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Dec 08 19:15:39 2008 -0500"
      },
      "message": "Btrfs: Fix compressed checksum fsync log copies\n\nThe fsync logging code makes sure to onl copy the relevant checksum for each\nextent based on the file extent pointers it finds.\n\nBut for compressed extents, it needs to copy the checksum for the\nentire extent.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n\n"
    },
    {
      "commit": "a512bbf855ff0af474257475f2e6da7acd854f52",
      "tree": "1b2cfcf4152e09f32a6cb0bcbd798d5dab2f5490",
      "parents": [
        "d20f7043fa65659136c1a7c3c456eeeb5c6f431f"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Mon Dec 08 16:46:26 2008 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Dec 08 16:46:26 2008 -0500"
      },
      "message": "Btrfs: superblock duplication\n\nThis patch implements superblock duplication. Superblocks\nare stored at offset 16K, 64M and 256G on every devices.\nSpaces used by superblocks are preserved by the allocator,\nwhich uses a reverse mapping function to find the logical\naddresses that correspond to superblocks. Thank you,\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "d20f7043fa65659136c1a7c3c456eeeb5c6f431f",
      "tree": "05d1031cadec6d440a97221e3a32adb504a51699",
      "parents": [
        "c99e905c945c462085c6d64646dc5af0c0a16815"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Dec 08 16:58:54 2008 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Dec 08 16:58:54 2008 -0500"
      },
      "message": "Btrfs: move data checksumming into a dedicated tree\n\nBtrfs stores checksums for each data block.  Until now, they have\nbeen stored in the subvolume trees, indexed by the inode that is\nreferencing the data block.  This means that when we read the inode,\nwe\u0027ve probably read in at least some checksums as well.\n\nBut, this has a few problems:\n\n* The checksums are indexed by logical offset in the file.  When\ncompression is on, this means we have to do the expensive checksumming\non the uncompressed data.  It would be faster if we could checksum\nthe compressed data instead.\n\n* If we implement encryption, we\u0027ll be checksumming the plain text and\nstoring that on disk.  This is significantly less secure.\n\n* For either compression or encryption, we have to get the plain text\nback before we can verify the checksum as correct.  This makes the raid\nlayer balancing and extent moving much more expensive.\n\n* It makes the front end caching code more complex, as we have touch\nthe subvolume and inodes as we cache extents.\n\n* There is potentitally one copy of the checksum in each subvolume\nreferencing an extent.\n\nThe solution used here is to store the extent checksums in a dedicated\ntree.  This allows us to index the checksums by phyiscal extent\nstart and length.  It means:\n\n* The checksum is against the data stored on disk, after any compression\nor encryption is done.\n\n* The checksum is stored in a central location, and can be verified without\nfollowing back references, or reading inodes.\n\nThis makes compression significantly faster by reducing the amount of\ndata that needs to be checksummed.  It will also allow much faster\nraid management code in general.\n\nThe checksums are indexed by a key with a fixed objectid (a magic value\nin ctree.h) and offset set to the starting byte of the extent.  This\nallows us to copy the checksum items into the fsync log tree directly (or\nany other tree), without having to invent a second format for them.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "607d432da0542e84ddcd358adfddac6f68500e3d",
      "tree": "44425bf1fe8378022bc1b84425ca4ba9d0176566",
      "parents": [
        "c6e2bac1a52ffc36dd10769b594dfa3994e95f77"
      ],
      "author": {
        "name": "Josef Bacik",
        "email": "jbacik@redhat.com",
        "time": "Tue Dec 02 07:17:45 2008 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Dec 02 07:17:45 2008 -0500"
      },
      "message": "Btrfs: add support for multiple csum algorithms\n\nThis patch gives us the space we will need in order to have different csum\nalgorithims at some point in the future.  We save the csum algorithim type\nin the superblock, and use those instead of define\u0027s.\n\nSigned-off-by: Josef Bacik \u003cjbacik@redhat.com\u003e\n\n"
    },
    {
      "commit": "b2950863c61bc24cf0f63bc05947d9d50663c4c0",
      "tree": "3005a034713fe86db2d64ab1b21fe8762f6a4b0c",
      "parents": [
        "1ffa4f426c002161b7dbd58b297f5d0680e7dd6a"
      ],
      "author": {
        "name": "Christoph Hellwig",
        "email": "hch@lst.de",
        "time": "Tue Dec 02 09:54:17 2008 -0500"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Tue Dec 02 09:54:17 2008 -0500"
      },
      "message": "Btrfs: make things static and include the right headers\n\nShut up various sparse warnings about symbols that should be either\nstatic or have their declarations in scope.\n\nSigned-off-by: Christoph Hellwig \u003chch@lst.de\u003e\n\n"
    },
    {
      "commit": "d899e05215178fed903ad0e7fc1cb4d8e0cc0a88",
      "tree": "2969e3558f5c50ec0f9ac4201099c0d5d1d6e2c2",
      "parents": [
        "80ff385665b7fca29fefe358a60ab0d09f9b8e87"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Thu Oct 30 14:25:28 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Oct 30 14:25:28 2008 -0400"
      },
      "message": "Btrfs: Add fallocate support v2\nThis patch updates btrfs-progs for fallocate support.\n\nfallocate is a little different in Btrfs because we need to tell the\nCOW system that a given preallocated extent doesn\u0027t need to be\ncow\u0027d as long as there are no snapshots of it.  This leverages the\n-o nodatacow checks.\n \nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "84234f3a1f7c532e4afeba03cc8e7e4a8a5277ea",
      "tree": "c41f249b448f28b648b21c3898d0763b9c67ca6a",
      "parents": [
        "2517920135b0d29e70453e5b03d70d7b94207df3"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Wed Oct 29 14:49:05 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Oct 29 14:49:05 2008 -0400"
      },
      "message": "Btrfs: Add root tree pointer transaction ids\n\nThis patch adds transaction IDs to root tree pointers.\nTransaction IDs in tree pointers are compared with the\ngeneration numbers in block headers when reading root\nblocks of trees. This can detect some types of IO errors.\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n\n"
    },
    {
      "commit": "2517920135b0d29e70453e5b03d70d7b94207df3",
      "tree": "e0c526faa5c2c7bc3add340e5b7e8df26924dca9",
      "parents": [
        "80eb234af09dbe6c97b2e3d60a13ec391e98fbba"
      ],
      "author": {
        "name": "Josef Bacik",
        "email": "jbacik@redhat.com",
        "time": "Wed Oct 29 14:49:05 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Oct 29 14:49:05 2008 -0400"
      },
      "message": "Btrfs: nuke fs wide allocation mutex V2\n\nThis patch removes the giant fs_info-\u003ealloc_mutex and replaces it with a bunch\nof little locks.\n\nThere is now a pinned_mutex, which is used when messing with the pinned_extents\nextent io tree, and the extent_ins_mutex which is used with the pending_del and\nextent_ins extent io trees.\n\nThe locking for the extent tree stuff was inspired by a patch that Yan Zheng\nwrote to fix a race condition, I cleaned it up some and changed the locking\naround a little bit, but the idea remains the same.  Basically instead of\nholding the extent_ins_mutex throughout the processing of an extent on the\nextent_ins or pending_del trees, we just hold it while we\u0027re searching and when\nwe clear the bits on those trees, and lock the extent for the duration of the\noperations on the extent.\n\nAlso to keep from getting hung up waiting to lock an extent, I\u0027ve added a\ntry_lock_extent so if we cannot lock the extent, move on to the next one in the\ntree and we\u0027ll come back to that one.  I have tested this heavily and it does\nnot appear to break anything.  This has to be applied on top of my\nfind_free_extent redo patch.\n\nI tested this patch on top of Yan\u0027s space reblancing code and it worked fine.\nThe only thing that has changed since the last version is I pulled out all my\ndebugging stuff, apparently I forgot to run guilt refresh before I sent the\nlast patch out.  Thank you,\n\nSigned-off-by: Josef Bacik \u003cjbacik@redhat.com\u003e\n\n\n"
    },
    {
      "commit": "c8b978188c9a0fd3d535c13debd19d522b726f1f",
      "tree": "873628723fb82fe2a7c77adc65fa93eca1d61c0c",
      "parents": [
        "26ce34a9c47334ff7984769e4661b2f1883594ff"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Oct 29 14:49:59 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Wed Oct 29 14:49:59 2008 -0400"
      },
      "message": "Btrfs: Add zlib compression support\n\nThis is a large change for adding compression on reading and writing,\nboth for inline and regular extents.  It does some fairly large\nsurgery to the writeback paths.\n\nCompression is off by default and enabled by mount -o compress.  Even\nwhen the -o compress mount option is not used, it is possible to read\ncompressed extents off the disk.\n\nIf compression for a given set of pages fails to make them smaller, the\nfile is flagged to avoid future compression attempts later.\n\n* While finding delalloc extents, the pages are locked before being sent down\nto the delalloc handler.  This allows the delalloc handler to do complex things\nsuch as cleaning the pages, marking them writeback and starting IO on their\nbehalf.\n\n* Inline extents are inserted at delalloc time now.  This allows us to compress\nthe data before inserting the inline extent, and it allows us to insert\nan inline extent that spans multiple pages.\n\n* All of the in-memory extent representations (extent_map.c, ordered-data.c etc)\nare changed to record both an in-memory size and an on disk size, as well\nas a flag for compression.\n\nFrom a disk format point of view, the extent pointers in the file are changed\nto record the on disk size of a given extent and some encoding flags.\nSpace in the disk format is allocated for compression encoding, as well\nas encryption and a generic \u0027other\u0027 field.  Neither the encryption or the\n\u0027other\u0027 field are currently used.\n\nIn order to limit the amount of data read for a single random read in the\nfile, the size of a compressed extent is limited to 128k.  This is a\nsoftware only limit, the disk format supports u64 sized compressed extents.\n\nIn order to limit the ram consumed while processing extents, the uncompressed\nsize of a compressed extent is limited to 256k.  This is a software only limit\nand will be subject to tuning later.\n\nChecksumming is still done on compressed extents, and it is done on the\nuncompressed version of the data.  This way additional encodings can be\nlayered on without having to figure out which encoding to checksum.\n\nCompression happens at delalloc time, which is basically singled threaded because\nit is usually done by a single pdflush thread.  This makes it tricky to\nspread the compression load across all the cpus on the box.  We\u0027ll have to\nlook at parallel pdflush walks of dirty inodes at a later time.\n\nDecompression is hooked into readpages and it does spread across CPUs nicely.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "3bb1a1bc42f2ae9582c28adf620484efcd4da38d",
      "tree": "4e65ee859e73ea9558e33a02ba10e1d9d54756f3",
      "parents": [
        "a76a3cd40c1127ca199d4f7f37bf0d541bf44eb2"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Thu Oct 09 11:46:24 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Oct 09 11:46:24 2008 -0400"
      },
      "message": "Btrfs: Remove offset field from struct btrfs_extent_ref\n\nThe offset field in struct btrfs_extent_ref records the position\ninside file that file extent is referenced by. In the new back\nreference system, tree leaves holding references to file extent\nare recorded explicitly. We can scan these tree leaves very quickly, so the\noffset field is not required.\n\nThis patch also makes the back reference system check the objectid\nwhen extents are in deleting.\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "a76a3cd40c1127ca199d4f7f37bf0d541bf44eb2",
      "tree": "a91e91d9f67ce8bd314cebdacc458315d3e54275",
      "parents": [
        "a62b940160d8125016e85046e68ae621c99e751f"
      ],
      "author": {
        "name": "Yan Zheng",
        "email": "zheng.yan@oracle.com",
        "time": "Thu Oct 09 11:46:29 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Oct 09 11:46:29 2008 -0400"
      },
      "message": "Btrfs: Count space allocated to file in bytes\n\nThis patch makes btrfs count space allocated to file in bytes instead\nof 512 byte sectors.\n\nEverything else in btrfs uses a byte count instead of sector sizes or\nblocks sizes, so this fits better.\n\nSigned-off-by: Yan Zheng \u003czheng.yan@oracle.com\u003e\n\n"
    },
    {
      "commit": "31840ae1a6b433ca0e6a8d341756ff478bbf959e",
      "tree": "9343db596aec175e9640aa2800b80f01496d7047",
      "parents": [
        "1c2308f8e7d8491467e0095af2b01500f1b70819"
      ],
      "author": {
        "name": "Zheng Yan",
        "email": "zheng.yan@oracle.com",
        "time": "Tue Sep 23 13:14:14 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Full back reference support\n\nThis patch makes the back reference system to explicit record the\nlocation of parent node for all types of extents. The location of\nparent node is placed into the offset field of backref key. Every\ntime a tree block is balanced, the back references for the affected\nlower level extents are updated.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "9623f9a3894ec95fe140ee5460bb840ac53bc6a0",
      "tree": "e83d9907093f032cf4b5a4260815dd832bd5fb3f",
      "parents": [
        "d0c803c4049c5ca322d4795d8b74f28768603e0e"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 11 17:42:42 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Disable the dir fsync optimization to skip logging the dir sometimes\n\nMore testing has turned up a bug, disable this for now.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "d0c803c4049c5ca322d4795d8b74f28768603e0e",
      "tree": "b4c4f11b2f5938ad183a1771cd0b9e122709e2ff",
      "parents": [
        "31ff1cd25d376e8f499d450de177dffadc9e1c56"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 11 16:17:57 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Record dirty pages tree-log pages in an extent_io tree\n\nThis is the same way the transaction code makes sure that all the\nother tree blocks are safely on disk.  There\u0027s an extent_io tree\nfor each root, and any blocks allocated to the tree logs are\nrecorded in that tree.\n\nAt tree-log sync, the extent_io tree is walked to flush down the\ndirty pages and wait for them.\n\nThe main benefit is less time spent walking the tree log and skipping\nclean pages, and getting sequential IO down to the drive.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "31ff1cd25d376e8f499d450de177dffadc9e1c56",
      "tree": "aa91844a70dcf0e285dd23318b5c80639c72b669",
      "parents": [
        "d00aff00139b40f2e9c60299d76aac29d72e48ba"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 11 16:17:57 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Copy into the log tree in big batches\n\nThis changes the log tree copy code to use btrfs_insert_items and\nto work in larger batches where possible.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "d00aff00139b40f2e9c60299d76aac29d72e48ba",
      "tree": "3ef3d84c42dc809cd92ab6339abd968fdede357d",
      "parents": [
        "3a5f1d458ad1610a06e38f0be2fbc6ac215439c0"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 11 15:54:42 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Optimize tree log block allocations\n\nSince tree log blocks get freed every transaction, they never really\nneed to be written to disk.  This skips the step where we update\nmetadata to record they were allocated.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "3a5f1d458ad1610a06e38f0be2fbc6ac215439c0",
      "tree": "00fc015c5b494c7307d5dcae61b2d5d5ed6bf587",
      "parents": [
        "49eb7e46d47ea72a9bd2a5f8cedb04f5159cc277"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 11 15:53:37 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Optimize btree walking while logging inodes\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "49eb7e46d47ea72a9bd2a5f8cedb04f5159cc277",
      "tree": "c3d05588c3cf73453673206214fadedc07bd79d7",
      "parents": [
        "98509cfc5a6857bddcfe4b19a9539726655ec9bd"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 11 15:53:12 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Dir fsync optimizations\n\nDrop i_mutex during the commit\n\nDon\u0027t bother doing the fsync at all unless the dir is marked as dirtied\nand needing fsync in this transaction.  For directories, this means\nthat someone has unlinked a file from the dir without fsyncing the\nfile.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "8d5bf1cb35ea29795862ff0ea2f4c4d7e22727f3",
      "tree": "1c9af9227dfb34a47230ebefbb0eed4f3125bcfe",
      "parents": [
        "4bef084857ab8fe71cf49eae349c25e440a49150"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 11 15:51:21 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Update the highest objectid in a root after log replay is done\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "4bef084857ab8fe71cf49eae349c25e440a49150",
      "tree": "7a9a850515538421c2976f8ee4c1bea5ceced59c",
      "parents": [
        "325cd4bafeb6cfb44addd6e807a9b74170d1be31"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Mon Sep 08 11:18:08 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Tree logging fixes\n\n* Pin down data blocks to prevent them from being reallocated like so:\n\ntrans 1: allocate file extent\ntrans 2: free file extent\ntrans 3: free file extent during old snapshot deletion\ntrans 3: allocate file extent to new file\ntrans 3: fsync new file\n\nBefore the tree logging code, this was legal because the fsync\nwould commit the transation that did the final data extent free\nand the transaction that allocated the extent to the new file\nat the same time.\n\nWith the tree logging code, the tree log subtransaction can commit\nbefore the transaction that freed the extent.  If we crash,\nwe\u0027re left with two different files using the extent.\n\n* Don\u0027t wait in start_transaction if log replay is going on.  This\navoids deadlocks from iput while we\u0027re cleaning up link counts in the\nreplay code.\n\n* Don\u0027t deadlock in replay_one_name by trying to read an inode off\nthe disk while holding paths for the directory\n\n* Hold the buffer lock while we mark a buffer as written.  This\ncloses a race where someone is changing a buffer while we write it.\nThey are supposed to mark it dirty again after they change it, but\nthis violates the cow rules.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    },
    {
      "commit": "e02119d5a7b4396c5a872582fddc8bd6d305a70a",
      "tree": "825efe2a79dbca8d61256183f3526a5b5dc40dc6",
      "parents": [
        "a1b32a5932cfac7c38b442582285f3da2a09dfd8"
      ],
      "author": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Fri Sep 05 16:13:11 2008 -0400"
      },
      "committer": {
        "name": "Chris Mason",
        "email": "chris.mason@oracle.com",
        "time": "Thu Sep 25 11:04:07 2008 -0400"
      },
      "message": "Btrfs: Add a write ahead tree log to optimize synchronous operations\n\nFile syncs and directory syncs are optimized by copying their\nitems into a special (copy-on-write) log tree.  There is one log tree per\nsubvolume and the btrfs super block points to a tree of log tree roots.\n\nAfter a crash, items are copied out of the log tree and back into the\nsubvolume.  See tree-log.c for all the details.\n\nSigned-off-by: Chris Mason \u003cchris.mason@oracle.com\u003e\n"
    }
  ]
}
