annotate src/core/ngx_open_file_cache.c @ 5356:acd51b0f6fd4

Disable symlinks: use O_PATH to open path components. It was introduced in Linux 2.6.39, glibc 2.14 and allows to obtain file descriptors without actually opening files. Thus made it possible to traverse path with openat() syscalls without the need to have read permissions for path components. It is effectively emulates O_SEARCH which is missing on Linux. O_PATH is used in combination with O_RDONLY. The last one is ignored if O_PATH is used, but it allows nginx to not fail when it was built on modern system (i.e. glibc 2.14+) and run with a kernel older than 2.6.39. Then O_PATH is unknown to the kernel and ignored, while O_RDONLY is used. Sadly, fstat() is not working with O_PATH descriptors till Linux 3.6. As a workaround we fallback to fstatat() with the AT_EMPTY_PATH flag that was introduced at the same time as O_PATH.
author Valentin Bartenev <vbart@nginx.com>
date Mon, 02 Sep 2013 08:07:59 +0400
parents 6b479db5b52b
children 659464c695b7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4101
diff changeset
4 * Copyright (C) Nginx, Inc.
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_event.h>
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 /*
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 * open file cache caches
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 * open file handles with stat() info;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 * directories stat() info;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 * files and directories errors: not found, access denied, etc.
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
21 #define NGX_MIN_READ_AHEAD (128 * 1024)
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
22
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
23
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 static void ngx_open_file_cache_cleanup(void *data);
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
25 #if (NGX_HAVE_OPENAT)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
26 static ngx_fd_t ngx_openat_file_owner(ngx_fd_t at_fd, const u_char *name,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
27 ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log);
5356
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
28 #if (NGX_HAVE_O_PATH)
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
29 static ngx_int_t ngx_file_o_path_info(ngx_fd_t fd, ngx_file_info_t *fi,
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
30 ngx_log_t *log);
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
31 #endif
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
32 #endif
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
33 static ngx_fd_t ngx_open_file_wrapper(ngx_str_t *name,
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
34 ngx_open_file_info_t *of, ngx_int_t mode, ngx_int_t create,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
35 ngx_int_t access, ngx_log_t *log);
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
36 static ngx_int_t ngx_file_info_wrapper(ngx_str_t *name,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
37 ngx_open_file_info_t *of, ngx_file_info_t *fi, ngx_log_t *log);
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
38 static ngx_int_t ngx_open_and_stat_file(ngx_str_t *name,
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
39 ngx_open_file_info_t *of, ngx_log_t *log);
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
40 static void ngx_open_file_add_event(ngx_open_file_cache_t *cache,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
41 ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 static void ngx_open_file_cleanup(void *data);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 static void ngx_close_cached_file(ngx_open_file_cache_t *cache,
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
44 ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log);
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
45 static void ngx_open_file_del_event(ngx_cached_open_file_t *file);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 static void ngx_expire_old_cached_files(ngx_open_file_cache_t *cache,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 ngx_uint_t n, ngx_log_t *log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 static void ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
50 static ngx_cached_open_file_t *
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
51 ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
52 uint32_t hash);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 static void ngx_open_file_cache_remove(ngx_event_t *ev);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 ngx_open_file_cache_t *
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 ngx_pool_cleanup_t *cln;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 ngx_open_file_cache_t *cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t));
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 if (cache == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 return NULL;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66
1761
1c4b231ba90c embed sentinel
Igor Sysoev <igor@sysoev.ru>
parents: 1743
diff changeset
67 ngx_rbtree_init(&cache->rbtree, &cache->sentinel,
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1458
diff changeset
68 ngx_open_file_cache_rbtree_insert_value);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
70 ngx_queue_init(&cache->expire_queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
71
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 cache->current = 0;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 cache->max = max;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 cache->inactive = inactive;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 cln = ngx_pool_cleanup_add(pool, 0);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 if (cln == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 return NULL;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 cln->handler = ngx_open_file_cache_cleanup;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 cln->data = cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 return cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 ngx_open_file_cache_cleanup(void *data)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 ngx_open_file_cache_t *cache = data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
93 ngx_queue_t *q;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 "open file cache cleanup");
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 for ( ;; ) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
101 if (ngx_queue_empty(&cache->expire_queue)) {
1766
111eb827ed44 fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 1765
diff changeset
102 break;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
105 q = ngx_queue_last(&cache->expire_queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
106
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
107 file = ngx_queue_data(q, ngx_cached_open_file_t, queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
108
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
109 ngx_queue_remove(q);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 ngx_rbtree_delete(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 "delete cached open file: %s", file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 if (!file->err && !file->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 file->close = 1;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 file->count = 0;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
121 ngx_close_cached_file(cache, file, 0, ngx_cycle->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 } else {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 ngx_free(file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 if (cache->current) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
5327
6b479db5b52b Format specifier fixes in error logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 4497
diff changeset
131 "%ui items still leave in open file cache",
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 cache->current);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 if (cache->rbtree.root != cache->rbtree.sentinel) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 "rbtree still is not empty in open file cache");
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 ngx_int_t
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 ngx_open_file_info_t *of, ngx_pool_t *pool)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 time_t now;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 uint32_t hash;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 ngx_int_t rc;
2756
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
150 ngx_file_info_t fi;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 ngx_pool_cleanup_t *cln;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 ngx_pool_cleanup_file_t *clnf;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 ngx_open_file_cache_cleanup_t *ofcln;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
156 of->fd = NGX_INVALID_FILE;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 of->err = 0;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 if (cache == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160
2756
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
161 if (of->test_only) {
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
162
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
163 if (ngx_file_info_wrapper(name, of, &fi, pool->log)
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
164 == NGX_FILE_ERROR)
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
165 {
2756
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
166 return NGX_ERROR;
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
167 }
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
168
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
169 of->uniq = ngx_file_uniq(&fi);
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
170 of->mtime = ngx_file_mtime(&fi);
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
171 of->size = ngx_file_size(&fi);
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3497
diff changeset
172 of->fs_size = ngx_file_fs_size(&fi);
2756
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
173 of->is_dir = ngx_is_dir(&fi);
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
174 of->is_file = ngx_is_file(&fi);
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
175 of->is_link = ngx_is_link(&fi);
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
176 of->is_exec = ngx_is_exec(&fi);
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
177
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
178 return NGX_OK;
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
179 }
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2629
diff changeset
180
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 if (cln == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
186 rc = ngx_open_and_stat_file(name, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 if (rc == NGX_OK && !of->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 cln->handler = ngx_pool_cleanup_file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 clnf = cln->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 clnf->fd = of->fd;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 clnf->name = name->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 clnf->log = pool->log;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 return rc;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 cln = ngx_pool_cleanup_add(pool, sizeof(ngx_open_file_cache_cleanup_t));
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 if (cln == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 now = ngx_time();
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
207 hash = ngx_crc32_long(name->data, name->len);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
208
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
209 file = ngx_open_file_lookup(cache, name, hash);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
210
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
211 if (file) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
212
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
213 file->uses++;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
214
1987
0e628cf11c29 back out the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 1986
diff changeset
215 ngx_queue_remove(&file->queue);
0e628cf11c29 back out the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 1986
diff changeset
216
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
217 if (file->fd == NGX_INVALID_FILE && file->err == 0 && !file->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
218
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
219 /* file was not used often enough to keep open */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
220
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
221 rc = ngx_open_and_stat_file(name, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
223 if (rc != NGX_OK && (of->err == 0 || !of->errors)) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
224 goto failed;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
225 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
226
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
227 goto add_event;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
230 if (file->use_event
2063
67a29af877ed initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents: 2006
diff changeset
231 || (file->event == NULL
67a29af877ed initialize of.uniq in ngx_open_cached_file()
Igor Sysoev <igor@sysoev.ru>
parents: 2006
diff changeset
232 && (of->uniq == 0 || of->uniq == file->uniq)
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
233 && now - file->created < of->valid
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
234 #if (NGX_HAVE_OPENAT)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
235 && of->disable_symlinks == file->disable_symlinks
4493
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
236 && of->disable_symlinks_from == file->disable_symlinks_from
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
237 #endif
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
238 ))
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
239 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
240 if (file->err == 0) {
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
241
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
242 of->fd = file->fd;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
243 of->uniq = file->uniq;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
244 of->mtime = file->mtime;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
245 of->size = file->size;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
247 of->is_dir = file->is_dir;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
248 of->is_file = file->is_file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
249 of->is_link = file->is_link;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
250 of->is_exec = file->is_exec;
2246
987831d73bd8 cache directio flag in open file cache
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
251 of->is_directio = file->is_directio;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
253 if (!file->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
254 file->count++;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
255 ngx_open_file_add_event(cache, file, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
258 } else {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
259 of->err = file->err;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
260 #if (NGX_HAVE_OPENAT)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
261 of->failed = file->disable_symlinks ? ngx_openat_file_n
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
262 : ngx_open_file_n;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
263 #else
2783
87c088e6956a set of.failed for cached error, the bug has been introduced in r2757
Igor Sysoev <igor@sysoev.ru>
parents: 2782
diff changeset
264 of->failed = ngx_open_file_n;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
265 #endif
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
266 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
267
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
268 goto found;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
269 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
270
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
271 ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
272 "retest open file: %s, fd:%d, c:%d, e:%d",
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
273 file->name, file->fd, file->count, file->err);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
275 if (file->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
276
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
277 /*
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
278 * chances that directory became file are very small
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
279 * so test_dir flag allows to use a single syscall
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
280 * in ngx_file_info() instead of three syscalls
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
281 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
282
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
283 of->test_dir = 1;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
284 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
285
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
286 of->fd = file->fd;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
287 of->uniq = file->uniq;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
288
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
289 rc = ngx_open_and_stat_file(name, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
291 if (rc != NGX_OK && (of->err == 0 || !of->errors)) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
292 goto failed;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
293 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
294
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
295 if (of->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
296
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
297 if (file->is_dir || file->err) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
298 goto update;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
299 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
300
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
301 /* file became directory */
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
303 } else if (of->err == 0) { /* file */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
304
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
305 if (file->is_dir || file->err) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
306 goto add_event;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
307 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
309 if (of->uniq == file->uniq) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
311 if (file->event) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
312 file->use_event = 1;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314
4101
31cf2902de60 Fix of the previous commit: is_directio flag processing introduced in r4077
Igor Sysoev <igor@sysoev.ru>
parents: 4100
diff changeset
315 of->is_directio = file->is_directio;
31cf2902de60 Fix of the previous commit: is_directio flag processing introduced in r4077
Igor Sysoev <igor@sysoev.ru>
parents: 4100
diff changeset
316
4100
efeee901439a Bugfix: open_file_cache did not update file info on retest.
Igor Sysoev <igor@sysoev.ru>
parents: 4076
diff changeset
317 goto update;
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
318 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
320 /* file was changed */
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
322 } else { /* error to cache */
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
324 if (file->err || file->is_dir) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
325 goto update;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
328 /* file was removed, etc. */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
329 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
330
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
331 if (file->count == 0) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
332
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
333 ngx_open_file_del_event(file);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
335 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
336 ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
337 ngx_close_file_n " \"%V\" failed", name);
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
338 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
340 goto add_event;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
341 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
342
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
343 ngx_rbtree_delete(&cache->rbtree, &file->node);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
344
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
345 cache->current--;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
346
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
347 file->close = 1;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
348
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
349 goto create;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352 /* not found */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
354 rc = ngx_open_and_stat_file(name, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356 if (rc != NGX_OK && (of->err == 0 || !of->errors)) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 goto failed;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 create:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362 if (cache->current >= cache->max) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 ngx_expire_old_cached_files(cache, 0, pool->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 file = ngx_alloc(sizeof(ngx_cached_open_file_t), pool->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
368 if (file == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 goto failed;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 file->name = ngx_alloc(name->len + 1, pool->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 if (file->name == NULL) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 file = NULL;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377 goto failed;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 ngx_cpystrn(file->name, name->data, name->len + 1);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 file->node.key = hash;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 ngx_rbtree_insert(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 cache->current++;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
388 file->uses = 1;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 file->count = 0;
2934
b6d588fa3ee9 initialize use_event field in open file cache
Igor Sysoev <igor@sysoev.ru>
parents: 2783
diff changeset
390 file->use_event = 0;
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
391 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
392
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
393 add_event:
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
394
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
395 ngx_open_file_add_event(cache, file, of, pool->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 update:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 file->fd = of->fd;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 file->err = of->err;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
401 #if (NGX_HAVE_OPENAT)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
402 file->disable_symlinks = of->disable_symlinks;
4493
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
403 file->disable_symlinks_from = of->disable_symlinks_from;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
404 #endif
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406 if (of->err == 0) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 file->uniq = of->uniq;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408 file->mtime = of->mtime;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 file->size = of->size;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411 file->close = 0;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 file->is_dir = of->is_dir;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 file->is_file = of->is_file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415 file->is_link = of->is_link;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 file->is_exec = of->is_exec;
2246
987831d73bd8 cache directio flag in open file cache
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
417 file->is_directio = of->is_directio;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 if (!of->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 file->count++;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424 file->created = now;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 found:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 file->accessed = now;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
430 ngx_queue_insert_head(&cache->expire_queue, &file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
432 ngx_log_debug5(NGX_LOG_DEBUG_CORE, pool->log, 0,
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
433 "cached open file: %s, fd:%d, c:%d, e:%d, u:%d",
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
434 file->name, file->fd, file->count, file->err, file->uses);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 if (of->err == 0) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 if (!of->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 cln->handler = ngx_open_file_cleanup;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 ofcln = cln->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 ofcln->cache = cache;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443 ofcln->file = file;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
444 ofcln->min_uses = of->min_uses;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 ofcln->log = pool->log;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 return NGX_OK;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 failed:
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
455 if (file) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 ngx_rbtree_delete(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458 cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
460 if (file->count == 0) {
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
461
2006
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
462 if (file->fd != NGX_INVALID_FILE) {
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
463 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
464 ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
465 ngx_close_file_n " \"%s\" failed",
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
466 file->name);
2006
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
467 }
b52cb9bf2064 style fix: remove tabs and trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1988
diff changeset
468 }
1988
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
469
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
470 ngx_free(file->name);
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
471 ngx_free(file);
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
472
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
473 } else {
34051c712e41 fix segfault when file is deleted and open_file_cache_errors is off
Igor Sysoev <igor@sysoev.ru>
parents: 1987
diff changeset
474 file->close = 1;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 if (of->fd != NGX_INVALID_FILE) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 if (ngx_close_file(of->fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480 ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
481 ngx_close_file_n " \"%V\" failed", name);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
489 #if (NGX_HAVE_OPENAT)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
490
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
491 static ngx_fd_t
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
492 ngx_openat_file_owner(ngx_fd_t at_fd, const u_char *name,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
493 ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log)
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
494 {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
495 ngx_fd_t fd;
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
496 ngx_err_t err;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
497 ngx_file_info_t fi, atfi;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
498
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
499 /*
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
500 * To allow symlinks with the same owner, use openat() (followed
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
501 * by fstat()) and fstatat(AT_SYMLINK_NOFOLLOW), and then compare
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
502 * uids between fstat() and fstatat().
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
503 *
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
504 * As there is a race between openat() and fstatat() we don't
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
505 * know if openat() in fact opened symlink or not. Therefore,
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
506 * we have to compare uids even if fstatat() reports the opened
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
507 * component isn't a symlink (as we don't know whether it was
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
508 * symlink during openat() or not).
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
509 */
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
510
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
511 fd = ngx_openat_file(at_fd, name, mode, create, access);
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
512
4486
a996bb40a0bb Disable symlinks: cleanups once again.
Valentin Bartenev <vbart@nginx.com>
parents: 4485
diff changeset
513 if (fd == NGX_INVALID_FILE) {
a996bb40a0bb Disable symlinks: cleanups once again.
Valentin Bartenev <vbart@nginx.com>
parents: 4485
diff changeset
514 return NGX_INVALID_FILE;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
515 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
516
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
517 if (ngx_file_at_info(at_fd, name, &atfi, AT_SYMLINK_NOFOLLOW)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
518 == NGX_FILE_ERROR)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
519 {
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
520 err = ngx_errno;
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
521 goto failed;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
522 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
523
5356
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
524 #if (NGX_HAVE_O_PATH)
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
525 if (ngx_file_o_path_info(fd, &fi, log) == NGX_ERROR) {
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
526 err = ngx_errno;
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
527 goto failed;
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
528 }
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
529 #else
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
530 if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
531 err = ngx_errno;
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
532 goto failed;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
533 }
5356
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
534 #endif
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
535
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
536 if (fi.st_uid != atfi.st_uid) {
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
537 err = NGX_ELOOP;
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
538 goto failed;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
539 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
540
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
541 return fd;
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
542
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
543 failed:
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
544
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
545 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
546 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
547 ngx_close_file_n " \"%V\" failed", name);
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
548 }
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
549
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
550 ngx_set_errno(err);
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
551
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
552 return NGX_INVALID_FILE;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
553 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
554
5356
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
555
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
556 #if (NGX_HAVE_O_PATH)
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
557
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
558 static ngx_int_t
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
559 ngx_file_o_path_info(ngx_fd_t fd, ngx_file_info_t *fi, ngx_log_t *log)
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
560 {
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
561 static ngx_uint_t use_fstat = 1;
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
562
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
563 /*
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
564 * In Linux 2.6.39 the O_PATH flag was introduced that allows to obtain
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
565 * a descriptor without actually opening file or directory. It requires
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
566 * less permissions for path components, but till Linux 3.6 fstat() returns
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
567 * EBADF on such descriptors, and fstatat() with the AT_EMPTY_PATH flag
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
568 * should be used instead.
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
569 *
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
570 * Three scenarios are handled in this function:
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
571 *
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
572 * 1) The kernel is newer than 3.6 or fstat() with O_PATH support was
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
573 * backported by vendor. Then fstat() is used.
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
574 *
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
575 * 2) The kernel is newer than 2.6.39 but older than 3.6. In this case
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
576 * the first call of fstat() returns EBADF and we fallback to fstatat()
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
577 * with AT_EMPTY_PATH which was introduced at the same time as O_PATH.
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
578 *
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
579 * 3) The kernel is older than 2.6.39 but nginx was build with O_PATH
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
580 * support. Since descriptors are opened with O_PATH|O_RDONLY flags
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
581 * and O_PATH is ignored by the kernel then the O_RDONLY flag is
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
582 * actually used. In this case fstat() just works.
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
583 */
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
584
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
585 if (use_fstat) {
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
586 if (ngx_fd_info(fd, fi) != NGX_FILE_ERROR) {
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
587 return NGX_OK;
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
588 }
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
589
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
590 if (ngx_errno != NGX_EBADF) {
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
591 return NGX_ERROR;
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
592 }
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
593
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
594 ngx_log_error(NGX_LOG_NOTICE, log, 0,
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
595 "fstat(O_PATH) failed with EBADF, "
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
596 "switching to fstatat(AT_EMPTY_PATH)");
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
597
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
598 use_fstat = 0;
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
599 return ngx_file_o_path_info(fd, fi, log);
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
600 }
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
601
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
602 if (ngx_file_at_info(fd, "", fi, AT_EMPTY_PATH) != NGX_FILE_ERROR) {
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
603 return NGX_OK;
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
604 }
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
605
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
606 return NGX_ERROR;
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
607 }
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
608
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
609 #endif
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
610
5356
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
611 #endif /* NGX_HAVE_OPENAT */
acd51b0f6fd4 Disable symlinks: use O_PATH to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 5327
diff changeset
612
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
613
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
614 static ngx_fd_t
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
615 ngx_open_file_wrapper(ngx_str_t *name, ngx_open_file_info_t *of,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
616 ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log)
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
617 {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
618 ngx_fd_t fd;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
619
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
620 #if !(NGX_HAVE_OPENAT)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
621
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
622 fd = ngx_open_file(name->data, mode, create, access);
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
623
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
624 if (fd == NGX_INVALID_FILE) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
625 of->err = ngx_errno;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
626 of->failed = ngx_open_file_n;
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
627 return NGX_INVALID_FILE;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
628 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
629
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
630 return fd;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
631
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
632 #else
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
633
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
634 u_char *p, *cp, *end;
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
635 ngx_fd_t at_fd;
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
636 ngx_str_t at_name;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
637
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
638 if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
639 fd = ngx_open_file(name->data, mode, create, access);
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
640
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
641 if (fd == NGX_INVALID_FILE) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
642 of->err = ngx_errno;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
643 of->failed = ngx_open_file_n;
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
644 return NGX_INVALID_FILE;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
645 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
646
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
647 return fd;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
648 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
649
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
650 p = name->data;
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
651 end = p + name->len;
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
652
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
653 at_name = *name;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
654
4493
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
655 if (of->disable_symlinks_from) {
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
656
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
657 cp = p + of->disable_symlinks_from;
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
658
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
659 *cp = '\0';
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
660
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
661 at_fd = ngx_open_file(p, NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
662 NGX_FILE_OPEN, 0);
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
663
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
664 *cp = '/';
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
665
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
666 if (at_fd == NGX_INVALID_FILE) {
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
667 of->err = ngx_errno;
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
668 of->failed = ngx_open_file_n;
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
669 return NGX_INVALID_FILE;
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
670 }
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
671
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
672 at_name.len = of->disable_symlinks_from;
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
673 p = cp + 1;
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
674
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
675 } else if (*p == '/') {
47ece8818978 Disable symlinks: added the "from" parameter support to the open file cache.
Valentin Bartenev <vbart@nginx.com>
parents: 4488
diff changeset
676
4486
a996bb40a0bb Disable symlinks: cleanups once again.
Valentin Bartenev <vbart@nginx.com>
parents: 4485
diff changeset
677 at_fd = ngx_open_file("/",
4488
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
678 NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,
4486
a996bb40a0bb Disable symlinks: cleanups once again.
Valentin Bartenev <vbart@nginx.com>
parents: 4485
diff changeset
679 NGX_FILE_OPEN, 0);
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
680
4484
f78a29a2f9e6 Disable symlinks: error handling cleanup again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4480
diff changeset
681 if (at_fd == NGX_INVALID_FILE) {
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
682 of->err = ngx_errno;
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
683 of->failed = ngx_openat_file_n;
4484
f78a29a2f9e6 Disable symlinks: error handling cleanup again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4480
diff changeset
684 return NGX_INVALID_FILE;
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
685 }
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
686
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
687 at_name.len = 1;
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
688 p++;
4486
a996bb40a0bb Disable symlinks: cleanups once again.
Valentin Bartenev <vbart@nginx.com>
parents: 4485
diff changeset
689
a996bb40a0bb Disable symlinks: cleanups once again.
Valentin Bartenev <vbart@nginx.com>
parents: 4485
diff changeset
690 } else {
a996bb40a0bb Disable symlinks: cleanups once again.
Valentin Bartenev <vbart@nginx.com>
parents: 4485
diff changeset
691 at_fd = NGX_AT_FDCWD;
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
692 }
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
693
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
694 for ( ;; ) {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
695 cp = ngx_strlchr(p, end, '/');
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
696 if (cp == NULL) {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
697 break;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
698 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
699
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
700 if (cp == p) {
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
701 p++;
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
702 continue;
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
703 }
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
704
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
705 *cp = '\0';
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
706
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
707 if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_NOTOWNER) {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
708 fd = ngx_openat_file_owner(at_fd, p,
4488
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
709 NGX_FILE_SEARCH|NGX_FILE_NONBLOCK,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
710 NGX_FILE_OPEN, 0, log);
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
711
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
712 } else {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
713 fd = ngx_openat_file(at_fd, p,
4488
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
714 NGX_FILE_SEARCH|NGX_FILE_NONBLOCK|NGX_FILE_NOFOLLOW,
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
715 NGX_FILE_OPEN, 0);
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
716 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
717
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
718 *cp = '/';
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
719
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
720 if (fd == NGX_INVALID_FILE) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
721 of->err = ngx_errno;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
722 of->failed = ngx_openat_file_n;
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
723 goto failed;
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
724 }
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
725
4485
f7d131008e9c Disable symlinks: added explicit cast of AT_FDCWD (ticket #111).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4484
diff changeset
726 if (at_fd != NGX_AT_FDCWD && ngx_close_file(at_fd) == NGX_FILE_ERROR) {
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
727 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
4484
f78a29a2f9e6 Disable symlinks: error handling cleanup again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4480
diff changeset
728 ngx_close_file_n " \"%V\" failed", &at_name);
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
729 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
730
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
731 p = cp + 1;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
732 at_fd = fd;
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
733 at_name.len = cp - at_name.data;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
734 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
735
4486
a996bb40a0bb Disable symlinks: cleanups once again.
Valentin Bartenev <vbart@nginx.com>
parents: 4485
diff changeset
736 if (p == end) {
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
737
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
738 /*
4488
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
739 * If pathname ends with a trailing slash, assume the last path
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
740 * component is a directory and reopen it with requested flags;
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
741 * if not, fail with ENOTDIR as per POSIX.
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
742 *
4488
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
743 * We cannot rely on O_DIRECTORY in the loop above to check
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
744 * that the last path component is a directory because
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
745 * O_DIRECTORY doesn't work on FreeBSD 8. Fortunately, by
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
746 * reopening a directory, we don't depend on it at all.
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
747 */
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
748
4488
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
749 fd = ngx_openat_file(at_fd, ".", mode, create, access);
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
750 goto done;
4480
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
751 }
5a3cb84545e5 Disable symlinks: fixed edge cases of path handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4479
diff changeset
752
4487
a786c85e8268 Disable symlinks: don't allow creating or truncating a file via a symlink in
Valentin Bartenev <vbart@nginx.com>
parents: 4486
diff changeset
753 if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_NOTOWNER
a786c85e8268 Disable symlinks: don't allow creating or truncating a file via a symlink in
Valentin Bartenev <vbart@nginx.com>
parents: 4486
diff changeset
754 && !(create & (NGX_FILE_CREATE_OR_OPEN|NGX_FILE_TRUNCATE)))
a786c85e8268 Disable symlinks: don't allow creating or truncating a file via a symlink in
Valentin Bartenev <vbart@nginx.com>
parents: 4486
diff changeset
755 {
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
756 fd = ngx_openat_file_owner(at_fd, p, mode, create, access, log);
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
757
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
758 } else {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
759 fd = ngx_openat_file(at_fd, p, mode|NGX_FILE_NOFOLLOW, create, access);
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
760 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
761
4488
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
762 done:
d33ce8cd0d70 Disable symlinks: use O_SEARCH|O_DIRECTORY to open path components.
Valentin Bartenev <vbart@nginx.com>
parents: 4487
diff changeset
763
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
764 if (fd == NGX_INVALID_FILE) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
765 of->err = ngx_errno;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
766 of->failed = ngx_openat_file_n;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
767 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
768
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
769 failed:
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
770
4485
f7d131008e9c Disable symlinks: added explicit cast of AT_FDCWD (ticket #111).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4484
diff changeset
771 if (at_fd != NGX_AT_FDCWD && ngx_close_file(at_fd) == NGX_FILE_ERROR) {
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
772 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
4484
f78a29a2f9e6 Disable symlinks: error handling cleanup again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4480
diff changeset
773 ngx_close_file_n " \"%V\" failed", &at_name);
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
774 }
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
775
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
776 return fd;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
777 #endif
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
778 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
779
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
780
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
781 static ngx_int_t
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
782 ngx_file_info_wrapper(ngx_str_t *name, ngx_open_file_info_t *of,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
783 ngx_file_info_t *fi, ngx_log_t *log)
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
784 {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
785 ngx_int_t rc;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
786
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
787 #if !(NGX_HAVE_OPENAT)
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
788
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
789 rc = ngx_file_info(name->data, fi);
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
790
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
791 if (rc == NGX_FILE_ERROR) {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
792 of->err = ngx_errno;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
793 of->failed = ngx_file_info_n;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
794 return NGX_FILE_ERROR;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
795 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
796
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
797 return rc;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
798
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
799 #else
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
800
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
801 ngx_fd_t fd;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
802
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
803 if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
804
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
805 rc = ngx_file_info(name->data, fi);
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
806
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
807 if (rc == NGX_FILE_ERROR) {
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
808 of->err = ngx_errno;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
809 of->failed = ngx_file_info_n;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
810 return NGX_FILE_ERROR;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
811 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
812
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
813 return rc;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
814 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
815
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
816 fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
817 NGX_FILE_OPEN, 0, log);
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
818
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
819 if (fd == NGX_INVALID_FILE) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
820 return NGX_FILE_ERROR;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
821 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
822
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
823 rc = ngx_fd_info(fd, fi);
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
824
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
825 if (rc == NGX_FILE_ERROR) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
826 of->err = ngx_errno;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
827 of->failed = ngx_fd_info_n;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
828 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
829
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
830 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
831 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
832 ngx_close_file_n " \"%V\" failed", name);
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
833 }
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
834
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
835 return rc;
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
836 #endif
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
837 }
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
838
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
839
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
840 static ngx_int_t
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
841 ngx_open_and_stat_file(ngx_str_t *name, ngx_open_file_info_t *of,
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
842 ngx_log_t *log)
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
843 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
844 ngx_fd_t fd;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
845 ngx_file_info_t fi;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
846
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
847 if (of->fd != NGX_INVALID_FILE) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
848
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
849 if (ngx_file_info_wrapper(name, of, &fi, log) == NGX_FILE_ERROR) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
850 of->fd = NGX_INVALID_FILE;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
851 return NGX_ERROR;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
852 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
853
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
854 if (of->uniq == ngx_file_uniq(&fi)) {
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
855 goto done;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
856 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
857
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
858 } else if (of->test_dir) {
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
859
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
860 if (ngx_file_info_wrapper(name, of, &fi, log) == NGX_FILE_ERROR) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
861 of->fd = NGX_INVALID_FILE;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
862 return NGX_ERROR;
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
863 }
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
864
2460
225fa4abd76f test ngx_file_info() result, the bug has been introduced in r2070
Igor Sysoev <igor@sysoev.ru>
parents: 2246
diff changeset
865 if (ngx_is_dir(&fi)) {
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
866 goto done;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
867 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
868 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
869
2072
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
870 if (!of->log) {
3497
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
871
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
872 /*
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
873 * Use non-blocking open() not to hang on FIFO files, etc.
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
874 * This flag has no effect on a regular files.
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
875 */
ac281bc4c187 use non-blocking open() not to hang on FIFO files, etc.
Igor Sysoev <igor@sysoev.ru>
parents: 3178
diff changeset
876
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
877 fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
878 NGX_FILE_OPEN, 0, log);
2072
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
879
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
880 } else {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
881 fd = ngx_open_file_wrapper(name, of, NGX_FILE_APPEND,
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
882 NGX_FILE_CREATE_OR_OPEN,
4479
5e6436812c9a Disable symlinks: cleanup error handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4477
diff changeset
883 NGX_FILE_DEFAULT_ACCESS, log);
2072
ee2fecdfdef7 variables in access_log
Igor Sysoev <igor@sysoev.ru>
parents: 2071
diff changeset
884 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
885
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
886 if (fd == NGX_INVALID_FILE) {
4477
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
887 of->fd = NGX_INVALID_FILE;
7033faf6dc3c Added disable_symlinks directive.
Andrey Belov <defan@nginx.com>
parents: 4476
diff changeset
888 return NGX_ERROR;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
889 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
890
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
891 if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
892 ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
893 ngx_fd_info_n " \"%V\" failed", name);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
894
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
895 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
896 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
897 ngx_close_file_n " \"%V\" failed", name);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
898 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
899
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
900 of->fd = NGX_INVALID_FILE;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
901
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
902 return NGX_ERROR;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
903 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
904
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
905 if (ngx_is_dir(&fi)) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
906 if (ngx_close_file(fd) == NGX_FILE_ERROR) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
907 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
908 ngx_close_file_n " \"%V\" failed", name);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
909 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
910
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
911 of->fd = NGX_INVALID_FILE;
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
912
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
913 } else {
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
914 of->fd = fd;
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
915
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
916 if (of->read_ahead && ngx_file_size(&fi) > NGX_MIN_READ_AHEAD) {
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
917 if (ngx_read_ahead(fd, of->read_ahead) == NGX_ERROR) {
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
918 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
919 ngx_read_ahead_n " \"%V\" failed", name);
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
920 }
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
921 }
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 3164
diff changeset
922
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
923 if (of->directio <= ngx_file_size(&fi)) {
3164
b1b1775698d5 uniform ngx_directio_on/off() interface with other file functions
Igor Sysoev <igor@sysoev.ru>
parents: 2934
diff changeset
924 if (ngx_directio_on(fd) == NGX_FILE_ERROR) {
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
925 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
4476
94ef9d25ec5b Changed ngx_open_and_stat_file() to use ngx_str_t.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
926 ngx_directio_on_n " \"%V\" failed", name);
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
927
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
928 } else {
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
929 of->is_directio = 1;
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
930 }
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2072
diff changeset
931 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
932 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
933
2069
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
934 done:
23930ccd2642 use ngx_file_info() and test uniq if file is already open
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
935
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
936 of->uniq = ngx_file_uniq(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
937 of->mtime = ngx_file_mtime(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
938 of->size = ngx_file_size(&fi);
3899
e7cd13b7f759 Use more precise stat.st_blocks to account cache size on Unix
Igor Sysoev <igor@sysoev.ru>
parents: 3497
diff changeset
939 of->fs_size = ngx_file_fs_size(&fi);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
940 of->is_dir = ngx_is_dir(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
941 of->is_file = ngx_is_file(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
942 of->is_link = ngx_is_link(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
943 of->is_exec = ngx_is_exec(&fi);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
944
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
945 return NGX_OK;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
946 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
947
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
948
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
949 /*
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
950 * we ignore any possible event setting error and
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
951 * fallback to usual periodic file retests
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
952 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
953
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
954 static void
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
955 ngx_open_file_add_event(ngx_open_file_cache_t *cache,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
956 ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
957 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
958 ngx_open_file_cache_event_t *fev;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
959
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
960 if (!(ngx_event_flags & NGX_USE_VNODE_EVENT)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
961 || !of->events
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
962 || file->event
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
963 || of->fd == NGX_INVALID_FILE
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
964 || file->uses < of->min_uses)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
965 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
966 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
967 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
968
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
969 file->use_event = 0;
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
970
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
971 file->event = ngx_calloc(sizeof(ngx_event_t), log);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
972 if (file->event== NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
973 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
974 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
975
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
976 fev = ngx_alloc(sizeof(ngx_open_file_cache_event_t), log);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
977 if (fev == NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
978 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
979 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
980 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
981 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
982
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
983 fev->fd = of->fd;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
984 fev->file = file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
985 fev->cache = cache;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
986
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
987 file->event->handler = ngx_open_file_cache_remove;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
988 file->event->data = fev;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
989
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
990 /*
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
991 * although vnode event may be called while ngx_cycle->poll
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
992 * destruction, however, cleanup procedures are run before any
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
993 * memory freeing and events will be canceled.
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
994 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
995
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
996 file->event->log = ngx_cycle->log;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
997
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
998 if (ngx_add_event(file->event, NGX_VNODE_EVENT, NGX_ONESHOT_EVENT)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
999 != NGX_OK)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1000 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1001 ngx_free(file->event->data);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1002 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1003 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1004 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1005 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1006
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1007 /*
2071
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
1008 * we do not set file->use_event here because there may be a race
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
1009 * condition: a file may be deleted between opening the file and
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
1010 * adding event, so we rely upon event notification only after
2d216377146a fix comment
Igor Sysoev <igor@sysoev.ru>
parents: 2070
diff changeset
1011 * one file revalidation on next file access
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1012 */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1013
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1014 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1015 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1016
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1017
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1018 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1019 ngx_open_file_cleanup(void *data)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1020 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1021 ngx_open_file_cache_cleanup_t *c = data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1022
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1023 c->file->count--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1024
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1025 ngx_close_cached_file(c->cache, c->file, c->min_uses, c->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1026
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1027 /* drop one or two expired open files */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1028 ngx_expire_old_cached_files(c->cache, 1, c->log);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1029 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1030
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1032 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1033 ngx_close_cached_file(ngx_open_file_cache_t *cache,
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1034 ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log)
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1035 {
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1036 ngx_log_debug5(NGX_LOG_DEBUG_CORE, log, 0,
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1037 "close cached open file: %s, fd:%d, c:%d, u:%d, %d",
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1038 file->name, file->fd, file->count, file->uses, file->close);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1040 if (!file->close) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1041
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1042 file->accessed = ngx_time();
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1043
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1044 ngx_queue_remove(&file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1045
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1046 ngx_queue_insert_head(&cache->expire_queue, &file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1047
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1048 if (file->uses >= min_uses || file->count) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1049 return;
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1050 }
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1051 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1052
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1053 ngx_open_file_del_event(file);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1054
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1055 if (file->count) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1056 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1057 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1058
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1059 if (file->fd != NGX_INVALID_FILE) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1060
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1061 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1062 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1063 ngx_close_file_n " \"%s\" failed", file->name);
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1064 }
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1065
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1066 file->fd = NGX_INVALID_FILE;
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1067 }
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1068
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1069 if (!file->close) {
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1070 return;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1071 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1072
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1073 ngx_free(file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1074 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1075 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1076
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1077
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1078 static void
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1079 ngx_open_file_del_event(ngx_cached_open_file_t *file)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1080 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1081 if (file->event == NULL) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1082 return;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1083 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1084
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1085 (void) ngx_del_event(file->event, NGX_VNODE_EVENT,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1086 file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1087
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1088 ngx_free(file->event->data);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1089 ngx_free(file->event);
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1090 file->event = NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1091 file->use_event = 0;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1092 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1093
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1094
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1095 static void
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1096 ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, ngx_uint_t n,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1097 ngx_log_t *log)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1098 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1099 time_t now;
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1100 ngx_queue_t *q;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1101 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1102
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1103 now = ngx_time();
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1104
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1105 /*
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1106 * n == 1 deletes one or two inactive files
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1107 * n == 0 deletes least recently used file by force
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1108 * and one or two inactive files
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1109 */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1110
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1111 while (n < 3) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1112
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1113 if (ngx_queue_empty(&cache->expire_queue)) {
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1114 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1115 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1116
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1117 q = ngx_queue_last(&cache->expire_queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1118
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1119 file = ngx_queue_data(q, ngx_cached_open_file_t, queue);
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1120
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1121 if (n++ != 0 && now - file->accessed <= cache->inactive) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1122 return;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1123 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1124
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1125 ngx_queue_remove(q);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1126
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1127 ngx_rbtree_delete(&cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1128
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1129 cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1130
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1131 ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1132 "expire cached open file: %s", file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1133
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1134 if (!file->err && !file->is_dir) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1135 file->close = 1;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1136 ngx_close_cached_file(cache, file, 0, log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1137
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1138 } else {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1139 ngx_free(file->name);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1140 ngx_free(file);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1141 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1142 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1143 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1144
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1145
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1146 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1147 ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1148 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1149 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1150 ngx_rbtree_node_t **p;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1151 ngx_cached_open_file_t *file, *file_temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1152
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1153 for ( ;; ) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1154
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1155 if (node->key < temp->key) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1156
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1157 p = &temp->left;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1158
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1159 } else if (node->key > temp->key) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1160
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1161 p = &temp->right;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1162
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1163 } else { /* node->key == temp->key */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1164
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1165 file = (ngx_cached_open_file_t *) node;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1166 file_temp = (ngx_cached_open_file_t *) temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1167
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1168 p = (ngx_strcmp(file->name, file_temp->name) < 0)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1169 ? &temp->left : &temp->right;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1170 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1171
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1172 if (*p == sentinel) {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1173 break;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1174 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1175
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1176 temp = *p;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1177 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1178
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1179 *p = node;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1180 node->parent = temp;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1181 node->left = sentinel;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1182 node->right = sentinel;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1183 ngx_rbt_red(node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1184 }
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1185
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1186
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1187 static ngx_cached_open_file_t *
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1188 ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name,
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1189 uint32_t hash)
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1190 {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1191 ngx_int_t rc;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1192 ngx_rbtree_node_t *node, *sentinel;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1193 ngx_cached_open_file_t *file;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1194
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1195 node = cache->rbtree.root;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1196 sentinel = cache->rbtree.sentinel;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1197
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1198 while (node != sentinel) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1199
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1200 if (hash < node->key) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1201 node = node->left;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1202 continue;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1203 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1204
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1205 if (hash > node->key) {
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1206 node = node->right;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1207 continue;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1208 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1209
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1210 /* hash == node->key */
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1211
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4493
diff changeset
1212 file = (ngx_cached_open_file_t *) node;
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1213
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4493
diff changeset
1214 rc = ngx_strcmp(name->data, file->name);
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1215
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4493
diff changeset
1216 if (rc == 0) {
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4493
diff changeset
1217 return file;
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4493
diff changeset
1218 }
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1219
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4493
diff changeset
1220 node = (rc < 0) ? node->left : node->right;
1775
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1221 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1222
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1223 return NULL;
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1224 }
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1225
108576aef610 several fixes:
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
1226
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1227 static void
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1228 ngx_open_file_cache_remove(ngx_event_t *ev)
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1229 {
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1230 ngx_cached_open_file_t *file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1231 ngx_open_file_cache_event_t *fev;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1232
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1233 fev = ev->data;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1234 file = fev->file;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1235
1765
b0cbe16febaf use ngx_queue.h
Igor Sysoev <igor@sysoev.ru>
parents: 1761
diff changeset
1236 ngx_queue_remove(&file->queue);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1237
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1238 ngx_rbtree_delete(&fev->cache->rbtree, &file->node);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1239
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1240 fev->cache->current--;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1241
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1242 /* NGX_ONESHOT_EVENT was already deleted */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1243 file->event = NULL;
2070
92402cc8b3cf fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2069
diff changeset
1244 file->use_event = 0;
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1245
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1246 file->close = 1;
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1247
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
1248 ngx_close_cached_file(fev->cache, file, 0, ev->log);
1453
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1249
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1250 /* free memory only when fev->cache and fev->file are already not needed */
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1251
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1252 ngx_free(ev->data);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1253 ngx_free(ev);
f2feed5bffe1 open file cache
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1254 }