Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 16935
b: refs/heads/master
c: 907f2c7
h: refs/heads/master
i:
  16933: 691044f
  16931: 1e9d3f0
  16927: f2b74e9
v: v3
  • Loading branch information
Tom Zanussi authored and Linus Torvalds committed Jan 9, 2006
1 parent e699b54 commit ed5ee83
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6625b861f8f0e429902b8671b3e70792cd99074e
refs/heads/master: 907f2c77d1653ce235e8e1fd6ce5c46005814e78
41 changes: 26 additions & 15 deletions trunk/fs/relayfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ static struct backing_dev_info relayfs_backing_dev_info = {
.capabilities = BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_WRITEBACK,
};

static struct inode *relayfs_get_inode(struct super_block *sb, int mode,
static struct inode *relayfs_get_inode(struct super_block *sb,
int mode,
struct file_operations *fops,
void *data)
{
struct inode *inode;
Expand All @@ -51,8 +53,8 @@ static struct inode *relayfs_get_inode(struct super_block *sb, int mode,
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
switch (mode & S_IFMT) {
case S_IFREG:
inode->i_fop = &relayfs_file_operations;
RELAYFS_I(inode)->buf = data;
inode->i_fop = fops;
RELAYFS_I(inode)->data = data;
break;
case S_IFDIR:
inode->i_op = &simple_dir_inode_operations;
Expand All @@ -73,6 +75,7 @@ static struct inode *relayfs_get_inode(struct super_block *sb, int mode,
* @name: the name of the file to create
* @parent: parent directory
* @mode: mode
* @fops: file operations to use for the file
* @data: user-associated data for this file
*
* Returns the new dentry, NULL on failure
Expand All @@ -82,6 +85,7 @@ static struct inode *relayfs_get_inode(struct super_block *sb, int mode,
static struct dentry *relayfs_create_entry(const char *name,
struct dentry *parent,
int mode,
struct file_operations *fops,
void *data)
{
struct dentry *d;
Expand Down Expand Up @@ -117,7 +121,7 @@ static struct dentry *relayfs_create_entry(const char *name,
goto release_mount;
}

inode = relayfs_get_inode(parent->d_inode->i_sb, mode, data);
inode = relayfs_get_inode(parent->d_inode->i_sb, mode, fops, data);
if (!inode) {
d = NULL;
goto release_mount;
Expand Down Expand Up @@ -145,20 +149,26 @@ static struct dentry *relayfs_create_entry(const char *name,
* @name: the name of the file to create
* @parent: parent directory
* @mode: mode, if not specied the default perms are used
* @fops: file operations to use for the file
* @data: user-associated data for this file
*
* Returns file dentry if successful, NULL otherwise.
*
* The file will be created user r on behalf of current user.
*/
struct dentry *relayfs_create_file(const char *name, struct dentry *parent,
int mode, void *data)
struct dentry *relayfs_create_file(const char *name,
struct dentry *parent,
int mode,
struct file_operations *fops,
void *data)
{
BUG_ON(!fops);

if (!mode)
mode = S_IRUSR;
mode = (mode & S_IALLUGO) | S_IFREG;

return relayfs_create_entry(name, parent, mode, data);
return relayfs_create_entry(name, parent, mode, fops, data);
}

/**
Expand All @@ -173,7 +183,7 @@ struct dentry *relayfs_create_file(const char *name, struct dentry *parent,
struct dentry *relayfs_create_dir(const char *name, struct dentry *parent)
{
int mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
return relayfs_create_entry(name, parent, mode, NULL);
return relayfs_create_entry(name, parent, mode, NULL, NULL);
}

/**
Expand Down Expand Up @@ -234,7 +244,7 @@ int relayfs_remove_dir(struct dentry *dentry)
*/
static int relayfs_open(struct inode *inode, struct file *filp)
{
struct rchan_buf *buf = RELAYFS_I(inode)->buf;
struct rchan_buf *buf = RELAYFS_I(inode)->data;
kref_get(&buf->kref);

return 0;
Expand All @@ -250,7 +260,7 @@ static int relayfs_open(struct inode *inode, struct file *filp)
static int relayfs_mmap(struct file *filp, struct vm_area_struct *vma)
{
struct inode *inode = filp->f_dentry->d_inode;
return relay_mmap_buf(RELAYFS_I(inode)->buf, vma);
return relay_mmap_buf(RELAYFS_I(inode)->data, vma);
}

/**
Expand All @@ -264,7 +274,7 @@ static unsigned int relayfs_poll(struct file *filp, poll_table *wait)
{
unsigned int mask = 0;
struct inode *inode = filp->f_dentry->d_inode;
struct rchan_buf *buf = RELAYFS_I(inode)->buf;
struct rchan_buf *buf = RELAYFS_I(inode)->data;

if (buf->finalized)
return POLLERR;
Expand All @@ -288,7 +298,7 @@ static unsigned int relayfs_poll(struct file *filp, poll_table *wait)
*/
static int relayfs_release(struct inode *inode, struct file *filp)
{
struct rchan_buf *buf = RELAYFS_I(inode)->buf;
struct rchan_buf *buf = RELAYFS_I(inode)->data;
kref_put(&buf->kref, relay_remove_buf);

return 0;
Expand Down Expand Up @@ -450,7 +460,7 @@ static ssize_t relayfs_read(struct file *filp,
loff_t *ppos)
{
struct inode *inode = filp->f_dentry->d_inode;
struct rchan_buf *buf = RELAYFS_I(inode)->buf;
struct rchan_buf *buf = RELAYFS_I(inode)->data;
size_t read_start, avail;
ssize_t ret = 0;
void *from;
Expand Down Expand Up @@ -485,7 +495,7 @@ static struct inode *relayfs_alloc_inode(struct super_block *sb)
struct relayfs_inode_info *p = kmem_cache_alloc(relayfs_inode_cachep, SLAB_KERNEL);
if (!p)
return NULL;
p->buf = NULL;
p->data = NULL;

return &p->vfs_inode;
}
Expand Down Expand Up @@ -531,7 +541,7 @@ static int relayfs_fill_super(struct super_block * sb, void * data, int silent)
sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
sb->s_magic = RELAYFS_MAGIC;
sb->s_op = &relayfs_ops;
inode = relayfs_get_inode(sb, mode, NULL);
inode = relayfs_get_inode(sb, mode, NULL, NULL);

if (!inode)
return -ENOMEM;
Expand Down Expand Up @@ -589,6 +599,7 @@ module_exit(exit_relayfs_fs)
EXPORT_SYMBOL_GPL(relayfs_file_operations);
EXPORT_SYMBOL_GPL(relayfs_create_dir);
EXPORT_SYMBOL_GPL(relayfs_remove_dir);
EXPORT_SYMBOL_GPL(relayfs_create_file);

MODULE_AUTHOR("Tom Zanussi <zanussi@us.ibm.com> and Karim Yaghmour <karim@opersys.com>");
MODULE_DESCRIPTION("Relay Filesystem");
Expand Down
3 changes: 2 additions & 1 deletion trunk/fs/relayfs/relay.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan,
return NULL;

/* Create file in fs */
dentry = relayfs_create_file(filename, parent, S_IRUSR, buf);
dentry = relayfs_create_file(filename, parent, S_IRUSR,
&relayfs_file_operations, buf);
if (!dentry) {
relay_destroy_buf(buf);
return NULL;
Expand Down
4 changes: 0 additions & 4 deletions trunk/fs/relayfs/relay.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
#ifndef _RELAY_H
#define _RELAY_H

struct dentry *relayfs_create_file(const char *name,
struct dentry *parent,
int mode,
void *data);
extern int relayfs_remove(struct dentry *dentry);
extern int relay_buf_empty(struct rchan_buf *buf);
extern void relay_destroy_channel(struct kref *kref);
Expand Down
7 changes: 6 additions & 1 deletion trunk/include/linux/relayfs_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ struct rchan
struct relayfs_inode_info
{
struct inode vfs_inode;
struct rchan_buf *buf;
void *data;
};

static inline struct relayfs_inode_info *RELAYFS_I(struct inode *inode)
Expand Down Expand Up @@ -148,6 +148,11 @@ extern size_t relay_switch_subbuf(struct rchan_buf *buf,
extern struct dentry *relayfs_create_dir(const char *name,
struct dentry *parent);
extern int relayfs_remove_dir(struct dentry *dentry);
extern struct dentry *relayfs_create_file(const char *name,
struct dentry *parent,
int mode,
struct file_operations *fops,
void *data);

/**
* relay_write - write data into the channel
Expand Down

0 comments on commit ed5ee83

Please sign in to comment.