Skip to content

Commit

Permalink
fs/9p: Fix atomic_open
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
M. Mohan Kumar authored and Eric Van Hensbergen committed Feb 10, 2013
1 parent 03f0e02 commit b6f4bee
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions fs/9p/vfs_inode_dotl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit b6f4bee

Please sign in to comment.