]> git.neil.brown.name Git - LaFS.git/blobdiff - snapshot.c
lafs_iget takes a filesystem-inode rather than a super_block.
[LaFS.git] / snapshot.c
index 4489ed396ade63627e00ece3701629579d42f0b6..23cf5a3dd13166fe576094eaf1f06cb6b142c406 100644 (file)
@@ -161,15 +161,17 @@ lafs_snap_get_sb(struct file_system_type *fstype,
                /* already existed */
                kfree(sk);
        } else {
-               struct inode *rootdir;
+               struct inode *rootino, *rootdir;
                struct datablock *b;
                sb->s_flags = flags | MS_RDONLY;
 
                atomic_inc(&fs->prime_sb->s_active);
 
-               fs->ss[s].root = sk->k.root = iget_locked(sb, 0);
-               LAFSI(fs->ss[s].root)->filesys = fs->ss[s].root;
-               b = lafs_get_block(fs->ss[s].root, 0, NULL, GFP_KERNEL,
+               rootino = iget_locked(sb, 0);
+               rootino->i_private = sb;
+               fs->ss[s].root = sk->k.root = rootino;
+               LAFSI(rootino)->filesys = rootino;
+               b = lafs_get_block(rootino, 0, NULL, GFP_KERNEL,
                                   MKREF(snap));
                b->b.physaddr = fs->ss[s].root_addr;
                set_bit(B_PhysValid, &b->b.flags);
@@ -181,12 +183,12 @@ lafs_snap_get_sb(struct file_system_type *fstype,
                if (!err)
                        err = lafs_import_inode(fs->ss[s].root, b);
                putdref(b, MKREF(snap));
-               unlock_new_inode(fs->ss[s].root);
+               unlock_new_inode(rootino);
                if (err) {
                        deactivate_locked_super(sb);
                        goto fail;
                }
-               rootdir = lafs_iget(sb, 2, SYNC);
+               rootdir = lafs_iget(rootino, 2, SYNC);
                sb->s_root = d_alloc_root(rootdir);
                sb->s_op = fs->prime_sb->s_op;
                sb->s_flags |= MS_ACTIVE;