Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1402273 > unrolled thread

libfs,xenfs: replace /proc/xen/xenbus with a symlink

Started byDavid Vrabel <david.vrabel@citrix.com>
First post2016-05-17 12:30 +0200
Last post2016-05-17 12:30 +0200
Articles 3 — 1 participant

Back to article view | Back to linux.kernel


Contents

  libfs,xenfs: replace /proc/xen/xenbus with a symlink David Vrabel <david.vrabel@citrix.com> - 2016-05-17 12:30 +0200
    [PATCHv1 2/2] xenfs: replace xenbus and privcmd with symlinks David Vrabel <david.vrabel@citrix.com> - 2016-05-17 12:30 +0200
    [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks David Vrabel <david.vrabel@citrix.com> - 2016-05-17 12:30 +0200

#1402273 — libfs,xenfs: replace /proc/xen/xenbus with a symlink

FromDavid Vrabel <david.vrabel@citrix.com>
Date2016-05-17 12:30 +0200
Subjectlibfs,xenfs: replace /proc/xen/xenbus with a symlink
Message-ID<rzKqe-3kb-15@gated-at.bofh.it>
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.

David

[toc] | [next] | [standalone]


#1402274 — [PATCHv1 2/2] xenfs: replace xenbus and privcmd with symlinks

FromDavid Vrabel <david.vrabel@citrix.com>
Date2016-05-17 12:30 +0200
Subject[PATCHv1 2/2] xenfs: replace xenbus and privcmd with symlinks
Message-ID<rzKqe-3kb-21@gated-at.bofh.it>
In reply to#1402273
/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

[toc] | [prev] | [next] | [standalone]


#1402276 — [PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks

FromDavid Vrabel <david.vrabel@citrix.com>
Date2016-05-17 12:30 +0200
Subject[PATCHv1 1/2] libfs: allow simple_fill_super() to add symlinks
Message-ID<rzKqf-3kb-39@gated-at.bofh.it>
In reply to#1402273
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

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web