@@ -768,22 +768,18 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *dentry,
768768 struct v9fs_inode __maybe_unused * v9inode ;
769769 struct v9fs_session_info * v9ses ;
770770 struct p9_fid * fid ;
771- struct dentry * res = NULL ;
772771 struct inode * inode ;
773772 int p9_omode ;
774773
775774 if (d_in_lookup (dentry )) {
776- res = v9fs_vfs_lookup (dir , dentry , 0 );
777- if (IS_ERR (res ))
778- return PTR_ERR (res );
779-
780- if (res )
781- dentry = res ;
775+ struct dentry * res = v9fs_vfs_lookup (dir , dentry , 0 );
776+ if (res || d_really_is_positive (dentry ))
777+ return finish_no_open (file , res );
782778 }
783779
784780 /* Only creates */
785- if (!(flags & O_CREAT ) || d_really_is_positive ( dentry ) )
786- return finish_no_open (file , res );
781+ if (!(flags & O_CREAT ))
782+ return finish_no_open (file , NULL );
787783
788784 v9ses = v9fs_inode2v9ses (dir );
789785 perm = unixmode2p9mode (v9ses , mode );
@@ -795,17 +791,17 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *dentry,
795791 "write-only file with writeback enabled, creating w/ O_RDWR\n" );
796792 }
797793 fid = v9fs_create (v9ses , dir , dentry , NULL , perm , p9_omode );
798- if (IS_ERR (fid )) {
799- err = PTR_ERR (fid );
800- goto error ;
801- }
794+ if (IS_ERR (fid ))
795+ return PTR_ERR (fid );
802796
803797 v9fs_invalidate_inode_attr (dir );
804798 inode = d_inode (dentry );
805799 v9inode = V9FS_I (inode );
806800 err = finish_open (file , dentry , generic_file_open );
807- if (err )
808- goto error ;
801+ if (unlikely (err )) {
802+ p9_fid_put (fid );
803+ return err ;
804+ }
809805
810806 file -> private_data = fid ;
811807#ifdef CONFIG_9P_FSCACHE
@@ -818,13 +814,7 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *dentry,
818814 v9fs_open_fid_add (inode , & fid );
819815
820816 file -> f_mode |= FMODE_CREATED ;
821- out :
822- dput (res );
823- return err ;
824-
825- error :
826- p9_fid_put (fid );
827- goto out ;
817+ return 0 ;
828818}
829819
830820/**
0 commit comments