On Tue, Aug 27, 2024 at 11:41:04AM +0200, Han-Wen Nienhuys wrote: > Hi folks, > > I am implementing passthrough support for go-fuse. It seems to be > working now (code: > https://review.gerrithub.io/c/hanwen/go-fuse/+/1199984 and > predecessors), but I am unsure of the correct lifetimes for the file > descriptors. > > The passthrough_hp example seems to do: > > Open: > backing_fd = .. > backing_id = ioctl(fuse_device_fd, > FUSE_DEV_IOC_BACKING_OPEN, backing_fd) > > Release: > ioctl(fuse_device_fd, > FUSE_DEV_IOC_BACKING_CLOSE, backing_id) > close(backing_fd) > > Is it necessary to keep backing_fd open while the backing file is > used? In the case of go-fuse, the backing_fd is managed by client > code, so I can't ensure it is kept open long enough. I can work around > this by doing > > Open: > new_backing_fd = ioctl(backing_fd, DUP_FD, 0) > backing_id = ioctl(fuse_device_fd, > FUSE_DEV_IOC_BACKING_OPEN, new_backing_fd) > > Release: > ioctl(fuse_device_fd, > FUSE_DEV_IOC_BACKING_CLOSE, backing_id) > close(new_backing_fd) > > but it would double the number of FDs the process uses. > > I tried simply closing the backing FD right after obtaining the > backing ID, and it seems to work. Is this permitted? Yes that's permitted, we're holding a reference to the file in the kernel. The dup thing works too, but as you say that's a lot more fd's. Thanks, Josef