allow directio on XFS

This commit is contained in:
Igor Sysoev 2008-11-20 16:21:39 +00:00
parent 1bf7dc1884
commit 7f3c048e21

View File

@ -13,6 +13,17 @@
#define NGX_SENDFILE_LIMIT 4096 #define NGX_SENDFILE_LIMIT 4096
#endif #endif
/*
* When DIRECTIO is enabled FreeBSD, Solaris, and MacOSX read directly
* to an application memory from a device if parameters are aligned
* to device sector boundary(512 bytes). They fallback to usual read
* operation if the parameters are not aligned.
* Linux allows DIRECTIO only if the parameters are aligned to a filesystem
* sector boundary, otherwise it returns EINVAL. The sector size is
* usually 512 bytes, however, on XFS it may be 4096 bytes.
*/
#define NGX_DIRECTIO_BLOCK 4096
#define NGX_NONE 1 #define NGX_NONE 1
@ -327,7 +338,7 @@ ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)
ctx->directio = 1; ctx->directio = 1;
size = (size_t) (in->file_pos - (in->file_pos & ~511)); size = (size_t) (in->file_pos - (in->file_pos & ~(NGX_DIRECTIO_BLOCK - 1)));
if (size == 0) { if (size == 0) {
@ -338,7 +349,7 @@ ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)
size = (size_t) bsize; size = (size_t) bsize;
} else { } else {
size = 512 - size; size = NGX_DIRECTIO_BLOCK - size;
if ((off_t) size > bsize) { if ((off_t) size > bsize) {
size = (size_t) bsize; size = (size_t) bsize;
@ -413,7 +424,7 @@ ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize)
* userland buffer direct usage conjunctly with directio * userland buffer direct usage conjunctly with directio
*/ */
b->start = ngx_pmemalign(ctx->pool, size, 512); b->start = ngx_pmemalign(ctx->pool, size, NGX_DIRECTIO_BLOCK);
if (b->start == NULL) { if (b->start == NULL) {
return NGX_ERROR; return NGX_ERROR;
} }