xenbus: fix deadlock on writes to /proc/xen/xenbus
authorDavid Vrabel <david.vrabel@citrix.com>
Fri, 9 Dec 2016 14:41:13 +0000 (14:41 +0000)
committerJuergen Gross <jgross@suse.com>
Mon, 12 Dec 2016 14:22:13 +0000 (15:22 +0100)
/proc/xen/xenbus does not work correctly.  A read blocked waiting for
a xenstore message holds the mutex needed for atomic file position
updates.  This blocks any writes on the same file handle, which can
deadlock if the write is needed to unblock the read.

Clear FMODE_ATOMIC_POS when opening this device to always get
character device like sematics.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
drivers/xen/xenbus/xenbus_dev_frontend.c

index 1e8be12ebb559880fa5d10f05a2782ad46c36be3..6c0ead4be784340019e69942a8d704ab088ea202 100644 (file)
@@ -538,6 +538,8 @@ static int xenbus_file_open(struct inode *inode, struct file *filp)
 
        nonseekable_open(inode, filp);
 
+       filp->f_mode &= ~FMODE_ATOMIC_POS; /* cdev-style semantics */
+
        u = kzalloc(sizeof(*u), GFP_KERNEL);
        if (u == NULL)
                return -ENOMEM;