commit d663521ba7e6a808be02633e57dbeb7a95973c0f Author: Jeff Garzik <jeff@xxxxxxxxxx> Date: Thu Jul 15 13:50:10 2010 -0400 chunkd: remove sendfile(2) zero-copy support chunkd will be soon checksumming data in main memory. That removes the utility of a zero-copy interface which bypasses the on-heap data requirement. Signed-off-by: Jeff Garzik <jgarzik@xxxxxxxxxx> chunkd/be-fs.c | 60 -------------------------------------------------------- chunkd/chunkd.h | 14 ------------- chunkd/object.c | 31 ++++++++++++---------------- chunkd/server.c | 28 -------------------------- configure.ac | 3 -- 5 files changed, 15 insertions(+), 121 deletions(-) diff --git a/chunkd/be-fs.c b/chunkd/be-fs.c index f72ed48..5c97388 100644 --- a/chunkd/be-fs.c +++ b/chunkd/be-fs.c @@ -25,9 +25,6 @@ #include <sys/stat.h> #include <sys/socket.h> #include <sys/uio.h> -#if defined(HAVE_SYS_SENDFILE_H) -#include <sys/sendfile.h> -#endif #include <stdlib.h> #include <unistd.h> #include <stdio.h> @@ -52,7 +49,6 @@ struct fs_obj { int in_fd; char *in_fn; - off_t sendfile_ofs; }; struct be_fs_obj_hdr { @@ -542,62 +538,6 @@ ssize_t fs_obj_write(struct backend_obj *bo, const void *ptr, size_t len) return rc; } -#if defined(HAVE_SENDFILE) && defined(__linux__) - -ssize_t fs_obj_sendfile(struct backend_obj *bo, int out_fd, size_t len) -{ - struct fs_obj *obj = bo->private; - ssize_t rc; - - if (obj->sendfile_ofs == 0) { - obj->sendfile_ofs += sizeof(struct be_fs_obj_hdr); - obj->sendfile_ofs += bo->key_len; - } - - rc = sendfile(out_fd, obj->in_fd, &obj->sendfile_ofs, len); - if (rc < 0) - applog(LOG_ERR, "obj sendfile(%s) failed: %s", - obj->in_fn, strerror(errno)); - - return rc; -} - -#elif defined(HAVE_SENDFILE) && defined(__FreeBSD__) - -ssize_t fs_obj_sendfile(struct backend_obj *bo, int out_fd, size_t len) -{ - struct fs_obj *obj = bo->private; - ssize_t rc; - off_t sbytes = 0; - - if (obj->sendfile_ofs == 0) { - obj->sendfile_ofs += sizeof(struct be_fs_obj_hdr); - obj->sendfile_ofs += bo->key_len; - } - - rc = sendfile(obj->in_fd, out_fd, obj->sendfile_ofs, len, - NULL, &sbytes, 0); - if (rc < 0) { - applog(LOG_ERR, "obj sendfile(%s) failed: %s", - obj->in_fn, strerror(errno)); - return rc; - } - - obj->sendfile_ofs += sbytes; - - return sbytes; -} - -#else - -ssize_t fs_obj_sendfile(struct backend_obj *bo, int out_fd, size_t len) -{ - applog(LOG_ERR, "BUG: sendfile used but not supported"); - return -EOPNOTSUPP; -} - -#endif /* HAVE_SENDFILE && HAVE_SYS_SENDFILE_H */ - bool fs_obj_write_commit(struct backend_obj *bo, const char *user, unsigned char *md, bool sync_data) { diff --git a/chunkd/chunkd.h b/chunkd/chunkd.h index 1e1b1d3..1e3741a 100644 --- a/chunkd/chunkd.h +++ b/chunkd/chunkd.h @@ -48,8 +48,6 @@ enum { STD_COOKIE_MIN = 7, STD_TRASH_MAX = 1000, - - CLI_MAX_SENDFILE_SZ = 512 * 1024, }; struct client; @@ -63,7 +61,6 @@ struct client_write { uint64_t len; /* write buffer length */ cli_write_func cb; /* callback */ void *cb_data; /* data passed to cb */ - bool sendfile; /* using sendfile? */ struct list_head node; }; @@ -275,7 +272,6 @@ extern bool fs_obj_delete(uint32_t table_id, const char *user, const void *kbuf, size_t klen, enum chunk_errcode *err_code); extern int fs_obj_disable(const char *fn); -extern ssize_t fs_obj_sendfile(struct backend_obj *bo, int out_fd, size_t len); extern int fs_list_objs_open(struct fs_obj_lister *t, const char *root_path, uint32_t table_id); extern int fs_list_objs_next(struct fs_obj_lister *t, char **fnp); @@ -330,7 +326,6 @@ extern void applog(int prio, const char *fmt, ...); extern bool cli_err(struct client *cli, enum chunk_errcode code, bool recycle_ok); extern int cli_writeq(struct client *cli, const void *buf, unsigned int buflen, cli_write_func cb, void *cb_data); -extern bool cli_wr_sendfile(struct client *, cli_write_func); extern bool cli_rd_set_poll(struct client *cli, bool readable); extern void cli_wr_set_poll(struct client *cli, bool writable); extern bool cli_cb_free(struct client *cli, struct client_write *wr, @@ -349,15 +344,6 @@ extern void read_config(void); /* selfcheck.c */ extern int chk_spawn(TCHDB *hdb); -static inline bool use_sendfile(struct client *cli) -{ -#if defined(HAVE_SENDFILE) && defined(HAVE_SYS_SENDFILE_H) - return cli->ssl ? false : true; -#else - return false; -#endif -} - #ifndef HAVE_STRNLEN extern size_t strnlen(const char *s, size_t maxlen); #endif diff --git a/chunkd/object.c b/chunkd/object.c index bb9e696..badd199 100644 --- a/chunkd/object.c +++ b/chunkd/object.c @@ -252,28 +252,23 @@ void cli_in_end(struct client *cli) static bool object_read_bytes(struct client *cli) { - if (use_sendfile(cli)) { - if (!cli_wr_sendfile(cli, object_get_more)) - return false; - } else { - ssize_t bytes; + ssize_t bytes; - bytes = fs_obj_read(cli->in_obj, cli->netbuf_out, - MIN(cli->in_len, CLI_DATA_BUF_SZ)); - if (bytes < 0) - return false; - if (bytes == 0 && cli->in_len != 0) - return false; + bytes = fs_obj_read(cli->in_obj, cli->netbuf_out, + MIN(cli->in_len, CLI_DATA_BUF_SZ)); + if (bytes < 0) + return false; + if (bytes == 0 && cli->in_len != 0) + return false; - cli->in_len -= bytes; + cli->in_len -= bytes; - if (!cli->in_len) - cli_in_end(cli); + if (!cli->in_len) + cli_in_end(cli); - if (cli_writeq(cli, cli->netbuf_out, bytes, - cli->in_len ? object_get_more : NULL, NULL)) - return false; - } + if (cli_writeq(cli, cli->netbuf_out, bytes, + cli->in_len ? object_get_more : NULL, NULL)) + return false; return true; } diff --git a/chunkd/server.c b/chunkd/server.c index c3984e9..783415a 100644 --- a/chunkd/server.c +++ b/chunkd/server.c @@ -504,14 +504,7 @@ restart: /* execute non-blocking write */ do_write: - if (tmp->sendfile) { - rc = fs_obj_sendfile(cli->in_obj, cli->fd, - MIN(cli->in_len, CLI_MAX_SENDFILE_SZ)); - if (rc < 0) - goto err_out; - - cli->in_len -= rc; - } else if (cli->ssl) { + if (cli->ssl) { rc = SSL_write(cli->ssl, tmp->buf, tmp->len); if (rc <= 0) { rc = SSL_get_error(cli->ssl, rc); @@ -612,31 +605,12 @@ int cli_writeq(struct client *cli, const void *buf, unsigned int buflen, wr->len = buflen; wr->cb = cb; wr->cb_data = cb_data; - wr->sendfile = false; list_add_tail(&wr->node, &cli->write_q); return 0; } -bool cli_wr_sendfile(struct client *cli, cli_write_func cb) -{ - struct client_write *wr; - - wr = calloc(1, sizeof(struct client_write)); - if (!wr) - return false; - - wr->len = cli->in_len; - wr->cb = cb; - wr->sendfile = true; - INIT_LIST_HEAD(&wr->node); - - list_add_tail(&wr->node, &cli->write_q); - - return true; -} - static int cli_read_data(struct client *cli, void *buf, size_t buflen) { ssize_t rc; diff --git a/configure.ac b/configure.ac index 6b48f1e..db10242 100644 --- a/configure.ac +++ b/configure.ac @@ -65,7 +65,6 @@ AM_PROG_LIBTOOL dnl Checks for header files. AC_HEADER_STDC dnl AC_CHECK_HEADERS(sys/ioctl.h unistd.h) -AC_CHECK_HEADERS(sys/sendfile.h sys/filio.h) AC_CHECK_HEADER(db.h,[],exit 1) dnl Checks for typedefs, structures, and compiler characteristics. @@ -97,7 +96,7 @@ PKG_CHECK_MODULES(TOKYOCABINET, tokyocabinet) dnl ------------------------------------- dnl Checks for optional library functions dnl ------------------------------------- -AC_CHECK_FUNCS(strnlen daemon memmem memrchr sendfile) +AC_CHECK_FUNCS(strnlen daemon memmem memrchr) AC_CHECK_FUNC(xdr_sizeof, [AC_DEFINE([HAVE_XDR_SIZEOF], [1], [Define to 1 if you have xdr_sizeof.])], -- To unsubscribe from this list: send the line "unsubscribe hail-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html