vfs_glusterfs: Add comments to the pipe(2) code.
authorIra Cooper <ira@samba.org>
Thu, 22 Jan 2015 22:14:31 +0000 (17:14 -0500)
committerJeremy Allison <jra@samba.org>
Fri, 23 Jan 2015 19:58:51 +0000 (20:58 +0100)
The guarantees around read(2) and write(2) and pipes are critical
to understanding this code.  Hopefully these comments will help.

Signed-off-by: Ira Cooper <ira@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Jan 23 20:58:51 CET 2015 on sn-devel-104

source3/modules/vfs_glusterfs.c

index 04314f2b8b7dc522aaa642a1ce7ab0daaa956836..e0cc85c0c8cccbda251924689894881ef52c0b29 100644 (file)
@@ -521,6 +521,13 @@ static void aio_glusterfs_done(glfs_fd_t *fd, ssize_t ret, void *data)
         * be called here, as it is not designed to be executed
         * in the multithread environment, tevent_req_done() must be
         * executed from the smbd main thread.
+        *
+        * write(2) on pipes with sizes under _POSIX_PIPE_BUF
+        * in size is atomic, without this, the use op pipes in this
+        * code would not work.
+        *
+        * sys_write is a thin enough wrapper around write(2)
+        * that we can trust it here.
         */
 
        sts = sys_write(write_fd, &req, sizeof(struct tevent_req *));
@@ -541,6 +548,16 @@ static void aio_tevent_fd_done(struct tevent_context *event_ctx,
        struct tevent_req *req = NULL;
        int sts = 0;
 
+       /*
+        * read(2) on pipes is atomic if the needed data is available
+        * in the pipe, per SUS and POSIX.  Because we always write
+        * to the pipe in sizeof(struct tevent_req *) chunks, we can
+        * always read in those chunks, atomically.
+        *
+        * sys_read is a thin enough wrapper around read(2) that we
+        * can trust it here.
+        */
+
        sts = sys_read(read_fd, &req, sizeof(struct tevent_req *));
        if (sts < 0) {
                DEBUG(0,("\nRead from pipe failed (%s)", strerror(errno)));