]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
fs/9p: Fix atomic_open
authorM. Mohan Kumar <mohan@in.ibm.com>
Tue, 5 Feb 2013 08:55:05 +0000 (14:25 +0530)
committerEric Van Hensbergen <ericvh@gmail.com>
Sun, 10 Feb 2013 22:29:59 +0000 (16:29 -0600)
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>
fs/9p/vfs_inode_dotl.c

index edd41d918e6cf67d08b09271662db109f62e6c38..8d24ad66dfb80a4f610da10efcac7fa13db93730 100644 (file)
@@ -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);