Skip to content

Commit

Permalink
xen/privcmd: create address space to allow writable mmaps
Browse files Browse the repository at this point in the history
These are necessary to allow writeable mmap of the privcmd node to
succeed without being marked read-only for writenotify purposes. Which
in turn is necessary to allow mappings of foreign guest pages

[ Impact: bugfix: allow writable mappings ]

Signed-off-by: Ian Campbell <[email protected]>
Signed-off-by: Jeremy Fitzhardinge <[email protected]>
  • Loading branch information
jsgf authored and Jeremy Fitzhardinge committed Oct 20, 2010
1 parent 1c5de19 commit 24a89b5
Showing 1 changed file with 38 additions and 4 deletions.
42 changes: 38 additions & 4 deletions drivers/xen/xenfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/magic.h>
#include <linux/mm.h>
#include <linux/backing-dev.h>

#include <xen/xen.h>

Expand All @@ -22,12 +24,30 @@
MODULE_DESCRIPTION("Xen filesystem");
MODULE_LICENSE("GPL");

static int xenfs_set_page_dirty(struct page *page)
{
if (!PageDirty(page))
SetPageDirty(page);
return 0;
}

static const struct address_space_operations xenfs_aops = {
.set_page_dirty = xenfs_set_page_dirty,
};

static struct backing_dev_info xenfs_backing_dev_info = {
.ra_pages = 0, /* No readahead */
.capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK,
};

static struct inode *xenfs_make_inode(struct super_block *sb, int mode)
{
struct inode *ret = new_inode(sb);

if (ret) {
ret->i_mode = mode;
ret->i_mapping->a_ops = &xenfs_aops;
ret->i_mapping->backing_dev_info = &xenfs_backing_dev_info;
ret->i_uid = ret->i_gid = 0;
ret->i_blocks = 0;
ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME;
Expand Down Expand Up @@ -119,11 +139,25 @@ static struct file_system_type xenfs_type = {

static int __init xenfs_init(void)
{
if (xen_domain())
return register_filesystem(&xenfs_type);
int err;
if (!xen_domain()) {
printk(KERN_INFO "xenfs: not registering filesystem on non-xen platform\n");
return 0;
}

printk(KERN_INFO "XENFS: not registering filesystem on non-xen platform\n");
return 0;
err = register_filesystem(&xenfs_type);
if (err) {
printk(KERN_ERR "xenfs: Unable to register filesystem!\n");
goto out;
}

err = bdi_init(&xenfs_backing_dev_info);
if (err)
unregister_filesystem(&xenfs_type);

out:

return err;
}

static void __exit xenfs_exit(void)
Expand Down

0 comments on commit 24a89b5

Please sign in to comment.