From: Al Viro Date: Wed, 13 Nov 2013 12:45:40 +0000 (-0500) Subject: prepend_path() needs to reinitialize dentry/vfsmount/mnt on restarts X-Git-Tag: v3.12.2~116 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9e5129ba8d3d65605683050f73f12dddbf3f8c00;p=thirdparty%2Fkernel%2Fstable.git prepend_path() needs to reinitialize dentry/vfsmount/mnt on restarts commit ede4cebce16f5643c61aedd6d88d9070a1d23a68 upstream. ... and equivalent is needed in 3.12; it's broken there as well Signed-off-by: Al Viro Reported-by: Michael Marineau Tested-by: Waiman Long Signed-off-by: Greg Kroah-Hartman --- diff --git a/fs/dcache.c b/fs/dcache.c index ae6ebb88ceff1..89f96719a29b3 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2881,9 +2881,9 @@ static int prepend_path(const struct path *path, const struct path *root, char **buffer, int *buflen) { - struct dentry *dentry = path->dentry; - struct vfsmount *vfsmnt = path->mnt; - struct mount *mnt = real_mount(vfsmnt); + struct dentry *dentry; + struct vfsmount *vfsmnt; + struct mount *mnt; int error = 0; unsigned seq = 0; char *bptr; @@ -2893,6 +2893,9 @@ static int prepend_path(const struct path *path, restart: bptr = *buffer; blen = *buflen; + dentry = path->dentry; + vfsmnt = path->mnt; + mnt = real_mount(vfsmnt); read_seqbegin_or_lock(&rename_lock, &seq); while (dentry != root->dentry || vfsmnt != root->mnt) { struct dentry * parent;