mirror of
https://github.com/samba-team/samba.git
synced 2025-01-21 18:04:06 +03:00
Merge of receive_local_message fix from 2.2.5.
Jeremy.
This commit is contained in:
parent
aa3ec7618f
commit
d4dbb9cb13
@ -72,11 +72,12 @@ BOOL oplock_message_waiting(fd_set *fds)
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeout)
|
||||
BOOL receive_local_message( char *buffer, int buffer_len, int timeout)
|
||||
{
|
||||
struct sockaddr_in from;
|
||||
socklen_t fromlen = sizeof(from);
|
||||
int32 msg_len = 0;
|
||||
fd_set fds;
|
||||
|
||||
smb_read_error = 0;
|
||||
|
||||
@ -90,26 +91,29 @@ BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeou
|
||||
|
||||
starttime = time(NULL);
|
||||
|
||||
if (koplocks && koplocks->notification_fd != -1) {
|
||||
FD_SET(koplocks->notification_fd, fds);
|
||||
maxfd = MAX(maxfd, koplocks->notification_fd);
|
||||
}
|
||||
FD_ZERO(&fds);
|
||||
maxfd = setup_oplock_select_set(&fds);
|
||||
|
||||
to.tv_sec = timeout / 1000;
|
||||
to.tv_usec = (timeout % 1000) * 1000;
|
||||
|
||||
selrtn = sys_select(maxfd+1,fds,NULL,NULL,&to);
|
||||
DEBUG(5,("receive_local_message: doing select with timeout of %d ms\n", timeout));
|
||||
|
||||
selrtn = sys_select(maxfd+1,&fds,NULL,NULL,&to);
|
||||
|
||||
if (selrtn == -1 && errno == EINTR) {
|
||||
/* could be a kernel oplock interrupt */
|
||||
if (koplocks && koplocks->msg_waiting(fds)) {
|
||||
return koplocks->receive_message(fds, buffer, buffer_len);
|
||||
if (koplocks && koplocks->msg_waiting(&fds)) {
|
||||
return koplocks->receive_message(&fds, buffer, buffer_len);
|
||||
}
|
||||
/* Not a kernel interrupt - could be a SIGUSR1 message. We must restart. */
|
||||
/* We need to decrement the timeout here. */
|
||||
timeout -= ((time(NULL) - starttime)*1000);
|
||||
if (timeout < 0)
|
||||
timeout = 0;
|
||||
|
||||
DEBUG(5,("receive_local_message: EINTR : new timeout %d ms\n", timeout));
|
||||
|
||||
goto again;
|
||||
}
|
||||
|
||||
@ -127,11 +131,11 @@ BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeou
|
||||
}
|
||||
}
|
||||
|
||||
if (koplocks && koplocks->msg_waiting(fds)) {
|
||||
return koplocks->receive_message(fds, buffer, buffer_len);
|
||||
if (koplocks && koplocks->msg_waiting(&fds)) {
|
||||
return koplocks->receive_message(&fds, buffer, buffer_len);
|
||||
}
|
||||
|
||||
if (!FD_ISSET(oplock_sock, fds))
|
||||
if (!FD_ISSET(oplock_sock, &fds))
|
||||
return False;
|
||||
|
||||
/*
|
||||
@ -978,16 +982,8 @@ dev = %x, inode = %.0f, file_id = %lu and no fsp found !\n",
|
||||
char op_break_reply[OPBRK_CMD_HEADER_LEN+OPLOCK_BREAK_MSG_LEN];
|
||||
uint16 reply_from_port;
|
||||
char *reply_msg_start;
|
||||
fd_set fds;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(oplock_sock,&fds);
|
||||
|
||||
if (koplocks && koplocks->notification_fd != -1) {
|
||||
FD_SET(koplocks->notification_fd, &fds);
|
||||
}
|
||||
|
||||
if(receive_local_message(&fds, op_break_reply, sizeof(op_break_reply),
|
||||
if(receive_local_message(op_break_reply, sizeof(op_break_reply),
|
||||
time_left ? time_left * 1000 : 1) == False) {
|
||||
if(smb_read_error == READ_TIMEOUT) {
|
||||
if( DEBUGLVL( 0 ) ) {
|
||||
|
@ -99,7 +99,7 @@ static BOOL irix_oplock_receive_message(fd_set *fds, char *buffer, int buffer_le
|
||||
*/
|
||||
|
||||
if(read(oplock_pipe_read, &dummy, 1) != 1) {
|
||||
DEBUG(0,("receive_local_message: read of kernel notification failed. \
|
||||
DEBUG(0,("irix_oplock_receive_message: read of kernel notification failed. \
|
||||
Error was %s.\n", strerror(errno) ));
|
||||
smb_read_error = READ_ERROR;
|
||||
return False;
|
||||
@ -112,7 +112,7 @@ Error was %s.\n", strerror(errno) ));
|
||||
*/
|
||||
|
||||
if(sys_fcntl_ptr(oplock_pipe_read, F_OPLKSTAT, &os) < 0) {
|
||||
DEBUG(0,("receive_local_message: fcntl of kernel notification failed. \
|
||||
DEBUG(0,("irix_oplock_receive_message: fcntl of kernel notification failed. \
|
||||
Error was %s.\n", strerror(errno) ));
|
||||
if(errno == EAGAIN) {
|
||||
/*
|
||||
@ -131,12 +131,12 @@ Error was %s.\n", strerror(errno) ));
|
||||
*/
|
||||
|
||||
if ((fsp = file_find_di_first((SMB_DEV_T)os.os_dev, (SMB_INO_T)os.os_ino)) == NULL) {
|
||||
DEBUG(0,("receive_local_message: unable to find open file with dev = %x, inode = %.0f\n",
|
||||
DEBUG(0,("irix_oplock_receive_message: unable to find open file with dev = %x, inode = %.0f\n",
|
||||
(unsigned int)os.os_dev, (double)os.os_ino ));
|
||||
return False;
|
||||
}
|
||||
|
||||
DEBUG(5,("receive_local_message: kernel oplock break request received for \
|
||||
DEBUG(5,("irix_oplock_receive_message: kernel oplock break request received for \
|
||||
dev = %x, inode = %.0f\n, file_id = %ul", (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id ));
|
||||
|
||||
/*
|
||||
@ -166,19 +166,19 @@ static BOOL irix_set_kernel_oplock(files_struct *fsp, int oplock_type)
|
||||
{
|
||||
if (sys_fcntl_long(fsp->fd, F_OPLKREG, oplock_pipe_write) == -1) {
|
||||
if(errno != EAGAIN) {
|
||||
DEBUG(0,("set_file_oplock: Unable to get kernel oplock on file %s, dev = %x, \
|
||||
DEBUG(0,("irix_set_kernel_oplock: Unable to get kernel oplock on file %s, dev = %x, \
|
||||
inode = %.0f, file_id = %ul. Error was %s\n",
|
||||
fsp->fsp_name, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id,
|
||||
strerror(errno) ));
|
||||
} else {
|
||||
DEBUG(5,("set_file_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
|
||||
DEBUG(5,("irix_set_kernel_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
|
||||
inode = %.0f, file_id = %ul. Another process had the file open.\n",
|
||||
fsp->fsp_name, fsp->fd, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id ));
|
||||
}
|
||||
return False;
|
||||
}
|
||||
|
||||
DEBUG(10,("set_file_oplock: got kernel oplock on file %s, dev = %x, inode = %.0f, file_id = %ul\n",
|
||||
DEBUG(10,("irix_set_kernel_oplock: got kernel oplock on file %s, dev = %x, inode = %.0f, file_id = %ul\n",
|
||||
fsp->fsp_name, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id));
|
||||
|
||||
return True;
|
||||
@ -196,7 +196,7 @@ static void irix_release_kernel_oplock(files_struct *fsp)
|
||||
* oplock state of this file.
|
||||
*/
|
||||
int state = sys_fcntl_long(fsp->fd, F_OPLKACK, -1);
|
||||
dbgtext("release_kernel_oplock: file %s, dev = %x, inode = %.0f file_id = %ul, has kernel \
|
||||
dbgtext("irix_release_kernel_oplock: file %s, dev = %x, inode = %.0f file_id = %ul, has kernel \
|
||||
oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
|
||||
(double)fsp->inode, fsp->file_id, state );
|
||||
}
|
||||
@ -206,7 +206,7 @@ oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
|
||||
*/
|
||||
if(sys_fcntl_long(fsp->fd, F_OPLKACK, OP_REVOKE) < 0) {
|
||||
if( DEBUGLVL( 0 )) {
|
||||
dbgtext("release_kernel_oplock: Error when removing kernel oplock on file " );
|
||||
dbgtext("irix_release_kernel_oplock: Error when removing kernel oplock on file " );
|
||||
dbgtext("%s, dev = %x, inode = %.0f, file_id = %ul. Error was %s\n",
|
||||
fsp->fsp_name, (unsigned int)fsp->dev,
|
||||
(double)fsp->inode, fsp->file_id, strerror(errno) );
|
||||
|
@ -136,7 +136,7 @@ static BOOL linux_oplock_receive_message(fd_set *fds, char *buffer, int buffer_l
|
||||
goto out;
|
||||
}
|
||||
|
||||
DEBUG(3,("receive_local_message: kernel oplock break request received for \
|
||||
DEBUG(3,("linux_oplock_receive_message: kernel oplock break request received for \
|
||||
dev = %x, inode = %.0f\n", (unsigned int)fsp->dev, (double)fsp->inode ));
|
||||
|
||||
/*
|
||||
@ -171,14 +171,14 @@ dev = %x, inode = %.0f\n", (unsigned int)fsp->dev, (double)fsp->inode ));
|
||||
static BOOL linux_set_kernel_oplock(files_struct *fsp, int oplock_type)
|
||||
{
|
||||
if (linux_setlease(fsp->fd, F_WRLCK) == -1) {
|
||||
DEBUG(3,("set_file_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
|
||||
DEBUG(3,("linux_set_kernel_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
|
||||
inode = %.0f. (%s)\n",
|
||||
fsp->fsp_name, fsp->fd,
|
||||
(unsigned int)fsp->dev, (double)fsp->inode, strerror(errno)));
|
||||
return False;
|
||||
}
|
||||
|
||||
DEBUG(3,("set_file_oplock: got kernel oplock on file %s, dev = %x, inode = %.0f, file_id = %lu\n",
|
||||
DEBUG(3,("linux_set_kernel_oplock: got kernel oplock on file %s, dev = %x, inode = %.0f, file_id = %lu\n",
|
||||
fsp->fsp_name, (unsigned int)fsp->dev, (double)fsp->inode, fsp->file_id));
|
||||
|
||||
return True;
|
||||
@ -196,7 +196,7 @@ static void linux_release_kernel_oplock(files_struct *fsp)
|
||||
* oplock state of this file.
|
||||
*/
|
||||
int state = fcntl(fsp->fd, F_GETLEASE, 0);
|
||||
dbgtext("release_kernel_oplock: file %s, dev = %x, inode = %.0f file_id = %lu has kernel \
|
||||
dbgtext("linux_release_kernel_oplock: file %s, dev = %x, inode = %.0f file_id = %lu has kernel \
|
||||
oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
|
||||
(double)fsp->inode, fsp->file_id, state );
|
||||
}
|
||||
@ -206,7 +206,7 @@ oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
|
||||
*/
|
||||
if (linux_setlease(fsp->fd, F_UNLCK) == -1) {
|
||||
if (DEBUGLVL(0)) {
|
||||
dbgtext("release_kernel_oplock: Error when removing kernel oplock on file " );
|
||||
dbgtext("linux_release_kernel_oplock: Error when removing kernel oplock on file " );
|
||||
dbgtext("%s, dev = %x, inode = %.0f, file_id = %lu. Error was %s\n",
|
||||
fsp->fsp_name, (unsigned int)fsp->dev,
|
||||
(double)fsp->inode, fsp->file_id, strerror(errno) );
|
||||
|
@ -109,10 +109,10 @@ BOOL push_oplock_pending_smb_message(char *buf, int msg_len)
|
||||
oplock messages, change notify events etc.
|
||||
****************************************************************************/
|
||||
|
||||
static void async_processing(fd_set *fds, char *buffer, int buffer_len)
|
||||
static void async_processing(char *buffer, int buffer_len)
|
||||
{
|
||||
/* check for oplock messages (both UDP and kernel) */
|
||||
if (receive_local_message(fds, buffer, buffer_len, 0)) {
|
||||
if (receive_local_message(buffer, buffer_len, 0)) {
|
||||
process_local_message(buffer, buffer_len);
|
||||
}
|
||||
|
||||
@ -206,7 +206,7 @@ static BOOL receive_message_or_smb(char *buffer, int buffer_len, int timeout)
|
||||
is the best we can do until the oplock code knows more about
|
||||
signals */
|
||||
if (selrtn == -1 && errno == EINTR) {
|
||||
async_processing(&fds, buffer, buffer_len);
|
||||
async_processing(buffer, buffer_len);
|
||||
/*
|
||||
* After async processing we must go and do the select again, as
|
||||
* the state of the flag in fds for the server file descriptor is
|
||||
@ -235,7 +235,7 @@ static BOOL receive_message_or_smb(char *buffer, int buffer_len, int timeout)
|
||||
*/
|
||||
|
||||
if (oplock_message_waiting(&fds)) {
|
||||
async_processing(&fds, buffer, buffer_len);
|
||||
async_processing(buffer, buffer_len);
|
||||
/*
|
||||
* After async processing we must go and do the select again, as
|
||||
* the state of the flag in fds for the server file descriptor is
|
||||
@ -275,7 +275,6 @@ BOOL receive_next_smb(char *inbuf, int bufsize, int timeout)
|
||||
void respond_to_all_remaining_local_messages(void)
|
||||
{
|
||||
char buffer[1024];
|
||||
fd_set fds;
|
||||
|
||||
/*
|
||||
* Assert we have no exclusive open oplocks.
|
||||
@ -287,24 +286,13 @@ void respond_to_all_remaining_local_messages(void)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup the select read fd set.
|
||||
*/
|
||||
|
||||
FD_ZERO(&fds);
|
||||
if(!setup_oplock_select_set(&fds))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Keep doing receive_local_message with a 1 ms timeout until
|
||||
* we have no more messages.
|
||||
*/
|
||||
while(receive_local_message(&fds, buffer, sizeof(buffer), 1)) {
|
||||
while(receive_local_message(buffer, sizeof(buffer), 1)) {
|
||||
/* Deal with oplock break requests from other smbd's. */
|
||||
process_local_message(buffer, sizeof(buffer));
|
||||
|
||||
FD_ZERO(&fds);
|
||||
(void)setup_oplock_select_set(&fds);
|
||||
}
|
||||
|
||||
return;
|
||||
|
Loading…
x
Reference in New Issue
Block a user