aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2012-02-28 11:09:02 +0000
committerMaxim Dounin <mdounin@mdounin.ru>2012-02-28 11:09:02 +0000
commitc66a1e7a172e042e8a3822192e79853e2afac4e6 (patch)
treed7ad47d4d0cae80e0743e494717a01ee27ebdad6 /src
parent7ca6c1ff782afbb83b9f17d6552566c823247e29 (diff)
downloadnginx-c66a1e7a172e042e8a3822192e79853e2afac4e6.tar.gz
nginx-c66a1e7a172e042e8a3822192e79853e2afac4e6.zip
Workaround for fs_size on ZFS (ticket #46).
ZFS reports incorrect st_blocks until file settles on disk, and this may take a while (i.e. just after creation of a file the st_blocks value is incorrect). As a workaround we now use st_blocks only if st_blocks * 512 > st_size, this should fix ZFS problems while still preserving accuracy for other filesystems. The problem had appeared in r3900 (1.0.1).
Diffstat (limited to 'src')
-rw-r--r--src/os/unix/ngx_files.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h
index 1a35cba17..ffe732c47 100644
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -180,7 +180,7 @@ ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s);
#define ngx_is_exec(sb) (((sb)->st_mode & S_IXUSR) == S_IXUSR)
#define ngx_file_access(sb) ((sb)->st_mode & 0777)
#define ngx_file_size(sb) (sb)->st_size
-#define ngx_file_fs_size(sb) ((sb)->st_blocks * 512)
+#define ngx_file_fs_size(sb) ngx_max((sb)->st_size, (sb)->st_blocks * 512)
#define ngx_file_mtime(sb) (sb)->st_mtime
#define ngx_file_uniq(sb) (sb)->st_ino
@@ -276,7 +276,8 @@ ngx_de_info(u_char *name, ngx_dir_t *dir)
#define ngx_de_access(dir) (((dir)->info.st_mode) & 0777)
#define ngx_de_size(dir) (dir)->info.st_size
-#define ngx_de_fs_size(dir) ((dir)->info.st_blocks * 512)
+#define ngx_de_fs_size(dir) \
+ ngx_max((dir)->info.st_size, (dir)->info.st_blocks * 512)
#define ngx_de_mtime(dir) (dir)->info.st_mtime