int
lafs_mount(struct fs *fs)
{
- struct datablock *b;
- struct inode *root;
+ struct datablock *b = NULL;
+ struct inode *ino;
struct inode *rootdir;
struct dentry *de;
int err;
int orphan_count;
fs->rolled = 0;
- fs->ss[0].root = root = iget_locked(fs->prime_sb, 0);
- k->root = root;
+ fs->ss[0].root = ino = iget_locked(fs->prime_sb, 0);
+ k->root = ino;
err = -ENOMEM;
- b = lafs_get_block(root, 0, NULL, GFP_KERNEL, MKREF(mount));
+ if (!ino)
+ goto err;
+ b = lafs_get_block(ino, 0, NULL, GFP_KERNEL, MKREF(mount));
if (!b)
goto err;
set_bit(B_Root, &b->b.flags);
if (err)
goto err;
- err = lafs_import_inode(root, b);
+ err = lafs_import_inode(ino, b);
if (err)
goto err;
putdref(b, MKREF(mount));
b = NULL;
- unlock_new_inode(root);
- /* FIXME lots of error checking */
+ unlock_new_inode(ino);
rootdir = lafs_iget(fs->prime_sb, 2, SYNC);
err = PTR_ERR(rootdir);
goto err;
de = d_alloc_root(rootdir);
err = PTR_ERR(de);
- if (IS_ERR(de))
+ if (IS_ERR(de)) {
+ iput(rootdir);
goto err;
+ }
fs->prime_sb->s_root = de;
- fs->orphans = lafs_iget(fs->prime_sb, 8, SYNC);
+ ino = lafs_iget(fs->prime_sb, 8, SYNC);
+ err = PTR_ERR(ino);
+ if (IS_ERR(ino))
+ goto err;
+ if (LAFSI(ino)->type != TypeOrphanList) {
+ iput(ino);
+ err = -EINVAL;
+ goto err;
+ }
+ fs->orphans = ino;
for (d = 0; d < fs->devices ; d++) {
- fs->devs[d].segsum = lafs_iget(fs->prime_sb,
- fs->devs[d].usage_inum,
- SYNC);
- /* FIXME check this is a segusage file */
+ ino = lafs_iget(fs->prime_sb,
+ fs->devs[d].usage_inum,
+ SYNC);
+ err = PTR_ERR(ino);
+ if (IS_ERR(ino))
+ goto err;
+ if (LAFSI(ino)->type != TypeSegmentMap) {
+ iput(ino);
+ err = -EINVAL;
+ goto err;
+ }
+ fs->devs[d].segsum = ino;
}
orphan_count = lafs_count_orphans(fs->orphans);
LAFSI(fs->orphans)->md.orphan.nextfree = orphan_count;
lafs_add_orphans(fs, fs->orphans, orphan_count);
for (d = 0; d < 4; d++) {
- fs->cleaner.seg[d].chead = alloc_page(GFP_KERNEL);
+ struct page *p = alloc_page(GFP_KERNEL);
+ if (!p)
+ err = -ENOMEM;
+ fs->cleaner.seg[d].chead = p;
INIT_LIST_HEAD(&fs->cleaner.seg[d].cleaning);
}
- return err;
-
err:
putdref(b, MKREF(mount));
return err;