Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f60dc3db authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Al Viro
Browse files

vfs: do_last(): clean up retry



Move the lookup retry logic to the bottom of the function to make the normal
case simpler to read.

Reported-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 77d660a8
Loading
Loading
Loading
Loading
+21 −15
Original line number Original line Diff line number Diff line
@@ -2614,22 +2614,11 @@ static struct file *do_last(struct nameidata *nd, struct path *path,
		goto exit;
		goto exit;
	od->mnt = nd->path.mnt;
	od->mnt = nd->path.mnt;
	filp = finish_open(od, nd->path.dentry, NULL);
	filp = finish_open(od, nd->path.dentry, NULL);
	if (filp == ERR_PTR(-EOPENSTALE) && save_parent.dentry && !retried) {
	if (IS_ERR(filp)) {
		BUG_ON(save_parent.dentry != dir);
		if (filp == ERR_PTR(-EOPENSTALE))
		path_put(&nd->path);
			goto stale_open;
		nd->path = save_parent;
		nd->inode = dir->d_inode;
		save_parent.mnt = NULL;
		save_parent.dentry = NULL;
		if (want_write) {
			mnt_drop_write(nd->path.mnt);
			want_write = false;
		}
		retried = true;
		goto retry_lookup;
	}
	if (IS_ERR(filp))
		goto out;
		goto out;
	}
	error = open_check_o_direct(filp);
	error = open_check_o_direct(filp);
	if (error)
	if (error)
		goto exit_fput;
		goto exit_fput;
@@ -2659,6 +2648,23 @@ static struct file *do_last(struct nameidata *nd, struct path *path,
	fput(filp);
	fput(filp);
	goto exit;
	goto exit;


stale_open:
	/* If no saved parent or already retried then can't retry */
	if (!save_parent.dentry || retried)
		goto out;

	BUG_ON(save_parent.dentry != dir);
	path_put(&nd->path);
	nd->path = save_parent;
	nd->inode = dir->d_inode;
	save_parent.mnt = NULL;
	save_parent.dentry = NULL;
	if (want_write) {
		mnt_drop_write(nd->path.mnt);
		want_write = false;
	}
	retried = true;
	goto retry_lookup;
}
}


static struct file *path_openat(int dfd, const char *pathname,
static struct file *path_openat(int dfd, const char *pathname,