fs/9p: Fix atomic_open
Return EEXISTS if requested file already exists, without this patch open
call will always succeed even if the file exists and user specified
O_CREAT|O_EXCL.
Following test code can be used to verify this patch. Without this patch
executing following test code on 9p mount will result in printing 'test case
failed' always.
main()
{
        int fd;
        /* first create the file */
        fd = open("./file", O_CREAT|O_WRONLY);
        if (fd < 0) {
                perror("open");
                return -1;
        }
        close(fd);
        /* Now opening same file with O_CREAT|O_EXCL should fail */
        fd = open("./file", O_CREAT|O_EXCL);
        if (fd < 0 && errno == EEXIST)
	        printf("test case pass\n");
        else
	        printf("test case failed\n");
        close(fd);
        return 0;
}
Signed-off-by: M. Mohan Kumar <mohan@in.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									03f0e02273
								
							
						
					
					
						commit
						b6f4bee02f
					
				| @ -267,8 +267,14 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct dentry *dentry, | ||||
| 	} | ||||
| 
 | ||||
| 	/* Only creates */ | ||||
| 	if (!(flags & O_CREAT) || dentry->d_inode) | ||||
| 		return finish_no_open(file, res); | ||||
| 	if (!(flags & O_CREAT)) | ||||
| 		return	finish_no_open(file, res); | ||||
| 	else if (dentry->d_inode) { | ||||
| 		if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) | ||||
| 			return -EEXIST; | ||||
| 		else | ||||
| 			return finish_no_open(file, res); | ||||
| 	} | ||||
| 
 | ||||
| 	v9ses = v9fs_inode2v9ses(dir); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user