From: Kobi Cohen-A. <kob...@gm...> - 2012-04-17 23:46:10
|
Hi, I'm trying to use fgetattr in highlevel API. I started off using hello.c example and added hello_fgetattr. The idea is to populate fi->fh in open call and use it in fgetattr for opened file. The problem is that fi->fh is always zero regardless to the value assigned to it during the open call. In do_getattr, inarg structure always looks like that: {getattr_flags = 1, dummy = 0, fh = 0}. The interesting part is that ll API is working w/o issues. i.e. I took hello_ll.c, added hello_ll_getattr, and populate fh in open the same way in hello.c. I can see hello_ll_getattr is getting the correct fh values in do_getattr(). I might be missing something here, but it seems to me that lowlevel and highlevel should work the same in that case: In the kernel code I can see fs/fuse/dir.c has the following in fuse_create_open(): ff->fh = outopen.fh; … file->private_data = fuse_file_get(ff); Now, in the same file, func fuse_do_getattr(): if (file && S_ISREG(inode->i_mode)) { struct fuse_file *ff = file->private_data; inarg.getattr_flags |= FUSE_GETATTR_FH; inarg.fh = ff->fh; } So I guess that part is a common code between ll and hl API. So I would expect do_getattr would behave the same: struct fuse_getattr_in *arg = (struct fuse_getattr_in *) inarg; if (arg->getattr_flags & FUSE_GETATTR_FH) { memset(&fi, 0, sizeof(fi)); fi.fh = arg->fh; // arg->fh is always 0 fi.fh_old = fi.fh; fip = &fi; } But doesn't. Any idea why hl API would be missing fh ? Thanks in advance, - Kobi |