File: | xlators/storage/posix/src/posix-helpers.c |
Location: | line 1013, column 23 |
Description: | Null pointer passed as an argument to a 'nonnull' parameter |
1 | /* | |||
2 | Copyright (c) 2006-2012 Red Hat, Inc. <http://www.redhat.com> | |||
3 | This file is part of GlusterFS. | |||
4 | ||||
5 | This file is licensed to you under your choice of the GNU Lesser | |||
6 | General Public License, version 3 or any later version (LGPLv3 or | |||
7 | later), or the GNU General Public License, version 2 (GPLv2), in all | |||
8 | cases as published by the Free Software Foundation. | |||
9 | */ | |||
10 | #ifndef _CONFIG_H | |||
11 | #define _CONFIG_H | |||
12 | #include "config.h" | |||
13 | #endif | |||
14 | ||||
15 | #define __XOPEN_SOURCE500 500 | |||
16 | ||||
17 | #include <stdint.h> | |||
18 | #include <sys/time.h> | |||
19 | #include <sys/resource.h> | |||
20 | #include <errno(*__errno_location ()).h> | |||
21 | #include <libgen.h> | |||
22 | #include <pthread.h> | |||
23 | #include <ftw.h> | |||
24 | #include <sys/stat.h> | |||
25 | ||||
26 | #ifndef GF_BSD_HOST_OS | |||
27 | #include <alloca.h> | |||
28 | #endif /* GF_BSD_HOST_OS */ | |||
29 | ||||
30 | #include "glusterfs.h" | |||
31 | #include "checksum.h" | |||
32 | #include "dict.h" | |||
33 | #include "logging.h" | |||
34 | #include "posix.h" | |||
35 | #include "xlator.h" | |||
36 | #include "defaults.h" | |||
37 | #include "common-utils.h" | |||
38 | #include "compat-errno.h" | |||
39 | #include "compat.h" | |||
40 | #include "byte-order.h" | |||
41 | #include "syscall.h" | |||
42 | #include "statedump.h" | |||
43 | #include "locking.h" | |||
44 | #include "timer.h" | |||
45 | #include "glusterfs3-xdr.h" | |||
46 | #include "hashfn.h" | |||
47 | #include <fnmatch.h> | |||
48 | ||||
49 | char *marker_xattrs[] = {"trusted.glusterfs.quota.*", | |||
50 | "trusted.glusterfs.*.xtime", | |||
51 | NULL((void*)0)}; | |||
52 | ||||
53 | static char* posix_ignore_xattrs[] = { | |||
54 | "gfid-req", | |||
55 | GLUSTERFS_ENTRYLK_COUNT"glusterfs.entrylk-count", | |||
56 | GLUSTERFS_INODELK_COUNT"glusterfs.inodelk-count", | |||
57 | GLUSTERFS_POSIXLK_COUNT"glusterfs.posixlk-count", | |||
58 | NULL((void*)0) | |||
59 | }; | |||
60 | ||||
61 | gf_boolean_t | |||
62 | posix_special_xattr (char **pattern, char *key) | |||
63 | { | |||
64 | int i = 0; | |||
65 | gf_boolean_t flag = _gf_false; | |||
66 | ||||
67 | GF_VALIDATE_OR_GOTO ("posix", pattern, out)do { if (!pattern) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "pattern"); } while (0); _gf_log_callingfn ("posix", "posix-helpers.c", __FUNCTION__, 67, GF_LOG_ERROR, "invalid argument: " "pattern"); } while (0); goto out; } } while (0); | |||
68 | GF_VALIDATE_OR_GOTO ("posix", key, out)do { if (!key) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "key"); } while (0); _gf_log_callingfn ("posix", "posix-helpers.c", __FUNCTION__, 68, GF_LOG_ERROR, "invalid argument: " "key"); } while (0); goto out; } } while (0); | |||
69 | ||||
70 | for (i = 0; pattern[i]; i++) { | |||
71 | if (!fnmatch (pattern[i], key, 0)) { | |||
72 | flag = _gf_true; | |||
73 | break; | |||
74 | } | |||
75 | } | |||
76 | out: | |||
77 | return flag; | |||
78 | } | |||
79 | ||||
80 | static gf_boolean_t | |||
81 | posix_xattr_ignorable (char *key, posix_xattr_filler_t *filler) | |||
82 | { | |||
83 | int i = 0; | |||
84 | gf_boolean_t ignore = _gf_false; | |||
85 | ||||
86 | GF_ASSERT (key)do { if (!(key)) { do { do { if (0) printf ("Assertion failed: " "key"); } while (0); _gf_log_callingfn ("", "posix-helpers.c" , __FUNCTION__, 86, GF_LOG_ERROR, "Assertion failed: " "key") ; } while (0); } } while (0); | |||
87 | if (!key) | |||
88 | goto out; | |||
89 | for (i = 0; posix_ignore_xattrs[i]; i++) { | |||
90 | if (!strcmp (key, posix_ignore_xattrs[i])) { | |||
91 | ignore = _gf_true; | |||
92 | goto out; | |||
93 | } | |||
94 | } | |||
95 | if ((!strcmp (key, GF_CONTENT_KEY"glusterfs.content")) | |||
96 | && (!IA_ISREG (filler->stbuf->ia_type)(filler->stbuf->ia_type == IA_IFREG))) | |||
97 | ignore = _gf_true; | |||
98 | out: | |||
99 | return ignore; | |||
100 | } | |||
101 | ||||
102 | static int | |||
103 | _posix_xattr_get_set (dict_t *xattr_req, | |||
104 | char *key, | |||
105 | data_t *data, | |||
106 | void *xattrargs) | |||
107 | { | |||
108 | posix_xattr_filler_t *filler = xattrargs; | |||
109 | char *value = NULL((void*)0); | |||
110 | ssize_t xattr_size = -1; | |||
111 | int ret = -1; | |||
112 | char *databuf = NULL((void*)0); | |||
113 | int _fd = -1; | |||
114 | loc_t *loc = NULL((void*)0); | |||
115 | ssize_t req_size = 0; | |||
116 | ||||
117 | ||||
118 | if (posix_xattr_ignorable (key, filler)) | |||
119 | goto out; | |||
120 | /* should size be put into the data_t ? */ | |||
121 | if (!strcmp (key, GF_CONTENT_KEY"glusterfs.content") | |||
122 | && IA_ISREG (filler->stbuf->ia_type)(filler->stbuf->ia_type == IA_IFREG)) { | |||
123 | ||||
124 | /* file content request */ | |||
125 | req_size = data_to_uint64 (data); | |||
126 | if (req_size >= filler->stbuf->ia_size) { | |||
127 | _fd = open (filler->real_path, O_RDONLY00); | |||
128 | if (_fd == -1) { | |||
129 | gf_log (filler->this->name, GF_LOG_ERROR,do { do { if (0) printf ("Opening file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 131, GF_LOG_ERROR, "Opening file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0) | |||
130 | "Opening file %s failed: %s",do { do { if (0) printf ("Opening file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 131, GF_LOG_ERROR, "Opening file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0) | |||
131 | filler->real_path, strerror (errno))do { do { if (0) printf ("Opening file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 131, GF_LOG_ERROR, "Opening file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0); | |||
132 | goto err; | |||
133 | } | |||
134 | ||||
135 | databuf = GF_CALLOC (1, filler->stbuf->ia_size,__gf_calloc (1, filler->stbuf->ia_size, gf_posix_mt_char ) | |||
136 | gf_posix_mt_char)__gf_calloc (1, filler->stbuf->ia_size, gf_posix_mt_char ); | |||
137 | if (!databuf) { | |||
138 | goto err; | |||
139 | } | |||
140 | ||||
141 | ret = read (_fd, databuf, filler->stbuf->ia_size); | |||
142 | if (ret == -1) { | |||
143 | gf_log (filler->this->name, GF_LOG_ERROR,do { do { if (0) printf ("Read on file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 145, GF_LOG_ERROR, "Read on file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0) | |||
144 | "Read on file %s failed: %s",do { do { if (0) printf ("Read on file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 145, GF_LOG_ERROR, "Read on file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0) | |||
145 | filler->real_path, strerror (errno))do { do { if (0) printf ("Read on file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 145, GF_LOG_ERROR, "Read on file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0); | |||
146 | goto err; | |||
147 | } | |||
148 | ||||
149 | ret = close (_fd); | |||
150 | _fd = -1; | |||
151 | if (ret == -1) { | |||
152 | gf_log (filler->this->name, GF_LOG_ERROR,do { do { if (0) printf ("Close on file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 154, GF_LOG_ERROR, "Close on file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0) | |||
153 | "Close on file %s failed: %s",do { do { if (0) printf ("Close on file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 154, GF_LOG_ERROR, "Close on file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0) | |||
154 | filler->real_path, strerror (errno))do { do { if (0) printf ("Close on file %s failed: %s", filler ->real_path, strerror ((*__errno_location ()))); } while ( 0); _gf_log (filler->this->name, "posix-helpers.c", __FUNCTION__ , 154, GF_LOG_ERROR, "Close on file %s failed: %s", filler-> real_path, strerror ((*__errno_location ()))); } while (0); | |||
155 | goto err; | |||
156 | } | |||
157 | ||||
158 | ret = dict_set_bin (filler->xattr, key, | |||
159 | databuf, filler->stbuf->ia_size); | |||
160 | if (ret < 0) { | |||
161 | gf_log (filler->this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to set dict value. key: %s, path: %s" , key, filler->real_path); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 163, GF_LOG_ERROR , "failed to set dict value. key: %s, path: %s", key, filler-> real_path); } while (0) | |||
162 | "failed to set dict value. key: %s, path: %s",do { do { if (0) printf ("failed to set dict value. key: %s, path: %s" , key, filler->real_path); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 163, GF_LOG_ERROR , "failed to set dict value. key: %s, path: %s", key, filler-> real_path); } while (0) | |||
163 | key, filler->real_path)do { do { if (0) printf ("failed to set dict value. key: %s, path: %s" , key, filler->real_path); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 163, GF_LOG_ERROR , "failed to set dict value. key: %s, path: %s", key, filler-> real_path); } while (0); | |||
164 | goto err; | |||
165 | } | |||
166 | ||||
167 | /* To avoid double free in cleanup below */ | |||
168 | databuf = NULL((void*)0); | |||
169 | err: | |||
170 | if (_fd != -1) | |||
171 | close (_fd); | |||
172 | GF_FREE (databuf)__gf_free (databuf); | |||
173 | } | |||
174 | } else if (!strcmp (key, GLUSTERFS_OPEN_FD_COUNT"glusterfs.open-fd-count")) { | |||
175 | loc = filler->loc; | |||
176 | if (loc) { | |||
177 | ret = dict_set_uint32 (filler->xattr, key, | |||
178 | loc->inode->fd_count); | |||
179 | if (ret < 0) | |||
180 | gf_log (filler->this->name, GF_LOG_WARNING,do { do { if (0) printf ("Failed to set dictionary value for %s" , key); } while (0); _gf_log (filler->this->name, "posix-helpers.c" , __FUNCTION__, 182, GF_LOG_WARNING, "Failed to set dictionary value for %s" , key); } while (0) | |||
181 | "Failed to set dictionary value for %s",do { do { if (0) printf ("Failed to set dictionary value for %s" , key); } while (0); _gf_log (filler->this->name, "posix-helpers.c" , __FUNCTION__, 182, GF_LOG_WARNING, "Failed to set dictionary value for %s" , key); } while (0) | |||
182 | key)do { do { if (0) printf ("Failed to set dictionary value for %s" , key); } while (0); _gf_log (filler->this->name, "posix-helpers.c" , __FUNCTION__, 182, GF_LOG_WARNING, "Failed to set dictionary value for %s" , key); } while (0); | |||
183 | } | |||
184 | } else { | |||
185 | xattr_size = sys_lgetxattr (filler->real_path, key, NULL((void*)0), 0); | |||
186 | ||||
187 | if (xattr_size > 0) { | |||
188 | value = GF_CALLOC (1, xattr_size + 1,__gf_calloc (1, xattr_size + 1, gf_posix_mt_char) | |||
189 | gf_posix_mt_char)__gf_calloc (1, xattr_size + 1, gf_posix_mt_char); | |||
190 | if (!value) | |||
191 | return -1; | |||
192 | ||||
193 | xattr_size = sys_lgetxattr (filler->real_path, key, value, | |||
194 | xattr_size); | |||
195 | if (xattr_size <= 0) { | |||
196 | gf_log (filler->this->name, GF_LOG_WARNING,do { do { if (0) printf ("getxattr failed. path: %s, key: %s" , filler->real_path, key); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 198, GF_LOG_WARNING , "getxattr failed. path: %s, key: %s", filler->real_path, key); } while (0) | |||
197 | "getxattr failed. path: %s, key: %s",do { do { if (0) printf ("getxattr failed. path: %s, key: %s" , filler->real_path, key); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 198, GF_LOG_WARNING , "getxattr failed. path: %s, key: %s", filler->real_path, key); } while (0) | |||
198 | filler->real_path, key)do { do { if (0) printf ("getxattr failed. path: %s, key: %s" , filler->real_path, key); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 198, GF_LOG_WARNING , "getxattr failed. path: %s, key: %s", filler->real_path, key); } while (0); | |||
199 | GF_FREE (value)__gf_free (value); | |||
200 | return -1; | |||
201 | } | |||
202 | ||||
203 | value[xattr_size] = '\0'; | |||
204 | ret = dict_set_bin (filler->xattr, key, | |||
205 | value, xattr_size); | |||
206 | if (ret < 0) { | |||
207 | gf_log (filler->this->name, GF_LOG_DEBUG,do { do { if (0) printf ("dict set failed. path: %s, key: %s" , filler->real_path, key); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 209, GF_LOG_DEBUG , "dict set failed. path: %s, key: %s", filler->real_path, key); } while (0) | |||
208 | "dict set failed. path: %s, key: %s",do { do { if (0) printf ("dict set failed. path: %s, key: %s" , filler->real_path, key); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 209, GF_LOG_DEBUG , "dict set failed. path: %s, key: %s", filler->real_path, key); } while (0) | |||
209 | filler->real_path, key)do { do { if (0) printf ("dict set failed. path: %s, key: %s" , filler->real_path, key); } while (0); _gf_log (filler-> this->name, "posix-helpers.c", __FUNCTION__, 209, GF_LOG_DEBUG , "dict set failed. path: %s, key: %s", filler->real_path, key); } while (0); | |||
210 | GF_FREE (value)__gf_free (value); | |||
211 | } | |||
212 | } | |||
213 | } | |||
214 | out: | |||
215 | return 0; | |||
216 | } | |||
217 | ||||
218 | ||||
219 | int | |||
220 | posix_fill_gfid_path (xlator_t *this, const char *path, struct iatt *iatt) | |||
221 | { | |||
222 | int ret = 0; | |||
223 | ssize_t size = 0; | |||
224 | ||||
225 | if (!iatt) | |||
226 | return 0; | |||
227 | ||||
228 | size = sys_lgetxattr (path, GFID_XATTR_KEY"trusted.gfid", iatt->ia_gfid, 16); | |||
229 | /* Return value of getxattr */ | |||
230 | if ((size == 16) || (size == -1)) | |||
231 | ret = 0; | |||
232 | else | |||
233 | ret = size; | |||
234 | ||||
235 | return ret; | |||
236 | } | |||
237 | ||||
238 | ||||
239 | int | |||
240 | posix_fill_gfid_fd (xlator_t *this, int fd, struct iatt *iatt) | |||
241 | { | |||
242 | int ret = 0; | |||
243 | ssize_t size = 0; | |||
244 | ||||
245 | if (!iatt) | |||
246 | return 0; | |||
247 | ||||
248 | size = sys_fgetxattr (fd, GFID_XATTR_KEY"trusted.gfid", iatt->ia_gfid, 16); | |||
249 | /* Return value of getxattr */ | |||
250 | if ((size == 16) || (size == -1)) | |||
251 | ret = 0; | |||
252 | else | |||
253 | ret = size; | |||
254 | ||||
255 | return ret; | |||
256 | } | |||
257 | ||||
258 | void | |||
259 | posix_fill_ino_from_gfid (xlator_t *this, struct iatt *buf) | |||
260 | { | |||
261 | uint64_t temp_ino = 0; | |||
262 | int j = 0; | |||
263 | int i = 0; | |||
264 | ||||
265 | /* consider least significant 8 bytes of value out of gfid */ | |||
266 | if (uuid_is_null (buf->ia_gfid)) { | |||
267 | buf->ia_ino = -1; | |||
268 | goto out; | |||
269 | } | |||
270 | for (i = 15; i > (15 - 8); i--) { | |||
271 | temp_ino += (uint64_t)(buf->ia_gfid[i]) << j; | |||
272 | j += 8; | |||
273 | } | |||
274 | buf->ia_ino = temp_ino; | |||
275 | out: | |||
276 | return; | |||
277 | } | |||
278 | ||||
279 | int | |||
280 | posix_fdstat (xlator_t *this, int fd, struct iatt *stbuf_p) | |||
281 | { | |||
282 | int ret = 0; | |||
283 | struct stat fstatbuf = {0, }; | |||
284 | struct iatt stbuf = {0, }; | |||
285 | ||||
286 | ret = fstat (fd, &fstatbuf); | |||
287 | if (ret == -1) | |||
288 | goto out; | |||
289 | ||||
290 | if (fstatbuf.st_nlink && !S_ISDIR (fstatbuf.st_mode)((((fstatbuf.st_mode)) & 0170000) == (0040000))) | |||
291 | fstatbuf.st_nlink--; | |||
292 | ||||
293 | iatt_from_stat (&stbuf, &fstatbuf); | |||
294 | ||||
295 | ret = posix_fill_gfid_fd (this, fd, &stbuf); | |||
296 | if (ret) | |||
297 | gf_log_callingfn (this->name, GF_LOG_DEBUG, "failed to get gfid")do { do { if (0) printf ("failed to get gfid"); } while (0); _gf_log_callingfn (this->name, "posix-helpers.c", __FUNCTION__, 297, GF_LOG_DEBUG , "failed to get gfid"); } while (0); | |||
298 | ||||
299 | posix_fill_ino_from_gfid (this, &stbuf); | |||
300 | ||||
301 | if (stbuf_p) | |||
302 | *stbuf_p = stbuf; | |||
303 | ||||
304 | out: | |||
305 | return ret; | |||
306 | } | |||
307 | ||||
308 | ||||
309 | int | |||
310 | posix_istat (xlator_t *this, uuid_t gfid, const char *basename__xpg_basename, | |||
311 | struct iatt *buf_p) | |||
312 | { | |||
313 | char *real_path = NULL((void*)0); | |||
314 | struct stat lstatbuf = {0, }; | |||
315 | struct iatt stbuf = {0, }; | |||
316 | int ret = 0; | |||
317 | struct posix_private *priv = NULL((void*)0); | |||
318 | ||||
319 | ||||
320 | priv = this->private; | |||
321 | ||||
322 | MAKE_HANDLE_PATH (real_path, this, gfid, basename)do { int __len; __len = posix_handle_path (this, gfid, __xpg_basename , ((void*)0), 0); if (__len <= 0) break; real_path = __builtin_alloca (__len); __len = posix_handle_path (this, gfid, __xpg_basename , real_path, __len); } while (0); | |||
323 | ||||
324 | ret = lstat (real_path, &lstatbuf); | |||
325 | ||||
326 | if (ret != 0) { | |||
327 | if (ret == -1) { | |||
328 | if (errno(*__errno_location ()) != ENOENT2 && errno(*__errno_location ()) != ELOOP40) | |||
329 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("lstat failed on %s (%s)", real_path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 331, GF_LOG_WARNING , "lstat failed on %s (%s)", real_path, strerror ((*__errno_location ()))); } while (0) | |||
330 | "lstat failed on %s (%s)",do { do { if (0) printf ("lstat failed on %s (%s)", real_path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 331, GF_LOG_WARNING , "lstat failed on %s (%s)", real_path, strerror ((*__errno_location ()))); } while (0) | |||
331 | real_path, strerror (errno))do { do { if (0) printf ("lstat failed on %s (%s)", real_path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 331, GF_LOG_WARNING , "lstat failed on %s (%s)", real_path, strerror ((*__errno_location ()))); } while (0); | |||
332 | } else { | |||
333 | // may be some backend filesystem issue | |||
334 | gf_log (this->name, GF_LOG_ERROR, "lstat failed on "do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 338, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0) | |||
335 | "%s and return value is %d instead of -1. "do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 338, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0) | |||
336 | "Please see dmesg output to check whether the "do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 338, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0) | |||
337 | "failure is due to backend filesystem issue",do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 338, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0) | |||
338 | real_path, ret)do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 338, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , real_path, ret); } while (0); | |||
339 | ret = -1; | |||
340 | } | |||
341 | goto out; | |||
342 | } | |||
343 | ||||
344 | if ((lstatbuf.st_ino == priv->handledir.st_ino) && | |||
345 | (lstatbuf.st_dev == priv->handledir.st_dev)) { | |||
346 | errno(*__errno_location ()) = ENOENT2; | |||
347 | return -1; | |||
348 | } | |||
349 | ||||
350 | if (!S_ISDIR (lstatbuf.st_mode)((((lstatbuf.st_mode)) & 0170000) == (0040000))) | |||
351 | lstatbuf.st_nlink --; | |||
352 | ||||
353 | iatt_from_stat (&stbuf, &lstatbuf); | |||
354 | ||||
355 | if (basename__xpg_basename) | |||
356 | posix_fill_gfid_path (this, real_path, &stbuf); | |||
357 | else | |||
358 | uuid_copy (stbuf.ia_gfid, gfid); | |||
359 | ||||
360 | posix_fill_ino_from_gfid (this, &stbuf); | |||
361 | ||||
362 | if (buf_p) | |||
363 | *buf_p = stbuf; | |||
364 | out: | |||
365 | return ret; | |||
366 | } | |||
367 | ||||
368 | ||||
369 | ||||
370 | int | |||
371 | posix_pstat (xlator_t *this, uuid_t gfid, const char *path, | |||
372 | struct iatt *buf_p) | |||
373 | { | |||
374 | struct stat lstatbuf = {0, }; | |||
375 | struct iatt stbuf = {0, }; | |||
376 | int ret = 0; | |||
377 | struct posix_private *priv = NULL((void*)0); | |||
378 | ||||
379 | ||||
380 | priv = this->private; | |||
381 | ||||
382 | ret = lstat (path, &lstatbuf); | |||
383 | ||||
384 | if (ret != 0) { | |||
385 | if (ret == -1) { | |||
386 | if (errno(*__errno_location ()) != ENOENT2) | |||
387 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("lstat failed on %s (%s)", path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 389, GF_LOG_WARNING, "lstat failed on %s (%s)" , path, strerror ((*__errno_location ()))); } while (0) | |||
388 | "lstat failed on %s (%s)",do { do { if (0) printf ("lstat failed on %s (%s)", path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 389, GF_LOG_WARNING, "lstat failed on %s (%s)" , path, strerror ((*__errno_location ()))); } while (0) | |||
389 | path, strerror (errno))do { do { if (0) printf ("lstat failed on %s (%s)", path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 389, GF_LOG_WARNING, "lstat failed on %s (%s)" , path, strerror ((*__errno_location ()))); } while (0); | |||
390 | } else { | |||
391 | // may be some backend filesytem issue | |||
392 | gf_log (this->name, GF_LOG_ERROR, "lstat failed on "do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 396, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0) | |||
393 | "%s and return value is %d instead of -1. "do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 396, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0) | |||
394 | "Please see dmesg output to check whether the "do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 396, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0) | |||
395 | "failure is due to backend filesystem issue",do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 396, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0) | |||
396 | path, ret)do { do { if (0) printf ("lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 396, GF_LOG_ERROR, "lstat failed on " "%s and return value is %d instead of -1. " "Please see dmesg output to check whether the " "failure is due to backend filesystem issue" , path, ret); } while (0); | |||
397 | ret = -1; | |||
398 | } | |||
399 | goto out; | |||
400 | } | |||
401 | ||||
402 | if ((lstatbuf.st_ino == priv->handledir.st_ino) && | |||
403 | (lstatbuf.st_dev == priv->handledir.st_dev)) { | |||
404 | errno(*__errno_location ()) = ENOENT2; | |||
405 | return -1; | |||
406 | } | |||
407 | ||||
408 | if (!S_ISDIR (lstatbuf.st_mode)((((lstatbuf.st_mode)) & 0170000) == (0040000))) | |||
409 | lstatbuf.st_nlink --; | |||
410 | ||||
411 | iatt_from_stat (&stbuf, &lstatbuf); | |||
412 | ||||
413 | if (gfid && !uuid_is_null (gfid)) | |||
414 | uuid_copy (stbuf.ia_gfid, gfid); | |||
415 | else | |||
416 | posix_fill_gfid_path (this, path, &stbuf); | |||
417 | ||||
418 | posix_fill_ino_from_gfid (this, &stbuf); | |||
419 | ||||
420 | if (buf_p) | |||
421 | *buf_p = stbuf; | |||
422 | out: | |||
423 | return ret; | |||
424 | } | |||
425 | ||||
426 | ||||
427 | dict_t * | |||
428 | posix_lookup_xattr_fill (xlator_t *this, const char *real_path, loc_t *loc, | |||
429 | dict_t *xattr_req, struct iatt *buf) | |||
430 | { | |||
431 | dict_t *xattr = NULL((void*)0); | |||
432 | posix_xattr_filler_t filler = {0, }; | |||
433 | ||||
434 | xattr = get_new_dict(); | |||
435 | if (!xattr) { | |||
436 | goto out; | |||
437 | } | |||
438 | ||||
439 | filler.this = this; | |||
440 | filler.real_path = real_path; | |||
441 | filler.xattr = xattr; | |||
442 | filler.stbuf = buf; | |||
443 | filler.loc = loc; | |||
444 | ||||
445 | dict_foreach (xattr_req, _posix_xattr_get_set, &filler); | |||
446 | out: | |||
447 | return xattr; | |||
448 | } | |||
449 | ||||
450 | ||||
451 | int | |||
452 | posix_gfid_set (xlator_t *this, const char *path, loc_t *loc, dict_t *xattr_req) | |||
453 | { | |||
454 | void *uuid_req = NULL((void*)0); | |||
455 | uuid_t uuid_curr; | |||
456 | int ret = 0; | |||
457 | ssize_t size = 0; | |||
458 | struct stat stat = {0, }; | |||
459 | ||||
460 | ||||
461 | if (!xattr_req) | |||
462 | goto out; | |||
463 | ||||
464 | if (sys_lstat (path, &stat) != 0) | |||
465 | goto out; | |||
466 | ||||
467 | size = sys_lgetxattr (path, GFID_XATTR_KEY"trusted.gfid", uuid_curr, 16); | |||
468 | if (size == 16) { | |||
469 | ret = 0; | |||
470 | goto verify_handle; | |||
471 | } | |||
472 | ||||
473 | ret = dict_get_ptr (xattr_req, "gfid-req", &uuid_req); | |||
474 | if (ret) { | |||
475 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("failed to get the gfid from dict for %s" , loc->path); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 477, GF_LOG_DEBUG, "failed to get the gfid from dict for %s" , loc->path); } while (0) | |||
476 | "failed to get the gfid from dict for %s",do { do { if (0) printf ("failed to get the gfid from dict for %s" , loc->path); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 477, GF_LOG_DEBUG, "failed to get the gfid from dict for %s" , loc->path); } while (0) | |||
477 | loc->path)do { do { if (0) printf ("failed to get the gfid from dict for %s" , loc->path); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 477, GF_LOG_DEBUG, "failed to get the gfid from dict for %s" , loc->path); } while (0); | |||
478 | goto out; | |||
479 | } | |||
480 | ||||
481 | ret = sys_lsetxattr (path, GFID_XATTR_KEY"trusted.gfid", uuid_req, 16, XATTR_CREATEXATTR_CREATE); | |||
482 | if (ret != 0) { | |||
483 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("setting GFID on %s failed (%s)", path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 485, GF_LOG_WARNING , "setting GFID on %s failed (%s)", path, strerror ((*__errno_location ()))); } while (0) | |||
484 | "setting GFID on %s failed (%s)", path,do { do { if (0) printf ("setting GFID on %s failed (%s)", path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 485, GF_LOG_WARNING , "setting GFID on %s failed (%s)", path, strerror ((*__errno_location ()))); } while (0) | |||
485 | strerror (errno))do { do { if (0) printf ("setting GFID on %s failed (%s)", path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 485, GF_LOG_WARNING , "setting GFID on %s failed (%s)", path, strerror ((*__errno_location ()))); } while (0); | |||
486 | goto out; | |||
487 | } | |||
488 | uuid_copy (uuid_curr, uuid_req); | |||
489 | ||||
490 | verify_handle: | |||
491 | if (!S_ISDIR (stat.st_mode)((((stat.st_mode)) & 0170000) == (0040000))) | |||
492 | ret = posix_handle_hard (this, path, uuid_curr, &stat); | |||
493 | else | |||
494 | ret = posix_handle_soft (this, path, loc, uuid_curr, &stat); | |||
495 | ||||
496 | out: | |||
497 | return ret; | |||
498 | } | |||
499 | ||||
500 | ||||
501 | int | |||
502 | posix_set_file_contents (xlator_t *this, const char *path, char *keyp, | |||
503 | data_t *value, int flags) | |||
504 | { | |||
505 | char * key = NULL((void*)0); | |||
506 | char real_path[PATH_MAX4096]; | |||
507 | int32_t file_fd = -1; | |||
508 | int op_ret = 0; | |||
509 | int ret = -1; | |||
510 | ||||
511 | ||||
512 | /* XXX: does not handle assigning GFID to created files */ | |||
513 | return -1; | |||
514 | ||||
515 | key = &(keyp[15]); | |||
516 | sprintf (real_path, "%s/%s", path, key); | |||
517 | ||||
518 | if (flags & XATTR_REPLACEXATTR_REPLACE) { | |||
519 | /* if file exists, replace it | |||
520 | * else, error out */ | |||
521 | file_fd = open (real_path, O_TRUNC01000|O_WRONLY01); | |||
522 | ||||
523 | if (file_fd == -1) { | |||
524 | goto create; | |||
525 | } | |||
526 | ||||
527 | if (value->len) { | |||
528 | ret = write (file_fd, value->data, value->len); | |||
529 | if (ret == -1) { | |||
530 | op_ret = -errno(*__errno_location ()); | |||
531 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("write failed while doing setxattr " "for key %s on path %s: %s", key, real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 534, GF_LOG_ERROR, "write failed while doing setxattr " "for key %s on path %s: %s", key, real_path, strerror ((*__errno_location ()))); } while (0) | |||
532 | "write failed while doing setxattr "do { do { if (0) printf ("write failed while doing setxattr " "for key %s on path %s: %s", key, real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 534, GF_LOG_ERROR, "write failed while doing setxattr " "for key %s on path %s: %s", key, real_path, strerror ((*__errno_location ()))); } while (0) | |||
533 | "for key %s on path %s: %s",do { do { if (0) printf ("write failed while doing setxattr " "for key %s on path %s: %s", key, real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 534, GF_LOG_ERROR, "write failed while doing setxattr " "for key %s on path %s: %s", key, real_path, strerror ((*__errno_location ()))); } while (0) | |||
534 | key, real_path, strerror (errno))do { do { if (0) printf ("write failed while doing setxattr " "for key %s on path %s: %s", key, real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 534, GF_LOG_ERROR, "write failed while doing setxattr " "for key %s on path %s: %s", key, real_path, strerror ((*__errno_location ()))); } while (0); | |||
535 | goto out; | |||
536 | } | |||
537 | ||||
538 | ret = close (file_fd); | |||
539 | if (ret == -1) { | |||
540 | op_ret = -errno(*__errno_location ()); | |||
541 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("close failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 543, GF_LOG_ERROR , "close failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0) | |||
542 | "close failed on %s: %s",do { do { if (0) printf ("close failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 543, GF_LOG_ERROR , "close failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0) | |||
543 | real_path, strerror (errno))do { do { if (0) printf ("close failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 543, GF_LOG_ERROR , "close failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); | |||
544 | goto out; | |||
545 | } | |||
546 | } | |||
547 | ||||
548 | create: /* we know file doesn't exist, create it */ | |||
549 | ||||
550 | file_fd = open (real_path, O_CREAT0100|O_WRONLY01, 0644); | |||
551 | ||||
552 | if (file_fd == -1) { | |||
553 | op_ret = -errno(*__errno_location ()); | |||
554 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to open file %s with O_CREAT: %s" , key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 556, GF_LOG_ERROR , "failed to open file %s with O_CREAT: %s", key, strerror (( *__errno_location ()))); } while (0) | |||
555 | "failed to open file %s with O_CREAT: %s",do { do { if (0) printf ("failed to open file %s with O_CREAT: %s" , key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 556, GF_LOG_ERROR , "failed to open file %s with O_CREAT: %s", key, strerror (( *__errno_location ()))); } while (0) | |||
556 | key, strerror (errno))do { do { if (0) printf ("failed to open file %s with O_CREAT: %s" , key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 556, GF_LOG_ERROR , "failed to open file %s with O_CREAT: %s", key, strerror (( *__errno_location ()))); } while (0); | |||
557 | goto out; | |||
558 | } | |||
559 | ||||
560 | ret = write (file_fd, value->data, value->len); | |||
561 | if (ret == -1) { | |||
562 | op_ret = -errno(*__errno_location ()); | |||
563 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("write failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 566, GF_LOG_ERROR, "write failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0) | |||
564 | "write failed on %s while setxattr with "do { do { if (0) printf ("write failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 566, GF_LOG_ERROR, "write failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0) | |||
565 | "key %s: %s",do { do { if (0) printf ("write failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 566, GF_LOG_ERROR, "write failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0) | |||
566 | real_path, key, strerror (errno))do { do { if (0) printf ("write failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 566, GF_LOG_ERROR, "write failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); | |||
567 | goto out; | |||
568 | } | |||
569 | ||||
570 | ret = close (file_fd); | |||
571 | if (ret == -1) { | |||
572 | op_ret = -errno(*__errno_location ()); | |||
573 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("close failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 576, GF_LOG_ERROR, "close failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0) | |||
574 | "close failed on %s while setxattr with "do { do { if (0) printf ("close failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 576, GF_LOG_ERROR, "close failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0) | |||
575 | "key %s: %s",do { do { if (0) printf ("close failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 576, GF_LOG_ERROR, "close failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0) | |||
576 | real_path, key, strerror (errno))do { do { if (0) printf ("close failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 576, GF_LOG_ERROR, "close failed on %s while setxattr with " "key %s: %s", real_path, key, strerror ((*__errno_location ( )))); } while (0); | |||
577 | goto out; | |||
578 | } | |||
579 | } | |||
580 | ||||
581 | out: | |||
582 | return op_ret; | |||
583 | } | |||
584 | ||||
585 | ||||
586 | int | |||
587 | posix_get_file_contents (xlator_t *this, uuid_t pargfid, | |||
588 | const char *name, char **contents) | |||
589 | { | |||
590 | char *real_path = NULL((void*)0); | |||
591 | int32_t file_fd = -1; | |||
592 | struct iatt stbuf = {0,}; | |||
593 | int op_ret = 0; | |||
594 | int ret = -1; | |||
595 | ||||
596 | ||||
597 | MAKE_HANDLE_PATH (real_path, this, pargfid, name)do { int __len; __len = posix_handle_path (this, pargfid, name , ((void*)0), 0); if (__len <= 0) break; real_path = __builtin_alloca (__len); __len = posix_handle_path (this, pargfid, name, real_path , __len); } while (0); | |||
598 | ||||
599 | op_ret = posix_istat (this, pargfid, name, &stbuf); | |||
600 | if (op_ret == -1) { | |||
601 | op_ret = -errno(*__errno_location ()); | |||
602 | gf_log (this->name, GF_LOG_ERROR, "lstat failed on %s: %s",do { do { if (0) printf ("lstat failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 603, GF_LOG_ERROR , "lstat failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0) | |||
603 | real_path, strerror (errno))do { do { if (0) printf ("lstat failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 603, GF_LOG_ERROR , "lstat failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); | |||
604 | goto out; | |||
605 | } | |||
606 | ||||
607 | file_fd = open (real_path, O_RDONLY00); | |||
608 | ||||
609 | if (file_fd == -1) { | |||
610 | op_ret = -errno(*__errno_location ()); | |||
611 | gf_log (this->name, GF_LOG_ERROR, "open failed on %s: %s",do { do { if (0) printf ("open failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 612, GF_LOG_ERROR, "open failed on %s: %s" , real_path, strerror ((*__errno_location ()))); } while (0) | |||
612 | real_path, strerror (errno))do { do { if (0) printf ("open failed on %s: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 612, GF_LOG_ERROR, "open failed on %s: %s" , real_path, strerror ((*__errno_location ()))); } while (0); | |||
613 | goto out; | |||
614 | } | |||
615 | ||||
616 | *contents = GF_CALLOC (stbuf.ia_size + 1, sizeof(char),__gf_calloc (stbuf.ia_size + 1, sizeof(char), gf_posix_mt_char ) | |||
617 | gf_posix_mt_char)__gf_calloc (stbuf.ia_size + 1, sizeof(char), gf_posix_mt_char ); | |||
618 | if (! *contents) { | |||
619 | op_ret = -errno(*__errno_location ()); | |||
620 | goto out; | |||
621 | } | |||
622 | ||||
623 | ret = read (file_fd, *contents, stbuf.ia_size); | |||
624 | if (ret <= 0) { | |||
625 | op_ret = -1; | |||
626 | gf_log (this->name, GF_LOG_ERROR, "read on %s failed: %s",do { do { if (0) printf ("read on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 627, GF_LOG_ERROR, "read on %s failed: %s" , real_path, strerror ((*__errno_location ()))); } while (0) | |||
627 | real_path, strerror (errno))do { do { if (0) printf ("read on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 627, GF_LOG_ERROR, "read on %s failed: %s" , real_path, strerror ((*__errno_location ()))); } while (0); | |||
628 | goto out; | |||
629 | } | |||
630 | ||||
631 | *contents[stbuf.ia_size] = '\0'; | |||
632 | ||||
633 | op_ret = close (file_fd); | |||
634 | file_fd = -1; | |||
635 | if (op_ret == -1) { | |||
636 | op_ret = -errno(*__errno_location ()); | |||
637 | gf_log (this->name, GF_LOG_ERROR, "close on %s failed: %s",do { do { if (0) printf ("close on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 638, GF_LOG_ERROR , "close on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0) | |||
638 | real_path, strerror (errno))do { do { if (0) printf ("close on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 638, GF_LOG_ERROR , "close on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0); | |||
639 | goto out; | |||
640 | } | |||
641 | ||||
642 | out: | |||
643 | if (op_ret < 0) { | |||
644 | GF_FREE (*contents)__gf_free (*contents); | |||
645 | if (file_fd != -1) | |||
646 | close (file_fd); | |||
647 | } | |||
648 | ||||
649 | return op_ret; | |||
650 | } | |||
651 | ||||
652 | static int gf_xattr_enotsup_log; | |||
653 | ||||
654 | int | |||
655 | posix_handle_pair (xlator_t *this, const char *real_path, | |||
656 | char *key, data_t *value, int flags) | |||
657 | { | |||
658 | int sys_ret = -1; | |||
659 | int ret = 0; | |||
660 | ||||
661 | if (ZR_FILE_CONTENT_REQUEST(key)(!strncmp(key, "glusterfs.file.", 15))) { | |||
662 | ret = posix_set_file_contents (this, real_path, key, value, | |||
663 | flags); | |||
664 | } else { | |||
665 | sys_ret = sys_lsetxattr (real_path, key, value->data, | |||
666 | value->len, flags); | |||
667 | ||||
668 | if (sys_ret < 0) { | |||
669 | if (errno(*__errno_location ()) == ENOTSUP95) { | |||
670 | GF_LOG_OCCASIONALLY(gf_xattr_enotsup_log,if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 675, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
671 | this->name,GF_LOG_WARNING,if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 675, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
672 | "Extended attributes not "if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 675, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
673 | "supported (try remounting "if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 675, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
674 | "brick with 'user_xattr' "if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 675, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
675 | "flag)")if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 675, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); }; | |||
676 | } else if (errno(*__errno_location ()) == ENOENT2) { | |||
677 | if (!posix_special_xattr (marker_xattrs, | |||
678 | key)) { | |||
679 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("setxattr on %s failed: %s", real_path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 681, GF_LOG_ERROR , "setxattr on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0) | |||
680 | "setxattr on %s failed: %s",do { do { if (0) printf ("setxattr on %s failed: %s", real_path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 681, GF_LOG_ERROR , "setxattr on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0) | |||
681 | real_path, strerror (errno))do { do { if (0) printf ("setxattr on %s failed: %s", real_path , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 681, GF_LOG_ERROR , "setxattr on %s failed: %s", real_path, strerror ((*__errno_location ()))); } while (0); | |||
682 | } | |||
683 | } else { | |||
684 | ||||
685 | #ifdef GF_DARWIN_HOST_OS | |||
686 | gf_log (this->name,do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 691, (((*__errno_location ()) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "%s: key:%s error:%s" , real_path, key, strerror ((*__errno_location ()))); } while (0) | |||
687 | ((errno == EINVAL) ?do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 691, (((*__errno_location ()) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "%s: key:%s error:%s" , real_path, key, strerror ((*__errno_location ()))); } while (0) | |||
688 | GF_LOG_DEBUG : GF_LOG_ERROR),do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 691, (((*__errno_location ()) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "%s: key:%s error:%s" , real_path, key, strerror ((*__errno_location ()))); } while (0) | |||
689 | "%s: key:%s error:%s",do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 691, (((*__errno_location ()) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "%s: key:%s error:%s" , real_path, key, strerror ((*__errno_location ()))); } while (0) | |||
690 | real_path, key,do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 691, (((*__errno_location ()) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "%s: key:%s error:%s" , real_path, key, strerror ((*__errno_location ()))); } while (0) | |||
691 | strerror (errno))do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 691, (((*__errno_location ()) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "%s: key:%s error:%s" , real_path, key, strerror ((*__errno_location ()))); } while (0); | |||
692 | #else /* ! DARWIN */ | |||
693 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 696, GF_LOG_ERROR , "%s: key:%s error:%s", real_path, key, strerror ((*__errno_location ()))); } while (0) | |||
694 | "%s: key:%s error:%s",do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 696, GF_LOG_ERROR , "%s: key:%s error:%s", real_path, key, strerror ((*__errno_location ()))); } while (0) | |||
695 | real_path, key,do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 696, GF_LOG_ERROR , "%s: key:%s error:%s", real_path, key, strerror ((*__errno_location ()))); } while (0) | |||
696 | strerror (errno))do { do { if (0) printf ("%s: key:%s error:%s", real_path, key , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 696, GF_LOG_ERROR , "%s: key:%s error:%s", real_path, key, strerror ((*__errno_location ()))); } while (0); | |||
697 | #endif /* DARWIN */ | |||
698 | } | |||
699 | ||||
700 | ret = -errno(*__errno_location ()); | |||
701 | goto out; | |||
702 | } | |||
703 | } | |||
704 | out: | |||
705 | return ret; | |||
706 | } | |||
707 | ||||
708 | int | |||
709 | posix_fhandle_pair (xlator_t *this, int fd, | |||
710 | char *key, data_t *value, int flags) | |||
711 | { | |||
712 | int sys_ret = -1; | |||
713 | int ret = 0; | |||
714 | ||||
715 | sys_ret = sys_fsetxattr (fd, key, value->data, | |||
716 | value->len, flags); | |||
717 | ||||
718 | if (sys_ret < 0) { | |||
719 | if (errno(*__errno_location ()) == ENOTSUP95) { | |||
720 | GF_LOG_OCCASIONALLY(gf_xattr_enotsup_log,if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 725, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
721 | this->name,GF_LOG_WARNING,if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 725, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
722 | "Extended attributes not "if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 725, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
723 | "supported (try remounting "if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 725, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
724 | "brick with 'user_xattr' "if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 725, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); } | |||
725 | "flag)")if (!(gf_xattr_enotsup_log++%42)) { do { do { if (0) printf ( "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)"); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 725, GF_LOG_WARNING, "Extended attributes not " "supported (try remounting " "brick with 'user_xattr' " "flag)" ); } while (0); }; | |||
726 | } else if (errno(*__errno_location ()) == ENOENT2) { | |||
727 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("fsetxattr on fd=%d failed: %s", fd, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 729, GF_LOG_ERROR , "fsetxattr on fd=%d failed: %s", fd, strerror ((*__errno_location ()))); } while (0) | |||
728 | "fsetxattr on fd=%d failed: %s", fd,do { do { if (0) printf ("fsetxattr on fd=%d failed: %s", fd, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 729, GF_LOG_ERROR , "fsetxattr on fd=%d failed: %s", fd, strerror ((*__errno_location ()))); } while (0) | |||
729 | strerror (errno))do { do { if (0) printf ("fsetxattr on fd=%d failed: %s", fd, strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 729, GF_LOG_ERROR , "fsetxattr on fd=%d failed: %s", fd, strerror ((*__errno_location ()))); } while (0); | |||
730 | } else { | |||
731 | ||||
732 | #ifdef GF_DARWIN_HOST_OS | |||
733 | gf_log (this->name,do { do { if (0) printf ("fd=%d: key:%s error:%s", fd, key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 737, (((*__errno_location ( )) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "fd=%d: key:%s error:%s" , fd, key, strerror ((*__errno_location ()))); } while (0) | |||
734 | ((errno == EINVAL) ?do { do { if (0) printf ("fd=%d: key:%s error:%s", fd, key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 737, (((*__errno_location ( )) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "fd=%d: key:%s error:%s" , fd, key, strerror ((*__errno_location ()))); } while (0) | |||
735 | GF_LOG_DEBUG : GF_LOG_ERROR),do { do { if (0) printf ("fd=%d: key:%s error:%s", fd, key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 737, (((*__errno_location ( )) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "fd=%d: key:%s error:%s" , fd, key, strerror ((*__errno_location ()))); } while (0) | |||
736 | "fd=%d: key:%s error:%s",do { do { if (0) printf ("fd=%d: key:%s error:%s", fd, key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 737, (((*__errno_location ( )) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "fd=%d: key:%s error:%s" , fd, key, strerror ((*__errno_location ()))); } while (0) | |||
737 | fd, key, strerror (errno))do { do { if (0) printf ("fd=%d: key:%s error:%s", fd, key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 737, (((*__errno_location ( )) == 22) ? GF_LOG_DEBUG : GF_LOG_ERROR), "fd=%d: key:%s error:%s" , fd, key, strerror ((*__errno_location ()))); } while (0); | |||
738 | #else /* ! DARWIN */ | |||
739 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("fd=%d: key:%s error:%s", fd, key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 741, GF_LOG_ERROR, "fd=%d: key:%s error:%s" , fd, key, strerror ((*__errno_location ()))); } while (0) | |||
740 | "fd=%d: key:%s error:%s",do { do { if (0) printf ("fd=%d: key:%s error:%s", fd, key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 741, GF_LOG_ERROR, "fd=%d: key:%s error:%s" , fd, key, strerror ((*__errno_location ()))); } while (0) | |||
741 | fd, key, strerror (errno))do { do { if (0) printf ("fd=%d: key:%s error:%s", fd, key, strerror ((*__errno_location ()))); } while (0); _gf_log (this->name , "posix-helpers.c", __FUNCTION__, 741, GF_LOG_ERROR, "fd=%d: key:%s error:%s" , fd, key, strerror ((*__errno_location ()))); } while (0); | |||
742 | #endif /* DARWIN */ | |||
743 | } | |||
744 | ||||
745 | ret = -errno(*__errno_location ()); | |||
746 | goto out; | |||
747 | } | |||
748 | ||||
749 | out: | |||
750 | return ret; | |||
751 | } | |||
752 | ||||
753 | ||||
754 | static int | |||
755 | janitor_walker (const char *fpath, const struct stat *sb, | |||
756 | int typeflag, struct FTW *ftwbuf) | |||
757 | { | |||
758 | struct iatt stbuf = {0, }; | |||
759 | xlator_t *this = NULL((void*)0); | |||
760 | ||||
761 | this = THIS(*__glusterfs_this_location()); | |||
762 | posix_pstat (this, NULL((void*)0), fpath, &stbuf); | |||
763 | switch (sb->st_mode & S_IFMT0170000) { | |||
764 | case S_IFREG0100000: | |||
765 | case S_IFBLK0060000: | |||
766 | case S_IFLNK0120000: | |||
767 | case S_IFCHR0020000: | |||
768 | case S_IFIFO0010000: | |||
769 | case S_IFSOCK0140000: | |||
770 | gf_log (THIS->name, GF_LOG_TRACE,do { do { if (0) printf ("unlinking %s", fpath); } while (0); _gf_log ((*__glusterfs_this_location())->name, "posix-helpers.c" , __FUNCTION__, 771, GF_LOG_TRACE, "unlinking %s", fpath); } while (0) | |||
771 | "unlinking %s", fpath)do { do { if (0) printf ("unlinking %s", fpath); } while (0); _gf_log ((*__glusterfs_this_location())->name, "posix-helpers.c" , __FUNCTION__, 771, GF_LOG_TRACE, "unlinking %s", fpath); } while (0); | |||
772 | unlink (fpath); | |||
773 | if (stbuf.ia_nlink == 1) | |||
774 | posix_handle_unset (this, stbuf.ia_gfid, NULL((void*)0)); | |||
775 | break; | |||
776 | ||||
777 | case S_IFDIR0040000: | |||
778 | if (ftwbuf->level) { /* don't remove top level dir */ | |||
779 | gf_log (THIS->name, GF_LOG_TRACE,do { do { if (0) printf ("removing directory %s", fpath); } while (0); _gf_log ((*__glusterfs_this_location())->name, "posix-helpers.c" , __FUNCTION__, 780, GF_LOG_TRACE, "removing directory %s", fpath ); } while (0) | |||
780 | "removing directory %s", fpath)do { do { if (0) printf ("removing directory %s", fpath); } while (0); _gf_log ((*__glusterfs_this_location())->name, "posix-helpers.c" , __FUNCTION__, 780, GF_LOG_TRACE, "removing directory %s", fpath ); } while (0); | |||
781 | ||||
782 | rmdir (fpath); | |||
783 | posix_handle_unset (this, stbuf.ia_gfid, NULL((void*)0)); | |||
784 | } | |||
785 | break; | |||
786 | } | |||
787 | ||||
788 | return 0; /* 0 = FTW_CONTINUE */ | |||
789 | } | |||
790 | ||||
791 | ||||
792 | static struct posix_fd * | |||
793 | janitor_get_next_fd (xlator_t *this) | |||
794 | { | |||
795 | struct posix_private *priv = NULL((void*)0); | |||
796 | struct posix_fd *pfd = NULL((void*)0); | |||
797 | ||||
798 | struct timespec timeout; | |||
799 | ||||
800 | priv = this->private; | |||
801 | ||||
802 | pthread_mutex_lock (&priv->janitor_lock); | |||
803 | { | |||
804 | if (list_empty (&priv->janitor_fds)) { | |||
805 | time (&timeout.tv_sec); | |||
806 | timeout.tv_sec += priv->janitor_sleep_duration; | |||
807 | timeout.tv_nsec = 0; | |||
808 | ||||
809 | pthread_cond_timedwait (&priv->janitor_cond, | |||
810 | &priv->janitor_lock, | |||
811 | &timeout); | |||
812 | goto unlock; | |||
813 | } | |||
814 | ||||
815 | pfd = list_entry (priv->janitor_fds.next, struct posix_fd,((struct posix_fd *)((char *)(priv->janitor_fds.next)-(unsigned long)(&((struct posix_fd *)0)->list))) | |||
816 | list)((struct posix_fd *)((char *)(priv->janitor_fds.next)-(unsigned long)(&((struct posix_fd *)0)->list))); | |||
817 | ||||
818 | list_del (priv->janitor_fds.next); | |||
819 | } | |||
820 | unlock: | |||
821 | pthread_mutex_unlock (&priv->janitor_lock); | |||
822 | ||||
823 | return pfd; | |||
824 | } | |||
825 | ||||
826 | ||||
827 | static void * | |||
828 | posix_janitor_thread_proc (void *data) | |||
829 | { | |||
830 | xlator_t * this = NULL((void*)0); | |||
831 | struct posix_private *priv = NULL((void*)0); | |||
832 | struct posix_fd *pfd; | |||
833 | ||||
834 | time_t now; | |||
835 | ||||
836 | this = data; | |||
837 | priv = this->private; | |||
838 | ||||
839 | THIS(*__glusterfs_this_location()) = this; | |||
840 | ||||
841 | while (1) { | |||
842 | time (&now); | |||
843 | if ((now - priv->last_landfill_check) > priv->janitor_sleep_duration) { | |||
844 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("janitor cleaning out %s", priv-> trash_path); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 845, GF_LOG_TRACE, "janitor cleaning out %s", priv->trash_path); } while (0) | |||
845 | "janitor cleaning out %s", priv->trash_path)do { do { if (0) printf ("janitor cleaning out %s", priv-> trash_path); } while (0); _gf_log (this->name, "posix-helpers.c" , __FUNCTION__, 845, GF_LOG_TRACE, "janitor cleaning out %s", priv->trash_path); } while (0); | |||
846 | ||||
847 | nftw (priv->trash_path, | |||
848 | janitor_walker, | |||
849 | 32, | |||
850 | FTW_DEPTHFTW_DEPTH | FTW_PHYSFTW_PHYS); | |||
851 | ||||
852 | priv->last_landfill_check = now; | |||
853 | } | |||
854 | ||||
855 | pfd = janitor_get_next_fd (this); | |||
856 | if (pfd) { | |||
857 | if (pfd->dir == NULL((void*)0)) { | |||
858 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("janitor: closing file fd=%d", pfd-> fd); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__ , 859, GF_LOG_TRACE, "janitor: closing file fd=%d", pfd->fd ); } while (0) | |||
859 | "janitor: closing file fd=%d", pfd->fd)do { do { if (0) printf ("janitor: closing file fd=%d", pfd-> fd); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__ , 859, GF_LOG_TRACE, "janitor: closing file fd=%d", pfd->fd ); } while (0); | |||
860 | close (pfd->fd); | |||
861 | } else { | |||
862 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("janitor: closing dir fd=%p", pfd-> dir); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 863, GF_LOG_TRACE, "janitor: closing dir fd=%p" , pfd->dir); } while (0) | |||
863 | "janitor: closing dir fd=%p", pfd->dir)do { do { if (0) printf ("janitor: closing dir fd=%p", pfd-> dir); } while (0); _gf_log (this->name, "posix-helpers.c", __FUNCTION__, 863, GF_LOG_TRACE, "janitor: closing dir fd=%p" , pfd->dir); } while (0); | |||
864 | closedir (pfd->dir); | |||
865 | } | |||
866 | ||||
867 | GF_FREE (pfd)__gf_free (pfd); | |||
868 | } | |||
869 | } | |||
870 | ||||
871 | return NULL((void*)0); | |||
872 | } | |||
873 | ||||
874 | ||||
875 | void | |||
876 | posix_spawn_janitor_thread (xlator_t *this) | |||
877 | { | |||
878 | struct posix_private *priv = NULL((void*)0); | |||
879 | int ret = 0; | |||
880 | ||||
881 | priv = this->private; | |||
882 | ||||
883 | LOCK (&priv->lock)pthread_spin_lock (&priv->lock); | |||
884 | { | |||
885 | if (!priv->janitor_present) { | |||
886 | ret = pthread_create (&priv->janitor, NULL((void*)0), | |||
887 | posix_janitor_thread_proc, this); | |||
888 | ||||
889 | if (ret < 0) { | |||
890 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("spawning janitor thread failed: %s" , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 892, GF_LOG_ERROR , "spawning janitor thread failed: %s", strerror ((*__errno_location ()))); } while (0) | |||
891 | "spawning janitor thread failed: %s",do { do { if (0) printf ("spawning janitor thread failed: %s" , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 892, GF_LOG_ERROR , "spawning janitor thread failed: %s", strerror ((*__errno_location ()))); } while (0) | |||
892 | strerror (errno))do { do { if (0) printf ("spawning janitor thread failed: %s" , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "posix-helpers.c", __FUNCTION__, 892, GF_LOG_ERROR , "spawning janitor thread failed: %s", strerror ((*__errno_location ()))); } while (0); | |||
893 | goto unlock; | |||
894 | } | |||
895 | ||||
896 | priv->janitor_present = _gf_true; | |||
897 | } | |||
898 | } | |||
899 | unlock: | |||
900 | UNLOCK (&priv->lock)pthread_spin_unlock (&priv->lock); | |||
901 | } | |||
902 | ||||
903 | int | |||
904 | posix_acl_xattr_set (xlator_t *this, const char *path, dict_t *xattr_req) | |||
905 | { | |||
906 | int ret = 0; | |||
907 | data_t *data = NULL((void*)0); | |||
908 | struct stat stat = {0, }; | |||
909 | ||||
910 | if (!xattr_req) | |||
911 | goto out; | |||
912 | ||||
913 | if (sys_lstat (path, &stat) != 0) | |||
914 | goto out; | |||
915 | ||||
916 | data = dict_get (xattr_req, "system.posix_acl_access"); | |||
917 | if (data) { | |||
918 | ret = sys_lsetxattr (path, "system.posix_acl_access", | |||
919 | data->data, data->len, 0); | |||
920 | if (ret != 0) | |||
921 | goto out; | |||
922 | } | |||
923 | ||||
924 | data = dict_get (xattr_req, "system.posix_acl_default"); | |||
925 | if (data) { | |||
926 | ret = sys_lsetxattr (path, "system.posix_acl_default", | |||
927 | data->data, data->len, 0); | |||
928 | if (ret != 0) | |||
929 | goto out; | |||
930 | } | |||
931 | ||||
932 | out: | |||
933 | return ret; | |||
934 | } | |||
935 | ||||
936 | static int | |||
937 | _handle_entry_create_keyvalue_pair (dict_t *d, char *k, data_t *v, | |||
938 | void *tmp) | |||
939 | { | |||
940 | int ret = -1; | |||
941 | posix_xattr_filler_t *filler = NULL((void*)0); | |||
942 | ||||
943 | filler = tmp; | |||
944 | ||||
945 | if (!strcmp (GFID_XATTR_KEY"trusted.gfid", k) || | |||
946 | !strcmp ("gfid-req", k) || | |||
947 | !strcmp ("system.posix_acl_default", k) || | |||
948 | !strcmp ("system.posix_acl_access", k) || | |||
949 | ZR_FILE_CONTENT_REQUEST(k)(!strncmp(k, "glusterfs.file.", 15))) { | |||
950 | return 0; | |||
951 | } | |||
952 | ||||
953 | ret = posix_handle_pair (filler->this, filler->real_path, k, v, | |||
954 | XATTR_CREATEXATTR_CREATE); | |||
955 | if (ret < 0) { | |||
956 | errno(*__errno_location ()) = -ret; | |||
957 | return -1; | |||
958 | } | |||
959 | return 0; | |||
960 | } | |||
961 | ||||
962 | int | |||
963 | posix_entry_create_xattr_set (xlator_t *this, const char *path, | |||
964 | dict_t *dict) | |||
965 | { | |||
966 | int ret = -1; | |||
967 | ||||
968 | posix_xattr_filler_t filler = {0,}; | |||
969 | ||||
970 | if (!dict) | |||
971 | goto out; | |||
972 | ||||
973 | filler.this = this; | |||
974 | filler.real_path = path; | |||
975 | ||||
976 | ret = dict_foreach (dict, _handle_entry_create_keyvalue_pair, &filler); | |||
977 | ||||
978 | out: | |||
979 | return ret; | |||
980 | } | |||
981 | ||||
982 | ||||
983 | static int | |||
984 | __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p) | |||
985 | { | |||
986 | uint64_t tmp_pfd = 0; | |||
987 | struct posix_fd *pfd = NULL((void*)0); | |||
988 | int ret = -1; | |||
989 | char *real_path = NULL((void*)0); | |||
990 | int _fd = -1; | |||
991 | DIR *dir = NULL((void*)0); | |||
992 | ||||
993 | ret = __fd_ctx_get (fd, this, &tmp_pfd); | |||
994 | if (ret == 0) { | |||
995 | pfd = (void *)(long) tmp_pfd; | |||
996 | ret = 0; | |||
997 | goto out; | |||
998 | } | |||
999 | ||||
1000 | if (!fd_is_anonymous(fd)) | |||
1001 | /* anonymous fd */ | |||
1002 | goto out; | |||
1003 | ||||
1004 | MAKE_HANDLE_PATH (real_path, this, fd->inode->gfid, NULL)do { int __len; __len = posix_handle_path (this, fd->inode ->gfid, ((void*)0), ((void*)0), 0); if (__len <= 0) break ; real_path = __builtin_alloca (__len); __len = posix_handle_path (this, fd->inode->gfid, ((void*)0), real_path, __len); } while (0); | |||
1005 | ||||
1006 | pfd = GF_CALLOC (1, sizeof (*pfd), gf_posix_mt_posix_fd)__gf_calloc (1, sizeof (*pfd), gf_posix_mt_posix_fd); | |||
1007 | if (!pfd) { | |||
1008 | goto out; | |||
1009 | } | |||
1010 | pfd->fd = -1; | |||
1011 | ||||
1012 | if (fd->inode->ia_type == IA_IFDIR) { | |||
1013 | dir = opendir (real_path); | |||
| ||||
1014 | if (!dir) { | |||
1015 | GF_FREE (pfd)__gf_free (pfd); | |||
1016 | pfd = NULL((void*)0); | |||
1017 | goto out; | |||
1018 | } | |||
1019 | _fd = dirfd (dir); | |||
1020 | } | |||
1021 | ||||
1022 | if (fd->inode->ia_type == IA_IFREG) { | |||
1023 | _fd = open (real_path, O_RDWR02|O_LARGEFILE0100000); | |||
1024 | if (_fd == -1) { | |||
1025 | GF_FREE (pfd)__gf_free (pfd); | |||
1026 | pfd = NULL((void*)0); | |||
1027 | goto out; | |||
1028 | } | |||
1029 | } | |||
1030 | ||||
1031 | pfd->fd = _fd; | |||
1032 | pfd->dir = dir; | |||
1033 | ||||
1034 | ret = __fd_ctx_set (fd, this, (uint64_t) (long) pfd); | |||
1035 | if (ret != 0) { | |||
1036 | if (_fd != -1) | |||
1037 | close (_fd); | |||
1038 | if (dir) | |||
1039 | closedir (dir); | |||
1040 | GF_FREE (pfd)__gf_free (pfd); | |||
1041 | pfd = NULL((void*)0); | |||
1042 | goto out; | |||
1043 | } | |||
1044 | ||||
1045 | ret = 0; | |||
1046 | out: | |||
1047 | if (pfd_p) | |||
1048 | *pfd_p = pfd; | |||
1049 | return ret; | |||
1050 | } | |||
1051 | ||||
1052 | ||||
1053 | int | |||
1054 | posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd) | |||
1055 | { | |||
1056 | int ret; | |||
1057 | ||||
1058 | LOCK (&fd->inode->lock)pthread_spin_lock (&fd->inode->lock); | |||
1059 | { | |||
1060 | ret = __posix_fd_ctx_get (fd, this, pfd); | |||
| ||||
1061 | } | |||
1062 | UNLOCK (&fd->inode->lock)pthread_spin_unlock (&fd->inode->lock); | |||
1063 | ||||
1064 | return ret; | |||
1065 | } |