static struct inode *__logfs_iget(struct super_block *sb, ino_t ino) { struct inode *inode = iget_locked(sb, ino); int err; if (!inode) return ERR_PTR(-ENOMEM); if (!(inode->i_state & I_NEW)) return inode; err = logfs_read_inode(inode); if (err || inode->i_nlink == 0) { /* inode->i_nlink == 0 can be true when called from * block validator */ /* set i_nlink to 0 to prevent caching */ clear_nlink(inode); logfs_inode(inode)->li_flags |= LOGFS_IF_ZOMBIE; iget_failed(inode); if (!err) err = -ENOENT; return ERR_PTR(err); } logfs_inode_setops(inode); unlock_new_inode(inode); return inode; }
static struct inode *__logfs_iget(struct super_block *sb, ino_t ino) { struct inode *inode = iget_locked(sb, ino); int err; if (!inode) return ERR_PTR(-ENOMEM); if (!(inode->i_state & I_NEW)) return inode; err = logfs_read_inode(inode); if (err || inode->i_nlink == 0) { clear_nlink(inode); logfs_inode(inode)->li_flags |= LOGFS_IF_ZOMBIE; iget_failed(inode); if (!err) err = -ENOENT; return ERR_PTR(err); } logfs_inode_setops(inode); unlock_new_inode(inode); return inode; }
struct inode *logfs_read_meta_inode(struct super_block *sb, u64 ino) { struct inode *inode; int err; inode = logfs_new_meta_inode(sb, ino); if (IS_ERR(inode)) return inode; err = logfs_read_inode(inode); if (err) { iput(inode); return ERR_PTR(err); } logfs_inode_setops(inode); return inode; }
struct inode *logfs_new_inode(struct inode *dir, umode_t mode) { struct super_block *sb = dir->i_sb; struct inode *inode; inode = new_inode(sb); if (!inode) return ERR_PTR(-ENOMEM); logfs_init_inode(sb, inode); /* inherit parent flags */ logfs_inode(inode)->li_flags |= logfs_inode(dir)->li_flags & LOGFS_FL_INHERITED; inode->i_mode = mode; logfs_set_ino_generation(sb, inode); inode_init_owner(inode, dir, mode); logfs_inode_setops(inode); insert_inode_hash(inode); return inode; }