Skip to content

Commit

Permalink
* sysdeps/unix/sysv/linux/ia64/bits/shm.h (shmatt_t): New type.
Browse files Browse the repository at this point in the history
	(struct shmid_ds): Use it for shm_nattch field.

2005-11-18  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/futimesat.c (futimesat): If FILE is NULL,
	set access and modification times of the file referenced by FD.
	* sysdeps/generic/futimesat.c (futimesat): Don't return EINVAL if
	FILE is NULL.  Don't check FD if FILE is absolute path.

2005-11-19  Ulrich Drepper  <drepper@redhat.com>

	* nscd/nscd_gethst_r.c (nscd_gethst_r): Avoid unnecesary read call
	if there are no aliases.

	* sysdeps/unix/sysv/linux/Makefile (CFLAGS-connections.c,
	CFLAGS-pwdcache.c, CFLAGS-grpcache.c, CFLAGS-hstcache.c,
	CFLAGS-aicache.c, CFLAGS-initgrcache.c): Add -DHAVE_SENDFILE.
	* sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_SENDFILE):
	Define.
	* nscd/pwdcache.c [HAVE_SENDFILE]: Include <sys/sendfile.h> and
	<kernel-features.h>.
	[HAVE_SENDFILE] (cache_addpw): Use sendfile to transmit positive
	result.
	* nscd/grpcache.c: Likewise.
	* nscd/hstcache.c: Likewise.
	* nscd/aicache.c: Likewise.
	* nscd/initgrcache.c: Likewise.
	* nscd/connectionc.c: Likewise.
  • Loading branch information
Ulrich Drepper committed Nov 19, 2005
1 parent 74ac0a8 commit eac1079
Show file tree
Hide file tree
Showing 12 changed files with 251 additions and 22 deletions.
32 changes: 32 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,35 @@
2005-11-19 Jakub Jelinek <jakub@redhat.com>

* sysdeps/unix/sysv/linux/ia64/bits/shm.h (shmatt_t): New type.
(struct shmid_ds): Use it for shm_nattch field.

2005-11-18 Jakub Jelinek <jakub@redhat.com>

* sysdeps/unix/sysv/linux/futimesat.c (futimesat): If FILE is NULL,
set access and modification times of the file referenced by FD.
* sysdeps/generic/futimesat.c (futimesat): Don't return EINVAL if
FILE is NULL. Don't check FD if FILE is absolute path.

2005-11-19 Ulrich Drepper <drepper@redhat.com>

* nscd/nscd_gethst_r.c (nscd_gethst_r): Avoid unnecesary read call
if there are no aliases.

* sysdeps/unix/sysv/linux/Makefile (CFLAGS-connections.c,
CFLAGS-pwdcache.c, CFLAGS-grpcache.c, CFLAGS-hstcache.c,
CFLAGS-aicache.c, CFLAGS-initgrcache.c): Add -DHAVE_SENDFILE.
* sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_SENDFILE):
Define.
* nscd/pwdcache.c [HAVE_SENDFILE]: Include <sys/sendfile.h> and
<kernel-features.h>.
[HAVE_SENDFILE] (cache_addpw): Use sendfile to transmit positive
result.
* nscd/grpcache.c: Likewise.
* nscd/hstcache.c: Likewise.
* nscd/aicache.c: Likewise.
* nscd/initgrcache.c: Likewise.
* nscd/connectionc.c: Likewise.

2005-11-18 Andreas Schwab <schwab@suse.de>

* sysdeps/powerpc/powerpc32/fpu/s_lround.S: Remove useless alias.
Expand Down
36 changes: 33 additions & 3 deletions nscd/aicache.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,15 @@
#include <time.h>
#include <unistd.h>
#include <sys/mman.h>
#include <dbg_log.h>
#include <nscd.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif

#include "dbg_log.h"
#include "nscd.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif


typedef enum nss_status (*nss_gethostbyname3_r)
Expand Down Expand Up @@ -365,7 +372,30 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
wait. */
assert (fd != -1);

writeall (fd, &dataset->resp, total);
#ifdef HAVE_SENDFILE
if (__builtin_expect (db->mmap_used, 1))
{
assert (db->wr_fd != -1);
assert ((char *) &dataset->resp > (char *) db->data);
assert ((char *) &dataset->resp - (char *) db->head
+ total
<= (sizeof (struct database_pers_head)
+ db->head->module * sizeof (ref_t)
+ db->head->data_size));
off_t off = (char *) &dataset->resp - (char *) db->head;
ssize_t written;
written = sendfile (fd, db->wr_fd, &off, total);
# ifndef __ASSUME_SENDFILE
if (written == -1 && errno == ENOSYS)
goto use_write;
# endif
}
else
# ifndef __ASSUME_SENDFILE
use_write:
# endif
#endif
writeall (fd, &dataset->resp, total);
}

goto out;
Expand Down
35 changes: 33 additions & 2 deletions nscd/connections.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,19 @@
#include <sys/mman.h>
#include <sys/param.h>
#include <sys/poll.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>

#include "nscd.h"
#include "dbg_log.h"
#include "selinux.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif


/* Wrapper functions with error checking for standard functions. */
Expand Down Expand Up @@ -939,8 +945,33 @@ cannot handle old request version %d; current version is %d"),
if (cached != NULL)
{
/* Hurray it's in the cache. */
if (writeall (fd, cached->data, cached->recsize)
!= cached->recsize
ssize_t nwritten;

#ifdef HAVE_SENDFILE
if (db->mmap_used || !cached->notfound)
{
assert (db->wr_fd != -1);
assert ((char *) cached->data > (char *) db->data);
assert ((char *) cached->data - (char *) db->head
+ cached->recsize
<= (sizeof (struct database_pers_head)
+ db->head->module * sizeof (ref_t)
+ db->head->data_size));
off_t off = (char *) cached->data - (char *) db->head;
nwritten = sendfile (fd, db->wr_fd, &off, cached->recsize);
# ifndef __ASSUME_SENDFILE
if (nwritten == -1 && errno == ENOSYS)
goto use_write;
# endif
}
else
# ifndef __ASSUME_SENDFILE
use_write:
# endif
#endif
nwritten = writeall (fd, cached->data, cached->recsize);

if (nwritten != cached->recsize
&& __builtin_expect (debug_level, 0) > 0)
{
/* We have problems sending the result. */
Expand Down
30 changes: 29 additions & 1 deletion nscd/grpcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,17 @@
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif
#include <sys/socket.h>
#include <stackinfo.h>

#include "nscd.h"
#include "dbg_log.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif

/* This is the standard reply in case the service is disabled. */
static const gr_response_header disabled =
Expand Down Expand Up @@ -294,7 +300,29 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
unnecessarily let the receiver wait. */
assert (fd != -1);

written = writeall (fd, &dataset->resp, total);
#ifdef HAVE_SENDFILE
if (__builtin_expect (db->mmap_used, 1))
{
assert (db->wr_fd != -1);
assert ((char *) &dataset->resp > (char *) db->data);
assert ((char *) &dataset->resp - (char *) db->head
+ total
<= (sizeof (struct database_pers_head)
+ db->head->module * sizeof (ref_t)
+ db->head->data_size));
off_t off = (char *) &dataset->resp - (char *) db->head;
written = sendfile (fd, db->wr_fd, &off, total);
# ifndef __ASSUME_SENDFILE
if (written == -1 && errno == ENOSYS)
goto use_write;
# endif
}
else
# ifndef __ASSUME_SENDFILE
use_write:
# endif
#endif
written = writeall (fd, &dataset->resp, total);
}

/* Add the record to the database. But only if it has not been
Expand Down
30 changes: 29 additions & 1 deletion nscd/hstcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,16 @@
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <sys/mman.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif
#include <stackinfo.h>

#include "nscd.h"
#include "dbg_log.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif


/* This is the standard reply in case the service is disabled. */
Expand Down Expand Up @@ -328,7 +334,29 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
unnecessarily keep the receiver waiting. */
assert (fd != -1);

written = writeall (fd, &dataset->resp, total);
#ifdef HAVE_SENDFILE
if (__builtin_expect (db->mmap_used, 1))
{
assert (db->wr_fd != -1);
assert ((char *) &dataset->resp > (char *) db->data);
assert ((char *) &dataset->resp - (char *) db->head
+ total
<= (sizeof (struct database_pers_head)
+ db->head->module * sizeof (ref_t)
+ db->head->data_size));
off_t off = (char *) &dataset->resp - (char *) db->head;
written = sendfile (fd, db->wr_fd, &off, total);
# ifndef __ASSUME_SENDFILE
if (written == -1 && errno == ENOSYS)
goto use_write;
# endif
}
else
# ifndef __ASSUME_SENDFILE
use_write:
# endif
#endif
written = writeall (fd, &dataset->resp, total);
}

/* Add the record to the database. But only if it has not been
Expand Down
35 changes: 32 additions & 3 deletions nscd/initgrcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,15 @@
#include <time.h>
#include <unistd.h>
#include <sys/mman.h>
#include <dbg_log.h>
#include <nscd.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif

#include "dbg_log.h"
#include "nscd.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif

#include "../nss/nsswitch.h"

Expand Down Expand Up @@ -344,7 +351,29 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
unnecessarily let the receiver wait. */
assert (fd != -1);

written = writeall (fd, &dataset->resp, total);
#ifdef HAVE_SENDFILE
if (__builtin_expect (db->mmap_used, 1))
{
assert (db->wr_fd != -1);
assert ((char *) &dataset->resp > (char *) db->data);
assert ((char *) &dataset->resp - (char *) db->head
+ total
<= (sizeof (struct database_pers_head)
+ db->head->module * sizeof (ref_t)
+ db->head->data_size));
off_t off = (char *) &dataset->resp - (char *) db->head;
written = sendfile (fd, db->wr_fd, &off, total);
# ifndef __ASSUME_SENDFILE
if (written == -1 && errno == ENOSYS)
goto use_write;
# endif
}
else
# ifndef __ASSUME_SENDFILE
use_write:
# endif
#endif
written = writeall (fd, &dataset->resp, total);
}


Expand Down
30 changes: 29 additions & 1 deletion nscd/pwdcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,17 @@
#include <time.h>
#include <unistd.h>
#include <sys/mman.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif
#include <sys/socket.h>
#include <stackinfo.h>

#include "nscd.h"
#include "dbg_log.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif

/* This is the standard reply in case the service is disabled. */
static const pw_response_header disabled =
Expand Down Expand Up @@ -289,7 +295,29 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
unnecessarily let the receiver wait. */
assert (fd != -1);

written = writeall (fd, &dataset->resp, total);
#ifdef HAVE_SENDFILE
if (__builtin_expect (db->mmap_used, 1))
{
assert (db->wr_fd != -1);
assert ((char *) &dataset->resp > (char *) db->data);
assert ((char *) &dataset->resp - (char *) db->head
+ total
<= (sizeof (struct database_pers_head)
+ db->head->module * sizeof (ref_t)
+ db->head->data_size));
off_t off = (char *) &dataset->resp - (char *) db->head;
written = sendfile (fd, db->wr_fd, &off, total);
# ifndef __ASSUME_SENDFILE
if (written == -1 && errno == ENOSYS)
goto use_write;
# endif
}
else
# ifndef __ASSUME_SENDFILE
use_write:
# endif
#endif
written = writeall (fd, &dataset->resp, total);
}


Expand Down
10 changes: 3 additions & 7 deletions sysdeps/generic/futimesat.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,14 @@ futimesat (fd, file, tvp)
const char *file;
const struct timeval tvp[2];
{
if (fd < 0 && fd != AT_FDCWD)
if (fd < 0
&& (file == NULL
|| (fd != AT_FDCWD && file[0] != '/')))
{
__set_errno (EBADF);
return -1;
}

if (file == NULL)
{
__set_errno (EINVAL);
return -1;
}

__set_errno (ENOSYS);
return -1;
}
Expand Down
7 changes: 6 additions & 1 deletion sysdeps/unix/sysv/linux/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,11 @@ CFLAGS-mq_receive.c += -fexceptions
endif

ifeq ($(subdir),nscd)
CFLAGS-connections.c += -DHAVE_EPOLL
CFLAGS-connections.c += -DHAVE_EPOLL -DHAVE_SENDFILE
CFLAGS-pwdcache.c += -DHAVE_SENDFILE
CFLAGS-grpcache.c += -DHAVE_SENDFILE
CFLAGS-hstcache.c += -DHAVE_SENDFILE
CFLAGS-aicache.c += -DHAVE_SENDFILE
CFLAGS-initgrcache.c += -DHAVE_SENDFILE
CFLAGS-gai.c += -DNEED_NETLINK
endif
17 changes: 16 additions & 1 deletion sysdeps/unix/sysv/linux/futimesat.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,22 @@ futimesat (fd, file, tvp)
{
char *buf = NULL;

if (fd != AT_FDCWD && file[0] != '/')
if (file == NULL)
{
static const char procfd[] = "/proc/self/fd/%d";
/* Buffer for the path name we are going to use. It consists of
- the string /proc/self/fd/
- the file descriptor number.
The final NUL is included in the sizeof. A bit of overhead
due to the format elements compensates for possible negative
numbers. */
size_t buflen = sizeof (procfd) + sizeof (int) * 3;
buf = alloca (buflen);

__snprintf (buf, buflen, procfd, fd);
file = buf;
}
else if (fd != AT_FDCWD && file[0] != '/')
{
size_t filelen = strlen (file);
static const char procfd[] = "/proc/self/fd/%d/%s";
Expand Down
Loading

0 comments on commit eac1079

Please sign in to comment.