On Thu, Feb 07, 2019 at 09:14:41AM -0700, Jens Axboe wrote:

> I created a small app to do just that, and ran it and verified that
> ->release() is called and the io_uring is released as expected. This
> is run on the current -git branch, which has a socket backing for
> the io_uring fd itself, but not for the registered files.
> 
> What am I missing here? Attaching the program as a reference.

> int main(int argc, char *argv[])
> {
>       int sp[2], pid, ring_fd, ret;
> 
>       if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sp) != 0) {
>               perror("Failed to create Unix-domain socket pair\n");
>               return 1;
>       }
> 
>       ring_fd = get_ring_fd();
>       if (ring_fd < 0)
>               return 1;
> 
>       ret = io_uring_register_files(ring_fd, sp[0], sp[1]);
>       if (ret < 0) {
>               perror("register files");
>               return 1;
>       }
> 
>       pid = fork();
>       if (pid) {
>               printf("Sending fd %d\n", ring_fd);
> 
>               send_fd(sp[0], ring_fd);
>       } else {
>               int fd;
> 
>               fd = recv_fd(sp[1]);

Well, yes - once you receive it, you obviously have no references
sitting in SCM_RIGHTS anymore.

Get rid of recv_fd() there (along with fork(), while we are at it - what's
it for?) and just do send_fd + these 3 close (or just exit, for that matter).

Reply via email to