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

Commit 384f26e2 authored by Al Viro's avatar Al Viro
Browse files

atomic_open(): reorder and clean up a bit



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 1643b43f
Loading
Loading
Loading
Loading
+27 −34
Original line number Original line Diff line number Diff line
@@ -2827,14 +2827,11 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
			int open_flag, umode_t mode,
			int open_flag, umode_t mode,
			int *opened)
			int *opened)
{
{
	struct dentry *const DENTRY_NOT_SET = (void *) -1UL;
	struct inode *dir =  nd->path.dentry->d_inode;
	struct inode *dir =  nd->path.dentry->d_inode;
	int error;
	int error;
	int acc_mode;
	struct dentry *const DENTRY_NOT_SET = (void *) -1UL;
	bool excl;


	excl = (open_flag & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT);
	if (!(~open_flag & (O_EXCL | O_CREAT)))	/* both O_EXCL and O_CREAT */
	if (excl)
		open_flag &= ~O_TRUNC;
		open_flag &= ~O_TRUNC;


	if (nd->flags & LOOKUP_DIRECTORY)
	if (nd->flags & LOOKUP_DIRECTORY)
@@ -2845,14 +2842,24 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
	error = dir->i_op->atomic_open(dir, dentry, file,
	error = dir->i_op->atomic_open(dir, dentry, file,
				       open_to_namei_flags(open_flag),
				       open_to_namei_flags(open_flag),
				       mode, opened);
				       mode, opened);
	if (error < 0)
	if (!error) {
		goto out;
		/*

		 * We didn't have the inode before the open, so check open
	if (error) {	/* returned 1, that is */
		 * permission here.
		 */
		int acc_mode = op->acc_mode;
		if (*opened & FILE_CREATED) {
			WARN_ON(!(open_flag & O_CREAT));
			fsnotify_create(dir, dentry);
			acc_mode = 0;
		}
		error = may_open(&file->f_path, acc_mode, open_flag);
		if (WARN_ON(error > 0))
			error = -EINVAL;
	} else if (error > 0) {
		if (WARN_ON(file->f_path.dentry == DENTRY_NOT_SET)) {
		if (WARN_ON(file->f_path.dentry == DENTRY_NOT_SET)) {
			error = -EIO;
			error = -EIO;
			goto out;
		} else {
		}
			if (file->f_path.dentry) {
			if (file->f_path.dentry) {
				dput(dentry);
				dput(dentry);
				dentry = file->f_path.dentry;
				dentry = file->f_path.dentry;
@@ -2863,21 +2870,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
			path->mnt = nd->path.mnt;
			path->mnt = nd->path.mnt;
			return 1;
			return 1;
		}
		}

	/*
	 * We didn't have the inode before the open, so check open permission
	 * here.
	 */
	acc_mode = op->acc_mode;
	if (*opened & FILE_CREATED) {
		WARN_ON(!(open_flag & O_CREAT));
		fsnotify_create(dir, dentry);
		acc_mode = 0;
	}
	}
	error = may_open(&file->f_path, acc_mode, open_flag);
	if (WARN_ON(error > 0))
		error = -EINVAL;
out:
	dput(dentry);
	dput(dentry);
	return error;
	return error;
}
}