|
@@ -98,6 +98,7 @@ void destroy_nilfs(struct the_nilfs *nilfs)
|
|
|
{
|
|
|
might_sleep();
|
|
|
if (nilfs_init(nilfs)) {
|
|
|
+ nilfs_sysfs_delete_device_group(nilfs);
|
|
|
brelse(nilfs->ns_sbh[0]);
|
|
|
brelse(nilfs->ns_sbh[1]);
|
|
|
}
|
|
@@ -641,6 +642,10 @@ int init_nilfs(struct the_nilfs *nilfs, struct super_block *sb, char *data)
|
|
|
if (err)
|
|
|
goto failed_sbh;
|
|
|
|
|
|
+ err = nilfs_sysfs_create_device_group(sb);
|
|
|
+ if (err)
|
|
|
+ goto failed_sbh;
|
|
|
+
|
|
|
set_nilfs_init(nilfs);
|
|
|
err = 0;
|
|
|
out:
|
|
@@ -741,12 +746,13 @@ nilfs_find_or_create_root(struct the_nilfs *nilfs, __u64 cno)
|
|
|
{
|
|
|
struct rb_node **p, *parent;
|
|
|
struct nilfs_root *root, *new;
|
|
|
+ int err;
|
|
|
|
|
|
root = nilfs_lookup_root(nilfs, cno);
|
|
|
if (root)
|
|
|
return root;
|
|
|
|
|
|
- new = kmalloc(sizeof(*root), GFP_KERNEL);
|
|
|
+ new = kzalloc(sizeof(*root), GFP_KERNEL);
|
|
|
if (!new)
|
|
|
return NULL;
|
|
|
|
|
@@ -783,6 +789,12 @@ nilfs_find_or_create_root(struct the_nilfs *nilfs, __u64 cno)
|
|
|
|
|
|
spin_unlock(&nilfs->ns_cptree_lock);
|
|
|
|
|
|
+ err = nilfs_sysfs_create_snapshot_group(new);
|
|
|
+ if (err) {
|
|
|
+ kfree(new);
|
|
|
+ new = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
return new;
|
|
|
}
|
|
|
|
|
@@ -791,6 +803,8 @@ void nilfs_put_root(struct nilfs_root *root)
|
|
|
if (atomic_dec_and_test(&root->count)) {
|
|
|
struct the_nilfs *nilfs = root->nilfs;
|
|
|
|
|
|
+ nilfs_sysfs_delete_snapshot_group(root);
|
|
|
+
|
|
|
spin_lock(&nilfs->ns_cptree_lock);
|
|
|
rb_erase(&root->rb_node, &nilfs->ns_cptree);
|
|
|
spin_unlock(&nilfs->ns_cptree_lock);
|