)]}'
{
  "log": [
    {
      "commit": "41841b0bcea8af7f3bff8b2a23d542b94d9c1bb1",
      "tree": "89eddf2dffadbbd13939f94eb8cd904a26279390",
      "parents": [
        "316ce2ba8e74a7bb9153b9f93adc883cb1ceb9fd",
        "1a934c3e57594588c373aea858e4593cdfcba4f4"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue May 18 16:40:42 2010 -0700"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue May 18 16:40:42 2010 -0700"
      },
      "message": "Merge branch \u0027discontig-bg\u0027 of git://oss.oracle.com/git/tma/linux-2.6 into ocfs2-merge-window\n"
    },
    {
      "commit": "ee149a7c6cbaee0e3a1a7d9e9f92711228ef5236",
      "tree": "eb91fa9c12d9d44a3a314f75c5acd4ce1b7328a5",
      "parents": [
        "e8aec068ecb1957630816cfa2c150c6b3ddd1790"
      ],
      "author": {
        "name": "Tristan Ye",
        "email": "tristan.ye@oracle.com",
        "time": "Tue May 11 17:54:44 2010 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue May 18 12:28:13 2010 -0700"
      },
      "message": "Ocfs2: Make ocfs2_find_cpos_for_left_leaf() public.\n\nThe original idea to pull ocfs2_find_cpos_for_left_leaf() out of\nalloc.c is to benefit punching-holes optimization patch, it however,\ncan also be referred by other funcs in the future who want to do the\nsame job.\n\nSigned-off-by: Tristan Ye \u003ctristan.ye@oracle.com\u003e\nAcked-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "78f94673d7faf01677f374f4ebbf324ff1a0aa6e",
      "tree": "1bd394469f12b5e148835365295d1df413c04a0c",
      "parents": [
        "547ba7c8efe43c2cabb38782e23572a6179dd1c1"
      ],
      "author": {
        "name": "Tristan Ye",
        "email": "tristan.ye@oracle.com",
        "time": "Tue May 11 17:54:42 2010 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue May 18 12:25:10 2010 -0700"
      },
      "message": "Ocfs2: Optimize ocfs2 truncate to use ocfs2_remove_btree_range() instead.\n\nTruncate is just a special case of punching holes(from new i_size to\nend), we therefore could take advantage of the existing\nocfs2_remove_btree_range() to reduce the comlexity and redundancy in\nalloc.c.  The goal here is to make truncate more generic and\nstraightforward.\n\nSeveral functions only used by ocfs2_commit_truncate() will smiply be\nremoved.\n\nocfs2_remove_btree_range() was originally used by the hole punching\ncode, which didn\u0027t take refcount trees into account (definitely a bug).\nWe therefore need to change that func a bit to handle refcount trees.\nIt must take the refcount lock, calculate and reserve blocks for\nrefcount tree changes, and decrease refcounts at the end.  We replace \nocfs2_lock_allocators() here by adding a new func\nocfs2_reserve_blocks_for_rec_trunc() which accepts some extra blocks to\nreserve.  This will not hurt any other code using\nocfs2_remove_btree_range() (such as dir truncate and hole punching).\n\nI merged the following steps into one patch since they may be\nlogically doing one thing, though I know it looks a little bit fat\nto review.\n\n1). Remove redundant code used by ocfs2_commit_truncate(), since we\u0027re\n    moving to ocfs2_remove_btree_range anyway.\n\n2). Add a new func ocfs2_reserve_blocks_for_rec_trunc() for purpose of\n    accepting some extra blocks to reserve.\n\n3). Change ocfs2_prepare_refcount_change_for_del() a bit to fit our\n    needs.  It\u0027s safe to do this since it\u0027s only being called by\n    truncate.\n\n4). Change ocfs2_remove_btree_range() a bit to take refcount case into\n    account.\n\n5). Finally, we change ocfs2_commit_truncate() to call\n    ocfs2_remove_btree_range() in a proper way.\n\nThe patch has been tested normally for sanity check, stress tests\nwith heavier workload will be expected.\n\nBased on this patch, fixing the punching holes bug will be fairly easy.\n\nSigned-off-by: Tristan Ye \u003ctristan.ye@oracle.com\u003e\nAcked-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "c901fb00731e307c2c6e8c7d5eee005df5835f9d",
      "tree": "4c68bf68590d04d1045ae5d66a9ae158c56019fa",
      "parents": [
        "3e4218df3176657be72ad2fa199779be6c11fe4f"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Mon Apr 26 14:34:57 2010 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed May 05 18:18:09 2010 -0700"
      },
      "message": "ocfs2: Make ocfs2_extend_trans() really extend.\n\nIn ocfs2, we use ocfs2_extend_trans() to extend a journal handle\u0027s\nblocks. But if jbd2_journal_extend() fails, it will only restart\nwith the the new number of blocks.  This tends to be awkward since\nin most cases we want additional reserved blocks. It makes our code\nharder to mantain since the caller can\u0027t be sure all the original\nblocks will not be accessed and dirtied again.  There are 15 callers\nof ocfs2_extend_trans() in fs/ocfs2, and 12 of them have to add\nh_buffer_credits before they call ocfs2_extend_trans().  This makes\nocfs2_extend_trans() really extend atop the original block count.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "4fe370afaae49c57619bb0bedb75de7e7c168308",
      "tree": "7b2752fc9616578e9e3baa659e6c724b301d26c5",
      "parents": [
        "d02f00cc057809d96c044cc72d5b9809d59f7d49"
      ],
      "author": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Dec 07 13:15:40 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed May 05 18:17:30 2010 -0700"
      },
      "message": "ocfs2: use allocation reservations during file write\n\nAdd a per-inode reservations structure and pass it through to the\nreservations code.\n\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "ec20cec7a351584ca6c70ead012e73d61f9a8e04",
      "tree": "39af308ae07ab168313bb50ced1bb1ae7ef7e6a3",
      "parents": [
        "b4414eea0e7b9c134262c801a87e338bf675962c"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Mar 19 14:13:52 2010 -0700"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed May 05 18:17:29 2010 -0700"
      },
      "message": "ocfs2: Make ocfs2_journal_dirty() void.\n\njbd[2]_journal_dirty_metadata() only returns 0.  It\u0027s been returning 0\nsince before the kernel moved to git.  There is no point in checking\nthis error.\n\nocfs2_journal_dirty() has been faithfully returning the status since the\nbeginning.  All over ocfs2, we have blocks of code checking this can\u0027t\nfail status.  In the past few years, we\u0027ve tried to avoid adding these\nchecks, because they are pointless.  But anyone who looks at our code\nassumes they are needed.\n\nFinally, ocfs2_journal_dirty() is made a void function.  All error\nchecking is removed from other files.  We\u0027ll BUG_ON() the status of\njbd2_journal_dirty_metadata() just in case they change it someday.  They\nwon\u0027t.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "74380c479ad83addeff8a172ab95f59557b5b0c3",
      "tree": "49b94f3ff48cd2ca6b53977a5e3070380ccecd6b",
      "parents": [
        "af2bf0d86019e0b0306965321096f8380b7ca830"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Mon Mar 22 14:20:18 2010 +0800"
      },
      "committer": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Mon Mar 22 14:20:18 2010 +0800"
      },
      "message": "ocfs2: Free block to the right block group.\n\nIn case the block we are going to free is allocated from\na discontiguous block group, we have to use suballoc_loc\nto be the right group.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "2b6cb576aa80611f1f6a3c88708d1e68a8d97985",
      "tree": "a984f09104970133379e4d370b9f01e7f85c6f9b",
      "parents": [
        "ba2066351b630f0205ebf725f5c81a2a07a77cd7"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Mar 26 10:09:15 2010 +0800"
      },
      "committer": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Fri Mar 26 10:09:15 2010 +0800"
      },
      "message": "ocfs2: Set suballoc_loc on allocated metadata.\n\nGet the suballoc_loc from ocfs2_claim_new_inode() or\nocfs2_claim_metadata().  Store it on the appropriate field of the block\nwe just allocated.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "1ed9b777f77929ae961d6f9cdf828a07200ba71c",
      "tree": "a0bb6c9e9be1f5d3d46d6cdac0a4397303e22795",
      "parents": [
        "13e434cf0cacd2f03a7f4cd077e3e995ef5ef710"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu May 06 13:59:06 2010 +0800"
      },
      "committer": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Thu May 06 13:59:06 2010 +0800"
      },
      "message": "ocfs2: ocfs2_claim_*() don\u0027t need an ocfs2_super argument.\n\nThey all take an ocfs2_alloc_context, which has the allocation inode.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "e213e26ab3988c516c06eba4dcd030ac052f6dc9",
      "tree": "6e26fbdbb842b387697d73daf6e70cf718269a77",
      "parents": [
        "c812a51d11bbe983f4c24e32b59b265705ddd3c2",
        "efd8f0e6f6c1faa041f228d7113bd3a9db802d49"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Mar 05 13:20:53 2010 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Mar 05 13:20:53 2010 -0800"
      },
      "message": "Merge branch \u0027for_linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6\n\n* \u0027for_linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6: (33 commits)\n  quota: stop using QUOTA_OK / NO_QUOTA\n  dquot: cleanup dquot initialize routine\n  dquot: move dquot initialization responsibility into the filesystem\n  dquot: cleanup dquot drop routine\n  dquot: move dquot drop responsibility into the filesystem\n  dquot: cleanup dquot transfer routine\n  dquot: move dquot transfer responsibility into the filesystem\n  dquot: cleanup inode allocation / freeing routines\n  dquot: cleanup space allocation / freeing routines\n  ext3: add writepage sanity checks\n  ext3: Truncate allocated blocks if direct IO write fails to update i_size\n  quota: Properly invalidate caches even for filesystems with blocksize \u003c pagesize\n  quota: generalize quota transfer interface\n  quota: sb_quota state flags cleanup\n  jbd: Delay discarding buffers in journal_unmap_buffer\n  ext3: quota_write cross block boundary behaviour\n  quota: drop permission checks from xfs_fs_set_xstate/xfs_fs_set_xquota\n  quota: split out compat_sys_quotactl support from quota.c\n  quota: split out netlink notification support from quota.c\n  quota: remove invalid optimization from quota_sync_all\n  ...\n\nFixed trivial conflicts in fs/namei.c and fs/ufs/inode.c\n"
    },
    {
      "commit": "5dd4056db84387975140ff2568eaa0406f07985e",
      "tree": "03c26d7f6e3367b167bfeeb1a01654c6619573f4",
      "parents": [
        "49792c806d0bfd53afc789dcdf50dc9bed2c5b83"
      ],
      "author": {
        "name": "Christoph Hellwig",
        "email": "hch@infradead.org",
        "time": "Wed Mar 03 09:05:00 2010 -0500"
      },
      "committer": {
        "name": "Jan Kara",
        "email": "jack@suse.cz",
        "time": "Fri Mar 05 00:20:28 2010 +0100"
      },
      "message": "dquot: cleanup space allocation / freeing routines\n\nGet rid of the alloc_space, free_space, reserve_space, claim_space and\nrelease_rsv dquot operations - they are always called from the filesystem\nand if a filesystem really needs their own (which none currently does)\nit can just call into it\u0027s own routine directly.\n\nMove shared logic into the common __dquot_alloc_space,\ndquot_claim_space_nodirty and __dquot_free_space low-level methods,\nand rationalize the wrappers around it to move as much as possible\ncode into the common block for CONFIG_QUOTA vs not.  Also rename\nall these helpers to be named dquot_* instead of vfs_dq_*.\n\nSigned-off-by: Christoph Hellwig \u003chch@lst.de\u003e\nSigned-off-by: Jan Kara \u003cjack@suse.cz\u003e\n"
    },
    {
      "commit": "b89c54282db0c8634a2d2dc200f196d571750ce5",
      "tree": "fbb34a01b3f0b2f4af6aae9ede9f3f21ef2a378d",
      "parents": [
        "a5f28ae4df291d81d9d23066f88c55ca45e388d3"
      ],
      "author": {
        "name": "Tiger Yang",
        "email": "tiger.yang@oracle.com",
        "time": "Mon Jan 25 14:11:06 2010 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 26 15:41:07 2010 -0800"
      },
      "message": "ocfs2: add extent block stealing for ocfs2 v5\n\nThis patch add extent block (metadata) stealing mechanism for\nextent allocation. This mechanism is same as the inode stealing.\nif no room in slot specific extent_alloc, we will try to\nallocate extent block from the next slot.\n\nSigned-off-by: Tiger Yang \u003ctiger.yang@oracle.com\u003e\nAcked-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "849254e9bba985e281526b57c02562c7a49a2fcf",
      "tree": "a061f4de1c7b2836185e9d5bd4d7871c79692ca4",
      "parents": [
        "6f40334694dce047d43c6f2cce255b596da6de50",
        "10cf1a02f444fdcd50be47cce3fa8bf08251dd9c"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Dec 23 13:33:07 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Dec 23 13:33:07 2009 -0800"
      },
      "message": "Merge branch \u0027upstream-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2\n\n* \u0027upstream-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2:\n  ocfs2: Set i_nlink properly during reflink.\n  ocfs2: Add reflinked file\u0027s inode to inode hash eariler.\n  ocfs2: refcounttree.c cleanup.\n  ocfs2: Find proper end cpos for a leaf refcount block.\n"
    },
    {
      "commit": "2cfd30adf6130dab3fbb130eb5f7b1fd42a70e31",
      "tree": "2e7ca4760d58164d6352ede7813f854f485a5404",
      "parents": [
        "1e431f5ce78f3ae8254d725060288b78ff74f086"
      ],
      "author": {
        "name": "Christoph Hellwig",
        "email": "hch@lst.de",
        "time": "Wed Sep 23 15:04:02 2009 +0200"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Dec 16 12:16:49 2009 -0500"
      },
      "message": "ocfs: stop using do_sync_mapping_range\n\ndo_sync_mapping_range(..., SYNC_FILE_RANGE_WRITE) is a very awkward way\nto perform a filemap_fdatawrite_range.\n\nSigned-off-by: Christoph Hellwig \u003chch@lst.de\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "af901ca181d92aac3a7dc265144a9081a86d8f39",
      "tree": "380054af22521144fbe1364c3bcd55ad24c9bde4",
      "parents": [
        "972b94ffb90ea6d20c589d9a47215df103388ddd"
      ],
      "author": {
        "name": "André Goddard Rosa",
        "email": "andre.goddard@gmail.com",
        "time": "Sat Nov 14 13:09:05 2009 -0200"
      },
      "committer": {
        "name": "Jiri Kosina",
        "email": "jkosina@suse.cz",
        "time": "Fri Dec 04 15:39:55 2009 +0100"
      },
      "message": "tree-wide: fix assorted typos all over the place\n\nThat is \"success\", \"unknown\", \"through\", \"performance\", \"[re|un]mapping\"\n, \"access\", \"default\", \"reasonable\", \"[con]currently\", \"temperature\"\n, \"channel\", \"[un]used\", \"application\", \"example\",\"hierarchy\", \"therefore\"\n, \"[over|under]flow\", \"contiguous\", \"threshold\", \"enough\" and others.\n\nSigned-off-by: André Goddard Rosa \u003candre.goddard@gmail.com\u003e\nSigned-off-by: Jiri Kosina \u003cjkosina@suse.cz\u003e\n"
    },
    {
      "commit": "38a04e432768ec0b016f3c687b4de31ac111ae59",
      "tree": "a71a01561d6a654b8daf12c51e2e909f82950573",
      "parents": [
        "56f3f55cf9b604b924353ab6fcdac5fee5637ae3"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Mon Nov 30 14:32:19 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Dec 02 16:14:57 2009 -0800"
      },
      "message": "ocfs2: Find proper end cpos for a leaf refcount block.\n\nocfs2 refcount tree is stored as an extent tree while\nthe leaf ocfs2_refcount_rec points to a refcount block.\n\nThe following step can trip a kernel panic.\nmkfs.ocfs2 -b 512 -C 1M --fs-features\u003drefcount $DEVICE\nmount -t ocfs2 $DEVICE $MNT_DIR\nFILE_NAME\u003d$RANDOM\nFILE_NAME_1\u003d$RANDOM\nFILE_REF\u003d\"${FILE_NAME}_ref\"\nFILE_REF_1\u003d\"${FILE_NAME}_ref_1\"\nfor((i\u003d0;i\u003c305;i++))\ndo\n# /mnt/1048576 is a file with 1048576 sizes.\ncat /mnt/1048576 \u003e\u003e $MNT_DIR/$FILE_NAME\ncat /mnt/1048576 \u003e\u003e $MNT_DIR/$FILE_NAME_1\ndone\nfor((i\u003d0;i\u003c3;i++))\ndo\ncat /mnt/1048576 \u003e\u003e $MNT_DIR/$FILE_NAME\ndone\n\nfor((i\u003d0;i\u003c2;i++))\ndo\ncat /mnt/1048576 \u003e\u003e $MNT_DIR/$FILE_NAME\ncat /mnt/1048576 \u003e\u003e $MNT_DIR/$FILE_NAME_1\ndone\n\ncat /mnt/1048576 \u003e\u003e $MNT_DIR/$FILE_NAME\n\nfor((i\u003d0;i\u003c11;i++))\ndo\ncat /mnt/1048576 \u003e\u003e $MNT_DIR/$FILE_NAME\ncat /mnt/1048576 \u003e\u003e $MNT_DIR/$FILE_NAME_1\ndone\nreflink $MNT_DIR/$FILE_NAME $MNT_DIR/$FILE_REF\n# write_f is a program which will write some bytes to a file at offset.\n# write_f -f file_name -l offset -w write_bytes.\n./write_f -f $MNT_DIR/$FILE_REF -l $[310*1048576] -w 4096\n./write_f -f $MNT_DIR/$FILE_REF -l $[306*1048576] -w 4096\n./write_f -f $MNT_DIR/$FILE_REF -l $[311*1048576] -w 4096\n./write_f -f $MNT_DIR/$FILE_NAME -l $[310*1048576] -w 4096\n./write_f -f $MNT_DIR/$FILE_NAME -l $[311*1048576] -w 4096\nreflink $MNT_DIR/$FILE_NAME $MNT_DIR/$FILE_REF_1\n./write_f -f $MNT_DIR/$FILE_NAME -l $[311*1048576] -w 4096\n#kernel panic here.\n\nThe reason is that if the ocfs2_extent_rec is the last record\nin a leaf extent block, the old solution fails to find the\nsuitable end cpos. So this patch try to walk through the b-tree,\nfind the next sub root and get the c_pos the next sub-tree starts\nfrom.\n\nbtw, I have runned tristan\u0027s test case against the patched kernel\nfor several days and this type of kernel panic never happens again.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "c18b812d127a971901180188b918a7cd98ccd4d6",
      "tree": "3f2d0a7b1fada7aaade612d14dcaa7229a4e06c9",
      "parents": [
        "7540c1a77b26bc2f9d86a0bfbe6597b05ec5f93d"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:44:07 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:46 2009 -0700"
      },
      "message": "ocfs2: Make transaction extend more efficient.\n\nIn ocfs2_extend_rotate_transaction, op_credits is the orignal\ncredits in the handle and we only want to extend the credits\nfor the rotation, but the old solution always double it. It\nis harmless for some minor operations, but for actions like\nreflink we may rotate tree many times and cause the credits\nincrease dramatically. So this patch try to only increase\nthe desired credits.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "6ae23c5555176c5b23480c9c578ff27437085ba5",
      "tree": "4afb1c33e850fa751c6136d65a041f70fe146fe8",
      "parents": [
        "6f70fa519976a379d72781d927cf8e5f5b05ec86"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:30:55 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:36 2009 -0700"
      },
      "message": "ocfs2: CoW refcount tree improvement.\n\nDuring CoW, if the old extent record is refcounted, we allocate\nsom new clusters and do CoW. Actually we can have some improvement\nhere. If the old extent has refcount\u003d1, that means now it is only\nused by this file. So we don\u0027t need to allocate new clusters, just\nremove the refcounted flag and it is OK. We also have to remove\nit from the refcount tree while not deleting it.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "6f70fa519976a379d72781d927cf8e5f5b05ec86",
      "tree": "563cdeb116f2016c3c4b7a627a51f0a85eec1566",
      "parents": [
        "bcbbb24a6a5c5b3e7b8e5284e0bfa23f45c32377"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 25 08:05:12 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:36 2009 -0700"
      },
      "message": "ocfs2: Add CoW support.\n\nThis patch try CoW support for a refcounted record.\n\nthe whole process will be:\n1. Calculate how many clusters we need to CoW and where we start.\n   Extents that are not completely encompassed by the write will\n   be broken on 1MB boundaries.\n2. Do CoW for the clusters with the help of page cache.\n3. Change the b-tree structure with the new allocated clusters.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "bcbbb24a6a5c5b3e7b8e5284e0bfa23f45c32377",
      "tree": "e45a6cfd75cd8005fdf280c2f5f57c09186249dd",
      "parents": [
        "1aa75fea64bc26bda9be9b1b20ae253d7a481877"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:29:12 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:35 2009 -0700"
      },
      "message": "ocfs2: Decrement refcount when truncating refcounted extents.\n\nAdd \u0027Decrement refcount for delete\u0027 in to the normal truncate\nprocess. So for a refcounted extent record, call refcount rec\ndecrementation instead of cluster free.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "1aa75fea64bc26bda9be9b1b20ae253d7a481877",
      "tree": "5da0c235f1323b9771e44a18a5452c83c0969547",
      "parents": [
        "1823cb0b9fe5e6d48017ee3f92428f69c0235d87"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:28:39 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:34 2009 -0700"
      },
      "message": "ocfs2: Add functions for extents refcounted.\n\nAdd function ocfs2_mark_extent_refcounted which can mark\nan extent refcounted.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "1823cb0b9fe5e6d48017ee3f92428f69c0235d87",
      "tree": "461e5d6cc255c400acac69dd968fae935a9c073f",
      "parents": [
        "e73a819db9c2d6c4065b7cab7374709b6939e8f1"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:24:49 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:33 2009 -0700"
      },
      "message": "ocfs2: Add support of decrementing refcount for delete.\n\n    Given a physical cpos and length, decrement the refcount\nin the tree. If the refcount for any portion of the extent goes\nto zero, that portion is queued for freeing.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "e2e9f6082b5ff099978774d5c0148e062344c2f9",
      "tree": "1da7dc993c77ca08cb83aba8f21e0da9fd055044",
      "parents": [
        "fe924415957e60471536762172d127e85519ef78"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:22:34 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:32 2009 -0700"
      },
      "message": "ocfs2: move tree path functions to alloc.h.\n\nNow fs/ocfs2/alloc.c has more than 7000 lines. It contains our\nbasic b-tree operation. Although we have already make our b-tree\noperation generic, the basic structrue ocfs2_path which is used\nto iterate one b-tree branch is still static and limited to only\nused in alloc.c. As refcount tree need them and I don\u0027t want to\nadd any more b-tree unrelated code to alloc.c, export them out.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e \n"
    },
    {
      "commit": "fe924415957e60471536762172d127e85519ef78",
      "tree": "c26f47180bbc14fda78dae0cb3d40287d6dafd18",
      "parents": [
        "555936bfcb1af26c6919d6cedb83710bb03d4322"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:22:25 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:31 2009 -0700"
      },
      "message": "ocfs2: Add refcount b-tree as a new extent tree.\n\nAdd refcount b-tree as a new extent tree so that it can\nuse the b-tree to store and maniuplate ocfs2_refcount_rec.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "555936bfcb1af26c6919d6cedb83710bb03d4322",
      "tree": "8d63ff0c4a0ff9587cb84dcd8ca9333c94d34ff8",
      "parents": [
        "853a3a1439b18d5a70ada2cb3fcd468e70b7d095"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:22:21 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:31 2009 -0700"
      },
      "message": "ocfs2: Abstract extent split process.\n\nocfs2_mark_extent_written actually does the following things:\n1. check the parameters.\n2. initialize the left_path and split_rec.\n3. call __ocfs2_mark_extent_written. it will do:\n   1) check the flags of unwritten\n   2) do the real split work.\nThe whole process is packed tightly somehow. So this patch\nwill abstract 2 different functions so that future b-tree\noperation can work with it.\n\n1. __ocfs2_split_extent will accept path and split_rec and do\n  the real split work.\n2. ocfs2_change_extent_flag will accept a new flag and initialize\n   path and split_rec.\n\nSo now ocfs2_mark_extent_written will do:\n1. check the parameters.\n2. call ocfs2_change_extent_flag.\n   1) initalize the left_path and split_rec.\n   2) check whether the new flags conflict with the old one.\n   3) call __ocfs2_split_extent to do the split.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n"
    },
    {
      "commit": "853a3a1439b18d5a70ada2cb3fcd468e70b7d095",
      "tree": "96f4a2f3ca4380a6d0feb6f1b8af038bb62946c5",
      "parents": [
        "8bf396de984e68491569b49770e4fd7aca40ba65"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Aug 18 11:22:18 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Sep 22 20:09:30 2009 -0700"
      },
      "message": "ocfs2: Wrap ocfs2_extent_contig in ocfs2_extent_tree.\n\nAdd a new operation eo_ocfs2_extent_contig int the extent tree\u0027s\noperations vector. So that with the new refcount tree, We want\nthis so that refcount trees can always return CONTIG_NONE and\nprevent extent merging.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\n\n"
    },
    {
      "commit": "5e404e9ed1b05cafb044bd46792e50197df805ed",
      "tree": "e3146e03f8a0fc12307db0cbea900728a36ffaac",
      "parents": [
        "a1cf076ba93f9fdf3eb4195f9f43d1e7cb7550f2"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:54:22 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:13 2009 -0700"
      },
      "message": "ocfs2: Pass ocfs2_caching_info into ocfs_init_*_extent_tree().\n\nWith this commit, extent tree operations are divorced from inodes and\nrely on ocfs2_caching_info.  Phew!\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "a1cf076ba93f9fdf3eb4195f9f43d1e7cb7550f2",
      "tree": "27fbf5b5b5b87e3d427d9deee06ec882370d1d1a",
      "parents": [
        "f3868d0fa2e20d923087a8296fda47b0afe7f9ba"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:45:49 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:12 2009 -0700"
      },
      "message": "ocfs2: __ocfs2_mark_extent_written() doesn\u0027t need struct inode.\n\nWe only allow unwritten extents on data, so the toplevel\nocfs2_mark_extent_written() can use an inode all it wants.  But the\nsubfunction isn\u0027t even using the inode argument.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "f3868d0fa2e20d923087a8296fda47b0afe7f9ba",
      "tree": "d9a97217cd42d379cfa5b82a866071e3d1428a23",
      "parents": [
        "d231129f44e7ead14f5f496e664ff1e3883a7b25"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Feb 17 19:46:04 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:11 2009 -0700"
      },
      "message": "ocfs2: Teach ocfs2_replace_extent_rec() to use an extent_tree.\n\nDon\u0027t use a struct inode anymore.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "d231129f44e7ead14f5f496e664ff1e3883a7b25",
      "tree": "b7e94ee43d2a3c53e1d93df24208ab734256c007",
      "parents": [
        "dbdcf6a48a40e6c9d7081393d793c4f1c5bb4fcf"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:43:22 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:11 2009 -0700"
      },
      "message": "ocfs2: ocfs2_split_and_insert() no longer needs struct inode.\n\nIt already has an extent_tree.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "dbdcf6a48a40e6c9d7081393d793c4f1c5bb4fcf",
      "tree": "d50b179dbbe1a62ea98a0b65ecf33c9a86d906b0",
      "parents": [
        "cbee7e1a6a1a2a3d6eda1f76ffc38a3ed3eeb6cc"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:41:26 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:10 2009 -0700"
      },
      "message": "ocfs2: ocfs2_remove_extent() no longer needs struct inode.\n\nOne more generic btree function that is isolated from struct inode.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "cbee7e1a6a1a2a3d6eda1f76ffc38a3ed3eeb6cc",
      "tree": "438ac4917675c27ecd3dce694ae3affd7ebf6c91",
      "parents": [
        "cc79d8c19e9d39446525a1026f1a21761f5d3cd2"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:34:15 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:09 2009 -0700"
      },
      "message": "ocfs2: ocfs2_add_clusters_in_btree() no longer needs struct inode.\n\nOne more function that doesn\u0027t need a struct inode to pass to its\nchildren.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "cc79d8c19e9d39446525a1026f1a21761f5d3cd2",
      "tree": "3c9788c2e5ef0c51734dad8186ecd83bf4dd6584",
      "parents": [
        "92ba470c44c1404ff18ca0f4ecce1e5b116bb933"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:24:43 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:09 2009 -0700"
      },
      "message": "ocfs2: ocfs2_insert_extent() no longer needs struct inode.\n\nOne more function down, no inode in the entire insert-extent chain.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "92ba470c44c1404ff18ca0f4ecce1e5b116bb933",
      "tree": "76e29703dfc37acb9ad3d129936ae4d1ddfee258",
      "parents": [
        "627961b77e68b725851cb227db10084bf15f6920"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:18:34 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:08 2009 -0700"
      },
      "message": "ocfs2: Make extent map insertion an extent_tree_operation.\n\nocfs2_insert_extent() wants to insert a record into the extent map if\nit\u0027s an inode data extent.  But since many btrees can call that\nfunction, let\u0027s make it an op on ocfs2_extent_tree.  Other tree types\ncan leave it empty.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "627961b77e68b725851cb227db10084bf15f6920",
      "tree": "2569de1a07782a3d65161b018e90335d844112f0",
      "parents": [
        "1ef61b33148a6b32b6d28383cd72ceeddfc7054d"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:14:38 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:08 2009 -0700"
      },
      "message": "ocfs2: ocfs2_figure_insert_type() no longer needs struct inode.\n\nIt\u0027s not using it, so remove it from the parameter list.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "1ef61b33148a6b32b6d28383cd72ceeddfc7054d",
      "tree": "8e0c3e6131fc72847f37f1ac963b7ba7efe9be3c",
      "parents": [
        "a29702914ad36443d83b5250b3bfa1bf91e6b239"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:12:33 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:07 2009 -0700"
      },
      "message": "ocfs2: Remove inode from ocfs2_figure_extent_contig().\n\nIt already has an ocfs2_extent_tree and doesn\u0027t need the inode.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "a29702914ad36443d83b5250b3bfa1bf91e6b239",
      "tree": "74937c792f6ff893dd108497119895127a16f053",
      "parents": [
        "b4a176515c715f0c6db1759a39cd9c4175e5a23a"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:09:54 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:07 2009 -0700"
      },
      "message": "ocfs2: Swap inode for extent_tree in ocfs2_figure_merge_contig_type().\n\nWe don\u0027t want struct inode in generic btree operations.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "b4a176515c715f0c6db1759a39cd9c4175e5a23a",
      "tree": "e929ed1a0acb1c16755d8584f11e186cf35bc1b4",
      "parents": [
        "3505bec01829a8f690259517add55c7941a4d3d5"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 03:07:09 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:05 2009 -0700"
      },
      "message": "ocfs2: ocfs2_extent_contig() only requires the superblock.\n\nDon\u0027t pass the inode in.  We don\u0027t want it around for generic btree\noperations.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "3505bec01829a8f690259517add55c7941a4d3d5",
      "tree": "981a67f2b16e1aaa03339e9920252b1e6ba173c8",
      "parents": [
        "c38e52bb1c0187186bd3c4a2b318ffe69cd2fdf8"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:57:58 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:05 2009 -0700"
      },
      "message": "ocfs2: ocfs2_do_insert_extent() and ocfs2_insert_path() no longer need an inode.\n\nThey aren\u0027t using it, so remove it from their parameter lists.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "c38e52bb1c0187186bd3c4a2b318ffe69cd2fdf8",
      "tree": "16f8c548f3797822e1a2da68b902ef1a5f8fa8b3",
      "parents": [
        "d562862314a7b131a630f7b912490312387542fb"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:56:23 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:05 2009 -0700"
      },
      "message": "ocfs2: Give ocfs2_split_record() an extent_tree instead of an inode.\n\nAnother on the way to generic btree functions.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "d562862314a7b131a630f7b912490312387542fb",
      "tree": "1ddad8ba544ac712ac1f889729a19511aaefdf22",
      "parents": [
        "4c911eefca316f580f174940cd67d561b4b7e6e8"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:54:36 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:04 2009 -0700"
      },
      "message": "ocfs2: ocfs2_insert_at_leaf() doesn\u0027t need struct inode.\n\nGive it an ocfs2_extent_tree and it is happy.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "4c911eefca316f580f174940cd67d561b4b7e6e8",
      "tree": "785ae90d5e2f0fe71c37aa39027c7144abab3d0c",
      "parents": [
        "043beebb6c467a07ccd7aa666095f87fade1c28e"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:50:12 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:03 2009 -0700"
      },
      "message": "ocfs2: Make truncating the extent map an extent_tree_operation.\n\nocfs2_remove_extent() wants to truncate the extent map if it\u0027s\ntruncating an inode data extent.  But since many btrees can call that\nfunction, let\u0027s make it an op on ocfs2_extent_tree.  Other tree types\ncan leave it empty.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "043beebb6c467a07ccd7aa666095f87fade1c28e",
      "tree": "6e62d3e03ff20a633bd213420bc67ec2cb25b0bb",
      "parents": [
        "d401dc12fcced123909eba10334fb5d78866d1a9"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:42:30 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:03 2009 -0700"
      },
      "message": "ocfs2: ocfs2_truncate_rec() doesn\u0027t need struct inode.\n\nIt\u0027s not using it anymore.  Remove it from the parameter list.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "d401dc12fcced123909eba10334fb5d78866d1a9",
      "tree": "fb0c3042753937d64eeb3d4b60a9dd4ff6ee8150",
      "parents": [
        "c495dd24ac00654f99540f533185e1fcc9534009"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:24:10 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:02 2009 -0700"
      },
      "message": "ocfs2: ocfs2_grow_branch() and ocfs2_append_rec_to_path() lose struct inode.\n\nocfs2_grow_branch() not really using it other than to pass it to the\nsubfunctions ocfs2_shift_tree_depth(), ocfs2_find_branch_target(), and\nocfs2_add_branch().  The first two weren\u0027t it either, so they drop the\nargument.  ocfs2_add_branch() only passed it to\nocfs2_adjust_rightmost_branch(), which drops the inode argument and uses\nthe ocfs2_extent_tree as well.\n\nocfs2_append_rec_to_path() can be take an ocfs2_extent_tree instead of\nthe inode.  The function ocfs2_adjust_rightmost_records() goes along for\nthe ride.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "c495dd24ac00654f99540f533185e1fcc9534009",
      "tree": "2c9837964f002e76011ee06f83b8bcee74a78c23",
      "parents": [
        "4fe82c312a7d975a9d0f591dc9180c1197ee4270"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:19:11 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:02 2009 -0700"
      },
      "message": "ocfs2: ocfs2_try_to_merge_extent() doesn\u0027t need struct inode.\n\nIt\u0027s not using it, so remove it from the parameter list.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "4fe82c312a7d975a9d0f591dc9180c1197ee4270",
      "tree": "53ca5d0aeeeb92768ee993ec69324b3b6767f09f",
      "parents": [
        "70f18c08b476e315c8ee17ea34b55ea1957e7e7d"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:16:08 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:01 2009 -0700"
      },
      "message": "ocfs2: ocfs2_merge_rec_left/right() no longer need struct inode.\n\nDrop it from the parameters - they already have ocfs2_extent_list.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "70f18c08b476e315c8ee17ea34b55ea1957e7e7d",
      "tree": "e53645ea3a3ff2e3d45a31c0f963815f3cfa7fb9",
      "parents": [
        "e46f74dc357947e2aed9bdd63cf335c5fd23810b"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Feb 13 02:09:31 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:08:00 2009 -0700"
      },
      "message": "ocfs2: ocfs2_rotate_tree_left() no longer needs struct inode.\n\nIt already gets ocfs2_extent_tree, so we can just use that.  This chains\nto the same modification for ocfs2_remove_rightmost_path() and\nocfs2_rotate_rightmost_leaf_left().\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "e46f74dc357947e2aed9bdd63cf335c5fd23810b",
      "tree": "2223c4659223d10415a72760a80981e4f784a235",
      "parents": [
        "1e2dd63fe0b6e99b81904a61090db801978b9520"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 19:47:43 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:59 2009 -0700"
      },
      "message": "ocfs2: __ocfs2_rotate_tree_left() doesn\u0027t need struct inode.\n\nIt already has struct ocfs2_extent_tree, which has the caching info.  So\nwe don\u0027t need to pass it struct inode.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "1e2dd63fe0b6e99b81904a61090db801978b9520",
      "tree": "af22705466dda6be2e18d8a23a267e97ea57147b",
      "parents": [
        "09106bae05c3350e8d0ef0ede90b1c3da4bda2f8"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 19:45:28 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:59 2009 -0700"
      },
      "message": "ocfs2: ocfs2_rotate_subtree_left() doesn\u0027t need struct inode.\n\nIt already has struct ocfs2_extent_tree, which has the caching info.  So\nwe don\u0027t need to pass it struct inode.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "09106bae05c3350e8d0ef0ede90b1c3da4bda2f8",
      "tree": "73e216e39897e9519b0e30843cddbd20074fcdca",
      "parents": [
        "1bbf0b8d606645c7596ee641acfbf042765c9719"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 19:43:57 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:58 2009 -0700"
      },
      "message": "ocfs2: ocfs2_update_edge_lengths() doesn\u0027t need struct inode.\n\nPass in the extent tree, which is all we need.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "1bbf0b8d606645c7596ee641acfbf042765c9719",
      "tree": "7d0f4fd611b4617ed52ed6dad7332334381dbe0e",
      "parents": [
        "6136ca5f5f9fd38da399e9ff9380f537c1b3b901"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 19:42:08 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:58 2009 -0700"
      },
      "message": "ocfs2: ocfs2_rotate_tree_right() doesn\u0027t need struct inode.\n\nWe don\u0027t need struct inode in ocfs2_rotate_tree_right() anymore.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "6136ca5f5f9fd38da399e9ff9380f537c1b3b901",
      "tree": "e2927c3b6084a7ea16f872a61011cbcf505f570c",
      "parents": [
        "7dc028056750328e74ca807041c822068384fe16"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 19:32:43 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:57 2009 -0700"
      },
      "message": "ocfs2: Drop struct inode from ocfs2_extent_tree_operations.\n\nWe can get to the inode from the caching information.  Other parent\ntypes don\u0027t need it.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "7dc028056750328e74ca807041c822068384fe16",
      "tree": "507d64e5d1136afea9ad54b9011fea4dfbe8b15f",
      "parents": [
        "5c601aba8c5d9d5f944cf02b59e3288dd72ae6cf"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 19:20:13 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:55 2009 -0700"
      },
      "message": "ocfs2: Pass ocfs2_extent_tree to ocfs2_get_subtree_root()\n\nGet rid of the inode argument.  Use extent_tree instead.  This means a\nfew more functions have to pass an extent_tree around.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "5c601aba8c5d9d5f944cf02b59e3288dd72ae6cf",
      "tree": "7b2a8f2daecfa433a6fa73a7cfecd594fe87dfaf",
      "parents": [
        "4619c73e7c9bd10bac6b60925fa28d5a2eeaf6ed"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 19:10:13 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:55 2009 -0700"
      },
      "message": "ocfs2: Get inode out of ocfs2_rotate_subtree_root_right().\n\nPass the ocfs2_extent_list down through ocfs2_rotate_tree_right() and\nget rid of struct inode in ocfs2_rotate_subtree_root_right().\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "4619c73e7c9bd10bac6b60925fa28d5a2eeaf6ed",
      "tree": "1e280a72eac74615bd298574d747ca543051b766",
      "parents": [
        "6641b0ce3274d979338cb67b2f562189dcbc1c28"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 19:02:36 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:54 2009 -0700"
      },
      "message": "ocfs2: ocfs2_complete_edge_insert() doesn\u0027t need struct inode at all.\n\nCompletely unused argument.  Get rid of it.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "6641b0ce3274d979338cb67b2f562189dcbc1c28",
      "tree": "840466924b7c88fe6959eb4373708198c507f554",
      "parents": [
        "42a5a7a9a5abf9a566b91c51137921957b9a14e4"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 18:57:52 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:54 2009 -0700"
      },
      "message": "ocfs2: Pass ocfs2_extent_tree to ocfs2_unlink_path()\n\nocfs2_unlink_path() doesn\u0027t need struct inode, so let\u0027s pass it struct\nocfs2_extent_tree.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "42a5a7a9a5abf9a566b91c51137921957b9a14e4",
      "tree": "ec676255875d1290ac994f73e3a4dc09fb705b48",
      "parents": [
        "facdb77f54f09a33baf6b649496f5dd1d7922a7e"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 18:49:19 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:53 2009 -0700"
      },
      "message": "ocfs2: ocfs2_create_new_meta_bhs() doesn\u0027t need struct inode.\n\nPass struct ocfs2_extent_tree into ocfs2_create_new_meta_bhs().  It no\nlonger needs struct inode or ocfs2_super.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "facdb77f54f09a33baf6b649496f5dd1d7922a7e",
      "tree": "676de8877773ae38b8379bc3d50073c0710e2d8c",
      "parents": [
        "3d03a305ded8057155bd3c801e64ffef9f534827"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 18:08:48 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:53 2009 -0700"
      },
      "message": "ocfs2: ocfs2_find_path() only needs the caching info\n\nocfs2_find_path and ocfs2_find_leaf() walk our btrees, reading extent\nblocks.  They need struct ocfs2_caching_info for that, but not struct\ninode.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "3d03a305ded8057155bd3c801e64ffef9f534827",
      "tree": "4f220711f42c1abbd80a9fe8c2b6ee47e846a587",
      "parents": [
        "d9a0a1f83bf083b55b3c1f16efddecc31abace61"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 17:49:26 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:52 2009 -0700"
      },
      "message": "ocfs2: Pass ocfs2_caching_info to ocfs2_read_extent_block().\n\nextent blocks belong to btrees on more than just inodes, so we want to\npass the ocfs2_caching_info structure directly to\nocfs2_read_extent_block().  A number of places in alloc.c can now drop\nstruct inode from their argument list.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "d9a0a1f83bf083b55b3c1f16efddecc31abace61",
      "tree": "7e75311f678fb943f2a0b14c91a0877fd7813efe",
      "parents": [
        "0cf2f7632b1789b811ab20b611c4156e6de2b055"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 17:32:34 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:51 2009 -0700"
      },
      "message": "ocfs2: Store the ocfs2_caching_info on ocfs2_extent_tree.\n\nWhat do we cache?  Metadata blocks.  What are most of our non-inode metadata\nblocks?  Extent blocks for our btrees.  struct ocfs2_extent_tree is the\nmain structure for managing those.  So let\u0027s store the associated\nocfs2_caching_info there.\n\nThis means that ocfs2_et_root_journal_access() doesn\u0027t need struct inode\nanymore, and any place that has an et can refer to et-\u003eet_ci instead of\nINODE_CACHE(inode).\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "0cf2f7632b1789b811ab20b611c4156e6de2b055",
      "tree": "34f7cf3584e4fa2bc187d4b75ce052cb98739b0e",
      "parents": [
        "292dd27ec76b96cebcef576f330ab121f59ccf05"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Feb 12 16:41:25 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:50 2009 -0700"
      },
      "message": "ocfs2: Pass struct ocfs2_caching_info to the journal functions.\n\nThe next step in divorcing metadata I/O management from struct inode is\nto pass struct ocfs2_caching_info to the journal functions.  Thus the\njournal locks a metadata cache with the cache io_lock function.  It also\ncan compare ci_last_trans and ci_created_trans directly.\n\nThis is a large patch because of all the places we change\nocfs2_journal_access..(handle, inode, ...) to\nocfs2_journal_access..(handle, INODE_CACHE(inode), ...).\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "8cb471e8f82506937fe5e2e9fb0bf90f6b1f1170",
      "tree": "e275a8f5db101a9990ba44931cfd116123112b11",
      "parents": [
        "6e5a3d7538ad4e46a976862f593faf65750e37cc"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Feb 10 20:00:41 2009 -0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Sep 04 16:07:48 2009 -0700"
      },
      "message": "ocfs2: Take the inode out of the metadata read/write paths.\n\nWe are really passing the inode into the ocfs2_read/write_blocks()\nfunctions to get at the metadata cache.  This commit passes the cache\ndirectly into the metadata block functions, divorcing them from the\ninode.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "60e2ec48665b8495360ca4a6004c5cd52beb2bc1",
      "tree": "dbd938e337b3191bbe16336cb414b9d55c5fdc81",
      "parents": [
        "ada508274b8698a33cb0e5bd037db0f9dc781795"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Wed Aug 12 14:42:47 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Mon Aug 17 12:50:35 2009 -0700"
      },
      "message": "ocfs2: release the buffer head in ocfs2_do_truncate.\n\nIn ocfs2_do_truncate, we forget to release last_eb_bh which\nwill cause memleak. So call brelse in the end.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "82e12644cf5227dab15201fbcaf0ca6330ebd70f",
      "tree": "11485e6192c3e5f0e6c2aa95c2deeb8130b61cc1",
      "parents": [
        "f7b1aa69be138ad9d7d3f31fa56f4c9407f56b6a"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Thu Jul 23 08:12:58 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Jul 23 10:58:46 2009 -0700"
      },
      "message": "ocfs2: Use ocfs2_rec_clusters in ocfs2_adjust_adjacent_records.\n\nIn ocfs2_adjust_adjacent_records, we will adjust adjacent records\naccording to the extent_list in the lower level. But actually\nthe lower level tree will either be a leaf or a branch. If we only\nuse ocfs2_is_empty_extent we will meet with some problem if the lower\ntree is a branch (tree_depth \u003e 1). So use !ocfs2_rec_clusters instead.\nAnd actually only the leaf record can have holes. So add a BUG_ON\nfor non-leaf branch.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "3c5e10683e684ef45614c9071847e48f633d9806",
      "tree": "2861ea95385422c50afc818dd6bb2d2c6cb9d46a",
      "parents": [
        "1f4cea3790bf44137192f441ee84af256e3bf809"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Tue Jul 21 15:42:05 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Jul 21 14:41:54 2009 -0700"
      },
      "message": "ocfs2: Add extra credits and access the modified bh in update_edge_lengths.\n\nIn normal tree rotation left process, we will never touch the tree\nbranch above subtree_index and ocfs2_extend_rotate_transaction doesn\u0027t\nreserve the credits for them either.\n\nBut when we want to delete the rightmost extent block, we have to update\nthe rightmost records for all the rightmost branch(See\nocfs2_update_edge_lengths), so we have to allocate extra credits for them.\nWhat\u0027s more, we have to access them also.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "6b791bcc8b2ae21daf95d18cff2f1eca7a64c9a5",
      "tree": "2ac02c2a17984bfdebebdbb07eb595b35668bca3",
      "parents": [
        "e04cc15f52eb072937cec2bbd8499f37afe5e1ef"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Fri Jun 12 14:18:36 2009 +0800"
      },
      "committer": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Mon Jun 15 14:49:43 2009 -0700"
      },
      "message": "ocfs2: Adjust rightmost path in ocfs2_add_branch.\n\nIn ocfs2_add_branch, we use the rightmost rec of the leaf extent block\nto generate the e_cpos for the newly added branch. In the most case, it\nis OK but if the parent extent block\u0027s rightmost rec covers more clusters\nthan the leaf does, it will cause kernel panic if we insert some clusters\nin it. The message is something like:\n(7445,1):ocfs2_insert_at_leaf:3775 ERROR: bug expression:\nle16_to_cpu(el-\u003el_next_free_rec) \u003e\u003d le16_to_cpu(el-\u003el_count)\n(7445,1):ocfs2_insert_at_leaf:3775 ERROR: inode 66053, depth 0, count 28,\nnext free 28, rec.cpos 270, rec.clusters 1, insert.cpos 275, insert.clusters 1\n [\u003cfa7ad565\u003e] ? ocfs2_do_insert_extent+0xb58/0xda0 [ocfs2]\n [\u003cfa7b08f2\u003e] ? ocfs2_insert_extent+0x5bd/0x6ba [ocfs2]\n [\u003cfa7b1b8b\u003e] ? ocfs2_add_clusters_in_btree+0x37f/0x564 [ocfs2]\n...\n\nThe panic can be easily reproduced by the following small test case\n(with bs\u003d512, cs\u003d4K, and I remove all the error handling so that it looks\nclear enough for reading).\n\nint main(int argc, char **argv)\n{\n\tint fd, i;\n\tchar buf[5] \u003d \"test\";\n\n\tfd \u003d open(argv[1], O_RDWR|O_CREAT);\n\n\tfor (i \u003d 0; i \u003c 30; i++) {\n\t\tlseek(fd, 40960 * i, SEEK_SET);\n\t\twrite(fd, buf, 5);\n\t}\n\n\tftruncate(fd, 1146880);\n\n\tlseek(fd, 1126400, SEEK_SET);\n\twrite(fd, buf, 5);\n\n\tclose(fd);\n\n\treturn 0;\n}\n\nThe reason of the panic is that:\nthe 30 writes and the ftruncate makes the file\u0027s extent list looks like:\n\n\tTree Depth: 1   Count: 19   Next Free Rec: 1\n\t## Offset        Clusters       Block#\n\t0  0             280            86183\n\tSubAlloc Bit: 7   SubAlloc Slot: 0\n\tBlknum: 86183   Next Leaf: 0\n\tCRC32: 00000000   ECC: 0000\n\tTree Depth: 0   Count: 28   Next Free Rec: 28\n\t## Offset        Clusters       Block#          Flags\n\t0  0             1              143368          0x0\n\t1  10            1              143376          0x0\n\t...\n\t26 260           1              143576          0x0\n\t27 270           1              143584          0x0\n\nNow another write at 1126400(275 cluster) whiich will write at the gap\nbetween 271 and 280 will trigger ocfs2_add_branch, but the result after\nthe function looks like:\n\tTree Depth: 1   Count: 19   Next Free Rec: 2\n\t## Offset        Clusters       Block#\n\t0  0             280            86183\n\t1  271           0             143592\nSo the extent record is intersected and make the following operation bug out.\n\nThis patch just try to remove the gap before we add the new branch, so that\nthe root(branch) rightmost rec will cover the same right position. So in the\nabove case, before adding branch the tree will be changed to\n\tTree Depth: 1   Count: 19   Next Free Rec: 1\n\t## Offset        Clusters       Block#\n\t0  0             271            86183\n\tSubAlloc Bit: 7   SubAlloc Slot: 0\n\tBlknum: 86183   Next Leaf: 0\n\tCRC32: 00000000   ECC: 0000\n\tTree Depth: 0   Count: 28   Next Free Rec: 28\n\t## Offset        Clusters       Block#          Flags\n\t0  0             1              143368          0x0\n\t1  10            1              143376          0x0\n\t...\n\t26 260           1              143576          0x0\n\t27 270           1              143584          0x0\nAnd after branch add, the tree looks like\n\tTree Depth: 1   Count: 19   Next Free Rec: 2\n\t## Offset        Clusters       Block#\n\t0  0             271            86183\n\t1  271           0             143592\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nAcked-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "9b7895efac906d66d19856194e1ba61f37e231a4",
      "tree": "1ee6d2630cf3617251638170dcaceef41ddda8ec",
      "parents": [
        "4a12ca3a00a244e1fd1e673d151ea38b71e11d55"
      ],
      "author": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Wed Nov 12 16:27:44 2008 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Fri Apr 03 11:39:15 2009 -0700"
      },
      "message": "ocfs2: Add a name indexed b-tree to directory inodes\n\nThis patch makes use of Ocfs2\u0027s flexible btree code to add an additional\ntree to directory inodes. The new tree stores an array of small,\nfixed-length records in each leaf block. Each record stores a hash value,\nand pointer to a block in the traditional (unindexed) directory tree where a\ndirent with the given name hash resides. Lookup exclusively uses this tree\nto find dirents, thus providing us with constant time name lookups.\n\nSome of the hashing code was copied from ext3. Unfortunately, it has lots of\nunfixed checkpatch errors. I left that as-is so that tracking changes would\nbe easier.\n\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\nAcked-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "74e77eb30d0ecbb12964d005b439c8b84a505b84",
      "tree": "99e14b596439c1cc04a8559859939e7e47825479",
      "parents": [
        "d9ae49d6e2b1ac9166e58ae3c9345135604beaa6"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Thu Mar 12 06:24:23 2009 +0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Thu Mar 12 16:46:01 2009 -0700"
      },
      "message": "ocfs2: Fix a bug found by sparse check.\n\nWe need to use le32_to_cpu to test rec-\u003ee_cpos in\nocfs2_dinode_insert_check.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nAcked-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "47be12e4eec84c1846f29af64fe25a396b57a026",
      "tree": "a16590b4fc4e3753295c230a32f07a6e1bbd3a57",
      "parents": [
        "64e71303e44f3697e4568147caa966de74bdb4fb"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Fri Jan 09 07:32:48 2009 +0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Thu Feb 26 11:51:09 2009 -0800"
      },
      "message": "ocfs2: Access and dirty the buffer_head in mark_written.\n\nIn __ocfs2_mark_extent_written, when we meet with the situation\nof c_split_covers_rec, the old solution just replace the extent\nrecord and forget to access and dirty the buffer_head. This will\ncause a problem when the unwritten extent is in an extent block.\nSo access and dirty it.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "fd4ef231962ab44fd1004e87f9d7c6809f00cd64",
      "tree": "7a79939e1a5c84a41e1a7063fbe2eb68848c9a25",
      "parents": [
        "a4b91965d39d5d53b470d6aa62cba155a6f3ffe1"
      ],
      "author": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Thu Jan 29 15:06:21 2009 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Feb 02 14:20:20 2009 -0800"
      },
      "message": "ocfs2: add quota call to ocfs2_remove_btree_range()\n\nWe weren\u0027t reclaiming the clusters which get free\u0027d from this function,\nso any user punching holes in a file would still have those bytes accounted\nagainst him/her. Add the call to vfs_dq_free_space_nodirty() to fix this.\nInterestingly enough, the journal credits calculation already took this into\naccount.\n\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\nAcked-by: Jan Kara \u003cjack@suse.cz\u003e\n"
    },
    {
      "commit": "c19a28e1193a6c854738d609ae9b2fe2f6e6bea4",
      "tree": "79a354f827a5d3656be3f55d18d31265750d9d06",
      "parents": [
        "f15659628b43b27c20447c731456c39cbec973e9"
      ],
      "author": {
        "name": "Fernando Carrijo",
        "email": "fcarrijo@yahoo.com.br",
        "time": "Wed Jan 07 18:09:08 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 08 08:31:14 2009 -0800"
      },
      "message": "remove lots of double-semicolons\n\nCc: Ingo Molnar \u003cmingo@elte.hu\u003e\nCc: Thomas Gleixner \u003ctglx@linutronix.de\u003e\nAcked-by: Theodore Ts\u0027o \u003ctytso@mit.edu\u003e\nAcked-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\nAcked-by: David S. Miller \u003cdavem@davemloft.net\u003e\nCc: James Morris \u003cjmorris@namei.org\u003e\nAcked-by: Casey Schaufler \u003ccasey@schaufler-ca.com\u003e\nAcked-by: Takashi Iwai \u003ctiwai@suse.de\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "9047beabb8a396f0b18de1e4a9ab920cf92054af",
      "tree": "abb7ea8752cd3e2fdfeaaf1609aed155d919aa7d",
      "parents": [
        "dad7d975e4bd893c79fd122105b37b9a1776816a"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Mon Jan 05 14:45:24 2009 +0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:40:37 2009 -0800"
      },
      "message": "ocfs2: Access the right buffer_head in ocfs2_merge_rec_left.\n\nIn commit \"ocfs2: Use metadata-specific ocfs2_journal_access_*()\nfunctions\", the wrong buffer_head is accessed. So change it\nto the right buffer_head.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nAcked-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "2a50a743bdaab104155bd9e988d2ba3bb4177263",
      "tree": "a330bfffe09dfca4340075bd9c44f632a3284469",
      "parents": [
        "4d0e214ee83185fcaa2cb97cd026d32bdc5c994a"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Tue Dec 09 14:24:33 2008 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:40:32 2009 -0800"
      },
      "message": "ocfs2: Create ocfs2_xattr_value_buf.\n\nWhen an ocfs2 extended attribute is large enough to require its own\nallocation tree, we root it with an ocfs2_xattr_value_root.  However,\nthese roots can be a part of inodes, xattr blocks, or xattr buckets.\nThus, they need a different journal access function for each container.\n\nWe wrap the bh, its journal access function, and the value root (xv) in\na structure called ocfs2_xattr_valu_buf.  This is a package that can\nbe passed around.  In this first pass, we simply pass it to the\nextent tree code.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "13723d00e374c2a6d6ccb5af6de965e89c3e1b01",
      "tree": "70dcd8f3d188bf2f62e4bf4b44a0662d8cd527ca",
      "parents": [
        "ffdd7a54631f07918b75e324d86713a08c11ec06"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Oct 17 19:25:01 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:40:32 2009 -0800"
      },
      "message": "ocfs2: Use metadata-specific ocfs2_journal_access_*() functions.\n\nThe per-metadata-type ocfs2_journal_access_*() functions hook up jbd2\ncommit triggers and allow us to compute metadata ecc right before the\nbuffers are written out.  This commit provides ecc for inodes, extent\nblocks, group descriptors, and quota blocks.  It is not safe to use\nextened attributes and metaecc at the same time yet.\n\nThe ocfs2_extent_tree and ocfs2_path abstractions in alloc.c both hide\nthe type of block at their root.  Before, it didn\u0027t matter, but now the\nroot block must use the appropriate ocfs2_journal_access_*() function.\nTo keep this abstract, the structures now have a pointer to the matching\njournal_access function and a wrapper call to call it.\n\nA few places use naked ocfs2_write_block() calls instead of adding the\nblocks to the journal.  We make sure to calculate their checksum and ecc\nbefore the write.\n\nSince we pass around the journal_access functions.  Let\u0027s typedef them\nin ocfs2.h.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "ffdd7a54631f07918b75e324d86713a08c11ec06",
      "tree": "a49a65968158fde60129d7d614a7f66e5ac44cdf",
      "parents": [
        "50655ae9e91d272d48997bada59efe166aa5e343"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Oct 17 22:32:01 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:40:31 2009 -0800"
      },
      "message": "ocfs2: Wrap up the common use cases of ocfs2_new_path().\n\nThe majority of ocfs2_new_path() calls are:\n\n\tocfs2_new_path(path_root_bh(otherpath),\n\t\t       path_root_el(otherpath));\n\nLet\u0027s call that ocfs2_new_path_from_path().  The rest do similar things\nfrom struct ocfs2_extent_tree.  Let\u0027s call those\nocfs2_new_path_from_et().  This will make the next change easier.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "d6b32bbb3eae3fb787f1c33bf9f767ca1ddeb208",
      "tree": "ce38de666096f571f4b1754e898729cf2d9eb435",
      "parents": [
        "684ef278377725d505aa23259ee673dab9b11851"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Oct 17 14:55:01 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:40:31 2009 -0800"
      },
      "message": "ocfs2: block read meta ecc.\n\nAdd block check calls to the read_block validate functions.  This is the\nalmost all of the read-side checking of metaecc.  xattr buckets are not checked\nyet.   Writes are also unchecked, and so a read-write mount will quickly fail.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "a90714c150e3ce677c57a9dac3ab1ec342c75a95",
      "tree": "43e3e744d86122940c0db39ac1bfed0d434b3216",
      "parents": [
        "9e33d69f553aaf11377307e8d6f82deb3385e351"
      ],
      "author": {
        "name": "Jan Kara",
        "email": "jack@suse.cz",
        "time": "Thu Oct 09 19:38:40 2008 +0200"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:40:23 2009 -0800"
      },
      "message": "ocfs2: Add quota calls for allocation and freeing of inodes and space\n\nAdd quota calls for allocation and freeing of inodes and space, also update\nestimates on number of needed credits for a transaction. Move out inode\nallocation from ocfs2_mknod_locked() because vfs_dq_init() must be called\noutside of a transaction.\n\nSigned-off-by: Jan Kara \u003cjack@suse.cz\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "53ef99cad9878f02f27bb30bc304fc42af8bdd6e",
      "tree": "bb5dcb223666197cf737d24e4cc87506c4473a79",
      "parents": [
        "511308d90b53479b194cd067715f44dc99d39b08"
      ],
      "author": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Tue Nov 18 16:53:43 2008 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:36:55 2009 -0800"
      },
      "message": "ocfs2: Remove JBD compatibility layer\n\nJBD2 is fully backwards compatible with JBD and it\u0027s been tested enough with\nOcfs2 that we can clean this code up now.\n\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "970e4936d7d15f35d00fd15a14f5343ba78b2fc8",
      "tree": "92057c7deab6b9d8e5c3889d6a354b5989a3b68d",
      "parents": [
        "4ae1d69bedc8d174cb8a558694607e013157cde1"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Nov 13 14:49:19 2008 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:36:53 2009 -0800"
      },
      "message": "ocfs2: Validate metadata only when it\u0027s read from disk.\n\nAdd an optional validation hook to ocfs2_read_blocks().  Now the\nvalidation function is only called when a block was actually read off of\ndisk.  It is not called when the buffer was in cache.\n\nWe add a buffer state bit BH_NeedsValidate to flag these buffers.  It\nmust always be one higher than the last JBD2 buffer state bit.\n\nThe dinode, dirblock, extent_block, and xattr_block validators are\nlifted to this scheme directly.  The group_descriptor validator needs to\nbe split into two pieces.  The first part only needs the gd buffer and\nis passed to ocfs2_read_block().  The second part requires the dinode as\nwell, and is called every time.  It\u0027s only 3 compares, so it\u0027s tiny.\nThis also allows us to clean up the non-fatal gd check used by resize.c.\nIt now has no magic argument.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "5e96581a377fc6bd76e9b112da9aeb8a7ae8bf22",
      "tree": "ce2e1d8819b6020567828ca9021438c0824aa8d4",
      "parents": [
        "4203530613280281868b3ca36c817530bca3825c"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Nov 13 14:49:16 2008 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:36:53 2009 -0800"
      },
      "message": "ocfs2: Wrap extent block reads in a dedicated function.\n\nWe weren\u0027t consistently checking extent blocks after we read them.\nMost places checked the signature, but none checked h_blkno or\nh_fs_signature.  Create a toplevel ocfs2_read_extent_block() that does\nthe read and the validation.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "10995aa2451afa20b721cc7de856cae1a13dba57",
      "tree": "63129e7d752fb018dc76aa42de136baa4a8a4232",
      "parents": [
        "b657c95c11088d77fc1bfc9c84d940f778bf9d12"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Nov 13 14:49:12 2008 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:36:52 2009 -0800"
      },
      "message": "ocfs2: Morph the haphazard OCFS2_IS_VALID_DINODE() checks.\n\nRandom places in the code would check a dinode bh to see if it was\nvalid.  Not only did they do different levels of validation, they\nhandled errors in different ways.\n\nThe previous commit unified inode block reads, validating all block\nreads in the same place.  Thus, these haphazard checks are no longer\nnecessary.  Rather than eliminate them, however, we change them to\nBUG_ON() checks.  This ensures the assumptions remain true.  All of the\ncode paths to these checks have been audited to ensure they come from a\nvalidated inode read.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "b657c95c11088d77fc1bfc9c84d940f778bf9d12",
      "tree": "7e52e73aabbdbc55f644ad26735edc25a652ac32",
      "parents": [
        "a68979b857283daf4acc405e476dcc8812a3ff2b"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Nov 13 14:49:11 2008 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:36:52 2009 -0800"
      },
      "message": "ocfs2: Wrap inode block reads in a dedicated function.\n\nThe ocfs2 code currently reads inodes off disk with a simple\nocfs2_read_block() call.  Each place that does this has a different set\nof sanity checks it performs.  Some check only the signature.  A couple\nvalidate the block number (the block read vs di-\u003ei_blkno).  A couple\nothers check for VALID_FL.  Only one place validates i_fs_generation.  A\ncouple check nothing.  Even when an error is found, they don\u0027t all do\nthe same thing.\n\nWe wrap inode reading into ocfs2_read_inode_block().  This will validate\nall the above fields, going readonly if they are invalid (they never\nshould be).  ocfs2_read_inode_block_full() is provided for the places\nthat want to pass read_block flags.  Every caller is passing a struct\ninode with a valid ip_blkno, so we don\u0027t need a separate blkno argument\neither.\n\nWe will remove the validation checks from the rest of the code in a\nlater commit, as they are no longer necessary.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "fecc01126d7a244b7e9b563c80663ffdca35343b",
      "tree": "dbc9144a0f4b6e6997928b2fa2ddeb483f8fd2d7",
      "parents": [
        "85db90e77806d48a19fda77dabe8897d369a1710"
      ],
      "author": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Wed Nov 12 15:16:38 2008 -0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:34:19 2009 -0800"
      },
      "message": "ocfs2: turn __ocfs2_remove_inode_range() into ocfs2_remove_btree_range()\n\nThis patch genericizes the high level handling of extent removal.\nocfs2_remove_btree_range() is nearly identical to\n__ocfs2_remove_inode_range(), except that extent tree operations have been\nused where necessary. We update ocfs2_remove_inode_range() to use the\ngeneric helper. Now extent tree based structures have an easy way to\ntruncate ranges.\n\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\nAcked-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\n"
    },
    {
      "commit": "2891d290aa6eee0821f7e4ad0b1c4ae4d964b0f1",
      "tree": "2f06b8d3afcf1986d0f041319a8ec08395acdf83",
      "parents": [
        "976331d8789d4d84a11b45b87c520ade83715343"
      ],
      "author": {
        "name": "Tao Ma",
        "email": "tao.ma@oracle.com",
        "time": "Wed Nov 12 08:26:58 2008 +0800"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Jan 05 08:34:18 2009 -0800"
      },
      "message": "ocfs2: Add clusters free in dealloc_ctxt.\n\nNow in ocfs2 xattr set, the whole process are divided into many small\nparts and they are wrapped into diffrent transactions and it make the\nset doesn\u0027t look like a real transaction. So we want to integrate it\ninto a real one.\n\nIn some cases we will allocate some clusters and free some in just one\ntransaction. e.g, one xattr is larger than inline size, so it and its\nvalue root is stored within the inode while the value is outside in a\ncluster. Then we try to update it with a smaller value(larger than the\nsize of root but smaller than inline size), we may need to free the\noutside cluster while allocate a new bucket(one cluster) since now the\ninode may be full. The old solution will lock the global_bitmap(if the\nlocal alloc failed in stress test) and then the truncate log. This will\ncause a ABBA lock with truncate log flush.\n\nThis patch add the clusters free in dealloc_ctxt, so that we can record\nthe free clusters during the transaction and then free it after we\nrelease the global_bitmap in xattr set.\n\nSigned-off-by: Tao Ma \u003ctao.ma@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "0fcaa56a2a020dd6f90c202b7084e6f4cbedb6c2",
      "tree": "057204016523ce0274d4a23ec02944075f084e8c",
      "parents": [
        "31d33073ca38603dea705dae45e094a64ca062d6"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Oct 09 17:20:31 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Tue Oct 14 11:51:57 2008 -0700"
      },
      "message": "ocfs2: Simplify ocfs2_read_block()\n\nMore than 30 callers of ocfs2_read_block() pass exactly OCFS2_BH_CACHED.\nOnly six pass a different flag set.  Rather than have every caller care,\nlet\u0027s make ocfs2_read_block() take no flags and always do a cached read.\nThe remaining six places can call ocfs2_read_blocks() directly.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "31d33073ca38603dea705dae45e094a64ca062d6",
      "tree": "cf02beb489456ebc9e07bace80e96ad1150f2cbf",
      "parents": [
        "da1e90985a0e767e44397c9db0937e236033fa58"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Oct 09 17:20:30 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Tue Oct 14 11:43:29 2008 -0700"
      },
      "message": "ocfs2: Require an inode for ocfs2_read_block(s)().\n\nNow that synchronous readers are using ocfs2_read_blocks_sync(), all\ncallers of ocfs2_read_blocks() are passing an inode.  Use it\nunconditionally.  Since it\u0027s there, we don\u0027t need to pass the\nocfs2_super either.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "a81cb88b64a479b78c6dd5666678d50171865db8",
      "tree": "9fe0f67e30d7c70d43785827e57736ac01558c24",
      "parents": [
        "fd8351f83d413b41da956109cf429c15881886e2"
      ],
      "author": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Tue Oct 07 14:25:16 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 17:02:44 2008 -0700"
      },
      "message": "ocfs2: Don\u0027t check for NULL before brelse()\n\nThis is pointless as brelse() already does the check.\n\nSigned-off-by: Mark Fasheh\n"
    },
    {
      "commit": "2b4e30fbde425828b17f0e9c8f8e3fd3ecb2bc75",
      "tree": "5b340cde72e058b51642f0c7255818f62014bc91",
      "parents": [
        "12462f1d9f0b96389497438dc2730c6f7410be82"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Sep 03 20:03:41 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 17:02:43 2008 -0700"
      },
      "message": "ocfs2: Switch over to JBD2.\n\nocfs2 wants JBD2 for many reasons, not the least of which is that JBD is\nlimiting our maximum filesystem size.\n\nIt\u0027s a pretty trivial change.  Most functions are just renamed.  The\nonly functional change is moving to Jan\u0027s inode-based ordered data mode.\nIt\u0027s better, too.\n\nBecause JBD2 reads and writes JBD journals, this is compatible with any\nexisting filesystem.  It can even interact with JBD-based ocfs2 as long\nas the journal is formated for JBD.\n\nWe provide a compatibility option so that paranoid people can still use\nJBD for the time being.  This will go away shortly.\n\n[ Moved call of ocfs2_begin_ordered_truncate() from ocfs2_delete_inode() to\n  ocfs2_truncate_for_delete(). --Mark ]\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "8d6220d6a74a33552cf877bcea25503d7f6a59e6",
      "tree": "2c3f662c55ab4a0a22989c06edf0d027387bfbed",
      "parents": [
        "1625f8ac151743e452ec062c2989669c508ffa48"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Fri Aug 22 12:46:09 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:05 2008 -0700"
      },
      "message": "ocfs2: Change ocfs2_get_*_extent_tree() to ocfs2_init_*_extent_tree()\n\nThe original get/put_extent_tree() functions held a reference on\net_root_bh.  However, every single caller already has a safe reference,\nmaking the get/put cycle irrelevant.\n\nWe change ocfs2_get_*_extent_tree() to ocfs2_init_*_extent_tree().  It\nno longer gets a reference on et_root_bh.  ocfs2_put_extent_tree() is\nremoved.  Callers now have a simpler init+use pattern.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "1625f8ac151743e452ec062c2989669c508ffa48",
      "tree": "0da18fe83c3c0153c33ed1ad5903e4ae08e2fb6e",
      "parents": [
        "f99b9b7ccf6a691f653cec45f36bfdd1e94769c7"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Thu Aug 21 17:11:10 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:05 2008 -0700"
      },
      "message": "ocfs2: Comment struct ocfs2_extent_tree_operations.\n\nstruct ocfs2_extent_tree_operations provides methods for the different\non-disk btrees in ocfs2.  Describing what those methods do is probably a\ngood idea.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "f99b9b7ccf6a691f653cec45f36bfdd1e94769c7",
      "tree": "1c6ff6ea1fa1bb86b70f1fd78dd725b559c729e4",
      "parents": [
        "1e61ee79e2a96f62c007486677319814ce621c3c"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 19:36:33 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:05 2008 -0700"
      },
      "message": "ocfs2: Make ocfs2_extent_tree the first-class representation of a tree.\n\nWe now have three different kinds of extent trees in ocfs2: inode data\n(dinode), extended attributes (xattr_tree), and extended attribute\nvalues (xattr_value).  There is a nice abstraction for them,\nocfs2_extent_tree, but it is hidden in alloc.c.  All the calling\nfunctions have to pick amongst a varied API and pass in type bits and\noften extraneous pointers.\n\nA better way is to make ocfs2_extent_tree a first-class object.\nEveryone converts their object to an ocfs2_extent_tree() via the\nocfs2_get_*_extent_tree() calls, then uses the ocfs2_extent_tree for all\ntree calls to alloc.c.\n\nThis simplifies a lot of callers, making for readability.  It also\nprovides an easy way to add additional extent tree types, as they only\nneed to be defined in alloc.c with a ocfs2_get_\u003cnew\u003e_extent_tree()\nfunction.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "1e61ee79e2a96f62c007486677319814ce621c3c",
      "tree": "50e966441431ec036649dac3ebd17d1452937f26",
      "parents": [
        "1a09f556e5415a29cdddaf9a6ebf474194161cf3"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 18:32:45 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:05 2008 -0700"
      },
      "message": "ocfs2: Add an insertion check to ocfs2_extent_tree_operations.\n\nA couple places check an extent_tree for a valid inode.  We move that\nout to add an eo_insert_check() operation.  It can be called from\nocfs2_insert_extent() and elsewhere.\n\nWe also have the wrapper calls ocfs2_et_insert_check() and\nocfs2_et_sanity_check() ignore NULL ops.  That way we don\u0027t have to\nprovide useless operations for xattr types.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "1a09f556e5415a29cdddaf9a6ebf474194161cf3",
      "tree": "902dc5cc4719ffce151c610b3441baa3511aa50e",
      "parents": [
        "943cced39ee45ed2db25efd25eee8ba49cf2dfc4"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 17:44:24 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:05 2008 -0700"
      },
      "message": "ocfs2: Create specific get_extent_tree functions.\n\nA caller knows what kind of extent tree they have.  There\u0027s no reason\nthey have to call ocfs2_get_extent_tree() with a NULL when they could\njust as easily call a specific function to their type of extent tree.\n\nIntroduce ocfs2_dinode_get_extent_tree(),\nocfs2_xattr_tree_get_extent_tree(), and\nocfs2_xattr_value_get_extent_tree().  They only take the necessary\narguments, calling into the underlying __ocfs2_get_extent_tree() to do\nthe real work.\n\n__ocfs2_get_extent_tree() is the old ocfs2_get_extent_tree(), but\nwithout needing any switch-by-type logic.\n\nocfs2_get_extent_tree() is now a wrapper around the specific calls.  It\nexists because a couple alloc.c functions can take et_type.  This will\ngo later.\n\nAnother benefit is that ocfs2_xattr_value_get_extent_tree() can take a\nstruct ocfs2_xattr_value_root* instead of void*.  This gives us\ntypechecking where we didn\u0027t have it before.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "943cced39ee45ed2db25efd25eee8ba49cf2dfc4",
      "tree": "a06ce33db4a9b918c98e38a434e7060b32255e6d",
      "parents": [
        "1c25d93a4a27c90c3ae33f9e724f7b67783d68d1"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 17:31:10 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:04 2008 -0700"
      },
      "message": "ocfs2: Determine an extent tree\u0027s max_leaf_clusters in an et_op.\n\nProvide an optional extent_tree_operation to specify the\nmax_leaf_clusters of an ocfs2_extent_tree.  If not provided, the value\nis 0 (unlimited).\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "1c25d93a4a27c90c3ae33f9e724f7b67783d68d1",
      "tree": "d62c9b19fae527770939748566ce3a31ce0bce53",
      "parents": [
        "0ce1010f1a4319e02574b856d50dfdc0ed855f40"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 17:09:42 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:04 2008 -0700"
      },
      "message": "ocfs2: Use struct ocfs2_extent_tree in ocfs2_num_free_extents().\n\nocfs2_num_free_extents() re-implements the logic of\nocfs2_get_extent_tree().  Now that ocfs2_get_extent_tree() does not\nallocate, let\u0027s use it in ocfs2_num_free_extents() to simplify the code.\n\nThe inode validation code in ocfs2_num_free_extents() is not needed.\nAll callers are passing in pre-validated inodes.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "0ce1010f1a4319e02574b856d50dfdc0ed855f40",
      "tree": "6d65e00caa9c4c5310fd4f51a07678d46803adfd",
      "parents": [
        "ea5efa151265a743f48e3d371992a0100d73a0eb"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 17:19:50 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:04 2008 -0700"
      },
      "message": "ocfs2: Provide the get_root_el() method to ocfs2_extent_tree_operations.\n\nThe root_el of an ocfs2_extent_tree needs to be calculated from\net-\u003eet_object.  Make it an operation on et-\u003eet_ops.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "ea5efa151265a743f48e3d371992a0100d73a0eb",
      "tree": "5e3688b0882271210b524564f5b6b42e2813f32c",
      "parents": [
        "dc0ce61af418305afa7e0d05d86ab334e0daabf7"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 16:57:27 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:04 2008 -0700"
      },
      "message": "ocfs2: Make \u0027private\u0027 into \u0027object\u0027 on ocfs2_extent_tree.\n\nThe \u0027private\u0027 pointer was a way to store off xattr values, which don\u0027t\nlive at a set place in the bh.  But the concept of \"the object\ncontaining the extent tree\" is much more generic.  For an inode it\u0027s the\nstruct ocfs2_dinode, for an xattr value its the value.  Let\u0027s save off\nthe \u0027object\u0027 at all times.  If NULL is passed to\nocfs2_get_extent_tree(), \u0027object\u0027 is set to bh-\u003eb_data;\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "dc0ce61af418305afa7e0d05d86ab334e0daabf7",
      "tree": "7122bafdcb29a77cd65e34a600d3df76b9e165fe",
      "parents": [
        "ce1d9ea621291ed5e985d6677278c6bb20d96a40"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 16:48:35 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:04 2008 -0700"
      },
      "message": "ocfs2: Make ocfs2_extent_tree get/put instead of alloc.\n\nRather than allocating a struct ocfs2_extent_tree, just put it on the\nstack.  Fill it with ocfs2_get_extent_tree() and drop it with\nocfs2_put_extent_tree().  Now the callers don\u0027t have to ENOMEM, yet\nstill safely ref the root_bh.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "ce1d9ea621291ed5e985d6677278c6bb20d96a40",
      "tree": "5bd40bdd327745ab0e91fb181752062306147135",
      "parents": [
        "35dc0aa3c5e7391319754e0c19cdfc0a28eb5b25"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 16:30:07 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:04 2008 -0700"
      },
      "message": "ocfs2: Prefix the ocfs2_extent_tree structure.\n\nThe members of the ocfs2_extent_tree structure gain a prefix of \u0027et_\u0027.\nAll users are updated.\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    },
    {
      "commit": "35dc0aa3c5e7391319754e0c19cdfc0a28eb5b25",
      "tree": "709fc00742bbcf9fc8941e0fe61845a22bb5a73b",
      "parents": [
        "ff1ec20ef65d51cc3466e86912cdeaac16f3aaa0"
      ],
      "author": {
        "name": "Joel Becker",
        "email": "joel.becker@oracle.com",
        "time": "Wed Aug 20 16:25:06 2008 -0700"
      },
      "committer": {
        "name": "Mark Fasheh",
        "email": "mfasheh@suse.com",
        "time": "Mon Oct 13 16:57:04 2008 -0700"
      },
      "message": "ocfs2: Prefix the extent tree operations structure.\n\nThe ocfs2_extent_tree_operations structure gains a field prefix on its\nmembers.  The -\u003eeo_sanity_check() operation gains a wrapper function for\ncompleteness.  All of the extent tree operation wrappers gain a\nconsistent name (ocfs2_et_*()).\n\nSigned-off-by: Joel Becker \u003cjoel.becker@oracle.com\u003e\nSigned-off-by: Mark Fasheh \u003cmfasheh@suse.com\u003e\n"
    }
  ],
  "next": "ca12b7c48942d21b2e7890b820db9d578bc291cd"
}
