/* No locking done here, as this is called before .get_sb() returns. */ int logfs_replay_journal(struct super_block *sb) { struct logfs_super *super = logfs_super(sb); struct inode *inode; u64 ino, pos; int err; if (super->s_victim_ino) { /* delete victim inode */ ino = super->s_victim_ino; printk(KERN_INFO"LogFS: delete unmapped inode #%llx\n", ino); inode = logfs_iget(sb, ino); if (IS_ERR(inode)) goto fail; LOGFS_BUG_ON(i_size_read(inode) > 0, sb); super->s_victim_ino = 0; err = logfs_remove_inode(inode); iput(inode); if (err) { super->s_victim_ino = ino; goto fail; } } if (super->s_rename_dir) { /* delete old dd from rename */ ino = super->s_rename_dir; pos = super->s_rename_pos; printk(KERN_INFO"LogFS: delete unbacked dentry (%llx, %llx)\n", ino, pos); inode = logfs_iget(sb, ino); if (IS_ERR(inode)) goto fail; super->s_rename_dir = 0; super->s_rename_pos = 0; err = logfs_delete_dd(inode, pos); iput(inode); if (err) { super->s_rename_dir = ino; super->s_rename_pos = pos; goto fail; } } return 0; fail: LOGFS_BUG(sb); return -EIO; }
static struct dentry *logfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) { struct page *page; struct logfs_disk_dentry *dd; pgoff_t index; u64 ino = 0; struct inode *inode; page = logfs_get_dd_page(dir, dentry); if (IS_ERR(page)) return ERR_CAST(page); if (!page) { d_add(dentry, NULL); return NULL; } index = page->index; dd = kmap_atomic(page, KM_USER0); ino = be64_to_cpu(dd->ino); kunmap_atomic(dd, KM_USER0); page_cache_release(page); inode = logfs_iget(dir->i_sb, ino); if (IS_ERR(inode)) { printk(KERN_ERR"LogFS: Cannot read inode #%llx for dentry (%lx, %lx)n", ino, dir->i_ino, index); return ERR_CAST(inode); } return d_splice_alias(inode, dentry); }
static int logfs_get_sb_final(struct super_block *sb) { struct logfs_super *super = logfs_super(sb); struct inode *rootdir; int err; /* root dir */ rootdir = logfs_iget(sb, LOGFS_INO_ROOT); if (IS_ERR(rootdir)) //goto fail; return -EIO; sb->s_root = d_make_root(rootdir); if (!sb->s_root) //goto fail; return -EIO; // at that point we know that ->put_super() will be called super->s_erase_page = alloc_pages(GFP_KERNEL, 0); if (!super->s_erase_page) return -ENOMEM; memset(page_address(super->s_erase_page), 0xFF, PAGE_SIZE); /* // FIXME: check for read-only mounts err = logfs_make_writeable(sb); if (err) { __free_page(super->s_erase_page); return err; } */ log_super("LogFS: Finished mounting\n"); return 0; /* fail: iput(super->s_master_inode); iput(super->s_segfile_inode); iput(super->s_mapping_inode); return -EIO; */ }