From: <Wan...@em...> - 2009-09-25 03:24:11
|
OK. I think I get the answer. Instead of patching the fuse, we should change our implementation of create() to bypass the permission check of open(). That is what kernel function do_filp_open() also does. Best Regards, Zhifeng Wang Shanghai R&D Centre KIC Plaza, 252 Songhu Lu, Building 2, 2nd Floor Shanghai, 200433 Tel: 021 60951100 x 2261 -----Original Message----- From: Wang, Zhifeng Sent: 2009年9月22日 15:19 To: 'fus...@li...' Subject: NFS permission denied error with O_EXCL flag Hi, This is my first post here. So hello, everyone! We met a problem when using fuse with NFS. We have a file system built on fuse 2.7.4. When using NFS export with the file system, non-root user will meet a "permission denied" error when using open() call with O_EXCL flag set. For example, ... fd = open(filename, O_RDWR|O_CREAT|O_EXCL, 0666); … After a deeper analysis, we found when O_EXCL is set, the NFS server would first send a CREATE request with access mode set to 0, that is, even the file owner has no access right. After the CREATE request, the NFS server would then send a SETATTR request to set the proper access mode. The fuse_lib_mknod() in fuse 2.7.4 (and fuse 2.8.0 too) would call fuse_fs_create() to create and open the file. Since the access mode at creation time is set to 0, the open operation would fail due to permission denied error. Currently we overcome this problem by explicitly ask fuse_fs_create() to not open the file. But we're not sure if this fix has any impact to existing functionalities. So please help to review the following fix. our patches in fuse_lib_mknod(): …. struct fuse_file_info fi; memset(&fi, 0, sizeof(fi)); - fi.flags = O_CREAT | O_EXCL | O_WRONLY; + /* Here we explicitly set create_only flag. + NFS doesn't need to open file in creation + */ + fi.flags = O_CREAT | O_EXCL; + fi.create_only = 1; err = fuse_fs_create(f->fs, path, mode, &fi); if (!err) { err = lookup_path(f, parent, name, path, &e, &fi); - fuse_fs_release(f->fs, path, &fi); } } if (err == -ENOSYS) { … Best Regards, Zhifeng Wang |