diff options
-rw-r--r-- | driver/device-mapper/device-mapper.h | 3 | ||||
-rw-r--r-- | driver/device-mapper/dm.c | 2 | ||||
-rw-r--r-- | driver/device-mapper/dmfs-active.c | 102 | ||||
-rw-r--r-- | driver/device-mapper/dmfs-error.c | 39 | ||||
-rw-r--r-- | driver/device-mapper/dmfs-lv.c | 291 | ||||
-rw-r--r-- | driver/device-mapper/dmfs-status.c | 36 | ||||
-rw-r--r-- | driver/device-mapper/dmfs-super.c | 26 | ||||
-rw-r--r-- | driver/device-mapper/dmfs-table.c | 20 | ||||
-rw-r--r-- | driver/device-mapper/dmfs-tdir.c | 138 | ||||
-rw-r--r-- | driver/device-mapper/dmfs.h | 1 | ||||
-rw-r--r-- | driver/device-mapper/projects.txt | 3 |
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. |