File: | xlators/cluster/dht/src/dht-common.c |
Location: | line 4646, column 9 |
Description: | Access to field 'this' results in a dereference of a null pointer (loaded from variable 'lookup_frame') |
1 | /* | |||||
2 | Copyright (c) 2008-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 | ||||||
11 | ||||||
12 | #ifndef _CONFIG_H | |||||
13 | #define _CONFIG_H | |||||
14 | #include "config.h" | |||||
15 | #endif | |||||
16 | ||||||
17 | /* TODO: add NS locking */ | |||||
18 | ||||||
19 | #include "glusterfs.h" | |||||
20 | #include "xlator.h" | |||||
21 | #include "libxlator.h" | |||||
22 | #include "dht-common.h" | |||||
23 | #include "defaults.h" | |||||
24 | #include "byte-order.h" | |||||
25 | ||||||
26 | #include <sys/time.h> | |||||
27 | #include <libgen.h> | |||||
28 | ||||||
29 | int | |||||
30 | dht_aggregate (dict_t *this, char *key, data_t *value, void *data) | |||||
31 | { | |||||
32 | dict_t *dst = NULL((void*)0); | |||||
33 | int64_t *ptr = 0, *size = NULL((void*)0); | |||||
34 | int32_t ret = -1; | |||||
35 | data_t *dict_data = NULL((void*)0); | |||||
36 | ||||||
37 | dst = data; | |||||
38 | ||||||
39 | if (strcmp (key, GF_XATTR_QUOTA_SIZE_KEY"trusted.glusterfs.quota.size") == 0) { | |||||
40 | ret = dict_get_bin (dst, key, (void **)&size); | |||||
41 | if (ret < 0) { | |||||
42 | size = GF_CALLOC (1, sizeof (int64_t),__gf_calloc (1, sizeof (int64_t), gf_common_mt_char) | |||||
43 | gf_common_mt_char)__gf_calloc (1, sizeof (int64_t), gf_common_mt_char); | |||||
44 | if (size == NULL((void*)0)) { | |||||
45 | gf_log ("dht", GF_LOG_WARNING,do { do { if (0) printf ("memory allocation failed"); } while (0); _gf_log ("dht", "dht-common.c", __FUNCTION__, 46, GF_LOG_WARNING , "memory allocation failed"); } while (0) | |||||
46 | "memory allocation failed")do { do { if (0) printf ("memory allocation failed"); } while (0); _gf_log ("dht", "dht-common.c", __FUNCTION__, 46, GF_LOG_WARNING , "memory allocation failed"); } while (0); | |||||
47 | return -1; | |||||
48 | } | |||||
49 | ret = dict_set_bin (dst, key, size, sizeof (int64_t)); | |||||
50 | if (ret < 0) { | |||||
51 | gf_log ("dht", GF_LOG_WARNING,do { do { if (0) printf ("dht aggregate dict set failed"); } while (0); _gf_log ("dht", "dht-common.c", __FUNCTION__, 52, GF_LOG_WARNING , "dht aggregate dict set failed"); } while (0) | |||||
52 | "dht aggregate dict set failed")do { do { if (0) printf ("dht aggregate dict set failed"); } while (0); _gf_log ("dht", "dht-common.c", __FUNCTION__, 52, GF_LOG_WARNING , "dht aggregate dict set failed"); } while (0); | |||||
53 | GF_FREE (size)__gf_free (size); | |||||
54 | return -1; | |||||
55 | } | |||||
56 | } | |||||
57 | ||||||
58 | ptr = data_to_bin (value); | |||||
59 | if (ptr == NULL((void*)0)) { | |||||
60 | gf_log ("dht", GF_LOG_WARNING, "data to bin failed")do { do { if (0) printf ("data to bin failed"); } while (0); _gf_log ("dht", "dht-common.c", __FUNCTION__, 60, GF_LOG_WARNING, "data to bin failed" ); } while (0); | |||||
61 | return -1; | |||||
62 | } | |||||
63 | ||||||
64 | *size = hton64 (ntoh64hton64 (*size) + ntoh64hton64 (*ptr)); | |||||
65 | } else { | |||||
66 | /* compare user xattrs only */ | |||||
67 | if (!strncmp (key, "user.", strlen ("user."))) { | |||||
68 | ret = dict_lookup (dst, key, &dict_data); | |||||
69 | if (!ret && dict_data && value) { | |||||
70 | ret = is_data_equal (dict_data, value); | |||||
71 | if (!ret) | |||||
72 | gf_log ("dht", GF_LOG_DEBUG,do { do { if (0) printf ("xattr mismatch for %s", key); } while (0); _gf_log ("dht", "dht-common.c", __FUNCTION__, 73, GF_LOG_DEBUG , "xattr mismatch for %s", key); } while (0) | |||||
73 | "xattr mismatch for %s", key)do { do { if (0) printf ("xattr mismatch for %s", key); } while (0); _gf_log ("dht", "dht-common.c", __FUNCTION__, 73, GF_LOG_DEBUG , "xattr mismatch for %s", key); } while (0); | |||||
74 | } | |||||
75 | } | |||||
76 | ret = dict_set (dst, key, value); | |||||
77 | if (ret) | |||||
78 | gf_log ("dht", GF_LOG_WARNING, "xattr dict set failed")do { do { if (0) printf ("xattr dict set failed"); } while (0 ); _gf_log ("dht", "dht-common.c", __FUNCTION__, 78, GF_LOG_WARNING , "xattr dict set failed"); } while (0); | |||||
79 | } | |||||
80 | ||||||
81 | return 0; | |||||
82 | } | |||||
83 | ||||||
84 | ||||||
85 | void | |||||
86 | dht_aggregate_xattr (dict_t *dst, dict_t *src) | |||||
87 | { | |||||
88 | if ((dst == NULL((void*)0)) || (src == NULL((void*)0))) { | |||||
89 | goto out; | |||||
90 | } | |||||
91 | ||||||
92 | dict_foreach (src, dht_aggregate, dst); | |||||
93 | out: | |||||
94 | return; | |||||
95 | } | |||||
96 | ||||||
97 | /* TODO: | |||||
98 | - use volumename in xattr instead of "dht" | |||||
99 | - use NS locks | |||||
100 | - handle all cases in self heal layout reconstruction | |||||
101 | - complete linkfile selfheal | |||||
102 | */ | |||||
103 | ||||||
104 | ||||||
105 | int | |||||
106 | dht_lookup_selfheal_cbk (call_frame_t *frame, void *cookie, | |||||
107 | xlator_t *this, | |||||
108 | int op_ret, int op_errno, dict_t *xdata) | |||||
109 | { | |||||
110 | dht_local_t *local = NULL((void*)0); | |||||
111 | dht_layout_t *layout = NULL((void*)0); | |||||
112 | int ret = -1; | |||||
113 | ||||||
114 | GF_VALIDATE_OR_GOTO ("dht", frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 114, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto out; } } while (0); | |||||
115 | GF_VALIDATE_OR_GOTO ("dht", this, out)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 115, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto out; } } while (0); | |||||
116 | GF_VALIDATE_OR_GOTO ("dht", frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 116, GF_LOG_ERROR, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
117 | ||||||
118 | local = frame->local; | |||||
119 | ret = op_ret; | |||||
120 | ||||||
121 | FRAME_SU_UNDO (frame, dht_local_t)do { dht_local_t *__local = (frame)->local; frame->root ->uid = __local->uid; frame->root->gid = __local-> gid; } while (0);; | |||||
122 | ||||||
123 | if (ret == 0) { | |||||
124 | layout = local->selfheal.layout; | |||||
125 | ret = dht_layout_set (this, local->inode, layout); | |||||
126 | } | |||||
127 | ||||||
128 | if (local->loc.parent) { | |||||
129 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
130 | &local->postparent, 1); | |||||
131 | } | |||||
132 | ||||||
133 | DHT_STRIP_PHASE1_FLAGS (&local->stbuf)do { if ((&local->stbuf) && ( ((&local-> stbuf)->ia_type == IA_IFREG) && ((&local->stbuf )->ia_prot.sticky == 1) && ((&local->stbuf) ->ia_prot.sgid == 1))) { (&local->stbuf)->ia_prot .sticky = 0; (&local->stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
134 | ||||||
135 | DHT_STACK_UNWIND (lookup, frame, ret, local->op_errno, local->inode,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 136, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, ret, local->op_errno, local->inode, &local ->stbuf, local->xattr, &local->postparent); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
136 | &local->stbuf, local->xattr, &local->postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 136, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, ret, local->op_errno, local->inode, &local ->stbuf, local->xattr, &local->postparent); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
137 | ||||||
138 | out: | |||||
139 | return ret; | |||||
140 | } | |||||
141 | ||||||
142 | ||||||
143 | int | |||||
144 | dht_discover_complete (xlator_t *this, call_frame_t *discover_frame) | |||||
145 | { | |||||
146 | dht_local_t *local = NULL((void*)0); | |||||
147 | call_frame_t *main_frame = NULL((void*)0); | |||||
148 | int op_errno = 0; | |||||
149 | int ret = -1; | |||||
150 | dht_layout_t *layout = NULL((void*)0); | |||||
151 | ||||||
152 | local = discover_frame->local; | |||||
153 | layout = local->layout; | |||||
154 | ||||||
155 | LOCK(&discover_frame->lock)pthread_spin_lock (&discover_frame->lock); | |||||
156 | { | |||||
157 | main_frame = local->main_frame; | |||||
158 | local->main_frame = NULL((void*)0); | |||||
159 | } | |||||
160 | UNLOCK(&discover_frame->lock)pthread_spin_unlock (&discover_frame->lock); | |||||
161 | ||||||
162 | if (!main_frame) | |||||
163 | return 0; | |||||
164 | ||||||
165 | if (local->file_count && local->dir_count) { | |||||
166 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 170, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0) | |||||
167 | "path %s exists as a file on one subvolume "do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 170, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0) | |||||
168 | "and directory on another. "do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 170, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0) | |||||
169 | "Please fix it manually",do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 170, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0) | |||||
170 | local->loc.path)do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 170, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); | |||||
171 | op_errno = EIO5; | |||||
172 | goto out; | |||||
173 | } | |||||
174 | ||||||
175 | if (local->cached_subvol) { | |||||
176 | ret = dht_layout_preset (this, local->cached_subvol, | |||||
177 | local->inode); | |||||
178 | if (ret < 0) { | |||||
179 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("failed to set layout for subvolume %s" , local->cached_subvol ? local->cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 181, GF_LOG_WARNING, "failed to set layout for subvolume %s" , local->cached_subvol ? local->cached_subvol->name : "<nil>"); } while (0) | |||||
180 | "failed to set layout for subvolume %s",do { do { if (0) printf ("failed to set layout for subvolume %s" , local->cached_subvol ? local->cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 181, GF_LOG_WARNING, "failed to set layout for subvolume %s" , local->cached_subvol ? local->cached_subvol->name : "<nil>"); } while (0) | |||||
181 | local->cached_subvol ? local->cached_subvol->name : "<nil>")do { do { if (0) printf ("failed to set layout for subvolume %s" , local->cached_subvol ? local->cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 181, GF_LOG_WARNING, "failed to set layout for subvolume %s" , local->cached_subvol ? local->cached_subvol->name : "<nil>"); } while (0); | |||||
182 | op_errno = EINVAL22; | |||||
183 | goto out; | |||||
184 | } | |||||
185 | } else { | |||||
186 | ret = dht_layout_normalize (this, &local->loc, layout); | |||||
187 | if ((ret < 0) || ((ret > 0) && (local->op_ret != 0))) { | |||||
188 | /* either the layout is incorrect or the directory is | |||||
189 | * not found even in one subvolume. | |||||
190 | */ | |||||
191 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local->loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 195, GF_LOG_DEBUG, "normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local-> loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0 ); } while (0) | |||||
192 | "normalizing failed on %s "do { do { if (0) printf ("normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local->loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 195, GF_LOG_DEBUG, "normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local-> loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0 ); } while (0) | |||||
193 | "(overlaps/holes present: %s, "do { do { if (0) printf ("normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local->loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 195, GF_LOG_DEBUG, "normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local-> loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0 ); } while (0) | |||||
194 | "ENOENT errors: %d)", local->loc.path,do { do { if (0) printf ("normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local->loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 195, GF_LOG_DEBUG, "normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local-> loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0 ); } while (0) | |||||
195 | (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0)do { do { if (0) printf ("normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local->loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 195, GF_LOG_DEBUG, "normalizing failed on %s " "(overlaps/holes present: %s, " "ENOENT errors: %d)", local-> loc.path, (ret < 0) ? "yes" : "no", (ret > 0) ? ret : 0 ); } while (0); | |||||
196 | op_errno = EINVAL22; | |||||
197 | goto out; | |||||
198 | } | |||||
199 | ||||||
200 | dht_layout_set (this, local->inode, layout); | |||||
201 | } | |||||
202 | ||||||
203 | DHT_STACK_UNWIND (lookup, main_frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (main_frame) { __xl = main_frame->this; __local = main_frame->local; main_frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ( (void*)0); xlator_t *old_THIS = ((void*)0); if (!main_frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack" , "dht-common.c", __FUNCTION__, 205, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_lookup_cbk_t )main_frame-> ret; _parent = main_frame->parent; pthread_spin_lock (& main_frame->root->stack_lock); { _parent->ref_count-- ; } pthread_spin_unlock (&main_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; main_frame->complete = _gf_true; main_frame ->unwind_from = __FUNCTION__; if (main_frame->this-> ctx->measure_latency) gf_latency_end (main_frame); fn (_parent , main_frame->cookie, _parent->this, local->op_ret, local ->op_errno, local->inode, &local->stbuf, local-> xattr, &local->postparent); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
204 | local->inode, &local->stbuf, local->xattr,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (main_frame) { __xl = main_frame->this; __local = main_frame->local; main_frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ( (void*)0); xlator_t *old_THIS = ((void*)0); if (!main_frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack" , "dht-common.c", __FUNCTION__, 205, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_lookup_cbk_t )main_frame-> ret; _parent = main_frame->parent; pthread_spin_lock (& main_frame->root->stack_lock); { _parent->ref_count-- ; } pthread_spin_unlock (&main_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; main_frame->complete = _gf_true; main_frame ->unwind_from = __FUNCTION__; if (main_frame->this-> ctx->measure_latency) gf_latency_end (main_frame); fn (_parent , main_frame->cookie, _parent->this, local->op_ret, local ->op_errno, local->inode, &local->stbuf, local-> xattr, &local->postparent); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
205 | &local->postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (main_frame) { __xl = main_frame->this; __local = main_frame->local; main_frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ( (void*)0); xlator_t *old_THIS = ((void*)0); if (!main_frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack" , "dht-common.c", __FUNCTION__, 205, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_lookup_cbk_t )main_frame-> ret; _parent = main_frame->parent; pthread_spin_lock (& main_frame->root->stack_lock); { _parent->ref_count-- ; } pthread_spin_unlock (&main_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; main_frame->complete = _gf_true; main_frame ->unwind_from = __FUNCTION__; if (main_frame->this-> ctx->measure_latency) gf_latency_end (main_frame); fn (_parent , main_frame->cookie, _parent->this, local->op_ret, local ->op_errno, local->inode, &local->stbuf, local-> xattr, &local->postparent); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
206 | return 0; | |||||
207 | out: | |||||
208 | DHT_STACK_UNWIND (lookup, main_frame, -1, op_errno, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (main_frame) { __xl = main_frame->this; __local = main_frame->local; main_frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ( (void*)0); xlator_t *old_THIS = ((void*)0); if (!main_frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack" , "dht-common.c", __FUNCTION__, 209, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_lookup_cbk_t )main_frame-> ret; _parent = main_frame->parent; pthread_spin_lock (& main_frame->root->stack_lock); { _parent->ref_count-- ; } pthread_spin_unlock (&main_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; main_frame->complete = _gf_true; main_frame ->unwind_from = __FUNCTION__; if (main_frame->this-> ctx->measure_latency) gf_latency_end (main_frame); fn (_parent , main_frame->cookie, _parent->this, -1, op_errno, ((void *)0), ((void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
209 | NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (main_frame) { __xl = main_frame->this; __local = main_frame->local; main_frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ( (void*)0); xlator_t *old_THIS = ((void*)0); if (!main_frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack" , "dht-common.c", __FUNCTION__, 209, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_lookup_cbk_t )main_frame-> ret; _parent = main_frame->parent; pthread_spin_lock (& main_frame->root->stack_lock); { _parent->ref_count-- ; } pthread_spin_unlock (&main_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; main_frame->complete = _gf_true; main_frame ->unwind_from = __FUNCTION__; if (main_frame->this-> ctx->measure_latency) gf_latency_end (main_frame); fn (_parent , main_frame->cookie, _parent->this, -1, op_errno, ((void *)0), ((void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
210 | ||||||
211 | return ret; | |||||
212 | } | |||||
213 | ||||||
214 | ||||||
215 | int | |||||
216 | dht_discover_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
217 | int op_ret, int op_errno, | |||||
218 | inode_t *inode, struct iatt *stbuf, dict_t *xattr, | |||||
219 | struct iatt *postparent) | |||||
220 | { | |||||
221 | dht_local_t *local = NULL((void*)0); | |||||
222 | int this_call_cnt = 0; | |||||
223 | call_frame_t *prev = NULL((void*)0); | |||||
224 | dht_layout_t *layout = NULL((void*)0); | |||||
225 | int ret = -1; | |||||
226 | int is_dir = 0; | |||||
227 | int is_linkfile = 0; | |||||
228 | int attempt_unwind = 0; | |||||
229 | dht_conf_t *conf = 0; | |||||
230 | ||||||
231 | GF_VALIDATE_OR_GOTO ("dht", frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 231, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto out; } } while (0); | |||||
232 | GF_VALIDATE_OR_GOTO ("dht", this, out)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 232, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto out; } } while (0); | |||||
233 | GF_VALIDATE_OR_GOTO ("dht", frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 233, GF_LOG_ERROR, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
234 | GF_VALIDATE_OR_GOTO ("dht", this->private, out)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 234, GF_LOG_ERROR, "invalid argument: " "this->private") ; } while (0); goto out; } } while (0); | |||||
235 | GF_VALIDATE_OR_GOTO ("dht", cookie, out)do { if (!cookie) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "cookie"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 235, GF_LOG_ERROR, "invalid argument: " "cookie"); } while (0); goto out; } } while (0); | |||||
236 | ||||||
237 | local = frame->local; | |||||
238 | prev = cookie; | |||||
239 | conf = this->private; | |||||
240 | ||||||
241 | layout = local->layout; | |||||
242 | ||||||
243 | /* Check if the gfid is different for file from other node */ | |||||
244 | if (!op_ret && uuid_compare (local->gfid, stbuf->ia_gfid)) { | |||||
245 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: gfid different on %s", local-> loc.path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 247, GF_LOG_WARNING, "%s: gfid different on %s", local->loc.path, prev->this ->name); } while (0) | |||||
246 | "%s: gfid different on %s",do { do { if (0) printf ("%s: gfid different on %s", local-> loc.path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 247, GF_LOG_WARNING, "%s: gfid different on %s", local->loc.path, prev->this ->name); } while (0) | |||||
247 | local->loc.path, prev->this->name)do { do { if (0) printf ("%s: gfid different on %s", local-> loc.path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 247, GF_LOG_WARNING, "%s: gfid different on %s", local->loc.path, prev->this ->name); } while (0); | |||||
248 | } | |||||
249 | ||||||
250 | ||||||
251 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
252 | { | |||||
253 | /* TODO: assert equal mode on stbuf->st_mode and | |||||
254 | local->stbuf->st_mode | |||||
255 | ||||||
256 | else mkdir/chmod/chown and fix | |||||
257 | */ | |||||
258 | ret = dht_layout_merge (this, layout, prev->this, | |||||
259 | op_ret, op_errno, xattr); | |||||
260 | if (ret) | |||||
261 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: failed to merge layouts", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 262, GF_LOG_WARNING, "%s: failed to merge layouts" , local->loc.path); } while (0) | |||||
262 | "%s: failed to merge layouts", local->loc.path)do { do { if (0) printf ("%s: failed to merge layouts", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 262, GF_LOG_WARNING, "%s: failed to merge layouts" , local->loc.path); } while (0); | |||||
263 | ||||||
264 | if (op_ret == -1) { | |||||
265 | local->op_errno = op_errno; | |||||
266 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 269, GF_LOG_DEBUG, "lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0) | |||||
267 | "lookup of %s on %s returned error (%s)",do { do { if (0) printf ("lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 269, GF_LOG_DEBUG, "lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0) | |||||
268 | local->loc.path, prev->this->name,do { do { if (0) printf ("lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 269, GF_LOG_DEBUG, "lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0) | |||||
269 | strerror (op_errno))do { do { if (0) printf ("lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 269, GF_LOG_DEBUG, "lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); | |||||
270 | ||||||
271 | goto unlock; | |||||
272 | } | |||||
273 | ||||||
274 | is_linkfile = check_is_linkfile (inode, stbuf, xattr,( ((st_mode_from_ia ((stbuf)->ia_prot, (stbuf)->ia_type ) & ~0170000) == (01000)) && dict_get (xattr, conf ->link_xattr_name)) | |||||
275 | conf->link_xattr_name)( ((st_mode_from_ia ((stbuf)->ia_prot, (stbuf)->ia_type ) & ~0170000) == (01000)) && dict_get (xattr, conf ->link_xattr_name)); | |||||
276 | is_dir = check_is_dir (inode, stbuf, xattr)((stbuf->ia_type == IA_IFDIR)); | |||||
277 | ||||||
278 | if (is_dir) { | |||||
279 | local->dir_count ++; | |||||
280 | } else { | |||||
281 | local->file_count ++; | |||||
282 | ||||||
283 | if (!is_linkfile) { | |||||
284 | /* real file */ | |||||
285 | local->cached_subvol = prev->this; | |||||
286 | attempt_unwind = 1; | |||||
287 | } else { | |||||
288 | goto unlock; | |||||
289 | } | |||||
290 | } | |||||
291 | ||||||
292 | local->op_ret = 0; | |||||
293 | ||||||
294 | if (local->xattr == NULL((void*)0)) { | |||||
295 | local->xattr = dict_ref (xattr); | |||||
296 | } else { | |||||
297 | dht_aggregate_xattr (local->xattr, xattr); | |||||
298 | } | |||||
299 | ||||||
300 | if (local->inode == NULL((void*)0)) | |||||
301 | local->inode = inode_ref (inode); | |||||
302 | ||||||
303 | dht_iatt_merge (this, &local->stbuf, stbuf, prev->this); | |||||
304 | dht_iatt_merge (this, &local->postparent, postparent, | |||||
305 | prev->this); | |||||
306 | } | |||||
307 | unlock: | |||||
308 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
309 | out: | |||||
310 | this_call_cnt = dht_frame_return (frame); | |||||
311 | ||||||
312 | if (is_last_call (this_call_cnt)(this_call_cnt == 0) || attempt_unwind) { | |||||
313 | dht_discover_complete (this, frame); | |||||
314 | } | |||||
315 | ||||||
316 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) | |||||
317 | DHT_STACK_DESTROY (frame)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); __xl = frame->this; __local = frame->local; frame ->local = ((void*)0); STACK_DESTROY (frame->root); dht_local_wipe (__xl, __local); } while (0); | |||||
318 | ||||||
319 | return 0; | |||||
320 | } | |||||
321 | ||||||
322 | ||||||
323 | int | |||||
324 | dht_discover (call_frame_t *frame, xlator_t *this, loc_t *loc) | |||||
325 | { | |||||
326 | int ret; | |||||
327 | dht_local_t *local = NULL((void*)0); | |||||
328 | dht_conf_t *conf = NULL((void*)0); | |||||
329 | int call_cnt = 0; | |||||
330 | int op_errno = EINVAL22; | |||||
331 | int i = 0; | |||||
332 | call_frame_t *discover_frame = NULL((void*)0); | |||||
333 | ||||||
334 | conf = this->private; | |||||
335 | local = frame->local; | |||||
336 | ||||||
337 | ret = dict_set_uint32 (local->xattr_req, conf->xattr_name, 4 * 4); | |||||
338 | if (ret) | |||||
339 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: failed to set '%s' key", loc-> path, conf->xattr_name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 341, GF_LOG_WARNING, "%s: failed to set '%s' key" , loc->path, conf->xattr_name); } while (0) | |||||
340 | "%s: failed to set '%s' key",do { do { if (0) printf ("%s: failed to set '%s' key", loc-> path, conf->xattr_name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 341, GF_LOG_WARNING, "%s: failed to set '%s' key" , loc->path, conf->xattr_name); } while (0) | |||||
341 | loc->path, conf->xattr_name)do { do { if (0) printf ("%s: failed to set '%s' key", loc-> path, conf->xattr_name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 341, GF_LOG_WARNING, "%s: failed to set '%s' key" , loc->path, conf->xattr_name); } while (0); | |||||
342 | ||||||
343 | ret = dict_set_uint32 (local->xattr_req, conf->link_xattr_name, 256); | |||||
344 | if (ret) | |||||
345 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: failed to set '%s' key", loc-> path, conf->link_xattr_name); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 347, GF_LOG_WARNING, "%s: failed to set '%s' key" , loc->path, conf->link_xattr_name); } while (0) | |||||
346 | "%s: failed to set '%s' key",do { do { if (0) printf ("%s: failed to set '%s' key", loc-> path, conf->link_xattr_name); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 347, GF_LOG_WARNING, "%s: failed to set '%s' key" , loc->path, conf->link_xattr_name); } while (0) | |||||
347 | loc->path, conf->link_xattr_name)do { do { if (0) printf ("%s: failed to set '%s' key", loc-> path, conf->link_xattr_name); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 347, GF_LOG_WARNING, "%s: failed to set '%s' key" , loc->path, conf->link_xattr_name); } while (0); | |||||
348 | ||||||
349 | call_cnt = conf->subvolume_cnt; | |||||
350 | local->call_cnt = call_cnt; | |||||
351 | ||||||
352 | local->layout = dht_layout_new (this, conf->subvolume_cnt); | |||||
353 | ||||||
354 | if (!local->layout) { | |||||
355 | op_errno = ENOMEM12; | |||||
356 | goto err; | |||||
357 | } | |||||
358 | ||||||
359 | uuid_copy (local->gfid, loc->gfid); | |||||
360 | ||||||
361 | discover_frame = copy_frame (frame); | |||||
362 | if (!discover_frame) { | |||||
363 | op_errno = ENOMEM12; | |||||
364 | goto err; | |||||
365 | } | |||||
366 | ||||||
367 | discover_frame->local = local; | |||||
368 | frame->local = NULL((void*)0); | |||||
369 | local->main_frame = frame; | |||||
370 | ||||||
371 | for (i = 0; i < call_cnt; i++) { | |||||
372 | STACK_WIND (discover_frame, dht_discover_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (discover_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 375, GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( conf->subvolumes[i]->fops->lookup_cbk) tmp_cbk = dht_discover_cbk ; _new->root = discover_frame->root; _new->this = conf ->subvolumes[i]; _new->ret = (ret_fn_t) tmp_cbk; _new-> parent = discover_frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "conf->subvolumes[i]->fops->lookup" ; _new->unwind_to = "dht_discover_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&discover_frame ->root->stack_lock); { _new->next = discover_frame-> root->frames.next; _new->prev = &discover_frame-> root->frames; if (discover_frame->root->frames.next) discover_frame->root->frames.next->prev = _new; discover_frame ->root->frames.next = _new; discover_frame->ref_count ++; } pthread_spin_unlock (&discover_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (discover_frame->this-> ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes [i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
373 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (discover_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 375, GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( conf->subvolumes[i]->fops->lookup_cbk) tmp_cbk = dht_discover_cbk ; _new->root = discover_frame->root; _new->this = conf ->subvolumes[i]; _new->ret = (ret_fn_t) tmp_cbk; _new-> parent = discover_frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "conf->subvolumes[i]->fops->lookup" ; _new->unwind_to = "dht_discover_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&discover_frame ->root->stack_lock); { _new->next = discover_frame-> root->frames.next; _new->prev = &discover_frame-> root->frames; if (discover_frame->root->frames.next) discover_frame->root->frames.next->prev = _new; discover_frame ->root->frames.next = _new; discover_frame->ref_count ++; } pthread_spin_unlock (&discover_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (discover_frame->this-> ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes [i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
374 | conf->subvolumes[i]->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (discover_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 375, GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( conf->subvolumes[i]->fops->lookup_cbk) tmp_cbk = dht_discover_cbk ; _new->root = discover_frame->root; _new->this = conf ->subvolumes[i]; _new->ret = (ret_fn_t) tmp_cbk; _new-> parent = discover_frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "conf->subvolumes[i]->fops->lookup" ; _new->unwind_to = "dht_discover_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&discover_frame ->root->stack_lock); { _new->next = discover_frame-> root->frames.next; _new->prev = &discover_frame-> root->frames; if (discover_frame->root->frames.next) discover_frame->root->frames.next->prev = _new; discover_frame ->root->frames.next = _new; discover_frame->ref_count ++; } pthread_spin_unlock (&discover_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (discover_frame->this-> ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes [i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
375 | &local->loc, local->xattr_req)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (discover_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 375, GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( conf->subvolumes[i]->fops->lookup_cbk) tmp_cbk = dht_discover_cbk ; _new->root = discover_frame->root; _new->this = conf ->subvolumes[i]; _new->ret = (ret_fn_t) tmp_cbk; _new-> parent = discover_frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "conf->subvolumes[i]->fops->lookup" ; _new->unwind_to = "dht_discover_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&discover_frame ->root->stack_lock); { _new->next = discover_frame-> root->frames.next; _new->prev = &discover_frame-> root->frames; if (discover_frame->root->frames.next) discover_frame->root->frames.next->prev = _new; discover_frame ->root->frames.next = _new; discover_frame->ref_count ++; } pthread_spin_unlock (&discover_frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (discover_frame->this-> ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes [i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
376 | } | |||||
377 | ||||||
378 | return 0; | |||||
379 | ||||||
380 | err: | |||||
381 | DHT_STACK_UNWIND (lookup, frame, -1, op_errno, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 382, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
382 | NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 382, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
383 | ||||||
384 | return 0; | |||||
385 | } | |||||
386 | ||||||
387 | ||||||
388 | int | |||||
389 | dht_lookup_dir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
390 | int op_ret, int op_errno, | |||||
391 | inode_t *inode, struct iatt *stbuf, dict_t *xattr, | |||||
392 | struct iatt *postparent) | |||||
393 | { | |||||
394 | dht_local_t *local = NULL((void*)0); | |||||
395 | int this_call_cnt = 0; | |||||
396 | call_frame_t *prev = NULL((void*)0); | |||||
397 | dht_layout_t *layout = NULL((void*)0); | |||||
398 | int ret = -1; | |||||
399 | int is_dir = 0; | |||||
400 | ||||||
401 | GF_VALIDATE_OR_GOTO ("dht", frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 401, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto out; } } while (0); | |||||
402 | GF_VALIDATE_OR_GOTO ("dht", this, out)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 402, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto out; } } while (0); | |||||
403 | GF_VALIDATE_OR_GOTO ("dht", frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 403, GF_LOG_ERROR, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
404 | GF_VALIDATE_OR_GOTO ("dht", this->private, out)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 404, GF_LOG_ERROR, "invalid argument: " "this->private") ; } while (0); goto out; } } while (0); | |||||
405 | GF_VALIDATE_OR_GOTO ("dht", cookie, out)do { if (!cookie) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "cookie"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 405, GF_LOG_ERROR, "invalid argument: " "cookie"); } while (0); goto out; } } while (0); | |||||
406 | ||||||
407 | local = frame->local; | |||||
408 | prev = cookie; | |||||
409 | ||||||
410 | layout = local->layout; | |||||
411 | ||||||
412 | if (!op_ret && uuid_is_null (local->gfid)) | |||||
413 | memcpy (local->gfid, stbuf->ia_gfid, 16); | |||||
414 | ||||||
415 | /* Check if the gfid is different for file from other node */ | |||||
416 | if (!op_ret && uuid_compare (local->gfid, stbuf->ia_gfid)) { | |||||
417 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: gfid different on %s", local-> loc.path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 419, GF_LOG_WARNING, "%s: gfid different on %s", local->loc.path, prev->this ->name); } while (0) | |||||
418 | "%s: gfid different on %s",do { do { if (0) printf ("%s: gfid different on %s", local-> loc.path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 419, GF_LOG_WARNING, "%s: gfid different on %s", local->loc.path, prev->this ->name); } while (0) | |||||
419 | local->loc.path, prev->this->name)do { do { if (0) printf ("%s: gfid different on %s", local-> loc.path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 419, GF_LOG_WARNING, "%s: gfid different on %s", local->loc.path, prev->this ->name); } while (0); | |||||
420 | } | |||||
421 | ||||||
422 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
423 | { | |||||
424 | /* TODO: assert equal mode on stbuf->st_mode and | |||||
425 | local->stbuf->st_mode | |||||
426 | ||||||
427 | else mkdir/chmod/chown and fix | |||||
428 | */ | |||||
429 | ret = dht_layout_merge (this, layout, prev->this, | |||||
430 | op_ret, op_errno, xattr); | |||||
431 | ||||||
432 | if (op_ret == -1) { | |||||
433 | local->op_errno = ENOENT2; | |||||
434 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 437, GF_LOG_DEBUG, "lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0) | |||||
435 | "lookup of %s on %s returned error (%s)",do { do { if (0) printf ("lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 437, GF_LOG_DEBUG, "lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0) | |||||
436 | local->loc.path, prev->this->name,do { do { if (0) printf ("lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 437, GF_LOG_DEBUG, "lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0) | |||||
437 | strerror (op_errno))do { do { if (0) printf ("lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 437, GF_LOG_DEBUG, "lookup of %s on %s returned error (%s)" , local->loc.path, prev->this->name, strerror (op_errno )); } while (0); | |||||
438 | ||||||
439 | goto unlock; | |||||
440 | } | |||||
441 | ||||||
442 | is_dir = check_is_dir (inode, stbuf, xattr)((stbuf->ia_type == IA_IFDIR)); | |||||
443 | if (!is_dir) { | |||||
444 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("lookup of %s on %s returned non dir 0%o" , local->loc.path, prev->this->name, stbuf->ia_type ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 447, GF_LOG_DEBUG, "lookup of %s on %s returned non dir 0%o" , local->loc.path, prev->this->name, stbuf->ia_type ); } while (0) | |||||
445 | "lookup of %s on %s returned non dir 0%o",do { do { if (0) printf ("lookup of %s on %s returned non dir 0%o" , local->loc.path, prev->this->name, stbuf->ia_type ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 447, GF_LOG_DEBUG, "lookup of %s on %s returned non dir 0%o" , local->loc.path, prev->this->name, stbuf->ia_type ); } while (0) | |||||
446 | local->loc.path, prev->this->name,do { do { if (0) printf ("lookup of %s on %s returned non dir 0%o" , local->loc.path, prev->this->name, stbuf->ia_type ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 447, GF_LOG_DEBUG, "lookup of %s on %s returned non dir 0%o" , local->loc.path, prev->this->name, stbuf->ia_type ); } while (0) | |||||
447 | stbuf->ia_type)do { do { if (0) printf ("lookup of %s on %s returned non dir 0%o" , local->loc.path, prev->this->name, stbuf->ia_type ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 447, GF_LOG_DEBUG, "lookup of %s on %s returned non dir 0%o" , local->loc.path, prev->this->name, stbuf->ia_type ); } while (0); | |||||
448 | local->need_selfheal = 1; | |||||
449 | goto unlock; | |||||
450 | } | |||||
451 | ||||||
452 | local->op_ret = 0; | |||||
453 | if (local->xattr == NULL((void*)0)) { | |||||
454 | local->xattr = dict_ref (xattr); | |||||
455 | } else { | |||||
456 | dht_aggregate_xattr (local->xattr, xattr); | |||||
457 | } | |||||
458 | ||||||
459 | if (local->inode == NULL((void*)0)) | |||||
460 | local->inode = inode_ref (inode); | |||||
461 | ||||||
462 | dht_iatt_merge (this, &local->stbuf, stbuf, prev->this); | |||||
463 | dht_iatt_merge (this, &local->postparent, postparent, | |||||
464 | prev->this); | |||||
465 | } | |||||
466 | unlock: | |||||
467 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
468 | ||||||
469 | ||||||
470 | this_call_cnt = dht_frame_return (frame); | |||||
471 | ||||||
472 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
473 | if (local->need_selfheal) { | |||||
474 | local->need_selfheal = 0; | |||||
475 | dht_lookup_everywhere (frame, this, &local->loc); | |||||
476 | return 0; | |||||
477 | } | |||||
478 | ||||||
479 | if (local->op_ret == 0) { | |||||
480 | ret = dht_layout_normalize (this, &local->loc, layout); | |||||
481 | ||||||
482 | if (ret != 0) { | |||||
483 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("fixing assignment on %s", local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 485, GF_LOG_DEBUG, "fixing assignment on %s", local->loc.path); } while (0) | |||||
484 | "fixing assignment on %s",do { do { if (0) printf ("fixing assignment on %s", local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 485, GF_LOG_DEBUG, "fixing assignment on %s", local->loc.path); } while (0) | |||||
485 | local->loc.path)do { do { if (0) printf ("fixing assignment on %s", local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 485, GF_LOG_DEBUG, "fixing assignment on %s", local->loc.path); } while (0); | |||||
486 | goto selfheal; | |||||
487 | } | |||||
488 | ||||||
489 | dht_layout_set (this, local->inode, layout); | |||||
490 | } | |||||
491 | ||||||
492 | if (local->loc.parent) { | |||||
493 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
494 | &local->postparent, 1); | |||||
495 | } | |||||
496 | ||||||
497 | DHT_STRIP_PHASE1_FLAGS (&local->stbuf)do { if ((&local->stbuf) && ( ((&local-> stbuf)->ia_type == IA_IFREG) && ((&local->stbuf )->ia_prot.sticky == 1) && ((&local->stbuf) ->ia_prot.sgid == 1))) { (&local->stbuf)->ia_prot .sticky = 0; (&local->stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
498 | DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 500, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
499 | local->inode, &local->stbuf, local->xattr,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 500, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
500 | &local->postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 500, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
501 | } | |||||
502 | ||||||
503 | return 0; | |||||
504 | ||||||
505 | selfheal: | |||||
506 | FRAME_SU_DO (frame, dht_local_t)do { dht_local_t *__local = (frame)->local; __local->uid = frame->root->uid; __local->gid = frame->root-> gid; frame->root->uid = 0; frame->root->gid = 0; } while (0);; | |||||
507 | uuid_copy (local->loc.gfid, local->gfid); | |||||
508 | ret = dht_selfheal_directory (frame, dht_lookup_selfheal_cbk, | |||||
509 | &local->loc, layout); | |||||
510 | out: | |||||
511 | return ret; | |||||
512 | } | |||||
513 | ||||||
514 | int | |||||
515 | dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
516 | int op_ret, int op_errno, | |||||
517 | inode_t *inode, struct iatt *stbuf, dict_t *xattr, | |||||
518 | struct iatt *postparent) | |||||
519 | { | |||||
520 | dht_local_t *local = NULL((void*)0); | |||||
521 | int this_call_cnt = 0; | |||||
522 | call_frame_t *prev = NULL((void*)0); | |||||
523 | dht_layout_t *layout = NULL((void*)0); | |||||
524 | dht_conf_t *conf = NULL((void*)0); | |||||
525 | int ret = -1; | |||||
526 | int is_dir = 0; | |||||
527 | int is_linkfile = 0; | |||||
528 | call_frame_t *copy = NULL((void*)0); | |||||
529 | dht_local_t *copy_local = NULL((void*)0); | |||||
530 | ||||||
531 | GF_VALIDATE_OR_GOTO ("dht", frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 531, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto err; } } while (0); | |||||
532 | GF_VALIDATE_OR_GOTO ("dht", this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 532, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto err; } } while (0); | |||||
533 | GF_VALIDATE_OR_GOTO ("dht", frame->local, err)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 533, GF_LOG_ERROR, "invalid argument: " "frame->local"); } while (0); goto err; } } while (0); | |||||
534 | GF_VALIDATE_OR_GOTO ("dht", cookie, err)do { if (!cookie) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "cookie"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 534, GF_LOG_ERROR, "invalid argument: " "cookie"); } while (0); goto err; } } while (0); | |||||
535 | ||||||
536 | local = frame->local; | |||||
537 | prev = cookie; | |||||
538 | conf = this->private; | |||||
539 | if (!conf) | |||||
540 | goto out; | |||||
541 | ||||||
542 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
543 | { | |||||
544 | if (op_ret == -1) { | |||||
545 | local->op_errno = op_errno; | |||||
546 | ||||||
547 | if ((op_errno != ENOTCONN107) | |||||
548 | && (op_errno != ENOENT2) | |||||
549 | && (op_errno != ESTALE116)) { | |||||
550 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("subvolume %s for %s returned -1 (%s)" , prev->this->name, local->loc.path, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 553, GF_LOG_INFO, "subvolume %s for %s returned -1 (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
551 | "subvolume %s for %s returned -1 (%s)",do { do { if (0) printf ("subvolume %s for %s returned -1 (%s)" , prev->this->name, local->loc.path, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 553, GF_LOG_INFO, "subvolume %s for %s returned -1 (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
552 | prev->this->name, local->loc.path,do { do { if (0) printf ("subvolume %s for %s returned -1 (%s)" , prev->this->name, local->loc.path, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 553, GF_LOG_INFO, "subvolume %s for %s returned -1 (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
553 | strerror (op_errno))do { do { if (0) printf ("subvolume %s for %s returned -1 (%s)" , prev->this->name, local->loc.path, strerror (op_errno )); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 553, GF_LOG_INFO, "subvolume %s for %s returned -1 (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); | |||||
554 | } | |||||
555 | if (op_errno == ESTALE116) { | |||||
556 | /* propagate the ESTALE to parent. | |||||
557 | * setting local->return_estale would send | |||||
558 | * ESTALE to parent. */ | |||||
559 | local->return_estale = 1; | |||||
560 | } | |||||
561 | ||||||
562 | /* if it is ENOENT, we may have to do a | |||||
563 | * 'lookup_everywhere()' to make sure | |||||
564 | * the file is not migrated */ | |||||
565 | if (op_errno == ENOENT2) { | |||||
566 | if (IA_ISREG (local->loc.inode->ia_type)(local->loc.inode->ia_type == IA_IFREG)) { | |||||
567 | local->need_lookup_everywhere = 1; | |||||
568 | } | |||||
569 | } | |||||
570 | goto unlock; | |||||
571 | } | |||||
572 | ||||||
573 | if (stbuf->ia_type != local->inode->ia_type) { | |||||
574 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("mismatching filetypes 0%o v/s 0%o for %s" , (stbuf->ia_type), (local->inode->ia_type), local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 577, GF_LOG_INFO, "mismatching filetypes 0%o v/s 0%o for %s" , (stbuf->ia_type), (local->inode->ia_type), local-> loc.path); } while (0) | |||||
575 | "mismatching filetypes 0%o v/s 0%o for %s",do { do { if (0) printf ("mismatching filetypes 0%o v/s 0%o for %s" , (stbuf->ia_type), (local->inode->ia_type), local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 577, GF_LOG_INFO, "mismatching filetypes 0%o v/s 0%o for %s" , (stbuf->ia_type), (local->inode->ia_type), local-> loc.path); } while (0) | |||||
576 | (stbuf->ia_type), (local->inode->ia_type),do { do { if (0) printf ("mismatching filetypes 0%o v/s 0%o for %s" , (stbuf->ia_type), (local->inode->ia_type), local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 577, GF_LOG_INFO, "mismatching filetypes 0%o v/s 0%o for %s" , (stbuf->ia_type), (local->inode->ia_type), local-> loc.path); } while (0) | |||||
577 | local->loc.path)do { do { if (0) printf ("mismatching filetypes 0%o v/s 0%o for %s" , (stbuf->ia_type), (local->inode->ia_type), local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 577, GF_LOG_INFO, "mismatching filetypes 0%o v/s 0%o for %s" , (stbuf->ia_type), (local->inode->ia_type), local-> loc.path); } while (0); | |||||
578 | ||||||
579 | local->op_ret = -1; | |||||
580 | local->op_errno = EINVAL22; | |||||
581 | ||||||
582 | goto unlock; | |||||
583 | } | |||||
584 | ||||||
585 | layout = local->layout; | |||||
586 | ||||||
587 | is_dir = check_is_dir (inode, stbuf, xattr)((stbuf->ia_type == IA_IFDIR)); | |||||
588 | is_linkfile = check_is_linkfile (inode, stbuf, xattr,( ((st_mode_from_ia ((stbuf)->ia_prot, (stbuf)->ia_type ) & ~0170000) == (01000)) && dict_get (xattr, conf ->link_xattr_name)) | |||||
589 | conf->link_xattr_name)( ((st_mode_from_ia ((stbuf)->ia_prot, (stbuf)->ia_type ) & ~0170000) == (01000)) && dict_get (xattr, conf ->link_xattr_name)); | |||||
590 | ||||||
591 | if (is_linkfile) { | |||||
592 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("linkfile found in revalidate for %s" , local->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 594, GF_LOG_INFO, "linkfile found in revalidate for %s" , local->loc.path); } while (0) | |||||
593 | "linkfile found in revalidate for %s",do { do { if (0) printf ("linkfile found in revalidate for %s" , local->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 594, GF_LOG_INFO, "linkfile found in revalidate for %s" , local->loc.path); } while (0) | |||||
594 | local->loc.path)do { do { if (0) printf ("linkfile found in revalidate for %s" , local->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 594, GF_LOG_INFO, "linkfile found in revalidate for %s" , local->loc.path); } while (0); | |||||
595 | local->return_estale = 1; | |||||
596 | ||||||
597 | goto unlock; | |||||
598 | } | |||||
599 | ||||||
600 | if (is_dir) { | |||||
601 | ret = dht_dir_has_layout (xattr, conf->xattr_name); | |||||
602 | if (ret >= 0) { | |||||
603 | if (is_greater_time(local->stbuf.ia_ctime,(((local->stbuf.ia_ctime) < (stbuf->ia_ctime)) || (( (local->stbuf.ia_ctime) == (stbuf->ia_ctime)) && ((local->stbuf.ia_ctime_nsec) < (stbuf->ia_ctime_nsec )))) | |||||
604 | local->stbuf.ia_ctime_nsec,(((local->stbuf.ia_ctime) < (stbuf->ia_ctime)) || (( (local->stbuf.ia_ctime) == (stbuf->ia_ctime)) && ((local->stbuf.ia_ctime_nsec) < (stbuf->ia_ctime_nsec )))) | |||||
605 | stbuf->ia_ctime,(((local->stbuf.ia_ctime) < (stbuf->ia_ctime)) || (( (local->stbuf.ia_ctime) == (stbuf->ia_ctime)) && ((local->stbuf.ia_ctime_nsec) < (stbuf->ia_ctime_nsec )))) | |||||
606 | stbuf->ia_ctime_nsec)(((local->stbuf.ia_ctime) < (stbuf->ia_ctime)) || (( (local->stbuf.ia_ctime) == (stbuf->ia_ctime)) && ((local->stbuf.ia_ctime_nsec) < (stbuf->ia_ctime_nsec ))))) { | |||||
607 | local->prebuf.ia_gid = stbuf->ia_gid; | |||||
608 | local->prebuf.ia_uid = stbuf->ia_uid; | |||||
609 | } | |||||
610 | } | |||||
611 | if (local->stbuf.ia_type != IA_INVAL) | |||||
612 | { | |||||
613 | if ((local->stbuf.ia_gid != stbuf->ia_gid) || | |||||
614 | (local->stbuf.ia_uid != stbuf->ia_uid)) { | |||||
615 | local->need_selfheal = 1; | |||||
616 | } | |||||
617 | } | |||||
618 | ret = dht_layout_dir_mismatch (this, layout, | |||||
619 | prev->this, &local->loc, | |||||
620 | xattr); | |||||
621 | if (ret != 0) { | |||||
622 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("mismatching layouts for %s", local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 624, GF_LOG_INFO, "mismatching layouts for %s" , local->loc.path); } while (0) | |||||
623 | "mismatching layouts for %s",do { do { if (0) printf ("mismatching layouts for %s", local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 624, GF_LOG_INFO, "mismatching layouts for %s" , local->loc.path); } while (0) | |||||
624 | local->loc.path)do { do { if (0) printf ("mismatching layouts for %s", local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 624, GF_LOG_INFO, "mismatching layouts for %s" , local->loc.path); } while (0); | |||||
625 | ||||||
626 | local->layout_mismatch = 1; | |||||
627 | ||||||
628 | goto unlock; | |||||
629 | } | |||||
630 | } | |||||
631 | ||||||
632 | dht_iatt_merge (this, &local->stbuf, stbuf, prev->this); | |||||
633 | dht_iatt_merge (this, &local->postparent, postparent, | |||||
634 | prev->this); | |||||
635 | ||||||
636 | local->op_ret = 0; | |||||
637 | ||||||
638 | if (!local->xattr) { | |||||
639 | local->xattr = dict_ref (xattr); | |||||
640 | } else if (is_dir) { | |||||
641 | dht_aggregate_xattr (local->xattr, xattr); | |||||
642 | } | |||||
643 | } | |||||
644 | unlock: | |||||
645 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
646 | out: | |||||
647 | this_call_cnt = dht_frame_return (frame); | |||||
648 | ||||||
649 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
650 | if (!IA_ISDIR (local->stbuf.ia_type)(local->stbuf.ia_type == IA_IFDIR) | |||||
651 | && (local->hashed_subvol != local->cached_subvol) | |||||
652 | && (local->stbuf.ia_nlink == 1) | |||||
653 | && (conf && conf->unhashed_sticky_bit)) { | |||||
654 | local->stbuf.ia_prot.sticky = 1; | |||||
655 | } | |||||
656 | if (local->need_selfheal) { | |||||
657 | local->need_selfheal = 0; | |||||
658 | uuid_copy (local->gfid, local->stbuf.ia_gfid); | |||||
659 | local->stbuf.ia_gid = local->prebuf.ia_gid; | |||||
660 | local->stbuf.ia_uid = local->prebuf.ia_uid; | |||||
661 | copy = create_frame (this, this->ctx->pool); | |||||
662 | if (copy) { | |||||
663 | copy_local = dht_local_init (copy, &local->loc, | |||||
664 | NULL((void*)0), 0); | |||||
665 | if (!copy_local) | |||||
666 | goto cont; | |||||
667 | copy_local->stbuf = local->stbuf; | |||||
668 | copy->local = copy_local; | |||||
669 | FRAME_SU_DO (copy, dht_local_t)do { dht_local_t *__local = (copy)->local; __local->uid = copy->root->uid; __local->gid = copy->root-> gid; copy->root->uid = 0; copy->root->gid = 0; } while (0);; | |||||
670 | ret = synctask_new (this->ctx->env, | |||||
671 | dht_dir_attr_heal, | |||||
672 | dht_dir_attr_heal_done, | |||||
673 | copy, copy); | |||||
674 | } | |||||
675 | } | |||||
676 | cont: | |||||
677 | if (local->layout_mismatch) { | |||||
678 | /* Found layout mismatch in the directory, need to | |||||
679 | fix this in the inode context */ | |||||
680 | dht_layout_unref (this, local->layout); | |||||
681 | local->layout = NULL((void*)0); | |||||
682 | dht_lookup_directory (frame, this, &local->loc); | |||||
683 | return 0; | |||||
684 | } | |||||
685 | ||||||
686 | if (local->need_lookup_everywhere) { | |||||
687 | /* As the current layout gave ENOENT error, we would | |||||
688 | need a new layout */ | |||||
689 | dht_layout_unref (this, local->layout); | |||||
690 | local->layout = NULL((void*)0); | |||||
691 | ||||||
692 | /* We know that current cached subvol is no more | |||||
693 | valid, get the new one */ | |||||
694 | local->cached_subvol = NULL((void*)0); | |||||
695 | dht_lookup_everywhere (frame, this, &local->loc); | |||||
696 | return 0; | |||||
697 | } | |||||
698 | if (local->return_estale) { | |||||
699 | local->op_ret = -1; | |||||
700 | local->op_errno = ESTALE116; | |||||
701 | } | |||||
702 | ||||||
703 | if (local->loc.parent) { | |||||
704 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
705 | &local->postparent, 1); | |||||
706 | } | |||||
707 | ||||||
708 | DHT_STRIP_PHASE1_FLAGS (&local->stbuf)do { if ((&local->stbuf) && ( ((&local-> stbuf)->ia_type == IA_IFREG) && ((&local->stbuf )->ia_prot.sticky == 1) && ((&local->stbuf) ->ia_prot.sgid == 1))) { (&local->stbuf)->ia_prot .sticky = 0; (&local->stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
709 | DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 711, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
710 | local->inode, &local->stbuf, local->xattr,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 711, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
711 | &local->postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 711, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
712 | } | |||||
713 | ||||||
714 | err: | |||||
715 | return ret; | |||||
716 | } | |||||
717 | ||||||
718 | ||||||
719 | int | |||||
720 | dht_lookup_linkfile_create_cbk (call_frame_t *frame, void *cookie, | |||||
721 | xlator_t *this, | |||||
722 | int32_t op_ret, int32_t op_errno, | |||||
723 | inode_t *inode, struct iatt *stbuf, | |||||
724 | struct iatt *preparent, struct iatt *postparent, | |||||
725 | dict_t *xdata) | |||||
726 | { | |||||
727 | dht_local_t *local = NULL((void*)0); | |||||
728 | xlator_t *cached_subvol = NULL((void*)0); | |||||
729 | dht_conf_t *conf = NULL((void*)0); | |||||
730 | int ret = -1; | |||||
731 | ||||||
732 | GF_VALIDATE_OR_GOTO ("dht", frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 732, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto out; } } while (0); | |||||
733 | GF_VALIDATE_OR_GOTO ("dht", this, out)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 733, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto out; } } while (0); | |||||
734 | GF_VALIDATE_OR_GOTO ("dht", frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 734, GF_LOG_ERROR, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
735 | GF_VALIDATE_OR_GOTO ("dht", this->private, out)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 735, GF_LOG_ERROR, "invalid argument: " "this->private") ; } while (0); goto out; } } while (0); | |||||
736 | GF_VALIDATE_OR_GOTO ("dht", cookie, out)do { if (!cookie) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "cookie"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 736, GF_LOG_ERROR, "invalid argument: " "cookie"); } while (0); goto out; } } while (0); | |||||
737 | ||||||
738 | local = frame->local; | |||||
739 | cached_subvol = local->cached_subvol; | |||||
740 | conf = this->private; | |||||
741 | ||||||
742 | ret = dht_layout_preset (this, local->cached_subvol, inode); | |||||
743 | if (ret < 0) { | |||||
744 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("failed to set layout for subvolume %s" , cached_subvol ? cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 746 , GF_LOG_DEBUG, "failed to set layout for subvolume %s", cached_subvol ? cached_subvol->name : "<nil>"); } while (0) | |||||
745 | "failed to set layout for subvolume %s",do { do { if (0) printf ("failed to set layout for subvolume %s" , cached_subvol ? cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 746 , GF_LOG_DEBUG, "failed to set layout for subvolume %s", cached_subvol ? cached_subvol->name : "<nil>"); } while (0) | |||||
746 | cached_subvol ? cached_subvol->name : "<nil>")do { do { if (0) printf ("failed to set layout for subvolume %s" , cached_subvol ? cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 746 , GF_LOG_DEBUG, "failed to set layout for subvolume %s", cached_subvol ? cached_subvol->name : "<nil>"); } while (0); | |||||
747 | local->op_ret = -1; | |||||
748 | local->op_errno = EINVAL22; | |||||
749 | goto unwind; | |||||
750 | } | |||||
751 | ||||||
752 | local->op_ret = 0; | |||||
753 | if ((local->stbuf.ia_nlink == 1) | |||||
754 | && (conf && conf->unhashed_sticky_bit)) { | |||||
755 | local->stbuf.ia_prot.sticky = 1; | |||||
756 | } | |||||
757 | ||||||
758 | if (local->loc.parent) { | |||||
759 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
760 | postparent, 1); | |||||
761 | } | |||||
762 | ||||||
763 | unwind: | |||||
764 | if (local->linked == _gf_true) | |||||
765 | dht_linkfile_attr_heal (frame, this); | |||||
766 | ||||||
767 | DHT_STRIP_PHASE1_FLAGS (&local->stbuf)do { if ((&local->stbuf) && ( ((&local-> stbuf)->ia_type == IA_IFREG) && ((&local->stbuf )->ia_prot.sticky == 1) && ((&local->stbuf) ->ia_prot.sgid == 1))) { (&local->stbuf)->ia_prot .sticky = 0; (&local->stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
768 | DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 770, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
769 | local->inode, &local->stbuf, local->xattr,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 770, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
770 | &local->postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 770, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
771 | out: | |||||
772 | return ret; | |||||
773 | } | |||||
774 | ||||||
775 | ||||||
776 | int | |||||
777 | dht_lookup_everywhere_done (call_frame_t *frame, xlator_t *this) | |||||
778 | { | |||||
779 | int ret = 0; | |||||
780 | dht_local_t *local = NULL((void*)0); | |||||
781 | xlator_t *hashed_subvol = NULL((void*)0); | |||||
782 | xlator_t *cached_subvol = NULL((void*)0); | |||||
783 | dht_layout_t *layout = NULL((void*)0); | |||||
784 | ||||||
785 | local = frame->local; | |||||
786 | hashed_subvol = local->hashed_subvol; | |||||
787 | cached_subvol = local->cached_subvol; | |||||
788 | ||||||
789 | if (local->file_count && local->dir_count) { | |||||
790 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 794, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0) | |||||
791 | "path %s exists as a file on one subvolume "do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 794, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0) | |||||
792 | "and directory on another. "do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 794, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0) | |||||
793 | "Please fix it manually",do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 794, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0) | |||||
794 | local->loc.path)do { do { if (0) printf ("path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 794, GF_LOG_ERROR, "path %s exists as a file on one subvolume " "and directory on another. " "Please fix it manually", local ->loc.path); } while (0); | |||||
795 | DHT_STACK_UNWIND (lookup, frame, -1, EIO, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 796, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, 5, ((void*)0), ((void*)0), ((void*)0), ((void* )0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
796 | NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 796, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, 5, ((void*)0), ((void*)0), ((void*)0), ((void* )0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
797 | return 0; | |||||
798 | } | |||||
799 | ||||||
800 | if (local->dir_count) { | |||||
801 | dht_lookup_directory (frame, this, &local->loc); | |||||
802 | return 0; | |||||
803 | } | |||||
804 | ||||||
805 | if (!cached_subvol) { | |||||
806 | DHT_STACK_UNWIND (lookup, frame, -1, ENOENT, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 807, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, 2, ((void*)0), ((void*)0), ((void*)0), ((void* )0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
807 | NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 807, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, 2, ((void*)0), ((void*)0), ((void*)0), ((void* )0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
808 | return 0; | |||||
809 | } | |||||
810 | ||||||
811 | if (local->need_lookup_everywhere) { | |||||
812 | if (uuid_compare (local->gfid, local->inode->gfid)) { | |||||
813 | /* GFID different, return error */ | |||||
814 | DHT_STACK_UNWIND (lookup, frame, -1, ENOENT, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 815, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, 2, ((void*)0), ((void*)0), ((void*)0), ((void* )0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
815 | NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 815, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, 2, ((void*)0), ((void*)0), ((void*)0), ((void* )0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
816 | return 0; | |||||
817 | } | |||||
818 | local->op_ret = 0; | |||||
819 | local->op_errno = 0; | |||||
820 | layout = dht_layout_for_subvol (this, cached_subvol); | |||||
821 | if (!layout) { | |||||
822 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 826, GF_LOG_INFO, "%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0) | |||||
823 | "%s: no pre-set layout for subvolume %s",do { do { if (0) printf ("%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 826, GF_LOG_INFO, "%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0) | |||||
824 | local->loc.path, (cached_subvol ?do { do { if (0) printf ("%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 826, GF_LOG_INFO, "%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0) | |||||
825 | cached_subvol->name :do { do { if (0) printf ("%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 826, GF_LOG_INFO, "%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0) | |||||
826 | "<nil>"))do { do { if (0) printf ("%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 826, GF_LOG_INFO, "%s: no pre-set layout for subvolume %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); | |||||
827 | } | |||||
828 | ||||||
829 | ret = dht_layout_set (this, local->inode, layout); | |||||
830 | if (ret < 0) { | |||||
831 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 835, GF_LOG_INFO, "%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0) | |||||
832 | "%s: failed to set layout for subvol %s",do { do { if (0) printf ("%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 835, GF_LOG_INFO, "%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0) | |||||
833 | local->loc.path, (cached_subvol ?do { do { if (0) printf ("%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 835, GF_LOG_INFO, "%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0) | |||||
834 | cached_subvol->name :do { do { if (0) printf ("%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 835, GF_LOG_INFO, "%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0) | |||||
835 | "<nil>"))do { do { if (0) printf ("%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 835, GF_LOG_INFO, "%s: failed to set layout for subvol %s" , local->loc.path, (cached_subvol ? cached_subvol->name : "<nil>")); } while (0); | |||||
836 | } | |||||
837 | ||||||
838 | if (local->loc.parent) { | |||||
839 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
840 | &local->postparent, 1); | |||||
841 | } | |||||
842 | ||||||
843 | DHT_STRIP_PHASE1_FLAGS (&local->stbuf)do { if ((&local->stbuf) && ( ((&local-> stbuf)->ia_type == IA_IFREG) && ((&local->stbuf )->ia_prot.sticky == 1) && ((&local->stbuf) ->ia_prot.sgid == 1))) { (&local->stbuf)->ia_prot .sticky = 0; (&local->stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
844 | DHT_STACK_UNWIND (lookup, frame, local->op_ret,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 847, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
845 | local->op_errno, local->inode,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 847, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
846 | &local->stbuf, local->xattr,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 847, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
847 | &local->postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 847, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
848 | return 0; | |||||
849 | } | |||||
850 | ||||||
851 | if (!hashed_subvol) { | |||||
852 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("cannot create linkfile file for %s on %s: " "hashed subvolume cannot be found.", local->loc.path, cached_subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 855, GF_LOG_INFO, "cannot create linkfile file for %s on %s: " "hashed subvolume cannot be found.", local->loc.path, cached_subvol ->name); } while (0) | |||||
853 | "cannot create linkfile file for %s on %s: "do { do { if (0) printf ("cannot create linkfile file for %s on %s: " "hashed subvolume cannot be found.", local->loc.path, cached_subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 855, GF_LOG_INFO, "cannot create linkfile file for %s on %s: " "hashed subvolume cannot be found.", local->loc.path, cached_subvol ->name); } while (0) | |||||
854 | "hashed subvolume cannot be found.",do { do { if (0) printf ("cannot create linkfile file for %s on %s: " "hashed subvolume cannot be found.", local->loc.path, cached_subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 855, GF_LOG_INFO, "cannot create linkfile file for %s on %s: " "hashed subvolume cannot be found.", local->loc.path, cached_subvol ->name); } while (0) | |||||
855 | local->loc.path, cached_subvol->name)do { do { if (0) printf ("cannot create linkfile file for %s on %s: " "hashed subvolume cannot be found.", local->loc.path, cached_subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 855, GF_LOG_INFO, "cannot create linkfile file for %s on %s: " "hashed subvolume cannot be found.", local->loc.path, cached_subvol ->name); } while (0); | |||||
856 | ||||||
857 | local->op_ret = 0; | |||||
858 | local->op_errno = 0; | |||||
859 | ||||||
860 | ret = dht_layout_preset (frame->this, cached_subvol, | |||||
861 | local->inode); | |||||
862 | if (ret < 0) { | |||||
863 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("failed to set layout for subvol %s" , cached_subvol ? cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 866 , GF_LOG_INFO, "failed to set layout for subvol %s", cached_subvol ? cached_subvol->name : "<nil>"); } while (0) | |||||
864 | "failed to set layout for subvol %s",do { do { if (0) printf ("failed to set layout for subvol %s" , cached_subvol ? cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 866 , GF_LOG_INFO, "failed to set layout for subvol %s", cached_subvol ? cached_subvol->name : "<nil>"); } while (0) | |||||
865 | cached_subvol ? cached_subvol->name :do { do { if (0) printf ("failed to set layout for subvol %s" , cached_subvol ? cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 866 , GF_LOG_INFO, "failed to set layout for subvol %s", cached_subvol ? cached_subvol->name : "<nil>"); } while (0) | |||||
866 | "<nil>")do { do { if (0) printf ("failed to set layout for subvol %s" , cached_subvol ? cached_subvol->name : "<nil>"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 866 , GF_LOG_INFO, "failed to set layout for subvol %s", cached_subvol ? cached_subvol->name : "<nil>"); } while (0); | |||||
867 | local->op_ret = -1; | |||||
868 | local->op_errno = EINVAL22; | |||||
869 | } | |||||
870 | ||||||
871 | if (local->loc.parent) { | |||||
872 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
873 | &local->postparent, 1); | |||||
874 | } | |||||
875 | ||||||
876 | DHT_STRIP_PHASE1_FLAGS (&local->stbuf)do { if ((&local->stbuf) && ( ((&local-> stbuf)->ia_type == IA_IFREG) && ((&local->stbuf )->ia_prot.sticky == 1) && ((&local->stbuf) ->ia_prot.sgid == 1))) { (&local->stbuf)->ia_prot .sticky = 0; (&local->stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
877 | DHT_STACK_UNWIND (lookup, frame, local->op_ret,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 880, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
878 | local->op_errno, local->inode,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 880, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
879 | &local->stbuf, local->xattr,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 880, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
880 | &local->postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 880, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->inode , &local->stbuf, local->xattr, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
881 | return 0; | |||||
882 | } | |||||
883 | ||||||
884 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("linking file %s existing on %s to %s (hash)" , local->loc.path, cached_subvol->name, hashed_subvol-> name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 887, GF_LOG_DEBUG, "linking file %s existing on %s to %s (hash)" , local->loc.path, cached_subvol->name, hashed_subvol-> name); } while (0) | |||||
885 | "linking file %s existing on %s to %s (hash)",do { do { if (0) printf ("linking file %s existing on %s to %s (hash)" , local->loc.path, cached_subvol->name, hashed_subvol-> name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 887, GF_LOG_DEBUG, "linking file %s existing on %s to %s (hash)" , local->loc.path, cached_subvol->name, hashed_subvol-> name); } while (0) | |||||
886 | local->loc.path, cached_subvol->name,do { do { if (0) printf ("linking file %s existing on %s to %s (hash)" , local->loc.path, cached_subvol->name, hashed_subvol-> name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 887, GF_LOG_DEBUG, "linking file %s existing on %s to %s (hash)" , local->loc.path, cached_subvol->name, hashed_subvol-> name); } while (0) | |||||
887 | hashed_subvol->name)do { do { if (0) printf ("linking file %s existing on %s to %s (hash)" , local->loc.path, cached_subvol->name, hashed_subvol-> name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 887, GF_LOG_DEBUG, "linking file %s existing on %s to %s (hash)" , local->loc.path, cached_subvol->name, hashed_subvol-> name); } while (0); | |||||
888 | ||||||
889 | ret = dht_linkfile_create (frame, | |||||
890 | dht_lookup_linkfile_create_cbk, this, | |||||
891 | cached_subvol, hashed_subvol, &local->loc); | |||||
892 | ||||||
893 | return ret; | |||||
894 | } | |||||
895 | ||||||
896 | ||||||
897 | int | |||||
898 | dht_lookup_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
899 | int op_ret, int op_errno, | |||||
900 | struct iatt *preparent, struct iatt *postparent, | |||||
901 | dict_t *xdata) | |||||
902 | { | |||||
903 | int this_call_cnt = 0; | |||||
904 | ||||||
905 | this_call_cnt = dht_frame_return (frame); | |||||
906 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
907 | dht_lookup_everywhere_done (frame, this); | |||||
908 | } | |||||
909 | ||||||
910 | return 0; | |||||
911 | } | |||||
912 | ||||||
913 | ||||||
914 | int | |||||
915 | dht_lookup_everywhere_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
916 | int32_t op_ret, int32_t op_errno, | |||||
917 | inode_t *inode, struct iatt *buf, dict_t *xattr, | |||||
918 | struct iatt *postparent) | |||||
919 | { | |||||
920 | dht_local_t *local = NULL((void*)0); | |||||
921 | int this_call_cnt = 0; | |||||
922 | call_frame_t *prev = NULL((void*)0); | |||||
923 | int is_linkfile = 0; | |||||
924 | int is_dir = 0; | |||||
925 | xlator_t *subvol = NULL((void*)0); | |||||
926 | loc_t *loc = NULL((void*)0); | |||||
927 | xlator_t *link_subvol = NULL((void*)0); | |||||
928 | int ret = -1; | |||||
929 | int32_t fd_count = 0; | |||||
930 | dht_conf_t *conf = NULL((void*)0); | |||||
931 | ||||||
932 | GF_VALIDATE_OR_GOTO ("dht", frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 932, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto out; } } while (0); | |||||
933 | GF_VALIDATE_OR_GOTO ("dht", this, out)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 933, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto out; } } while (0); | |||||
934 | GF_VALIDATE_OR_GOTO ("dht", frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 934, GF_LOG_ERROR, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
935 | GF_VALIDATE_OR_GOTO ("dht", cookie, out)do { if (!cookie) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "cookie"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 935, GF_LOG_ERROR, "invalid argument: " "cookie"); } while (0); goto out; } } while (0); | |||||
936 | GF_VALIDATE_OR_GOTO ("dht", this->private, out)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 936, GF_LOG_ERROR, "invalid argument: " "this->private") ; } while (0); goto out; } } while (0); | |||||
937 | ||||||
938 | local = frame->local; | |||||
939 | loc = &local->loc; | |||||
940 | conf = this->private; | |||||
941 | ||||||
942 | prev = cookie; | |||||
943 | subvol = prev->this; | |||||
944 | ||||||
945 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
946 | { | |||||
947 | if (op_ret == -1) { | |||||
948 | if (op_errno != ENOENT2) | |||||
949 | local->op_errno = op_errno; | |||||
950 | goto unlock; | |||||
951 | } | |||||
952 | ||||||
953 | if (uuid_is_null (local->gfid)) | |||||
954 | uuid_copy (local->gfid, buf->ia_gfid); | |||||
955 | ||||||
956 | if (uuid_compare (local->gfid, buf->ia_gfid)) { | |||||
957 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: gfid differs on subvolume %s", loc ->path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 959, GF_LOG_WARNING, "%s: gfid differs on subvolume %s", loc->path, prev->this ->name); } while (0) | |||||
958 | "%s: gfid differs on subvolume %s",do { do { if (0) printf ("%s: gfid differs on subvolume %s", loc ->path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 959, GF_LOG_WARNING, "%s: gfid differs on subvolume %s", loc->path, prev->this ->name); } while (0) | |||||
959 | loc->path, prev->this->name)do { do { if (0) printf ("%s: gfid differs on subvolume %s", loc ->path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 959, GF_LOG_WARNING, "%s: gfid differs on subvolume %s", loc->path, prev->this ->name); } while (0); | |||||
960 | } | |||||
961 | ||||||
962 | is_linkfile = check_is_linkfile (inode, buf, xattr,( ((st_mode_from_ia ((buf)->ia_prot, (buf)->ia_type) & ~0170000) == (01000)) && dict_get (xattr, conf->link_xattr_name )) | |||||
963 | conf->link_xattr_name)( ((st_mode_from_ia ((buf)->ia_prot, (buf)->ia_type) & ~0170000) == (01000)) && dict_get (xattr, conf->link_xattr_name )); | |||||
964 | is_dir = check_is_dir (inode, buf, xattr)((buf->ia_type == IA_IFDIR)); | |||||
965 | ||||||
966 | if (is_linkfile) { | |||||
967 | link_subvol = dht_linkfile_subvol (this, inode, buf, | |||||
968 | xattr); | |||||
969 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("found on %s linkfile %s (-> %s)" , subvol->name, loc->path, link_subvol ? link_subvol-> name : "''"); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 972, GF_LOG_DEBUG, "found on %s linkfile %s (-> %s)" , subvol->name, loc->path, link_subvol ? link_subvol-> name : "''"); } while (0) | |||||
970 | "found on %s linkfile %s (-> %s)",do { do { if (0) printf ("found on %s linkfile %s (-> %s)" , subvol->name, loc->path, link_subvol ? link_subvol-> name : "''"); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 972, GF_LOG_DEBUG, "found on %s linkfile %s (-> %s)" , subvol->name, loc->path, link_subvol ? link_subvol-> name : "''"); } while (0) | |||||
971 | subvol->name, loc->path,do { do { if (0) printf ("found on %s linkfile %s (-> %s)" , subvol->name, loc->path, link_subvol ? link_subvol-> name : "''"); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 972, GF_LOG_DEBUG, "found on %s linkfile %s (-> %s)" , subvol->name, loc->path, link_subvol ? link_subvol-> name : "''"); } while (0) | |||||
972 | link_subvol ? link_subvol->name : "''")do { do { if (0) printf ("found on %s linkfile %s (-> %s)" , subvol->name, loc->path, link_subvol ? link_subvol-> name : "''"); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 972, GF_LOG_DEBUG, "found on %s linkfile %s (-> %s)" , subvol->name, loc->path, link_subvol ? link_subvol-> name : "''"); } while (0); | |||||
973 | goto unlock; | |||||
974 | } | |||||
975 | ||||||
976 | /* non linkfile GFID takes precedence */ | |||||
977 | uuid_copy (local->gfid, buf->ia_gfid); | |||||
978 | ||||||
979 | if (is_dir) { | |||||
980 | local->dir_count++; | |||||
981 | ||||||
982 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("found on %s directory %s", subvol-> name, loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 984, GF_LOG_DEBUG, "found on %s directory %s" , subvol->name, loc->path); } while (0) | |||||
983 | "found on %s directory %s",do { do { if (0) printf ("found on %s directory %s", subvol-> name, loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 984, GF_LOG_DEBUG, "found on %s directory %s" , subvol->name, loc->path); } while (0) | |||||
984 | subvol->name, loc->path)do { do { if (0) printf ("found on %s directory %s", subvol-> name, loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 984, GF_LOG_DEBUG, "found on %s directory %s" , subvol->name, loc->path); } while (0); | |||||
985 | } else { | |||||
986 | local->file_count++; | |||||
987 | ||||||
988 | if (!local->cached_subvol) { | |||||
989 | /* found one file */ | |||||
990 | dht_iatt_merge (this, &local->stbuf, buf, | |||||
991 | subvol); | |||||
992 | local->xattr = dict_ref (xattr); | |||||
993 | local->cached_subvol = subvol; | |||||
994 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("found on %s file %s", subvol->name , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 996, GF_LOG_DEBUG, "found on %s file %s", subvol ->name, loc->path); } while (0) | |||||
995 | "found on %s file %s",do { do { if (0) printf ("found on %s file %s", subvol->name , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 996, GF_LOG_DEBUG, "found on %s file %s", subvol ->name, loc->path); } while (0) | |||||
996 | subvol->name, loc->path)do { do { if (0) printf ("found on %s file %s", subvol->name , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 996, GF_LOG_DEBUG, "found on %s file %s", subvol ->name, loc->path); } while (0); | |||||
997 | ||||||
998 | dht_iatt_merge (this, &local->postparent, | |||||
999 | postparent, subvol); | |||||
1000 | } else { | |||||
1001 | /* This is where we need 'rename' both entries logic */ | |||||
1002 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1007, GF_LOG_WARNING, "multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0) | |||||
1003 | "multiple subvolumes (%s and %s) have "do { do { if (0) printf ("multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1007, GF_LOG_WARNING, "multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0) | |||||
1004 | "file %s (preferably rename the file "do { do { if (0) printf ("multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1007, GF_LOG_WARNING, "multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0) | |||||
1005 | "in the backend, and do a fresh lookup)",do { do { if (0) printf ("multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1007, GF_LOG_WARNING, "multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0) | |||||
1006 | local->cached_subvol->name,do { do { if (0) printf ("multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1007, GF_LOG_WARNING, "multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0) | |||||
1007 | subvol->name, local->loc.path)do { do { if (0) printf ("multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1007, GF_LOG_WARNING, "multiple subvolumes (%s and %s) have " "file %s (preferably rename the file " "in the backend, and do a fresh lookup)" , local->cached_subvol->name, subvol->name, local-> loc.path); } while (0); | |||||
1008 | } | |||||
1009 | } | |||||
1010 | } | |||||
1011 | unlock: | |||||
1012 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1013 | ||||||
1014 | if (is_linkfile) { | |||||
1015 | ret = dict_get_int32 (xattr, GLUSTERFS_OPEN_FD_COUNT"glusterfs.open-fd-count", &fd_count); | |||||
1016 | /* Delete the linkfile only if there are no open fds on it. | |||||
1017 | if there is a open-fd, it may be in migration */ | |||||
1018 | if (!ret && (fd_count == 0)) { | |||||
1019 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("deleting stale linkfile %s on %s", loc ->path, subvol->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1021, GF_LOG_INFO, "deleting stale linkfile %s on %s" , loc->path, subvol->name); } while (0) | |||||
1020 | "deleting stale linkfile %s on %s",do { do { if (0) printf ("deleting stale linkfile %s on %s", loc ->path, subvol->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1021, GF_LOG_INFO, "deleting stale linkfile %s on %s" , loc->path, subvol->name); } while (0) | |||||
1021 | loc->path, subvol->name)do { do { if (0) printf ("deleting stale linkfile %s on %s", loc ->path, subvol->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1021, GF_LOG_INFO, "deleting stale linkfile %s on %s" , loc->path, subvol->name); } while (0); | |||||
1022 | STACK_WIND (frame, dht_lookup_unlink_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1023, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->unlink_cbk) tmp_cbk = dht_lookup_unlink_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->unlink" ; _new->unwind_to = "dht_lookup_unlink_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->unlink); subvol-> fops->unlink (_new, subvol, loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1023 | subvol, subvol->fops->unlink, loc, 0, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1023, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->unlink_cbk) tmp_cbk = dht_lookup_unlink_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->unlink" ; _new->unwind_to = "dht_lookup_unlink_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->unlink); subvol-> fops->unlink (_new, subvol, loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1024 | return 0; | |||||
1025 | } | |||||
1026 | } | |||||
1027 | ||||||
1028 | this_call_cnt = dht_frame_return (frame); | |||||
1029 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
1030 | dht_lookup_everywhere_done (frame, this); | |||||
1031 | } | |||||
1032 | ||||||
1033 | out: | |||||
1034 | return ret; | |||||
1035 | } | |||||
1036 | ||||||
1037 | ||||||
1038 | int | |||||
1039 | dht_lookup_everywhere (call_frame_t *frame, xlator_t *this, loc_t *loc) | |||||
1040 | { | |||||
1041 | dht_conf_t *conf = NULL((void*)0); | |||||
1042 | dht_local_t *local = NULL((void*)0); | |||||
1043 | int i = 0; | |||||
1044 | int call_cnt = 0; | |||||
1045 | ||||||
1046 | GF_VALIDATE_OR_GOTO ("dht", frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1046, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto err; } } while (0); | |||||
1047 | GF_VALIDATE_OR_GOTO ("dht", this, out)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1047, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto out; } } while (0); | |||||
1048 | GF_VALIDATE_OR_GOTO ("dht", frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 1048, GF_LOG_ERROR, "invalid argument: " "frame->local") ; } while (0); goto out; } } while (0); | |||||
1049 | GF_VALIDATE_OR_GOTO ("dht", this->private, out)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 1049, GF_LOG_ERROR, "invalid argument: " "this->private" ); } while (0); goto out; } } while (0); | |||||
1050 | GF_VALIDATE_OR_GOTO ("dht", loc, out)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1050, GF_LOG_ERROR, "invalid argument: " "loc"); } while (0); goto out; } } while (0); | |||||
1051 | ||||||
1052 | conf = this->private; | |||||
1053 | local = frame->local; | |||||
1054 | ||||||
1055 | call_cnt = conf->subvolume_cnt; | |||||
1056 | local->call_cnt = call_cnt; | |||||
1057 | ||||||
1058 | if (!local->inode) | |||||
1059 | local->inode = inode_ref (loc->inode); | |||||
1060 | ||||||
1061 | for (i = 0; i < call_cnt; i++) { | |||||
1062 | STACK_WIND (frame, dht_lookup_everywhere_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1065, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_everywhere_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_everywhere_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], loc, local->xattr_req ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1063 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1065, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_everywhere_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_everywhere_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], loc, local->xattr_req ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1064 | conf->subvolumes[i]->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1065, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_everywhere_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_everywhere_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], loc, local->xattr_req ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1065 | loc, local->xattr_req)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1065, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_everywhere_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_everywhere_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], loc, local->xattr_req ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1066 | } | |||||
1067 | ||||||
1068 | return 0; | |||||
1069 | out: | |||||
1070 | DHT_STACK_UNWIND (lookup, frame, -1, EINVAL, NULL, NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1070, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, 22, ((void*)0), ((void*)0), ((void*)0), ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) ; dht_local_wipe (__xl, __local); } while (0); | |||||
1071 | err: | |||||
1072 | return -1; | |||||
1073 | } | |||||
1074 | ||||||
1075 | ||||||
1076 | int | |||||
1077 | dht_lookup_linkfile_cbk (call_frame_t *frame, void *cookie, | |||||
1078 | xlator_t *this, int op_ret, int op_errno, | |||||
1079 | inode_t *inode, struct iatt *stbuf, dict_t *xattr, | |||||
1080 | struct iatt *postparent) | |||||
1081 | { | |||||
1082 | call_frame_t *prev = NULL((void*)0); | |||||
1083 | dht_local_t *local = NULL((void*)0); | |||||
1084 | xlator_t *subvol = NULL((void*)0); | |||||
1085 | loc_t *loc = NULL((void*)0); | |||||
1086 | dht_conf_t *conf = NULL((void*)0); | |||||
1087 | int ret = 0; | |||||
1088 | ||||||
1089 | GF_VALIDATE_OR_GOTO ("dht", frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1089, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto out; } } while (0); | |||||
1090 | GF_VALIDATE_OR_GOTO ("dht", this, unwind)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1090, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto unwind; } } while (0); | |||||
1091 | GF_VALIDATE_OR_GOTO ("dht", frame->local, unwind)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 1091, GF_LOG_ERROR, "invalid argument: " "frame->local") ; } while (0); goto unwind; } } while (0); | |||||
1092 | GF_VALIDATE_OR_GOTO ("dht", this->private, unwind)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 1092, GF_LOG_ERROR, "invalid argument: " "this->private" ); } while (0); goto unwind; } } while (0); | |||||
1093 | GF_VALIDATE_OR_GOTO ("dht", cookie, unwind)do { if (!cookie) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "cookie"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1093, GF_LOG_ERROR, "invalid argument: " "cookie"); } while (0); goto unwind; } } while (0); | |||||
1094 | ||||||
1095 | prev = cookie; | |||||
1096 | subvol = prev->this; | |||||
1097 | conf = this->private; | |||||
1098 | local = frame->local; | |||||
1099 | loc = &local->loc; | |||||
1100 | ||||||
1101 | if (op_ret == -1) { | |||||
1102 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("lookup of %s on %s (following linkfile) failed (%s)" , local->loc.path, subvol->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 1104, GF_LOG_INFO, "lookup of %s on %s (following linkfile) failed (%s)" , local->loc.path, subvol->name, strerror (op_errno)); } while (0) | |||||
1103 | "lookup of %s on %s (following linkfile) failed (%s)",do { do { if (0) printf ("lookup of %s on %s (following linkfile) failed (%s)" , local->loc.path, subvol->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 1104, GF_LOG_INFO, "lookup of %s on %s (following linkfile) failed (%s)" , local->loc.path, subvol->name, strerror (op_errno)); } while (0) | |||||
1104 | local->loc.path, subvol->name, strerror (op_errno))do { do { if (0) printf ("lookup of %s on %s (following linkfile) failed (%s)" , local->loc.path, subvol->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 1104, GF_LOG_INFO, "lookup of %s on %s (following linkfile) failed (%s)" , local->loc.path, subvol->name, strerror (op_errno)); } while (0); | |||||
1105 | ||||||
1106 | /* If cached subvol returned ENOTCONN, do not do | |||||
1107 | lookup_everywhere. We need to make sure linkfile does not get | |||||
1108 | removed, which can take away the namespace, and subvol is | |||||
1109 | anyways down. */ | |||||
1110 | ||||||
1111 | if (op_errno != ENOTCONN107) | |||||
1112 | goto err; | |||||
1113 | else | |||||
1114 | goto unwind; | |||||
1115 | } | |||||
1116 | ||||||
1117 | if (check_is_dir (inode, stbuf, xattr)((stbuf->ia_type == IA_IFDIR))) { | |||||
1118 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("lookup of %s on %s (following linkfile) reached dir" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1120, GF_LOG_INFO , "lookup of %s on %s (following linkfile) reached dir", local ->loc.path, subvol->name); } while (0) | |||||
1119 | "lookup of %s on %s (following linkfile) reached dir",do { do { if (0) printf ("lookup of %s on %s (following linkfile) reached dir" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1120, GF_LOG_INFO , "lookup of %s on %s (following linkfile) reached dir", local ->loc.path, subvol->name); } while (0) | |||||
1120 | local->loc.path, subvol->name)do { do { if (0) printf ("lookup of %s on %s (following linkfile) reached dir" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1120, GF_LOG_INFO , "lookup of %s on %s (following linkfile) reached dir", local ->loc.path, subvol->name); } while (0); | |||||
1121 | goto err; | |||||
1122 | } | |||||
1123 | ||||||
1124 | if (check_is_linkfile (inode, stbuf, xattr, conf->link_xattr_name)( ((st_mode_from_ia ((stbuf)->ia_prot, (stbuf)->ia_type ) & ~0170000) == (01000)) && dict_get (xattr, conf ->link_xattr_name))) { | |||||
1125 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("lookup of %s on %s (following linkfile) reached link" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1127, GF_LOG_INFO , "lookup of %s on %s (following linkfile) reached link", local ->loc.path, subvol->name); } while (0) | |||||
1126 | "lookup of %s on %s (following linkfile) reached link",do { do { if (0) printf ("lookup of %s on %s (following linkfile) reached link" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1127, GF_LOG_INFO , "lookup of %s on %s (following linkfile) reached link", local ->loc.path, subvol->name); } while (0) | |||||
1127 | local->loc.path, subvol->name)do { do { if (0) printf ("lookup of %s on %s (following linkfile) reached link" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1127, GF_LOG_INFO , "lookup of %s on %s (following linkfile) reached link", local ->loc.path, subvol->name); } while (0); | |||||
1128 | goto err; | |||||
1129 | } | |||||
1130 | ||||||
1131 | if (uuid_compare (local->gfid, stbuf->ia_gfid)) { | |||||
1132 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: gfid different on data file on %s" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1134, GF_LOG_WARNING , "%s: gfid different on data file on %s", local->loc.path , subvol->name); } while (0) | |||||
1133 | "%s: gfid different on data file on %s",do { do { if (0) printf ("%s: gfid different on data file on %s" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1134, GF_LOG_WARNING , "%s: gfid different on data file on %s", local->loc.path , subvol->name); } while (0) | |||||
1134 | local->loc.path, subvol->name)do { do { if (0) printf ("%s: gfid different on data file on %s" , local->loc.path, subvol->name); } while (0); _gf_log ( this->name, "dht-common.c", __FUNCTION__, 1134, GF_LOG_WARNING , "%s: gfid different on data file on %s", local->loc.path , subvol->name); } while (0); | |||||
1135 | goto err; | |||||
1136 | } | |||||
1137 | ||||||
1138 | if ((stbuf->ia_nlink == 1) | |||||
1139 | && (conf && conf->unhashed_sticky_bit)) { | |||||
1140 | stbuf->ia_prot.sticky = 1; | |||||
1141 | } | |||||
1142 | ||||||
1143 | ret = dht_layout_preset (this, prev->this, inode); | |||||
1144 | if (ret < 0) { | |||||
1145 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("failed to set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1147, GF_LOG_INFO, "failed to set layout for subvolume %s" , prev->this->name); } while (0) | |||||
1146 | "failed to set layout for subvolume %s",do { do { if (0) printf ("failed to set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1147, GF_LOG_INFO, "failed to set layout for subvolume %s" , prev->this->name); } while (0) | |||||
1147 | prev->this->name)do { do { if (0) printf ("failed to set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1147, GF_LOG_INFO, "failed to set layout for subvolume %s" , prev->this->name); } while (0); | |||||
1148 | op_ret = -1; | |||||
1149 | op_errno = EINVAL22; | |||||
1150 | } | |||||
1151 | ||||||
1152 | if (local->loc.parent) { | |||||
1153 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
1154 | postparent, 1); | |||||
1155 | } | |||||
1156 | ||||||
1157 | unwind: | |||||
1158 | DHT_STRIP_PHASE1_FLAGS (stbuf)do { if ((stbuf) && ( ((stbuf)->ia_type == IA_IFREG ) && ((stbuf)->ia_prot.sticky == 1) && ((stbuf )->ia_prot.sgid == 1))) { (stbuf)->ia_prot.sticky = 0; ( stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
1159 | DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, stbuf, xattr,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1160, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, xattr, postparent) ; (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
1160 | postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1160, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, xattr, postparent) ; (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1161 | ||||||
1162 | return 0; | |||||
1163 | ||||||
1164 | err: | |||||
1165 | dht_lookup_everywhere (frame, this, loc); | |||||
1166 | out: | |||||
1167 | return 0; | |||||
1168 | } | |||||
1169 | ||||||
1170 | ||||||
1171 | int | |||||
1172 | dht_lookup_directory (call_frame_t *frame, xlator_t *this, loc_t *loc) | |||||
1173 | { | |||||
1174 | int call_cnt = 0; | |||||
1175 | int i = 0; | |||||
1176 | dht_conf_t *conf = NULL((void*)0); | |||||
1177 | dht_local_t *local = NULL((void*)0); | |||||
1178 | int ret = 0; | |||||
1179 | ||||||
1180 | GF_VALIDATE_OR_GOTO ("dht", frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1180, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto out; } } while (0); | |||||
1181 | GF_VALIDATE_OR_GOTO ("dht", this, unwind)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1181, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto unwind; } } while (0); | |||||
1182 | GF_VALIDATE_OR_GOTO ("dht", frame->local, unwind)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 1182, GF_LOG_ERROR, "invalid argument: " "frame->local") ; } while (0); goto unwind; } } while (0); | |||||
1183 | GF_VALIDATE_OR_GOTO ("dht", this->private, unwind)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 1183, GF_LOG_ERROR, "invalid argument: " "this->private" ); } while (0); goto unwind; } } while (0); | |||||
1184 | GF_VALIDATE_OR_GOTO ("dht", loc, unwind)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1184, GF_LOG_ERROR, "invalid argument: " "loc"); } while (0); goto unwind; } } while (0); | |||||
1185 | ||||||
1186 | conf = this->private; | |||||
1187 | local = frame->local; | |||||
1188 | ||||||
1189 | call_cnt = conf->subvolume_cnt; | |||||
1190 | local->call_cnt = call_cnt; | |||||
1191 | ||||||
1192 | local->layout = dht_layout_new (this, conf->subvolume_cnt); | |||||
1193 | if (!local->layout) { | |||||
1194 | goto unwind; | |||||
1195 | } | |||||
1196 | ||||||
1197 | if (local->xattr != NULL((void*)0)) { | |||||
1198 | dict_unref (local->xattr); | |||||
1199 | local->xattr = NULL((void*)0); | |||||
1200 | } | |||||
1201 | ||||||
1202 | if (!uuid_is_null (local->gfid)) { | |||||
1203 | ret = dict_set_static_bin (local->xattr_req, "gfid-req", | |||||
1204 | local->gfid, 16); | |||||
1205 | if (ret) | |||||
1206 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: failed to set gfid", local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1207, GF_LOG_WARNING, "%s: failed to set gfid" , local->loc.path); } while (0) | |||||
1207 | "%s: failed to set gfid", local->loc.path)do { do { if (0) printf ("%s: failed to set gfid", local-> loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1207, GF_LOG_WARNING, "%s: failed to set gfid" , local->loc.path); } while (0); | |||||
1208 | } | |||||
1209 | ||||||
1210 | for (i = 0; i < call_cnt; i++) { | |||||
1211 | STACK_WIND (frame, dht_lookup_dir_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1214, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_dir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_dir_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1212 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1214, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_dir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_dir_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1213 | conf->subvolumes[i]->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1214, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_dir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_dir_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1214 | &local->loc, local->xattr_req)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1214, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_dir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_dir_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1215 | } | |||||
1216 | return 0; | |||||
1217 | unwind: | |||||
1218 | DHT_STACK_UNWIND (lookup, frame, -1, ENOMEM, NULL, NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1218, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, 12, ((void*)0), ((void*)0), ((void*)0), ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) ; dht_local_wipe (__xl, __local); } while (0); | |||||
1219 | out: | |||||
1220 | return 0; | |||||
1221 | ||||||
1222 | } | |||||
1223 | ||||||
1224 | ||||||
1225 | int | |||||
1226 | dht_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1227 | int op_ret, int op_errno, | |||||
1228 | inode_t *inode, struct iatt *stbuf, dict_t *xattr, | |||||
1229 | struct iatt *postparent) | |||||
1230 | { | |||||
1231 | char is_linkfile = 0; | |||||
1232 | char is_dir = 0; | |||||
1233 | xlator_t *subvol = NULL((void*)0); | |||||
1234 | dht_conf_t *conf = NULL((void*)0); | |||||
1235 | dht_local_t *local = NULL((void*)0); | |||||
1236 | loc_t *loc = NULL((void*)0); | |||||
1237 | call_frame_t *prev = NULL((void*)0); | |||||
1238 | int ret = 0; | |||||
1239 | dht_layout_t *parent_layout = NULL((void*)0); | |||||
1240 | ||||||
1241 | GF_VALIDATE_OR_GOTO ("dht", frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1241, GF_LOG_ERROR, "invalid argument: " "frame"); } while (0); goto err; } } while (0); | |||||
1242 | GF_VALIDATE_OR_GOTO ("dht", this, out)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1242, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto out; } } while (0); | |||||
1243 | GF_VALIDATE_OR_GOTO ("dht", frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 1243, GF_LOG_ERROR, "invalid argument: " "frame->local") ; } while (0); goto out; } } while (0); | |||||
1244 | GF_VALIDATE_OR_GOTO ("dht", cookie, out)do { if (!cookie) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "cookie"); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__, 1244, GF_LOG_ERROR, "invalid argument: " "cookie"); } while (0); goto out; } } while (0); | |||||
1245 | GF_VALIDATE_OR_GOTO ("dht", this->private, out)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ("dht", "dht-common.c", __FUNCTION__ , 1245, GF_LOG_ERROR, "invalid argument: " "this->private" ); } while (0); goto out; } } while (0); | |||||
1246 | ||||||
1247 | conf = this->private; | |||||
1248 | ||||||
1249 | prev = cookie; | |||||
1250 | local = frame->local; | |||||
1251 | loc = &local->loc; | |||||
1252 | ||||||
1253 | /* This is required for handling stale linkfile deletion, | |||||
1254 | * or any more call which happens from this 'loc'. | |||||
1255 | */ | |||||
1256 | if (!op_ret && uuid_is_null (local->gfid)) | |||||
1257 | memcpy (local->gfid, stbuf->ia_gfid, 16); | |||||
1258 | ||||||
1259 | if (ENTRY_MISSING (op_ret, op_errno)(op_ret == -1 && op_errno == 2)) { | |||||
1260 | gf_log (this->name, GF_LOG_TRACE, "Entry %s missing on subvol"do { do { if (0) printf ("Entry %s missing on subvol" " %s", loc ->path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 1261, GF_LOG_TRACE, "Entry %s missing on subvol" " %s", loc->path, prev->this->name); } while (0) | |||||
1261 | " %s", loc->path, prev->this->name)do { do { if (0) printf ("Entry %s missing on subvol" " %s", loc ->path, prev->this->name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 1261, GF_LOG_TRACE, "Entry %s missing on subvol" " %s", loc->path, prev->this->name); } while (0); | |||||
1262 | if (conf->search_unhashed == GF_DHT_LOOKUP_UNHASHED_ON1) { | |||||
1263 | local->op_errno = ENOENT2; | |||||
1264 | dht_lookup_everywhere (frame, this, loc); | |||||
1265 | return 0; | |||||
1266 | } | |||||
1267 | if ((conf->search_unhashed == GF_DHT_LOOKUP_UNHASHED_AUTO2) && | |||||
1268 | (loc->parent)) { | |||||
1269 | ret = dht_inode_ctx_layout_get (loc->parent, this, | |||||
1270 | &parent_layout); | |||||
1271 | if (ret || !parent_layout) | |||||
1272 | goto out; | |||||
1273 | if (parent_layout->search_unhashed) { | |||||
1274 | local->op_errno = ENOENT2; | |||||
1275 | dht_lookup_everywhere (frame, this, loc); | |||||
1276 | return 0; | |||||
1277 | } | |||||
1278 | } | |||||
1279 | } | |||||
1280 | ||||||
1281 | if (op_ret == 0) { | |||||
1282 | is_dir = check_is_dir (inode, stbuf, xattr)((stbuf->ia_type == IA_IFDIR)); | |||||
1283 | if (is_dir) { | |||||
1284 | local->inode = inode_ref (inode); | |||||
1285 | local->xattr = dict_ref (xattr); | |||||
1286 | } | |||||
1287 | } | |||||
1288 | ||||||
1289 | if (is_dir || (op_ret == -1 && op_errno == ENOTCONN107)) { | |||||
1290 | dht_lookup_directory (frame, this, &local->loc); | |||||
1291 | return 0; | |||||
1292 | } | |||||
1293 | ||||||
1294 | if (op_ret == -1) { | |||||
1295 | gf_log (this->name, GF_LOG_DEBUG, "Lookup of %s for subvolume"do { do { if (0) printf ("Lookup of %s for subvolume" " %s failed with error %s" , loc->path, prev->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 1297, GF_LOG_DEBUG, "Lookup of %s for subvolume" " %s failed with error %s" , loc->path, prev->this->name, strerror (op_errno)); } while (0) | |||||
1296 | " %s failed with error %s", loc->path, prev->this->name,do { do { if (0) printf ("Lookup of %s for subvolume" " %s failed with error %s" , loc->path, prev->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 1297, GF_LOG_DEBUG, "Lookup of %s for subvolume" " %s failed with error %s" , loc->path, prev->this->name, strerror (op_errno)); } while (0) | |||||
1297 | strerror (op_errno))do { do { if (0) printf ("Lookup of %s for subvolume" " %s failed with error %s" , loc->path, prev->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 1297, GF_LOG_DEBUG, "Lookup of %s for subvolume" " %s failed with error %s" , loc->path, prev->this->name, strerror (op_errno)); } while (0); | |||||
1298 | goto out; | |||||
1299 | } | |||||
1300 | ||||||
1301 | is_linkfile = check_is_linkfile (inode, stbuf, xattr,( ((st_mode_from_ia ((stbuf)->ia_prot, (stbuf)->ia_type ) & ~0170000) == (01000)) && dict_get (xattr, conf ->link_xattr_name)) | |||||
1302 | conf->link_xattr_name)( ((st_mode_from_ia ((stbuf)->ia_prot, (stbuf)->ia_type ) & ~0170000) == (01000)) && dict_get (xattr, conf ->link_xattr_name)); | |||||
1303 | ||||||
1304 | if (!is_linkfile) { | |||||
1305 | /* non-directory and not a linkfile */ | |||||
1306 | ||||||
1307 | ret = dht_layout_preset (this, prev->this, inode); | |||||
1308 | if (ret < 0) { | |||||
1309 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("could not set pre-set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1311, GF_LOG_INFO, "could not set pre-set layout for subvolume %s" , prev->this->name); } while (0) | |||||
1310 | "could not set pre-set layout for subvolume %s",do { do { if (0) printf ("could not set pre-set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1311, GF_LOG_INFO, "could not set pre-set layout for subvolume %s" , prev->this->name); } while (0) | |||||
1311 | prev->this->name)do { do { if (0) printf ("could not set pre-set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 1311, GF_LOG_INFO, "could not set pre-set layout for subvolume %s" , prev->this->name); } while (0); | |||||
1312 | op_ret = -1; | |||||
1313 | op_errno = EINVAL22; | |||||
1314 | goto out; | |||||
1315 | } | |||||
1316 | goto out; | |||||
1317 | } | |||||
1318 | ||||||
1319 | subvol = dht_linkfile_subvol (this, inode, stbuf, xattr); | |||||
1320 | if (!subvol) { | |||||
1321 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("linkfile not having link subvolume. path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1323, GF_LOG_DEBUG, "linkfile not having link subvolume. path=%s" , loc->path); } while (0) | |||||
1322 | "linkfile not having link subvolume. path=%s",do { do { if (0) printf ("linkfile not having link subvolume. path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1323, GF_LOG_DEBUG, "linkfile not having link subvolume. path=%s" , loc->path); } while (0) | |||||
1323 | loc->path)do { do { if (0) printf ("linkfile not having link subvolume. path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1323, GF_LOG_DEBUG, "linkfile not having link subvolume. path=%s" , loc->path); } while (0); | |||||
1324 | dht_lookup_everywhere (frame, this, loc); | |||||
1325 | return 0; | |||||
1326 | } | |||||
1327 | ||||||
1328 | STACK_WIND (frame, dht_lookup_linkfile_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1330, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->lookup_cbk) tmp_cbk = dht_lookup_linkfile_cbk; _new-> root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->lookup"; _new->unwind_to = "dht_lookup_linkfile_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = subvol; if (frame->this ->ctx->measure_latency) gf_latency_begin (_new, subvol-> fops->lookup); subvol->fops->lookup (_new, subvol, & local->loc, local->xattr_req); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1329 | subvol, subvol->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1330, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->lookup_cbk) tmp_cbk = dht_lookup_linkfile_cbk; _new-> root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->lookup"; _new->unwind_to = "dht_lookup_linkfile_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = subvol; if (frame->this ->ctx->measure_latency) gf_latency_begin (_new, subvol-> fops->lookup); subvol->fops->lookup (_new, subvol, & local->loc, local->xattr_req); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1330 | &local->loc, local->xattr_req)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1330, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->lookup_cbk) tmp_cbk = dht_lookup_linkfile_cbk; _new-> root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->lookup"; _new->unwind_to = "dht_lookup_linkfile_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = subvol; if (frame->this ->ctx->measure_latency) gf_latency_begin (_new, subvol-> fops->lookup); subvol->fops->lookup (_new, subvol, & local->loc, local->xattr_req); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1331 | ||||||
1332 | return 0; | |||||
1333 | ||||||
1334 | out: | |||||
1335 | /* | |||||
1336 | * FIXME: postparent->ia_size and postparent->st_blocks do not have | |||||
1337 | * correct values. since, postparent corresponds to a directory these | |||||
1338 | * two members should have values equal to sum of corresponding values | |||||
1339 | * from each of the subvolume. See dht_iatt_merge for reference. | |||||
1340 | */ | |||||
1341 | ||||||
1342 | if (!op_ret && local->loc.parent) { | |||||
1343 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
1344 | postparent, 1); | |||||
1345 | } | |||||
1346 | ||||||
1347 | DHT_STRIP_PHASE1_FLAGS (stbuf)do { if ((stbuf) && ( ((stbuf)->ia_type == IA_IFREG ) && ((stbuf)->ia_prot.sticky == 1) && ((stbuf )->ia_prot.sgid == 1))) { (stbuf)->ia_prot.sticky = 0; ( stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
1348 | DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, stbuf, xattr,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1349, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, xattr, postparent) ; (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
1349 | postparent)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1349, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, xattr, postparent) ; (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1350 | err: | |||||
1351 | return 0; | |||||
1352 | } | |||||
1353 | ||||||
1354 | /* For directories, check if acl xattrs have been requested (by the acl xlator), | |||||
1355 | * if not, request for them. These xattrs are needed for dht dir self-heal to | |||||
1356 | * perform proper self-healing of dirs | |||||
1357 | */ | |||||
1358 | void | |||||
1359 | dht_check_and_set_acl_xattr_req (inode_t *inode, dict_t *xattr_req) | |||||
1360 | { | |||||
1361 | int ret = 0; | |||||
1362 | ||||||
1363 | GF_ASSERT (inode)do { if (!(inode)) { do { do { if (0) printf ("Assertion failed: " "inode"); } while (0); _gf_log_callingfn ("", "dht-common.c" , __FUNCTION__, 1363, GF_LOG_ERROR, "Assertion failed: " "inode" ); } while (0); } } while (0); | |||||
1364 | GF_ASSERT (xattr_req)do { if (!(xattr_req)) { do { do { if (0) printf ("Assertion failed: " "xattr_req"); } while (0); _gf_log_callingfn ("", "dht-common.c" , __FUNCTION__, 1364, GF_LOG_ERROR, "Assertion failed: " "xattr_req" ); } while (0); } } while (0); | |||||
1365 | ||||||
1366 | if (inode->ia_type != IA_IFDIR) | |||||
1367 | return; | |||||
1368 | ||||||
1369 | if (!dict_get (xattr_req, POSIX_ACL_ACCESS_XATTR"system.posix_acl_access")) { | |||||
1370 | ret = dict_set_int8 (xattr_req, POSIX_ACL_ACCESS_XATTR"system.posix_acl_access", 0); | |||||
1371 | if (ret) | |||||
1372 | gf_log (THIS->name, GF_LOG_WARNING,do { do { if (0) printf ("failed to set key %s", "system.posix_acl_access" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "dht-common.c", __FUNCTION__, 1374, GF_LOG_WARNING, "failed to set key %s" , "system.posix_acl_access"); } while (0) | |||||
1373 | "failed to set key %s",do { do { if (0) printf ("failed to set key %s", "system.posix_acl_access" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "dht-common.c", __FUNCTION__, 1374, GF_LOG_WARNING, "failed to set key %s" , "system.posix_acl_access"); } while (0) | |||||
1374 | POSIX_ACL_ACCESS_XATTR)do { do { if (0) printf ("failed to set key %s", "system.posix_acl_access" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "dht-common.c", __FUNCTION__, 1374, GF_LOG_WARNING, "failed to set key %s" , "system.posix_acl_access"); } while (0); | |||||
1375 | } | |||||
1376 | ||||||
1377 | if (!dict_get (xattr_req, POSIX_ACL_DEFAULT_XATTR"system.posix_acl_default")) { | |||||
1378 | ret = dict_set_int8 (xattr_req, POSIX_ACL_DEFAULT_XATTR"system.posix_acl_default", 0); | |||||
1379 | if (ret) | |||||
1380 | gf_log (THIS->name, GF_LOG_WARNING,do { do { if (0) printf ("failed to set key %s", "system.posix_acl_default" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "dht-common.c", __FUNCTION__, 1382, GF_LOG_WARNING, "failed to set key %s" , "system.posix_acl_default"); } while (0) | |||||
1381 | "failed to set key %s",do { do { if (0) printf ("failed to set key %s", "system.posix_acl_default" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "dht-common.c", __FUNCTION__, 1382, GF_LOG_WARNING, "failed to set key %s" , "system.posix_acl_default"); } while (0) | |||||
1382 | POSIX_ACL_DEFAULT_XATTR)do { do { if (0) printf ("failed to set key %s", "system.posix_acl_default" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "dht-common.c", __FUNCTION__, 1382, GF_LOG_WARNING, "failed to set key %s" , "system.posix_acl_default"); } while (0); | |||||
1383 | } | |||||
1384 | ||||||
1385 | return; | |||||
1386 | } | |||||
1387 | ||||||
1388 | int | |||||
1389 | dht_lookup (call_frame_t *frame, xlator_t *this, | |||||
1390 | loc_t *loc, dict_t *xattr_req) | |||||
1391 | { | |||||
1392 | xlator_t *subvol = NULL((void*)0); | |||||
1393 | xlator_t *hashed_subvol = NULL((void*)0); | |||||
1394 | dht_local_t *local = NULL((void*)0); | |||||
1395 | dht_conf_t *conf = NULL((void*)0); | |||||
1396 | int ret = -1; | |||||
1397 | int op_errno = -1; | |||||
1398 | dht_layout_t *layout = NULL((void*)0); | |||||
1399 | int i = 0; | |||||
1400 | int call_cnt = 0; | |||||
1401 | loc_t new_loc = {0,}; | |||||
1402 | ||||||
1403 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 1403, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
1404 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 1404, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
1405 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 1405, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
1406 | VALIDATE_OR_GOTO (loc->inode, err)do { if (!loc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 1406, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
1407 | VALIDATE_OR_GOTO (loc->path, err)do { if (!loc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 1407, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
1408 | ||||||
1409 | conf = this->private; | |||||
1410 | if (!conf) | |||||
1411 | goto err; | |||||
1412 | ||||||
1413 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_LOOKUP); | |||||
1414 | if (!local) { | |||||
1415 | op_errno = ENOMEM12; | |||||
1416 | goto err; | |||||
1417 | } | |||||
1418 | ||||||
1419 | ret = dht_filter_loc_subvol_key (this, loc, &new_loc, | |||||
1420 | &hashed_subvol); | |||||
1421 | if (ret) { | |||||
1422 | loc_wipe (&local->loc); | |||||
1423 | ret = loc_dup (&new_loc, &local->loc)loc_copy(&local->loc, &new_loc); | |||||
1424 | ||||||
1425 | /* we no more need 'new_loc' entries */ | |||||
1426 | loc_wipe (&new_loc); | |||||
1427 | ||||||
1428 | /* check if loc_dup() is successful */ | |||||
1429 | if (ret == -1) { | |||||
1430 | op_errno = errno(*__errno_location ()); | |||||
1431 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("copying location failed for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1433, GF_LOG_DEBUG, "copying location failed for path=%s" , loc->path); } while (0) | |||||
1432 | "copying location failed for path=%s",do { do { if (0) printf ("copying location failed for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1433, GF_LOG_DEBUG, "copying location failed for path=%s" , loc->path); } while (0) | |||||
1433 | loc->path)do { do { if (0) printf ("copying location failed for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1433, GF_LOG_DEBUG, "copying location failed for path=%s" , loc->path); } while (0); | |||||
1434 | goto err; | |||||
1435 | } | |||||
1436 | } | |||||
1437 | ||||||
1438 | if (xattr_req) { | |||||
1439 | local->xattr_req = dict_ref (xattr_req); | |||||
1440 | } else { | |||||
1441 | local->xattr_req = dict_new (); | |||||
1442 | } | |||||
1443 | ||||||
1444 | if (uuid_is_null (loc->pargfid) && !uuid_is_null (loc->gfid) && | |||||
1445 | !__is_root_gfid (loc->inode->gfid)) { | |||||
1446 | local->cached_subvol = NULL((void*)0); | |||||
1447 | dht_discover (frame, this, loc); | |||||
1448 | return 0; | |||||
1449 | } | |||||
1450 | ||||||
1451 | if (!hashed_subvol) | |||||
1452 | hashed_subvol = dht_subvol_get_hashed (this, loc); | |||||
1453 | local->hashed_subvol = hashed_subvol; | |||||
1454 | ||||||
1455 | if (is_revalidate (loc)(dht_inode_ctx_layout_get (loc->inode, this, ((void*)0)) == 0)) { | |||||
1456 | layout = local->layout; | |||||
1457 | if (!layout) { | |||||
1458 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("revalidate without cache. path=%s", loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1460, GF_LOG_DEBUG, "revalidate without cache. path=%s" , loc->path); } while (0) | |||||
1459 | "revalidate without cache. path=%s",do { do { if (0) printf ("revalidate without cache. path=%s", loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1460, GF_LOG_DEBUG, "revalidate without cache. path=%s" , loc->path); } while (0) | |||||
1460 | loc->path)do { do { if (0) printf ("revalidate without cache. path=%s", loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1460, GF_LOG_DEBUG, "revalidate without cache. path=%s" , loc->path); } while (0); | |||||
1461 | op_errno = EINVAL22; | |||||
1462 | goto err; | |||||
1463 | } | |||||
1464 | ||||||
1465 | if (layout->gen && (layout->gen < conf->gen)) { | |||||
1466 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("incomplete layout failure for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1468, GF_LOG_TRACE, "incomplete layout failure for path=%s" , loc->path); } while (0) | |||||
1467 | "incomplete layout failure for path=%s",do { do { if (0) printf ("incomplete layout failure for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1468, GF_LOG_TRACE, "incomplete layout failure for path=%s" , loc->path); } while (0) | |||||
1468 | loc->path)do { do { if (0) printf ("incomplete layout failure for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1468, GF_LOG_TRACE, "incomplete layout failure for path=%s" , loc->path); } while (0); | |||||
1469 | ||||||
1470 | dht_layout_unref (this, local->layout); | |||||
1471 | local->layout = NULL((void*)0); | |||||
1472 | local->cached_subvol = NULL((void*)0); | |||||
1473 | goto do_fresh_lookup; | |||||
1474 | } | |||||
1475 | ||||||
1476 | local->inode = inode_ref (loc->inode); | |||||
1477 | ||||||
1478 | /* NOTE: we don't require 'trusted.glusterfs.dht.linkto' attribute, | |||||
1479 | * revalidates directly go to the cached-subvolume. | |||||
1480 | */ | |||||
1481 | ret = dict_set_uint32 (local->xattr_req, | |||||
1482 | conf->xattr_name, 4 * 4); | |||||
1483 | ||||||
1484 | if (IA_ISDIR (local->inode->ia_type)(local->inode->ia_type == IA_IFDIR)) { | |||||
1485 | local->call_cnt = call_cnt = conf->subvolume_cnt; | |||||
1486 | for (i = 0; i < call_cnt; i++) { | |||||
1487 | STACK_WIND (frame, dht_revalidate_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1490, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_revalidate_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_revalidate_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], loc, local->xattr_req ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1488 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1490, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_revalidate_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_revalidate_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], loc, local->xattr_req ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1489 | conf->subvolumes[i]->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1490, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_revalidate_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_revalidate_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], loc, local->xattr_req ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1490 | loc, local->xattr_req)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1490, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_revalidate_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_revalidate_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], loc, local->xattr_req ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1491 | } | |||||
1492 | return 0; | |||||
1493 | } | |||||
1494 | ||||||
1495 | call_cnt = local->call_cnt = layout->cnt; | |||||
1496 | ||||||
1497 | /* need it for self-healing linkfiles which is | |||||
1498 | 'in-migration' state */ | |||||
1499 | ret = dict_set_uint32 (local->xattr_req, | |||||
1500 | GLUSTERFS_OPEN_FD_COUNT"glusterfs.open-fd-count", 4); | |||||
1501 | ||||||
1502 | /* need it for dir self-heal */ | |||||
1503 | dht_check_and_set_acl_xattr_req (loc->inode, local->xattr_req); | |||||
1504 | ||||||
1505 | for (i = 0; i < call_cnt; i++) { | |||||
1506 | subvol = layout->list[i].xlator; | |||||
1507 | ||||||
1508 | STACK_WIND (frame, dht_revalidate_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1510, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->lookup_cbk) tmp_cbk = dht_revalidate_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->lookup" ; _new->unwind_to = "dht_revalidate_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->lookup); subvol-> fops->lookup (_new, subvol, &local->loc, local-> xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1509 | subvol, subvol->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1510, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->lookup_cbk) tmp_cbk = dht_revalidate_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->lookup" ; _new->unwind_to = "dht_revalidate_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->lookup); subvol-> fops->lookup (_new, subvol, &local->loc, local-> xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1510 | &local->loc, local->xattr_req)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1510, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->lookup_cbk) tmp_cbk = dht_revalidate_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->lookup" ; _new->unwind_to = "dht_revalidate_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->lookup); subvol-> fops->lookup (_new, subvol, &local->loc, local-> xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1511 | ||||||
1512 | } | |||||
1513 | } else { | |||||
1514 | do_fresh_lookup: | |||||
1515 | /* TODO: remove the hard-coding */ | |||||
1516 | ret = dict_set_uint32 (local->xattr_req, | |||||
1517 | conf->xattr_name, 4 * 4); | |||||
1518 | ||||||
1519 | ret = dict_set_uint32 (local->xattr_req, | |||||
1520 | conf->link_xattr_name, 256); | |||||
1521 | ||||||
1522 | /* need it for self-healing linkfiles which is | |||||
1523 | 'in-migration' state */ | |||||
1524 | ret = dict_set_uint32 (local->xattr_req, | |||||
1525 | GLUSTERFS_OPEN_FD_COUNT"glusterfs.open-fd-count", 4); | |||||
1526 | ||||||
1527 | /* need it for dir self-heal */ | |||||
1528 | dht_check_and_set_acl_xattr_req (loc->inode, local->xattr_req); | |||||
1529 | ||||||
1530 | if (!hashed_subvol) { | |||||
1531 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no subvolume in layout for path=%s, " "checking on all the subvols to see if " "it is a directory" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1534, GF_LOG_DEBUG, "no subvolume in layout for path=%s, " "checking on all the subvols to see if " "it is a directory" , loc->path); } while (0) | |||||
1532 | "no subvolume in layout for path=%s, "do { do { if (0) printf ("no subvolume in layout for path=%s, " "checking on all the subvols to see if " "it is a directory" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1534, GF_LOG_DEBUG, "no subvolume in layout for path=%s, " "checking on all the subvols to see if " "it is a directory" , loc->path); } while (0) | |||||
1533 | "checking on all the subvols to see if "do { do { if (0) printf ("no subvolume in layout for path=%s, " "checking on all the subvols to see if " "it is a directory" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1534, GF_LOG_DEBUG, "no subvolume in layout for path=%s, " "checking on all the subvols to see if " "it is a directory" , loc->path); } while (0) | |||||
1534 | "it is a directory", loc->path)do { do { if (0) printf ("no subvolume in layout for path=%s, " "checking on all the subvols to see if " "it is a directory" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1534, GF_LOG_DEBUG, "no subvolume in layout for path=%s, " "checking on all the subvols to see if " "it is a directory" , loc->path); } while (0); | |||||
1535 | call_cnt = conf->subvolume_cnt; | |||||
1536 | local->call_cnt = call_cnt; | |||||
1537 | ||||||
1538 | local->layout = dht_layout_new (this, | |||||
1539 | conf->subvolume_cnt); | |||||
1540 | if (!local->layout) { | |||||
1541 | op_errno = ENOMEM12; | |||||
1542 | goto err; | |||||
1543 | } | |||||
1544 | ||||||
1545 | for (i = 0; i < call_cnt; i++) { | |||||
1546 | STACK_WIND (frame, dht_lookup_dir_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1549, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_dir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_dir_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1547 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1549, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_dir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_dir_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1548 | conf->subvolumes[i]->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1549, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_dir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_dir_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1549 | &local->loc, local->xattr_req)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1549, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->lookup_cbk) tmp_cbk = dht_lookup_dir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->lookup"; _new ->unwind_to = "dht_lookup_dir_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->lookup); conf->subvolumes[i]->fops-> lookup (_new, conf->subvolumes[i], &local->loc, local ->xattr_req); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1550 | } | |||||
1551 | return 0; | |||||
1552 | } | |||||
1553 | ||||||
1554 | STACK_WIND (frame, dht_lookup_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1556, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->lookup_cbk) tmp_cbk = dht_lookup_cbk; _new-> root = frame->root; _new->this = hashed_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->lookup"; _new->unwind_to = "dht_lookup_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->lookup); hashed_subvol->fops-> lookup (_new, hashed_subvol, loc, local->xattr_req); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1555 | hashed_subvol, hashed_subvol->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1556, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->lookup_cbk) tmp_cbk = dht_lookup_cbk; _new-> root = frame->root; _new->this = hashed_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->lookup"; _new->unwind_to = "dht_lookup_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->lookup); hashed_subvol->fops-> lookup (_new, hashed_subvol, loc, local->xattr_req); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1556 | loc, local->xattr_req)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1556, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->lookup_cbk) tmp_cbk = dht_lookup_cbk; _new-> root = frame->root; _new->this = hashed_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->lookup"; _new->unwind_to = "dht_lookup_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->lookup); hashed_subvol->fops-> lookup (_new, hashed_subvol, loc, local->xattr_req); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1557 | } | |||||
1558 | ||||||
1559 | return 0; | |||||
1560 | ||||||
1561 | err: | |||||
1562 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
1563 | DHT_STACK_UNWIND (lookup, frame, -1, op_errno, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1564, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
1564 | NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_lookup_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1564, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lookup_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1565 | return 0; | |||||
1566 | } | |||||
1567 | ||||||
1568 | ||||||
1569 | int | |||||
1570 | dht_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1571 | int op_ret, int op_errno, struct iatt *preparent, | |||||
1572 | struct iatt *postparent, dict_t *xdata) | |||||
1573 | { | |||||
1574 | dht_local_t *local = NULL((void*)0); | |||||
1575 | call_frame_t *prev = NULL((void*)0); | |||||
1576 | ||||||
1577 | local = frame->local; | |||||
1578 | prev = cookie; | |||||
1579 | ||||||
1580 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1581 | { | |||||
1582 | if (op_ret == -1) { | |||||
1583 | local->op_ret = -1; | |||||
1584 | local->op_errno = op_errno; | |||||
1585 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1587, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1586 | "subvolume %s returned -1 (%s)",do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1587, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1587 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1587, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0); | |||||
1588 | goto unlock; | |||||
1589 | } | |||||
1590 | ||||||
1591 | local->op_ret = 0; | |||||
1592 | ||||||
1593 | local->postparent = *postparent; | |||||
1594 | local->preparent = *preparent; | |||||
1595 | ||||||
1596 | if (local->loc.parent) { | |||||
1597 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
1598 | &local->preparent, 0); | |||||
1599 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
1600 | &local->postparent, 1); | |||||
1601 | } | |||||
1602 | } | |||||
1603 | unlock: | |||||
1604 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1605 | ||||||
1606 | DHT_STACK_UNWIND (unlink, frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_unlink_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1607, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_unlink_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
1607 | &local->preparent, &local->postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_unlink_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1607, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_unlink_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1608 | ||||||
1609 | return 0; | |||||
1610 | } | |||||
1611 | ||||||
1612 | ||||||
1613 | int | |||||
1614 | dht_unlink_linkfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1615 | int op_ret, int op_errno, struct iatt *preparent, | |||||
1616 | struct iatt *postparent, dict_t *xdata) | |||||
1617 | { | |||||
1618 | dht_local_t *local = NULL((void*)0); | |||||
1619 | call_frame_t *prev = NULL((void*)0); | |||||
1620 | ||||||
1621 | xlator_t *cached_subvol = NULL((void*)0); | |||||
1622 | ||||||
1623 | local = frame->local; | |||||
1624 | prev = cookie; | |||||
1625 | ||||||
1626 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1627 | { | |||||
1628 | if (op_ret == -1) { | |||||
1629 | local->op_errno = op_errno; | |||||
1630 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1632, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1631 | "subvolume %s returned -1 (%s)",do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1632, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1632 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1632, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0); | |||||
1633 | goto unlock; | |||||
1634 | } | |||||
1635 | ||||||
1636 | local->op_ret = 0; | |||||
1637 | } | |||||
1638 | unlock: | |||||
1639 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1640 | ||||||
1641 | if (op_ret == -1) | |||||
1642 | goto err; | |||||
1643 | ||||||
1644 | cached_subvol = dht_subvol_get_cached (this, local->loc.inode); | |||||
1645 | if (!cached_subvol) { | |||||
1646 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for path=%s", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1648, GF_LOG_DEBUG, "no cached subvolume for path=%s" , local->loc.path); } while (0) | |||||
1647 | "no cached subvolume for path=%s",do { do { if (0) printf ("no cached subvolume for path=%s", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1648, GF_LOG_DEBUG, "no cached subvolume for path=%s" , local->loc.path); } while (0) | |||||
1648 | local->loc.path)do { do { if (0) printf ("no cached subvolume for path=%s", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1648, GF_LOG_DEBUG, "no cached subvolume for path=%s" , local->loc.path); } while (0); | |||||
1649 | local->op_errno = EINVAL22; | |||||
1650 | goto err; | |||||
1651 | } | |||||
1652 | ||||||
1653 | STACK_WIND (frame, dht_unlink_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1655, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, &local->loc, local->flags , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1654 | cached_subvol, cached_subvol->fops->unlink,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1655, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, &local->loc, local->flags , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1655 | &local->loc, local->flags, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 1655, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, &local->loc, local->flags , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1656 | ||||||
1657 | return 0; | |||||
1658 | ||||||
1659 | err: | |||||
1660 | DHT_STACK_UNWIND (unlink, frame, -1, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_unlink_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1661, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_unlink_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, local->op_errno, ((void*)0), ((void*)0), (( void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
1661 | NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_unlink_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1661, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_unlink_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, local->op_errno, ((void*)0), ((void*)0), (( void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1662 | return 0; | |||||
1663 | } | |||||
1664 | ||||||
1665 | static int | |||||
1666 | dht_ufo_xattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1667 | int op_ret, int op_errno, dict_t *xdata) | |||||
1668 | { | |||||
1669 | dht_local_t *local = NULL((void*)0); | |||||
1670 | int this_call_cnt = 0; | |||||
1671 | call_frame_t *prev = NULL((void*)0); | |||||
1672 | ||||||
1673 | local = frame->local; | |||||
1674 | prev = cookie; | |||||
1675 | ||||||
1676 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1677 | { | |||||
1678 | if (op_ret == -1) { | |||||
1679 | local->op_ret = -1; | |||||
1680 | local->op_errno = op_errno; | |||||
1681 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1683, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1682 | "subvolume %s returned -1 (%s)",do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1683, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1683 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1683, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0); | |||||
1684 | goto unlock; | |||||
1685 | } | |||||
1686 | } | |||||
1687 | unlock: | |||||
1688 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1689 | ||||||
1690 | this_call_cnt = dht_frame_return (frame); | |||||
1691 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
1692 | DHT_STACK_UNWIND (setxattr, frame, local->op_ret,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_setxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1693, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
1693 | local->op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_setxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1693, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1694 | } | |||||
1695 | ||||||
1696 | return 0; | |||||
1697 | } | |||||
1698 | ||||||
1699 | ||||||
1700 | int | |||||
1701 | dht_err_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1702 | int op_ret, int op_errno, dict_t *xdata) | |||||
1703 | { | |||||
1704 | dht_local_t *local = NULL((void*)0); | |||||
1705 | int this_call_cnt = 0; | |||||
1706 | call_frame_t *prev = NULL((void*)0); | |||||
1707 | ||||||
1708 | local = frame->local; | |||||
1709 | prev = cookie; | |||||
1710 | ||||||
1711 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1712 | { | |||||
1713 | if (op_ret == -1) { | |||||
1714 | local->op_errno = op_errno; | |||||
1715 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1717, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1716 | "subvolume %s returned -1 (%s)",do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1717, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1717 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1717, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0); | |||||
1718 | goto unlock; | |||||
1719 | } | |||||
1720 | ||||||
1721 | local->op_ret = 0; | |||||
1722 | } | |||||
1723 | unlock: | |||||
1724 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1725 | ||||||
1726 | this_call_cnt = dht_frame_return (frame); | |||||
1727 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
1728 | DHT_STACK_UNWIND (setxattr, frame, local->op_ret,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_setxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1729, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
1729 | local->op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_setxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1729, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1730 | } | |||||
1731 | ||||||
1732 | return 0; | |||||
1733 | } | |||||
1734 | ||||||
1735 | static void | |||||
1736 | fill_layout_info (dht_layout_t *layout, char *buf) | |||||
1737 | { | |||||
1738 | int i = 0; | |||||
1739 | char tmp_buf[128] = {0,}; | |||||
1740 | ||||||
1741 | for (i = 0; i < layout->cnt; i++) { | |||||
1742 | snprintf (tmp_buf, 128, "(%s %u %u)", | |||||
1743 | layout->list[i].xlator->name, | |||||
1744 | layout->list[i].start, | |||||
1745 | layout->list[i].stop); | |||||
1746 | if (i) | |||||
1747 | strcat (buf, " "); | |||||
1748 | strcat (buf, tmp_buf); | |||||
1749 | } | |||||
1750 | } | |||||
1751 | ||||||
1752 | void | |||||
1753 | dht_fill_pathinfo_xattr (xlator_t *this, dht_local_t *local, | |||||
1754 | char *xattr_buf, int32_t alloc_len, | |||||
1755 | int flag, char *layout_buf) | |||||
1756 | { | |||||
1757 | if (flag && local->xattr_val) | |||||
1758 | snprintf (xattr_buf, alloc_len, | |||||
1759 | "((<"DHT_PATHINFO_HEADER"DISTRIBUTE:""%s> %s) (%s-layout %s))", | |||||
1760 | this->name, local->xattr_val, this->name, | |||||
1761 | layout_buf); | |||||
1762 | else if (local->xattr_val) | |||||
1763 | snprintf (xattr_buf, alloc_len, | |||||
1764 | "(<"DHT_PATHINFO_HEADER"DISTRIBUTE:""%s> %s)", | |||||
1765 | this->name, local->xattr_val); | |||||
1766 | else if (flag) | |||||
1767 | snprintf (xattr_buf, alloc_len, "(%s-layout %s)", | |||||
1768 | this->name, layout_buf); | |||||
1769 | } | |||||
1770 | ||||||
1771 | int | |||||
1772 | dht_vgetxattr_alloc_and_fill (dht_local_t *local, dict_t *xattr, xlator_t *this, | |||||
1773 | int op_errno) | |||||
1774 | { | |||||
1775 | int ret = -1; | |||||
1776 | char *value = NULL((void*)0); | |||||
1777 | int32_t plen = 0; | |||||
1778 | ||||||
1779 | ret = dict_get_str (xattr, local->xsel, &value); | |||||
1780 | if (ret) { | |||||
1781 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Subvolume %s returned -1 (%s)", this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 1783, GF_LOG_ERROR, "Subvolume %s returned -1 (%s)" , this->name, strerror (op_errno)); } while (0) | |||||
1782 | "Subvolume %s returned -1 (%s)", this->name,do { do { if (0) printf ("Subvolume %s returned -1 (%s)", this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 1783, GF_LOG_ERROR, "Subvolume %s returned -1 (%s)" , this->name, strerror (op_errno)); } while (0) | |||||
1783 | strerror (op_errno))do { do { if (0) printf ("Subvolume %s returned -1 (%s)", this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "dht-common.c", __FUNCTION__, 1783, GF_LOG_ERROR, "Subvolume %s returned -1 (%s)" , this->name, strerror (op_errno)); } while (0); | |||||
1784 | local->op_ret = -1; | |||||
1785 | local->op_errno = op_errno; | |||||
1786 | goto out; | |||||
1787 | } | |||||
1788 | ||||||
1789 | local->alloc_len += strlen(value); | |||||
1790 | ||||||
1791 | if (!local->xattr_val) { | |||||
1792 | local->alloc_len += (strlen (DHT_PATHINFO_HEADER"DISTRIBUTE:") + 10); | |||||
1793 | local->xattr_val = GF_CALLOC (local->alloc_len, sizeof (char),__gf_calloc (local->alloc_len, sizeof (char), gf_common_mt_char ) | |||||
1794 | gf_common_mt_char)__gf_calloc (local->alloc_len, sizeof (char), gf_common_mt_char ); | |||||
1795 | if (!local->xattr_val) { | |||||
1796 | ret = -1; | |||||
1797 | goto out; | |||||
1798 | } | |||||
1799 | } | |||||
1800 | ||||||
1801 | if (local->xattr_val) { | |||||
1802 | plen = strlen (local->xattr_val); | |||||
1803 | if (plen) { | |||||
1804 | /* extra byte(s) for \0 to be safe */ | |||||
1805 | local->alloc_len += (plen + 2); | |||||
1806 | local->xattr_val = GF_REALLOC (local->xattr_val,__gf_realloc (local->xattr_val, local->alloc_len) | |||||
1807 | local->alloc_len)__gf_realloc (local->xattr_val, local->alloc_len); | |||||
1808 | if (!local->xattr_val) { | |||||
1809 | ret = -1; | |||||
1810 | goto out; | |||||
1811 | } | |||||
1812 | } | |||||
1813 | ||||||
1814 | (void) strcat (local->xattr_val, value); | |||||
1815 | local->op_ret = 0; | |||||
1816 | } | |||||
1817 | ||||||
1818 | ret = 0; | |||||
1819 | ||||||
1820 | out: | |||||
1821 | return ret; | |||||
1822 | } | |||||
1823 | ||||||
1824 | int | |||||
1825 | dht_vgetxattr_fill_and_set (dht_local_t *local, dict_t **dict, xlator_t *this, | |||||
1826 | gf_boolean_t flag) | |||||
1827 | { | |||||
1828 | int ret = -1; | |||||
1829 | char *xattr_buf = NULL((void*)0); | |||||
1830 | char layout_buf[8192] = {0,}; | |||||
1831 | ||||||
1832 | if (flag) | |||||
1833 | fill_layout_info (local->layout, layout_buf); | |||||
1834 | ||||||
1835 | *dict = dict_new (); | |||||
1836 | if (!*dict) | |||||
1837 | goto out; | |||||
1838 | ||||||
1839 | /* we would need max this many bytes to create xattr string | |||||
1840 | * extra 40 bytes is just an estimated amount of additional | |||||
1841 | * space required as we include translator name and some | |||||
1842 | * spaces, brackets etc. when forming the pathinfo string. | |||||
1843 | * | |||||
1844 | * For node-uuid we just don't have all the pretty formatting, | |||||
1845 | * but since this is a generic routine for pathinfo & node-uuid | |||||
1846 | * we dont have conditional space allocation and try to be | |||||
1847 | * generic | |||||
1848 | */ | |||||
1849 | local->alloc_len += (2 * strlen (this->name)) | |||||
1850 | + strlen (layout_buf) | |||||
1851 | + 40; | |||||
1852 | xattr_buf = GF_CALLOC (local->alloc_len, sizeof (char),__gf_calloc (local->alloc_len, sizeof (char), gf_common_mt_char ) | |||||
1853 | gf_common_mt_char)__gf_calloc (local->alloc_len, sizeof (char), gf_common_mt_char ); | |||||
1854 | if (!xattr_buf) | |||||
1855 | goto out; | |||||
1856 | ||||||
1857 | if (XATTR_IS_PATHINFO (local->xsel)(strncmp (local->xsel, "trusted.glusterfs.pathinfo", strlen ("trusted.glusterfs.pathinfo")) == 0)) { | |||||
1858 | (void) dht_fill_pathinfo_xattr (this, local, xattr_buf, | |||||
1859 | local->alloc_len, flag, | |||||
1860 | layout_buf); | |||||
1861 | } else if (XATTR_IS_NODE_UUID (local->xsel)(strncmp (local->xsel, "trusted.glusterfs.node-uuid", strlen ("trusted.glusterfs.node-uuid")) == 0)) { | |||||
1862 | (void) snprintf (xattr_buf, local->alloc_len, "%s", | |||||
1863 | local->xattr_val); | |||||
1864 | } else { | |||||
1865 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("Unknown local->xsel (%s)", local ->xsel); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1866, GF_LOG_WARNING, "Unknown local->xsel (%s)" , local->xsel); } while (0) | |||||
1866 | "Unknown local->xsel (%s)", local->xsel)do { do { if (0) printf ("Unknown local->xsel (%s)", local ->xsel); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1866, GF_LOG_WARNING, "Unknown local->xsel (%s)" , local->xsel); } while (0); | |||||
1867 | goto out; | |||||
1868 | } | |||||
1869 | ||||||
1870 | ret = dict_set_dynstr (*dict, local->xsel, xattr_buf); | |||||
1871 | GF_FREE (local->xattr_val)__gf_free (local->xattr_val); | |||||
1872 | ||||||
1873 | out: | |||||
1874 | return ret; | |||||
1875 | } | |||||
1876 | ||||||
1877 | int | |||||
1878 | dht_vgetxattr_dir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1879 | int op_ret, int op_errno, dict_t *xattr, dict_t *xdata) | |||||
1880 | { | |||||
1881 | int ret = 0; | |||||
1882 | dht_local_t *local = NULL((void*)0); | |||||
1883 | int this_call_cnt = 0; | |||||
1884 | dict_t *dict = NULL((void*)0); | |||||
1885 | ||||||
1886 | VALIDATE_OR_GOTO (frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 1886, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto out; } } while (0); | |||||
1887 | VALIDATE_OR_GOTO (frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 1887, GF_LOG_WARNING, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
1888 | ||||||
1889 | local = frame->local; | |||||
1890 | ||||||
1891 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1892 | { | |||||
1893 | this_call_cnt = --local->call_cnt; | |||||
1894 | if (op_ret < 0) { | |||||
1895 | if (op_errno != ENOTCONN107) { | |||||
1896 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("getxattr err (%s) for dir", strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1898, GF_LOG_ERROR, "getxattr err (%s) for dir" , strerror (op_errno)); } while (0) | |||||
1897 | "getxattr err (%s) for dir",do { do { if (0) printf ("getxattr err (%s) for dir", strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1898, GF_LOG_ERROR, "getxattr err (%s) for dir" , strerror (op_errno)); } while (0) | |||||
1898 | strerror (op_errno))do { do { if (0) printf ("getxattr err (%s) for dir", strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 1898, GF_LOG_ERROR, "getxattr err (%s) for dir" , strerror (op_errno)); } while (0); | |||||
1899 | local->op_ret = -1; | |||||
1900 | local->op_errno = op_errno; | |||||
1901 | } | |||||
1902 | ||||||
1903 | goto unlock; | |||||
1904 | } | |||||
1905 | ||||||
1906 | ret = dht_vgetxattr_alloc_and_fill (local, xattr, this, | |||||
1907 | op_errno); | |||||
1908 | if (ret) | |||||
1909 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("alloc or fill failure"); } while (0 ); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1910 , GF_LOG_ERROR, "alloc or fill failure"); } while (0) | |||||
1910 | "alloc or fill failure")do { do { if (0) printf ("alloc or fill failure"); } while (0 ); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1910 , GF_LOG_ERROR, "alloc or fill failure"); } while (0); | |||||
1911 | } | |||||
1912 | unlock: | |||||
1913 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1914 | ||||||
1915 | if (!is_last_call (this_call_cnt)(this_call_cnt == 0)) | |||||
1916 | goto out; | |||||
1917 | ||||||
1918 | /* -- last call: do patch ups -- */ | |||||
1919 | ||||||
1920 | if (local->op_ret == -1) { | |||||
1921 | goto unwind; | |||||
1922 | } | |||||
1923 | ||||||
1924 | ret = dht_vgetxattr_fill_and_set (local, &dict, this, _gf_true); | |||||
1925 | if (ret) | |||||
1926 | goto unwind; | |||||
1927 | ||||||
1928 | DHT_STACK_UNWIND (getxattr, frame, 0, 0, dict, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1928, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, 0, 0, dict, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1929 | goto cleanup; | |||||
1930 | ||||||
1931 | unwind: | |||||
1932 | DHT_STACK_UNWIND (getxattr, frame, -1, local->op_errno, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1932, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, local->op_errno, ((void*)0), ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1933 | cleanup: | |||||
1934 | if (dict) | |||||
1935 | dict_unref (dict); | |||||
1936 | out: | |||||
1937 | return 0; | |||||
1938 | } | |||||
1939 | ||||||
1940 | int | |||||
1941 | dht_vgetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1942 | int op_ret, int op_errno, dict_t *xattr, dict_t *xdata) | |||||
1943 | { | |||||
1944 | dht_local_t *local = NULL((void*)0); | |||||
1945 | int ret = 0; | |||||
1946 | dict_t *dict = NULL((void*)0); | |||||
1947 | call_frame_t *prev = NULL((void*)0); | |||||
1948 | gf_boolean_t flag = _gf_true; | |||||
1949 | ||||||
1950 | local = frame->local; | |||||
1951 | prev = cookie; | |||||
1952 | ||||||
1953 | if (op_ret < 0) { | |||||
1954 | local->op_ret = -1; | |||||
1955 | local->op_errno = op_errno; | |||||
1956 | gf_log (this->name, GF_LOG_ERROR, "Subvolume %s returned -1 "do { do { if (0) printf ("Subvolume %s returned -1 " "(%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1957, GF_LOG_ERROR , "Subvolume %s returned -1 " "(%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
1957 | "(%s)", prev->this->name, strerror (op_errno))do { do { if (0) printf ("Subvolume %s returned -1 " "(%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1957, GF_LOG_ERROR , "Subvolume %s returned -1 " "(%s)", prev->this->name, strerror (op_errno)); } while (0); | |||||
1958 | goto unwind; | |||||
1959 | } | |||||
1960 | ||||||
1961 | ret = dht_vgetxattr_alloc_and_fill (local, xattr, this, | |||||
1962 | op_errno); | |||||
1963 | if (ret) { | |||||
1964 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("alloc or fill failure"); } while (0 ); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1965 , GF_LOG_ERROR, "alloc or fill failure"); } while (0) | |||||
1965 | "alloc or fill failure")do { do { if (0) printf ("alloc or fill failure"); } while (0 ); _gf_log (this->name, "dht-common.c", __FUNCTION__, 1965 , GF_LOG_ERROR, "alloc or fill failure"); } while (0); | |||||
1966 | goto unwind; | |||||
1967 | } | |||||
1968 | ||||||
1969 | flag = (local->layout->cnt > 1) ? _gf_true : _gf_false; | |||||
1970 | ||||||
1971 | ret = dht_vgetxattr_fill_and_set (local, &dict, this, flag); | |||||
1972 | if (ret) | |||||
1973 | goto unwind; | |||||
1974 | ||||||
1975 | DHT_STACK_UNWIND (getxattr, frame, 0, 0, dict, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1975, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, 0, 0, dict, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1976 | goto cleanup; | |||||
1977 | ||||||
1978 | unwind: | |||||
1979 | DHT_STACK_UNWIND (getxattr, frame, -1, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1980, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, local->op_errno, ((void*)0), ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
1980 | NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 1980, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, local->op_errno, ((void*)0), ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
1981 | cleanup: | |||||
1982 | if (dict) | |||||
1983 | dict_unref (dict); | |||||
1984 | ||||||
1985 | return 0; | |||||
1986 | } | |||||
1987 | ||||||
1988 | int | |||||
1989 | dht_linkinfo_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1990 | int op_ret, int op_errno, dict_t *xattr, | |||||
1991 | dict_t *xdata) | |||||
1992 | { | |||||
1993 | int ret = 0; | |||||
1994 | char *value = NULL((void*)0); | |||||
1995 | ||||||
1996 | if (op_ret != -1) { | |||||
1997 | ret = dict_get_str (xattr, GF_XATTR_PATHINFO_KEY"trusted.glusterfs.pathinfo", &value); | |||||
1998 | if (!ret) { | |||||
1999 | ret = dict_set_str (xattr, GF_XATTR_LINKINFO_KEY"trusted.distribute.linkinfo", value); | |||||
2000 | if (!ret) | |||||
2001 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("failed to set linkinfo"); } while ( 0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2002 , GF_LOG_TRACE, "failed to set linkinfo"); } while (0) | |||||
2002 | "failed to set linkinfo")do { do { if (0) printf ("failed to set linkinfo"); } while ( 0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2002 , GF_LOG_TRACE, "failed to set linkinfo"); } while (0); | |||||
2003 | } | |||||
2004 | } | |||||
2005 | ||||||
2006 | DHT_STACK_UNWIND (getxattr, frame, op_ret, op_errno, xattr, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2006, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, xattr, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2007 | ||||||
2008 | return 0; | |||||
2009 | } | |||||
2010 | ||||||
2011 | int | |||||
2012 | dht_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2013 | int op_ret, int op_errno, dict_t *xattr, dict_t *xdata) | |||||
2014 | { | |||||
2015 | int this_call_cnt = 0; | |||||
2016 | dht_local_t *local = NULL((void*)0); | |||||
2017 | dht_conf_t *conf = NULL((void*)0); | |||||
2018 | ||||||
2019 | VALIDATE_OR_GOTO (frame, out)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2019, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto out; } } while (0); | |||||
2020 | VALIDATE_OR_GOTO (frame->local, out)do { if (!frame->local) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "frame->local"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2020, GF_LOG_WARNING, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
2021 | VALIDATE_OR_GOTO (this->private, out)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2021, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto out; } } while (0); | |||||
2022 | ||||||
2023 | conf = this->private; | |||||
2024 | local = frame->local; | |||||
2025 | ||||||
2026 | this_call_cnt = dht_frame_return (frame); | |||||
2027 | ||||||
2028 | if (!xattr || (op_ret == -1)) | |||||
2029 | goto out; | |||||
2030 | ||||||
2031 | if (dict_get (xattr, conf->xattr_name)) { | |||||
2032 | dict_del (xattr, conf->xattr_name); | |||||
2033 | } | |||||
2034 | local->op_ret = 0; | |||||
2035 | ||||||
2036 | if (!local->xattr) { | |||||
2037 | local->xattr = dict_copy_with_ref (xattr, NULL((void*)0)); | |||||
2038 | } else { | |||||
2039 | /* first aggregate everything into xattr and then copy into | |||||
2040 | * local->xattr. This is required as we want to have | |||||
2041 | * 'local->xattr' as the proper final dictionary passed above | |||||
2042 | * distribute xlator. | |||||
2043 | */ | |||||
2044 | dht_aggregate_xattr (xattr, local->xattr); | |||||
2045 | local->xattr = dict_copy (xattr, local->xattr); | |||||
2046 | } | |||||
2047 | out: | |||||
2048 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
2049 | DHT_STACK_UNWIND (getxattr, frame, local->op_ret, op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2050, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, op_errno, local->xattr, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) ; dht_local_wipe (__xl, __local); } while (0) | |||||
2050 | local->xattr, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2050, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, op_errno, local->xattr, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) ; dht_local_wipe (__xl, __local); } while (0); | |||||
2051 | } | |||||
2052 | return 0; | |||||
2053 | } | |||||
2054 | ||||||
2055 | int32_t | |||||
2056 | dht_getxattr_unwind (call_frame_t *frame, | |||||
2057 | int op_ret, int op_errno, dict_t *dict, dict_t *xdata) | |||||
2058 | { | |||||
2059 | DHT_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2059, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, dict, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2060 | return 0; | |||||
2061 | } | |||||
2062 | ||||||
2063 | ||||||
2064 | int | |||||
2065 | dht_getxattr (call_frame_t *frame, xlator_t *this, | |||||
2066 | loc_t *loc, const char *key, dict_t *xdata) | |||||
2067 | #define DHT_IS_DIR(layout) (layout->cnt > 1) | |||||
2068 | { | |||||
2069 | ||||||
2070 | xlator_t *subvol = NULL((void*)0); | |||||
2071 | xlator_t *hashed_subvol = NULL((void*)0); | |||||
2072 | xlator_t *cached_subvol = NULL((void*)0); | |||||
2073 | dht_conf_t *conf = NULL((void*)0); | |||||
2074 | dht_local_t *local = NULL((void*)0); | |||||
2075 | dht_layout_t *layout = NULL((void*)0); | |||||
2076 | xlator_t **sub_volumes = NULL((void*)0); | |||||
2077 | int op_errno = -1; | |||||
2078 | int i = 0; | |||||
2079 | int cnt = 0; | |||||
2080 | ||||||
2081 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2081, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2082 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2082, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2083 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2083, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
2084 | VALIDATE_OR_GOTO (loc->inode, err)do { if (!loc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2084, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
2085 | VALIDATE_OR_GOTO (loc->path, err)do { if (!loc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2085, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
2086 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2086, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
2087 | ||||||
2088 | conf = this->private; | |||||
2089 | ||||||
2090 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_GETXATTR); | |||||
2091 | if (!local) { | |||||
2092 | op_errno = ENOMEM12; | |||||
2093 | ||||||
2094 | goto err; | |||||
2095 | } | |||||
2096 | ||||||
2097 | layout = local->layout; | |||||
2098 | if (!layout) { | |||||
2099 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("layout is NULL"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2100, GF_LOG_ERROR , "layout is NULL"); } while (0) | |||||
2100 | "layout is NULL")do { do { if (0) printf ("layout is NULL"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2100, GF_LOG_ERROR , "layout is NULL"); } while (0); | |||||
2101 | op_errno = ENOENT2; | |||||
2102 | goto err; | |||||
2103 | } | |||||
2104 | ||||||
2105 | if (key) { | |||||
2106 | local->key = gf_strdup (key); | |||||
2107 | if (!local->key) { | |||||
2108 | op_errno = ENOMEM12; | |||||
2109 | goto err; | |||||
2110 | } | |||||
2111 | } | |||||
2112 | ||||||
2113 | /* for file use cached subvolume (obviously!): see if {} | |||||
2114 | * below | |||||
2115 | * for directory: | |||||
2116 | * wind to all subvolumes and exclude subvolumes which | |||||
2117 | * return ENOTCONN (in callback) | |||||
2118 | * | |||||
2119 | * NOTE: Don't trust inode here, as that may not be valid | |||||
2120 | * (until inode_link() happens) | |||||
2121 | */ | |||||
2122 | if (key && (strcmp (key, GF_XATTR_PATHINFO_KEY"trusted.glusterfs.pathinfo") == 0) | |||||
2123 | && DHT_IS_DIR(layout)) { | |||||
2124 | (void) strncpy (local->xsel, key, 256); | |||||
2125 | cnt = local->call_cnt = layout->cnt; | |||||
2126 | for (i = 0; i < cnt; i++) { | |||||
2127 | subvol = layout->list[i].xlator; | |||||
2128 | STACK_WIND (frame, dht_vgetxattr_dir_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2130, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->getxattr_cbk) tmp_cbk = dht_vgetxattr_dir_cbk; _new-> root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->getxattr"; _new->unwind_to = "dht_vgetxattr_dir_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = subvol; if (frame->this ->ctx->measure_latency) gf_latency_begin (_new, subvol-> fops->getxattr); subvol->fops->getxattr (_new, subvol , loc, key, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
2129 | subvol, subvol->fops->getxattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2130, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->getxattr_cbk) tmp_cbk = dht_vgetxattr_dir_cbk; _new-> root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->getxattr"; _new->unwind_to = "dht_vgetxattr_dir_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = subvol; if (frame->this ->ctx->measure_latency) gf_latency_begin (_new, subvol-> fops->getxattr); subvol->fops->getxattr (_new, subvol , loc, key, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
2130 | loc, key, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2130, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->getxattr_cbk) tmp_cbk = dht_vgetxattr_dir_cbk; _new-> root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->getxattr"; _new->unwind_to = "dht_vgetxattr_dir_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = subvol; if (frame->this ->ctx->measure_latency) gf_latency_begin (_new, subvol-> fops->getxattr); subvol->fops->getxattr (_new, subvol , loc, key, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
2131 | } | |||||
2132 | return 0; | |||||
2133 | } | |||||
2134 | ||||||
2135 | /* node-uuid or pathinfo for files */ | |||||
2136 | if (key && ((strcmp (key, GF_XATTR_NODE_UUID_KEY"trusted.glusterfs.node-uuid") == 0) | |||||
2137 | || (strcmp (key, GF_XATTR_PATHINFO_KEY"trusted.glusterfs.pathinfo") == 0))) { | |||||
2138 | cached_subvol = local->cached_subvol; | |||||
2139 | (void) strncpy (local->xsel, key, 256); | |||||
2140 | ||||||
2141 | local->call_cnt = 1; | |||||
2142 | STACK_WIND (frame, dht_vgetxattr_cbk, cached_subvol,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2143, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->getxattr_cbk) tmp_cbk = dht_vgetxattr_cbk; _new ->root = frame->root; _new->this = cached_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->getxattr"; _new->unwind_to = "dht_vgetxattr_cbk"; pthread_spin_init (&_new->lock, 0 ); pthread_spin_lock (&frame->root->stack_lock); { _new ->next = frame->root->frames.next; _new->prev = & frame->root->frames; if (frame->root->frames.next ) frame->root->frames.next->prev = _new; frame->root ->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->getxattr); cached_subvol->fops ->getxattr (_new, cached_subvol, loc, key, ((void*)0)); (* __glusterfs_this_location()) = old_THIS; } while (0) | |||||
2143 | cached_subvol->fops->getxattr, loc, key, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2143, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->getxattr_cbk) tmp_cbk = dht_vgetxattr_cbk; _new ->root = frame->root; _new->this = cached_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->getxattr"; _new->unwind_to = "dht_vgetxattr_cbk"; pthread_spin_init (&_new->lock, 0 ); pthread_spin_lock (&frame->root->stack_lock); { _new ->next = frame->root->frames.next; _new->prev = & frame->root->frames; if (frame->root->frames.next ) frame->root->frames.next->prev = _new; frame->root ->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->getxattr); cached_subvol->fops ->getxattr (_new, cached_subvol, loc, key, ((void*)0)); (* __glusterfs_this_location()) = old_THIS; } while (0); | |||||
2144 | ||||||
2145 | return 0; | |||||
2146 | } | |||||
2147 | ||||||
2148 | if (key && (strcmp (key, GF_XATTR_LINKINFO_KEY"trusted.distribute.linkinfo") == 0)) { | |||||
2149 | hashed_subvol = dht_subvol_get_hashed (this, loc); | |||||
2150 | if (!hashed_subvol) { | |||||
2151 | gf_log (this->name, GF_LOG_ERROR, "Failed to get"do { do { if (0) printf ("Failed to get" "hashed subvol for %s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2152, GF_LOG_ERROR, "Failed to get" "hashed subvol for %s" , loc->path); } while (0) | |||||
2152 | "hashed subvol for %s", loc->path)do { do { if (0) printf ("Failed to get" "hashed subvol for %s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2152, GF_LOG_ERROR, "Failed to get" "hashed subvol for %s" , loc->path); } while (0); | |||||
2153 | op_errno = EINVAL22; | |||||
2154 | goto err; | |||||
2155 | } | |||||
2156 | ||||||
2157 | cached_subvol = dht_subvol_get_cached (this, loc->inode); | |||||
2158 | if (!cached_subvol) { | |||||
2159 | gf_log (this->name, GF_LOG_ERROR, "Failed to get"do { do { if (0) printf ("Failed to get" "cached subvol for %s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2160, GF_LOG_ERROR, "Failed to get" "cached subvol for %s" , loc->path); } while (0) | |||||
2160 | "cached subvol for %s", loc->path)do { do { if (0) printf ("Failed to get" "cached subvol for %s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2160, GF_LOG_ERROR, "Failed to get" "cached subvol for %s" , loc->path); } while (0); | |||||
2161 | op_errno = EINVAL22; | |||||
2162 | goto err; | |||||
2163 | } | |||||
2164 | ||||||
2165 | if (hashed_subvol == cached_subvol) { | |||||
2166 | op_errno = ENODATA61; | |||||
2167 | goto err; | |||||
2168 | } | |||||
2169 | if (hashed_subvol) { | |||||
2170 | STACK_WIND (frame, dht_linkinfo_getxattr_cbk, hashed_subvol,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2172, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->getxattr_cbk) tmp_cbk = dht_linkinfo_getxattr_cbk ; _new->root = frame->root; _new->this = hashed_subvol ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "hashed_subvol->fops->getxattr"; _new-> unwind_to = "dht_linkinfo_getxattr_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = hashed_subvol; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, hashed_subvol->fops->getxattr ); hashed_subvol->fops->getxattr (_new, hashed_subvol, loc , "trusted.glusterfs.pathinfo", ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2171 | hashed_subvol->fops->getxattr, loc,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2172, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->getxattr_cbk) tmp_cbk = dht_linkinfo_getxattr_cbk ; _new->root = frame->root; _new->this = hashed_subvol ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "hashed_subvol->fops->getxattr"; _new-> unwind_to = "dht_linkinfo_getxattr_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = hashed_subvol; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, hashed_subvol->fops->getxattr ); hashed_subvol->fops->getxattr (_new, hashed_subvol, loc , "trusted.glusterfs.pathinfo", ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2172 | GF_XATTR_PATHINFO_KEY, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2172, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->getxattr_cbk) tmp_cbk = dht_linkinfo_getxattr_cbk ; _new->root = frame->root; _new->this = hashed_subvol ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "hashed_subvol->fops->getxattr"; _new-> unwind_to = "dht_linkinfo_getxattr_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = hashed_subvol; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, hashed_subvol->fops->getxattr ); hashed_subvol->fops->getxattr (_new, hashed_subvol, loc , "trusted.glusterfs.pathinfo", ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
2173 | return 0; | |||||
2174 | } | |||||
2175 | op_errno = ENODATA61; | |||||
2176 | goto err; | |||||
2177 | } | |||||
2178 | ||||||
2179 | if (key && (!strcmp (GF_XATTR_MARKER_KEY"trusted.glusterfs" "." "volume-mark", key)) | |||||
2180 | && (GF_CLIENT_PID_GSYNCD == frame->root->pid)) { | |||||
2181 | if (DHT_IS_DIR(layout)) { | |||||
2182 | cnt = layout->cnt; | |||||
2183 | } else { | |||||
2184 | cnt = 1; | |||||
2185 | } | |||||
2186 | ||||||
2187 | sub_volumes = alloca ( cnt * sizeof (xlator_t *))__builtin_alloca (cnt * sizeof (xlator_t *)); | |||||
2188 | for (i = 0; i < cnt; i++) | |||||
2189 | *(sub_volumes + i) = layout->list[i].xlator; | |||||
2190 | ||||||
2191 | if (cluster_getmarkerattr (frame, this, loc, key, | |||||
2192 | local, dht_getxattr_unwind, | |||||
2193 | sub_volumes, cnt, | |||||
2194 | MARKER_UUID_TYPE1, conf->vol_uuid)) { | |||||
2195 | op_errno = EINVAL22; | |||||
2196 | goto err; | |||||
2197 | } | |||||
2198 | ||||||
2199 | return 0; | |||||
2200 | } | |||||
2201 | ||||||
2202 | if (key && *conf->vol_uuid) { | |||||
2203 | if ((match_uuid_local (key, conf->vol_uuid) == 0) && | |||||
2204 | (GF_CLIENT_PID_GSYNCD == frame->root->pid)) { | |||||
2205 | if (DHT_IS_DIR(layout)) { | |||||
2206 | cnt = layout->cnt; | |||||
2207 | } else { | |||||
2208 | cnt = 1; | |||||
2209 | } | |||||
2210 | sub_volumes = alloca ( cnt * sizeof (xlator_t *))__builtin_alloca (cnt * sizeof (xlator_t *)); | |||||
2211 | for (i = 0; i < cnt; i++) | |||||
2212 | sub_volumes[i] = layout->list[i].xlator; | |||||
2213 | ||||||
2214 | if (cluster_getmarkerattr (frame, this, loc, key, | |||||
2215 | local, dht_getxattr_unwind, | |||||
2216 | sub_volumes, cnt, | |||||
2217 | MARKER_XTIME_TYPE2, | |||||
2218 | conf->vol_uuid)) { | |||||
2219 | op_errno = EINVAL22; | |||||
2220 | goto err; | |||||
2221 | } | |||||
2222 | ||||||
2223 | return 0; | |||||
2224 | } | |||||
2225 | } | |||||
2226 | ||||||
2227 | if (DHT_IS_DIR(layout)) { | |||||
2228 | cnt = local->call_cnt = layout->cnt; | |||||
2229 | } else { | |||||
2230 | cnt = local->call_cnt = 1; | |||||
2231 | } | |||||
2232 | ||||||
2233 | for (i = 0; i < cnt; i++) { | |||||
2234 | subvol = layout->list[i].xlator; | |||||
2235 | STACK_WIND (frame, dht_getxattr_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2237, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->getxattr_cbk) tmp_cbk = dht_getxattr_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->getxattr" ; _new->unwind_to = "dht_getxattr_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->getxattr); subvol ->fops->getxattr (_new, subvol, loc, key, ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2236 | subvol, subvol->fops->getxattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2237, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->getxattr_cbk) tmp_cbk = dht_getxattr_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->getxattr" ; _new->unwind_to = "dht_getxattr_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->getxattr); subvol ->fops->getxattr (_new, subvol, loc, key, ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2237 | loc, key, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2237, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->getxattr_cbk) tmp_cbk = dht_getxattr_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->getxattr" ; _new->unwind_to = "dht_getxattr_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->getxattr); subvol ->fops->getxattr (_new, subvol, loc, key, ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2238 | } | |||||
2239 | return 0; | |||||
2240 | ||||||
2241 | err: | |||||
2242 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
2243 | DHT_STACK_UNWIND (getxattr, frame, -1, op_errno, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_getxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2243, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_getxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2244 | ||||||
2245 | return 0; | |||||
2246 | } | |||||
2247 | #undef DHT_IS_DIR | |||||
2248 | ||||||
2249 | int | |||||
2250 | dht_fgetxattr (call_frame_t *frame, xlator_t *this, | |||||
2251 | fd_t *fd, const char *key, dict_t *xdata) | |||||
2252 | { | |||||
2253 | xlator_t *subvol = NULL((void*)0); | |||||
2254 | dht_local_t *local = NULL((void*)0); | |||||
2255 | dht_layout_t *layout = NULL((void*)0); | |||||
2256 | int op_errno = -1; | |||||
2257 | int i = 0; | |||||
2258 | int cnt = 0; | |||||
2259 | ||||||
2260 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2260, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2261 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2261, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2262 | VALIDATE_OR_GOTO (fd, err)do { if (!fd) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "fd"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2262, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
2263 | VALIDATE_OR_GOTO (fd->inode, err)do { if (!fd->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "fd->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2263, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
2264 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2264, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
2265 | ||||||
2266 | local = dht_local_init (frame, NULL((void*)0), fd, GF_FOP_FGETXATTR); | |||||
2267 | if (!local) { | |||||
2268 | op_errno = ENOMEM12; | |||||
2269 | ||||||
2270 | goto err; | |||||
2271 | } | |||||
2272 | ||||||
2273 | layout = local->layout; | |||||
2274 | if (!layout) { | |||||
2275 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("layout is NULL"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2276, GF_LOG_ERROR , "layout is NULL"); } while (0) | |||||
2276 | "layout is NULL")do { do { if (0) printf ("layout is NULL"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2276, GF_LOG_ERROR , "layout is NULL"); } while (0); | |||||
2277 | op_errno = ENOENT2; | |||||
2278 | goto err; | |||||
2279 | } | |||||
2280 | ||||||
2281 | if (key) { | |||||
2282 | local->key = gf_strdup (key); | |||||
2283 | if (!local->key) { | |||||
2284 | op_errno = ENOMEM12; | |||||
2285 | goto err; | |||||
2286 | } | |||||
2287 | } | |||||
2288 | ||||||
2289 | if ((fd->inode->ia_type == IA_IFDIR) | |||||
2290 | && (strncmp (key, GF_XATTR_LOCKINFO_KEY"trusted.glusterfs.lockinfo", | |||||
2291 | strlen (GF_XATTR_LOCKINFO_KEY"trusted.glusterfs.lockinfo") != 0))) { | |||||
2292 | cnt = local->call_cnt = layout->cnt; | |||||
2293 | } else { | |||||
2294 | cnt = local->call_cnt = 1; | |||||
2295 | } | |||||
2296 | ||||||
2297 | for (i = 0; i < cnt; i++) { | |||||
2298 | subvol = layout->list[i].xlator; | |||||
2299 | STACK_WIND (frame, dht_getxattr_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2301, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->fgetxattr_cbk) tmp_cbk = dht_getxattr_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->fgetxattr" ; _new->unwind_to = "dht_getxattr_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->fgetxattr); subvol ->fops->fgetxattr (_new, subvol, fd, key, ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2300 | subvol, subvol->fops->fgetxattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2301, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->fgetxattr_cbk) tmp_cbk = dht_getxattr_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->fgetxattr" ; _new->unwind_to = "dht_getxattr_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->fgetxattr); subvol ->fops->fgetxattr (_new, subvol, fd, key, ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2301 | fd, key, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2301, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->fgetxattr_cbk) tmp_cbk = dht_getxattr_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->fgetxattr" ; _new->unwind_to = "dht_getxattr_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->fgetxattr); subvol ->fops->fgetxattr (_new, subvol, fd, key, ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2302 | } | |||||
2303 | return 0; | |||||
2304 | ||||||
2305 | err: | |||||
2306 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
2307 | DHT_STACK_UNWIND (fgetxattr, frame, -1, op_errno, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_fgetxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2307, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fgetxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2308 | ||||||
2309 | return 0; | |||||
2310 | } | |||||
2311 | ||||||
2312 | int | |||||
2313 | dht_fsetxattr (call_frame_t *frame, xlator_t *this, | |||||
2314 | fd_t *fd, dict_t *xattr, int flags, dict_t *xdata) | |||||
2315 | { | |||||
2316 | xlator_t *subvol = NULL((void*)0); | |||||
2317 | dht_local_t *local = NULL((void*)0); | |||||
2318 | int op_errno = EINVAL22; | |||||
2319 | dht_conf_t *conf = NULL((void*)0); | |||||
2320 | ||||||
2321 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2321, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2322 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2322, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2323 | VALIDATE_OR_GOTO (fd, err)do { if (!fd) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "fd"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2323, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
2324 | VALIDATE_OR_GOTO (fd->inode, err)do { if (!fd->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "fd->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2324, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
2325 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2325, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
2326 | ||||||
2327 | conf = this->private; | |||||
2328 | ||||||
2329 | GF_IF_INTERNAL_XATTR_GOTO (conf->wild_xattr_name, xattr,do { if (!xattr) { do { do { if (0) printf ("setxattr dict is null" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2330, GF_LOG_ERROR, "setxattr dict is null"); } while (0); goto err; } if (dict_foreach_fnmatch (xattr, conf->wild_xattr_name , dict_null_foreach_fn, ((void*)0)) > 0) { op_errno = 1; do { do { if (0) printf ("attempt to set internal" " xattr: %s: %s" , conf->wild_xattr_name, strerror (op_errno)); } while (0) ; _gf_log (this->name, "dht-common.c", __FUNCTION__, 2330, GF_LOG_ERROR, "attempt to set internal" " xattr: %s: %s", conf ->wild_xattr_name, strerror (op_errno)); } while (0); goto err; } } while (0) | |||||
2330 | op_errno, err)do { if (!xattr) { do { do { if (0) printf ("setxattr dict is null" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2330, GF_LOG_ERROR, "setxattr dict is null"); } while (0); goto err; } if (dict_foreach_fnmatch (xattr, conf->wild_xattr_name , dict_null_foreach_fn, ((void*)0)) > 0) { op_errno = 1; do { do { if (0) printf ("attempt to set internal" " xattr: %s: %s" , conf->wild_xattr_name, strerror (op_errno)); } while (0) ; _gf_log (this->name, "dht-common.c", __FUNCTION__, 2330, GF_LOG_ERROR, "attempt to set internal" " xattr: %s: %s", conf ->wild_xattr_name, strerror (op_errno)); } while (0); goto err; } } while (0); | |||||
2331 | ||||||
2332 | local = dht_local_init (frame, NULL((void*)0), fd, GF_FOP_FSETXATTR); | |||||
2333 | if (!local) { | |||||
2334 | op_errno = ENOMEM12; | |||||
2335 | goto err; | |||||
2336 | } | |||||
2337 | ||||||
2338 | subvol = local->cached_subvol; | |||||
2339 | if (!subvol) { | |||||
2340 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for fd=%p", fd) ; } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2341, GF_LOG_DEBUG, "no cached subvolume for fd=%p", fd); } while (0) | |||||
2341 | "no cached subvolume for fd=%p", fd)do { do { if (0) printf ("no cached subvolume for fd=%p", fd) ; } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2341, GF_LOG_DEBUG, "no cached subvolume for fd=%p", fd); } while (0); | |||||
2342 | op_errno = EINVAL22; | |||||
2343 | goto err; | |||||
2344 | } | |||||
2345 | ||||||
2346 | local->call_cnt = 1; | |||||
2347 | ||||||
2348 | STACK_WIND (frame, dht_err_cbk, subvol, subvol->fops->fsetxattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2349, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->fsetxattr_cbk) tmp_cbk = dht_err_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->fsetxattr" ; _new->unwind_to = "dht_err_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->fsetxattr); subvol ->fops->fsetxattr (_new, subvol, fd, xattr, flags, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2349 | fd, xattr, flags, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2349, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->fsetxattr_cbk) tmp_cbk = dht_err_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->fsetxattr" ; _new->unwind_to = "dht_err_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->fsetxattr); subvol ->fops->fsetxattr (_new, subvol, fd, xattr, flags, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2350 | ||||||
2351 | return 0; | |||||
2352 | ||||||
2353 | err: | |||||
2354 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
2355 | DHT_STACK_UNWIND (fsetxattr, frame, -1, op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_fsetxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2355, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsetxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2356 | ||||||
2357 | return 0; | |||||
2358 | } | |||||
2359 | ||||||
2360 | ||||||
2361 | static int | |||||
2362 | dht_common_setxattr_cbk (call_frame_t *frame, void *cookie, | |||||
2363 | xlator_t *this, int32_t op_ret, int32_t op_errno, | |||||
2364 | dict_t *xdata) | |||||
2365 | { | |||||
2366 | DHT_STACK_UNWIND (setxattr, frame, op_ret, op_errno, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_setxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2366, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2367 | ||||||
2368 | return 0; | |||||
2369 | } | |||||
2370 | ||||||
2371 | int | |||||
2372 | dht_checking_pathinfo_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2373 | int op_ret, int op_errno, dict_t *xattr, | |||||
2374 | dict_t *xdata) | |||||
2375 | { | |||||
2376 | int i = -1; | |||||
2377 | int ret = -1; | |||||
2378 | char *value = NULL((void*)0); | |||||
2379 | dht_local_t *local = NULL((void*)0); | |||||
2380 | dht_conf_t *conf = NULL((void*)0); | |||||
2381 | call_frame_t *prev = NULL((void*)0); | |||||
2382 | int this_call_cnt = 0; | |||||
2383 | ||||||
2384 | local = frame->local; | |||||
2385 | prev = cookie; | |||||
2386 | conf = this->private; | |||||
2387 | ||||||
2388 | if (op_ret == -1) | |||||
2389 | goto out; | |||||
2390 | ||||||
2391 | ||||||
2392 | ret = dict_get_str (xattr, GF_XATTR_PATHINFO_KEY"trusted.glusterfs.pathinfo", &value); | |||||
2393 | if (ret) | |||||
2394 | goto out; | |||||
2395 | ||||||
2396 | if (!strcmp (value, local->key)) { | |||||
2397 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
2398 | if (conf->subvolumes[i] == prev->this) | |||||
2399 | conf->decommissioned_bricks[i] = prev->this; | |||||
2400 | } | |||||
2401 | } | |||||
2402 | ||||||
2403 | out: | |||||
2404 | this_call_cnt = dht_frame_return (frame); | |||||
2405 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
2406 | DHT_STACK_UNWIND (setxattr, frame, local->op_ret, ENOTSUP, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_setxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2406, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, 95, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2407 | } | |||||
2408 | return 0; | |||||
2409 | ||||||
2410 | } | |||||
2411 | ||||||
2412 | int | |||||
2413 | dht_setxattr (call_frame_t *frame, xlator_t *this, | |||||
2414 | loc_t *loc, dict_t *xattr, int flags, dict_t *xdata) | |||||
2415 | { | |||||
2416 | xlator_t *subvol = NULL((void*)0); | |||||
2417 | dht_local_t *local = NULL((void*)0); | |||||
2418 | dht_conf_t *conf = NULL((void*)0); | |||||
2419 | dht_layout_t *layout = NULL((void*)0); | |||||
2420 | int i = 0; | |||||
2421 | int op_errno = EINVAL22; | |||||
2422 | int ret = -1; | |||||
2423 | data_t *tmp = NULL((void*)0); | |||||
2424 | uint32_t dir_spread = 0; | |||||
2425 | char value[4096] = {0,}; | |||||
2426 | gf_dht_migrate_data_type_t forced_rebalance = GF_DHT_MIGRATE_DATA; | |||||
2427 | int call_cnt = 0; | |||||
2428 | ||||||
2429 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2429, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2430 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2430, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2431 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2431, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
2432 | VALIDATE_OR_GOTO (loc->inode, err)do { if (!loc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2432, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
2433 | VALIDATE_OR_GOTO (loc->path, err)do { if (!loc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2433, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
2434 | ||||||
2435 | conf = this->private; | |||||
2436 | ||||||
2437 | GF_IF_INTERNAL_XATTR_GOTO (conf->wild_xattr_name, xattr,do { if (!xattr) { do { do { if (0) printf ("setxattr dict is null" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2438, GF_LOG_ERROR, "setxattr dict is null"); } while (0); goto err; } if (dict_foreach_fnmatch (xattr, conf->wild_xattr_name , dict_null_foreach_fn, ((void*)0)) > 0) { op_errno = 1; do { do { if (0) printf ("attempt to set internal" " xattr: %s: %s" , conf->wild_xattr_name, strerror (op_errno)); } while (0) ; _gf_log (this->name, "dht-common.c", __FUNCTION__, 2438, GF_LOG_ERROR, "attempt to set internal" " xattr: %s: %s", conf ->wild_xattr_name, strerror (op_errno)); } while (0); goto err; } } while (0) | |||||
2438 | op_errno, err)do { if (!xattr) { do { do { if (0) printf ("setxattr dict is null" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2438, GF_LOG_ERROR, "setxattr dict is null"); } while (0); goto err; } if (dict_foreach_fnmatch (xattr, conf->wild_xattr_name , dict_null_foreach_fn, ((void*)0)) > 0) { op_errno = 1; do { do { if (0) printf ("attempt to set internal" " xattr: %s: %s" , conf->wild_xattr_name, strerror (op_errno)); } while (0) ; _gf_log (this->name, "dht-common.c", __FUNCTION__, 2438, GF_LOG_ERROR, "attempt to set internal" " xattr: %s: %s", conf ->wild_xattr_name, strerror (op_errno)); } while (0); goto err; } } while (0); | |||||
2439 | ||||||
2440 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_SETXATTR); | |||||
2441 | if (!local) { | |||||
2442 | op_errno = ENOMEM12; | |||||
2443 | goto err; | |||||
2444 | } | |||||
2445 | ||||||
2446 | subvol = local->cached_subvol; | |||||
2447 | if (!subvol) { | |||||
2448 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2449, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0) | |||||
2449 | "no cached subvolume for path=%s", loc->path)do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2449, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0); | |||||
2450 | op_errno = EINVAL22; | |||||
2451 | goto err; | |||||
2452 | } | |||||
2453 | ||||||
2454 | layout = local->layout; | |||||
2455 | if (!layout) { | |||||
2456 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no layout for path=%s", loc->path ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2457, GF_LOG_DEBUG, "no layout for path=%s", loc->path); } while (0) | |||||
2457 | "no layout for path=%s", loc->path)do { do { if (0) printf ("no layout for path=%s", loc->path ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2457, GF_LOG_DEBUG, "no layout for path=%s", loc->path); } while (0); | |||||
2458 | op_errno = EINVAL22; | |||||
2459 | goto err; | |||||
2460 | } | |||||
2461 | ||||||
2462 | local->call_cnt = call_cnt = layout->cnt; | |||||
2463 | ||||||
2464 | /* This key is sent by Unified File and Object storage | |||||
2465 | * to test xattr support in backend. | |||||
2466 | */ | |||||
2467 | tmp = dict_get (xattr, "user.ufo-test"); | |||||
2468 | if (tmp) { | |||||
2469 | if (IA_ISREG (loc->inode->ia_type)(loc->inode->ia_type == IA_IFREG)) { | |||||
2470 | op_errno = ENOTSUP95; | |||||
2471 | goto err; | |||||
2472 | } | |||||
2473 | local->op_ret = 0; | |||||
2474 | for (i = 0; i < call_cnt; i++) { | |||||
2475 | STACK_WIND (frame, dht_ufo_xattr_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2478, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->setxattr_cbk) tmp_cbk = dht_ufo_xattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->setxattr" ; _new->unwind_to = "dht_ufo_xattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->setxattr); layout->list[i].xlator->fops-> setxattr (_new, layout->list[i].xlator, loc, xattr, flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2476 | layout->list[i].xlator,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2478, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->setxattr_cbk) tmp_cbk = dht_ufo_xattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->setxattr" ; _new->unwind_to = "dht_ufo_xattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->setxattr); layout->list[i].xlator->fops-> setxattr (_new, layout->list[i].xlator, loc, xattr, flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2477 | layout->list[i].xlator->fops->setxattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2478, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->setxattr_cbk) tmp_cbk = dht_ufo_xattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->setxattr" ; _new->unwind_to = "dht_ufo_xattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->setxattr); layout->list[i].xlator->fops-> setxattr (_new, layout->list[i].xlator, loc, xattr, flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2478 | loc, xattr, flags, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2478, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->setxattr_cbk) tmp_cbk = dht_ufo_xattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->setxattr" ; _new->unwind_to = "dht_ufo_xattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->setxattr); layout->list[i].xlator->fops-> setxattr (_new, layout->list[i].xlator, loc, xattr, flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2479 | } | |||||
2480 | return 0; | |||||
2481 | } | |||||
2482 | ||||||
2483 | tmp = dict_get (xattr, "distribute.migrate-data"); | |||||
2484 | if (tmp) { | |||||
2485 | if (IA_ISDIR (loc->inode->ia_type)(loc->inode->ia_type == IA_IFDIR)) { | |||||
2486 | op_errno = ENOTSUP95; | |||||
2487 | goto err; | |||||
2488 | } | |||||
2489 | ||||||
2490 | /* TODO: need to interpret the 'value' for more meaning | |||||
2491 | (ie, 'target' subvolume given there, etc) */ | |||||
2492 | memcpy (value, tmp->data, tmp->len); | |||||
2493 | if (strcmp (value, "force") == 0) | |||||
2494 | forced_rebalance = | |||||
2495 | GF_DHT_MIGRATE_DATA_EVEN_IF_LINK_EXISTS; | |||||
2496 | ||||||
2497 | if (conf->decommission_in_progress) | |||||
2498 | forced_rebalance = GF_DHT_MIGRATE_HARDLINK; | |||||
2499 | ||||||
2500 | local->rebalance.target_node = dht_subvol_get_hashed (this, loc); | |||||
2501 | if (!local->rebalance.target_node) { | |||||
2502 | gf_log (this->name, GF_LOG_ERROR, "Failed to get "do { do { if (0) printf ("Failed to get " "hashed subvol for %s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2503, GF_LOG_ERROR, "Failed to get " "hashed subvol for %s" , loc->path); } while (0) | |||||
2503 | "hashed subvol for %s", loc->path)do { do { if (0) printf ("Failed to get " "hashed subvol for %s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2503, GF_LOG_ERROR, "Failed to get " "hashed subvol for %s" , loc->path); } while (0); | |||||
2504 | op_errno = EINVAL22; | |||||
2505 | goto err; | |||||
2506 | } | |||||
2507 | ||||||
2508 | local->rebalance.from_subvol = local->cached_subvol; | |||||
2509 | ||||||
2510 | if (local->rebalance.target_node == local->rebalance.from_subvol) { | |||||
2511 | op_errno = EEXIST17; | |||||
2512 | goto err; | |||||
2513 | } | |||||
2514 | if (local->rebalance.target_node) { | |||||
2515 | local->flags = forced_rebalance; | |||||
2516 | ||||||
2517 | ret = dht_start_rebalance_task (this, frame); | |||||
2518 | if (!ret) | |||||
2519 | return 0; | |||||
2520 | ||||||
2521 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("%s: failed to create a new synctask" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2523, GF_LOG_ERROR, "%s: failed to create a new synctask" , loc->path); } while (0) | |||||
2522 | "%s: failed to create a new synctask",do { do { if (0) printf ("%s: failed to create a new synctask" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2523, GF_LOG_ERROR, "%s: failed to create a new synctask" , loc->path); } while (0) | |||||
2523 | loc->path)do { do { if (0) printf ("%s: failed to create a new synctask" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2523, GF_LOG_ERROR, "%s: failed to create a new synctask" , loc->path); } while (0); | |||||
2524 | } | |||||
2525 | op_errno = EINVAL22; | |||||
2526 | goto err; | |||||
2527 | ||||||
2528 | } | |||||
2529 | ||||||
2530 | tmp = dict_get (xattr, "decommission-brick"); | |||||
2531 | if (tmp) { | |||||
2532 | /* This operation should happen only on '/' */ | |||||
2533 | if (!__is_root_gfid (loc->inode->gfid)) { | |||||
2534 | op_errno = ENOTSUP95; | |||||
2535 | goto err; | |||||
2536 | } | |||||
2537 | ||||||
2538 | memcpy (value, tmp->data, ((tmp->len < 4095) ? tmp->len : 4095)); | |||||
2539 | local->key = gf_strdup (value); | |||||
2540 | local->call_cnt = conf->subvolume_cnt; | |||||
2541 | ||||||
2542 | for (i = 0 ; i < conf->subvolume_cnt; i++) { | |||||
2543 | /* Get the pathinfo, and then compare */ | |||||
2544 | STACK_WIND (frame, dht_checking_pathinfo_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2547, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->getxattr_cbk) tmp_cbk = dht_checking_pathinfo_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->getxattr" ; _new->unwind_to = "dht_checking_pathinfo_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->getxattr); conf->subvolumes[i]->fops-> getxattr (_new, conf->subvolumes[i], loc, "trusted.glusterfs.pathinfo" , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2545 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2547, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->getxattr_cbk) tmp_cbk = dht_checking_pathinfo_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->getxattr" ; _new->unwind_to = "dht_checking_pathinfo_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->getxattr); conf->subvolumes[i]->fops-> getxattr (_new, conf->subvolumes[i], loc, "trusted.glusterfs.pathinfo" , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2546 | conf->subvolumes[i]->fops->getxattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2547, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->getxattr_cbk) tmp_cbk = dht_checking_pathinfo_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->getxattr" ; _new->unwind_to = "dht_checking_pathinfo_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->getxattr); conf->subvolumes[i]->fops-> getxattr (_new, conf->subvolumes[i], loc, "trusted.glusterfs.pathinfo" , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2547 | loc, GF_XATTR_PATHINFO_KEY, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2547, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->getxattr_cbk) tmp_cbk = dht_checking_pathinfo_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->getxattr" ; _new->unwind_to = "dht_checking_pathinfo_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->getxattr); conf->subvolumes[i]->fops-> getxattr (_new, conf->subvolumes[i], loc, "trusted.glusterfs.pathinfo" , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2548 | } | |||||
2549 | return 0; | |||||
2550 | } | |||||
2551 | ||||||
2552 | tmp = dict_get (xattr, GF_XATTR_FIX_LAYOUT_KEY"distribute.fix.layout"); | |||||
2553 | if (tmp) { | |||||
2554 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("fixing the layout of %s", loc->path ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2555, GF_LOG_INFO, "fixing the layout of %s", loc->path) ; } while (0) | |||||
2555 | "fixing the layout of %s", loc->path)do { do { if (0) printf ("fixing the layout of %s", loc->path ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2555, GF_LOG_INFO, "fixing the layout of %s", loc->path) ; } while (0); | |||||
2556 | ||||||
2557 | ret = dht_fix_directory_layout (frame, dht_common_setxattr_cbk, | |||||
2558 | layout); | |||||
2559 | if (ret) { | |||||
2560 | op_errno = ENOTCONN107; | |||||
2561 | goto err; | |||||
2562 | } | |||||
2563 | return ret; | |||||
2564 | } | |||||
2565 | ||||||
2566 | tmp = dict_get (xattr, "distribute.directory-spread-count"); | |||||
2567 | if (tmp) { | |||||
2568 | /* Setxattr value is packed as 'binary', not string */ | |||||
2569 | memcpy (value, tmp->data, ((tmp->len < 4095)?tmp->len:4095)); | |||||
2570 | ret = gf_string2uint32 (value, &dir_spread); | |||||
2571 | if (!ret && ((dir_spread <= conf->subvolume_cnt) && | |||||
2572 | (dir_spread > 0))) { | |||||
2573 | layout->spread_cnt = dir_spread; | |||||
2574 | ||||||
2575 | ret = dht_fix_directory_layout (frame, | |||||
2576 | dht_common_setxattr_cbk, | |||||
2577 | layout); | |||||
2578 | if (ret) { | |||||
2579 | op_errno = ENOTCONN107; | |||||
2580 | goto err; | |||||
2581 | } | |||||
2582 | return ret; | |||||
2583 | } | |||||
2584 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("wrong 'directory-spread-count' value (%s)" , value); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2585, GF_LOG_ERROR, "wrong 'directory-spread-count' value (%s)" , value); } while (0) | |||||
2585 | "wrong 'directory-spread-count' value (%s)", value)do { do { if (0) printf ("wrong 'directory-spread-count' value (%s)" , value); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2585, GF_LOG_ERROR, "wrong 'directory-spread-count' value (%s)" , value); } while (0); | |||||
2586 | op_errno = ENOTSUP95; | |||||
2587 | goto err; | |||||
2588 | } | |||||
2589 | ||||||
2590 | for (i = 0; i < call_cnt; i++) { | |||||
2591 | STACK_WIND (frame, dht_err_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2594, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->setxattr_cbk) tmp_cbk = dht_err_cbk; _new ->root = frame->root; _new->this = layout->list[i ].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->setxattr" ; _new->unwind_to = "dht_err_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->setxattr); layout->list[i].xlator->fops-> setxattr (_new, layout->list[i].xlator, loc, xattr, flags, xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0) | |||||
2592 | layout->list[i].xlator,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2594, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->setxattr_cbk) tmp_cbk = dht_err_cbk; _new ->root = frame->root; _new->this = layout->list[i ].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->setxattr" ; _new->unwind_to = "dht_err_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->setxattr); layout->list[i].xlator->fops-> setxattr (_new, layout->list[i].xlator, loc, xattr, flags, xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0) | |||||
2593 | layout->list[i].xlator->fops->setxattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2594, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->setxattr_cbk) tmp_cbk = dht_err_cbk; _new ->root = frame->root; _new->this = layout->list[i ].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->setxattr" ; _new->unwind_to = "dht_err_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->setxattr); layout->list[i].xlator->fops-> setxattr (_new, layout->list[i].xlator, loc, xattr, flags, xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0) | |||||
2594 | loc, xattr, flags, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2594, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->setxattr_cbk) tmp_cbk = dht_err_cbk; _new ->root = frame->root; _new->this = layout->list[i ].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->setxattr" ; _new->unwind_to = "dht_err_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->setxattr); layout->list[i].xlator->fops-> setxattr (_new, layout->list[i].xlator, loc, xattr, flags, xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0); | |||||
2595 | } | |||||
2596 | ||||||
2597 | return 0; | |||||
2598 | ||||||
2599 | err: | |||||
2600 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
2601 | DHT_STACK_UNWIND (setxattr, frame, -1, op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_setxattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2601, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setxattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2602 | ||||||
2603 | return 0; | |||||
2604 | } | |||||
2605 | ||||||
2606 | ||||||
2607 | int | |||||
2608 | dht_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2609 | int op_ret, int op_errno, dict_t *xdata) | |||||
2610 | { | |||||
2611 | dht_local_t *local = NULL((void*)0); | |||||
2612 | int this_call_cnt = 0; | |||||
2613 | call_frame_t *prev = NULL((void*)0); | |||||
2614 | ||||||
2615 | local = frame->local; | |||||
2616 | prev = cookie; | |||||
2617 | ||||||
2618 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2619 | { | |||||
2620 | if (op_ret == -1) { | |||||
2621 | local->op_errno = op_errno; | |||||
2622 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2624, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
2623 | "subvolume %s returned -1 (%s)",do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2624, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
2624 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2624, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0); | |||||
2625 | goto unlock; | |||||
2626 | } | |||||
2627 | ||||||
2628 | local->op_ret = 0; | |||||
2629 | } | |||||
2630 | unlock: | |||||
2631 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2632 | ||||||
2633 | this_call_cnt = dht_frame_return (frame); | |||||
2634 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
2635 | DHT_STACK_UNWIND (removexattr, frame, local->op_ret,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_removexattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2636, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_removexattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
2636 | local->op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_removexattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2636, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_removexattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2637 | } | |||||
2638 | ||||||
2639 | return 0; | |||||
2640 | } | |||||
2641 | ||||||
2642 | ||||||
2643 | int | |||||
2644 | dht_removexattr (call_frame_t *frame, xlator_t *this, | |||||
2645 | loc_t *loc, const char *key, dict_t *xdata) | |||||
2646 | { | |||||
2647 | xlator_t *subvol = NULL((void*)0); | |||||
2648 | int op_errno = -1; | |||||
2649 | dht_local_t *local = NULL((void*)0); | |||||
2650 | dht_layout_t *layout = NULL((void*)0); | |||||
2651 | int call_cnt = 0; | |||||
2652 | dht_conf_t *conf = NULL((void*)0); | |||||
2653 | ||||||
2654 | int i; | |||||
2655 | ||||||
2656 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2656, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2657 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2657, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
2658 | ||||||
2659 | conf = this->private; | |||||
2660 | ||||||
2661 | GF_IF_NATIVE_XATTR_GOTO (conf->wild_xattr_name, key, op_errno, err)do { if (!key) { do { do { if (0) printf ("no key for removexattr" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2661, GF_LOG_ERROR, "no key for removexattr"); } while (0); goto err; } if (!fnmatch (conf->wild_xattr_name, key, 0)) { op_errno = 1; do { do { if (0) printf ("attempt to remove internal " "xattr: %s: %s", key, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2661, GF_LOG_ERROR , "attempt to remove internal " "xattr: %s: %s", key, strerror (op_errno)); } while (0); goto err; } } while (0); | |||||
2662 | ||||||
2663 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2663, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2664 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2664, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
2665 | VALIDATE_OR_GOTO (loc->inode, err)do { if (!loc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2665, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
2666 | VALIDATE_OR_GOTO (loc->path, err)do { if (!loc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2666, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
2667 | ||||||
2668 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_REMOVEXATTR); | |||||
2669 | if (!local) { | |||||
2670 | op_errno = ENOMEM12; | |||||
2671 | goto err; | |||||
2672 | } | |||||
2673 | ||||||
2674 | subvol = local->cached_subvol; | |||||
2675 | if (!subvol) { | |||||
2676 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2677, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0) | |||||
2677 | "no cached subvolume for path=%s", loc->path)do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2677, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0); | |||||
2678 | op_errno = EINVAL22; | |||||
2679 | goto err; | |||||
2680 | } | |||||
2681 | ||||||
2682 | layout = local->layout; | |||||
2683 | if (!local->layout) { | |||||
2684 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no layout for path=%s", loc->path ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2685, GF_LOG_DEBUG, "no layout for path=%s", loc->path); } while (0) | |||||
2685 | "no layout for path=%s", loc->path)do { do { if (0) printf ("no layout for path=%s", loc->path ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2685, GF_LOG_DEBUG, "no layout for path=%s", loc->path); } while (0); | |||||
2686 | op_errno = EINVAL22; | |||||
2687 | goto err; | |||||
2688 | } | |||||
2689 | ||||||
2690 | local->call_cnt = call_cnt = layout->cnt; | |||||
2691 | local->key = gf_strdup (key); | |||||
2692 | ||||||
2693 | for (i = 0; i < call_cnt; i++) { | |||||
2694 | STACK_WIND (frame, dht_removexattr_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2697, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->removexattr_cbk) tmp_cbk = dht_removexattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->removexattr" ; _new->unwind_to = "dht_removexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->removexattr); layout->list[i].xlator->fops ->removexattr (_new, layout->list[i].xlator, loc, key, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2695 | layout->list[i].xlator,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2697, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->removexattr_cbk) tmp_cbk = dht_removexattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->removexattr" ; _new->unwind_to = "dht_removexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->removexattr); layout->list[i].xlator->fops ->removexattr (_new, layout->list[i].xlator, loc, key, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2696 | layout->list[i].xlator->fops->removexattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2697, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->removexattr_cbk) tmp_cbk = dht_removexattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->removexattr" ; _new->unwind_to = "dht_removexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->removexattr); layout->list[i].xlator->fops ->removexattr (_new, layout->list[i].xlator, loc, key, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2697 | loc, key, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2697, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->removexattr_cbk) tmp_cbk = dht_removexattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->removexattr" ; _new->unwind_to = "dht_removexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->removexattr); layout->list[i].xlator->fops ->removexattr (_new, layout->list[i].xlator, loc, key, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2698 | } | |||||
2699 | ||||||
2700 | return 0; | |||||
2701 | ||||||
2702 | err: | |||||
2703 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
2704 | DHT_STACK_UNWIND (removexattr, frame, -1, op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_removexattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2704, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_removexattr_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2705 | ||||||
2706 | return 0; | |||||
2707 | } | |||||
2708 | ||||||
2709 | int | |||||
2710 | dht_fremovexattr (call_frame_t *frame, xlator_t *this, | |||||
2711 | fd_t *fd, const char *key, dict_t *xdata) | |||||
2712 | { | |||||
2713 | xlator_t *subvol = NULL((void*)0); | |||||
2714 | int op_errno = -1; | |||||
2715 | dht_local_t *local = NULL((void*)0); | |||||
2716 | dht_layout_t *layout = NULL((void*)0); | |||||
2717 | int call_cnt = 0; | |||||
2718 | dht_conf_t *conf = 0; | |||||
2719 | ||||||
2720 | int i; | |||||
2721 | ||||||
2722 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2722, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2723 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2723, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
2724 | ||||||
2725 | conf = this->private; | |||||
2726 | ||||||
2727 | GF_IF_NATIVE_XATTR_GOTO (conf->wild_xattr_name, key, op_errno, err)do { if (!key) { do { do { if (0) printf ("no key for removexattr" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 2727, GF_LOG_ERROR, "no key for removexattr"); } while (0); goto err; } if (!fnmatch (conf->wild_xattr_name, key, 0)) { op_errno = 1; do { do { if (0) printf ("attempt to remove internal " "xattr: %s: %s", key, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2727, GF_LOG_ERROR , "attempt to remove internal " "xattr: %s: %s", key, strerror (op_errno)); } while (0); goto err; } } while (0); | |||||
2728 | ||||||
2729 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2729, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2730 | ||||||
2731 | local = dht_local_init (frame, NULL((void*)0), fd, GF_FOP_FREMOVEXATTR); | |||||
2732 | if (!local) { | |||||
2733 | op_errno = ENOMEM12; | |||||
2734 | goto err; | |||||
2735 | } | |||||
2736 | ||||||
2737 | subvol = local->cached_subvol; | |||||
2738 | if (!subvol) { | |||||
2739 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for inode=%s", uuid_utoa (fd->inode->gfid)); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 2741, GF_LOG_DEBUG, "no cached subvolume for inode=%s" , uuid_utoa (fd->inode->gfid)); } while (0) | |||||
2740 | "no cached subvolume for inode=%s",do { do { if (0) printf ("no cached subvolume for inode=%s", uuid_utoa (fd->inode->gfid)); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 2741, GF_LOG_DEBUG, "no cached subvolume for inode=%s" , uuid_utoa (fd->inode->gfid)); } while (0) | |||||
2741 | uuid_utoa (fd->inode->gfid))do { do { if (0) printf ("no cached subvolume for inode=%s", uuid_utoa (fd->inode->gfid)); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 2741, GF_LOG_DEBUG, "no cached subvolume for inode=%s" , uuid_utoa (fd->inode->gfid)); } while (0); | |||||
2742 | op_errno = EINVAL22; | |||||
2743 | goto err; | |||||
2744 | } | |||||
2745 | ||||||
2746 | layout = local->layout; | |||||
2747 | if (!local->layout) { | |||||
2748 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no layout for inode=%s", uuid_utoa ( fd->inode->gfid)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2749, GF_LOG_DEBUG, "no layout for inode=%s" , uuid_utoa (fd->inode->gfid)); } while (0) | |||||
2749 | "no layout for inode=%s", uuid_utoa (fd->inode->gfid))do { do { if (0) printf ("no layout for inode=%s", uuid_utoa ( fd->inode->gfid)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2749, GF_LOG_DEBUG, "no layout for inode=%s" , uuid_utoa (fd->inode->gfid)); } while (0); | |||||
2750 | op_errno = EINVAL22; | |||||
2751 | goto err; | |||||
2752 | } | |||||
2753 | ||||||
2754 | local->call_cnt = call_cnt = layout->cnt; | |||||
2755 | local->key = gf_strdup (key); | |||||
2756 | ||||||
2757 | for (i = 0; i < call_cnt; i++) { | |||||
2758 | STACK_WIND (frame, dht_removexattr_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2761, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->fremovexattr_cbk) tmp_cbk = dht_removexattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->fremovexattr" ; _new->unwind_to = "dht_removexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->fremovexattr); layout->list[i].xlator->fops ->fremovexattr (_new, layout->list[i].xlator, fd, key, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2759 | layout->list[i].xlator,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2761, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->fremovexattr_cbk) tmp_cbk = dht_removexattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->fremovexattr" ; _new->unwind_to = "dht_removexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->fremovexattr); layout->list[i].xlator->fops ->fremovexattr (_new, layout->list[i].xlator, fd, key, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2760 | layout->list[i].xlator->fops->fremovexattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2761, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->fremovexattr_cbk) tmp_cbk = dht_removexattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->fremovexattr" ; _new->unwind_to = "dht_removexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->fremovexattr); layout->list[i].xlator->fops ->fremovexattr (_new, layout->list[i].xlator, fd, key, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2761 | fd, key, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2761, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( layout->list [i].xlator->fops->fremovexattr_cbk) tmp_cbk = dht_removexattr_cbk ; _new->root = frame->root; _new->this = layout-> list[i].xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "layout->list[i].xlator->fops->fremovexattr" ; _new->unwind_to = "dht_removexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = layout->list[i].xlator; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, layout->list[i].xlator ->fops->fremovexattr); layout->list[i].xlator->fops ->fremovexattr (_new, layout->list[i].xlator, fd, key, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2762 | } | |||||
2763 | ||||||
2764 | return 0; | |||||
2765 | ||||||
2766 | err: | |||||
2767 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
2768 | DHT_STACK_UNWIND (fremovexattr, frame, -1, op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_fremovexattr_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2768, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fremovexattr_cbk_t )frame->ret; _parent = frame-> parent; pthread_spin_lock (&frame->root->stack_lock ); { _parent->ref_count--; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = _parent->this; frame ->complete = _gf_true; frame->unwind_from = __FUNCTION__ ; if (frame->this->ctx->measure_latency) gf_latency_end (frame); fn (_parent, frame->cookie, _parent->this, -1 , op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2769 | ||||||
2770 | return 0; | |||||
2771 | } | |||||
2772 | ||||||
2773 | ||||||
2774 | int | |||||
2775 | dht_fd_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2776 | int op_ret, int op_errno, fd_t *fd, dict_t *xdata) | |||||
2777 | { | |||||
2778 | dht_local_t *local = NULL((void*)0); | |||||
2779 | int this_call_cnt = 0; | |||||
2780 | call_frame_t *prev = NULL((void*)0); | |||||
2781 | ||||||
2782 | local = frame->local; | |||||
2783 | prev = cookie; | |||||
2784 | ||||||
2785 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2786 | { | |||||
2787 | if (op_ret == -1) { | |||||
2788 | local->op_errno = op_errno; | |||||
2789 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2791, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
2790 | "subvolume %s returned -1 (%s)",do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2791, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0) | |||||
2791 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("subvolume %s returned -1 (%s)", prev ->this->name, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 2791, GF_LOG_DEBUG , "subvolume %s returned -1 (%s)", prev->this->name, strerror (op_errno)); } while (0); | |||||
2792 | goto unlock; | |||||
2793 | } | |||||
2794 | ||||||
2795 | local->op_ret = 0; | |||||
2796 | } | |||||
2797 | unlock: | |||||
2798 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2799 | ||||||
2800 | this_call_cnt = dht_frame_return (frame); | |||||
2801 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) | |||||
2802 | DHT_STACK_UNWIND (open, frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_open_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2803, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_open_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->fd , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
2803 | local->fd, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_open_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2803, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_open_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, local->fd , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2804 | ||||||
2805 | return 0; | |||||
2806 | } | |||||
2807 | ||||||
2808 | /* | |||||
2809 | * dht_normalize_stats - | |||||
2810 | */ | |||||
2811 | static void | |||||
2812 | dht_normalize_stats (struct statvfs *buf, unsigned long bsize, | |||||
2813 | unsigned long frsize) | |||||
2814 | { | |||||
2815 | double factor = 0; | |||||
2816 | ||||||
2817 | if (buf->f_bsize != bsize) { | |||||
2818 | buf->f_bsize = bsize; | |||||
2819 | } | |||||
2820 | ||||||
2821 | if (buf->f_frsize != frsize) { | |||||
2822 | factor = ((double) buf->f_frsize) / frsize; | |||||
2823 | buf->f_frsize = frsize; | |||||
2824 | buf->f_blocks = (fsblkcnt_t) (factor * buf->f_blocks); | |||||
2825 | buf->f_bfree = (fsblkcnt_t) (factor * buf->f_bfree); | |||||
2826 | buf->f_bavail = (fsblkcnt_t) (factor * buf->f_bavail); | |||||
2827 | ||||||
2828 | } | |||||
2829 | } | |||||
2830 | ||||||
2831 | int | |||||
2832 | dht_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2833 | int op_ret, int op_errno, struct statvfs *statvfs, dict_t *xdata) | |||||
2834 | { | |||||
2835 | dht_local_t *local = NULL((void*)0); | |||||
2836 | int this_call_cnt = 0; | |||||
2837 | int bsize = 0; | |||||
2838 | int frsize = 0; | |||||
2839 | ||||||
2840 | ||||||
2841 | local = frame->local; | |||||
2842 | ||||||
2843 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2844 | { | |||||
2845 | if (op_ret == -1) { | |||||
2846 | local->op_errno = op_errno; | |||||
2847 | goto unlock; | |||||
2848 | } | |||||
2849 | local->op_ret = 0; | |||||
2850 | ||||||
2851 | if (local->statvfs.f_bsize != 0) { | |||||
2852 | bsize = max(local->statvfs.f_bsize, statvfs->f_bsize)((local->statvfs.f_bsize)>(statvfs->f_bsize)?(local-> statvfs.f_bsize):(statvfs->f_bsize)); | |||||
2853 | frsize = max(local->statvfs.f_frsize, statvfs->f_frsize)((local->statvfs.f_frsize)>(statvfs->f_frsize)?(local ->statvfs.f_frsize):(statvfs->f_frsize)); | |||||
2854 | dht_normalize_stats(&local->statvfs, bsize, frsize); | |||||
2855 | dht_normalize_stats(statvfs, bsize, frsize); | |||||
2856 | } else { | |||||
2857 | local->statvfs.f_bsize = statvfs->f_bsize; | |||||
2858 | local->statvfs.f_frsize = statvfs->f_frsize; | |||||
2859 | } | |||||
2860 | ||||||
2861 | local->statvfs.f_blocks += statvfs->f_blocks; | |||||
2862 | local->statvfs.f_bfree += statvfs->f_bfree; | |||||
2863 | local->statvfs.f_bavail += statvfs->f_bavail; | |||||
2864 | local->statvfs.f_files += statvfs->f_files; | |||||
2865 | local->statvfs.f_ffree += statvfs->f_ffree; | |||||
2866 | local->statvfs.f_favail += statvfs->f_favail; | |||||
2867 | local->statvfs.f_fsid = statvfs->f_fsid; | |||||
2868 | local->statvfs.f_flag = statvfs->f_flag; | |||||
2869 | local->statvfs.f_namemax = statvfs->f_namemax; | |||||
2870 | ||||||
2871 | } | |||||
2872 | unlock: | |||||
2873 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2874 | ||||||
2875 | ||||||
2876 | this_call_cnt = dht_frame_return (frame); | |||||
2877 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) | |||||
2878 | DHT_STACK_UNWIND (statfs, frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_statfs_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2879, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_statfs_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> statvfs, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
2879 | &local->statvfs, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_statfs_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2879, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_statfs_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> statvfs, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2880 | ||||||
2881 | return 0; | |||||
2882 | } | |||||
2883 | ||||||
2884 | ||||||
2885 | int | |||||
2886 | dht_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) | |||||
2887 | { | |||||
2888 | xlator_t *subvol = NULL((void*)0); | |||||
2889 | dht_local_t *local = NULL((void*)0); | |||||
2890 | dht_conf_t *conf = NULL((void*)0); | |||||
2891 | int op_errno = -1; | |||||
2892 | int i = -1; | |||||
2893 | ||||||
2894 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2894, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2895 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2895, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2896 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2896, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
2897 | VALIDATE_OR_GOTO (loc->inode, err)do { if (!loc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2897, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
2898 | VALIDATE_OR_GOTO (loc->path, err)do { if (!loc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2898, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
2899 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2899, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
2900 | ||||||
2901 | conf = this->private; | |||||
2902 | ||||||
2903 | local = dht_local_init (frame, NULL((void*)0), NULL((void*)0), GF_FOP_STATFS); | |||||
2904 | if (!local) { | |||||
2905 | op_errno = ENOMEM12; | |||||
2906 | goto err; | |||||
2907 | } | |||||
2908 | ||||||
2909 | if (IA_ISDIR (loc->inode->ia_type)(loc->inode->ia_type == IA_IFDIR)) { | |||||
2910 | local->call_cnt = conf->subvolume_cnt; | |||||
2911 | ||||||
2912 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
2913 | STACK_WIND (frame, dht_statfs_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2916, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->statfs_cbk) tmp_cbk = dht_statfs_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->statfs"; _new ->unwind_to = "dht_statfs_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->statfs); conf-> subvolumes[i]->fops->statfs (_new, conf->subvolumes[ i], loc, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2914 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2916, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->statfs_cbk) tmp_cbk = dht_statfs_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->statfs"; _new ->unwind_to = "dht_statfs_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->statfs); conf-> subvolumes[i]->fops->statfs (_new, conf->subvolumes[ i], loc, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2915 | conf->subvolumes[i]->fops->statfs, loc,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2916, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->statfs_cbk) tmp_cbk = dht_statfs_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->statfs"; _new ->unwind_to = "dht_statfs_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->statfs); conf-> subvolumes[i]->fops->statfs (_new, conf->subvolumes[ i], loc, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2916 | xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2916, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->statfs_cbk) tmp_cbk = dht_statfs_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->statfs"; _new ->unwind_to = "dht_statfs_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->statfs); conf-> subvolumes[i]->fops->statfs (_new, conf->subvolumes[ i], loc, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2917 | } | |||||
2918 | return 0; | |||||
2919 | } | |||||
2920 | ||||||
2921 | subvol = dht_subvol_get_cached (this, loc->inode); | |||||
2922 | if (!subvol) { | |||||
2923 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2924, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0) | |||||
2924 | "no cached subvolume for path=%s", loc->path)do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 2924, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0); | |||||
2925 | op_errno = EINVAL22; | |||||
2926 | goto err; | |||||
2927 | } | |||||
2928 | ||||||
2929 | local->call_cnt = 1; | |||||
2930 | ||||||
2931 | STACK_WIND (frame, dht_statfs_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2932, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->statfs_cbk) tmp_cbk = dht_statfs_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->statfs" ; _new->unwind_to = "dht_statfs_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->statfs); subvol-> fops->statfs (_new, subvol, loc, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2932 | subvol, subvol->fops->statfs, loc, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2932, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->statfs_cbk) tmp_cbk = dht_statfs_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->statfs" ; _new->unwind_to = "dht_statfs_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->statfs); subvol-> fops->statfs (_new, subvol, loc, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
2933 | ||||||
2934 | return 0; | |||||
2935 | ||||||
2936 | err: | |||||
2937 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
2938 | DHT_STACK_UNWIND (statfs, frame, -1, op_errno, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_statfs_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2938, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_statfs_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2939 | ||||||
2940 | return 0; | |||||
2941 | } | |||||
2942 | ||||||
2943 | ||||||
2944 | int | |||||
2945 | dht_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd, | |||||
2946 | dict_t *xdata) | |||||
2947 | { | |||||
2948 | dht_local_t *local = NULL((void*)0); | |||||
2949 | dht_conf_t *conf = NULL((void*)0); | |||||
2950 | int op_errno = -1; | |||||
2951 | int i = -1; | |||||
2952 | ||||||
2953 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2953, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2954 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2954, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2955 | VALIDATE_OR_GOTO (fd, err)do { if (!fd) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "fd"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 2955, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
2956 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 2956, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
2957 | ||||||
2958 | conf = this->private; | |||||
2959 | ||||||
2960 | local = dht_local_init (frame, loc, fd, GF_FOP_OPENDIR); | |||||
2961 | if (!local) { | |||||
2962 | op_errno = ENOMEM12; | |||||
2963 | ||||||
2964 | goto err; | |||||
2965 | } | |||||
2966 | ||||||
2967 | local->call_cnt = conf->subvolume_cnt; | |||||
2968 | ||||||
2969 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
2970 | STACK_WIND (frame, dht_fd_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2973, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->opendir_cbk) tmp_cbk = dht_fd_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->opendir"; _new->unwind_to = "dht_fd_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->opendir); conf-> subvolumes[i]->fops->opendir (_new, conf->subvolumes [i], loc, fd, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
2971 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2973, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->opendir_cbk) tmp_cbk = dht_fd_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->opendir"; _new->unwind_to = "dht_fd_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->opendir); conf-> subvolumes[i]->fops->opendir (_new, conf->subvolumes [i], loc, fd, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
2972 | conf->subvolumes[i]->fops->opendir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2973, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->opendir_cbk) tmp_cbk = dht_fd_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->opendir"; _new->unwind_to = "dht_fd_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->opendir); conf-> subvolumes[i]->fops->opendir (_new, conf->subvolumes [i], loc, fd, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
2973 | loc, fd, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 2973, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->opendir_cbk) tmp_cbk = dht_fd_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->opendir"; _new->unwind_to = "dht_fd_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->opendir); conf-> subvolumes[i]->fops->opendir (_new, conf->subvolumes [i], loc, fd, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
2974 | } | |||||
2975 | ||||||
2976 | return 0; | |||||
2977 | ||||||
2978 | err: | |||||
2979 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
2980 | DHT_STACK_UNWIND (opendir, frame, -1, op_errno, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_opendir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 2980, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_opendir_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
2981 | ||||||
2982 | return 0; | |||||
2983 | } | |||||
2984 | ||||||
2985 | ||||||
2986 | int | |||||
2987 | dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, | |||||
2988 | int op_errno, gf_dirent_t *orig_entries, dict_t *xdata) | |||||
2989 | { | |||||
2990 | dht_local_t *local = NULL((void*)0); | |||||
2991 | gf_dirent_t entries; | |||||
2992 | gf_dirent_t *orig_entry = NULL((void*)0); | |||||
2993 | gf_dirent_t *entry = NULL((void*)0); | |||||
2994 | call_frame_t *prev = NULL((void*)0); | |||||
2995 | xlator_t *next_subvol = NULL((void*)0); | |||||
2996 | off_t next_offset = 0; | |||||
2997 | int count = 0; | |||||
2998 | dht_layout_t *layout = 0; | |||||
2999 | dht_conf_t *conf = NULL((void*)0); | |||||
3000 | xlator_t *subvol = 0; | |||||
3001 | int ret = 0; | |||||
3002 | ||||||
3003 | INIT_LIST_HEAD (&entries.list)do { (&entries.list)->next = (&entries.list)->prev = &entries.list; } while (0); | |||||
3004 | prev = cookie; | |||||
3005 | local = frame->local; | |||||
3006 | conf = this->private; | |||||
3007 | ||||||
3008 | if (op_ret < 0) | |||||
3009 | goto done; | |||||
3010 | ||||||
3011 | if (!local->layout) | |||||
3012 | local->layout = dht_layout_get (this, local->fd->inode); | |||||
3013 | ||||||
3014 | layout = local->layout; | |||||
3015 | ||||||
3016 | list_for_each_entry (orig_entry, (&orig_entries->list), list)for (orig_entry = ((typeof(*orig_entry) *)((char *)(((&orig_entries ->list))->next)-(unsigned long)(&((typeof(*orig_entry ) *)0)->list))); &orig_entry->list != ((&orig_entries ->list)); orig_entry = ((typeof(*orig_entry) *)((char *)(orig_entry ->list.next)-(unsigned long)(&((typeof(*orig_entry) *) 0)->list)))) { | |||||
3017 | next_offset = orig_entry->d_off; | |||||
3018 | if (check_is_dir (NULL, (&orig_entry->d_stat), NULL)(((&orig_entry->d_stat)->ia_type == IA_IFDIR)) && | |||||
3019 | (prev->this != dht_first_up_subvol (this))) { | |||||
3020 | continue; | |||||
3021 | } | |||||
3022 | if (check_is_linkfile (NULL, (&orig_entry->d_stat),( ((st_mode_from_ia (((&orig_entry->d_stat))->ia_prot , ((&orig_entry->d_stat))->ia_type) & ~0170000) == (01000)) && dict_get (orig_entry->dict, conf-> link_xattr_name)) | |||||
3023 | orig_entry->dict,( ((st_mode_from_ia (((&orig_entry->d_stat))->ia_prot , ((&orig_entry->d_stat))->ia_type) & ~0170000) == (01000)) && dict_get (orig_entry->dict, conf-> link_xattr_name)) | |||||
3024 | conf->link_xattr_name)( ((st_mode_from_ia (((&orig_entry->d_stat))->ia_prot , ((&orig_entry->d_stat))->ia_type) & ~0170000) == (01000)) && dict_get (orig_entry->dict, conf-> link_xattr_name))) { | |||||
3025 | continue; | |||||
3026 | } | |||||
3027 | ||||||
3028 | entry = gf_dirent_for_name (orig_entry->d_name); | |||||
3029 | if (!entry) { | |||||
3030 | ||||||
3031 | goto unwind; | |||||
3032 | } | |||||
3033 | ||||||
3034 | /* Do this if conf->search_unhashed is set to "auto" */ | |||||
3035 | if (conf->search_unhashed == GF_DHT_LOOKUP_UNHASHED_AUTO2) { | |||||
3036 | subvol = dht_layout_search (this, layout, | |||||
3037 | orig_entry->d_name); | |||||
3038 | if (!subvol || (subvol != prev->this)) { | |||||
3039 | /* TODO: Count the number of entries which need | |||||
3040 | linkfile to prove its existence in fs */ | |||||
3041 | layout->search_unhashed++; | |||||
3042 | } | |||||
3043 | } | |||||
3044 | ||||||
3045 | dht_itransform (this, prev->this, orig_entry->d_off, | |||||
3046 | &entry->d_off); | |||||
3047 | ||||||
3048 | entry->d_stat = orig_entry->d_stat; | |||||
3049 | entry->d_ino = orig_entry->d_ino; | |||||
3050 | entry->d_type = orig_entry->d_type; | |||||
3051 | entry->d_len = orig_entry->d_len; | |||||
3052 | ||||||
3053 | if (orig_entry->dict) | |||||
3054 | entry->dict = dict_ref (orig_entry->dict); | |||||
3055 | ||||||
3056 | /* making sure we set the inode ctx right with layout, | |||||
3057 | currently possible only for non-directories, so for | |||||
3058 | directories don't set entry inodes */ | |||||
3059 | if (!IA_ISDIR(entry->d_stat.ia_type)(entry->d_stat.ia_type == IA_IFDIR)) { | |||||
3060 | ret = dht_layout_preset (this, prev->this, | |||||
3061 | orig_entry->inode); | |||||
3062 | if (ret) | |||||
3063 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("failed to link the layout in inode" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 3064, GF_LOG_WARNING, "failed to link the layout in inode") ; } while (0) | |||||
3064 | "failed to link the layout in inode")do { do { if (0) printf ("failed to link the layout in inode" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 3064, GF_LOG_WARNING, "failed to link the layout in inode") ; } while (0); | |||||
3065 | entry->inode = inode_ref (orig_entry->inode); | |||||
3066 | } else if (orig_entry->inode) { | |||||
3067 | dht_inode_ctx_time_update (orig_entry->inode, this, | |||||
3068 | &entry->d_stat, 1); | |||||
3069 | } | |||||
3070 | ||||||
3071 | list_add_tail (&entry->list, &entries.list); | |||||
3072 | count++; | |||||
3073 | } | |||||
3074 | op_ret = count; | |||||
3075 | /* We need to ensure that only the last subvolume's end-of-directory | |||||
3076 | * notification is respected so that directory reading does not stop | |||||
3077 | * before all subvolumes have been read. That could happen because the | |||||
3078 | * posix for each subvolume sends a ENOENT on end-of-directory but in | |||||
3079 | * distribute we're not concerned only with a posix's view of the | |||||
3080 | * directory but the aggregated namespace' view of the directory. | |||||
3081 | */ | |||||
3082 | if (prev->this != dht_last_up_subvol (this)) | |||||
3083 | op_errno = 0; | |||||
3084 | ||||||
3085 | done: | |||||
3086 | if (count == 0) { | |||||
3087 | /* non-zero next_offset means that | |||||
3088 | EOF is not yet hit on the current subvol | |||||
3089 | */ | |||||
3090 | if (next_offset == 0) { | |||||
3091 | next_subvol = dht_subvol_next (this, prev->this); | |||||
3092 | } else { | |||||
3093 | next_subvol = prev->this; | |||||
3094 | } | |||||
3095 | ||||||
3096 | if (!next_subvol) { | |||||
3097 | goto unwind; | |||||
3098 | } | |||||
3099 | ||||||
3100 | if (conf->readdir_optimize == _gf_true) { | |||||
3101 | if (next_subvol != dht_first_up_subvol (this)) { | |||||
3102 | ret = dict_set_int32 (local->xattr, | |||||
3103 | GF_READDIR_SKIP_DIRS"readdir-filter-directories", 1); | |||||
3104 | if (ret) | |||||
3105 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("dict set failed"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3106, GF_LOG_ERROR , "dict set failed"); } while (0) | |||||
3106 | "dict set failed")do { do { if (0) printf ("dict set failed"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3106, GF_LOG_ERROR , "dict set failed"); } while (0); | |||||
3107 | } | |||||
3108 | } | |||||
3109 | ||||||
3110 | STACK_WIND (frame, dht_readdirp_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3113, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( next_subvol-> fops->readdirp_cbk) tmp_cbk = dht_readdirp_cbk; _new->root = frame->root; _new->this = next_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "next_subvol->fops->readdirp"; _new->unwind_to = "dht_readdirp_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = next_subvol; if (frame-> this->ctx->measure_latency) gf_latency_begin (_new, next_subvol ->fops->readdirp); next_subvol->fops->readdirp (_new , next_subvol, local->fd, local->size, next_offset, local ->xattr); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3111 | next_subvol, next_subvol->fops->readdirp,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3113, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( next_subvol-> fops->readdirp_cbk) tmp_cbk = dht_readdirp_cbk; _new->root = frame->root; _new->this = next_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "next_subvol->fops->readdirp"; _new->unwind_to = "dht_readdirp_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = next_subvol; if (frame-> this->ctx->measure_latency) gf_latency_begin (_new, next_subvol ->fops->readdirp); next_subvol->fops->readdirp (_new , next_subvol, local->fd, local->size, next_offset, local ->xattr); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3112 | local->fd, local->size, next_offset,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3113, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( next_subvol-> fops->readdirp_cbk) tmp_cbk = dht_readdirp_cbk; _new->root = frame->root; _new->this = next_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "next_subvol->fops->readdirp"; _new->unwind_to = "dht_readdirp_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = next_subvol; if (frame-> this->ctx->measure_latency) gf_latency_begin (_new, next_subvol ->fops->readdirp); next_subvol->fops->readdirp (_new , next_subvol, local->fd, local->size, next_offset, local ->xattr); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3113 | local->xattr)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3113, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( next_subvol-> fops->readdirp_cbk) tmp_cbk = dht_readdirp_cbk; _new->root = frame->root; _new->this = next_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "next_subvol->fops->readdirp"; _new->unwind_to = "dht_readdirp_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = next_subvol; if (frame-> this->ctx->measure_latency) gf_latency_begin (_new, next_subvol ->fops->readdirp); next_subvol->fops->readdirp (_new , next_subvol, local->fd, local->size, next_offset, local ->xattr); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3114 | return 0; | |||||
3115 | } | |||||
3116 | ||||||
3117 | unwind: | |||||
3118 | if (op_ret < 0) | |||||
3119 | op_ret = 0; | |||||
3120 | ||||||
3121 | DHT_STACK_UNWIND (readdirp, frame, op_ret, op_errno, &entries, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_readdirp_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3121, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_readdirp_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, &entries, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3122 | ||||||
3123 | gf_dirent_free (&entries); | |||||
3124 | ||||||
3125 | return 0; | |||||
3126 | } | |||||
3127 | ||||||
3128 | ||||||
3129 | ||||||
3130 | int | |||||
3131 | dht_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3132 | int op_ret, int op_errno, gf_dirent_t *orig_entries, | |||||
3133 | dict_t *xdata) | |||||
3134 | { | |||||
3135 | dht_local_t *local = NULL((void*)0); | |||||
3136 | gf_dirent_t entries; | |||||
3137 | gf_dirent_t *orig_entry = NULL((void*)0); | |||||
3138 | gf_dirent_t *entry = NULL((void*)0); | |||||
3139 | call_frame_t *prev = NULL((void*)0); | |||||
3140 | xlator_t *next_subvol = NULL((void*)0); | |||||
3141 | off_t next_offset = 0; | |||||
3142 | int count = 0; | |||||
3143 | dht_layout_t *layout = 0; | |||||
3144 | xlator_t *subvol = 0; | |||||
3145 | ||||||
3146 | INIT_LIST_HEAD (&entries.list)do { (&entries.list)->next = (&entries.list)->prev = &entries.list; } while (0); | |||||
3147 | prev = cookie; | |||||
3148 | local = frame->local; | |||||
3149 | ||||||
3150 | if (op_ret < 0) | |||||
3151 | goto done; | |||||
3152 | ||||||
3153 | if (!local->layout) | |||||
3154 | local->layout = dht_layout_get (this, local->fd->inode); | |||||
3155 | ||||||
3156 | layout = local->layout; | |||||
3157 | ||||||
3158 | list_for_each_entry (orig_entry, (&orig_entries->list), list)for (orig_entry = ((typeof(*orig_entry) *)((char *)(((&orig_entries ->list))->next)-(unsigned long)(&((typeof(*orig_entry ) *)0)->list))); &orig_entry->list != ((&orig_entries ->list)); orig_entry = ((typeof(*orig_entry) *)((char *)(orig_entry ->list.next)-(unsigned long)(&((typeof(*orig_entry) *) 0)->list)))) { | |||||
3159 | next_offset = orig_entry->d_off; | |||||
3160 | ||||||
3161 | subvol = dht_layout_search (this, layout, orig_entry->d_name); | |||||
3162 | ||||||
3163 | if (!subvol || (subvol == prev->this)) { | |||||
3164 | entry = gf_dirent_for_name (orig_entry->d_name); | |||||
3165 | if (!entry) { | |||||
3166 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("memory allocation failed :("); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3167 , GF_LOG_ERROR, "memory allocation failed :("); } while (0) | |||||
3167 | "memory allocation failed :(")do { do { if (0) printf ("memory allocation failed :("); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3167 , GF_LOG_ERROR, "memory allocation failed :("); } while (0); | |||||
3168 | goto unwind; | |||||
3169 | } | |||||
3170 | ||||||
3171 | dht_itransform (this, prev->this, orig_entry->d_off, | |||||
3172 | &entry->d_off); | |||||
3173 | ||||||
3174 | entry->d_ino = orig_entry->d_ino; | |||||
3175 | entry->d_type = orig_entry->d_type; | |||||
3176 | entry->d_len = orig_entry->d_len; | |||||
3177 | ||||||
3178 | list_add_tail (&entry->list, &entries.list); | |||||
3179 | count++; | |||||
3180 | } | |||||
3181 | } | |||||
3182 | op_ret = count; | |||||
3183 | /* We need to ensure that only the last subvolume's end-of-directory | |||||
3184 | * notification is respected so that directory reading does not stop | |||||
3185 | * before all subvolumes have been read. That could happen because the | |||||
3186 | * posix for each subvolume sends a ENOENT on end-of-directory but in | |||||
3187 | * distribute we're not concerned only with a posix's view of the | |||||
3188 | * directory but the aggregated namespace' view of the directory. | |||||
3189 | */ | |||||
3190 | if (prev->this != dht_last_up_subvol (this)) | |||||
3191 | op_errno = 0; | |||||
3192 | ||||||
3193 | done: | |||||
3194 | if (count == 0) { | |||||
3195 | /* non-zero next_offset means that | |||||
3196 | EOF is not yet hit on the current subvol | |||||
3197 | */ | |||||
3198 | if (next_offset == 0) { | |||||
3199 | next_subvol = dht_subvol_next (this, prev->this); | |||||
3200 | } else { | |||||
3201 | next_subvol = prev->this; | |||||
3202 | } | |||||
3203 | ||||||
3204 | if (!next_subvol) { | |||||
3205 | goto unwind; | |||||
3206 | } | |||||
3207 | ||||||
3208 | STACK_WIND (frame, dht_readdir_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3210, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( next_subvol-> fops->readdir_cbk) tmp_cbk = dht_readdir_cbk; _new->root = frame->root; _new->this = next_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "next_subvol->fops->readdir"; _new->unwind_to = "dht_readdir_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = next_subvol; if (frame-> this->ctx->measure_latency) gf_latency_begin (_new, next_subvol ->fops->readdir); next_subvol->fops->readdir (_new , next_subvol, local->fd, local->size, next_offset, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3209 | next_subvol, next_subvol->fops->readdir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3210, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( next_subvol-> fops->readdir_cbk) tmp_cbk = dht_readdir_cbk; _new->root = frame->root; _new->this = next_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "next_subvol->fops->readdir"; _new->unwind_to = "dht_readdir_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = next_subvol; if (frame-> this->ctx->measure_latency) gf_latency_begin (_new, next_subvol ->fops->readdir); next_subvol->fops->readdir (_new , next_subvol, local->fd, local->size, next_offset, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3210 | local->fd, local->size, next_offset, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3210, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( next_subvol-> fops->readdir_cbk) tmp_cbk = dht_readdir_cbk; _new->root = frame->root; _new->this = next_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "next_subvol->fops->readdir"; _new->unwind_to = "dht_readdir_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = next_subvol; if (frame-> this->ctx->measure_latency) gf_latency_begin (_new, next_subvol ->fops->readdir); next_subvol->fops->readdir (_new , next_subvol, local->fd, local->size, next_offset, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3211 | return 0; | |||||
3212 | } | |||||
3213 | ||||||
3214 | unwind: | |||||
3215 | if (op_ret < 0) | |||||
3216 | op_ret = 0; | |||||
3217 | ||||||
3218 | DHT_STACK_UNWIND (readdir, frame, op_ret, op_errno, &entries, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_readdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3218, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_readdir_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, &entries, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3219 | ||||||
3220 | gf_dirent_free (&entries); | |||||
3221 | ||||||
3222 | return 0; | |||||
3223 | } | |||||
3224 | ||||||
3225 | ||||||
3226 | int | |||||
3227 | dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, | |||||
3228 | off_t yoff, int whichop, dict_t *dict) | |||||
3229 | { | |||||
3230 | dht_local_t *local = NULL((void*)0); | |||||
3231 | int op_errno = -1; | |||||
3232 | xlator_t *xvol = NULL((void*)0); | |||||
3233 | off_t xoff = 0; | |||||
3234 | int ret = 0; | |||||
3235 | dht_conf_t *conf = NULL((void*)0); | |||||
3236 | ||||||
3237 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3237, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3238 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3238, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3239 | VALIDATE_OR_GOTO (fd, err)do { if (!fd) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "fd"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3239, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
3240 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 3240, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
3241 | ||||||
3242 | conf = this->private; | |||||
3243 | ||||||
3244 | local = dht_local_init (frame, NULL((void*)0), NULL((void*)0), whichop); | |||||
3245 | if (!local) { | |||||
3246 | op_errno = ENOMEM12; | |||||
3247 | goto err; | |||||
3248 | } | |||||
3249 | ||||||
3250 | local->fd = fd_ref (fd); | |||||
3251 | local->size = size; | |||||
3252 | local->xattr_req = (dict)? dict_ref (dict) : NULL((void*)0); | |||||
3253 | ||||||
3254 | dht_deitransform (this, yoff, &xvol, (uint64_t *)&xoff); | |||||
3255 | ||||||
3256 | /* TODO: do proper readdir */ | |||||
3257 | if (whichop == GF_FOP_READDIRP) { | |||||
3258 | if (dict) | |||||
3259 | local->xattr = dict_ref (dict); | |||||
3260 | else | |||||
3261 | local->xattr = dict_new (); | |||||
3262 | ||||||
3263 | if (local->xattr) { | |||||
3264 | ret = dict_set_uint32 (local->xattr, | |||||
3265 | conf->link_xattr_name, 256); | |||||
3266 | if (ret) | |||||
3267 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("failed to set '%s' key", conf->link_xattr_name ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 3269, GF_LOG_WARNING, "failed to set '%s' key", conf->link_xattr_name ); } while (0) | |||||
3268 | "failed to set '%s' key",do { do { if (0) printf ("failed to set '%s' key", conf->link_xattr_name ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 3269, GF_LOG_WARNING, "failed to set '%s' key", conf->link_xattr_name ); } while (0) | |||||
3269 | conf->link_xattr_name)do { do { if (0) printf ("failed to set '%s' key", conf->link_xattr_name ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 3269, GF_LOG_WARNING, "failed to set '%s' key", conf->link_xattr_name ); } while (0); | |||||
3270 | if (conf->readdir_optimize == _gf_true) { | |||||
3271 | if (xvol != dht_first_up_subvol (this)) { | |||||
3272 | ret = dict_set_int32 (local->xattr, | |||||
3273 | GF_READDIR_SKIP_DIRS"readdir-filter-directories", 1); | |||||
3274 | if (ret) | |||||
3275 | gf_log (this->name,do { do { if (0) printf ("Dict set failed"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3277, GF_LOG_ERROR , "Dict set failed"); } while (0) | |||||
3276 | GF_LOG_ERROR,do { do { if (0) printf ("Dict set failed"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3277, GF_LOG_ERROR , "Dict set failed"); } while (0) | |||||
3277 | "Dict set failed")do { do { if (0) printf ("Dict set failed"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3277, GF_LOG_ERROR , "Dict set failed"); } while (0); | |||||
3278 | } | |||||
3279 | } | |||||
3280 | } | |||||
3281 | ||||||
3282 | STACK_WIND (frame, dht_readdirp_cbk, xvol, xvol->fops->readdirp,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3283, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( xvol->fops ->readdirp_cbk) tmp_cbk = dht_readdirp_cbk; _new->root = frame->root; _new->this = xvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "xvol->fops->readdirp" ; _new->unwind_to = "dht_readdirp_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = xvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, xvol->fops->readdirp); xvol->fops->readdirp (_new, xvol, fd, size, xoff, local->xattr); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3283 | fd, size, xoff, local->xattr)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3283, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( xvol->fops ->readdirp_cbk) tmp_cbk = dht_readdirp_cbk; _new->root = frame->root; _new->this = xvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "xvol->fops->readdirp" ; _new->unwind_to = "dht_readdirp_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = xvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, xvol->fops->readdirp); xvol->fops->readdirp (_new, xvol, fd, size, xoff, local->xattr); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3284 | } else { | |||||
3285 | STACK_WIND (frame, dht_readdir_cbk, xvol, xvol->fops->readdir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3286, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( xvol->fops ->readdir_cbk) tmp_cbk = dht_readdir_cbk; _new->root = frame ->root; _new->this = xvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "xvol->fops->readdir" ; _new->unwind_to = "dht_readdir_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = xvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, xvol->fops->readdir); xvol->fops->readdir (_new, xvol, fd, size, xoff, local->xattr); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3286 | fd, size, xoff, local->xattr)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3286, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( xvol->fops ->readdir_cbk) tmp_cbk = dht_readdir_cbk; _new->root = frame ->root; _new->this = xvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "xvol->fops->readdir" ; _new->unwind_to = "dht_readdir_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = xvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, xvol->fops->readdir); xvol->fops->readdir (_new, xvol, fd, size, xoff, local->xattr); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3287 | } | |||||
3288 | ||||||
3289 | return 0; | |||||
3290 | ||||||
3291 | err: | |||||
3292 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
3293 | DHT_STACK_UNWIND (readdir, frame, -1, op_errno, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_readdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3293, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_readdir_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3294 | ||||||
3295 | return 0; | |||||
3296 | } | |||||
3297 | ||||||
3298 | ||||||
3299 | int | |||||
3300 | dht_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, | |||||
3301 | off_t yoff, dict_t *xdata) | |||||
3302 | { | |||||
3303 | int op = GF_FOP_READDIR; | |||||
3304 | dht_conf_t *conf = NULL((void*)0); | |||||
3305 | int i = 0; | |||||
3306 | ||||||
3307 | conf = this->private; | |||||
3308 | if (!conf) | |||||
3309 | goto out; | |||||
3310 | ||||||
3311 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
3312 | if (!conf->subvolume_status[i]) { | |||||
3313 | op = GF_FOP_READDIRP; | |||||
3314 | break; | |||||
3315 | } | |||||
3316 | } | |||||
3317 | ||||||
3318 | if (conf->use_readdirp) | |||||
3319 | op = GF_FOP_READDIRP; | |||||
3320 | ||||||
3321 | out: | |||||
3322 | dht_do_readdir (frame, this, fd, size, yoff, op, 0); | |||||
3323 | return 0; | |||||
3324 | } | |||||
3325 | ||||||
3326 | int | |||||
3327 | dht_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, | |||||
3328 | off_t yoff, dict_t *dict) | |||||
3329 | { | |||||
3330 | dht_do_readdir (frame, this, fd, size, yoff, GF_FOP_READDIRP, dict); | |||||
3331 | return 0; | |||||
3332 | } | |||||
3333 | ||||||
3334 | ||||||
3335 | ||||||
3336 | int | |||||
3337 | dht_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3338 | int op_ret, int op_errno, dict_t *xdata) | |||||
3339 | { | |||||
3340 | dht_local_t *local = NULL((void*)0); | |||||
3341 | int this_call_cnt = 0; | |||||
3342 | ||||||
3343 | ||||||
3344 | local = frame->local; | |||||
3345 | ||||||
3346 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
3347 | { | |||||
3348 | if (op_ret == -1) | |||||
3349 | local->op_errno = op_errno; | |||||
3350 | ||||||
3351 | if (op_ret == 0) | |||||
3352 | local->op_ret = 0; | |||||
3353 | } | |||||
3354 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
3355 | ||||||
3356 | this_call_cnt = dht_frame_return (frame); | |||||
3357 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) | |||||
3358 | DHT_STACK_UNWIND (fsyncdir, frame, local->op_ret,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_fsyncdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3359, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsyncdir_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3359 | local->op_errno, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_fsyncdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3359, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsyncdir_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3360 | ||||||
3361 | return 0; | |||||
3362 | } | |||||
3363 | ||||||
3364 | ||||||
3365 | int | |||||
3366 | dht_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd, | |||||
3367 | int datasync, dict_t *xdata) | |||||
3368 | { | |||||
3369 | dht_local_t *local = NULL((void*)0); | |||||
3370 | dht_conf_t *conf = NULL((void*)0); | |||||
3371 | int op_errno = -1; | |||||
3372 | int i = -1; | |||||
3373 | ||||||
3374 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3374, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3375 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3375, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3376 | VALIDATE_OR_GOTO (fd, err)do { if (!fd) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "fd"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3376, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
3377 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 3377, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
3378 | ||||||
3379 | conf = this->private; | |||||
3380 | ||||||
3381 | local = dht_local_init (frame, NULL((void*)0), NULL((void*)0), GF_FOP_FSYNCDIR); | |||||
3382 | if (!local) { | |||||
3383 | op_errno = ENOMEM12; | |||||
3384 | goto err; | |||||
3385 | } | |||||
3386 | ||||||
3387 | local->fd = fd_ref (fd); | |||||
3388 | local->call_cnt = conf->subvolume_cnt; | |||||
3389 | ||||||
3390 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
3391 | STACK_WIND (frame, dht_fsyncdir_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3394, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->fsyncdir_cbk) tmp_cbk = dht_fsyncdir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->fsyncdir" ; _new->unwind_to = "dht_fsyncdir_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->fsyncdir); conf->subvolumes[i]->fops-> fsyncdir (_new, conf->subvolumes[i], fd, datasync, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3392 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3394, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->fsyncdir_cbk) tmp_cbk = dht_fsyncdir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->fsyncdir" ; _new->unwind_to = "dht_fsyncdir_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->fsyncdir); conf->subvolumes[i]->fops-> fsyncdir (_new, conf->subvolumes[i], fd, datasync, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3393 | conf->subvolumes[i]->fops->fsyncdir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3394, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->fsyncdir_cbk) tmp_cbk = dht_fsyncdir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->fsyncdir" ; _new->unwind_to = "dht_fsyncdir_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->fsyncdir); conf->subvolumes[i]->fops-> fsyncdir (_new, conf->subvolumes[i], fd, datasync, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3394 | fd, datasync, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3394, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->fsyncdir_cbk) tmp_cbk = dht_fsyncdir_cbk; _new ->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->fsyncdir" ; _new->unwind_to = "dht_fsyncdir_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->fsyncdir); conf->subvolumes[i]->fops-> fsyncdir (_new, conf->subvolumes[i], fd, datasync, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3395 | } | |||||
3396 | ||||||
3397 | return 0; | |||||
3398 | ||||||
3399 | err: | |||||
3400 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
3401 | DHT_STACK_UNWIND (fsyncdir, frame, -1, op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_fsyncdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3401, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsyncdir_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3402 | ||||||
3403 | return 0; | |||||
3404 | } | |||||
3405 | ||||||
3406 | ||||||
3407 | int | |||||
3408 | dht_newfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3409 | int op_ret, int op_errno, | |||||
3410 | inode_t *inode, struct iatt *stbuf, struct iatt *preparent, | |||||
3411 | struct iatt *postparent, dict_t *xdata) | |||||
3412 | { | |||||
3413 | xlator_t *prev = NULL((void*)0); | |||||
3414 | int ret = -1; | |||||
3415 | dht_local_t *local = NULL((void*)0); | |||||
3416 | ||||||
3417 | ||||||
3418 | if (op_ret == -1) | |||||
3419 | goto out; | |||||
3420 | ||||||
3421 | local = frame->local; | |||||
3422 | if (!local) { | |||||
3423 | op_ret = -1; | |||||
3424 | op_errno = EINVAL22; | |||||
3425 | goto out; | |||||
3426 | } | |||||
3427 | ||||||
3428 | prev = cookie; | |||||
3429 | ||||||
3430 | if (local->loc.parent) { | |||||
3431 | ||||||
3432 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
3433 | preparent, 0); | |||||
3434 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
3435 | postparent, 1); | |||||
3436 | } | |||||
3437 | ||||||
3438 | ret = dht_layout_preset (this, prev, inode); | |||||
3439 | if (ret < 0) { | |||||
3440 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("could not set pre-set layout for subvolume %s" , prev? prev->name: ((void*)0)); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 3442, GF_LOG_DEBUG, "could not set pre-set layout for subvolume %s" , prev? prev->name: ((void*)0)); } while (0) | |||||
3441 | "could not set pre-set layout for subvolume %s",do { do { if (0) printf ("could not set pre-set layout for subvolume %s" , prev? prev->name: ((void*)0)); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 3442, GF_LOG_DEBUG, "could not set pre-set layout for subvolume %s" , prev? prev->name: ((void*)0)); } while (0) | |||||
3442 | prev? prev->name: NULL)do { do { if (0) printf ("could not set pre-set layout for subvolume %s" , prev? prev->name: ((void*)0)); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 3442, GF_LOG_DEBUG, "could not set pre-set layout for subvolume %s" , prev? prev->name: ((void*)0)); } while (0); | |||||
3443 | op_ret = -1; | |||||
3444 | op_errno = EINVAL22; | |||||
3445 | goto out; | |||||
3446 | } | |||||
3447 | if (local->linked == _gf_true) | |||||
3448 | dht_linkfile_attr_heal (frame, this); | |||||
3449 | out: | |||||
3450 | /* | |||||
3451 | * FIXME: ia_size and st_blocks of preparent and postparent do not have | |||||
3452 | * correct values. since, preparent and postparent buffers correspond | |||||
3453 | * to a directory these two members should have values equal to sum of | |||||
3454 | * corresponding values from each of the subvolume. | |||||
3455 | * See dht_iatt_merge for reference. | |||||
3456 | */ | |||||
3457 | DHT_STRIP_PHASE1_FLAGS (stbuf)do { if ((stbuf) && ( ((stbuf)->ia_type == IA_IFREG ) && ((stbuf)->ia_prot.sticky == 1) && ((stbuf )->ia_prot.sgid == 1))) { (stbuf)->ia_prot.sticky = 0; ( stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
3458 | DHT_STACK_UNWIND (mknod, frame, op_ret, op_errno, inode, stbuf,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mknod_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3459, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mknod_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, preparent, postparent , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0); dht_local_wipe (__xl, __local); } while (0) | |||||
3459 | preparent, postparent, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mknod_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3459, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mknod_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, preparent, postparent , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0); dht_local_wipe (__xl, __local); } while (0); | |||||
3460 | return 0; | |||||
3461 | } | |||||
3462 | ||||||
3463 | int | |||||
3464 | dht_mknod_linkfile_create_cbk (call_frame_t *frame, void *cookie, | |||||
3465 | xlator_t *this, | |||||
3466 | int32_t op_ret, int32_t op_errno, | |||||
3467 | inode_t *inode, struct iatt *stbuf, | |||||
3468 | struct iatt *preparent, struct iatt *postparent, | |||||
3469 | dict_t *xdata) | |||||
3470 | { | |||||
3471 | dht_local_t *local = NULL((void*)0); | |||||
3472 | xlator_t *cached_subvol = NULL((void*)0); | |||||
3473 | ||||||
3474 | if (op_ret == -1) | |||||
3475 | goto err; | |||||
3476 | ||||||
3477 | local = frame->local; | |||||
3478 | if (!local || !local->cached_subvol) { | |||||
3479 | op_errno = EINVAL22; | |||||
3480 | goto err; | |||||
3481 | } | |||||
3482 | ||||||
3483 | cached_subvol = local->cached_subvol; | |||||
3484 | ||||||
3485 | STACK_WIND_COOKIE (frame, dht_newfile_cbk, (void *)cached_subvol,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3488, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = (void *)cached_subvol; _new->wind_from = __FUNCTION__; _new ->wind_to = "cached_subvol->fops->mknod"; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init (&_new->lock, 0 ); pthread_spin_lock (&frame->root->stack_lock); { frame ->ref_count++; _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock); cached_subvol->fops ->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (cached_subvol ->ctx->measure_latency) gf_latency_begin (_new, cached_subvol ->fops->mknod); cached_subvol->fops->mknod (_new, cached_subvol, &local->loc, local->mode, local-> rdev, local->umask, local->params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3486 | cached_subvol, cached_subvol->fops->mknod,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3488, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = (void *)cached_subvol; _new->wind_from = __FUNCTION__; _new ->wind_to = "cached_subvol->fops->mknod"; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init (&_new->lock, 0 ); pthread_spin_lock (&frame->root->stack_lock); { frame ->ref_count++; _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock); cached_subvol->fops ->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (cached_subvol ->ctx->measure_latency) gf_latency_begin (_new, cached_subvol ->fops->mknod); cached_subvol->fops->mknod (_new, cached_subvol, &local->loc, local->mode, local-> rdev, local->umask, local->params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3487 | &local->loc, local->mode, local->rdev, local->umask,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3488, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = (void *)cached_subvol; _new->wind_from = __FUNCTION__; _new ->wind_to = "cached_subvol->fops->mknod"; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init (&_new->lock, 0 ); pthread_spin_lock (&frame->root->stack_lock); { frame ->ref_count++; _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock); cached_subvol->fops ->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (cached_subvol ->ctx->measure_latency) gf_latency_begin (_new, cached_subvol ->fops->mknod); cached_subvol->fops->mknod (_new, cached_subvol, &local->loc, local->mode, local-> rdev, local->umask, local->params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3488 | local->params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3488, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = (void *)cached_subvol; _new->wind_from = __FUNCTION__; _new ->wind_to = "cached_subvol->fops->mknod"; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init (&_new->lock, 0 ); pthread_spin_lock (&frame->root->stack_lock); { frame ->ref_count++; _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock); cached_subvol->fops ->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (cached_subvol ->ctx->measure_latency) gf_latency_begin (_new, cached_subvol ->fops->mknod); cached_subvol->fops->mknod (_new, cached_subvol, &local->loc, local->mode, local-> rdev, local->umask, local->params); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3489 | ||||||
3490 | return 0; | |||||
3491 | err: | |||||
3492 | DHT_STACK_UNWIND (mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mknod_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3493, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mknod_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3493 | NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mknod_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3493, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mknod_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3494 | return 0; | |||||
3495 | } | |||||
3496 | ||||||
3497 | int | |||||
3498 | dht_mknod (call_frame_t *frame, xlator_t *this, | |||||
3499 | loc_t *loc, mode_t mode, dev_t rdev, mode_t umask, dict_t *params) | |||||
3500 | { | |||||
3501 | xlator_t *subvol = NULL((void*)0); | |||||
3502 | int op_errno = -1; | |||||
3503 | xlator_t *avail_subvol = NULL((void*)0); | |||||
3504 | dht_local_t *local = NULL((void*)0); | |||||
3505 | ||||||
3506 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3506, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3507 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3507, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3508 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3508, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
3509 | ||||||
3510 | dht_get_du_info (frame, this, loc); | |||||
3511 | ||||||
3512 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_MKNOD); | |||||
3513 | if (!local) { | |||||
3514 | op_errno = ENOMEM12; | |||||
3515 | goto err; | |||||
3516 | } | |||||
3517 | ||||||
3518 | subvol = dht_subvol_get_hashed (this, loc); | |||||
3519 | if (!subvol) { | |||||
3520 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3522, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0) | |||||
3521 | "no subvolume in layout for path=%s",do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3522, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0) | |||||
3522 | loc->path)do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3522, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0); | |||||
3523 | op_errno = ENOENT2; | |||||
3524 | goto err; | |||||
3525 | } | |||||
3526 | ||||||
3527 | if (!dht_is_subvol_filled (this, subvol)) { | |||||
3528 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3529, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0) | |||||
3529 | "creating %s on %s", loc->path, subvol->name)do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3529, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0); | |||||
3530 | ||||||
3531 | STACK_WIND_COOKIE (frame, dht_newfile_cbk, (void *)subvol,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3533, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->mknod" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location( )) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->mknod); subvol->fops->mknod (_new, subvol, loc, mode, rdev, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3532 | subvol, subvol->fops->mknod, loc, mode,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3533, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->mknod" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location( )) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->mknod); subvol->fops->mknod (_new, subvol, loc, mode, rdev, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3533 | rdev, umask, params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3533, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->mknod" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location( )) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->mknod); subvol->fops->mknod (_new, subvol, loc, mode, rdev, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3534 | } else { | |||||
3535 | avail_subvol = dht_free_disk_available_subvol (this, subvol); | |||||
3536 | if (avail_subvol != subvol) { | |||||
3537 | /* Choose the minimum filled volume, and create the | |||||
3538 | files there */ | |||||
3539 | ||||||
3540 | local->params = dict_ref (params); | |||||
3541 | local->cached_subvol = avail_subvol; | |||||
3542 | local->mode = mode; | |||||
3543 | local->rdev = rdev; | |||||
3544 | local->umask = umask; | |||||
3545 | dht_linkfile_create (frame, | |||||
3546 | dht_mknod_linkfile_create_cbk, | |||||
3547 | this, avail_subvol, subvol, loc); | |||||
3548 | } else { | |||||
3549 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3550, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0) | |||||
3550 | "creating %s on %s", loc->path, subvol->name)do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3550, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0); | |||||
3551 | ||||||
3552 | STACK_WIND_COOKIE (frame, dht_newfile_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3555, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->mknod" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location( )) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->mknod); subvol->fops->mknod (_new, subvol, loc, mode, rdev, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3553 | (void *)subvol, subvol,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3555, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->mknod" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location( )) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->mknod); subvol->fops->mknod (_new, subvol, loc, mode, rdev, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3554 | subvol->fops->mknod, loc, mode,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3555, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->mknod" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location( )) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->mknod); subvol->fops->mknod (_new, subvol, loc, mode, rdev, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3555 | rdev, umask, params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3555, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->mknod_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->mknod" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->mknod_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location( )) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->mknod); subvol->fops->mknod (_new, subvol, loc, mode, rdev, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3556 | } | |||||
3557 | } | |||||
3558 | ||||||
3559 | return 0; | |||||
3560 | ||||||
3561 | err: | |||||
3562 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
3563 | DHT_STACK_UNWIND (mknod, frame, -1, op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mknod_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3564, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mknod_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3564 | NULL, NULL, NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mknod_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3564, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mknod_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3565 | ||||||
3566 | return 0; | |||||
3567 | } | |||||
3568 | ||||||
3569 | ||||||
3570 | int | |||||
3571 | dht_symlink (call_frame_t *frame, xlator_t *this, | |||||
3572 | const char *linkname, loc_t *loc, mode_t umask, dict_t *params) | |||||
3573 | { | |||||
3574 | xlator_t *subvol = NULL((void*)0); | |||||
3575 | int op_errno = -1; | |||||
3576 | dht_local_t *local = NULL((void*)0); | |||||
3577 | ||||||
3578 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3578, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3579 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3579, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3580 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3580, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
3581 | ||||||
3582 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_SYMLINK); | |||||
3583 | if (!local) { | |||||
3584 | op_errno = ENOMEM12; | |||||
3585 | goto err; | |||||
3586 | } | |||||
3587 | ||||||
3588 | subvol = dht_subvol_get_hashed (this, loc); | |||||
3589 | if (!subvol) { | |||||
3590 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3592, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0) | |||||
3591 | "no subvolume in layout for path=%s",do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3592, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0) | |||||
3592 | loc->path)do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3592, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0); | |||||
3593 | op_errno = ENOENT2; | |||||
3594 | goto err; | |||||
3595 | } | |||||
3596 | ||||||
3597 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3598, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0) | |||||
3598 | "creating %s on %s", loc->path, subvol->name)do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3598, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0); | |||||
3599 | ||||||
3600 | STACK_WIND_COOKIE (frame, dht_newfile_cbk, (void *)subvol, subvol,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3602, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->symlink_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->symlink" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->symlink_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->symlink); subvol->fops->symlink (_new, subvol, linkname, loc, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3601 | subvol->fops->symlink, linkname, loc, umask,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3602, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->symlink_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->symlink" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->symlink_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->symlink); subvol->fops->symlink (_new, subvol, linkname, loc, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3602 | params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3602, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->symlink_cbk) tmp_cbk = dht_newfile_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = (void *)subvol; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->symlink" ; _new->unwind_to = "dht_newfile_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { frame->ref_count++; _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; } pthread_spin_unlock (&frame->root->stack_lock ); subvol->fops->symlink_cbk = dht_newfile_cbk; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (subvol->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->symlink); subvol->fops->symlink (_new, subvol, linkname, loc, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3603 | ||||||
3604 | return 0; | |||||
3605 | ||||||
3606 | err: | |||||
3607 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
3608 | DHT_STACK_UNWIND (link, frame, -1, op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_link_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3609, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_link_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3609 | NULL, NULL, NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_link_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3609, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_link_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3610 | ||||||
3611 | return 0; | |||||
3612 | } | |||||
3613 | ||||||
3614 | ||||||
3615 | int | |||||
3616 | dht_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag, | |||||
3617 | dict_t *xdata) | |||||
3618 | { | |||||
3619 | xlator_t *cached_subvol = NULL((void*)0); | |||||
3620 | xlator_t *hashed_subvol = NULL((void*)0); | |||||
3621 | int op_errno = -1; | |||||
3622 | dht_local_t *local = NULL((void*)0); | |||||
3623 | ||||||
3624 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3624, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3625 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3625, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3626 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3626, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
3627 | ||||||
3628 | if (dht_filter_loc_subvol_key (this, loc, &local->loc, | |||||
3629 | &cached_subvol)) { | |||||
3630 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("unlinking %s on %s (given path %s)" , local->loc.path, cached_subvol->name, loc->path); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 3632, GF_LOG_INFO, "unlinking %s on %s (given path %s)", local ->loc.path, cached_subvol->name, loc->path); } while (0) | |||||
3631 | "unlinking %s on %s (given path %s)",do { do { if (0) printf ("unlinking %s on %s (given path %s)" , local->loc.path, cached_subvol->name, loc->path); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 3632, GF_LOG_INFO, "unlinking %s on %s (given path %s)", local ->loc.path, cached_subvol->name, loc->path); } while (0) | |||||
3632 | local->loc.path, cached_subvol->name, loc->path)do { do { if (0) printf ("unlinking %s on %s (given path %s)" , local->loc.path, cached_subvol->name, loc->path); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 3632, GF_LOG_INFO, "unlinking %s on %s (given path %s)", local ->loc.path, cached_subvol->name, loc->path); } while (0); | |||||
3633 | STACK_WIND (frame, dht_unlink_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3635, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, &local->loc, xflag, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3634 | cached_subvol, cached_subvol->fops->unlink,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3635, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, &local->loc, xflag, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3635 | &local->loc, xflag, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3635, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, &local->loc, xflag, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3636 | goto done; | |||||
3637 | } | |||||
3638 | ||||||
3639 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_UNLINK); | |||||
3640 | if (!local) { | |||||
3641 | op_errno = ENOMEM12; | |||||
3642 | ||||||
3643 | goto err; | |||||
3644 | } | |||||
3645 | ||||||
3646 | hashed_subvol = dht_subvol_get_hashed (this, loc); | |||||
3647 | if (!hashed_subvol) { | |||||
3648 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3650, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0) | |||||
3649 | "no subvolume in layout for path=%s",do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3650, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0) | |||||
3650 | loc->path)do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3650, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0); | |||||
3651 | op_errno = EINVAL22; | |||||
3652 | goto err; | |||||
3653 | } | |||||
3654 | ||||||
3655 | cached_subvol = local->cached_subvol; | |||||
3656 | if (!cached_subvol) { | |||||
3657 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3658, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0) | |||||
3658 | "no cached subvolume for path=%s", loc->path)do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3658, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0); | |||||
3659 | op_errno = EINVAL22; | |||||
3660 | goto err; | |||||
3661 | } | |||||
3662 | ||||||
3663 | local->flags = xflag; | |||||
3664 | if (hashed_subvol != cached_subvol) { | |||||
3665 | STACK_WIND (frame, dht_unlink_linkfile_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3667, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_linkfile_cbk; _new ->root = frame->root; _new->this = hashed_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_linkfile_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->unlink); hashed_subvol->fops-> unlink (_new, hashed_subvol, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3666 | hashed_subvol, hashed_subvol->fops->unlink, loc,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3667, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_linkfile_cbk; _new ->root = frame->root; _new->this = hashed_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_linkfile_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->unlink); hashed_subvol->fops-> unlink (_new, hashed_subvol, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3667 | xflag, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3667, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_linkfile_cbk; _new ->root = frame->root; _new->this = hashed_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_linkfile_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->unlink); hashed_subvol->fops-> unlink (_new, hashed_subvol, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3668 | } else { | |||||
3669 | STACK_WIND (frame, dht_unlink_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3671, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3670 | cached_subvol, cached_subvol->fops->unlink, loc,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3671, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3671 | xflag, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3671, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->unlink_cbk) tmp_cbk = dht_unlink_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->unlink"; _new->unwind_to = "dht_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->unlink); cached_subvol->fops-> unlink (_new, cached_subvol, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3672 | } | |||||
3673 | done: | |||||
3674 | return 0; | |||||
3675 | err: | |||||
3676 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
3677 | DHT_STACK_UNWIND (unlink, frame, -1, op_errno, NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_unlink_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3677, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_unlink_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3678 | ||||||
3679 | return 0; | |||||
3680 | } | |||||
3681 | ||||||
3682 | ||||||
3683 | int | |||||
3684 | dht_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3685 | int op_ret, int op_errno, | |||||
3686 | inode_t *inode, struct iatt *stbuf, struct iatt *preparent, | |||||
3687 | struct iatt *postparent, dict_t *xdata) | |||||
3688 | { | |||||
3689 | call_frame_t *prev = NULL((void*)0); | |||||
3690 | dht_layout_t *layout = NULL((void*)0); | |||||
3691 | dht_local_t *local = NULL((void*)0); | |||||
3692 | ||||||
3693 | prev = cookie; | |||||
3694 | ||||||
3695 | local = frame->local; | |||||
3696 | ||||||
3697 | if (op_ret == -1) | |||||
3698 | goto out; | |||||
3699 | ||||||
3700 | layout = dht_layout_for_subvol (this, prev->this); | |||||
3701 | if (!layout) { | |||||
3702 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no pre-set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 3704, GF_LOG_DEBUG, "no pre-set layout for subvolume %s" , prev->this->name); } while (0) | |||||
3703 | "no pre-set layout for subvolume %s",do { do { if (0) printf ("no pre-set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 3704, GF_LOG_DEBUG, "no pre-set layout for subvolume %s" , prev->this->name); } while (0) | |||||
3704 | prev->this->name)do { do { if (0) printf ("no pre-set layout for subvolume %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 3704, GF_LOG_DEBUG, "no pre-set layout for subvolume %s" , prev->this->name); } while (0); | |||||
3705 | op_ret = -1; | |||||
3706 | op_errno = EINVAL22; | |||||
3707 | goto out; | |||||
3708 | } | |||||
3709 | ||||||
3710 | if (local->loc.parent) { | |||||
3711 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
3712 | preparent, 0); | |||||
3713 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
3714 | postparent, 1); | |||||
3715 | } | |||||
3716 | if (local->linked == _gf_true) { | |||||
3717 | local->stbuf = *stbuf; | |||||
3718 | dht_linkfile_attr_heal (frame, this); | |||||
3719 | } | |||||
3720 | out: | |||||
3721 | DHT_STRIP_PHASE1_FLAGS (stbuf)do { if ((stbuf) && ( ((stbuf)->ia_type == IA_IFREG ) && ((stbuf)->ia_prot.sticky == 1) && ((stbuf )->ia_prot.sgid == 1))) { (stbuf)->ia_prot.sticky = 0; ( stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
3722 | DHT_STACK_UNWIND (link, frame, op_ret, op_errno, inode, stbuf, preparent,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_link_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3723, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_link_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, preparent, postparent , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3723 | postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_link_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3723, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_link_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, preparent, postparent , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3724 | ||||||
3725 | return 0; | |||||
3726 | } | |||||
3727 | ||||||
3728 | ||||||
3729 | int | |||||
3730 | dht_link_linkfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3731 | int op_ret, int op_errno, | |||||
3732 | inode_t *inode, struct iatt *stbuf, | |||||
3733 | struct iatt *preparent, struct iatt *postparent, | |||||
3734 | dict_t *xdata) | |||||
3735 | { | |||||
3736 | dht_local_t *local = NULL((void*)0); | |||||
3737 | xlator_t *srcvol = NULL((void*)0); | |||||
3738 | ||||||
3739 | if (op_ret == -1) | |||||
3740 | goto err; | |||||
3741 | ||||||
3742 | local = frame->local; | |||||
3743 | srcvol = local->linkfile.srcvol; | |||||
3744 | ||||||
3745 | STACK_WIND (frame, dht_link_cbk, srcvol, srcvol->fops->link,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3746, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( srcvol->fops ->link_cbk) tmp_cbk = dht_link_cbk; _new->root = frame-> root; _new->this = srcvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "srcvol->fops->link" ; _new->unwind_to = "dht_link_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = srcvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, srcvol->fops->link); srcvol-> fops->link (_new, srcvol, &local->loc, &local-> loc2, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3746 | &local->loc, &local->loc2, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3746, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( srcvol->fops ->link_cbk) tmp_cbk = dht_link_cbk; _new->root = frame-> root; _new->this = srcvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "srcvol->fops->link" ; _new->unwind_to = "dht_link_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = srcvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, srcvol->fops->link); srcvol-> fops->link (_new, srcvol, &local->loc, &local-> loc2, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3747 | ||||||
3748 | return 0; | |||||
3749 | ||||||
3750 | err: | |||||
3751 | DHT_STRIP_PHASE1_FLAGS (stbuf)do { if ((stbuf) && ( ((stbuf)->ia_type == IA_IFREG ) && ((stbuf)->ia_prot.sticky == 1) && ((stbuf )->ia_prot.sgid == 1))) { (stbuf)->ia_prot.sticky = 0; ( stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
3752 | DHT_STACK_UNWIND (link, frame, op_ret, op_errno, inode, stbuf, preparent,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_link_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3753, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_link_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, preparent, postparent , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3753 | postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_link_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3753, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_link_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, inode, stbuf, preparent, postparent , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3754 | ||||||
3755 | return 0; | |||||
3756 | } | |||||
3757 | ||||||
3758 | ||||||
3759 | int | |||||
3760 | dht_link (call_frame_t *frame, xlator_t *this, | |||||
3761 | loc_t *oldloc, loc_t *newloc, dict_t *xdata) | |||||
3762 | { | |||||
3763 | xlator_t *cached_subvol = NULL((void*)0); | |||||
3764 | xlator_t *hashed_subvol = NULL((void*)0); | |||||
3765 | int op_errno = -1; | |||||
3766 | int ret = -1; | |||||
3767 | dht_local_t *local = NULL((void*)0); | |||||
3768 | ||||||
3769 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3769, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3770 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3770, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3771 | VALIDATE_OR_GOTO (oldloc, err)do { if (!oldloc) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "oldloc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3771, GF_LOG_WARNING, "invalid argument: " "oldloc" ); } while (0); goto err; } } while (0); | |||||
3772 | VALIDATE_OR_GOTO (newloc, err)do { if (!newloc) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "newloc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3772, GF_LOG_WARNING, "invalid argument: " "newloc" ); } while (0); goto err; } } while (0); | |||||
3773 | ||||||
3774 | local = dht_local_init (frame, oldloc, NULL((void*)0), GF_FOP_LINK); | |||||
3775 | if (!local) { | |||||
3776 | op_errno = ENOMEM12; | |||||
3777 | ||||||
3778 | goto err; | |||||
3779 | } | |||||
3780 | ||||||
3781 | cached_subvol = local->cached_subvol; | |||||
3782 | if (!cached_subvol) { | |||||
3783 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for path=%s", oldloc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3784, GF_LOG_DEBUG, "no cached subvolume for path=%s" , oldloc->path); } while (0) | |||||
3784 | "no cached subvolume for path=%s", oldloc->path)do { do { if (0) printf ("no cached subvolume for path=%s", oldloc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3784, GF_LOG_DEBUG, "no cached subvolume for path=%s" , oldloc->path); } while (0); | |||||
3785 | op_errno = EINVAL22; | |||||
3786 | goto err; | |||||
3787 | } | |||||
3788 | ||||||
3789 | hashed_subvol = dht_subvol_get_hashed (this, newloc); | |||||
3790 | if (!hashed_subvol) { | |||||
3791 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no subvolume in layout for path=%s" , newloc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3793, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , newloc->path); } while (0) | |||||
3792 | "no subvolume in layout for path=%s",do { do { if (0) printf ("no subvolume in layout for path=%s" , newloc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3793, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , newloc->path); } while (0) | |||||
3793 | newloc->path)do { do { if (0) printf ("no subvolume in layout for path=%s" , newloc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3793, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , newloc->path); } while (0); | |||||
3794 | op_errno = EINVAL22; | |||||
3795 | goto err; | |||||
3796 | } | |||||
3797 | ||||||
3798 | ret = loc_copy (&local->loc2, newloc); | |||||
3799 | if (ret == -1) { | |||||
3800 | op_errno = ENOMEM12; | |||||
3801 | goto err; | |||||
3802 | } | |||||
3803 | ||||||
3804 | if (hashed_subvol != cached_subvol) { | |||||
3805 | uuid_copy (local->gfid, oldloc->inode->gfid); | |||||
3806 | dht_linkfile_create (frame, dht_link_linkfile_cbk, this, | |||||
3807 | cached_subvol, hashed_subvol, newloc); | |||||
3808 | } else { | |||||
3809 | STACK_WIND (frame, dht_link_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3811, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->link_cbk) tmp_cbk = dht_link_cbk; _new->root = frame->root; _new->this = cached_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->link"; _new->unwind_to = "dht_link_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->link); cached_subvol->fops-> link (_new, cached_subvol, oldloc, newloc, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3810 | cached_subvol, cached_subvol->fops->link,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3811, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->link_cbk) tmp_cbk = dht_link_cbk; _new->root = frame->root; _new->this = cached_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->link"; _new->unwind_to = "dht_link_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->link); cached_subvol->fops-> link (_new, cached_subvol, oldloc, newloc, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3811 | oldloc, newloc, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3811, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->link_cbk) tmp_cbk = dht_link_cbk; _new->root = frame->root; _new->this = cached_subvol; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->link"; _new->unwind_to = "dht_link_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->link); cached_subvol->fops-> link (_new, cached_subvol, oldloc, newloc, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3812 | } | |||||
3813 | ||||||
3814 | return 0; | |||||
3815 | ||||||
3816 | err: | |||||
3817 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
3818 | DHT_STACK_UNWIND (link, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_link_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3818, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_link_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent->ref_count --; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3819 | ||||||
3820 | return 0; | |||||
3821 | } | |||||
3822 | ||||||
3823 | ||||||
3824 | int | |||||
3825 | dht_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3826 | int op_ret, int op_errno, | |||||
3827 | fd_t *fd, inode_t *inode, struct iatt *stbuf, | |||||
3828 | struct iatt *preparent, struct iatt *postparent, dict_t *xdata) | |||||
3829 | { | |||||
3830 | call_frame_t *prev = NULL((void*)0); | |||||
3831 | int ret = -1; | |||||
3832 | dht_local_t *local = NULL((void*)0); | |||||
3833 | ||||||
3834 | if (op_ret == -1) | |||||
3835 | goto out; | |||||
3836 | ||||||
3837 | local = frame->local; | |||||
3838 | if (!local) { | |||||
3839 | op_ret = -1; | |||||
3840 | op_errno = EINVAL22; | |||||
3841 | goto out; | |||||
3842 | } | |||||
3843 | ||||||
3844 | prev = cookie; | |||||
3845 | ||||||
3846 | if (local->loc.parent) { | |||||
3847 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
3848 | preparent, 0); | |||||
3849 | ||||||
3850 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
3851 | postparent, 1); | |||||
3852 | } | |||||
3853 | ||||||
3854 | ret = dht_layout_preset (this, prev->this, inode); | |||||
3855 | if (ret != 0) { | |||||
3856 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("could not set preset layout for subvol %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 3858, GF_LOG_DEBUG, "could not set preset layout for subvol %s" , prev->this->name); } while (0) | |||||
3857 | "could not set preset layout for subvol %s",do { do { if (0) printf ("could not set preset layout for subvol %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 3858, GF_LOG_DEBUG, "could not set preset layout for subvol %s" , prev->this->name); } while (0) | |||||
3858 | prev->this->name)do { do { if (0) printf ("could not set preset layout for subvol %s" , prev->this->name); } while (0); _gf_log (this->name , "dht-common.c", __FUNCTION__, 3858, GF_LOG_DEBUG, "could not set preset layout for subvol %s" , prev->this->name); } while (0); | |||||
3859 | op_ret = -1; | |||||
3860 | op_errno = EINVAL22; | |||||
3861 | goto out; | |||||
3862 | } | |||||
3863 | if (local->linked == _gf_true) { | |||||
3864 | local->stbuf = *stbuf; | |||||
3865 | dht_linkfile_attr_heal (frame, this); | |||||
3866 | } | |||||
3867 | out: | |||||
3868 | DHT_STRIP_PHASE1_FLAGS (stbuf)do { if ((stbuf) && ( ((stbuf)->ia_type == IA_IFREG ) && ((stbuf)->ia_prot.sticky == 1) && ((stbuf )->ia_prot.sgid == 1))) { (stbuf)->ia_prot.sticky = 0; ( stbuf)->ia_prot.sgid = 0; } } while (0); | |||||
3869 | DHT_STACK_UNWIND (create, frame, op_ret, op_errno, fd, inode, stbuf, preparent,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_create_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3870, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_create_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, fd, inode, stbuf, preparent, postparent , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3870 | postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_create_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3870, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_create_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, fd, inode, stbuf, preparent, postparent , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3871 | return 0; | |||||
3872 | } | |||||
3873 | ||||||
3874 | ||||||
3875 | int | |||||
3876 | dht_create_linkfile_create_cbk (call_frame_t *frame, void *cookie, | |||||
3877 | xlator_t *this, | |||||
3878 | int32_t op_ret, int32_t op_errno, | |||||
3879 | inode_t *inode, struct iatt *stbuf, | |||||
3880 | struct iatt *preparent, struct iatt *postparent, | |||||
3881 | dict_t *xdata) | |||||
3882 | { | |||||
3883 | dht_local_t *local = NULL((void*)0); | |||||
3884 | xlator_t *cached_subvol = NULL((void*)0); | |||||
3885 | ||||||
3886 | if (op_ret == -1) | |||||
3887 | goto err; | |||||
3888 | ||||||
3889 | local = frame->local; | |||||
3890 | cached_subvol = local->cached_subvol; | |||||
3891 | ||||||
3892 | STACK_WIND (frame, dht_create_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3895, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->create_cbk) tmp_cbk = dht_create_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->create"; _new->unwind_to = "dht_create_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->create); cached_subvol->fops-> create (_new, cached_subvol, &local->loc, local->flags , local->mode, local->umask, local->fd, local->params ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3893 | cached_subvol, cached_subvol->fops->create,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3895, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->create_cbk) tmp_cbk = dht_create_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->create"; _new->unwind_to = "dht_create_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->create); cached_subvol->fops-> create (_new, cached_subvol, &local->loc, local->flags , local->mode, local->umask, local->fd, local->params ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3894 | &local->loc, local->flags, local->mode,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3895, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->create_cbk) tmp_cbk = dht_create_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->create"; _new->unwind_to = "dht_create_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->create); cached_subvol->fops-> create (_new, cached_subvol, &local->loc, local->flags , local->mode, local->umask, local->fd, local->params ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3895 | local->umask, local->fd, local->params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3895, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( cached_subvol ->fops->create_cbk) tmp_cbk = dht_create_cbk; _new-> root = frame->root; _new->this = cached_subvol; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "cached_subvol->fops->create"; _new->unwind_to = "dht_create_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = cached_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , cached_subvol->fops->create); cached_subvol->fops-> create (_new, cached_subvol, &local->loc, local->flags , local->mode, local->umask, local->fd, local->params ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3896 | ||||||
3897 | return 0; | |||||
3898 | err: | |||||
3899 | DHT_STACK_UNWIND (create, frame, -1, op_errno, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_create_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3900, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_create_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3900 | NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_create_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3900, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_create_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3901 | return 0; | |||||
3902 | } | |||||
3903 | ||||||
3904 | int | |||||
3905 | dht_create (call_frame_t *frame, xlator_t *this, | |||||
3906 | loc_t *loc, int32_t flags, mode_t mode, | |||||
3907 | mode_t umask, fd_t *fd, dict_t *params) | |||||
3908 | { | |||||
3909 | int op_errno = -1; | |||||
3910 | xlator_t *subvol = NULL((void*)0); | |||||
3911 | dht_local_t *local = NULL((void*)0); | |||||
3912 | xlator_t *avail_subvol = NULL((void*)0); | |||||
3913 | ||||||
3914 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3914, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3915 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3915, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3916 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 3916, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
3917 | ||||||
3918 | dht_get_du_info (frame, this, loc); | |||||
3919 | ||||||
3920 | local = dht_local_init (frame, loc, fd, GF_FOP_CREATE); | |||||
3921 | if (!local) { | |||||
3922 | op_errno = ENOMEM12; | |||||
3923 | goto err; | |||||
3924 | } | |||||
3925 | ||||||
3926 | if (dht_filter_loc_subvol_key (this, loc, &local->loc, | |||||
3927 | &subvol)) { | |||||
3928 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("creating %s on %s (got create on %s)" , local->loc.path, subvol->name, loc->path); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3930 , GF_LOG_INFO, "creating %s on %s (got create on %s)", local-> loc.path, subvol->name, loc->path); } while (0) | |||||
3929 | "creating %s on %s (got create on %s)",do { do { if (0) printf ("creating %s on %s (got create on %s)" , local->loc.path, subvol->name, loc->path); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3930 , GF_LOG_INFO, "creating %s on %s (got create on %s)", local-> loc.path, subvol->name, loc->path); } while (0) | |||||
3930 | local->loc.path, subvol->name, loc->path)do { do { if (0) printf ("creating %s on %s (got create on %s)" , local->loc.path, subvol->name, loc->path); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3930 , GF_LOG_INFO, "creating %s on %s (got create on %s)", local-> loc.path, subvol->name, loc->path); } while (0); | |||||
3931 | STACK_WIND (frame, dht_create_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3933, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, &local->loc, flags, mode , umask, fd, params); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
3932 | subvol, subvol->fops->create,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3933, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, &local->loc, flags, mode , umask, fd, params); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
3933 | &local->loc, flags, mode, umask, fd, params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3933, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, &local->loc, flags, mode , umask, fd, params); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
3934 | goto done; | |||||
3935 | } | |||||
3936 | ||||||
3937 | subvol = dht_subvol_get_hashed (this, loc); | |||||
3938 | if (!subvol) { | |||||
3939 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3941, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0) | |||||
3940 | "no subvolume in layout for path=%s",do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3941, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0) | |||||
3941 | loc->path)do { do { if (0) printf ("no subvolume in layout for path=%s" , loc->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3941, GF_LOG_DEBUG, "no subvolume in layout for path=%s" , loc->path); } while (0); | |||||
3942 | op_errno = ENOENT2; | |||||
3943 | goto err; | |||||
3944 | } | |||||
3945 | ||||||
3946 | if (!dht_is_subvol_filled (this, subvol)) { | |||||
3947 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3948, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0) | |||||
3948 | "creating %s on %s", loc->path, subvol->name)do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3948, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0); | |||||
3949 | STACK_WIND (frame, dht_create_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3951, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, loc, flags, mode, umask, fd, params ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3950 | subvol, subvol->fops->create,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3951, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, loc, flags, mode, umask, fd, params ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3951 | loc, flags, mode, umask, fd, params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3951, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, loc, flags, mode, umask, fd, params ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3952 | goto done; | |||||
3953 | } | |||||
3954 | /* Choose the minimum filled volume, and create the | |||||
3955 | files there */ | |||||
3956 | avail_subvol = dht_free_disk_available_subvol (this, subvol); | |||||
3957 | if (avail_subvol != subvol) { | |||||
3958 | local->params = dict_ref (params); | |||||
3959 | local->flags = flags; | |||||
3960 | local->mode = mode; | |||||
3961 | local->umask = umask; | |||||
3962 | local->cached_subvol = avail_subvol; | |||||
3963 | local->hashed_subvol = subvol; | |||||
3964 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("creating %s on %s (link at %s)", loc ->path, avail_subvol->name, subvol->name); } while ( 0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3966 , GF_LOG_TRACE, "creating %s on %s (link at %s)", loc->path , avail_subvol->name, subvol->name); } while (0) | |||||
3965 | "creating %s on %s (link at %s)", loc->path,do { do { if (0) printf ("creating %s on %s (link at %s)", loc ->path, avail_subvol->name, subvol->name); } while ( 0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3966 , GF_LOG_TRACE, "creating %s on %s (link at %s)", loc->path , avail_subvol->name, subvol->name); } while (0) | |||||
3966 | avail_subvol->name, subvol->name)do { do { if (0) printf ("creating %s on %s (link at %s)", loc ->path, avail_subvol->name, subvol->name); } while ( 0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 3966 , GF_LOG_TRACE, "creating %s on %s (link at %s)", loc->path , avail_subvol->name, subvol->name); } while (0); | |||||
3967 | dht_linkfile_create (frame, dht_create_linkfile_create_cbk, | |||||
3968 | this, avail_subvol, subvol, loc); | |||||
3969 | goto done; | |||||
3970 | } | |||||
3971 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3972, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0) | |||||
3972 | "creating %s on %s", loc->path, subvol->name)do { do { if (0) printf ("creating %s on %s", loc->path, subvol ->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 3972, GF_LOG_TRACE, "creating %s on %s", loc-> path, subvol->name); } while (0); | |||||
3973 | STACK_WIND (frame, dht_create_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3975, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, loc, flags, mode, umask, fd, params ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3974 | subvol, subvol->fops->create,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3975, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, loc, flags, mode, umask, fd, params ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3975 | loc, flags, mode, umask, fd, params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 3975, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->create_cbk) tmp_cbk = dht_create_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->create" ; _new->unwind_to = "dht_create_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->create); subvol-> fops->create (_new, subvol, loc, flags, mode, umask, fd, params ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3976 | done: | |||||
3977 | return 0; | |||||
3978 | ||||||
3979 | err: | |||||
3980 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
3981 | DHT_STACK_UNWIND (create, frame, -1, op_errno, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_create_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3982, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_create_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
3982 | NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_create_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 3982, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_create_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
3983 | ||||||
3984 | return 0; | |||||
3985 | } | |||||
3986 | ||||||
3987 | ||||||
3988 | int | |||||
3989 | dht_mkdir_selfheal_cbk (call_frame_t *frame, void *cookie, | |||||
3990 | xlator_t *this, | |||||
3991 | int32_t op_ret, int32_t op_errno, dict_t *xdata) | |||||
3992 | { | |||||
3993 | dht_local_t *local = NULL((void*)0); | |||||
3994 | dht_layout_t *layout = NULL((void*)0); | |||||
3995 | ||||||
3996 | local = frame->local; | |||||
3997 | layout = local->selfheal.layout; | |||||
3998 | ||||||
3999 | if (op_ret == 0) { | |||||
4000 | dht_layout_set (this, local->inode, layout); | |||||
4001 | if (local->loc.parent) { | |||||
4002 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
4003 | &local->preparent, 0); | |||||
4004 | ||||||
4005 | dht_inode_ctx_time_update (local->loc.parent, this, | |||||
4006 | &local->postparent, 1); | |||||
4007 | } | |||||
4008 | } | |||||
4009 | ||||||
4010 | DHT_STACK_UNWIND (mkdir, frame, op_ret, op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mkdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4012, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mkdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, local->inode, &local-> stbuf, &local->preparent, &local->postparent, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4011 | local->inode, &local->stbuf, &local->preparent,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mkdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4012, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mkdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, local->inode, &local-> stbuf, &local->preparent, &local->postparent, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4012 | &local->postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mkdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4012, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mkdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, local->inode, &local-> stbuf, &local->preparent, &local->postparent, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4013 | ||||||
4014 | return 0; | |||||
4015 | } | |||||
4016 | ||||||
4017 | int | |||||
4018 | dht_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4019 | int op_ret, int op_errno, inode_t *inode, struct iatt *stbuf, | |||||
4020 | struct iatt *preparent, struct iatt *postparent, dict_t *xdata) | |||||
4021 | { | |||||
4022 | dht_local_t *local = NULL((void*)0); | |||||
4023 | int this_call_cnt = 0; | |||||
4024 | int ret = -1; | |||||
4025 | gf_boolean_t subvol_filled = _gf_false; | |||||
4026 | call_frame_t *prev = NULL((void*)0); | |||||
4027 | dht_layout_t *layout = NULL((void*)0); | |||||
4028 | ||||||
4029 | local = frame->local; | |||||
4030 | prev = cookie; | |||||
4031 | layout = local->layout; | |||||
4032 | ||||||
4033 | subvol_filled = dht_is_subvol_filled (this, prev->this); | |||||
4034 | ||||||
4035 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4036 | { | |||||
4037 | if (subvol_filled && (op_ret != -1)) { | |||||
4038 | ret = dht_layout_merge (this, layout, prev->this, | |||||
4039 | -1, ENOSPC28, NULL((void*)0)); | |||||
4040 | } else { | |||||
4041 | if (op_ret == -1 && op_errno == EEXIST17) | |||||
4042 | /* Very likely just a race between mkdir and | |||||
4043 | self-heal (from lookup of a concurrent mkdir | |||||
4044 | attempt). | |||||
4045 | Ignore error for now. layout setting will | |||||
4046 | anyways fail if this was a different (old) | |||||
4047 | pre-existing different directory. | |||||
4048 | */ | |||||
4049 | op_ret = 0; | |||||
4050 | ret = dht_layout_merge (this, layout, prev->this, | |||||
4051 | op_ret, op_errno, NULL((void*)0)); | |||||
4052 | } | |||||
4053 | if (ret) | |||||
4054 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: failed to merge layouts", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4055, GF_LOG_WARNING, "%s: failed to merge layouts" , local->loc.path); } while (0) | |||||
4055 | "%s: failed to merge layouts", local->loc.path)do { do { if (0) printf ("%s: failed to merge layouts", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4055, GF_LOG_WARNING, "%s: failed to merge layouts" , local->loc.path); } while (0); | |||||
4056 | ||||||
4057 | if (op_ret == -1) { | |||||
4058 | local->op_errno = op_errno; | |||||
4059 | goto unlock; | |||||
4060 | } | |||||
4061 | dht_iatt_merge (this, &local->stbuf, stbuf, prev->this); | |||||
4062 | dht_iatt_merge (this, &local->preparent, preparent, prev->this); | |||||
4063 | dht_iatt_merge (this, &local->postparent, postparent, | |||||
4064 | prev->this); | |||||
4065 | } | |||||
4066 | unlock: | |||||
4067 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4068 | ||||||
4069 | this_call_cnt = dht_frame_return (frame); | |||||
4070 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
4071 | dht_selfheal_new_directory (frame, dht_mkdir_selfheal_cbk, | |||||
4072 | layout); | |||||
4073 | } | |||||
4074 | ||||||
4075 | return 0; | |||||
4076 | } | |||||
4077 | ||||||
4078 | int | |||||
4079 | dht_mkdir_hashed_cbk (call_frame_t *frame, void *cookie, | |||||
4080 | xlator_t *this, int op_ret, int op_errno, | |||||
4081 | inode_t *inode, struct iatt *stbuf, | |||||
4082 | struct iatt *preparent, struct iatt *postparent, | |||||
4083 | dict_t *xdata) | |||||
4084 | { | |||||
4085 | dht_local_t *local = NULL((void*)0); | |||||
4086 | int ret = -1; | |||||
4087 | call_frame_t *prev = NULL((void*)0); | |||||
4088 | dht_layout_t *layout = NULL((void*)0); | |||||
4089 | dht_conf_t *conf = NULL((void*)0); | |||||
4090 | int i = 0; | |||||
4091 | xlator_t *hashed_subvol = NULL((void*)0); | |||||
4092 | ||||||
4093 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4093, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
4094 | ||||||
4095 | local = frame->local; | |||||
4096 | prev = cookie; | |||||
4097 | layout = local->layout; | |||||
4098 | conf = this->private; | |||||
4099 | hashed_subvol = local->hashed_subvol; | |||||
4100 | ||||||
4101 | if (uuid_is_null (local->loc.gfid) && !op_ret) | |||||
4102 | uuid_copy (local->loc.gfid, stbuf->ia_gfid); | |||||
4103 | ||||||
4104 | if (dht_is_subvol_filled (this, hashed_subvol)) | |||||
4105 | ret = dht_layout_merge (this, layout, prev->this, | |||||
4106 | -1, ENOSPC28, NULL((void*)0)); | |||||
4107 | else | |||||
4108 | ret = dht_layout_merge (this, layout, prev->this, | |||||
4109 | op_ret, op_errno, NULL((void*)0)); | |||||
4110 | ||||||
4111 | /* TODO: we may have to return from the function | |||||
4112 | if layout merge fails. For now, lets just log an error */ | |||||
4113 | if (ret) | |||||
4114 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: failed to merge layouts", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4115, GF_LOG_WARNING, "%s: failed to merge layouts" , local->loc.path); } while (0) | |||||
4115 | "%s: failed to merge layouts", local->loc.path)do { do { if (0) printf ("%s: failed to merge layouts", local ->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4115, GF_LOG_WARNING, "%s: failed to merge layouts" , local->loc.path); } while (0); | |||||
4116 | ||||||
4117 | if (op_ret == -1) { | |||||
4118 | local->op_errno = op_errno; | |||||
4119 | goto err; | |||||
4120 | } | |||||
4121 | local->op_ret = 0; | |||||
4122 | ||||||
4123 | dht_iatt_merge (this, &local->stbuf, stbuf, prev->this); | |||||
4124 | dht_iatt_merge (this, &local->preparent, preparent, prev->this); | |||||
4125 | dht_iatt_merge (this, &local->postparent, postparent, prev->this); | |||||
4126 | ||||||
4127 | local->call_cnt = conf->subvolume_cnt - 1; | |||||
4128 | ||||||
4129 | if (uuid_is_null (local->loc.gfid)) | |||||
4130 | uuid_copy (local->loc.gfid, stbuf->ia_gfid); | |||||
4131 | if (local->call_cnt == 0) { | |||||
4132 | dht_selfheal_directory (frame, dht_mkdir_selfheal_cbk, | |||||
4133 | &local->loc, layout); | |||||
4134 | } | |||||
4135 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
4136 | if (conf->subvolumes[i] == hashed_subvol) | |||||
4137 | continue; | |||||
4138 | STACK_WIND (frame, dht_mkdir_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4141, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->mkdir_cbk) tmp_cbk = dht_mkdir_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->mkdir"; _new ->unwind_to = "dht_mkdir_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->mkdir); conf-> subvolumes[i]->fops->mkdir (_new, conf->subvolumes[i ], &local->loc, local->mode, local->umask, local ->params); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4139 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4141, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->mkdir_cbk) tmp_cbk = dht_mkdir_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->mkdir"; _new ->unwind_to = "dht_mkdir_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->mkdir); conf-> subvolumes[i]->fops->mkdir (_new, conf->subvolumes[i ], &local->loc, local->mode, local->umask, local ->params); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4140 | conf->subvolumes[i]->fops->mkdir, &local->loc,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4141, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->mkdir_cbk) tmp_cbk = dht_mkdir_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->mkdir"; _new ->unwind_to = "dht_mkdir_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->mkdir); conf-> subvolumes[i]->fops->mkdir (_new, conf->subvolumes[i ], &local->loc, local->mode, local->umask, local ->params); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4141 | local->mode, local->umask, local->params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4141, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->mkdir_cbk) tmp_cbk = dht_mkdir_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->mkdir"; _new ->unwind_to = "dht_mkdir_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->mkdir); conf-> subvolumes[i]->fops->mkdir (_new, conf->subvolumes[i ], &local->loc, local->mode, local->umask, local ->params); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
4142 | } | |||||
4143 | return 0; | |||||
4144 | err: | |||||
4145 | DHT_STACK_UNWIND (mkdir, frame, -1, op_errno, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mkdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4146, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mkdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4146 | NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mkdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4146, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mkdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4147 | return 0; | |||||
4148 | } | |||||
4149 | ||||||
4150 | ||||||
4151 | int | |||||
4152 | dht_mkdir (call_frame_t *frame, xlator_t *this, | |||||
4153 | loc_t *loc, mode_t mode, mode_t umask, dict_t *params) | |||||
4154 | { | |||||
4155 | dht_local_t *local = NULL((void*)0); | |||||
4156 | dht_conf_t *conf = NULL((void*)0); | |||||
4157 | int op_errno = -1; | |||||
4158 | xlator_t *hashed_subvol = NULL((void*)0); | |||||
4159 | ||||||
4160 | ||||||
4161 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4161, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4162 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4162, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4163 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4163, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
4164 | VALIDATE_OR_GOTO (loc->inode, err)do { if (!loc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4164, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
4165 | VALIDATE_OR_GOTO (loc->path, err)do { if (!loc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4165, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
4166 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4166, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
4167 | ||||||
4168 | conf = this->private; | |||||
4169 | ||||||
4170 | dht_get_du_info (frame, this, loc); | |||||
4171 | ||||||
4172 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_MKDIR); | |||||
4173 | if (!local) { | |||||
4174 | op_errno = ENOMEM12; | |||||
4175 | goto err; | |||||
4176 | } | |||||
4177 | ||||||
4178 | hashed_subvol = dht_subvol_get_hashed (this, loc); | |||||
4179 | if (hashed_subvol == NULL((void*)0)) { | |||||
4180 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("hashed subvol not found for %s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4182, GF_LOG_DEBUG, "hashed subvol not found for %s" , loc->path); } while (0) | |||||
4181 | "hashed subvol not found for %s",do { do { if (0) printf ("hashed subvol not found for %s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4182, GF_LOG_DEBUG, "hashed subvol not found for %s" , loc->path); } while (0) | |||||
4182 | loc->path)do { do { if (0) printf ("hashed subvol not found for %s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4182, GF_LOG_DEBUG, "hashed subvol not found for %s" , loc->path); } while (0); | |||||
4183 | op_errno = EINVAL22; | |||||
4184 | goto err; | |||||
4185 | } | |||||
4186 | ||||||
4187 | local->hashed_subvol = hashed_subvol; | |||||
4188 | local->mode = mode; | |||||
4189 | local->umask = umask; | |||||
4190 | local->params = dict_ref (params); | |||||
4191 | local->inode = inode_ref (loc->inode); | |||||
4192 | ||||||
4193 | local->layout = dht_layout_new (this, conf->subvolume_cnt); | |||||
4194 | if (!local->layout) { | |||||
4195 | op_errno = ENOMEM12; | |||||
4196 | goto err; | |||||
4197 | } | |||||
4198 | ||||||
4199 | STACK_WIND (frame, dht_mkdir_hashed_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4202, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->mkdir_cbk) tmp_cbk = dht_mkdir_hashed_cbk; _new ->root = frame->root; _new->this = hashed_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->mkdir"; _new->unwind_to = "dht_mkdir_hashed_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->mkdir); hashed_subvol->fops-> mkdir (_new, hashed_subvol, loc, mode, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4200 | hashed_subvol,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4202, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->mkdir_cbk) tmp_cbk = dht_mkdir_hashed_cbk; _new ->root = frame->root; _new->this = hashed_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->mkdir"; _new->unwind_to = "dht_mkdir_hashed_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->mkdir); hashed_subvol->fops-> mkdir (_new, hashed_subvol, loc, mode, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4201 | hashed_subvol->fops->mkdir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4202, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->mkdir_cbk) tmp_cbk = dht_mkdir_hashed_cbk; _new ->root = frame->root; _new->this = hashed_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->mkdir"; _new->unwind_to = "dht_mkdir_hashed_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->mkdir); hashed_subvol->fops-> mkdir (_new, hashed_subvol, loc, mode, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4202 | loc, mode, umask, params)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4202, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( hashed_subvol ->fops->mkdir_cbk) tmp_cbk = dht_mkdir_hashed_cbk; _new ->root = frame->root; _new->this = hashed_subvol; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "hashed_subvol->fops->mkdir"; _new->unwind_to = "dht_mkdir_hashed_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = hashed_subvol; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , hashed_subvol->fops->mkdir); hashed_subvol->fops-> mkdir (_new, hashed_subvol, loc, mode, umask, params); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
4203 | ||||||
4204 | return 0; | |||||
4205 | ||||||
4206 | err: | |||||
4207 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
4208 | DHT_STACK_UNWIND (mkdir, frame, -1, op_errno, NULL, NULL, NULL,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mkdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4209, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mkdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4209 | NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_mkdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4209, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_mkdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0), ( (void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4210 | ||||||
4211 | return 0; | |||||
4212 | } | |||||
4213 | ||||||
4214 | ||||||
4215 | int | |||||
4216 | dht_rmdir_selfheal_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4217 | int op_ret, int op_errno, dict_t *xdata) | |||||
4218 | { | |||||
4219 | dht_local_t *local = NULL((void*)0); | |||||
4220 | ||||||
4221 | local = frame->local; | |||||
4222 | ||||||
4223 | DHT_STACK_UNWIND (rmdir, frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4224, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4224 | &local->preparent, &local->postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4224, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4225 | ||||||
4226 | return 0; | |||||
4227 | } | |||||
4228 | ||||||
4229 | ||||||
4230 | int | |||||
4231 | dht_rmdir_hashed_subvol_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4232 | int op_ret, int op_errno, struct iatt *preparent, | |||||
4233 | struct iatt *postparent, dict_t *xdata) | |||||
4234 | { | |||||
4235 | dht_local_t *local = NULL((void*)0); | |||||
4236 | int this_call_cnt = 0; | |||||
4237 | call_frame_t *prev = NULL((void*)0); | |||||
4238 | ||||||
4239 | local = frame->local; | |||||
4240 | prev = cookie; | |||||
4241 | ||||||
4242 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4243 | { | |||||
4244 | if (op_ret == -1) { | |||||
4245 | local->op_errno = op_errno; | |||||
4246 | local->op_ret = -1; | |||||
4247 | if (op_errno != ENOENT2 && op_errno != EACCES13) { | |||||
4248 | local->need_selfheal = 1; | |||||
4249 | } | |||||
4250 | ||||||
4251 | ||||||
4252 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("rmdir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4255, GF_LOG_DEBUG, "rmdir on %s for %s failed (%s)", prev-> this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4253 | "rmdir on %s for %s failed (%s)",do { do { if (0) printf ("rmdir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4255, GF_LOG_DEBUG, "rmdir on %s for %s failed (%s)", prev-> this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4254 | prev->this->name, local->loc.path,do { do { if (0) printf ("rmdir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4255, GF_LOG_DEBUG, "rmdir on %s for %s failed (%s)", prev-> this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4255 | strerror (op_errno))do { do { if (0) printf ("rmdir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4255, GF_LOG_DEBUG, "rmdir on %s for %s failed (%s)", prev-> this->name, local->loc.path, strerror (op_errno)); } while (0); | |||||
4256 | goto unlock; | |||||
4257 | } | |||||
4258 | ||||||
4259 | dht_iatt_merge (this, &local->preparent, preparent, prev->this); | |||||
4260 | dht_iatt_merge (this, &local->postparent, postparent, | |||||
4261 | prev->this); | |||||
4262 | ||||||
4263 | } | |||||
4264 | unlock: | |||||
4265 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4266 | ||||||
4267 | this_call_cnt = dht_frame_return (frame); | |||||
4268 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
4269 | if (local->need_selfheal) { | |||||
4270 | local->layout = | |||||
4271 | dht_layout_get (this, local->loc.inode); | |||||
4272 | ||||||
4273 | /* TODO: neater interface needed below */ | |||||
4274 | local->stbuf.ia_type = local->loc.inode->ia_type; | |||||
4275 | ||||||
4276 | uuid_copy (local->gfid, local->loc.inode->gfid); | |||||
4277 | dht_selfheal_restore (frame, dht_rmdir_selfheal_cbk, | |||||
4278 | &local->loc, local->layout); | |||||
4279 | } else { | |||||
4280 | ||||||
4281 | if (local->loc.parent) { | |||||
4282 | dht_inode_ctx_time_update (local->loc.parent, | |||||
4283 | this, | |||||
4284 | &local->preparent, | |||||
4285 | 0); | |||||
4286 | ||||||
4287 | dht_inode_ctx_time_update (local->loc.parent, | |||||
4288 | this, | |||||
4289 | &local->postparent, | |||||
4290 | 1); | |||||
4291 | } | |||||
4292 | ||||||
4293 | DHT_STACK_UNWIND (rmdir, frame, local->op_ret,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4295, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4294 | local->op_errno, &local->preparent,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4295, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4295 | &local->postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4295, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4296 | } | |||||
4297 | } | |||||
4298 | ||||||
4299 | return 0; | |||||
4300 | } | |||||
4301 | ||||||
4302 | ||||||
4303 | int | |||||
4304 | dht_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4305 | int op_ret, int op_errno, struct iatt *preparent, | |||||
4306 | struct iatt *postparent, dict_t *xdata) | |||||
4307 | { | |||||
4308 | dht_local_t *local = NULL((void*)0); | |||||
4309 | int this_call_cnt = 0; | |||||
4310 | call_frame_t *prev = NULL((void*)0); | |||||
4311 | int done = 0; | |||||
4312 | ||||||
4313 | local = frame->local; | |||||
4314 | prev = cookie; | |||||
4315 | ||||||
4316 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4317 | { | |||||
4318 | if (op_ret == -1) { | |||||
4319 | local->op_errno = op_errno; | |||||
4320 | local->op_ret = -1; | |||||
4321 | ||||||
4322 | if (op_errno != ENOENT2 && op_errno != EACCES13) { | |||||
4323 | local->need_selfheal = 1; | |||||
4324 | } | |||||
4325 | ||||||
4326 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("rmdir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4329, GF_LOG_DEBUG, "rmdir on %s for %s failed (%s)", prev-> this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4327 | "rmdir on %s for %s failed (%s)",do { do { if (0) printf ("rmdir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4329, GF_LOG_DEBUG, "rmdir on %s for %s failed (%s)", prev-> this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4328 | prev->this->name, local->loc.path,do { do { if (0) printf ("rmdir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4329, GF_LOG_DEBUG, "rmdir on %s for %s failed (%s)", prev-> this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4329 | strerror (op_errno))do { do { if (0) printf ("rmdir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4329, GF_LOG_DEBUG, "rmdir on %s for %s failed (%s)", prev-> this->name, local->loc.path, strerror (op_errno)); } while (0); | |||||
4330 | goto unlock; | |||||
4331 | } | |||||
4332 | ||||||
4333 | /* Track if rmdir succeeded on atleast one subvol*/ | |||||
4334 | local->fop_succeeded = 1; | |||||
4335 | dht_iatt_merge (this, &local->preparent, preparent, prev->this); | |||||
4336 | dht_iatt_merge (this, &local->postparent, postparent, | |||||
4337 | prev->this); | |||||
4338 | } | |||||
4339 | unlock: | |||||
4340 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4341 | ||||||
4342 | ||||||
4343 | this_call_cnt = dht_frame_return (frame); | |||||
4344 | ||||||
4345 | /* if local->hashed_subvol, we are yet to wind to hashed_subvol. */ | |||||
4346 | if (local->hashed_subvol && (this_call_cnt == 1)) { | |||||
4347 | done = 1; | |||||
4348 | } else if (!local->hashed_subvol && !this_call_cnt) { | |||||
4349 | done = 1; | |||||
4350 | } | |||||
4351 | ||||||
4352 | ||||||
4353 | if (done) { | |||||
4354 | if (local->need_selfheal && local->fop_succeeded) { | |||||
4355 | local->layout = | |||||
4356 | dht_layout_get (this, local->loc.inode); | |||||
4357 | ||||||
4358 | /* TODO: neater interface needed below */ | |||||
4359 | local->stbuf.ia_type = local->loc.inode->ia_type; | |||||
4360 | ||||||
4361 | uuid_copy (local->gfid, local->loc.inode->gfid); | |||||
4362 | dht_selfheal_restore (frame, dht_rmdir_selfheal_cbk, | |||||
4363 | &local->loc, local->layout); | |||||
4364 | } else if (this_call_cnt) { | |||||
4365 | /* If non-hashed subvol's have responded, proceed */ | |||||
4366 | ||||||
4367 | local->need_selfheal = 0; | |||||
4368 | STACK_WIND (frame, dht_rmdir_hashed_subvol_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4371, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( local->hashed_subvol ->fops->rmdir_cbk) tmp_cbk = dht_rmdir_hashed_subvol_cbk ; _new->root = frame->root; _new->this = local->hashed_subvol ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "local->hashed_subvol->fops->rmdir"; _new ->unwind_to = "dht_rmdir_hashed_subvol_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = local->hashed_subvol; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, local->hashed_subvol ->fops->rmdir); local->hashed_subvol->fops->rmdir (_new, local->hashed_subvol, &local->loc, local-> flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4369 | local->hashed_subvol,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4371, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( local->hashed_subvol ->fops->rmdir_cbk) tmp_cbk = dht_rmdir_hashed_subvol_cbk ; _new->root = frame->root; _new->this = local->hashed_subvol ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "local->hashed_subvol->fops->rmdir"; _new ->unwind_to = "dht_rmdir_hashed_subvol_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = local->hashed_subvol; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, local->hashed_subvol ->fops->rmdir); local->hashed_subvol->fops->rmdir (_new, local->hashed_subvol, &local->loc, local-> flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4370 | local->hashed_subvol->fops->rmdir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4371, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( local->hashed_subvol ->fops->rmdir_cbk) tmp_cbk = dht_rmdir_hashed_subvol_cbk ; _new->root = frame->root; _new->this = local->hashed_subvol ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "local->hashed_subvol->fops->rmdir"; _new ->unwind_to = "dht_rmdir_hashed_subvol_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = local->hashed_subvol; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, local->hashed_subvol ->fops->rmdir); local->hashed_subvol->fops->rmdir (_new, local->hashed_subvol, &local->loc, local-> flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4371 | &local->loc, local->flags, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4371, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( local->hashed_subvol ->fops->rmdir_cbk) tmp_cbk = dht_rmdir_hashed_subvol_cbk ; _new->root = frame->root; _new->this = local->hashed_subvol ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "local->hashed_subvol->fops->rmdir"; _new ->unwind_to = "dht_rmdir_hashed_subvol_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = local->hashed_subvol; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, local->hashed_subvol ->fops->rmdir); local->hashed_subvol->fops->rmdir (_new, local->hashed_subvol, &local->loc, local-> flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4372 | } else if (!this_call_cnt) { | |||||
4373 | /* All subvol's have responded, proceed */ | |||||
4374 | ||||||
4375 | if (local->loc.parent) { | |||||
4376 | ||||||
4377 | dht_inode_ctx_time_update (local->loc.parent, | |||||
4378 | this, | |||||
4379 | &local->preparent, | |||||
4380 | 0); | |||||
4381 | ||||||
4382 | dht_inode_ctx_time_update (local->loc.parent, | |||||
4383 | this, | |||||
4384 | &local->postparent, | |||||
4385 | 1); | |||||
4386 | ||||||
4387 | } | |||||
4388 | ||||||
4389 | DHT_STACK_UNWIND (rmdir, frame, local->op_ret,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4391, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4390 | local->op_errno, &local->preparent,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4391, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4391 | &local->postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4391, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4392 | } | |||||
4393 | } | |||||
4394 | ||||||
4395 | return 0; | |||||
4396 | } | |||||
4397 | ||||||
4398 | ||||||
4399 | int | |||||
4400 | dht_rmdir_do (call_frame_t *frame, xlator_t *this) | |||||
4401 | { | |||||
4402 | dht_local_t *local = NULL((void*)0); | |||||
4403 | dht_conf_t *conf = NULL((void*)0); | |||||
4404 | int i = 0; | |||||
4405 | xlator_t *hashed_subvol = NULL((void*)0); | |||||
4406 | ||||||
4407 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4407, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
4408 | ||||||
4409 | conf = this->private; | |||||
4410 | local = frame->local; | |||||
4411 | ||||||
4412 | if (local->op_ret == -1) | |||||
4413 | goto err; | |||||
4414 | ||||||
4415 | local->call_cnt = conf->subvolume_cnt; | |||||
4416 | ||||||
4417 | /* first remove from non-hashed_subvol */ | |||||
4418 | hashed_subvol = dht_subvol_get_hashed (this, &local->loc); | |||||
4419 | ||||||
4420 | if (!hashed_subvol) { | |||||
4421 | gf_log (this->name, GF_LOG_WARNING, "failed to get hashed "do { do { if (0) printf ("failed to get hashed " "subvol for %s" ,local->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4422, GF_LOG_WARNING, "failed to get hashed " "subvol for %s",local->loc.path); } while (0) | |||||
4422 | "subvol for %s",local->loc.path)do { do { if (0) printf ("failed to get hashed " "subvol for %s" ,local->loc.path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4422, GF_LOG_WARNING, "failed to get hashed " "subvol for %s",local->loc.path); } while (0); | |||||
4423 | } else { | |||||
4424 | local->hashed_subvol = hashed_subvol; | |||||
4425 | } | |||||
4426 | ||||||
4427 | /* When DHT has only 1 child */ | |||||
4428 | if (conf->subvolume_cnt == 1) { | |||||
4429 | STACK_WIND (frame, dht_rmdir_hashed_subvol_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4432, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [0]->fops->rmdir_cbk) tmp_cbk = dht_rmdir_hashed_subvol_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [0]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[0]->fops->rmdir"; _new ->unwind_to = "dht_rmdir_hashed_subvol_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[0]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ 0]->fops->rmdir); conf->subvolumes[0]->fops->rmdir (_new, conf->subvolumes[0], &local->loc, local-> flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4430 | conf->subvolumes[0],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4432, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [0]->fops->rmdir_cbk) tmp_cbk = dht_rmdir_hashed_subvol_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [0]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[0]->fops->rmdir"; _new ->unwind_to = "dht_rmdir_hashed_subvol_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[0]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ 0]->fops->rmdir); conf->subvolumes[0]->fops->rmdir (_new, conf->subvolumes[0], &local->loc, local-> flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4431 | conf->subvolumes[0]->fops->rmdir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4432, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [0]->fops->rmdir_cbk) tmp_cbk = dht_rmdir_hashed_subvol_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [0]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[0]->fops->rmdir"; _new ->unwind_to = "dht_rmdir_hashed_subvol_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[0]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ 0]->fops->rmdir); conf->subvolumes[0]->fops->rmdir (_new, conf->subvolumes[0], &local->loc, local-> flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4432 | &local->loc, local->flags, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4432, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [0]->fops->rmdir_cbk) tmp_cbk = dht_rmdir_hashed_subvol_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [0]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[0]->fops->rmdir"; _new ->unwind_to = "dht_rmdir_hashed_subvol_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[0]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ 0]->fops->rmdir); conf->subvolumes[0]->fops->rmdir (_new, conf->subvolumes[0], &local->loc, local-> flags, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4433 | return 0; | |||||
4434 | } | |||||
4435 | ||||||
4436 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
4437 | if (hashed_subvol && | |||||
4438 | (hashed_subvol == conf->subvolumes[i])) | |||||
4439 | continue; | |||||
4440 | ||||||
4441 | STACK_WIND (frame, dht_rmdir_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4444, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->rmdir_cbk) tmp_cbk = dht_rmdir_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->rmdir"; _new ->unwind_to = "dht_rmdir_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->rmdir); conf-> subvolumes[i]->fops->rmdir (_new, conf->subvolumes[i ], &local->loc, local->flags, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4442 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4444, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->rmdir_cbk) tmp_cbk = dht_rmdir_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->rmdir"; _new ->unwind_to = "dht_rmdir_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->rmdir); conf-> subvolumes[i]->fops->rmdir (_new, conf->subvolumes[i ], &local->loc, local->flags, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4443 | conf->subvolumes[i]->fops->rmdir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4444, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->rmdir_cbk) tmp_cbk = dht_rmdir_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->rmdir"; _new ->unwind_to = "dht_rmdir_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->rmdir); conf-> subvolumes[i]->fops->rmdir (_new, conf->subvolumes[i ], &local->loc, local->flags, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4444 | &local->loc, local->flags, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4444, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->rmdir_cbk) tmp_cbk = dht_rmdir_cbk; _new-> root = frame->root; _new->this = conf->subvolumes[i] ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->rmdir"; _new ->unwind_to = "dht_rmdir_cbk"; pthread_spin_init (&_new ->lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = conf->subvolumes[i]; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, conf->subvolumes[i]->fops->rmdir); conf-> subvolumes[i]->fops->rmdir (_new, conf->subvolumes[i ], &local->loc, local->flags, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
4445 | } | |||||
4446 | ||||||
4447 | return 0; | |||||
4448 | ||||||
4449 | err: | |||||
4450 | DHT_STACK_UNWIND (rmdir, frame, local->op_ret, local->op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4451, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4451 | &local->preparent, &local->postparent, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4451, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, local->op_ret, local->op_errno, &local-> preparent, &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4452 | return 0; | |||||
4453 | } | |||||
4454 | ||||||
4455 | ||||||
4456 | int | |||||
4457 | dht_rmdir_linkfile_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4458 | int op_ret, int op_errno, struct iatt *preparent, | |||||
4459 | struct iatt *postparent, dict_t *xdata) | |||||
4460 | { | |||||
4461 | dht_local_t *local = NULL((void*)0); | |||||
4462 | call_frame_t *prev = NULL((void*)0); | |||||
4463 | xlator_t *src = NULL((void*)0); | |||||
4464 | call_frame_t *main_frame = NULL((void*)0); | |||||
4465 | dht_local_t *main_local = NULL((void*)0); | |||||
4466 | int this_call_cnt = 0; | |||||
4467 | ||||||
4468 | local = frame->local; | |||||
4469 | prev = cookie; | |||||
4470 | src = prev->this; | |||||
4471 | ||||||
4472 | main_frame = local->main_frame; | |||||
4473 | main_local = main_frame->local; | |||||
4474 | ||||||
4475 | if (op_ret == 0) { | |||||
4476 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("unlinked linkfile %s on %s", local-> loc.path, src->name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4478, GF_LOG_TRACE, "unlinked linkfile %s on %s" , local->loc.path, src->name); } while (0) | |||||
4477 | "unlinked linkfile %s on %s",do { do { if (0) printf ("unlinked linkfile %s on %s", local-> loc.path, src->name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4478, GF_LOG_TRACE, "unlinked linkfile %s on %s" , local->loc.path, src->name); } while (0) | |||||
4478 | local->loc.path, src->name)do { do { if (0) printf ("unlinked linkfile %s on %s", local-> loc.path, src->name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4478, GF_LOG_TRACE, "unlinked linkfile %s on %s" , local->loc.path, src->name); } while (0); | |||||
4479 | } else { | |||||
4480 | main_local->op_ret = -1; | |||||
4481 | main_local->op_errno = op_errno; | |||||
4482 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("unlink of %s on %s failed (%s)", local ->loc.path, src->name, strerror (op_errno)); } while (0 ); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4484 , GF_LOG_DEBUG, "unlink of %s on %s failed (%s)", local->loc .path, src->name, strerror (op_errno)); } while (0) | |||||
4483 | "unlink of %s on %s failed (%s)",do { do { if (0) printf ("unlink of %s on %s failed (%s)", local ->loc.path, src->name, strerror (op_errno)); } while (0 ); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4484 , GF_LOG_DEBUG, "unlink of %s on %s failed (%s)", local->loc .path, src->name, strerror (op_errno)); } while (0) | |||||
4484 | local->loc.path, src->name, strerror (op_errno))do { do { if (0) printf ("unlink of %s on %s failed (%s)", local ->loc.path, src->name, strerror (op_errno)); } while (0 ); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4484 , GF_LOG_DEBUG, "unlink of %s on %s failed (%s)", local->loc .path, src->name, strerror (op_errno)); } while (0); | |||||
4485 | } | |||||
4486 | ||||||
4487 | this_call_cnt = dht_frame_return (main_frame); | |||||
4488 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) | |||||
4489 | dht_rmdir_do (main_frame, this); | |||||
4490 | ||||||
4491 | DHT_STACK_DESTROY (frame)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); __xl = frame->this; __local = frame->local; frame ->local = ((void*)0); STACK_DESTROY (frame->root); dht_local_wipe (__xl, __local); } while (0); | |||||
4492 | return 0; | |||||
4493 | } | |||||
4494 | ||||||
4495 | ||||||
4496 | int | |||||
4497 | dht_rmdir_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4498 | int op_ret, int op_errno, inode_t *inode, | |||||
4499 | struct iatt *stbuf, dict_t *xattr, struct iatt *parent) | |||||
4500 | { | |||||
4501 | dht_local_t *local = NULL((void*)0); | |||||
4502 | call_frame_t *prev = NULL((void*)0); | |||||
4503 | xlator_t *src = NULL((void*)0); | |||||
4504 | call_frame_t *main_frame = NULL((void*)0); | |||||
4505 | dht_local_t *main_local = NULL((void*)0); | |||||
4506 | int this_call_cnt = 0; | |||||
4507 | dht_conf_t *conf = this->private; | |||||
4508 | ||||||
4509 | local = frame->local; | |||||
4510 | prev = cookie; | |||||
4511 | src = prev->this; | |||||
4512 | ||||||
4513 | main_frame = local->main_frame; | |||||
4514 | main_local = main_frame->local; | |||||
4515 | ||||||
4516 | if (op_ret != 0) | |||||
4517 | goto err; | |||||
4518 | ||||||
4519 | if (!check_is_linkfile (inode, stbuf, xattr, conf->link_xattr_name)( ((st_mode_from_ia ((stbuf)->ia_prot, (stbuf)->ia_type ) & ~0170000) == (01000)) && dict_get (xattr, conf ->link_xattr_name))) { | |||||
4520 | main_local->op_ret = -1; | |||||
4521 | main_local->op_errno = ENOTEMPTY39; | |||||
4522 | ||||||
4523 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s on %s found to be not a linkfile (type=0%o)" , local->loc.path, src->name, stbuf->ia_type); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4525 , GF_LOG_WARNING, "%s on %s found to be not a linkfile (type=0%o)" , local->loc.path, src->name, stbuf->ia_type); } while (0) | |||||
4524 | "%s on %s found to be not a linkfile (type=0%o)",do { do { if (0) printf ("%s on %s found to be not a linkfile (type=0%o)" , local->loc.path, src->name, stbuf->ia_type); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4525 , GF_LOG_WARNING, "%s on %s found to be not a linkfile (type=0%o)" , local->loc.path, src->name, stbuf->ia_type); } while (0) | |||||
4525 | local->loc.path, src->name, stbuf->ia_type)do { do { if (0) printf ("%s on %s found to be not a linkfile (type=0%o)" , local->loc.path, src->name, stbuf->ia_type); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4525 , GF_LOG_WARNING, "%s on %s found to be not a linkfile (type=0%o)" , local->loc.path, src->name, stbuf->ia_type); } while (0); | |||||
4526 | goto err; | |||||
4527 | } | |||||
4528 | ||||||
4529 | STACK_WIND (frame, dht_rmdir_linkfile_unlink_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4530, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( src->fops ->unlink_cbk) tmp_cbk = dht_rmdir_linkfile_unlink_cbk; _new ->root = frame->root; _new->this = src; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "src->fops->unlink"; _new->unwind_to = "dht_rmdir_linkfile_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = src; if (frame->this ->ctx->measure_latency) gf_latency_begin (_new, src-> fops->unlink); src->fops->unlink (_new, src, &local ->loc, 0, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4530 | src, src->fops->unlink, &local->loc, 0, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4530, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( src->fops ->unlink_cbk) tmp_cbk = dht_rmdir_linkfile_unlink_cbk; _new ->root = frame->root; _new->this = src; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "src->fops->unlink"; _new->unwind_to = "dht_rmdir_linkfile_unlink_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = src; if (frame->this ->ctx->measure_latency) gf_latency_begin (_new, src-> fops->unlink); src->fops->unlink (_new, src, &local ->loc, 0, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4531 | return 0; | |||||
4532 | err: | |||||
4533 | ||||||
4534 | this_call_cnt = dht_frame_return (main_frame); | |||||
4535 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) | |||||
4536 | dht_rmdir_do (main_frame, this); | |||||
4537 | ||||||
4538 | DHT_STACK_DESTROY (frame)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); __xl = frame->this; __local = frame->local; frame ->local = ((void*)0); STACK_DESTROY (frame->root); dht_local_wipe (__xl, __local); } while (0); | |||||
4539 | return 0; | |||||
4540 | } | |||||
4541 | ||||||
4542 | ||||||
4543 | int | |||||
4544 | dht_rmdir_is_subvol_empty (call_frame_t *frame, xlator_t *this, | |||||
4545 | gf_dirent_t *entries, xlator_t *src) | |||||
4546 | { | |||||
4547 | int ret = 0; | |||||
4548 | int build_ret = 0; | |||||
4549 | gf_dirent_t *trav = NULL((void*)0); | |||||
4550 | call_frame_t *lookup_frame = NULL((void*)0); | |||||
4551 | dht_local_t *lookup_local = NULL((void*)0); | |||||
4552 | dht_local_t *local = NULL((void*)0); | |||||
4553 | dict_t *xattrs = NULL((void*)0); | |||||
4554 | dht_conf_t *conf = this->private; | |||||
4555 | ||||||
4556 | local = frame->local; | |||||
4557 | ||||||
4558 | list_for_each_entry (trav, &entries->list, list)for (trav = ((typeof(*trav) *)((char *)((&entries->list )->next)-(unsigned long)(&((typeof(*trav) *)0)->list ))); &trav->list != (&entries->list); trav = (( typeof(*trav) *)((char *)(trav->list.next)-(unsigned long) (&((typeof(*trav) *)0)->list)))) { | |||||
4559 | if (strcmp (trav->d_name, ".") == 0) | |||||
4560 | continue; | |||||
4561 | if (strcmp (trav->d_name, "..") == 0) | |||||
4562 | continue; | |||||
4563 | if (check_is_linkfile (NULL, (&trav->d_stat), trav->dict,( ((st_mode_from_ia (((&trav->d_stat))->ia_prot, (( &trav->d_stat))->ia_type) & ~0170000) == (01000 )) && dict_get (trav->dict, conf->link_xattr_name )) | |||||
4564 | conf->link_xattr_name)( ((st_mode_from_ia (((&trav->d_stat))->ia_prot, (( &trav->d_stat))->ia_type) & ~0170000) == (01000 )) && dict_get (trav->dict, conf->link_xattr_name ))) { | |||||
4565 | ret++; | |||||
4566 | continue; | |||||
4567 | } | |||||
4568 | ||||||
4569 | /* this entry is either a directory which is neither "." nor "..", | |||||
4570 | or a non directory which is not a linkfile. the directory is to | |||||
4571 | be treated as non-empty | |||||
4572 | */ | |||||
4573 | return 0; | |||||
4574 | } | |||||
4575 | ||||||
4576 | xattrs = dict_new (); | |||||
4577 | if (!xattrs) { | |||||
| ||||||
4578 | gf_log (this->name, GF_LOG_ERROR, "dict_new failed")do { do { if (0) printf ("dict_new failed"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4578, GF_LOG_ERROR , "dict_new failed"); } while (0); | |||||
4579 | return -1; | |||||
4580 | } | |||||
4581 | ||||||
4582 | ret = dict_set_uint32 (xattrs, conf->link_xattr_name, 256); | |||||
4583 | if (ret) { | |||||
4584 | gf_log (this->name, GF_LOG_ERROR, "failed to set linkto key"do { do { if (0) printf ("failed to set linkto key" " in dict" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4585, GF_LOG_ERROR, "failed to set linkto key" " in dict"); } while (0) | |||||
4585 | " in dict")do { do { if (0) printf ("failed to set linkto key" " in dict" ); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4585, GF_LOG_ERROR, "failed to set linkto key" " in dict"); } while (0); | |||||
4586 | if (xattrs) | |||||
4587 | dict_unref (xattrs); | |||||
4588 | return -1; | |||||
4589 | } | |||||
4590 | ||||||
4591 | list_for_each_entry (trav, &entries->list, list)for (trav = ((typeof(*trav) *)((char *)((&entries->list )->next)-(unsigned long)(&((typeof(*trav) *)0)->list ))); &trav->list != (&entries->list); trav = (( typeof(*trav) *)((char *)(trav->list.next)-(unsigned long) (&((typeof(*trav) *)0)->list)))) { | |||||
4592 | if (strcmp (trav->d_name, ".") == 0) | |||||
4593 | continue; | |||||
4594 | if (strcmp (trav->d_name, "..") == 0) | |||||
4595 | continue; | |||||
4596 | ||||||
4597 | lookup_frame = NULL((void*)0); | |||||
4598 | lookup_local = NULL((void*)0); | |||||
4599 | ||||||
4600 | lookup_frame = copy_frame (frame); | |||||
4601 | if (!lookup_frame) { | |||||
4602 | /* out of memory, let the rmdir fail | |||||
4603 | (as non-empty, unfortunately) */ | |||||
4604 | goto err; | |||||
4605 | } | |||||
4606 | ||||||
4607 | lookup_local = mem_get0 (this->local_pool); | |||||
4608 | if (!lookup_local) { | |||||
4609 | goto err; | |||||
4610 | } | |||||
4611 | ||||||
4612 | lookup_frame->local = lookup_local; | |||||
4613 | lookup_local->main_frame = frame; | |||||
4614 | ||||||
4615 | build_ret = dht_build_child_loc (this, &lookup_local->loc, | |||||
4616 | &local->loc, trav->d_name); | |||||
4617 | if (build_ret != 0) | |||||
4618 | goto err; | |||||
4619 | ||||||
4620 | uuid_copy (lookup_local->loc.gfid, trav->d_stat.ia_gfid); | |||||
4621 | ||||||
4622 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("looking up %s on %s", lookup_local-> loc.path, src->name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4624, GF_LOG_TRACE, "looking up %s on %s" , lookup_local->loc.path, src->name); } while (0) | |||||
4623 | "looking up %s on %s",do { do { if (0) printf ("looking up %s on %s", lookup_local-> loc.path, src->name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4624, GF_LOG_TRACE, "looking up %s on %s" , lookup_local->loc.path, src->name); } while (0) | |||||
4624 | lookup_local->loc.path, src->name)do { do { if (0) printf ("looking up %s on %s", lookup_local-> loc.path, src->name); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4624, GF_LOG_TRACE, "looking up %s on %s" , lookup_local->loc.path, src->name); } while (0); | |||||
4625 | ||||||
4626 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4627 | { | |||||
4628 | local->call_cnt++; | |||||
4629 | } | |||||
4630 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4631 | ||||||
4632 | STACK_WIND (lookup_frame, dht_rmdir_lookup_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (lookup_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4634, GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( src->fops->lookup_cbk) tmp_cbk = dht_rmdir_lookup_cbk ; _new->root = lookup_frame->root; _new->this = src; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = lookup_frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "src->fops->lookup"; _new->unwind_to = "dht_rmdir_lookup_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&lookup_frame->root->stack_lock ); { _new->next = lookup_frame->root->frames.next; _new ->prev = &lookup_frame->root->frames; if (lookup_frame ->root->frames.next) lookup_frame->root->frames.next ->prev = _new; lookup_frame->root->frames.next = _new ; lookup_frame->ref_count++; } pthread_spin_unlock (&lookup_frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = src; if (lookup_frame-> this->ctx->measure_latency) gf_latency_begin (_new, src ->fops->lookup); src->fops->lookup (_new, src, & lookup_local->loc, xattrs); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4633 | src, src->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (lookup_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4634, GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( src->fops->lookup_cbk) tmp_cbk = dht_rmdir_lookup_cbk ; _new->root = lookup_frame->root; _new->this = src; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = lookup_frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "src->fops->lookup"; _new->unwind_to = "dht_rmdir_lookup_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&lookup_frame->root->stack_lock ); { _new->next = lookup_frame->root->frames.next; _new ->prev = &lookup_frame->root->frames; if (lookup_frame ->root->frames.next) lookup_frame->root->frames.next ->prev = _new; lookup_frame->root->frames.next = _new ; lookup_frame->ref_count++; } pthread_spin_unlock (&lookup_frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = src; if (lookup_frame-> this->ctx->measure_latency) gf_latency_begin (_new, src ->fops->lookup); src->fops->lookup (_new, src, & lookup_local->loc, xattrs); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4634 | &lookup_local->loc, xattrs)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (lookup_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4634, GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( src->fops->lookup_cbk) tmp_cbk = dht_rmdir_lookup_cbk ; _new->root = lookup_frame->root; _new->this = src; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = lookup_frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "src->fops->lookup"; _new->unwind_to = "dht_rmdir_lookup_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&lookup_frame->root->stack_lock ); { _new->next = lookup_frame->root->frames.next; _new ->prev = &lookup_frame->root->frames; if (lookup_frame ->root->frames.next) lookup_frame->root->frames.next ->prev = _new; lookup_frame->root->frames.next = _new ; lookup_frame->ref_count++; } pthread_spin_unlock (&lookup_frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = src; if (lookup_frame-> this->ctx->measure_latency) gf_latency_begin (_new, src ->fops->lookup); src->fops->lookup (_new, src, & lookup_local->loc, xattrs); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
4635 | ret++; | |||||
4636 | } | |||||
4637 | ||||||
4638 | if (xattrs) | |||||
4639 | dict_unref (xattrs); | |||||
4640 | ||||||
4641 | return ret; | |||||
4642 | err: | |||||
4643 | if (xattrs) | |||||
4644 | dict_unref (xattrs); | |||||
4645 | ||||||
4646 | DHT_STACK_DESTROY (lookup_frame)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); __xl = lookup_frame->this; __local = lookup_frame-> local; lookup_frame->local = ((void*)0); STACK_DESTROY (lookup_frame ->root); dht_local_wipe (__xl, __local); } while (0); | |||||
| ||||||
4647 | return 0; | |||||
4648 | } | |||||
4649 | ||||||
4650 | ||||||
4651 | int | |||||
4652 | dht_rmdir_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4653 | int op_ret, int op_errno, gf_dirent_t *entries, | |||||
4654 | dict_t *xdata) | |||||
4655 | { | |||||
4656 | dht_local_t *local = NULL((void*)0); | |||||
4657 | int this_call_cnt = -1; | |||||
4658 | call_frame_t *prev = NULL((void*)0); | |||||
4659 | xlator_t *src = NULL((void*)0); | |||||
4660 | int ret = 0; | |||||
4661 | ||||||
4662 | local = frame->local; | |||||
4663 | prev = cookie; | |||||
4664 | src = prev->this; | |||||
4665 | ||||||
4666 | if (op_ret > 2) { | |||||
4667 | ret = dht_rmdir_is_subvol_empty (frame, this, entries, src); | |||||
4668 | ||||||
4669 | switch (ret) { | |||||
4670 | case 0: /* non linkfiles exist */ | |||||
4671 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("readdir on %s for %s returned %d entries" , prev->this->name, local->loc.path, op_ret); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4673 , GF_LOG_TRACE, "readdir on %s for %s returned %d entries", prev ->this->name, local->loc.path, op_ret); } while (0) | |||||
4672 | "readdir on %s for %s returned %d entries",do { do { if (0) printf ("readdir on %s for %s returned %d entries" , prev->this->name, local->loc.path, op_ret); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4673 , GF_LOG_TRACE, "readdir on %s for %s returned %d entries", prev ->this->name, local->loc.path, op_ret); } while (0) | |||||
4673 | prev->this->name, local->loc.path, op_ret)do { do { if (0) printf ("readdir on %s for %s returned %d entries" , prev->this->name, local->loc.path, op_ret); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4673 , GF_LOG_TRACE, "readdir on %s for %s returned %d entries", prev ->this->name, local->loc.path, op_ret); } while (0); | |||||
4674 | local->op_ret = -1; | |||||
4675 | local->op_errno = ENOTEMPTY39; | |||||
4676 | break; | |||||
4677 | default: | |||||
4678 | /* @ret number of linkfiles are getting unlinked */ | |||||
4679 | gf_log (this->name, GF_LOG_TRACE,do { do { if (0) printf ("readdir on %s for %s found %d linkfiles" , prev->this->name, local->loc.path, ret); } while ( 0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4681 , GF_LOG_TRACE, "readdir on %s for %s found %d linkfiles", prev ->this->name, local->loc.path, ret); } while (0) | |||||
4680 | "readdir on %s for %s found %d linkfiles",do { do { if (0) printf ("readdir on %s for %s found %d linkfiles" , prev->this->name, local->loc.path, ret); } while ( 0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4681 , GF_LOG_TRACE, "readdir on %s for %s found %d linkfiles", prev ->this->name, local->loc.path, ret); } while (0) | |||||
4681 | prev->this->name, local->loc.path, ret)do { do { if (0) printf ("readdir on %s for %s found %d linkfiles" , prev->this->name, local->loc.path, ret); } while ( 0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 4681 , GF_LOG_TRACE, "readdir on %s for %s found %d linkfiles", prev ->this->name, local->loc.path, ret); } while (0); | |||||
4682 | break; | |||||
4683 | } | |||||
4684 | } | |||||
4685 | ||||||
4686 | this_call_cnt = dht_frame_return (frame); | |||||
4687 | ||||||
4688 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
4689 | dht_rmdir_do (frame, this); | |||||
4690 | } | |||||
4691 | ||||||
4692 | return 0; | |||||
4693 | } | |||||
4694 | ||||||
4695 | ||||||
4696 | int | |||||
4697 | dht_rmdir_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4698 | int op_ret, int op_errno, fd_t *fd, dict_t *xdata) | |||||
4699 | { | |||||
4700 | dht_local_t *local = NULL((void*)0); | |||||
4701 | int this_call_cnt = -1; | |||||
4702 | call_frame_t *prev = NULL((void*)0); | |||||
4703 | dict_t *dict = NULL((void*)0); | |||||
4704 | int ret = 0; | |||||
4705 | dht_conf_t *conf = this->private; | |||||
4706 | ||||||
4707 | local = frame->local; | |||||
4708 | prev = cookie; | |||||
4709 | ||||||
4710 | if (op_ret == -1) { | |||||
4711 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("opendir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4714, GF_LOG_DEBUG, "opendir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4712 | "opendir on %s for %s failed (%s)",do { do { if (0) printf ("opendir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4714, GF_LOG_DEBUG, "opendir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4713 | prev->this->name, local->loc.path,do { do { if (0) printf ("opendir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4714, GF_LOG_DEBUG, "opendir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0) | |||||
4714 | strerror (op_errno))do { do { if (0) printf ("opendir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4714, GF_LOG_DEBUG, "opendir on %s for %s failed (%s)", prev ->this->name, local->loc.path, strerror (op_errno)); } while (0); | |||||
4715 | if (op_errno != ENOENT2) { | |||||
4716 | local->op_ret = -1; | |||||
4717 | local->op_errno = op_errno; | |||||
4718 | } | |||||
4719 | goto err; | |||||
4720 | } | |||||
4721 | ||||||
4722 | dict = dict_new (); | |||||
4723 | if (!dict) { | |||||
4724 | local->op_ret = -1; | |||||
4725 | local->op_errno = ENOMEM12; | |||||
4726 | goto err; | |||||
4727 | } | |||||
4728 | ||||||
4729 | ret = dict_set_uint32 (dict, conf->link_xattr_name, 256); | |||||
4730 | if (ret) | |||||
4731 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: failed to set '%s' key", local-> loc.path, conf->link_xattr_name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 4733, GF_LOG_WARNING , "%s: failed to set '%s' key", local->loc.path, conf-> link_xattr_name); } while (0) | |||||
4732 | "%s: failed to set '%s' key",do { do { if (0) printf ("%s: failed to set '%s' key", local-> loc.path, conf->link_xattr_name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 4733, GF_LOG_WARNING , "%s: failed to set '%s' key", local->loc.path, conf-> link_xattr_name); } while (0) | |||||
4733 | local->loc.path, conf->link_xattr_name)do { do { if (0) printf ("%s: failed to set '%s' key", local-> loc.path, conf->link_xattr_name); } while (0); _gf_log (this ->name, "dht-common.c", __FUNCTION__, 4733, GF_LOG_WARNING , "%s: failed to set '%s' key", local->loc.path, conf-> link_xattr_name); } while (0); | |||||
4734 | ||||||
4735 | STACK_WIND (frame, dht_rmdir_readdirp_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4737, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( prev->this ->fops->readdirp_cbk) tmp_cbk = dht_rmdir_readdirp_cbk; _new->root = frame->root; _new->this = prev->this ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "prev->this->fops->readdirp"; _new-> unwind_to = "dht_rmdir_readdirp_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = prev->this; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, prev->this->fops->readdirp ); prev->this->fops->readdirp (_new, prev->this, local ->fd, 4096, 0, dict); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4736 | prev->this, prev->this->fops->readdirp,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4737, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( prev->this ->fops->readdirp_cbk) tmp_cbk = dht_rmdir_readdirp_cbk; _new->root = frame->root; _new->this = prev->this ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "prev->this->fops->readdirp"; _new-> unwind_to = "dht_rmdir_readdirp_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = prev->this; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, prev->this->fops->readdirp ); prev->this->fops->readdirp (_new, prev->this, local ->fd, 4096, 0, dict); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4737 | local->fd, 4096, 0, dict)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4737, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( prev->this ->fops->readdirp_cbk) tmp_cbk = dht_rmdir_readdirp_cbk; _new->root = frame->root; _new->this = prev->this ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "prev->this->fops->readdirp"; _new-> unwind_to = "dht_rmdir_readdirp_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = prev->this; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, prev->this->fops->readdirp ); prev->this->fops->readdirp (_new, prev->this, local ->fd, 4096, 0, dict); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4738 | ||||||
4739 | if (dict) | |||||
4740 | dict_unref (dict); | |||||
4741 | ||||||
4742 | return 0; | |||||
4743 | ||||||
4744 | err: | |||||
4745 | this_call_cnt = dht_frame_return (frame); | |||||
4746 | ||||||
4747 | if (is_last_call (this_call_cnt)(this_call_cnt == 0)) { | |||||
4748 | dht_rmdir_do (frame, this); | |||||
4749 | } | |||||
4750 | ||||||
4751 | return 0; | |||||
4752 | } | |||||
4753 | ||||||
4754 | ||||||
4755 | int | |||||
4756 | dht_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, | |||||
4757 | dict_t *xdata) | |||||
4758 | { | |||||
4759 | dht_local_t *local = NULL((void*)0); | |||||
4760 | dht_conf_t *conf = NULL((void*)0); | |||||
4761 | int op_errno = -1; | |||||
4762 | int i = -1; | |||||
4763 | ||||||
4764 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4764, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4765 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4765, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4766 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4766, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
4767 | VALIDATE_OR_GOTO (loc->inode, err)do { if (!loc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4767, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
4768 | VALIDATE_OR_GOTO (loc->path, err)do { if (!loc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4768, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
4769 | VALIDATE_OR_GOTO (this->private, err)do { if (!this->private) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "this->private" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4769, GF_LOG_WARNING, "invalid argument: " "this->private"); } while (0); goto err; } } while (0); | |||||
4770 | ||||||
4771 | conf = this->private; | |||||
4772 | ||||||
4773 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_RMDIR); | |||||
4774 | if (!local) { | |||||
4775 | op_errno = ENOMEM12; | |||||
4776 | goto err; | |||||
4777 | } | |||||
4778 | ||||||
4779 | local->call_cnt = conf->subvolume_cnt; | |||||
4780 | local->op_ret = 0; | |||||
4781 | local->fop_succeeded = 0; | |||||
4782 | ||||||
4783 | local->flags = flags; | |||||
4784 | ||||||
4785 | local->fd = fd_create (local->loc.inode, frame->root->pid); | |||||
4786 | if (!local->fd) { | |||||
4787 | ||||||
4788 | op_errno = ENOMEM12; | |||||
4789 | goto err; | |||||
4790 | } | |||||
4791 | ||||||
4792 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
4793 | STACK_WIND (frame, dht_rmdir_opendir_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4796, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->opendir_cbk) tmp_cbk = dht_rmdir_opendir_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->opendir"; _new->unwind_to = "dht_rmdir_opendir_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->opendir); conf->subvolumes[i]->fops-> opendir (_new, conf->subvolumes[i], loc, local->fd, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4794 | conf->subvolumes[i],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4796, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->opendir_cbk) tmp_cbk = dht_rmdir_opendir_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->opendir"; _new->unwind_to = "dht_rmdir_opendir_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->opendir); conf->subvolumes[i]->fops-> opendir (_new, conf->subvolumes[i], loc, local->fd, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4795 | conf->subvolumes[i]->fops->opendir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4796, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->opendir_cbk) tmp_cbk = dht_rmdir_opendir_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->opendir"; _new->unwind_to = "dht_rmdir_opendir_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->opendir); conf->subvolumes[i]->fops-> opendir (_new, conf->subvolumes[i], loc, local->fd, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4796 | loc, local->fd, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4796, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( conf->subvolumes [i]->fops->opendir_cbk) tmp_cbk = dht_rmdir_opendir_cbk ; _new->root = frame->root; _new->this = conf->subvolumes [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "conf->subvolumes[i]->fops->opendir"; _new->unwind_to = "dht_rmdir_opendir_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = conf->subvolumes[i]; if (frame->this->ctx-> measure_latency) gf_latency_begin (_new, conf->subvolumes[ i]->fops->opendir); conf->subvolumes[i]->fops-> opendir (_new, conf->subvolumes[i], loc, local->fd, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
4797 | } | |||||
4798 | ||||||
4799 | return 0; | |||||
4800 | ||||||
4801 | err: | |||||
4802 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
4803 | DHT_STACK_UNWIND (rmdir, frame, -1, op_errno,do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4804, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0) | |||||
4804 | NULL, NULL, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_rmdir_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t * old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ( "!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4804, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rmdir_cbk_t )frame->ret; _parent = frame->parent; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0), ((void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4805 | ||||||
4806 | return 0; | |||||
4807 | } | |||||
4808 | ||||||
4809 | int | |||||
4810 | dht_entrylk_cbk (call_frame_t *frame, void *cookie, | |||||
4811 | xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xdata) | |||||
4812 | ||||||
4813 | { | |||||
4814 | DHT_STACK_UNWIND (entrylk, frame, op_ret, op_errno, xdata)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_entrylk_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4814, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_entrylk_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4815 | return 0; | |||||
4816 | } | |||||
4817 | ||||||
4818 | ||||||
4819 | int | |||||
4820 | dht_entrylk (call_frame_t *frame, xlator_t *this, | |||||
4821 | const char *volume, loc_t *loc, const char *basename__xpg_basename, | |||||
4822 | entrylk_cmd cmd, entrylk_type type, dict_t *xdata) | |||||
4823 | { | |||||
4824 | xlator_t *subvol = NULL((void*)0); | |||||
4825 | int op_errno = -1; | |||||
4826 | dht_local_t *local = NULL((void*)0); | |||||
4827 | ||||||
4828 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4828, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4829 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4829, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4830 | VALIDATE_OR_GOTO (loc, err)do { if (!loc) { (*__errno_location ()) = 22; do { do { if (0 ) printf ("invalid argument: " "loc"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4830, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
4831 | VALIDATE_OR_GOTO (loc->inode, err)do { if (!loc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4831, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
4832 | VALIDATE_OR_GOTO (loc->path, err)do { if (!loc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "loc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "dht-common.c", __FUNCTION__, 4832, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
4833 | ||||||
4834 | local = dht_local_init (frame, loc, NULL((void*)0), GF_FOP_ENTRYLK); | |||||
4835 | if (!local) { | |||||
4836 | op_errno = ENOMEM12; | |||||
4837 | goto err; | |||||
4838 | } | |||||
4839 | ||||||
4840 | subvol = local->cached_subvol; | |||||
4841 | if (!subvol) { | |||||
4842 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4843, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0) | |||||
4843 | "no cached subvolume for path=%s", loc->path)do { do { if (0) printf ("no cached subvolume for path=%s", loc ->path); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4843, GF_LOG_DEBUG, "no cached subvolume for path=%s" , loc->path); } while (0); | |||||
4844 | op_errno = EINVAL22; | |||||
4845 | goto err; | |||||
4846 | } | |||||
4847 | ||||||
4848 | local->call_cnt = 1; | |||||
4849 | ||||||
4850 | STACK_WIND (frame, dht_entrylk_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4852, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->entrylk_cbk) tmp_cbk = dht_entrylk_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->entrylk" ; _new->unwind_to = "dht_entrylk_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->entrylk); subvol ->fops->entrylk (_new, subvol, volume, loc, __xpg_basename , cmd, type, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4851 | subvol, subvol->fops->entrylk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4852, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->entrylk_cbk) tmp_cbk = dht_entrylk_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->entrylk" ; _new->unwind_to = "dht_entrylk_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->entrylk); subvol ->fops->entrylk (_new, subvol, volume, loc, __xpg_basename , cmd, type, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4852 | volume, loc, basename, cmd, type, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4852, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->entrylk_cbk) tmp_cbk = dht_entrylk_cbk; _new->root = frame ->root; _new->this = subvol; _new->ret = (ret_fn_t) tmp_cbk ; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->entrylk" ; _new->unwind_to = "dht_entrylk_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->entrylk); subvol ->fops->entrylk (_new, subvol, volume, loc, __xpg_basename , cmd, type, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4853 | ||||||
4854 | return 0; | |||||
4855 | ||||||
4856 | err: | |||||
4857 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
4858 | DHT_STACK_UNWIND (entrylk, frame, -1, op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_entrylk_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4858, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_entrylk_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4859 | ||||||
4860 | return 0; | |||||
4861 | } | |||||
4862 | ||||||
4863 | ||||||
4864 | int | |||||
4865 | dht_fentrylk_cbk (call_frame_t *frame, void *cookie, | |||||
4866 | xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xdata) | |||||
4867 | ||||||
4868 | { | |||||
4869 | DHT_STACK_UNWIND (fentrylk, frame, op_ret, op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_fentrylk_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4869, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fentrylk_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, op_ret, op_errno, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4870 | return 0; | |||||
4871 | } | |||||
4872 | ||||||
4873 | ||||||
4874 | int | |||||
4875 | dht_fentrylk (call_frame_t *frame, xlator_t *this, | |||||
4876 | const char *volume, fd_t *fd, const char *basename__xpg_basename, | |||||
4877 | entrylk_cmd cmd, entrylk_type type, dict_t *xdata) | |||||
4878 | { | |||||
4879 | xlator_t *subvol = NULL((void*)0); | |||||
4880 | int op_errno = -1; | |||||
4881 | ||||||
4882 | VALIDATE_OR_GOTO (frame, err)do { if (!frame) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "frame"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4882, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4883 | VALIDATE_OR_GOTO (this, err)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4883, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4884 | VALIDATE_OR_GOTO (fd, err)do { if (!fd) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "fd"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "dht-common.c" , __FUNCTION__, 4884, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
4885 | ||||||
4886 | subvol = dht_subvol_get_cached (this, fd->inode); | |||||
4887 | if (!subvol) { | |||||
4888 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("no cached subvolume for fd=%p", fd) ; } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4889, GF_LOG_DEBUG, "no cached subvolume for fd=%p", fd); } while (0) | |||||
4889 | "no cached subvolume for fd=%p", fd)do { do { if (0) printf ("no cached subvolume for fd=%p", fd) ; } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__ , 4889, GF_LOG_DEBUG, "no cached subvolume for fd=%p", fd); } while (0); | |||||
4890 | op_errno = EINVAL22; | |||||
4891 | goto err; | |||||
4892 | } | |||||
4893 | ||||||
4894 | STACK_WIND (frame, dht_fentrylk_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4896, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->fentrylk_cbk) tmp_cbk = dht_fentrylk_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->fentrylk" ; _new->unwind_to = "dht_fentrylk_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->fentrylk); subvol ->fops->fentrylk (_new, subvol, volume, fd, __xpg_basename , cmd, type, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4895 | subvol, subvol->fops->fentrylk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4896, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->fentrylk_cbk) tmp_cbk = dht_fentrylk_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->fentrylk" ; _new->unwind_to = "dht_fentrylk_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->fentrylk); subvol ->fops->fentrylk (_new, subvol, volume, fd, __xpg_basename , cmd, type, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4896 | volume, fd, basename, cmd, type, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__, 4896, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( subvol->fops ->fentrylk_cbk) tmp_cbk = dht_fentrylk_cbk; _new->root = frame->root; _new->this = subvol; _new->ret = (ret_fn_t ) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new ->wind_from = __FUNCTION__; _new->wind_to = "subvol->fops->fentrylk" ; _new->unwind_to = "dht_fentrylk_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = subvol; if (frame->this->ctx->measure_latency) gf_latency_begin (_new, subvol->fops->fentrylk); subvol ->fops->fentrylk (_new, subvol, volume, fd, __xpg_basename , cmd, type, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4897 | ||||||
4898 | return 0; | |||||
4899 | ||||||
4900 | err: | |||||
4901 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
4902 | DHT_STACK_UNWIND (fentrylk, frame, -1, op_errno, NULL)do { dht_local_t *__local = ((void*)0); xlator_t *__xl = ((void *)0); if (frame) { __xl = frame->this; __local = frame-> local; frame->local = ((void*)0); } do { fop_fentrylk_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!frame) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "dht-common.c", __FUNCTION__ , 4902, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fentrylk_cbk_t )frame->ret; _parent = frame->parent ; pthread_spin_lock (&frame->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&frame->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = _parent->this; frame->complete = _gf_true; frame-> unwind_from = __FUNCTION__; if (frame->this->ctx->measure_latency ) gf_latency_end (frame); fn (_parent, frame->cookie, _parent ->this, -1, op_errno, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); dht_local_wipe (__xl, __local); } while (0); | |||||
4903 | ||||||
4904 | return 0; | |||||
4905 | } | |||||
4906 | ||||||
4907 | ||||||
4908 | int | |||||
4909 | dht_forget (xlator_t *this, inode_t *inode) | |||||
4910 | { | |||||
4911 | uint64_t ctx_int = 0; | |||||
4912 | dht_inode_ctx_t *ctx = NULL((void*)0); | |||||
4913 | dht_layout_t *layout = NULL((void*)0); | |||||
4914 | ||||||
4915 | inode_ctx_del (inode, this, &ctx_int)inode_ctx_del2(inode,this,&ctx_int,0); | |||||
4916 | ||||||
4917 | if (!ctx_int) | |||||
4918 | return 0; | |||||
4919 | ||||||
4920 | ctx = (dht_inode_ctx_t *) (long) ctx_int; | |||||
4921 | ||||||
4922 | layout = ctx->layout; | |||||
4923 | ctx->layout = NULL((void*)0); | |||||
4924 | dht_layout_unref (this, layout); | |||||
4925 | GF_FREE (ctx)__gf_free (ctx); | |||||
4926 | ||||||
4927 | return 0; | |||||
4928 | } | |||||
4929 | ||||||
4930 | ||||||
4931 | int | |||||
4932 | dht_notify (xlator_t *this, int event, void *data, ...) | |||||
4933 | { | |||||
4934 | xlator_t *subvol = NULL((void*)0); | |||||
4935 | int cnt = -1; | |||||
4936 | int i = -1; | |||||
4937 | dht_conf_t *conf = NULL((void*)0); | |||||
4938 | int ret = -1; | |||||
4939 | int propagate = 0; | |||||
4940 | ||||||
4941 | int had_heard_from_all = 0; | |||||
4942 | int have_heard_from_all = 0; | |||||
4943 | struct timeval time = {0,}; | |||||
4944 | gf_defrag_info_t *defrag = NULL((void*)0); | |||||
4945 | dict_t *dict = NULL((void*)0); | |||||
4946 | gf_defrag_type cmd = 0; | |||||
4947 | dict_t *output = NULL((void*)0); | |||||
4948 | va_list ap; | |||||
4949 | ||||||
4950 | ||||||
4951 | conf = this->private; | |||||
4952 | if (!conf) | |||||
4953 | return ret; | |||||
4954 | ||||||
4955 | /* had all subvolumes reported status once till now? */ | |||||
4956 | had_heard_from_all = 1; | |||||
4957 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
4958 | if (!conf->last_event[i]) { | |||||
4959 | had_heard_from_all = 0; | |||||
4960 | } | |||||
4961 | } | |||||
4962 | ||||||
4963 | switch (event) { | |||||
4964 | case GF_EVENT_CHILD_UP: | |||||
4965 | subvol = data; | |||||
4966 | ||||||
4967 | conf->gen++; | |||||
4968 | ||||||
4969 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
4970 | if (subvol == conf->subvolumes[i]) { | |||||
4971 | cnt = i; | |||||
4972 | break; | |||||
4973 | } | |||||
4974 | } | |||||
4975 | ||||||
4976 | if (cnt == -1) { | |||||
4977 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("got GF_EVENT_CHILD_UP bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4979, GF_LOG_DEBUG, "got GF_EVENT_CHILD_UP bad subvolume %s" , subvol->name); } while (0) | |||||
4978 | "got GF_EVENT_CHILD_UP bad subvolume %s",do { do { if (0) printf ("got GF_EVENT_CHILD_UP bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4979, GF_LOG_DEBUG, "got GF_EVENT_CHILD_UP bad subvolume %s" , subvol->name); } while (0) | |||||
4979 | subvol->name)do { do { if (0) printf ("got GF_EVENT_CHILD_UP bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 4979, GF_LOG_DEBUG, "got GF_EVENT_CHILD_UP bad subvolume %s" , subvol->name); } while (0); | |||||
4980 | break; | |||||
4981 | } | |||||
4982 | ||||||
4983 | gettimeofday (&time, NULL((void*)0)); | |||||
4984 | LOCK (&conf->subvolume_lock)pthread_spin_lock (&conf->subvolume_lock); | |||||
4985 | { | |||||
4986 | conf->subvolume_status[cnt] = 1; | |||||
4987 | conf->last_event[cnt] = event; | |||||
4988 | conf->subvol_up_time[cnt] = time.tv_sec; | |||||
4989 | } | |||||
4990 | UNLOCK (&conf->subvolume_lock)pthread_spin_unlock (&conf->subvolume_lock); | |||||
4991 | ||||||
4992 | /* one of the node came back up, do a stat update */ | |||||
4993 | dht_get_du_info_for_subvol (this, cnt); | |||||
4994 | ||||||
4995 | break; | |||||
4996 | ||||||
4997 | case GF_EVENT_CHILD_MODIFIED: | |||||
4998 | subvol = data; | |||||
4999 | ||||||
5000 | conf->gen++; | |||||
5001 | propagate = 1; | |||||
5002 | ||||||
5003 | break; | |||||
5004 | ||||||
5005 | case GF_EVENT_CHILD_DOWN: | |||||
5006 | subvol = data; | |||||
5007 | ||||||
5008 | if (conf->assert_no_child_down) { | |||||
5009 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("Received CHILD_DOWN. Exiting"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 5010 , GF_LOG_WARNING, "Received CHILD_DOWN. Exiting"); } while (0 ) | |||||
5010 | "Received CHILD_DOWN. Exiting")do { do { if (0) printf ("Received CHILD_DOWN. Exiting"); } while (0); _gf_log (this->name, "dht-common.c", __FUNCTION__, 5010 , GF_LOG_WARNING, "Received CHILD_DOWN. Exiting"); } while (0 ); | |||||
5011 | if (conf->defrag) { | |||||
5012 | gf_defrag_stop (conf->defrag, NULL((void*)0)); | |||||
5013 | } else { | |||||
5014 | kill (getpid(), SIGTERM15); | |||||
5015 | } | |||||
5016 | } | |||||
5017 | ||||||
5018 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
5019 | if (subvol == conf->subvolumes[i]) { | |||||
5020 | cnt = i; | |||||
5021 | break; | |||||
5022 | } | |||||
5023 | } | |||||
5024 | ||||||
5025 | if (cnt == -1) { | |||||
5026 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("got GF_EVENT_CHILD_DOWN bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 5028, GF_LOG_DEBUG, "got GF_EVENT_CHILD_DOWN bad subvolume %s" , subvol->name); } while (0) | |||||
5027 | "got GF_EVENT_CHILD_DOWN bad subvolume %s",do { do { if (0) printf ("got GF_EVENT_CHILD_DOWN bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 5028, GF_LOG_DEBUG, "got GF_EVENT_CHILD_DOWN bad subvolume %s" , subvol->name); } while (0) | |||||
5028 | subvol->name)do { do { if (0) printf ("got GF_EVENT_CHILD_DOWN bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 5028, GF_LOG_DEBUG, "got GF_EVENT_CHILD_DOWN bad subvolume %s" , subvol->name); } while (0); | |||||
5029 | break; | |||||
5030 | } | |||||
5031 | ||||||
5032 | LOCK (&conf->subvolume_lock)pthread_spin_lock (&conf->subvolume_lock); | |||||
5033 | { | |||||
5034 | conf->subvolume_status[cnt] = 0; | |||||
5035 | conf->last_event[cnt] = event; | |||||
5036 | conf->subvol_up_time[cnt] = 0; | |||||
5037 | } | |||||
5038 | UNLOCK (&conf->subvolume_lock)pthread_spin_unlock (&conf->subvolume_lock); | |||||
5039 | ||||||
5040 | break; | |||||
5041 | ||||||
5042 | case GF_EVENT_CHILD_CONNECTING: | |||||
5043 | subvol = data; | |||||
5044 | ||||||
5045 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
5046 | if (subvol == conf->subvolumes[i]) { | |||||
5047 | cnt = i; | |||||
5048 | break; | |||||
5049 | } | |||||
5050 | } | |||||
5051 | ||||||
5052 | if (cnt == -1) { | |||||
5053 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("got GF_EVENT_CHILD_CONNECTING bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 5055, GF_LOG_DEBUG, "got GF_EVENT_CHILD_CONNECTING bad subvolume %s" , subvol->name); } while (0) | |||||
5054 | "got GF_EVENT_CHILD_CONNECTING bad subvolume %s",do { do { if (0) printf ("got GF_EVENT_CHILD_CONNECTING bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 5055, GF_LOG_DEBUG, "got GF_EVENT_CHILD_CONNECTING bad subvolume %s" , subvol->name); } while (0) | |||||
5055 | subvol->name)do { do { if (0) printf ("got GF_EVENT_CHILD_CONNECTING bad subvolume %s" , subvol->name); } while (0); _gf_log (this->name, "dht-common.c" , __FUNCTION__, 5055, GF_LOG_DEBUG, "got GF_EVENT_CHILD_CONNECTING bad subvolume %s" , subvol->name); } while (0); | |||||
5056 | break; | |||||
5057 | } | |||||
5058 | ||||||
5059 | LOCK (&conf->subvolume_lock)pthread_spin_lock (&conf->subvolume_lock); | |||||
5060 | { | |||||
5061 | conf->last_event[cnt] = event; | |||||
5062 | } | |||||
5063 | UNLOCK (&conf->subvolume_lock)pthread_spin_unlock (&conf->subvolume_lock); | |||||
5064 | ||||||
5065 | break; | |||||
5066 | case GF_EVENT_VOLUME_DEFRAG: | |||||
5067 | { | |||||
5068 | if (!conf->defrag) { | |||||
5069 | return ret; | |||||
5070 | } | |||||
5071 | defrag = conf->defrag; | |||||
5072 | ||||||
5073 | dict = data; | |||||
5074 | va_start (ap, data)__builtin_va_start(ap, data); | |||||
5075 | output = va_arg (ap, dict_t*)__builtin_va_arg(ap, dict_t*); | |||||
5076 | ||||||
5077 | ret = dict_get_int32 (dict, "rebalance-command", | |||||
5078 | (int32_t*)&cmd); | |||||
5079 | if (ret) | |||||
5080 | return ret; | |||||
5081 | LOCK (&defrag->lock)pthread_spin_lock (&defrag->lock); | |||||
5082 | { | |||||
5083 | if (defrag->is_exiting) | |||||
5084 | goto unlock; | |||||
5085 | if (cmd == GF_DEFRAG_CMD_STATUS) | |||||
5086 | gf_defrag_status_get (defrag, output); | |||||
5087 | else if (cmd == GF_DEFRAG_CMD_STOP) | |||||
5088 | gf_defrag_stop (defrag, output); | |||||
5089 | } | |||||
5090 | unlock: | |||||
5091 | UNLOCK (&defrag->lock)pthread_spin_unlock (&defrag->lock); | |||||
5092 | return 0; | |||||
5093 | break; | |||||
5094 | } | |||||
5095 | ||||||
5096 | default: | |||||
5097 | propagate = 1; | |||||
5098 | break; | |||||
5099 | } | |||||
5100 | ||||||
5101 | ||||||
5102 | /* have all subvolumes reported status once by now? */ | |||||
5103 | have_heard_from_all = 1; | |||||
5104 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
5105 | if (!conf->last_event[i]) | |||||
5106 | have_heard_from_all = 0; | |||||
5107 | } | |||||
5108 | ||||||
5109 | /* if all subvols have reported status, no need to hide anything | |||||
5110 | or wait for anything else. Just propagate blindly */ | |||||
5111 | if (have_heard_from_all) { | |||||
5112 | propagate = 1; | |||||
5113 | ||||||
5114 | } | |||||
5115 | ||||||
5116 | ||||||
5117 | if (!had_heard_from_all && have_heard_from_all) { | |||||
5118 | /* This is the first event which completes aggregation | |||||
5119 | of events from all subvolumes. If at least one subvol | |||||
5120 | had come up, propagate CHILD_UP, but only this time | |||||
5121 | */ | |||||
5122 | event = GF_EVENT_CHILD_DOWN; | |||||
5123 | ||||||
5124 | for (i = 0; i < conf->subvolume_cnt; i++) { | |||||
5125 | if (conf->last_event[i] == GF_EVENT_CHILD_UP) { | |||||
5126 | event = GF_EVENT_CHILD_UP; | |||||
5127 | break; | |||||
5128 | } | |||||
5129 | ||||||
5130 | if (conf->last_event[i] == GF_EVENT_CHILD_CONNECTING) { | |||||
5131 | event = GF_EVENT_CHILD_CONNECTING; | |||||
5132 | /* continue to check other events for CHILD_UP */ | |||||
5133 | } | |||||
5134 | } | |||||
5135 | ||||||
5136 | /* rebalance is started with assert_no_child_down. So we do | |||||
5137 | * not need to handle CHILD_DOWN event here. | |||||
5138 | */ | |||||
5139 | if (conf->defrag) { | |||||
5140 | ret = pthread_create (&conf->defrag->th, NULL((void*)0), | |||||
5141 | gf_defrag_start, this); | |||||
5142 | if (ret) { | |||||
5143 | conf->defrag = NULL((void*)0); | |||||
5144 | GF_FREE (conf->defrag)__gf_free (conf->defrag); | |||||
5145 | kill (getpid(), SIGTERM15); | |||||
5146 | } | |||||
5147 | } | |||||
5148 | } | |||||
5149 | ||||||
5150 | ret = 0; | |||||
5151 | if (propagate) | |||||
5152 | ret = default_notify (this, event, data); | |||||
5153 | ||||||
5154 | return ret; | |||||
5155 | } | |||||
5156 | ||||||
5157 | int | |||||
5158 | dht_inode_ctx_layout_get (inode_t *inode, xlator_t *this, dht_layout_t **layout) | |||||
5159 | { | |||||
5160 | dht_inode_ctx_t *ctx = NULL((void*)0); | |||||
5161 | int ret = -1; | |||||
5162 | ||||||
5163 | ret = dht_inode_ctx_get (inode, this, &ctx); | |||||
5164 | ||||||
5165 | if (!ret && ctx) { | |||||
5166 | if (ctx->layout) { | |||||
5167 | if (layout) | |||||
5168 | *layout = ctx->layout; | |||||
5169 | ret = 0; | |||||
5170 | } else { | |||||
5171 | ret = -1; | |||||
5172 | } | |||||
5173 | } | |||||
5174 | ||||||
5175 | return ret; | |||||
5176 | } |