summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/device-mapper/device-mapper.h3
-rw-r--r--driver/device-mapper/dm.c2
-rw-r--r--driver/device-mapper/dmfs-active.c102
-rw-r--r--driver/device-mapper/dmfs-error.c39
-rw-r--r--driver/device-mapper/dmfs-lv.c291
-rw-r--r--driver/device-mapper/dmfs-status.c36
-rw-r--r--driver/device-mapper/dmfs-super.c26
-rw-r--r--driver/device-mapper/dmfs-table.c20
-rw-r--r--driver/device-mapper/dmfs-tdir.c138
-rw-r--r--driver/device-mapper/dmfs.h1
-rw-r--r--driver/device-mapper/projects.txt3
11 files changed, 267 insertions, 394 deletions
diff --git a/driver/device-mapper/device-mapper.h b/driver/device-mapper/device-mapper.h
index e932059fe..386572f9c 100644
--- a/driver/device-mapper/device-mapper.h
+++ b/driver/device-mapper/device-mapper.h
@@ -17,9 +17,6 @@
#include <linux/major.h>
-/* FIXME: Use value from local range for now, for co-existence with LVM 1 */
-#define DM_BLK_MAJOR 124
-
struct dm_table;
struct dm_dev;
typedef unsigned int offset_t;
diff --git a/driver/device-mapper/dm.c b/driver/device-mapper/dm.c
index 62d3f6d75..f0eca11fe 100644
--- a/driver/device-mapper/dm.c
+++ b/driver/device-mapper/dm.c
@@ -609,7 +609,7 @@ static struct mapped_device *alloc_dev(int minor)
return 0;
}
- md->dev = MKDEV(DM_BLK_MAJOR, minor);
+ md->dev = MKDEV(major, minor);
md->name[0] = '\0';
md->state = 0;
diff --git a/driver/device-mapper/dmfs-active.c b/driver/device-mapper/dmfs-active.c
new file mode 100644
index 000000000..f70e4b1d5
--- /dev/null
+++ b/driver/device-mapper/dmfs-active.c
@@ -0,0 +1,102 @@
+/*
+ * dmfs-active.c
+ *
+ * Copyright (C) 2001 Sistina Software
+ *
+ * This software is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2, or (at
+ * your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU CC; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <linux/config.h>
+#include <linux/fs.h>
+#include <linux/seq_file.h>
+
+#include "dm.h"
+#include "dmfs.h"
+
+
+static void *s_start(struct seq_file *s, loff_t *pos)
+{
+ struct dmfs_i *dmi = s->context;
+ if (*pos > 0)
+ return NULL;
+ down(&dmi->sem);
+ return (void *)1;
+}
+
+static void *s_next(struct seq_file *s, void *v, loff_t *pos)
+{
+ (*pos)++;
+ return NULL;
+}
+
+static void s_stop(struct seq_file *s, void *v)
+{
+ struct dmfs_i *dmi = s->context;
+ up(&dmi->sem);
+}
+
+static int s_show(struct seq_file *s, void *v)
+{
+ struct dmfs_i *dmi = s->context;
+ char msg[3] = "0\n";
+ if (is_active(dmi->md)) {
+ msg[1] = '1';
+ }
+ seq_puts(s, msg);
+ return 0;
+}
+
+struct seq_operations dmfs_active_seq_ops = {
+ start: s_start,
+ next: s_next,
+ stop: s_stop,
+ show: s_show,
+};
+
+ssize_t dmfs_active_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
+{
+ struct inode *dir = file->f_dentry->d_parent->d_inode;
+ struct dmfs_i *dmi = DMFS_I(dir);
+ int written = 0;
+
+ if (count == 0)
+ goto out;
+ if (count != 1 && count != 2)
+ return -EINVAL;
+ if (buf[0] != '0' && buf[0] != '1')
+ return -EINVAL;
+
+ down(&dmi->sem);
+ written = count;
+ if (is_active(dmi->md)) {
+ if (buf[0] == '0')
+ dm_deactivate(dmi->md);
+ } else {
+ if (buf[0] == '1') {
+ if (dmi->md->map) {
+ dm_activate(dmi->md, dmi->md->map);
+ } else {
+ written = -EPERM;
+ }
+ }
+ }
+ up(&dmi->sem);
+
+out:
+ return written;
+}
+
+
diff --git a/driver/device-mapper/dmfs-error.c b/driver/device-mapper/dmfs-error.c
index c731d0786..bfe0e7810 100644
--- a/driver/device-mapper/dmfs-error.c
+++ b/driver/device-mapper/dmfs-error.c
@@ -112,48 +112,11 @@ static int show_error(struct seq_file *e, void *v)
return 0;
}
-static struct seq_operations error_op = {
+struct seq_operations dmfs_error_seq_ops = {
start: e_start,
next: e_next,
stop: e_stop,
show: show_error,
};
-static int dmfs_error_open(struct inode *inode, struct file *file)
-{
- int ret = seq_open(file, &error_op);
- if (ret >=0) {
- struct seq_file *seq = file->private_data;
- seq->context = DMFS_I(file->f_dentry->d_parent->d_inode);
- }
- return ret;
-}
-
-static int dmfs_error_sync(struct file *file, struct dentry *dentry, int datasync)
-{
- return 0;
-}
-
-static struct file_operations dmfs_error_file_operations = {
- open: dmfs_error_open,
- read: seq_read,
- llseek: seq_lseek,
- release: seq_release,
- fsync: dmfs_error_sync,
-};
-
-static struct inode_operations dmfs_error_inode_operations = {
-};
-
-struct inode *dmfs_create_error(struct inode *dir, int mode)
-{
- struct inode *inode = dmfs_new_inode(dir->i_sb, mode | S_IFREG);
-
- if (inode) {
- inode->i_fop = &dmfs_error_file_operations;
- inode->i_op = &dmfs_error_inode_operations;
- }
-
- return inode;
-}
diff --git a/driver/device-mapper/dmfs-lv.c b/driver/device-mapper/dmfs-lv.c
index a72782f30..bc619ae58 100644
--- a/driver/device-mapper/dmfs-lv.c
+++ b/driver/device-mapper/dmfs-lv.c
@@ -22,224 +22,166 @@
/* Heavily based upon ramfs */
#include <linux/config.h>
-#include <linux/ctype.h>
#include <linux/fs.h>
+#include <linux/seq_file.h>
#include "dm.h"
#include "dmfs.h"
-extern struct address_space_operations dmfs_address_space_operations;
-extern struct inode *dmfs_create_tdir(struct super_block *sb, int mode);
+struct dmfs_inode_info {
+ const char *name;
+ struct inode *(*create)(struct inode *, int, struct seq_operations *, int);
+ struct seq_operations *seq_ops;
+ int type;
+};
-struct dentry *dmfs_verify_name(struct inode *dir, const char *name)
-{
- struct nameidata nd;
- int err = -ENOENT;
- struct file file;
- struct dentry *dentry;
-
- memset(&file, 0, sizeof(struct file));
-
- if (!path_init(name, LOOKUP_FOLLOW, &nd))
- return ERR_PTR(-EINVAL);
-
- err = path_walk(name, &nd);
- if (err)
- goto err_out;
-
- err = -EINVAL;
- if (nd.mnt->mnt_sb != dir->i_sb)
- goto err_out;
-
- if (nd.dentry->d_parent->d_inode != dir)
- goto err_out;
-
- err = -ENODATA;
- if (DMFS_I(nd.dentry->d_inode) == NULL ||
- DMFS_I(nd.dentry->d_inode)->table == NULL)
- goto err_out;
-
- if (!list_empty(&(DMFS_I(nd.dentry->d_inode)->errors)))
- goto err_out;
-
- dentry = nd.dentry;
- file.f_dentry = nd.dentry;
- err = deny_write_access(&file);
- if (err)
- goto err_out;
-
- dget(dentry);
- path_release(&nd);
- return dentry;
-err_out:
- path_release(&nd);
- return ERR_PTR(err);
-}
+#define DMFS_SEQ(inode) ((struct seq_operations *)(inode)->u.generic_ip)
-struct inode *dmfs_create_symlink(struct inode *dir, int mode)
-{
- struct inode *inode = dmfs_new_private_inode(dir->i_sb, mode | S_IFLNK);
+extern struct inode *dmfs_create_table(struct inode *, int, struct seq_operations *, int);
+extern struct seq_operations dmfs_error_seq_ops;
+extern struct seq_operations dmfs_status_seq_ops;
+extern struct seq_operations dmfs_active_seq_ops;
+extern ssize_t dmfs_active_write(struct file *file, const char *buf, size_t size, loff_t *ppos);
- if (inode) {
- inode->i_mapping->a_ops = &dmfs_address_space_operations;
- inode->i_op = &page_symlink_inode_operations;
+static int dmfs_seq_open(struct inode *inode, struct file *file)
+{
+ int ret = seq_open(file, DMFS_SEQ(inode));
+ if (ret >= 0) {
+ struct seq_file *seq = file->private_data;
+ seq->context = DMFS_I(file->f_dentry->d_parent->d_inode);
}
-
- return inode;
+ return ret;
}
-static int dmfs_lv_unlink(struct inode *dir, struct dentry *dentry)
+static int dmfs_no_fsync(struct file *file, struct dentry *dentry, int datasync)
{
- struct inode *inode = dentry->d_inode;
- struct file file = { f_dentry: DMFS_I(inode)->dentry };
+ return 0;
+};
+
+static struct file_operations dmfs_active_file_operations = {
+ open: dmfs_seq_open,
+ read: seq_read,
+ llseek: seq_lseek,
+ release: seq_release,
+ write: dmfs_active_write,
+ fsync: dmfs_no_fsync,
+};
- if (!(inode->i_mode & S_IFLNK))
- return -EINVAL;
+static struct inode_operations dmfs_null_inode_operations = {
+};
- dm_suspend(DMFS_I(dir)->md);
- allow_write_access(&file);
- dput(DMFS_I(inode)->dentry);
- DMFS_I(inode)->dentry = NULL;
- inode->i_nlink--;
- dput(dentry);
- return 0;
-}
+static struct file_operations dmfs_seq_ro_file_operations = {
+ open: dmfs_seq_open,
+ read: seq_read,
+ llseek: seq_lseek,
+ release: seq_release,
+ fsync: dmfs_no_fsync,
+};
-static int dmfs_lv_symlink(struct inode *dir, struct dentry *dentry,
- const char *symname)
+static struct inode *dmfs_create_seq_ro(struct inode *dir, int mode, struct seq_operations *seq_ops, int dev)
{
- struct inode *inode;
- struct dentry *de;
- int rv;
- int l;
-
- if (dentry->d_name.len != 6 ||
- memcmp(dentry->d_name.name, "ACTIVE", 6) != 0)
- return -EINVAL;
-
- de = dmfs_verify_name(dir, symname);
- if (IS_ERR(de))
- return PTR_ERR(de);
-
- inode = dmfs_create_symlink(dir, S_IRWXUGO);
- if (inode == NULL) {
- rv = -ENOSPC;
- goto out_allow_write;
+ struct inode *inode = dmfs_new_inode(dir->i_sb, mode | S_IFREG);
+ if (inode) {
+ inode->i_fop = &dmfs_seq_ro_file_operations;
+ inode->i_op = &dmfs_null_inode_operations;
+ DMFS_SEQ(inode) = seq_ops;
}
+ return inode;
+}
- DMFS_I(inode)->dentry = de;
- d_instantiate(dentry, inode);
- dget(dentry);
-
- l = strlen(symname) + 1;
- rv = block_symlink(inode, symname, l);
- if (rv)
- goto out_dput;
-
- rv = dm_activate(DMFS_I(dir)->md, DMFS_I(de->d_inode)->table);
- if (rv)
- goto out_dput;
-
- return rv;
-
-out_dput:
- dput(dentry);
- DMFS_I(inode)->dentry = NULL;
-out_allow_write:
- {
- struct file file = { f_dentry: de };
- allow_write_access(&file);
- dput(de);
+static struct inode *dmfs_create_device(struct inode *dir, int mode, struct seq_operations *seq_ops, int dev)
+{
+ struct inode *inode = dmfs_new_inode(dir->i_sb, mode | S_IFBLK);
+ if (inode) {
+ init_special_inode(inode, mode | S_IFBLK, dev);
}
- return rv;
+ return inode;
}
-static int is_identifier(const char *str, int len)
+static struct inode *dmfs_create_active(struct inode *dir, int mode, struct seq_operations *seq_ops, int dev)
{
- while(len--) {
- if (!isalnum(*str) && *str != '_')
- return 0;
- str++;
+ struct inode *inode = dmfs_create_seq_ro(dir, mode, seq_ops, dev);
+ if (inode) {
+ inode->i_fop = &dmfs_active_file_operations;
}
- return 1;
+ return inode;
}
-static int dmfs_lv_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+static int dmfs_lv_unlink(struct inode *dir, struct dentry *dentry)
{
- struct inode *inode;
- int rv = -ENOSPC;
+ struct inode *inode = dentry->d_inode;
- if (dentry->d_name.len >= DM_NAME_LEN)
- return -EINVAL;
+ inode->i_mapping = &inode->i_data;
+ inode->i_nlink--;
+ return 0;
+}
- if (!is_identifier(dentry->d_name.name, dentry->d_name.len))
- return -EPERM;
+static struct dmfs_inode_info dmfs_ii[] = {
+ { ".", NULL, NULL, DT_DIR },
+ { "..", NULL, NULL, DT_DIR },
+ { "table", dmfs_create_table, NULL, DT_REG },
+ { "error", dmfs_create_seq_ro, &dmfs_error_seq_ops, DT_REG },
+ { "status", dmfs_create_seq_ro, &dmfs_status_seq_ops, DT_REG },
+ { "device", dmfs_create_device, NULL, DT_BLK },
+ { "active", dmfs_create_active, &dmfs_active_seq_ops, DT_REG },
+};
- if (dentry->d_name.len == 6 &&
- memcmp(dentry->d_name.name, "ACTIVE", 6) == 0)
- return -EINVAL;
+#define NR_DMFS_II (sizeof(dmfs_ii)/sizeof(struct dmfs_inode_info))
- if (dentry->d_name.name[0] == '.')
- return -EINVAL;
+static struct dmfs_inode_info *dmfs_find_by_name(const char *n, int len)
+{
+ int i;
- inode = dmfs_create_tdir(dir->i_sb, mode);
- if (inode) {
- d_instantiate(dentry, inode);
- dget(dentry);
- rv = 0;
+ for(i = 2; i < NR_DMFS_II; i++) {
+ if (strlen(dmfs_ii[i].name) != len)
+ continue;
+ if (memcmp(dmfs_ii[i].name, n, len) == 0)
+ return &dmfs_ii[i];
}
- return rv;
+ return NULL;
}
-/*
- * if u.generic_ip is not NULL, then it indicates an inode which
- * represents a table. If it is NULL then the inode is a virtual
- * file and should be deleted along with the directory.
- */
-static inline int positive(struct dentry *dentry)
+static struct dentry *dmfs_lv_lookup(struct inode *dir, struct dentry *dentry)
{
- return dentry->d_inode && !d_unhashed(dentry);
-}
+ struct inode *inode = NULL;
+ struct dmfs_inode_info *ii;
-static int empty(struct dentry *dentry)
-{
- struct list_head *list;
+ ii = dmfs_find_by_name(dentry->d_name.name, dentry->d_name.len);
+ if (ii) {
+ int dev = kdev_t_to_nr(DMFS_I(dir)->md->dev);
+ inode = ii->create(dir, 0600, ii->seq_ops, dev);
+ }
- spin_lock(&dcache_lock);
- list = dentry->d_subdirs.next;
+ d_add(dentry, inode);
+ return NULL;
+}
- while(list != &dentry->d_subdirs) {
- struct dentry *de = list_entry(list, struct dentry, d_child);
+static int dmfs_inum(int entry, struct dentry *dentry)
+{
+ if (entry == 0)
+ return dentry->d_inode->i_ino;
+ if (entry == 1)
+ return dentry->d_parent->d_inode->i_ino;
- if (positive(de)) {
- spin_unlock(&dcache_lock);
- return 0;
- }
- list = list->next;
- }
- spin_unlock(&dcache_lock);
- return 1;
+ return entry;
}
-static int dmfs_lv_rmdir(struct inode *dir, struct dentry *dentry)
+static int dmfs_lv_readdir(struct file *filp, void *dirent, filldir_t filldir)
{
- int ret = -ENOTEMPTY;
-
- if (empty(dentry)) {
- struct inode *inode = dentry->d_inode;
- inode->i_nlink--;
- dput(dentry);
- ret = 0;
+ struct dentry *dentry = filp->f_dentry;
+ struct dmfs_inode_info *ii;
+
+ while (filp->f_pos < NR_DMFS_II) {
+ ii = &dmfs_ii[filp->f_pos];
+ if (filldir(dirent, ii->name, strlen(ii->name), filp->f_pos,
+ dmfs_inum(filp->f_pos, dentry), ii->type) < 0)
+ break;
+ filp->f_pos++;
}
- return ret;
+ return 0;
}
-static struct dentry *dmfs_lv_lookup(struct inode *dir, struct dentry *dentry)
-{
- d_add(dentry, NULL);
- return NULL;
-}
static int dmfs_lv_sync(struct file *file, struct dentry *dentry, int datasync)
{
@@ -248,16 +190,13 @@ static int dmfs_lv_sync(struct file *file, struct dentry *dentry, int datasync)
static struct file_operations dmfs_lv_file_operations = {
read: generic_read_dir,
- readdir: dcache_readdir,
+ readdir: dmfs_lv_readdir,
fsync: dmfs_lv_sync,
};
static struct inode_operations dmfs_lv_inode_operations = {
lookup: dmfs_lv_lookup,
unlink: dmfs_lv_unlink,
- symlink: dmfs_lv_symlink,
- mkdir: dmfs_lv_mkdir,
- rmdir: dmfs_lv_rmdir,
};
struct inode *dmfs_create_lv(struct super_block *sb, int mode, struct dentry *dentry)
diff --git a/driver/device-mapper/dmfs-status.c b/driver/device-mapper/dmfs-status.c
index 6886eff97..79b73bc24 100644
--- a/driver/device-mapper/dmfs-status.c
+++ b/driver/device-mapper/dmfs-status.c
@@ -21,37 +21,35 @@
#include <linux/config.h>
#include <linux/fs.h>
+#include <linux/seq_file.h>
#include "dm.h"
#include "dmfs.h"
-static ssize_t dmfs_status_read(struct file *file, char *buf, size_t size, loff_t *pos)
+static void *s_start(struct seq_file *s, loff_t *pos)
{
- return 0;
+ return NULL;
}
-static int dmfs_status_sync(struct file *file, struct dentry *dentry, int datasync)
+static void *s_next(struct seq_file *s, void *v, loff_t *pos)
{
- return 0;
+ return NULL;
}
-static struct file_operations dmfs_status_file_operations = {
- read: dmfs_status_read,
- fsync: dmfs_status_sync,
-};
-
-static struct inode_operations dmfs_status_inode_operations = {
-};
+static void s_stop(struct seq_file *s, void *v)
+{
+}
-struct inode *dmfs_create_status(struct inode *dir, int mode)
+static int s_show(struct seq_file *s, void *v)
{
- struct inode *inode = dmfs_new_inode(dir->i_sb, mode | S_IFREG);
+ return 0;
+}
- if (inode) {
- inode->i_fop = &dmfs_status_file_operations;
- inode->i_op = &dmfs_status_inode_operations;
- }
+struct seq_operations dmfs_status_seq_ops = {
+ start: s_start,
+ next: s_next,
+ stop: s_stop,
+ show: s_show,
+};
- return inode;
-}
diff --git a/driver/device-mapper/dmfs-super.c b/driver/device-mapper/dmfs-super.c
index a0f1c02a0..5013fbd09 100644
--- a/driver/device-mapper/dmfs-super.c
+++ b/driver/device-mapper/dmfs-super.c
@@ -41,19 +41,19 @@ static int dmfs_statfs(struct super_block *sb, struct statfs *buf)
static void dmfs_delete_inode(struct inode *inode)
{
- struct dmfs_i *dmi = DMFS_I(inode);
-
- if (dmi) {
- if (dmi->md)
- dm_remove(dmi->md);
- if (dmi->table)
- dm_table_destroy(dmi->table);
- if (dmi->dentry)
- dput(dmi->dentry);
- if (!list_empty(&dmi->errors))
- dmfs_zap_errors(inode);
- kfree(dmi);
- MOD_DEC_USE_COUNT; /* Don't remove */
+ if (S_ISDIR(inode->i_mode)) {
+ struct dmfs_i *dmi = DMFS_I(inode);
+
+ if (dmi) {
+ if (dmi->md)
+ dm_remove(dmi->md);
+ if (dmi->dentry)
+ dput(dmi->dentry);
+ if (!list_empty(&dmi->errors))
+ dmfs_zap_errors(inode);
+ kfree(dmi);
+ MOD_DEC_USE_COUNT; /* Don't remove */
+ }
}
inode->u.generic_ip = NULL;
diff --git a/driver/device-mapper/dmfs-table.c b/driver/device-mapper/dmfs-table.c
index 6208a2765..0c80c55e1 100644
--- a/driver/device-mapper/dmfs-table.c
+++ b/driver/device-mapper/dmfs-table.c
@@ -206,6 +206,10 @@ static struct dm_table *dmfs_parse(struct inode *inode, struct file *filp)
}
free_page(page);
}
+ if (!list_empty(&DMFS_I(inode)->errors)) {
+ dm_table_destroy(t);
+ t = NULL;
+ }
return t;
}
@@ -223,9 +227,19 @@ static int dmfs_table_release(struct inode *inode, struct file *f)
table = dmfs_parse(dentry->d_parent->d_inode, f);
if (table) {
- if (dmi->table)
- dm_table_destroy(dmi->table);
- dmi->table = table;
+ struct mapped_device *md = dmi->md;
+ int need_activate = 0;
+
+ if (is_active(md)) {
+ dm_deactivate(md);
+ need_activate = 1;
+ }
+ if (md->map) {
+ dm_table_destroy(md->map);
+ }
+ if (need_activate) {
+ dm_activate(md, table);
+ }
}
up(&dmi->sem);
diff --git a/driver/device-mapper/dmfs-tdir.c b/driver/device-mapper/dmfs-tdir.c
deleted file mode 100644
index 5c630ff68..000000000
--- a/driver/device-mapper/dmfs-tdir.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * dmfs-tdir.c
- *
- * Copyright (C) 2001 Sistina Software
- *
- * This software is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2, or (at
- * your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU CC; see the file COPYING. If not, write to
- * the Free Software Foundation, 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/* Heavily based upon ramfs */
-
-#include <linux/config.h>
-#include <linux/fs.h>
-
-#include "dm.h"
-#include "dmfs.h"
-
-extern struct inode *dmfs_create_error(struct inode *, int);
-extern struct inode *dmfs_create_table(struct inode *, int);
-extern struct inode *dmfs_create_status(struct inode *, int);
-
-
-static int dmfs_tdir_unlink(struct inode *dir, struct dentry *dentry)
-{
- struct inode *inode = dentry->d_inode;
-
- inode->i_mapping = &inode->i_data;
- inode->i_nlink--;
- dput(dentry);
- return 0;
-}
-
-static struct dentry *dmfs_tdir_lookup(struct inode *dir, struct dentry *dentry)
-{
- struct inode *inode = NULL;
- const char *name = dentry->d_name.name;
-
- switch(dentry->d_name.len) {
- case 5:
- if (memcmp("table", name, 5) == 0) {
- inode = dmfs_create_table(dir, 0600);
- break;
- }
- if (memcmp("error", name, 5) == 0)
- inode = dmfs_create_error(dir, 0600);
- break;
- case 6:
- if (memcmp("status", name, 6) == 0)
- inode = dmfs_create_status(dir, 0600);
- break;
- }
-
- d_add(dentry, inode);
- return NULL;
-}
-
-static int dmfs_tdir_readdir(struct file *filp, void *dirent, filldir_t filldir)
-{
- int i;
- struct dentry *dentry = filp->f_dentry;
-
- i = filp->f_pos;
- switch(i) {
- case 0:
- if (filldir(dirent, ".", 1, i, dentry->d_inode->i_ino, DT_DIR) < 0)
- break;
- i++;
- filp->f_pos++;
- /* fallthrough */
- case 1:
- if (filldir(dirent, "..", 2, i, dentry->d_parent->d_inode->i_ino, DT_DIR) < 0)
- break;
- i++;
- filp->f_pos++;
- /* fallthrough */
- case 2:
- if (filldir(dirent, "table", 5, i, 2, DT_REG) < 0)
- break;
- i++;
- filp->f_pos++;
- /* fallthrough */
- case 3:
- if (filldir(dirent, "error", 5, i, 3, DT_REG) < 0)
- break;
- i++;
- filp->f_pos++;
- /* fallthrough */
- case 4:
- if (filldir(dirent, "status", 6, i, 4, DT_REG) < 0)
- break;
- i++;
- filp->f_pos++;
- }
- return 0;
-}
-
-
-static int dmfs_tdir_sync(struct file *file, struct dentry *dentry, int datasync)
-{
- return 0;
-}
-
-static struct file_operations dmfs_tdir_file_operations = {
- read: generic_read_dir,
- readdir: dmfs_tdir_readdir,
- fsync: dmfs_tdir_sync,
-};
-
-static struct inode_operations dmfs_tdir_inode_operations = {
- lookup: dmfs_tdir_lookup,
- unlink: dmfs_tdir_unlink,
-};
-
-struct inode *dmfs_create_tdir(struct super_block *sb, int mode)
-{
- struct inode *inode = dmfs_new_private_inode(sb, mode | S_IFDIR);
-
- if (inode) {
- inode->i_fop = &dmfs_tdir_file_operations;
- inode->i_op = &dmfs_tdir_inode_operations;
- }
-
- return inode;
-}
-
-
diff --git a/driver/device-mapper/dmfs.h b/driver/device-mapper/dmfs.h
index 98bcddaae..eb6338e27 100644
--- a/driver/device-mapper/dmfs.h
+++ b/driver/device-mapper/dmfs.h
@@ -3,7 +3,6 @@
struct dmfs_i {
struct semaphore sem;
- struct dm_table *table;
struct mapped_device *md;
struct dentry *dentry;
struct list_head errors;
diff --git a/driver/device-mapper/projects.txt b/driver/device-mapper/projects.txt
index e554062b4..ed6f5cd41 100644
--- a/driver/device-mapper/projects.txt
+++ b/driver/device-mapper/projects.txt
@@ -1,6 +1,5 @@
List of projects, ideas and pending bug fixes
===============================================
- o Check tables are an integer multiple of the underlying block size at
- table load time.
+ o Pending merge with ioctl interface version of the code.