diff -urNp linux-3.8.4/fs/dcache.c linux-3.8.4-new/fs/dcache.c
--- linux-3.8.4/fs/dcache.c	2013-03-25 07:39:45.000000000 -0400
+++ linux-3.8.4-new/fs/dcache.c	2013-03-25 07:40:15.000000000 -0400
@@ -2552,7 +2552,6 @@ static int prepend_path(const struct pat
 	bool slash = false;
 	int error = 0;
 
-	br_read_lock(&vfsmount_lock);
 	while (dentry != root->dentry || vfsmnt != root->mnt) {
 		struct dentry * parent;
 
@@ -2582,8 +2581,6 @@ static int prepend_path(const struct pat
 	if (!error && !slash)
 		error = prepend(buffer, buflen, "/", 1);
 
-out:
-	br_read_unlock(&vfsmount_lock);
 	return error;
 
 global_root:
@@ -2600,7 +2597,7 @@ global_root:
 		error = prepend(buffer, buflen, "/", 1);
 	if (!error)
 		error = is_mounted(vfsmnt) ? 1 : 2;
-	goto out;
+	return error;
 }
 
 /**
@@ -2627,9 +2624,11 @@ char *__d_path(const struct path *path,
 	int error;
 
 	prepend(&res, &buflen, "\0", 1);
+	br_read_lock(&vfsmount_lock);
 	write_seqlock(&rename_lock);
 	error = prepend_path(path, root, &res, &buflen);
 	write_sequnlock(&rename_lock);
+	br_read_unlock(&vfsmount_lock);
 
 	if (error < 0)
 		return ERR_PTR(error);
@@ -2646,9 +2645,11 @@ char *d_absolute_path(const struct path 
 	int error;
 
 	prepend(&res, &buflen, "\0", 1);
+	br_read_lock(&vfsmount_lock);
 	write_seqlock(&rename_lock);
 	error = prepend_path(path, &root, &res, &buflen);
 	write_sequnlock(&rename_lock);
+	br_read_unlock(&vfsmount_lock);
 
 	if (error > 1)
 		error = -EINVAL;
@@ -2712,11 +2713,13 @@ char *d_path(const struct path *path, ch
 		return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
 
 	get_fs_root(current->fs, &root);
+	br_read_lock(&vfsmount_lock);
 	write_seqlock(&rename_lock);
 	error = path_with_deleted(path, &root, &res, &buflen);
+	write_sequnlock(&rename_lock);
+	br_read_unlock(&vfsmount_lock);
 	if (error < 0)
 		res = ERR_PTR(error);
-	write_sequnlock(&rename_lock);
 	path_put(&root);
 	return res;
 }
@@ -2871,6 +2874,7 @@ SYSCALL_DEFINE2(getcwd, char __user *, b
 	get_fs_root_and_pwd(current->fs, &root, &pwd);
 
 	error = -ENOENT;
+	br_read_lock(&vfsmount_lock);
 	write_seqlock(&rename_lock);
 	if (!d_unlinked(pwd.dentry)) {
 		unsigned long len;
@@ -2880,6 +2884,7 @@ SYSCALL_DEFINE2(getcwd, char __user *, b
 		prepend(&cwd, &buflen, "\0", 1);
 		error = prepend_path(&pwd, &root, &cwd, &buflen);
 		write_sequnlock(&rename_lock);
+		br_read_unlock(&vfsmount_lock);
 
 		if (error < 0)
 			goto out;
@@ -2900,6 +2905,7 @@ SYSCALL_DEFINE2(getcwd, char __user *, b
 		}
 	} else {
 		write_sequnlock(&rename_lock);
+		br_read_unlock(&vfsmount_lock);
 	}
 
 out:
diff -urNp linux-3.8.4/grsecurity/gracl.c linux-3.8.4-new/grsecurity/gracl.c
--- linux-3.8.4/grsecurity/gracl.c	2013-03-25 07:39:45.000000000 -0400
+++ linux-3.8.4-new/grsecurity/gracl.c	2013-03-25 07:41:12.000000000 -0400
@@ -294,11 +294,11 @@ d_real_path(const struct dentry *dentry,
 	/* we can't use real_root.dentry, real_root.mnt, because they belong only to the RBAC system */
 	get_fs_root(reaper->fs, &root);
 
-	write_seqlock(&rename_lock);
 	br_read_lock(&vfsmount_lock);
+	write_seqlock(&rename_lock);
 	res = gen_full_path(&path, &root, buf, buflen);
-	br_read_unlock(&vfsmount_lock);
 	write_sequnlock(&rename_lock);
+	br_read_unlock(&vfsmount_lock);
 
 	path_put(&root);
 	return res;
@@ -308,12 +308,12 @@ static char *
 gr_to_filename_rbac(const struct dentry *dentry, const struct vfsmount *mnt)
 {
 	char *ret;
-	write_seqlock(&rename_lock);
 	br_read_lock(&vfsmount_lock);
+	write_seqlock(&rename_lock);
 	ret = __d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0],smp_processor_id()),
 			     PAGE_SIZE);
-	br_read_unlock(&vfsmount_lock);
 	write_sequnlock(&rename_lock);
+	br_read_unlock(&vfsmount_lock);
 	return ret;
 }
 
@@ -324,8 +324,8 @@ gr_to_proc_filename_rbac(const struct de
 	char *buf;
 	int buflen;
 
-	write_seqlock(&rename_lock);
 	br_read_lock(&vfsmount_lock);
+	write_seqlock(&rename_lock);
 	buf = per_cpu_ptr(gr_shared_page[0], smp_processor_id());
 	ret = __d_real_path(dentry, mnt, buf, PAGE_SIZE - 6);
 	buflen = (int)(ret - buf);
@@ -333,8 +333,8 @@ gr_to_proc_filename_rbac(const struct de
 		prepend(&ret, &buflen, "/proc", 5);
 	else
 		ret = strcpy(buf, "<path too long>");
-	br_read_unlock(&vfsmount_lock);
 	write_sequnlock(&rename_lock);
+	br_read_unlock(&vfsmount_lock);
 	return ret;
 }
 
@@ -1881,8 +1881,8 @@ __chk_obj_label(const struct dentry *l_d
 	struct acl_object_label *retval;
 	struct dentry *parent;
 
-	write_seqlock(&rename_lock);
 	br_read_lock(&vfsmount_lock);
+	write_seqlock(&rename_lock);
 
 	if (unlikely((mnt == shm_mnt && dentry->d_inode->i_nlink == 0) || mnt == pipe_mnt ||
 #ifdef CONFIG_NET
@@ -1929,8 +1929,8 @@ __chk_obj_label(const struct dentry *l_d
 	if (retval == NULL)
 		retval = full_lookup(l_dentry, l_mnt, real_root.dentry, subj, &path, checkglob);
 out:
-	br_read_unlock(&vfsmount_lock);
 	write_sequnlock(&rename_lock);
+	br_read_unlock(&vfsmount_lock);
 
 	BUG_ON(retval == NULL);
 
@@ -1970,8 +1970,8 @@ chk_subj_label(const struct dentry *l_de
 	struct acl_subject_label *retval;
 	struct dentry *parent;
 
-	write_seqlock(&rename_lock);
 	br_read_lock(&vfsmount_lock);
+	write_seqlock(&rename_lock);
 
 	for (;;) {
 		if (dentry == real_root.dentry && mnt == real_root.mnt)
@@ -2025,8 +2025,8 @@ chk_subj_label(const struct dentry *l_de
 		read_unlock(&gr_inode_lock);
 	}
 out:
-	br_read_unlock(&vfsmount_lock);
 	write_sequnlock(&rename_lock);
+	br_read_unlock(&vfsmount_lock);
 
 	BUG_ON(retval == NULL);
 
