File: | xlators/cluster/dht/src/dht-common.c |
Location: | line 429, column 17 |
Description: | Value stored to 'ret' is never read |
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, |
Value stored to 'ret' is never read | |
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 | } |