become root for AIO operations
authorAndrew Tridgell <tridge@samba.org>
Sun, 24 Aug 2008 03:58:05 +0000 (13:58 +1000)
committerMichael Adam <obnox@samba.org>
Tue, 26 Aug 2008 12:39:43 +0000 (14:39 +0200)
We need to become root for AIO read and write to allow the AIO thread
to send a completion signal to the parent process when the IO
completes
(This used to be commit c548e5c69f9d8bc85a654f4d29d64c735a5e780b)

source3/smbd/aio.c

index 2889e3c13f82a0b04e12aa86e8a0e5520b03d82b..74275368bdd2c2f119ca022a58f17f5ee72a81f5 100644 (file)
@@ -268,12 +268,15 @@ bool schedule_aio_read_and_X(connection_struct *conn,
        a->aio_sigevent.sigev_signo  = RT_SIGNAL_AIO;
        a->aio_sigevent.sigev_value.sival_int = aio_ex->mid;
 
+       become_root();
        if (SMB_VFS_AIO_READ(fsp,a) == -1) {
                DEBUG(0,("schedule_aio_read_and_X: aio_read failed. "
                         "Error %s\n", strerror(errno) ));
                delete_aio_ex(aio_ex);
+               unbecome_root();
                return False;
        }
+       unbecome_root();
 
        DEBUG(10,("schedule_aio_read_and_X: scheduled aio_read for file %s, "
                  "offset %.0f, len = %u (mid = %u)\n",
@@ -366,13 +369,16 @@ bool schedule_aio_write_and_X(connection_struct *conn,
        a->aio_sigevent.sigev_signo  = RT_SIGNAL_AIO;
        a->aio_sigevent.sigev_value.sival_int = aio_ex->mid;
 
+       become_root();
        if (SMB_VFS_AIO_WRITE(fsp,a) == -1) {
                DEBUG(3,("schedule_aio_wrote_and_X: aio_write failed. "
                         "Error %s\n", strerror(errno) ));
                delete_aio_ex(aio_ex);
+               unbecome_root();
                return False;
        }
-
+       unbecome_root();
+       
        release_level_2_oplocks_on_change(fsp);
 
        if (!write_through && !lp_syncalways(SNUM(fsp->conn))