xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink
@ 2016-06-28 18:06 David Vrabel
  2016-06-28 18:06 ` [PATCHv3 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: David Vrabel @ 2016-06-28 18:06 UTC (permalink / raw)
  To: Alexander Viro
  Cc: Juergen Gross, linux-kernel, David Vrabel, linux-fsdevel,
	xen-devel, Boris Ostrovsky

Using /proc/xen/xenbus can cause deadlocks on the atomic file position
mutex since this file should behave like a character device and not a
regular file.  This is easiest to achive by making it a symlink to the
existing /dev/xen/xenbus device.

This requires extending simple_fill_super() to add symlinks as well as
regular files.

Changes in v3:
- Rebased on v4.7-rc5.

David


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCHv3 1/2] libfs: allow simple_fill_super() to add symlinks
  2016-06-28 18:06 [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink David Vrabel
@ 2016-06-28 18:06 ` David Vrabel
  2016-07-11  9:38   ` David Vrabel
  2016-06-28 18:06 ` [PATCHv3 2/2] xenfs: replace xenbus and privcmd with symlinks David Vrabel
  2016-08-23  0:47 ` [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink Doug Goldstein
  2 siblings, 1 reply; 6+ messages in thread
From: David Vrabel @ 2016-06-28 18:06 UTC (permalink / raw)
  To: Alexander Viro
  Cc: Juergen Gross, linux-kernel, David Vrabel, linux-fsdevel,
	xen-devel, Boris Ostrovsky

simple_fill_super() will add symlinks if an entry has mode & S_IFLNK.
The target is provided in the new "link" field.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
v2:
- simplified.
---
 fs/libfs.c         | 15 +++++++++++++--
 include/linux/fs.h |  2 +-
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/fs/libfs.c b/fs/libfs.c
index cedeacb..bbf2d82 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -512,9 +512,20 @@ int simple_fill_super(struct super_block *s, unsigned long magic,
 			dput(dentry);
 			goto out;
 		}
-		inode->i_mode = S_IFREG | files->mode;
+		if (files->mode & S_IFLNK) {
+			inode->i_mode = files->mode;
+			inode->i_op = &simple_symlink_inode_operations;
+			inode->i_link = kstrdup(files->link, GFP_KERNEL);
+			if (!inode->i_link) {
+				iput(inode);
+				dput(dentry);
+				goto out;
+			}
+		} else {
+			inode->i_mode = S_IFREG | files->mode;
+			inode->i_fop = files->ops;
+		}
 		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
-		inode->i_fop = files->ops;
 		inode->i_ino = i;
 		d_add(dentry, inode);
 	}
diff --git a/include/linux/fs.h b/include/linux/fs.h
index dd28814..20c54a2 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2953,7 +2953,7 @@ extern const struct file_operations simple_dir_operations;
 extern const struct inode_operations simple_dir_inode_operations;
 extern void make_empty_dir_inode(struct inode *inode);
 extern bool is_empty_dir_inode(struct inode *inode);
-struct tree_descr { char *name; const struct file_operations *ops; int mode; };
+struct tree_descr { char *name; const struct file_operations *ops; int mode; char *link; };
 struct dentry *d_alloc_name(struct dentry *, const char *);
 extern int simple_fill_super(struct super_block *, unsigned long, struct tree_descr *);
 extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCHv3 2/2] xenfs: replace xenbus and privcmd with symlinks
  2016-06-28 18:06 [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink David Vrabel
  2016-06-28 18:06 ` [PATCHv3 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel
@ 2016-06-28 18:06 ` David Vrabel
  2016-06-29  4:50   ` Juergen Gross
  2016-08-23  0:47 ` [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink Doug Goldstein
  2 siblings, 1 reply; 6+ messages in thread
From: David Vrabel @ 2016-06-28 18:06 UTC (permalink / raw)
  To: Alexander Viro
  Cc: Juergen Gross, linux-kernel, David Vrabel, linux-fsdevel,
	xen-devel, Boris Ostrovsky

/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.

/proc/xen/xenbus is supposed to be identical to the character device
/dev/xen/xenbus so replace the file with a symlink.

Similarly, replace /proc/xen/privcmd with a symlink since it should be
the same as /dev/xen/privcmd.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
v2:
- remove unneeded includes
---
 drivers/xen/xenfs/super.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c
index 8559a71..0f2e2cd 100644
--- a/drivers/xen/xenfs/super.c
+++ b/drivers/xen/xenfs/super.c
@@ -18,8 +18,6 @@
 #include <xen/xen.h>
 
 #include "xenfs.h"
-#include "../privcmd.h"
-#include "../xenbus/xenbus_comms.h"
 
 #include <asm/xen/hypervisor.h>
 
@@ -45,16 +43,16 @@ static const struct file_operations capabilities_file_ops = {
 static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
 {
 	static struct tree_descr xenfs_files[] = {
-		[2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR },
+		[2] = { "xenbus", NULL, S_IFLNK | S_IRWXUGO, "/dev/xen/xenbus" },
 		{ "capabilities", &capabilities_file_ops, S_IRUGO },
-		{ "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },
+		{ "privcmd", NULL, S_IFLNK | S_IRWXUGO, "/dev/xen/privcmd" },
 		{""},
 	};
 
 	static struct tree_descr xenfs_init_files[] = {
-		[2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR },
+		[2] = { "xenbus", NULL, S_IFLNK | S_IRWXUGO, "/dev/xen/xenbus" },
 		{ "capabilities", &capabilities_file_ops, S_IRUGO },
-		{ "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },
+		{ "privcmd", NULL, S_IFLNK | S_IRWXUGO, "/dev/xen/privcmd" },
 		{ "xsd_kva", &xsd_kva_file_ops, S_IRUSR|S_IWUSR},
 		{ "xsd_port", &xsd_port_file_ops, S_IRUSR|S_IWUSR},
 #ifdef CONFIG_XEN_SYMS
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCHv3 2/2] xenfs: replace xenbus and privcmd with symlinks
  2016-06-28 18:06 ` [PATCHv3 2/2] xenfs: replace xenbus and privcmd with symlinks David Vrabel
@ 2016-06-29  4:50   ` Juergen Gross
  0 siblings, 0 replies; 6+ messages in thread
From: Juergen Gross @ 2016-06-29  4:50 UTC (permalink / raw)
  To: David Vrabel, Alexander Viro
  Cc: linux-fsdevel, xen-devel, Boris Ostrovsky, linux-kernel

On 28/06/16 20:06, David Vrabel wrote:
> /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.
> 
> /proc/xen/xenbus is supposed to be identical to the character device
> /dev/xen/xenbus so replace the file with a symlink.
> 
> Similarly, replace /proc/xen/privcmd with a symlink since it should be
> the same as /dev/xen/privcmd.
> 
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> ---
> v2:
> - remove unneeded includes
> ---

I think you should make xen_xenbus_fops and xen_privcmd_fops static
now that they are no longer referenced by super.c


Juergen

>  drivers/xen/xenfs/super.c | 10 ++++------
>  1 file changed, 4 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c
> index 8559a71..0f2e2cd 100644
> --- a/drivers/xen/xenfs/super.c
> +++ b/drivers/xen/xenfs/super.c
> @@ -18,8 +18,6 @@
>  #include <xen/xen.h>
>  
>  #include "xenfs.h"
> -#include "../privcmd.h"
> -#include "../xenbus/xenbus_comms.h"
>  
>  #include <asm/xen/hypervisor.h>
>  
> @@ -45,16 +43,16 @@ static const struct file_operations capabilities_file_ops = {
>  static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
>  {
>  	static struct tree_descr xenfs_files[] = {
> -		[2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR },
> +		[2] = { "xenbus", NULL, S_IFLNK | S_IRWXUGO, "/dev/xen/xenbus" },
>  		{ "capabilities", &capabilities_file_ops, S_IRUGO },
> -		{ "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },
> +		{ "privcmd", NULL, S_IFLNK | S_IRWXUGO, "/dev/xen/privcmd" },
>  		{""},
>  	};
>  
>  	static struct tree_descr xenfs_init_files[] = {
> -		[2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR },
> +		[2] = { "xenbus", NULL, S_IFLNK | S_IRWXUGO, "/dev/xen/xenbus" },
>  		{ "capabilities", &capabilities_file_ops, S_IRUGO },
> -		{ "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },
> +		{ "privcmd", NULL, S_IFLNK | S_IRWXUGO, "/dev/xen/privcmd" },
>  		{ "xsd_kva", &xsd_kva_file_ops, S_IRUSR|S_IWUSR},
>  		{ "xsd_port", &xsd_port_file_ops, S_IRUSR|S_IWUSR},
>  #ifdef CONFIG_XEN_SYMS
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCHv3 1/2] libfs: allow simple_fill_super() to add symlinks
  2016-06-28 18:06 ` [PATCHv3 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel
@ 2016-07-11  9:38   ` David Vrabel
  0 siblings, 0 replies; 6+ messages in thread
From: David Vrabel @ 2016-07-11  9:38 UTC (permalink / raw)
  To: David Vrabel, Alexander Viro
  Cc: Juergen Gross, linux-fsdevel, Boris Ostrovsky, linux-kernel, xen-devel

On 28/06/16 19:06, David Vrabel wrote:
> simple_fill_super() will add symlinks if an entry has mode & S_IFLNK.
> The target is provided in the new "link" field.

Can I get an ack for this, please? So it can go into 4.8 via the Xen tree.

David

> 
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> ---
> v2:
> - simplified.
> ---
>  fs/libfs.c         | 15 +++++++++++++--
>  include/linux/fs.h |  2 +-
>  2 files changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/libfs.c b/fs/libfs.c
> index cedeacb..bbf2d82 100644
> --- a/fs/libfs.c
> +++ b/fs/libfs.c
> @@ -512,9 +512,20 @@ int simple_fill_super(struct super_block *s, unsigned long magic,
>  			dput(dentry);
>  			goto out;
>  		}
> -		inode->i_mode = S_IFREG | files->mode;
> +		if (files->mode & S_IFLNK) {
> +			inode->i_mode = files->mode;
> +			inode->i_op = &simple_symlink_inode_operations;
> +			inode->i_link = kstrdup(files->link, GFP_KERNEL);
> +			if (!inode->i_link) {
> +				iput(inode);
> +				dput(dentry);
> +				goto out;
> +			}
> +		} else {
> +			inode->i_mode = S_IFREG | files->mode;
> +			inode->i_fop = files->ops;
> +		}
>  		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
> -		inode->i_fop = files->ops;
>  		inode->i_ino = i;
>  		d_add(dentry, inode);
>  	}
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index dd28814..20c54a2 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -2953,7 +2953,7 @@ extern const struct file_operations simple_dir_operations;
>  extern const struct inode_operations simple_dir_inode_operations;
>  extern void make_empty_dir_inode(struct inode *inode);
>  extern bool is_empty_dir_inode(struct inode *inode);
> -struct tree_descr { char *name; const struct file_operations *ops; int mode; };
> +struct tree_descr { char *name; const struct file_operations *ops; int mode; char *link; };
>  struct dentry *d_alloc_name(struct dentry *, const char *);
>  extern int simple_fill_super(struct super_block *, unsigned long, struct tree_descr *);
>  extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink
  2016-06-28 18:06 [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink David Vrabel
  2016-06-28 18:06 ` [PATCHv3 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel
  2016-06-28 18:06 ` [PATCHv3 2/2] xenfs: replace xenbus and privcmd with symlinks David Vrabel
@ 2016-08-23  0:47 ` Doug Goldstein
  2 siblings, 0 replies; 6+ messages in thread
From: Doug Goldstein @ 2016-08-23  0:47 UTC (permalink / raw)
  To: David Vrabel, Alexander Viro
  Cc: Juergen Gross, linux-fsdevel, Boris Ostrovsky, linux-kernel, xen-devel


[-- Attachment #1.1.1: Type: text/plain, Size: 705 bytes --]

On 6/28/16 2:06 PM, David Vrabel wrote:
> Using /proc/xen/xenbus can cause deadlocks on the atomic file position
> mutex since this file should behave like a character device and not a
> regular file.  This is easiest to achive by making it a symlink to the
> existing /dev/xen/xenbus device.
> 
> This requires extending simple_fill_super() to add symlinks as well as
> regular files.
> 
> Changes in v3:
> - Rebased on v4.7-rc5.
> 
> David

Just a bit of a nudge to see where the status of this is at? We're at
the point of potentially having yet another kernel release go out the
door where the default behavior with Xen 4.6 and earlier is to deadlock
domUs.

-- 
Doug Goldstein


[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 959 bytes --]

[-- Attachment #2: Type: text/plain, Size: 127 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-08-23  0:48 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-28 18:06 [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink David Vrabel
2016-06-28 18:06 ` [PATCHv3 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel
2016-07-11  9:38   ` David Vrabel
2016-06-28 18:06 ` [PATCHv3 2/2] xenfs: replace xenbus and privcmd with symlinks David Vrabel
2016-06-29  4:50   ` Juergen Gross
2016-08-23  0:47 ` [PATCHv3 0/2] libfs, xenfs: replace /proc/xen/xenbus with a symlink Doug Goldstein

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).