xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks
       [not found] <1463480843-3860-1-git-send-email-david.vrabel@citrix.com>
@ 2016-05-17 10:27 ` David Vrabel
  2016-05-17 10:27 ` [PATCHv1 2/2] xenfs: replace xenbus and privcmd with symlinks David Vrabel
       [not found] ` <1463480843-3860-2-git-send-email-david.vrabel@citrix.com>
  2 siblings, 0 replies; 4+ messages in thread
From: David Vrabel @ 2016-05-17 10:27 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 f3fa82c..5b3a391 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -517,9 +517,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 70e61b5..8a09998 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2897,7 +2897,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	[flat|nested] 4+ messages in thread

* [PATCHv1 2/2] xenfs: replace xenbus and privcmd with symlinks
       [not found] <1463480843-3860-1-git-send-email-david.vrabel@citrix.com>
  2016-05-17 10:27 ` [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel
@ 2016-05-17 10:27 ` David Vrabel
       [not found] ` <1463480843-3860-2-git-send-email-david.vrabel@citrix.com>
  2 siblings, 0 replies; 4+ messages in thread
From: David Vrabel @ 2016-05-17 10:27 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	[flat|nested] 4+ messages in thread

* Re: [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks
       [not found] ` <1463480843-3860-2-git-send-email-david.vrabel@citrix.com>
@ 2016-06-10 13:13   ` David Vrabel
  0 siblings, 0 replies; 4+ messages in thread
From: David Vrabel @ 2016-06-10 13:13 UTC (permalink / raw)
  To: David Vrabel, Alexander Viro
  Cc: Juergen Gross, linux-fsdevel, Boris Ostrovsky, linux-kernel, xen-devel

On 17/05/16 11:27, 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.

Ping?

> 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 f3fa82c..5b3a391 100644
> --- a/fs/libfs.c
> +++ b/fs/libfs.c
> @@ -517,9 +517,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 70e61b5..8a09998 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -2897,7 +2897,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
http://lists.xen.org/xen-devel

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

* [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks
  2016-05-16 17:44 [PATCHv1 0/2] xen/xenfs: fix /proc/xen/xenbus David Vrabel
@ 2016-05-16 17:44 ` David Vrabel
  0 siblings, 0 replies; 4+ messages in thread
From: David Vrabel @ 2016-05-16 17:44 UTC (permalink / raw)
  To: xen-devel; +Cc: Juergen Gross, Boris Ostrovsky, David Vrabel

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>
---
 fs/libfs.c         | 23 ++++++++++++++++++++---
 include/linux/fs.h |  2 +-
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/fs/libfs.c b/fs/libfs.c
index f3fa82c..894e182 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -500,6 +500,8 @@ int simple_fill_super(struct super_block *s, unsigned long magic,
 	if (!root)
 		return -ENOMEM;
 	for (i = 0; !files->name || files->name[0]; i++, files++) {
+		char *link = NULL;
+
 		if (!files->name)
 			continue;
 
@@ -509,17 +511,32 @@ int simple_fill_super(struct super_block *s, unsigned long magic,
 				"with an index of 1!\n", __func__,
 				s->s_type->name);
 
+		if (files->mode & S_IFLNK) {
+			link = kstrdup(files->link, GFP_KERNEL);
+			if (!link)
+				goto out;
+		}
+
 		dentry = d_alloc_name(root, files->name);
-		if (!dentry)
+		if (!dentry) {
+			kfree(link);
 			goto out;
+		}
 		inode = new_inode(s);
 		if (!inode) {
 			dput(dentry);
+			kfree(link);
 			goto out;
 		}
-		inode->i_mode = S_IFREG | files->mode;
+		inode->i_mode = files->mode;
+		if (files->mode & S_IFLNK) {
+			inode->i_op = &simple_symlink_inode_operations;
+			inode->i_link = link;
+		} else {
+			inode->i_fop = files->ops;
+			inode->i_mode |= S_IFREG;
+		}
 		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 70e61b5..8a09998 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2897,7 +2897,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	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-06-10 13:13 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1463480843-3860-1-git-send-email-david.vrabel@citrix.com>
2016-05-17 10:27 ` [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel
2016-05-17 10:27 ` [PATCHv1 2/2] xenfs: replace xenbus and privcmd with symlinks David Vrabel
     [not found] ` <1463480843-3860-2-git-send-email-david.vrabel@citrix.com>
2016-06-10 13:13   ` [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel
2016-05-16 17:44 [PATCHv1 0/2] xen/xenfs: fix /proc/xen/xenbus David Vrabel
2016-05-16 17:44 ` [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel

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