]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
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)
committerKarolin Seeger <kseeger@samba.org>
Mon, 26 Jan 2015 19:53:09 +0000 (20:53 +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

(cherry picked from commit 3b2d8bdbb1851961536241d3aaaf6ac936964517)

The last 10 patches address
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11069
Backport remaining performance patches for vfs_glusterfs to 4.2/4.1.

source3/modules/vfs_glusterfs.c

index 35a9c8d0fdc3a71fa0a23172b3d552601da07c92..cfdd195125deff6723def38045e0a3d1df1240b2 100644 (file)
@@ -520,6 +520,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 *));
@@ -540,6 +547,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)));