struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir,
        struct f2fs_filename *fname, struct page **res_page,
        unsigned int flags)
{
    struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
    struct f2fs_inline_dentry *inline_dentry;
    struct qstr name = FSTR_TO_QSTR(&fname->disk_name);
    struct f2fs_dir_entry *de;
    struct f2fs_dentry_ptr d;
    struct page *ipage;
    f2fs_hash_t namehash;

    ipage = get_node_page(sbi, dir->i_ino);
    if (IS_ERR(ipage))
        return NULL;

    namehash = f2fs_dentry_hash(&name);

    inline_dentry = inline_data_addr(ipage);

    make_dentry_ptr(NULL, &d, (void *)inline_dentry, 2);
    de = find_target_dentry(fname, namehash, NULL, &d, flags);
    unlock_page(ipage);
    if (de)
        *res_page = ipage;
    else
        f2fs_put_page(ipage, 0);

    /*
     * For the most part, it should be a bug when name_len is zero.
     * We stop here for figuring out where the bugs has occurred.
     */
    f2fs_bug_on(sbi, d.max < 0);
    return de;
}
Beispiel #2
0
struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir,
			struct fscrypt_name *fname, struct page **res_page)
{
	struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
	struct f2fs_inline_dentry *inline_dentry;
	struct qstr name = FSTR_TO_QSTR(&fname->disk_name);
	struct f2fs_dir_entry *de;
	struct f2fs_dentry_ptr d;
	struct page *ipage;
	f2fs_hash_t namehash;

	ipage = get_node_page(sbi, dir->i_ino);
	if (IS_ERR(ipage)) {
		*res_page = ipage;
		return NULL;
	}

	namehash = f2fs_dentry_hash(&name, fname);

	inline_dentry = inline_data_addr(ipage);

	make_dentry_ptr_inline(NULL, &d, inline_dentry);
	de = find_target_dentry(fname, namehash, NULL, &d);
	unlock_page(ipage);
	if (de)
		*res_page = ipage;
	else
		f2fs_put_page(ipage, 0);

	return de;
}