ffs,linux3.11,내부 컴파일링 시간 오류,error:unknown field'readdir'specified in initializer

3749 단어 kernel
linux 3.11의 커널을 컴파일해야 하지만, 최신 야프스2를 다운로드한 후 오류를 컴파일합니다. error: unknown field'readdir'specified in initializer
원본을 보니 linux3.11의 원본에 있는 file_operations 구조체에는readdir가 없습니다. 대신iterate가 있습니다. 그러나yaffs(fs/yaffs2/yaffs_vfs.c)에서는readdir를 사용합니다. 따라서 이 파일을 고쳐 쓰십시오.
변경 사항은 다음과 같습니다.
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) 
static int yaffs_iterate(struct file *file, struct dir_context *ctx) 
{ 
    struct yaffs_obj *obj; 
    struct yaffs_dev *dev; 
    struct yaffs_search_context *sc; 
    struct inode *inode = file->f_dentry->d_inode; 
    unsigned long offset, curoffs; 
    struct yaffs_obj *l; 
    int ret_val = 0; 
	 
    char name[YAFFS_MAX_NAME_LENGTH + 1]; 
	 
    obj = yaffs_dentry_to_obj(file->f_dentry); 
    dev = obj->my_dev; 
	 
    yaffs_gross_lock(dev); 

    yaffs_dev_to_lc(dev)->readdir_process = current; 
 
    offset = ctx->pos; 
	 
    sc = yaffs_new_search(obj); 
    if (!sc) { 
    ret_val = -ENOMEM; 
    goto out; 
    } 
	 
    yaffs_trace(YAFFS_TRACE_OS,"yaffs_readdir: starting at %d", (int)offset);  
    if (offset == 0) { 
    yaffs_trace(YAFFS_TRACE_OS, "yaffs_readdir: entry . ino %d", (int)inode->i_ino); 
    yaffs_gross_unlock(dev); 
    if (!dir_emit_dot(file, ctx)) { 
    yaffs_gross_lock(dev); 
    goto out; 
    } 
    yaffs_gross_lock(dev); 
    offset++; 
    ctx->pos++; 
    } 
    if (offset == 1) { 
    yaffs_trace(YAFFS_TRACE_OS, "yaffs_readdir: entry .. ino %d", (int)file->f_dentry->d_parent->d_inode->i_ino); 
    yaffs_gross_unlock(dev); 
    if (!dir_emit_dotdot(file, ctx)) { 
    yaffs_gross_lock(dev); 
    goto out; 
    } 
    yaffs_gross_lock(dev); 
    offset++; 
    ctx->pos++; 
    } 

    curoffs = 1; 
	 
 /* If the directory has changed since the open or last call to readdir, rewind to after the 2 canned entries. */ 
    if (file->f_version != inode->i_version) { 
    offset = 2; 
    ctx->pos = offset; 
    file->f_version = inode->i_version; 
    } 
 
    while (sc->next_return) { 
    curoffs++; 
    l = sc->next_return; 
    if (curoffs >= offset) { 
    int this_inode = yaffs_get_obj_inode(l); 
    int this_type = yaffs_get_obj_type(l); 

    yaffs_get_obj_name(l, name, YAFFS_MAX_NAME_LENGTH + 1); 
    yaffs_trace(YAFFS_TRACE_OS, "yaffs_readdir: %s inode %d", name, yaffs_get_obj_inode(l)); 
	 
    yaffs_gross_unlock(dev); 
	 
    if (!dir_emit(ctx, name, strlen(name),this_inode, this_type) < 0) { 
    yaffs_gross_lock(dev); 
    goto out; 
    } 
 
    yaffs_gross_lock(dev); 
 
    offset++; 
    ctx->pos++; 
    } 
    yaffs_search_advance(sc); 
    } 
 
    out: 
    yaffs_search_end(sc); 
    yaffs_dev_to_lc(dev)->readdir_process = NULL; 
    yaffs_gross_unlock(dev); 

    return ret_val; 
    } 
#else 
static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir) 
{
.....
}
#endif
static const struct file_operations yaffs_dir_operations = {
	.read = generic_read_dir,
//	.readdir = yaffs_readdir,
//add by jxm begin
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) 
        .iterate = yaffs_iterate, 
#else 
        .readdir = yaffs_readdir, 
#endif 
//add by jxm end
	.fsync = yaffs_sync_object,
	.llseek = generic_file_llseek,
};

그리고
번역하면 이 잘못을 보고하지 않는다
참조 웹 주소:https://dev.openwrt.org/browser/trunk/target/linux/generic/patches-3.12/503-yaffs-3.12-convert-readdir-to-iterate.patch?rev=39084#L1911
또 이 실수를 보고합니다: fs/yaffs2/yaffs_vfs.c:3501: error: implicit declaration of function 'create_proc_entry', 해결 방법은 내가 전재한 이 문장을 볼 수 있다
http://blog.csdn.net/xiaominthere/article/details/17549607

좋은 웹페이지 즐겨찾기