)]}'
{
  "log": [
    {
      "commit": "8e833fd2e1f0107ee7a4b6bc4de3c9f0e9b0ed41",
      "tree": "adf3e53b81e9e52874fc1f38eeb09065fae5cf02",
      "parents": [
        "6291176bcd71a2766a19a10cbd9bab07d289e1d7"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sun Jun 19 01:56:53 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Jun 20 10:45:56 2011 -0400"
      },
      "message": "fix comment in generic_permission()\n\nCAP_DAC_OVERRIDE is enough for MAY_EXEC on directory, even if\nno exec bits are set.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "6291176bcd71a2766a19a10cbd9bab07d289e1d7",
      "tree": "123ca2c96c0614b94ad2065174f5c1c77db45c12",
      "parents": [
        "1aec7036d0c2996c86ce483ca0a28f3b20807b43"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Jun 17 19:20:48 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Jun 20 10:45:49 2011 -0400"
      },
      "message": "kill obsolete comment for follow_down()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "8aef18845266f5c05904c610088f2d1ed58f6be3",
      "tree": "fbdecafcd5e5d15445af18119cc8ee2e9b2cb850",
      "parents": [
        "50338b889dc504c69e0cb316ac92d1b9e51f3c8a"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@ZenIV.linux.org.uk",
        "time": "Thu Jun 16 15:10:06 2011 +0100"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu Jun 16 11:28:16 2011 -0400"
      },
      "message": "VFS: Fix vfsmount overput on simultaneous automount\n\n[Kudos to dhowells for tracking that crap down]\n\nIf two processes attempt to cause automounting on the same mountpoint at the\nsame time, the vfsmount holding the mountpoint will be left with one too few\nreferences on it, causing a BUG when the kernel tries to clean up.\n\nThe problem is that lock_mount() drops the caller\u0027s reference to the\nmountpoint\u0027s vfsmount in the case where it finds something already mounted on\nthe mountpoint as it transits to the mounted filesystem and replaces path-\u003emnt\nwith the new mountpoint vfsmount.\n\nDuring a pathwalk, however, we don\u0027t take a reference on the vfsmount if it is\nthe same as the one in the nameidata struct, but do_add_mount() doesn\u0027t know\nthis.\n\nThe fix is to make sure we have a ref on the vfsmount of the mountpoint before\ncalling do_add_mount().  However, if lock_mount() doesn\u0027t transit, we\u0027re then\nleft with an extra ref on the mountpoint vfsmount which needs releasing.\nWe can handle that in follow_managed() by not making assumptions about what\nwe can and what we cannot get from lookup_mnt() as the current code does.\n\nThe callers of follow_managed() expect that reference to path-\u003emnt will be\ngrabbed iff path-\u003emnt has been changed.  follow_managed() and follow_automount()\nkeep track of whether such reference has been grabbed and assume that it\u0027ll\nhappen in those and only those cases that\u0027ll have us return with changed\npath-\u003emnt.  That assumption is almost correct - it breaks in case of\nracing automounts and in even harder to hit race between following a mountpoint\nand a couple of mount --move.  The thing is, we don\u0027t need to make that\nassumption at all - after the end of loop in follow_manage() we can check\nif path-\u003emnt has ended up unchanged and do mntput() if needed.\n\nThe BUG can be reproduced with the following test program:\n\n\t#include \u003cstdio.h\u003e\n\t#include \u003csys/types.h\u003e\n\t#include \u003csys/stat.h\u003e\n\t#include \u003cunistd.h\u003e\n\t#include \u003csys/wait.h\u003e\n\tint main(int argc, char **argv)\n\t{\n\t\tint pid, ws;\n\t\tstruct stat buf;\n\t\tpid \u003d fork();\n\t\tstat(argv[1], \u0026buf);\n\t\tif (pid \u003e 0) wait(\u0026ws);\n\t\treturn 0;\n\t}\n\nand the following procedure:\n\n (1) Mount an NFS volume that on the server has something else mounted on a\n     subdirectory.  For instance, I can mount / from my server:\n\n\tmount warthog:/ /mnt -t nfs4 -r\n\n     On the server /data has another filesystem mounted on it, so NFS will see\n     a change in FSID as it walks down the path, and will mark /mnt/data as\n     being a mountpoint.  This will cause the automount code to be triggered.\n\n     !!! Do not look inside the mounted fs at this point !!!\n\n (2) Run the above program on a file within the submount to generate two\n     simultaneous automount requests:\n\n\t/tmp/forkstat /mnt/data/testfile\n\n (3) Unmount the automounted submount:\n\n\tumount /mnt/data\n\n (4) Unmount the original mount:\n\n\tumount /mnt\n\n     At this point the kernel should throw a BUG with something like the\n     following:\n\n\tBUG: Dentry ffff880032e3c5c0{i\u003d2,n\u003d} still in use (1) [unmount of nfs4 0:12]\n\nNote that the bug appears on the root dentry of the original mount, not the\nmountpoint and not the submount because sys_umount() hasn\u0027t got to its final\nmntput_no_expire() yet, but this isn\u0027t so obvious from the call trace:\n\n [\u003cffffffff8117cd82\u003e] shrink_dcache_for_umount+0x69/0x82\n [\u003cffffffff8116160e\u003e] generic_shutdown_super+0x37/0x15b\n [\u003cffffffffa00fae56\u003e] ? nfs_super_return_all_delegations+0x2e/0x1b1 [nfs]\n [\u003cffffffff811617f3\u003e] kill_anon_super+0x1d/0x7e\n [\u003cffffffffa00d0be1\u003e] nfs4_kill_super+0x60/0xb6 [nfs]\n [\u003cffffffff81161c17\u003e] deactivate_locked_super+0x34/0x83\n [\u003cffffffff811629ff\u003e] deactivate_super+0x6f/0x7b\n [\u003cffffffff81186261\u003e] mntput_no_expire+0x18d/0x199\n [\u003cffffffff811862a8\u003e] mntput+0x3b/0x44\n [\u003cffffffff81186d87\u003e] release_mounts+0xa2/0xbf\n [\u003cffffffff811876af\u003e] sys_umount+0x47a/0x4ba\n [\u003cffffffff8109e1ca\u003e] ? trace_hardirqs_on_caller+0x1fd/0x22f\n [\u003cffffffff816ea86b\u003e] system_call_fastpath+0x16/0x1b\n\nas do_umount() is inlined.  However, you can see release_mounts() in there.\n\nNote also that it may be necessary to have multiple CPU cores to be able to\ntrigger this bug.\n\nTested-by: Jeff Layton \u003cjlayton@redhat.com\u003e\nTested-by: Ian Kent \u003craven@themaw.net\u003e\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "50338b889dc504c69e0cb316ac92d1b9e51f3c8a",
      "tree": "8e353de07b21b350664eff5d69f3a67014d01bcd",
      "parents": [
        "a685e08987d1edf1995b76511d4c98ea0e905377"
      ],
      "author": {
        "name": "Török Edwin",
        "email": "edwintorok@gmail.com",
        "time": "Thu Jun 16 00:06:14 2011 +0300"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu Jun 16 11:27:39 2011 -0400"
      },
      "message": "fix wrong iput on d_inode introduced by e6bc45d65d\n\nGit bisection shows that commit e6bc45d65df8599fdbae73be9cec4ceed274db53 causes\nBUG_ONs under high I/O load:\n\nkernel BUG at fs/inode.c:1368!\n[ 2862.501007] Call Trace:\n[ 2862.501007]  [\u003cffffffff811691d8\u003e] d_kill+0xf8/0x140\n[ 2862.501007]  [\u003cffffffff81169c19\u003e] dput+0xc9/0x190\n[ 2862.501007]  [\u003cffffffff8115577f\u003e] fput+0x15f/0x210\n[ 2862.501007]  [\u003cffffffff81152171\u003e] filp_close+0x61/0x90\n[ 2862.501007]  [\u003cffffffff81152251\u003e] sys_close+0xb1/0x110\n[ 2862.501007]  [\u003cffffffff814c14fb\u003e] system_call_fastpath+0x16/0x1b\n\nA reliable way to reproduce this bug is:\nLogin to KDE, run \u0027rsnapshot sync\u0027, and apt-get install openjdk-6-jdk,\nand apt-get remove openjdk-6-jdk.\n\nThe buggy part of the patch is this:\n\tstruct inode *inode \u003d NULL;\n.....\n-               if (nd.last.name[nd.last.len])\n-                       goto slashes;\n                inode \u003d dentry-\u003ed_inode;\n-               if (inode)\n-                       ihold(inode);\n+               if (nd.last.name[nd.last.len] || !inode)\n+                       goto slashes;\n+               ihold(inode)\n...\n\tif (inode)\n\t\tiput(inode);\t/* truncate the inode here */\n\nIf nd.last.name[nd.last.len] is nonzero (and thus goto slashes branch is taken),\nand dentry-\u003ed_inode is non-NULL, then this code now does an additional iput on\nthe inode, which is wrong.\n\nFix this by only setting the inode variable if nd.last.name[nd.last.len] is 0.\n\nReference: https://lkml.org/lkml/2011/6/15/50\nReported-by: Norbert Preining \u003cpreining@logic.at\u003e\nReported-by: Török Edwin \u003cedwintorok@gmail.com\u003e\nCc: \"Theodore Ts\u0027o\" \u003ctytso@mit.edu\u003e\nCc: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\nSigned-off-by: Török Edwin \u003cedwintorok@gmail.com\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "e6bc45d65df8599fdbae73be9cec4ceed274db53",
      "tree": "2a9a5a0c0835b431d605332ebbfa6dad66e069f0",
      "parents": [
        "9054760ff585a7fa436599990b63a585ae89ff4d"
      ],
      "author": {
        "name": "Theodore Ts\u0027o",
        "email": "tytso@mit.edu",
        "time": "Mon Jun 06 19:19:40 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Jun 07 08:51:14 2011 -0400"
      },
      "message": "vfs: make unlink() and rmdir() return ENOENT in preference to EROFS\n\nIf user space attempts to remove a non-existent file or directory, and\nthe file system is mounted read-only, return ENOENT instead of EROFS.\nEither error code is arguably valid/correct, but ENOENT is a more\nspecific error message.\n\nReported-by: Michael Tokarev \u003cmjt@tls.msk.ru\u003e\nSigned-off-by: \"Theodore Ts\u0027o\" \u003ctytso@mit.edu\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "3cebde2413ba42504cf2c10ec1d47582912435cd",
      "tree": "296302cd2f065c125b1c932caa3bd836720c7efe",
      "parents": [
        "55922c9d1b84b89cb946c777fddccb3247e7df2c"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Sun May 29 21:20:59 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon May 30 01:48:27 2011 -0400"
      },
      "message": "vfs: shrink_dcache_parent before rmdir, dir rename\n\nThe dentry_unhash push-down series missed that shink_dcache_parent needs to\nbe called prior to rmdir or dir rename to clear DCACHE_REFERENCED and\nallow efficient dentry reclaim.\n\nReported-by: Dave Chinner \u003cdavid@fromorbit.com\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "d6e9bd256c88ce5f4b668249e363a74f51393daa",
      "tree": "87c70fb00c36164136fbdc0eb2daf3dbe79c80b1",
      "parents": [
        "dea3937619cb67d2ad08e2d29ae923875b1eeee9"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri May 27 07:03:15 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri May 27 07:03:15 2011 -0400"
      },
      "message": "Lift the check for automount points into do_lookup()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "dea3937619cb67d2ad08e2d29ae923875b1eeee9",
      "tree": "d4c4e3ed44cff625f6d2730c2288961922357ba2",
      "parents": [
        "287548e46aa752ce9bb87fcff46f8aa794cc5037"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri May 27 06:53:39 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri May 27 07:01:49 2011 -0400"
      },
      "message": "Trim excessive arguments of follow_mount_rcu()\n\n... and kill a useless local variable in follow_dotdot_rcu(), while\nwe are at it - follow_mount_rcu(nd, path, inode) *always* assigned\nvalue to *inode, and always it had been path-\u003edentry-\u003ed_inode (aka\nnd-\u003epath.dentry-\u003ed_inode, since it always got \u0026nd-\u003epath as the second\nargument).\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "287548e46aa752ce9bb87fcff46f8aa794cc5037",
      "tree": "9ef364213a2ab4f540dd39a71b95e1f0ed46aaa5",
      "parents": [
        "dc7acbb2518f250050179c8581a972df3b6a24f1"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri May 27 06:50:06 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri May 27 06:51:56 2011 -0400"
      },
      "message": "split __follow_mount_rcu() into normal and .. cases\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "32e51f141fd8d880f57b6a2eb53ce72856254d4a",
      "tree": "d8d7a0d503533a03fb07b2ebd5eccd9043f2d228",
      "parents": [
        "ca16d140af91febe25daeb9e032bf8bd46b8c31f",
        "b6ff24a333267a6810e28ee5b9fc539d149c52f0"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu May 26 09:52:14 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu May 26 09:52:14 2011 -0700"
      },
      "message": "Merge branch \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6\n\n* \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (25 commits)\n  cifs: remove unnecessary dentry_unhash on rmdir/rename_dir\n  ocfs2: remove unnecessary dentry_unhash on rmdir/rename_dir\n  exofs: remove unnecessary dentry_unhash on rmdir/rename_dir\n  nfs: remove unnecessary dentry_unhash on rmdir/rename_dir\n  ext2: remove unnecessary dentry_unhash on rmdir/rename_dir\n  ext3: remove unnecessary dentry_unhash on rmdir/rename_dir\n  ext4: remove unnecessary dentry_unhash on rmdir/rename_dir\n  btrfs: remove unnecessary dentry_unhash in rmdir/rename_dir\n  ceph: remove unnecessary dentry_unhash calls\n  vfs: clean up vfs_rename_other\n  vfs: clean up vfs_rename_dir\n  vfs: clean up vfs_rmdir\n  vfs: fix vfs_rename_dir for FS_RENAME_DOES_D_MOVE filesystems\n  libfs: drop unneeded dentry_unhash\n  vfs: update dentry_unhash() comment\n  vfs: push dentry_unhash on rename_dir into file systems\n  vfs: push dentry_unhash on rmdir into file systems\n  vfs: remove dget() from dentry_unhash()\n  vfs: dentry_unhash immediately prior to rmdir\n  vfs: Block mmapped writes while the fs is frozen\n  ...\n"
    },
    {
      "commit": "51892bbb57e87854c27c105317797823f8891e68",
      "tree": "8d7fd27631bc868ebac7de8c3baaab7a8111591b",
      "parents": [
        "9055cba711891a6313232629cd6bbca7c901e07f"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 13:06:13 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:53 2011 -0400"
      },
      "message": "vfs: clean up vfs_rename_other\n\nSimplify control flow to match vfs_rename_dir.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "9055cba711891a6313232629cd6bbca7c901e07f",
      "tree": "877880a16f0ec062c82ef36886ca5c2257ee9e89",
      "parents": [
        "912dbc15d953791f013b0c64a8093ab0490e5f40"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 13:06:12 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:52 2011 -0400"
      },
      "message": "vfs: clean up vfs_rename_dir\n\nSimplify control flow through vfs_rename_dir.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "912dbc15d953791f013b0c64a8093ab0490e5f40",
      "tree": "90cdea27c906f37bfc58ba909431b709c7699879",
      "parents": [
        "b5afd2c406f5c6272d916fd705f44f070fbbc0ba"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 13:06:11 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:51 2011 -0400"
      },
      "message": "vfs: clean up vfs_rmdir\n\nSimplify the control flow with an out label.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "b5afd2c406f5c6272d916fd705f44f070fbbc0ba",
      "tree": "93378abaf5120d5fe449ee77234368291331615a",
      "parents": [
        "5c5d3f3b871a719e2c6413b85009c723adeb27e1"
      ],
      "author": {
        "name": "Miklos Szeredi",
        "email": "mszeredi@suse.cz",
        "time": "Tue May 24 13:06:10 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:50 2011 -0400"
      },
      "message": "vfs: fix vfs_rename_dir for FS_RENAME_DOES_D_MOVE filesystems\n\nvfs_rename_dir() doesn\u0027t properly account for filesystems with\nFS_RENAME_DOES_D_MOVE.  If new_dentry has a target inode attached, it\nunhashes the new_dentry prior to the rename() iop and rehashes it after,\nbut doesn\u0027t account for the possibility that rename() may have swapped\n{old,new}_dentry.  For FS_RENAME_DOES_D_MOVE filesystems, it rehashes\nnew_dentry (now the old renamed-from name, which d_move() expected to go\naway), such that a subsequent lookup will find it.  Currently all\nFS_RENAME_DOES_D_MOVE filesystems compensate for this by failing in\nd_revalidate.\n\nThe bug was introduced by: commit 349457ccf2592c14bdf13b6706170ae2e94931b1\n\"[PATCH] Allow file systems to manually d_move() inside of -\u003erename()\"\n\nFix by not rehashing the new dentry.  Rehashing used to be needed by\nd_move() but isn\u0027t anymore.\n\nReported-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Miklos Szeredi \u003cmiklos@szeredi.hu\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "a71905f0db41d4b2b01044fb40f97656fefc44a7",
      "tree": "31d286471b6d14be1a1531acf4b04d5fc8d47268",
      "parents": [
        "e4eaac06bcccb2a70bca6a2de9871882dce2aa14"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 13:06:08 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:49 2011 -0400"
      },
      "message": "vfs: update dentry_unhash() comment\n\nThe helper is now only called by file systems, not the VFS.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "e4eaac06bcccb2a70bca6a2de9871882dce2aa14",
      "tree": "ca6736d96294cd6e65a1c3055718bfd5adc7336e",
      "parents": [
        "79bf7c732b5ff75b96022ed9d29181afd3d2509c"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 13:06:07 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:48 2011 -0400"
      },
      "message": "vfs: push dentry_unhash on rename_dir into file systems\n\nOnly a few file systems need this.  Start by pushing it down into each\nrename method (except gfs2 and xfs) so that it can be dealt with on a\nper-fs basis.\n\nAcked-by: Christoph Hellwig \u003chch@lst.de\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "79bf7c732b5ff75b96022ed9d29181afd3d2509c",
      "tree": "74b8cc690f9a37fff02d0685464e1c695a25ef94",
      "parents": [
        "64252c75a2196a0cf1e0d3777143ecfe0e3ae650"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 13:06:06 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:47 2011 -0400"
      },
      "message": "vfs: push dentry_unhash on rmdir into file systems\n\nOnly a few file systems need this.  Start by pushing it down into each\nfs rmdir method (except gfs2 and xfs) so it can be dealt with on a per-fs\nbasis.\n\nThis does not change behavior for any in-tree file systems.\n\nAcked-by: Christoph Hellwig \u003chch@lst.de\u003e\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "64252c75a2196a0cf1e0d3777143ecfe0e3ae650",
      "tree": "8534f12a507ef5aee91e302f3e54cf8a4440fc82",
      "parents": [
        "48293699a09324d2e3c66bd53d10eed6d67937a0"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 13:06:05 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:46 2011 -0400"
      },
      "message": "vfs: remove dget() from dentry_unhash()\n\nThis serves no useful purpose that I can discern.  All callers (rename,\nrmdir) hold their own reference to the dentry.\n\nA quick audit of all file systems showed no relevant checks on the value\nof d_count in vfs_rmdir/vfs_rename_dir paths.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "48293699a09324d2e3c66bd53d10eed6d67937a0",
      "tree": "5554ad59665d62ebc36ed16d5e13b0badea46a69",
      "parents": [
        "ea13a86463fd0c26c2c209c53dc46b8eff81bad4"
      ],
      "author": {
        "name": "Sage Weil",
        "email": "sage@newdream.net",
        "time": "Tue May 24 13:06:04 2011 -0700"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:46 2011 -0400"
      },
      "message": "vfs: dentry_unhash immediately prior to rmdir\n\nThis presumes that there is no reason to unhash a dentry if we fail because\nit is a mountpoint or the LSM check fails, and that the LSM checks do not\ndepend on the dentry being unhashed.\n\nSigned-off-by: Sage Weil \u003csage@newdream.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "9f1fafee9e42b73beb3aa51ab2d6a19bfddeb5fe",
      "tree": "0c0251b271371e572daf29d2a2282c323c557e8c",
      "parents": [
        "19660af736ba00e1620970601dd313efedbbcfd2"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 25 11:00:12 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:32 2011 -0400"
      },
      "message": "merge handle_reval_dot and nameidata_drop_rcu_last\n\nnew helper: complete_walk().  Done on successful completion\nof walk, drops out of RCU mode, does d_revalidate of final\nresult if that hadn\u0027t been done already.\n\nhandle_reval_dot() and nameidata_drop_rcu_last() subsumed into\nthat one; callers converted to use of complete_walk().\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "19660af736ba00e1620970601dd313efedbbcfd2",
      "tree": "07f6fcbbb34161cab29474d80afe01dff7f7d87d",
      "parents": [
        "1be6a1f89f131e9c3d22f819ec542be9cda8c9e3"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 25 10:32:48 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu May 26 07:26:02 2011 -0400"
      },
      "message": "consolidate nameidata_..._drop_rcu()\n\nMerge these into a single function (unlazy_walk(nd, dentry)),\nkill ..._maybe variants\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "1a4022f88d40e1255920b017556092ab926d7f66",
      "tree": "f4e54841dae0ecf1324a3002bc540f8b6ba441d5",
      "parents": [
        "052497553e5dedc04c43800820c1d5788201cc71"
      ],
      "author": {
        "name": "Erez Zadok",
        "email": "ezk@fsl.cs.sunysb.edu",
        "time": "Sat May 21 01:19:59 2011 -0400"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Sat May 21 00:12:16 2011 -0700"
      },
      "message": "VFS: move BUG_ON test for symlink nd-\u003edepth after current-\u003elink_count test\n\nThis solves a serious VFS-level bug in nested_symlink (which was\nrewritten from do_follow_link), and follows the order of depth tests\nthat existed before.\n\nThe bug triggers a BUG_ON in fs/namei.c:1381, when running racer with\nsymlink and rename ops.\n\nSigned-off-by: Erez Zadok \u003cezk@cs.sunysb.edu\u003e\nAcked-by: Miklos Szeredi \u003cmszeredi@suse.cz\u003e\nCc: stable@kernel.org\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "26cf46be954a2dd391d32eeaf7d07c3a953dcc5a",
      "tree": "6445ebf0328e3227178f378c97be6b083cad087b",
      "parents": [
        "47a150edc2ae734c0f4bf50aa19499e23b9a46f8"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri May 13 11:51:01 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri May 13 11:51:01 2011 -0700"
      },
      "message": "vfs: micro-optimize acl_permission_check()\n\nIt\u0027s a hot function, and we\u0027re better off not mixing types in the mask\ncalculations.  The compiler just ends up mixing 16-bit and 32-bit\noperations, for no good reason.\n\nSo do everything in \u0027unsigned int\u0027 rather than mixing \u0027unsigned int\u0027\nmasking with a \u0027umode_t\u0027 (16-bit) mode variable.\n\nThis, together with the parent commit (47a150edc2ae: \"Cache user_ns in\nstruct cred\") makes acl_permission_check() much nicer.\n\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "c1530019e311c91d14b24d8e74d233152d806e45",
      "tree": "37bd46f1d30534d8f03a186338295b653e75886c",
      "parents": [
        "5853b4f06f7b9b56f37f457d7923f7b96496074e"
      ],
      "author": {
        "name": "Tim Chen",
        "email": "tim.c.chen@linux.intel.com",
        "time": "Fri Apr 15 11:39:29 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Apr 15 15:28:12 2011 -0700"
      },
      "message": "vfs: Fix absolute RCU path walk failures due to uninitialized seq number\n\nDuring RCU walk in path_lookupat and path_openat, the rcu lookup\nfrequently failed if looking up an absolute path, because when root\ndirectory was looked up, seq number was not properly set in nameidata.\n\nWe dropped out of RCU walk in nameidata_drop_rcu due to mismatch in\ndirectory entry\u0027s seq number.  We reverted to slow path walk that need\nto take references.\n\nWith the following patch, I saw a 50% increase in an exim mail server\nbenchmark throughput on a 4-socket Nehalem-EX system.\n\nSigned-off-by: Tim Chen \u003ctim.c.chen@linux.intel.com\u003e\nReviewed-by: Andi Kleen \u003cak@linux.intel.com\u003e\nCc: stable@kernel.org (v2.6.38)\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "25985edcedea6396277003854657b5f3cb31a628",
      "tree": "f026e810210a2ee7290caeb737c23cb6472b7c38",
      "parents": [
        "6aba74f2791287ec407e0f92487a725a25908067"
      ],
      "author": {
        "name": "Lucas De Marchi",
        "email": "lucas.demarchi@profusion.mobi",
        "time": "Wed Mar 30 22:57:33 2011 -0300"
      },
      "committer": {
        "name": "Lucas De Marchi",
        "email": "lucas.demarchi@profusion.mobi",
        "time": "Thu Mar 31 11:26:23 2011 -0300"
      },
      "message": "Fix common misspellings\n\nFixes generated by \u0027codespell\u0027 and manually reviewed.\n\nSigned-off-by: Lucas De Marchi \u003clucas.demarchi@profusion.mobi\u003e\n"
    },
    {
      "commit": "62a7375e5d77d654695297c4b39d5d740d901184",
      "tree": "b479c60a43f22e3bb99d9ebf1af89de2a7020673",
      "parents": [
        "b81a618dcd3ea99de292dbe624f41ca68f464376"
      ],
      "author": {
        "name": "Ian Kent",
        "email": "raven@themaw.net",
        "time": "Fri Mar 25 01:51:02 2011 +0800"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Thu Mar 24 14:24:32 2011 -0400"
      },
      "message": "vfs - check non-mountpoint dentry might block in __follow_mount_rcu()\n\nWhen following a mount in rcu-walk mode we must check if the incoming dentry\nis telling us it may need to block, even if it isn\u0027t actually a mountpoint.\n\nSigned-off-by: Ian Kent \u003craven@themaw.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "b81a618dcd3ea99de292dbe624f41ca68f464376",
      "tree": "c5fbe44f944da9d7dc0c224116be77094d379c8a",
      "parents": [
        "2f284c846331fa44be1300a3c2c3e85800268a00",
        "a9712bc12c40c172e393f85a9b2ba8db4bf59509"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Mar 23 20:51:42 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Mar 23 20:51:42 2011 -0700"
      },
      "message": "Merge branch \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6\n\n* \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:\n  deal with races in /proc/*/{syscall,stack,personality}\n  proc: enable writing to /proc/pid/mem\n  proc: make check_mem_permission() return an mm_struct on success\n  proc: hold cred_guard_mutex in check_mem_permission()\n  proc: disable mem_write after exec\n  mm: implement access_remote_vm\n  mm: factor out main logic of access_process_vm\n  mm: use mm_struct to resolve gate vma\u0027s in __get_user_pages\n  mm: arch: rename in_gate_area_no_task to in_gate_area_no_mm\n  mm: arch: make in_gate_area take an mm_struct instead of a task_struct\n  mm: arch: make get_gate_vma take an mm_struct instead of a task_struct\n  x86: mark associated mm when running a task in 32 bit compatibility mode\n  x86: add context tag to mark mm when running a task in 32-bit compatibility mode\n  auxv: require the target to be tracable (or yourself)\n  close race in /proc/*/environ\n  report errors in /proc/*/*map* sanely\n  pagemap: close races with suid execve\n  make sessionid permissions in /proc/*/task/* match those in /proc/*\n  fix leaks in path_lookupat()\n\nFix up trivial conflicts in fs/proc/base.c\n"
    },
    {
      "commit": "2e1496707560ecf98e9b0604622c0990f94861d3",
      "tree": "d1473b70fad31a903fedc87221680678a6c6c5f6",
      "parents": [
        "e795b71799ff0b27365020c9ddaa25d0d83f99c8"
      ],
      "author": {
        "name": "Serge E. Hallyn",
        "email": "serge@hallyn.com",
        "time": "Wed Mar 23 16:43:26 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Mar 23 19:47:13 2011 -0700"
      },
      "message": "userns: rename is_owner_or_cap to inode_owner_or_capable\n\nAnd give it a kernel-doc comment.\n\n[akpm@linux-foundation.org: btrfs changed in linux-next]\nSigned-off-by: Serge E. Hallyn \u003cserge.hallyn@canonical.com\u003e\nCc: \"Eric W. Biederman\" \u003cebiederm@xmission.com\u003e\nCc: Daniel Lezcano \u003cdaniel.lezcano@free.fr\u003e\nAcked-by: David Howells \u003cdhowells@redhat.com\u003e\nCc: James Morris \u003cjmorris@namei.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "e795b71799ff0b27365020c9ddaa25d0d83f99c8",
      "tree": "f3b628c2366f181380a8fbcd490910eb086a7b8e",
      "parents": [
        "b0e77598f87107001a00b8a4ece9c95e4254ccc4"
      ],
      "author": {
        "name": "Serge E. Hallyn",
        "email": "serge@hallyn.com",
        "time": "Wed Mar 23 16:43:25 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Mar 23 19:47:08 2011 -0700"
      },
      "message": "userns: userns: check user namespace for task-\u003efile uid equivalence checks\n\nCheat for now and say all files belong to init_user_ns.  Next step will be\nto let superblocks belong to a user_ns, and derive inode_userns(inode)\nfrom inode-\u003ei_sb-\u003es_user_ns.  Finally we\u0027ll introduce more flexible\narrangements.\n\nChangelog:\n\tFeb 15: make is_owner_or_cap take const struct inode\n\tFeb 23: make is_owner_or_cap bool\n\n[akpm@linux-foundation.org: coding-style fixes]\nSigned-off-by: Serge E. Hallyn \u003cserge.hallyn@canonical.com\u003e\nAcked-by: \"Eric W. Biederman\" \u003cebiederm@xmission.com\u003e\nAcked-by: Daniel Lezcano \u003cdaniel.lezcano@free.fr\u003e\nAcked-by: David Howells \u003cdhowells@redhat.com\u003e\nCc: James Morris \u003cjmorris@namei.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "bd23a539d0733c9f9ec3f9fc628491fad2658e82",
      "tree": "b64a04b76be41fe62a734b6e9693890a76b117b3",
      "parents": [
        "eddecbb601c9ea3fab7e67d7892010fc9426d1e6"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 23 09:56:30 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 23 09:56:55 2011 -0400"
      },
      "message": "fix leaks in path_lookupat()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "1aed3e4204dd787d53b3cd6363eb63bb4900c38e",
      "tree": "503582fa9f7fa68a1da7af3770d3a627d041fb52",
      "parents": [
        "7cc90cc3ffe22a0d81b8d605b20a82ec7911012d"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 18 09:09:02 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 18 10:01:59 2011 -0400"
      },
      "message": "lose \u0027mounting_here\u0027 argument in -\u003ed_manage()\n\nit\u0027s always false...\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "7cc90cc3ffe22a0d81b8d605b20a82ec7911012d",
      "tree": "a870fc960dd10a12be6fb905ea266c65547c11bb",
      "parents": [
        "b12cea9198fa99ffd3de1776c323bc7464d26b44"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 18 09:04:20 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 18 09:04:20 2011 -0400"
      },
      "message": "don\u0027t pass \u0027mounting_here\u0027 flag to follow_down()\n\nit\u0027s always false now\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "0e794589e588a88d34e339feee50c72606fb21a7",
      "tree": "74c193941b49c0c3bfe3e0934aaf4bbdff22eab4",
      "parents": [
        "d10902812c9cd5583130a4ebb9ad19c60b68149d"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 16 02:45:02 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 16 04:57:03 2011 -0400"
      },
      "message": "fix follow_link() breakage\n\ncommit 574197e0de46a8a4db5c54ef7b65e43ffa8873a7 had a missing\npiece, breaking the loop detection ;-/\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "574197e0de46a8a4db5c54ef7b65e43ffa8873a7",
      "tree": "c7669dd50705785f4632ff9b054bcd2e4614ea46",
      "parents": [
        "b356379a020bb7197603118bb1cbc903963aa198"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 22:20:34 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 17:16:25 2011 -0400"
      },
      "message": "tidy the trailing symlinks traversal up\n\n* pull the handling of current-\u003etotal_link_count into\n__do_follow_link()\n* put the common \"do -\u003eput_link() if needed and path_put() the link\"\n  stuff into a helper (put_link(nd, link, cookie))\n* rename __do_follow_link() to follow_link(), while we are at it\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "b356379a020bb7197603118bb1cbc903963aa198",
      "tree": "834722d850b2f6a82a07464680244847ed477755",
      "parents": [
        "ce0525449da56444948c368f52e10f3db0465338"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 21:54:55 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 17:16:25 2011 -0400"
      },
      "message": "Turn resolution of trailing symlinks iterative everywhere\n\nThe last remaining place (resolution of nested symlink) converted\nto the loop of the same kind we have in path_lookupat() and\npath_openat().\n\nNote that we still *do* have a recursion in pathname resolution;\ncan\u0027t avoid it, really.  However, it\u0027s strictly for nested symlinks\nnow - i.e. ones in the middle of a pathname.\n\nlink_path_walk() has lost the tail now - it always walks everything\nexcept the last component.\n\ndo_follow_link() renamed to nested_symlink() and moved down.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "ce0525449da56444948c368f52e10f3db0465338",
      "tree": "df50f16b0af733738b39c9430145d94e35a2abdb",
      "parents": [
        "bd92d7fed877ed1e6997e4f3f13dbcd872947653"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 21:28:04 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 17:16:25 2011 -0400"
      },
      "message": "simplify link_path_walk() tail\n\nNow that link_path_walk() is called without LOOKUP_PARENT\nonly from do_follow_link(), we can simplify the checks in\nlast component handling.  First of all, checking if we\u0027d\narrived to a directory is not needed - the caller will check\nit anyway.  And LOOKUP_FOLLOW is guaranteed to be there,\nsince we only get to that place with nd-\u003edepth \u003e 0.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "bd92d7fed877ed1e6997e4f3f13dbcd872947653",
      "tree": "184223c18695fd1b543850dc186e89faf71bb461",
      "parents": [
        "b21041d0f72899ed815bd2cbf7275339c74737b6"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 19:54:59 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 17:16:25 2011 -0400"
      },
      "message": "Make trailing symlink resolution in path_lookupat() iterative\n\nNow the only caller of link_path_walk() that does *not* pass\nLOOKUP_PARENT is do_follow_link()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "b21041d0f72899ed815bd2cbf7275339c74737b6",
      "tree": "e9dddabedc599175926ea29603ca366cdc50dbaa",
      "parents": [
        "ce57dfc1791221ef58b6d6b8f5437fccefc4e187"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 20:01:51 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 17:16:25 2011 -0400"
      },
      "message": "update nd-\u003einode in __do_follow_link() instead of after do_follow_link()\n\n... and note that we only need to do it for LAST_BIND symlinks\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "ce57dfc1791221ef58b6d6b8f5437fccefc4e187",
      "tree": "f4745174c126231bbd2c4a652d37f086ad035e3c",
      "parents": [
        "11a7b371b64ef39fc5fb1b6f2218eef7c4d035e3"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sun Mar 13 19:58:58 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 17:16:20 2011 -0400"
      },
      "message": "pull handling of one pathname component into a helper\n\nnew helper: walk_component().  Handles everything except symlinks;\nreturns negative on error, 0 on success and 1 on symlinks we decided\nto follow.  Drops out of RCU mode on such symlinks.\n\nlink_path_walk() and do_last() switched to using that.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "11a7b371b64ef39fc5fb1b6f2218eef7c4d035e3",
      "tree": "7d2059c9570e24c7d742eedfeedf19743d05a744",
      "parents": [
        "326be7b484843988afe57566b627fb7a70beac56"
      ],
      "author": {
        "name": "Aneesh Kumar K.V",
        "email": "aneesh.kumar@linux.vnet.ibm.com",
        "time": "Sat Jan 29 18:43:42 2011 +0530"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 17:16:05 2011 -0400"
      },
      "message": "fs: allow AT_EMPTY_PATH in linkat(), limit that to CAP_DAC_READ_SEARCH\n\nWe don\u0027t want to allow creation of private hardlinks by different application\nusing the fd passed to them via SCM_RIGHTS. So limit the null relative name\nusage in linkat syscall to CAP_DAC_READ_SEARCH\n\nSigned-off-by: Aneesh Kumar K.V \u003caneesh.kumar@linux.vnet.ibm.com\u003e\n"
    },
    {
      "commit": "bcda76524cd1fa32af748536f27f674a13e56700",
      "tree": "37dbc7fb50b515f3dff820e14d92e768fb1cda31",
      "parents": [
        "1abf0c718f15a56a0a435588d1b104c7a37dc9bd"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sun Mar 13 16:42:14 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 02:21:45 2011 -0400"
      },
      "message": "Allow O_PATH for symlinks\n\nAt that point we can\u0027t do almost nothing with them.  They can be opened\nwith O_PATH, we can manipulate such descriptors with dup(), etc. and\nwe can see them in /proc/*/{fd,fdinfo}/*.\n\nWe can\u0027t (and won\u0027t be able to) follow /proc/*/fd/* symlinks for those;\nthere\u0027s simply not enough information for pathname resolution to go on\nfrom such point - to resolve a symlink we need to know which directory\ndoes it live in.\n\nWe will be able to do useful things with them after the next commit, though -\nreadlinkat() and fchownat() will be possible to use with dfd being an\nO_PATH-opened symlink and empty relative pathname.  Combined with\nopen_by_handle() it\u0027ll give us a way to do realink-by-handle and\nlchown-by-handle without messing with more redundant syscalls.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "1abf0c718f15a56a0a435588d1b104c7a37dc9bd",
      "tree": "91a6fae3218686b9a945569a7fa7fad120f64e94",
      "parents": [
        "f2fa2ffc2046fdc35f96366d1ec8675f4d578522"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sun Mar 13 03:51:11 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 02:21:45 2011 -0400"
      },
      "message": "New kind of open files - \"location only\".\n\nNew flag for open(2) - O_PATH.  Semantics:\n\t* pathname is resolved, but the file itself is _NOT_ opened\nas far as filesystem is concerned.\n\t* almost all operations on the resulting descriptors shall\nfail with -EBADF.  Exceptions are:\n\t1) operations on descriptors themselves (i.e.\n\t\tclose(), dup(), dup2(), dup3(), fcntl(fd, F_DUPFD),\n\t\tfcntl(fd, F_DUPFD_CLOEXEC, ...), fcntl(fd, F_GETFD),\n\t\tfcntl(fd, F_SETFD, ...))\n\t2) fcntl(fd, F_GETFL), for a common non-destructive way to\n\t\tcheck if descriptor is open\n\t3) \"dfd\" arguments of ...at(2) syscalls, i.e. the starting\n\t\tpoints of pathname resolution\n\t* closing such descriptor does *NOT* affect dnotify or\nposix locks.\n\t* permissions are checked as usual along the way to file;\nno permission checks are applied to the file itself.  Of course,\ngiving such thing to syscall will result in permission checks (at\nthe moment it means checking that starting point of ....at() is\na directory and caller has exec permissions on it).\n\nfget() and fget_light() return NULL on such descriptors; use of\nfget_raw() and fget_raw_light() is needed to get them.  That protects\nexisting code from dealing with those things.\n\nThere are two things still missing (they come in the next commits):\none is handling of symlinks (right now we refuse to open them that\nway; see the next commit for semantics related to those) and another\nis descriptor passing via SCM_RIGHTS datagrams.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "aae8a97d3ec30788790d1720b71d76fd8eb44b73",
      "tree": "12dbe7afc10da3eee7ce5dfcf389b655634737e0",
      "parents": [
        "becfd1f37544798cbdfd788f32c827160fab98c1"
      ],
      "author": {
        "name": "Aneesh Kumar K.V",
        "email": "aneesh.kumar@linux.vnet.ibm.com",
        "time": "Sat Jan 29 18:43:27 2011 +0530"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 15 02:21:44 2011 -0400"
      },
      "message": "fs: Don\u0027t allow to create hardlink for deleted file\n\nAdd inode-\u003ei_nlink \u003d\u003d 0 check in VFS. Some of the file systems\ndo this internally. A followup patch will remove those instance.\nThis is needed to ensure that with link by handle we don\u0027t allow\nto create hardlink of an unlinked file. The check also prevent a race\nbetween unlink and link\n\nSigned-off-by: Aneesh Kumar K.V \u003caneesh.kumar@linux.vnet.ibm.com\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "f52e0c11305aa09ed56cad97ffc8f0cdc3d78b5d",
      "tree": "b04070034f8a941fe5d7e9e1b335a02784686bd5",
      "parents": [
        "5fe0c2378884e68beb532f5890cc0e3539ac747b"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 18:56:51 2011 -0400"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 19:12:20 2011 -0400"
      },
      "message": "New AT_... flag: AT_EMPTY_PATH\n\nFor name_to_handle_at(2) we\u0027ll want both ...at()-style syscall that\nwould be usable for non-directory descriptors (with empty relative\npathname).  Introduce new flag (AT_EMPTY_PATH) to deal with that and\ncorresponding LOOKUP_EMPTY; teach user_path_at() and path_init() to\ndeal with the latter.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "73d049a40fc6269189c4e2ba6792cb5dd054883c",
      "tree": "a713747cd06926ad89bfa9b36ea13dd20bbc507f",
      "parents": [
        "5b6ca027d85b7438c84b78a54ccdc2e53f2909cd"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 11 12:08:24 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:28 2011 -0400"
      },
      "message": "open-style analog of vfs_path_lookup()\n\nnew function: file_open_root(dentry, mnt, name, flags) opens the file\nvfs_path_lookup would arrive to.\n\nNote that name can be empty; in that case the usual requirement that\ndentry should be a directory is lifted.\n\nopen-coded equivalents switched to it, may_open() got down exactly\none caller and became static.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "5b6ca027d85b7438c84b78a54ccdc2e53f2909cd",
      "tree": "e35b870101fbc6a2ea6e0399429d9c23707697f3",
      "parents": [
        "5a18fff2090c3af830d699c8ccb230498a1e37e5"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 09 23:04:47 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:27 2011 -0400"
      },
      "message": "reduce vfs_path_lookup() to do_path_lookup()\n\nNew lookup flag: LOOKUP_ROOT.  nd-\u003eroot is set (and held) by caller,\npath_init() starts walking from that place and all pathname resolution\nmachinery never drops nd-\u003eroot if that flag is set.  That turns\nvfs_path_lookup() into a special case of do_path_lookup() *and*\ngets us down to 3 callers of link_path_walk(), making it finally\nfeasible to rip the handling of trailing symlink out of link_path_walk().\nThat will not only simply the living hell out of it, but make life\nmuch simpler for unionfs merge.  Trailing symlink handling will\nbecome iterative, which is a good thing for stack footprint in\na lot of situations as well.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "5a18fff2090c3af830d699c8ccb230498a1e37e5",
      "tree": "388675113818a8d14e7cd7dc25185e1be55354f9",
      "parents": [
        "40b39136f07279fdc868a36cba050f4e84ce0ace"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 11 04:44:53 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:27 2011 -0400"
      },
      "message": "untangle do_lookup()\n\nThat thing has devolved into rats nest of gotos; sane use of unlikely()\ngets rid of that horror and gives much more readable structure:\n\t* make a fast attempt to find a dentry; false negatives are OK.\nIn RCU mode if everything went fine, we are done, otherwise just drop\nout of RCU.  If we\u0027d done (RCU) -\u003ed_revalidate() and it had not refused\noutright (i.e. didn\u0027t give us -ECHILD), remember its result.\n\t* now we are not in RCU mode and hopefully have a dentry.  If we\ndo not, lock parent, do full d_lookup() and if that has not found anything,\nallocate and call -\u003elookup().  If we\u0027d done that -\u003elookup(), remember that\ndentry is good and we don\u0027t need to revalidate it.\n\t* now we have a dentry.  If it has -\u003ed_revalidate() and we can\u0027t\nskip it, call it.\n\t* hopefully dentry is good; if not, either fail (in case of error)\nor try to invalidate it.  If d_invalidate() has succeeded, drop it and\nretry everything as if original attempt had not found a dentry.\n\t* now we can finish it up - deal with mountpoint crossing and\nautomount.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "40b39136f07279fdc868a36cba050f4e84ce0ace",
      "tree": "cd68e514f1b410d034c3b49678d15c352a38d6da",
      "parents": [
        "f374ed5fa8afed8590deaae5dc147422e0e1a6d9"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 09 16:22:18 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:27 2011 -0400"
      },
      "message": "path_openat: clean ELOOP handling a bit\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "f374ed5fa8afed8590deaae5dc147422e0e1a6d9",
      "tree": "76bf116e7a8c75be60734527dd804632dee8a95b",
      "parents": [
        "6c0d46c493217cf48999b3f8808910ae534aa085"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 09 01:34:45 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:27 2011 -0400"
      },
      "message": "do_last: kill a rudiment of old -\u003ed_revalidate() workaround\n\nThere used to be time when -\u003ed_revalidate() couldn\u0027t return an error.\nSo intents code had lookup_instantiate_filp() stash ERR_PTR(error)\nin nd-\u003eintent.open.filp and had it checked after lookup_hash(), to\ncatch the otherwise silent failures.  That had been introduced by\ncommit 4af4c52f34606bdaab6930a845550c6fb02078a4.  These days\n-\u003ed_revalidate() can and does propagate errors back to callers\nexplicitly, so this check isn\u0027t needed anymore.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "6c0d46c493217cf48999b3f8808910ae534aa085",
      "tree": "4c36a27f499ce8a8fb70807c78187c247e79dc65",
      "parents": [
        "ca344a894b41a133dab07dfbbdf652c053f6658c"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 09 00:59:59 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:27 2011 -0400"
      },
      "message": "fold __open_namei_create() and open_will_truncate() into do_last()\n\n... and clean up a bit more\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "ca344a894b41a133dab07dfbbdf652c053f6658c",
      "tree": "2ff61ce7ff0595b3200fa2d9b69e93a87e6c8427",
      "parents": [
        "9b44f1b3928b6f41532c9a1dc9a6fc665989ad5b"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 09 00:36:45 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:27 2011 -0400"
      },
      "message": "do_last: unify may_open() call and everyting after it\n\nWe have a bunch of diverging codepaths in do_last(); some of\nthem converge, but the case of having to create a new file\nduplicates large part of common tail of the rest and exits\nseparately.  Massage them so that they could be merged.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "9b44f1b3928b6f41532c9a1dc9a6fc665989ad5b",
      "tree": "ffa1a492cc767c3c3e561c206131fa1762747833",
      "parents": [
        "0f9d1a10c341020617e5b1c7f9c16f6a070438ec"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 09 00:17:27 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:26 2011 -0400"
      },
      "message": "move may_open() from __open_name_create() to do_last()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "0f9d1a10c341020617e5b1c7f9c16f6a070438ec",
      "tree": "f5bbdf21986394cfe96e3965e75f633fd1331410",
      "parents": [
        "5a202bcd75bbd2397136397961babbd8463416af"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Mar 09 00:13:14 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:26 2011 -0400"
      },
      "message": "expand finish_open() in its only caller\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "5a202bcd75bbd2397136397961babbd8463416af",
      "tree": "4a973df44ef169e66ee2aa5eb6c6b7ed69059509",
      "parents": [
        "6a96ba54418be740303765c0f52be028573cb99a"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 08 14:17:44 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:26 2011 -0400"
      },
      "message": "sanitize pathname component hash calculation\n\nLift it to lookup_one_len() and link_path_walk() resp. into the\nsame place where we calculated default hash function of the same\nname.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "6a96ba54418be740303765c0f52be028573cb99a",
      "tree": "1766b39499c1e0b18ed42f0ef31f64357fa8c8ab",
      "parents": [
        "fe2d35ff0d18a2c93993b0d7d46f846ff4331b72"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 07 23:49:20 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:26 2011 -0400"
      },
      "message": "kill __lookup_one_len()\n\nonly one caller left\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "fe2d35ff0d18a2c93993b0d7d46f846ff4331b72",
      "tree": "0a60fd245b1aff56a0b1470cadd6e242bfd4a2de",
      "parents": [
        "70e9b3571107b88674cd55ae4bed33f76261e7d3"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Mar 05 22:58:25 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:26 2011 -0400"
      },
      "message": "switch non-create side of open() to use of do_last()\n\nInstead of path_lookupat() doing trailing symlink resolution,\nuse the same scheme as on the O_CREAT side.  Walk with\nLOOKUP_PARENT, then (in do_last()) look the final component\nup, then either open it or return error or, if it\u0027s a symlink,\ngive the symlink back to path_openat() to be resolved there.\n\nThe really messy complication here is RCU.  We don\u0027t want to drop\nout of RCU mode before the final lookup, since we don\u0027t want to\nbounce parent directory -\u003ed_count without a good reason.\n\nResult is _not_ pretty; later in the series we\u0027ll clean it up.\nFor now we are roughly back where we\u0027d been before the revert\ndone by Nick\u0027s series - top-level logics of path_openat() is\ncleaned up, do_last() does actual opening, symlink resolution is\ndone uniformly.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "70e9b3571107b88674cd55ae4bed33f76261e7d3",
      "tree": "a22a2cd29b3075ddb9fed4305fd0ff88c07d5963",
      "parents": [
        "951361f954596bd134d4270df834f47d151f98a6"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Mar 05 21:12:22 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:26 2011 -0400"
      },
      "message": "get rid of nd-\u003efile\n\nDon\u0027t stash the struct file * used as starting point of walk in nameidata;\npass file ** to path_init() instead.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "951361f954596bd134d4270df834f47d151f98a6",
      "tree": "719622960d2ec96473636333ddc8b85ab8151505",
      "parents": [
        "a7472baba22dd5d68580f528374f93421b33667e"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 04 14:44:37 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:26 2011 -0400"
      },
      "message": "get rid of the last LOOKUP_RCU dependencies in link_path_walk()\n\nNew helper: terminate_walk().  An error has happened during pathname\nresolution and we either drop nd-\u003epath or terminate RCU, depending\nthe mode we had been in.  After that, nd is essentially empty.\nSwitch link_path_walk() to using that for cleanup.\n\nNow the top-level logics in link_path_walk() is back to sanity.  RCU\ndependencies are in the lower-level functions.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "a7472baba22dd5d68580f528374f93421b33667e",
      "tree": "a7919a0dea2c58fa498e17d6c7be19fb0b9b571f",
      "parents": [
        "ef7562d5283a91da3ba5c14de3221f47b7f08823"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 04 14:39:30 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:25 2011 -0400"
      },
      "message": "make nameidata_dentry_drop_rcu_maybe() always leave RCU mode\n\nNow we have do_follow_link() guaranteed to leave without dangling RCU\nand the next step will get LOOKUP_RCU logics completely out of\nlink_path_walk().\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "ef7562d5283a91da3ba5c14de3221f47b7f08823",
      "tree": "bf517d1a2c205ad475480c958449b2bc25de61b4",
      "parents": [
        "4455ca6223cc59cbc0a75f4be8bce9e84cc0d6b8"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 04 14:35:59 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:25 2011 -0400"
      },
      "message": "make handle_dots() leave RCU mode on error\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "4455ca6223cc59cbc0a75f4be8bce9e84cc0d6b8",
      "tree": "5fb5966330b9dff9a364da07e85c224b89ca9dd2",
      "parents": [
        "9856fa1b281eccdc9f8d94d716e96818c675e78e"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 04 14:28:10 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:25 2011 -0400"
      },
      "message": "clear RCU on all failure exits from link_path_walk()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "9856fa1b281eccdc9f8d94d716e96818c675e78e",
      "tree": "a66b72a6b0c143a29684b177771248c0881733ff",
      "parents": [
        "7bc055d1d524f209bf49d8b9cb220712dd7df4ed"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 04 14:22:06 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:25 2011 -0400"
      },
      "message": "pull handling of . and .. into inlined helper\n\ngetting LOOKUP_RCU checks out of link_path_walk()...\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "7bc055d1d524f209bf49d8b9cb220712dd7df4ed",
      "tree": "29971abb7728cb684a29d78b7c9482518d7c46d1",
      "parents": [
        "13aab428a73d3200b9283b61b7fdf5713181ac66"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Feb 23 19:41:31 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:25 2011 -0400"
      },
      "message": "kill out_dput: in link_path_walk()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "13aab428a73d3200b9283b61b7fdf5713181ac66",
      "tree": "b7350283378b60366609dca7b02c412b4632879e",
      "parents": [
        "47c805dc2d2dff686962f5f0baa6bac2d703ba19"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Feb 23 17:54:08 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:25 2011 -0400"
      },
      "message": "separate -ESTALE/-ECHILD retries in do_filp_open() from real work\n\nnew helper: path_openat().  Does what do_filp_open() does, except\nthat it tries only the walk mode (RCU/normal/force revalidation)\nit had been told to.\n\nBoth create and non-create branches are using path_lookupat() now.\nFixed the double audit_inode() in non-create branch.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "47c805dc2d2dff686962f5f0baa6bac2d703ba19",
      "tree": "b596e0a1aadb1550ef2099df95832196cd0eeda1",
      "parents": [
        "c3e380b0b3cfa613189fb91513efd88a65e1d9d8"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Feb 23 17:44:09 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:25 2011 -0400"
      },
      "message": "switch do_filp_open() to struct open_flags\n\ntake calculation of open_flags by open(2) arguments into new helper\nin fs/open.c, move filp_open() over there, have it and do_sys_open()\nuse that helper, switch exec.c callers of do_filp_open() to explicit\n(and constant) struct open_flags.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "c3e380b0b3cfa613189fb91513efd88a65e1d9d8",
      "tree": "fd5f7d393beecb20d61cceb49b85c80f380790c2",
      "parents": [
        "f1afe9efc84476ca42fbb7301a441021063eead7"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Feb 23 13:39:45 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:25 2011 -0400"
      },
      "message": "Collect \"operation mode\" arguments of do_last() into a structure\n\nNo point messing with passing shitloads of \"operation mode\" arguments\nto do_open() one by one, especially since they are not going to change\nduring do_filp_open().  Collect them into a struct, fill it and pass\nto do_last() by reference.\n\nMake sure that lookup intent flags are correctly set and removed - we\nwant them for do_last(), but they make no sense for __do_follow_link().\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "f1afe9efc84476ca42fbb7301a441021063eead7",
      "tree": "5bf606519f5192d97e8da59c989d89c78a62bf27",
      "parents": [
        "36f3b4f69070fee7c647bab5dc4408990bb3606c"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 22 22:27:28 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:24 2011 -0400"
      },
      "message": "clean up the failure exits after __do_follow_link() in do_filp_open()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "36f3b4f69070fee7c647bab5dc4408990bb3606c",
      "tree": "47431f3ae87bd5c81a157287d2d433386e9bbf6f",
      "parents": [
        "086e183a641109033420e0b26ddecb6f4abb4c89"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 22 21:24:38 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:24 2011 -0400"
      },
      "message": "pull security_inode_follow_link() into __do_follow_link()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "086e183a641109033420e0b26ddecb6f4abb4c89",
      "tree": "c8b0c197c042c51140fc9b8bb8bfcf816fe29448",
      "parents": [
        "16c2cd7179881d5dd87779512ca5a0d657c64f62"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 22 20:56:27 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:24 2011 -0400"
      },
      "message": "pull dropping RCU on success of link_path_walk() into path_lookupat()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "16c2cd7179881d5dd87779512ca5a0d657c64f62",
      "tree": "822d14ecf505cb3f53e2afe3e1e7867bb32ca346",
      "parents": [
        "fe479a580dc9c737c4eb49ff7fdb31d41d2c7003"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 22 15:50:10 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:24 2011 -0400"
      },
      "message": "untangle the \"need_reval_dot\" mess\n\ninstead of ad-hackery around need_reval_dot(), do the following:\nset a flag (LOOKUP_JUMPED) in the beginning of path, on absolute\nsymlink traversal, on \"..\" and on procfs-style symlinks.  Clear on\nnormal components, leave unchanged on \".\".  Non-nested callers of\nlink_path_walk() call handle_reval_path(), which checks that flag\nis set and that fs does want the final revalidate thing, then does\n-\u003ed_revalidate().  In link_path_walk() all the return_reval stuff\nis gone.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "fe479a580dc9c737c4eb49ff7fdb31d41d2c7003",
      "tree": "cf15923f305d8c4298a44baf2359d2d9e3e2c7c6",
      "parents": [
        "e41f7d4ee5bdb00da7d327a00b0ab9c4a2e9eaa3"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 22 15:10:03 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:24 2011 -0400"
      },
      "message": "merge component type recognition\n\nno need to do it in three places...\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "e41f7d4ee5bdb00da7d327a00b0ab9c4a2e9eaa3",
      "tree": "d75350ba135d66f13a59864923f9a68c51f741e7",
      "parents": [
        "ee0827cd6b42b0385dc1a116cd853ac1b739f711"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 22 14:02:58 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:24 2011 -0400"
      },
      "message": "merge path_init and path_init_rcu\n\nActual dependency on whether we want RCU or not is in 3 small areas\n(as it ought to be) and everything around those is the same in both\nversions.  Since each function has only one caller and those callers\nare on two sides of if (flags \u0026 LOOKUP_RCU), it\u0027s easier and cleaner\nto merge them and pull the checks inside.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "ee0827cd6b42b0385dc1a116cd853ac1b739f711",
      "tree": "2b96985f7c87c4333d740d991fbdcb3f49a1a67e",
      "parents": [
        "52094c8a0610cf57920ad4c6c57470ae2ccbbd25"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Feb 21 23:38:09 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:24 2011 -0400"
      },
      "message": "sanitize path_walk() mess\n\nNew helper: path_lookupat().  Basically, what do_path_lookup() boils to\nmodulo -ECHILD/-ESTALE handler.  path_walk* family is gone; vfs_path_lookup()\nis using link_path_walk() directly, do_path_lookup() and do_filp_open()\nare using path_lookupat().\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "52094c8a0610cf57920ad4c6c57470ae2ccbbd25",
      "tree": "1601d55c395248a429eb1c0fddc1c23094694024",
      "parents": [
        "c9c6cac0c2bdbda42e7b804838648d0bc60ddb13"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Feb 21 21:34:47 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:23 2011 -0400"
      },
      "message": "take RCU-dependent stuff around exec_permission() into a new helper\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "c9c6cac0c2bdbda42e7b804838648d0bc60ddb13",
      "tree": "c2d9b41eb24026d6769175e9ba3c17c8093b6aad",
      "parents": [
        "15a9155fe3e8215c02b80df51ec2cac7c0d726ad"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Wed Feb 16 15:15:47 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Mar 14 09:15:23 2011 -0400"
      },
      "message": "kill path_lookup()\n\nall remaining callers pass LOOKUP_PARENT to it, so\nflags argument can die; renamed to kern_path_parent()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "b306419ae08d9def53f2142a37cc0a58622307a8",
      "tree": "8d3e6a51b05f39230a968e0655162f560f6c3c42",
      "parents": [
        "dfef6dcd35cb4a251f6322ca9b2c06f0bb1aa1f4"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 08 21:16:28 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Mar 08 21:16:28 2011 -0500"
      },
      "message": "nd-\u003einode is not set on the second attempt in path_walk()\n\nWe leave it at whatever it had been pointing to after the\nfirst link_path_walk() had failed with -ESTALE.  Things\ndo not work well after that...\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "1858efd471624ecb37e6b5462cab8076f47d1cee",
      "tree": "29d1e5d2aad63b798e880011fc527bb4bab63e40",
      "parents": [
        "b65a0e0c84cf489bfa00d6aa6c48abc5a237100f"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 04 13:14:21 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Mar 04 13:14:21 2011 -0500"
      },
      "message": "minimal fix for do_filp_open() race\n\nfailure exits on the no-O_CREAT side of do_filp_open() merge with\nthose of O_CREAT one; unfortunately, if do_path_lookup() returns\n-ESTALE, we\u0027ll get out_filp:, notice that we are about to return\n-ESTALE without having trying to create the sucker with LOOKUP_REVAL\nand jump right into the O_CREAT side of code.  And proceed to try\nand create a file.  Usually that\u0027ll fail with -ESTALE again, but\nwe can race and get that attempt of pathname resolution to succeed.\n\nopen() without O_CREAT really shouldn\u0027t end up creating files, races\nor not.  The real fix is to rearchitect the whole do_filp_open(),\nbut for now splitting the failure exits will do.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "3abb17e82f08628b59e20d8cbcb55e2204180f69",
      "tree": "890a411ebda28a9b9e6c90520429554a9e7fb95a",
      "parents": [
        "85e2efbb1db9a18d218006706d6e4fbeb0216213"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Feb 16 08:56:55 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Feb 16 08:56:55 2011 -0800"
      },
      "message": "vfs: fix BUG_ON() in fs/namei.c:1461\n\nWhen Al moved the nameidata_dentry_drop_rcu_maybe() call into the\ndo_follow_link function in commit 844a391799c2 (\"nothing in\ndo_follow_link() is going to see RCU\"), he mistakenly left the\n\n\tBUG_ON(inode !\u003d path-\u003edentry-\u003ed_inode);\n\nbehind.  Which would otherwise be ok, but that BUG_ON() really needs to\nbe _after_ dropping RCU, since the dentry isn\u0027t necessarily stable\notherwise.\n\nSo complete the code movement in that commit, and move the BUG_ON() into\ndo_follow_link() too.  This means that we need to pass in \u0027inode\u0027 as an\nargument (just for this one use), but that\u0027s a small thing.  And\neventually we may be confident enough in our path lookup that we can\njust remove the BUG_ON() and the unnecessary inode argument.\n\nReported-and-tested-by: Eric Dumazet \u003ceric.dumazet@gmail.com\u003e\nAcked-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "4e924a4f53a0e1ea060bd50695a12a238b250322",
      "tree": "868af33c6c1ca390e688c8aaf19f4fe1fca2bc27",
      "parents": [
        "f60aef7ec625236a6366722bb1be7b37596bf0ae"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 01:42:59 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 02:26:54 2011 -0500"
      },
      "message": "get rid of nameidata_dentry_drop_rcu() calling nameidata_drop_rcu()\n\ncan\u0027t happen anymore and didn\u0027t work right anyway\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "f60aef7ec625236a6366722bb1be7b37596bf0ae",
      "tree": "9ac12873b513fdb820eda3bf7c2894edac384901",
      "parents": [
        "f5e1c1c1afc1d979e2ac6a24cc99ba7143639f4d"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 01:35:28 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 02:26:54 2011 -0500"
      },
      "message": "drop out of RCU in return_reval\n\n... thus killing the need to handle drop-from-RCU in d_revalidate()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "f5e1c1c1afc1d979e2ac6a24cc99ba7143639f4d",
      "tree": "48dad00e6bead517191094c0c05ef7b01c226e25",
      "parents": [
        "24643087e748bf192f1182766716e522dc1c972f"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 01:32:55 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 02:26:54 2011 -0500"
      },
      "message": "split do_revalidate() into RCU and non-RCU cases\n\nfixing oopsen in lookup_one_len()\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "24643087e748bf192f1182766716e522dc1c972f",
      "tree": "f67283376c36f6745f1f26c9f67b953ff0b4de55",
      "parents": [
        "844a391799c25d9ba85cbce33e4697db06083ec6"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 01:26:22 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 02:26:54 2011 -0500"
      },
      "message": "in do_lookup() split RCU and non-RCU cases of need_revalidate\n\nand use unlikely() instead of gotos, for fsck sake...\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "844a391799c25d9ba85cbce33e4697db06083ec6",
      "tree": "6f08be3adfe934f24ef8f98b09d3d1a6319a6c92",
      "parents": [
        "795abaf1e4e188c4171e3cd3dbb11a9fcacaf505"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 00:38:26 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Feb 15 02:26:53 2011 -0500"
      },
      "message": "nothing in do_follow_link() is going to see RCU\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "2dab597441667d6c04451a7dcf215241ad4c74f6",
      "tree": "f56a6f7fcabf3a9b82a5e77ef9c96268224efbd1",
      "parents": [
        "d2478521afc20227658a10a8c5c2bf1a2aa615b3"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Feb 11 15:53:38 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Feb 11 15:53:38 2011 -0800"
      },
      "message": "Fix possible filp_cachep memory corruption\n\nIn commit 31e6b01f4183 (\"fs: rcu-walk for path lookup\") we started doing\npath lookup using RCU, which then falls back to a careful non-RCU lookup\nin case of problems (LOOKUP_REVAL).  So do_filp_open() has this \"re-do\nthe lookup carefully\" looping case.\n\nHowever, that means that we must not release the open-intent file data\nif we are going to loop around and use it once more!\n\nFix this by moving the release of the open-intent data to the function\nthat allocates it (do_filp_open() itself) rather than the helper\nfunctions that can get called multiple times (finish_open() and\ndo_last()).  This makes the logic for the lifetime of that field much\nmore obvious, and avoids the possible double free.\n\nReported-by: J. R. Okajima \u003chooanon05@yahoo.co.jp\u003e\nAcked-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\nCc: Nick Piggin \u003cnpiggin@kernel.dk\u003e\nCc: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "8931221411f9ff950de8fd686dc5ab881394cb9a",
      "tree": "63d97668bae62d1034002cc7778adde2aa18b346",
      "parents": [
        "c14cc63a63e94d490ac6517a555113c30d420db4"
      ],
      "author": {
        "name": "Ian Kent",
        "email": "raven@themaw.net",
        "time": "Tue Jan 18 12:06:10 2011 +0800"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Tue Jan 18 01:21:26 2011 -0500"
      },
      "message": "vfs - fix dentry ref count in do_lookup()\n\nThere is a ref count problem in fs/namei.c:do_lookup().\n\nWhen walking in ref-walk mode, if follow_managed() returns a fail we\nneed to drop dentry and possibly vfsmount.  Clean up properly,\nas we do in the other caller of follow_managed().\n\nSigned-off-by: Ian Kent \u003craven@themaw.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "19a167af7c97248ec646552ebc9140bc6aa3552a",
      "tree": "a521153c80fa6e40b2b4983c5bba21c2e96d1864",
      "parents": [
        "e78bf5e6cbe837daa6ab628a5f679548742994d3"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Jan 17 01:35:23 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Mon Jan 17 01:35:23 2011 -0500"
      },
      "message": "Take the completion of automount into new helper\n\n... and shift it from namei.c to namespace.c\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "f03c65993b98eeb909a4012ce7833c5857d74755",
      "tree": "a6dd5e353889b7fe4ab87c54170d09443d788fec",
      "parents": [
        "7b8a53fd815deb39542085897743fa0063f9fe06"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Fri Jan 14 22:30:21 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sun Jan 16 13:47:07 2011 -0500"
      },
      "message": "sanitize vfsmount refcounting changes\n\nInstead of splitting refcount between (per-cpu) mnt_count\nand (SMP-only) mnt_longrefs, make all references contribute\nto mnt_count again and keep track of how many are longterm\nones.\n\nAccounting rules for longterm count:\n\t* 1 for each fs_struct.root.mnt\n\t* 1 for each fs_struct.pwd.mnt\n\t* 1 for having non-NULL -\u003emnt_ns\n\t* decrement to 0 happens only under vfsmount lock exclusive\n\nThat allows nice common case for mntput() - since we can\u0027t drop the\nfinal reference until after mnt_longterm has reached 0 due to the rules\nabove, mntput() can grab vfsmount lock shared and check mnt_longterm.\nIf it turns out to be non-zero (which is the common case), we know\nthat this is not the final mntput() and can just blindly decrement\npercpu mnt_count.  Otherwise we grab vfsmount lock exclusive and\ndo usual decrement-and-check of percpu mnt_count.\n\nFor fs_struct.c we have mnt_make_longterm() and mnt_make_shortterm();\nnamespace.c uses the latter in places where we don\u0027t already hold\nvfsmount lock exclusive and opencodes a few remaining spots where\nwe need to manipulate mnt_longterm.\n\nNote that we mostly revert the code outside of fs/namespace.c back\nto what we used to have; in particular, normal code doesn\u0027t need\nto care about two kinds of references, etc.  And we get to keep\nthe optimization Nick\u0027s variant had bought us...\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "ea5b778a8b98c85a87d66bf844904f9c3802b869",
      "tree": "baa56cbe1a907d76341f2cad53e16569cc1d3288",
      "parents": [
        "ab90911ff90cdab59b31c045c3f0ae480d14f29d"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Jan 14 19:10:03 2011 +0000"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 20:07:48 2011 -0500"
      },
      "message": "Unexport do_add_mount() and add in follow_automount(), not -\u003ed_automount()\n\nUnexport do_add_mount() and make -\u003ed_automount() return the vfsmount to be\nadded rather than calling do_add_mount() itself.  follow_automount() will then\ndo the addition.\n\nThis slightly complicates things as -\u003ed_automount() normally wants to add the\nnew vfsmount to an expiration list and start an expiration timer.  The problem\nwith that is that the vfsmount will be deleted if it has a refcount of 1 and\nthe timer will not repeat if the expiration list is empty.\n\nTo this end, we require the vfsmount to be returned from d_automount() with a\nrefcount of (at least) 2.  One of these refs will be dropped unconditionally.\nIn addition, follow_automount() must get a 3rd ref around the call to\ndo_add_mount() lest it eat a ref and return an error, leaving the mount we\nhave open to being expired as we would otherwise have only 1 ref on it.\n\nd_automount() should also add the the vfsmount to the expiration list (by\ncalling mnt_set_expiry()) and start the expiration timer before returning, if\nthis mechanism is to be used.  The vfsmount will be unlinked from the\nexpiration list by follow_automount() if do_add_mount() fails.\n\nThis patch also fixes the call to do_add_mount() for AFS to propagate the mount\nflags from the parent vfsmount.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "ab90911ff90cdab59b31c045c3f0ae480d14f29d",
      "tree": "683450a66eb9dc6bf053e38d63f4740bb53a7b6e",
      "parents": [
        "87556ef19926e97464e0163a7840140527ae6615"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Jan 14 18:46:51 2011 +0000"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 20:07:47 2011 -0500"
      },
      "message": "Allow d_manage() to be used in RCU-walk mode\n\nAllow d_manage() to be called from pathwalk when it is in RCU-walk mode as well\nas when it is in Ref-walk mode.  This permits __follow_mount_rcu() to call\nd_manage() directly.  d_manage() needs a parameter to indicate that it is in\nRCU-walk mode as it isn\u0027t allowed to sleep if in that mode (but should return\n-ECHILD instead).\n\nautofs4_d_manage() can then be set to retain RCU-walk mode if the daemon\naccesses it and otherwise request dropping back to ref-walk mode.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "87556ef19926e97464e0163a7840140527ae6615",
      "tree": "04f75b49a88523e4700a2cbf73c04c75697c419a",
      "parents": [
        "1972580bb4edea3ed6fe273b2ca72f44f10f8c86"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Jan 14 18:46:46 2011 +0000"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 20:07:46 2011 -0500"
      },
      "message": "Remove a further kludge from __do_follow_link()\n\nRemove a further kludge from __do_follow_link() as it\u0027s no longer required with\nthe automount code.\n\nThis reverts the non-helper-function parts of\n051d381259eb57d6074d02a6ba6e90e744f1a29f, which breaks union mounts.\n\nReported-by: vaurora@redhat.com\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "db3729153e82ba3ada89681f26c4f1b6d6807a80",
      "tree": "55714bb93d9377e5f8762b9030e87fec3e469645",
      "parents": [
        "01c64feac45cea1317263eabc4f7ee1b240f297f"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Jan 14 18:45:53 2011 +0000"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 20:07:36 2011 -0500"
      },
      "message": "Remove the automount through follow_link() kludge code from pathwalk\n\nRemove the automount through follow_link() kludge code from pathwalk in favour\nof using d_automount().\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nAcked-by: Ian Kent \u003craven@themaw.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "6f45b65672c8017d5e210e338bb5858a938ef445",
      "tree": "b62877c489fb682033c37d30d91c53e4d0c3833a",
      "parents": [
        "cc53ce53c86924bfe98a12ea20b7465038a08792"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Jan 14 18:45:31 2011 +0000"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 20:07:33 2011 -0500"
      },
      "message": "Add an AT_NO_AUTOMOUNT flag to suppress terminal automount\n\nAdd an AT_NO_AUTOMOUNT flag to suppress terminal automounting of automount\npoint directories.  This can be used by fstatat() users to permit the\ngathering of attributes on an automount point and also prevent\nmass-automounting of a directory of automount points by ls.\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nAcked-by: Ian Kent \u003craven@themaw.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "cc53ce53c86924bfe98a12ea20b7465038a08792",
      "tree": "3c9a4923dd9f413c46bfa83a20cb579446df6deb",
      "parents": [
        "9875cf806403fae66b2410a3c2cc820d97731e04"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Jan 14 18:45:26 2011 +0000"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 20:07:31 2011 -0500"
      },
      "message": "Add a dentry op to allow processes to be held during pathwalk transit\n\nAdd a dentry op (d_manage) to permit a filesystem to hold a process and make it\nsleep when it tries to transit away from one of that filesystem\u0027s directories\nduring a pathwalk.  The operation is keyed off a new dentry flag\n(DCACHE_MANAGE_TRANSIT).\n\nThe filesystem is allowed to be selective about which processes it holds and\nwhich it permits to continue on or prohibits from transiting from each flagged\ndirectory.  This will allow autofs to hold up client processes whilst letting\nits userspace daemon through to maintain the directory or the stuff behind it\nor mounted upon it.\n\nThe -\u003ed_manage() dentry operation:\n\n\tint (*d_manage)(struct path *path, bool mounting_here);\n\ntakes a pointer to the directory about to be transited away from and a flag\nindicating whether the transit is undertaken by do_add_mount() or\ndo_move_mount() skipping through a pile of filesystems mounted on a mountpoint.\n\nIt should return 0 if successful and to let the process continue on its way;\n-EISDIR to prohibit the caller from skipping to overmounted filesystems or\nautomounting, and to use this directory; or some other error code to return to\nthe user.\n\n-\u003ed_manage() is called with namespace_sem writelocked if mounting_here is true\nand no other locks held, so it may sleep.  However, if mounting_here is true,\nit may not initiate or wait for a mount or unmount upon the parameter\ndirectory, even if the act is actually performed by userspace.\n\nWithin fs/namei.c, follow_managed() is extended to check with d_manage() first\non each managed directory, before transiting away from it or attempting to\nautomount upon it.\n\nfollow_down() is renamed follow_down_one() and should only be used where the\nfilesystem deliberately intends to avoid management steps (e.g. autofs).\n\nA new follow_down() is added that incorporates the loop done by all other\ncallers of follow_down() (do_add/move_mount(), autofs and NFSD; whilst AFS, NFS\nand CIFS do use it, their use is removed by converting them to use\nd_automount()).  The new follow_down() calls d_manage() as appropriate.  It\nalso takes an extra parameter to indicate if it is being called from mount code\n(with namespace_sem writelocked) which it passes to d_manage().  follow_down()\nignores automount points so that it can be used to mount on them.\n\n__follow_mount_rcu() is made to abort rcu-walk mode if it hits a directory with\nDCACHE_MANAGE_TRANSIT set on the basis that we\u0027re probably going to have to\nsleep.  It would be possible to enter d_manage() in rcu-walk mode too, and have\nthat determine whether to abort or not itself.  That would allow the autofs\ndaemon to continue on in rcu-walk mode.\n\nNote that DCACHE_MANAGE_TRANSIT on a directory should be cleared when it isn\u0027t\nrequired as every tranist from that directory will cause d_manage() to be\ninvoked.  It can always be set again when necessary.\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nWHAT THIS MEANS FOR AUTOFS\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nAutofs currently uses the lookup() inode op and the d_revalidate() dentry op to\ntrigger the automounting of indirect mounts, and both of these can be called\nwith i_mutex held.\n\nautofs knows that the i_mutex will be held by the caller in lookup(), and so\ncan drop it before invoking the daemon - but this isn\u0027t so for d_revalidate(),\nsince the lock is only held on _some_ of the code paths that call it.  This\nmeans that autofs can\u0027t risk dropping i_mutex from its d_revalidate() function\nbefore it calls the daemon.\n\nThe bug could manifest itself as, for example, a process that\u0027s trying to\nvalidate an automount dentry that gets made to wait because that dentry is\nexpired and needs cleaning up:\n\n\tmkdir         S ffffffff8014e05a     0 32580  24956\n\tCall Trace:\n\t [\u003cffffffff885371fd\u003e] :autofs4:autofs4_wait+0x674/0x897\n\t [\u003cffffffff80127f7d\u003e] avc_has_perm+0x46/0x58\n\t [\u003cffffffff8009fdcf\u003e] autoremove_wake_function+0x0/0x2e\n\t [\u003cffffffff88537be6\u003e] :autofs4:autofs4_expire_wait+0x41/0x6b\n\t [\u003cffffffff88535cfc\u003e] :autofs4:autofs4_revalidate+0x91/0x149\n\t [\u003cffffffff80036d96\u003e] __lookup_hash+0xa0/0x12f\n\t [\u003cffffffff80057a2f\u003e] lookup_create+0x46/0x80\n\t [\u003cffffffff800e6e31\u003e] sys_mkdirat+0x56/0xe4\n\nversus the automount daemon which wants to remove that dentry, but can\u0027t\nbecause the normal process is holding the i_mutex lock:\n\n\tautomount     D ffffffff8014e05a     0 32581      1              32561\n\tCall Trace:\n\t [\u003cffffffff80063c3f\u003e] __mutex_lock_slowpath+0x60/0x9b\n\t [\u003cffffffff8000ccf1\u003e] do_path_lookup+0x2ca/0x2f1\n\t [\u003cffffffff80063c89\u003e] .text.lock.mutex+0xf/0x14\n\t [\u003cffffffff800e6d55\u003e] do_rmdir+0x77/0xde\n\t [\u003cffffffff8005d229\u003e] tracesys+0x71/0xe0\n\t [\u003cffffffff8005d28d\u003e] tracesys+0xd5/0xe0\n\nwhich means that the system is deadlocked.\n\nThis patch allows autofs to hold up normal processes whilst the daemon goes\nahead and does things to the dentry tree behind the automouter point without\nrisking a deadlock as almost no locks are held in d_manage() and none in\nd_automount().\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nWas-Acked-by: Ian Kent \u003craven@themaw.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "9875cf806403fae66b2410a3c2cc820d97731e04",
      "tree": "6f9546b400716766af95e0f78e3d600e765b2b51",
      "parents": [
        "1a8edf40e7c3eee955e0dd0316a7c9d85e36f597"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Fri Jan 14 18:45:21 2011 +0000"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 20:05:03 2011 -0500"
      },
      "message": "Add a dentry op to handle automounting rather than abusing follow_link()\n\nAdd a dentry op (d_automount) to handle automounting directories rather than\nabusing the follow_link() inode operation.  The operation is keyed off a new\ndentry flag (DCACHE_NEED_AUTOMOUNT).\n\nThis also makes it easier to add an AT_ flag to suppress terminal segment\nautomount during pathwalk and removes the need for the kludge code in the\npathwalk algorithm to handle directories with follow_link() semantics.\n\nThe -\u003ed_automount() dentry operation:\n\n\tstruct vfsmount *(*d_automount)(struct path *mountpoint);\n\ntakes a pointer to the directory to be mounted upon, which is expected to\nprovide sufficient data to determine what should be mounted.  If successful, it\nshould return the vfsmount struct it creates (which it should also have added\nto the namespace using do_add_mount() or similar).  If there\u0027s a collision with\nanother automount attempt, NULL should be returned.  If the directory specified\nby the parameter should be used directly rather than being mounted upon,\n-EISDIR should be returned.  In any other case, an error code should be\nreturned.\n\nThe -\u003ed_automount() operation is called with no locks held and may sleep.  At\nthis point the pathwalk algorithm will be in ref-walk mode.\n\nWithin fs/namei.c itself, a new pathwalk subroutine (follow_automount()) is\nadded to handle mountpoints.  It will return -EREMOTE if the automount flag was\nset, but no d_automount() op was supplied, -ELOOP if we\u0027ve encountered too many\nsymlinks or mountpoints, -EISDIR if the walk point should be used without\nmounting and 0 if successful.  The path will be updated to point to the mounted\nfilesystem if a successful automount took place.\n\n__follow_mount() is replaced by follow_managed() which is more generic\n(especially with the patch that adds -\u003ed_manage()).  This handles transits from\ndirectories during pathwalk, including automounting and skipping over\nmountpoints (and holding processes with the next patch).\n\n__follow_mount_rcu() will jump out of RCU-walk mode if it encounters an\nautomount point with nothing mounted on it.\n\nfollow_dotdot*() does not handle automounts as you don\u0027t want to trigger them\nwhilst following \"..\".\n\nI\u0027ve also extracted the mount/don\u0027t-mount logic from autofs4 and included it\nhere.  It makes the mount go ahead anyway if someone calls open() or creat(),\ntries to traverse the directory, tries to chdir/chroot/etc. into the directory,\nor sticks a \u0027/\u0027 on the end of the pathname.  If they do a stat(), however,\nthey\u0027ll only trigger the automount if they didn\u0027t also say O_NOFOLLOW.\n\nI\u0027ve also added an inode flag (S_AUTOMOUNT) so that filesystems can mark their\ninodes as automount points.  This flag is automatically propagated to the\ndentry as DCACHE_NEED_AUTOMOUNT by __d_instantiate().  This saves NFS and could\nsave AFS a private flag bit apiece, but is not strictly necessary.  It would be\npreferable to do the propagation in d_set_d_op(), but that doesn\u0027t normally\nhave access to the inode.\n\n[AV: fixed breakage in case if __follow_mount_rcu() fails and nameidata_drop_rcu()\nsucceeds in RCU case of do_lookup(); we need to fall through to non-RCU case after\nthat, rather than just returning with ungrabbed *path]\n\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nWas-Acked-by: Ian Kent \u003craven@themaw.net\u003e\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "1a8edf40e7c3eee955e0dd0316a7c9d85e36f597",
      "tree": "e9776058ac678d6f8b29429e77d2de58dcc83608",
      "parents": [
        "d73b388459b1ee2e80f8ff9c1916d75640d7d920"
      ],
      "author": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 13:12:53 2011 -0500"
      },
      "committer": {
        "name": "Al Viro",
        "email": "viro@zeniv.linux.org.uk",
        "time": "Sat Jan 15 20:03:39 2011 -0500"
      },
      "message": "do_lookup() fix\n\ndo_lookup() has a path leading from LOOKUP_RCU case to non-RCU\ncrossing of mountpoints, which breaks things badly.  If we\nhit need_revalidate: and do nothing in there, we need to come\nback into LOOKUP_RCU half of things, not to done: in non-RCU\none.\n\nSigned-off-by: Al Viro \u003cviro@zeniv.linux.org.uk\u003e\n"
    },
    {
      "commit": "acda4721ae876dedab3fef04bbd8020bfa67ff0a",
      "tree": "ec48d554fe48b3915912e2ae62bc962ade0553bd",
      "parents": [
        "822e5215f9eef86c1dd56d5696bf55a212b0e3f0",
        "32385c7cf60a78375b63afc4f02001df84dfd1a0"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Jan 14 09:08:29 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Jan 14 09:08:29 2011 -0800"
      },
      "message": "Merge branch \u0027vfs-scale-working\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin\n\n* \u0027vfs-scale-working\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin:\n  kernel: fix hlist_bl again\n  cgroups: Fix a lockdep warning at cgroup removal\n  fs: namei fix -\u003eput_link on wrong inode in do_filp_open\n"
    },
    {
      "commit": "7b9337aaf98f9941d0927a75217d3ff31afec609",
      "tree": "d61753169b24d521147116717f310dfb65d3d20d",
      "parents": [
        "f20877d94a74557b7c28b4ed8920d834c31e0ea5"
      ],
      "author": {
        "name": "Nick Piggin",
        "email": "npiggin@kernel.dk",
        "time": "Fri Jan 14 08:42:43 2011 +0000"
      },
      "committer": {
        "name": "Nick Piggin",
        "email": "npiggin@kernel.dk",
        "time": "Fri Jan 14 08:42:43 2011 +0000"
      },
      "message": "fs: namei fix -\u003eput_link on wrong inode in do_filp_open\n\nJ. R. Okajima noticed that -\u003eput_link is being attempted on the\nwrong inode, and suggested the way to fix it. I changed it a bit\naccording to Al\u0027s suggestion to keep an explicit link path around.\n\nSigned-off-by: Nick Piggin \u003cnpiggin@kernel.dk\u003e\n"
    },
    {
      "commit": "db9effe99adc67c53e6aedadadd2aa9a02342e48",
      "tree": "efe7ebfe951972568189ef2548130f0abd515210",
      "parents": [
        "9c4bc1c2befbbdce4b9fd526e67a7a2ea143ffa2",
        "f20877d94a74557b7c28b4ed8920d834c31e0ea5"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 13 20:14:13 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 13 20:14:13 2011 -0800"
      },
      "message": "Merge branch \u0027vfs-scale-working\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin\n\n* \u0027vfs-scale-working\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin:\n  fs: fix do_last error case when need_reval_dot\n  nfs: add missing rcu-walk check\n  fs: hlist UP debug fixup\n  fs: fix dropping of rcu-walk from force_reval_path\n  fs: force_reval_path drop rcu-walk before d_invalidate\n  fs: small rcu-walk documentation fixes\n\nFixed up trivial conflicts in Documentation/filesystems/porting\n"
    },
    {
      "commit": "f20877d94a74557b7c28b4ed8920d834c31e0ea5",
      "tree": "88ea4019a1a8a0a3b8c2f24479ec44b353928f3f",
      "parents": [
        "657e94b673a805b427903c5628e95348235fad06"
      ],
      "author": {
        "name": "J. R. Okajima",
        "email": "hooanon05@yahoo.co.jp",
        "time": "Fri Jan 14 03:56:04 2011 +0000"
      },
      "committer": {
        "name": "Nick Piggin",
        "email": "npiggin@kernel.dk",
        "time": "Fri Jan 14 03:56:04 2011 +0000"
      },
      "message": "fs: fix do_last error case when need_reval_dot\n\nWhen open(2) without O_DIRECTORY opens an existing dir, it should return\nEISDIR. In do_last(), the variable \u0027error\u0027 is initialized EISDIR, but it\nis changed by d_revalidate() which returns any positive to represent\n\u0027the target dir is valid.\u0027\n\nShould we keep and return the initialized \u0027error\u0027 in this case.\n\nSigned-off-by: Nick Piggin \u003cnpiggin@kernel.dk\u003e\n"
    },
    {
      "commit": "90dbb77ba48dddb87445d238e84cd137cf97dd98",
      "tree": "446772602e5944075a6c614db05dd06681f3f3d8",
      "parents": [
        "bb20c18db6fbb5e6ba499c76473a487d35073467"
      ],
      "author": {
        "name": "Nick Piggin",
        "email": "npiggin@kernel.dk",
        "time": "Fri Jan 14 02:36:19 2011 +0000"
      },
      "committer": {
        "name": "Nick Piggin",
        "email": "npiggin@hera.kernel.org",
        "time": "Fri Jan 14 02:36:19 2011 +0000"
      },
      "message": "fs: fix dropping of rcu-walk from force_reval_path\n\nAs J. R. Okajima noted, force_reval_path passes in the same dentry to\nd_revalidate as the one in the nameidata structure (other callers pass in a\nchild), so the locking breaks. This can oops with a chrooted nfs mount, for\nexample. Similarly there can be other problems with revalidating a dentry\nwhich is already in nameidata of the path walk.\n\nSigned-off-by: Nick Piggin \u003cnpiggin@kernel.dk\u003e\n"
    }
  ],
  "next": "bb20c18db6fbb5e6ba499c76473a487d35073467"
}
