mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-11 09:18:25 +03:00
o Changed dm_create() to return a struct mapped_device rather than an int
o Changed dm_remove() to accept a struct mapped_device argument rather than a name o We no longer have to look up devices by name, the dcache handles that nicely for us o Fixed a bug where we were freeing a structure before we'd finished with it. o The name field in struct mapped_device is now only used in a very few places in dm.c and will be replaced in future with a back reference to the dentry rather than keeping the name in two places.
This commit is contained in:
parent
66bac98fc2
commit
edce87f3fb
@ -190,7 +190,7 @@ void dmfs_put_inode(struct inode *inode)
|
|||||||
|
|
||||||
if (inode->i_mode & S_IFDIR) {
|
if (inode->i_mode & S_IFDIR) {
|
||||||
if (md)
|
if (md)
|
||||||
dm_remove(md->name);
|
dm_remove(md);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (table)
|
if (table)
|
||||||
@ -328,21 +328,23 @@ static int dmfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
|
|||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
const char *name = (const char *) dentry->d_name.name;
|
const char *name = (const char *) dentry->d_name.name;
|
||||||
|
struct mapped_device *md;
|
||||||
|
|
||||||
if (!is_identifier(name, dentry->d_name.len))
|
if (!is_identifier(name, dentry->d_name.len))
|
||||||
return -EPERM; /* or EINVAL ? */
|
return -EPERM; /* or EINVAL ? */
|
||||||
|
|
||||||
r = dm_create(name, -1);
|
md = dm_create(name, -1);
|
||||||
if (r)
|
if (IS_ERR(md))
|
||||||
return r;
|
return PTR_ERR(md);
|
||||||
|
|
||||||
r = dmfs_mknod(dir, dentry, mode | S_IFDIR);
|
r = dmfs_mknod(dir, dentry, mode | S_IFDIR);
|
||||||
if (r) {
|
if (r) {
|
||||||
dm_remove(name);
|
dm_remove(md);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
dentry->d_inode->u.generic_ip = dm_find_by_name(name);
|
dentry->d_inode->u.generic_ip = md;
|
||||||
|
md->inode = dentry->d_inode;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -350,12 +352,7 @@ static int dmfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
|
|||||||
static int dmfs_rmdir(struct inode *dir, struct dentry *dentry)
|
static int dmfs_rmdir(struct inode *dir, struct dentry *dentry)
|
||||||
{
|
{
|
||||||
int r = dmfs_unlink(dir, dentry);
|
int r = dmfs_unlink(dir, dentry);
|
||||||
if (r)
|
return r;
|
||||||
return r;
|
|
||||||
|
|
||||||
dm_remove(dentry->d_name.name);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dmfs_create(struct inode *dir, struct dentry *dentry, int mode)
|
static int dmfs_create(struct inode *dir, struct dentry *dentry, int mode)
|
||||||
|
@ -185,6 +185,7 @@ struct dm_table {
|
|||||||
struct mapped_device {
|
struct mapped_device {
|
||||||
kdev_t dev;
|
kdev_t dev;
|
||||||
char name[DM_NAME_LEN];
|
char name[DM_NAME_LEN];
|
||||||
|
struct inode *inode;
|
||||||
|
|
||||||
int use_count;
|
int use_count;
|
||||||
int state;
|
int state;
|
||||||
@ -214,8 +215,8 @@ int dm_target_init(void);
|
|||||||
struct mapped_device *dm_find_by_name(const char *name);
|
struct mapped_device *dm_find_by_name(const char *name);
|
||||||
struct mapped_device *dm_find_by_minor(int minor);
|
struct mapped_device *dm_find_by_minor(int minor);
|
||||||
|
|
||||||
int dm_create(const char *name, int minor);
|
struct mapped_device *dm_create(const char *name, int minor);
|
||||||
int dm_remove(const char *name);
|
int dm_remove(struct mapped_device *md);
|
||||||
|
|
||||||
int dm_activate(struct mapped_device *md, struct dm_table *t);
|
int dm_activate(struct mapped_device *md, struct dm_table *t);
|
||||||
int dm_deactivate(struct mapped_device *md);
|
int dm_deactivate(struct mapped_device *md);
|
||||||
|
Loading…
Reference in New Issue
Block a user