File: | xlators/cluster/stripe/src/stripe.c |
Location: | line 4811, column 17 |
Description: | Access to field 'op_ret' results in a dereference of a null pointer (loaded from variable 'local') |
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 | * xlators/cluster/stripe: | |||||
13 | * Stripe translator, stripes the data across its child nodes, | |||||
14 | * as per the options given in the volfile. The striping works | |||||
15 | * fairly simple. It writes files at different offset as per | |||||
16 | * calculation. So, 'ls -l' output at the real posix level will | |||||
17 | * show file size bigger than the actual size. But when one does | |||||
18 | * 'df' or 'du <file>', real size of the file on the server is shown. | |||||
19 | * | |||||
20 | * WARNING: | |||||
21 | * Stripe translator can't regenerate data if a child node gets disconnected. | |||||
22 | * So, no 'self-heal' for stripe. Hence the advice, use stripe only when its | |||||
23 | * very much necessary, or else, use it in combination with AFR, to have a | |||||
24 | * backup copy. | |||||
25 | */ | |||||
26 | #include <fnmatch.h> | |||||
27 | ||||||
28 | #include "stripe.h" | |||||
29 | #include "libxlator.h" | |||||
30 | #include "byte-order.h" | |||||
31 | #include "statedump.h" | |||||
32 | ||||||
33 | struct volume_options options[]; | |||||
34 | ||||||
35 | int32_t | |||||
36 | stripe_sh_chown_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
37 | int32_t op_ret, int32_t op_errno, | |||||
38 | struct iatt *preop, struct iatt *postop, dict_t *xdata) | |||||
39 | { | |||||
40 | int callcnt = -1; | |||||
41 | stripe_local_t *local = NULL((void*)0); | |||||
42 | ||||||
43 | if (!this || !frame || !frame->local) { | |||||
44 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 44, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
45 | goto out; | |||||
46 | } | |||||
47 | ||||||
48 | local = frame->local; | |||||
49 | ||||||
50 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
51 | { | |||||
52 | callcnt = --local->call_count; | |||||
53 | } | |||||
54 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
55 | ||||||
56 | if (!callcnt) { | |||||
57 | STRIPE_STACK_DESTROY (frame)do { stripe_local_t *__local = ((void*)0); __local = frame-> local; frame->local = ((void*)0); STACK_DESTROY (frame-> root); if (__local) { stripe_local_wipe (__local); mem_put (__local ); } } while (0); | |||||
58 | } | |||||
59 | out: | |||||
60 | return 0; | |||||
61 | } | |||||
62 | ||||||
63 | int32_t | |||||
64 | stripe_sh_make_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
65 | int32_t op_ret, int32_t op_errno, inode_t *inode, | |||||
66 | struct iatt *buf, struct iatt *preparent, | |||||
67 | struct iatt *postparent, dict_t *xdata) | |||||
68 | { | |||||
69 | stripe_local_t *local = NULL((void*)0); | |||||
70 | call_frame_t *prev = NULL((void*)0); | |||||
71 | ||||||
72 | if (!frame || !frame->local || !cookie || !this) { | |||||
73 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 73, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
74 | goto out; | |||||
75 | } | |||||
76 | ||||||
77 | prev = cookie; | |||||
78 | local = frame->local; | |||||
79 | ||||||
80 | STACK_WIND (frame, stripe_sh_chown_cbk, prev->this,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 82, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( prev->this ->fops->setattr_cbk) tmp_cbk = stripe_sh_chown_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->setattr"; _new->unwind_to = "stripe_sh_chown_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _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->setattr); prev->this->fops ->setattr (_new, prev->this, &local->loc, &local ->stbuf, (0x2 | 0x4), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
81 | prev->this->fops->setattr, &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", "stripe.c", __FUNCTION__, 82, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( prev->this ->fops->setattr_cbk) tmp_cbk = stripe_sh_chown_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->setattr"; _new->unwind_to = "stripe_sh_chown_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _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->setattr); prev->this->fops ->setattr (_new, prev->this, &local->loc, &local ->stbuf, (0x2 | 0x4), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
82 | &local->stbuf, (GF_SET_ATTR_UID | GF_SET_ATTR_GID), 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", "stripe.c", __FUNCTION__, 82, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( prev->this ->fops->setattr_cbk) tmp_cbk = stripe_sh_chown_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->setattr"; _new->unwind_to = "stripe_sh_chown_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _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->setattr); prev->this->fops ->setattr (_new, prev->this, &local->loc, &local ->stbuf, (0x2 | 0x4), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
83 | ||||||
84 | out: | |||||
85 | return 0; | |||||
86 | } | |||||
87 | ||||||
88 | int32_t | |||||
89 | stripe_entry_self_heal (call_frame_t *frame, xlator_t *this, | |||||
90 | stripe_local_t *local) | |||||
91 | { | |||||
92 | xlator_list_t *trav = NULL((void*)0); | |||||
93 | call_frame_t *rframe = NULL((void*)0); | |||||
94 | stripe_local_t *rlocal = NULL((void*)0); | |||||
95 | stripe_private_t *priv = NULL((void*)0); | |||||
96 | dict_t *xdata = NULL((void*)0); | |||||
97 | int ret = 0; | |||||
98 | ||||||
99 | if (!local || !this || !frame) { | |||||
100 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 100, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
101 | goto out; | |||||
102 | } | |||||
103 | ||||||
104 | if (!(IA_ISREG (local->stbuf.ia_type)(local->stbuf.ia_type == IA_IFREG) || | |||||
105 | IA_ISDIR (local->stbuf.ia_type)(local->stbuf.ia_type == IA_IFDIR))) | |||||
106 | return 0; | |||||
107 | ||||||
108 | priv = this->private; | |||||
109 | trav = this->children; | |||||
110 | rframe = copy_frame (frame); | |||||
111 | if (!rframe) { | |||||
112 | goto out; | |||||
113 | } | |||||
114 | rlocal = mem_get0 (this->local_pool); | |||||
115 | if (!rlocal) { | |||||
116 | goto out; | |||||
117 | } | |||||
118 | rframe->local = rlocal; | |||||
119 | rlocal->call_count = priv->child_count; | |||||
120 | loc_copy (&rlocal->loc, &local->loc); | |||||
121 | memcpy (&rlocal->stbuf, &local->stbuf, sizeof (struct iatt)); | |||||
122 | ||||||
123 | xdata = dict_new (); | |||||
124 | if (!xdata) | |||||
125 | goto out; | |||||
126 | ||||||
127 | ret = dict_set_static_bin (xdata, "gfid-req", local->stbuf.ia_gfid, 16); | |||||
128 | if (ret) | |||||
129 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: failed to set gfid-req", local-> loc.path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 130, GF_LOG_WARNING, "%s: failed to set gfid-req", local-> loc.path); } while (0) | |||||
130 | "%s: failed to set gfid-req", local->loc.path)do { do { if (0) printf ("%s: failed to set gfid-req", local-> loc.path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 130, GF_LOG_WARNING, "%s: failed to set gfid-req", local-> loc.path); } while (0); | |||||
131 | ||||||
132 | while (trav) { | |||||
133 | if (IA_ISREG (local->stbuf.ia_type)(local->stbuf.ia_type == IA_IFREG)) { | |||||
134 | STACK_WIND (rframe, stripe_sh_make_entry_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 139, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mknod"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mknod) ; trav->xlator->fops->mknod (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, 0, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
135 | trav->xlator, trav->xlator->fops->mknod,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 139, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mknod"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mknod) ; trav->xlator->fops->mknod (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, 0, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
136 | &local->loc,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 139, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mknod"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mknod) ; trav->xlator->fops->mknod (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, 0, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
137 | st_mode_from_ia (local->stbuf.ia_prot,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 139, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mknod"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mknod) ; trav->xlator->fops->mknod (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, 0, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
138 | local->stbuf.ia_type),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 139, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mknod"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mknod) ; trav->xlator->fops->mknod (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, 0, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
139 | 0, 0, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 139, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mknod"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mknod) ; trav->xlator->fops->mknod (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, 0, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
140 | } | |||||
141 | if (IA_ISDIR (local->stbuf.ia_type)(local->stbuf.ia_type == IA_IFDIR)) { | |||||
142 | STACK_WIND (rframe, stripe_sh_make_entry_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 147, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mkdir"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mkdir) ; trav->xlator->fops->mkdir (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, xdata); (*__glusterfs_this_location() ) = old_THIS; } while (0) | |||||
143 | trav->xlator, trav->xlator->fops->mkdir,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 147, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mkdir"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mkdir) ; trav->xlator->fops->mkdir (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, xdata); (*__glusterfs_this_location() ) = old_THIS; } while (0) | |||||
144 | &local->loc,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 147, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mkdir"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mkdir) ; trav->xlator->fops->mkdir (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, xdata); (*__glusterfs_this_location() ) = old_THIS; } while (0) | |||||
145 | st_mode_from_ia (local->stbuf.ia_prot,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 147, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mkdir"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mkdir) ; trav->xlator->fops->mkdir (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, xdata); (*__glusterfs_this_location() ) = old_THIS; } while (0) | |||||
146 | local->stbuf.ia_type),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 147, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mkdir"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mkdir) ; trav->xlator->fops->mkdir (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, xdata); (*__glusterfs_this_location() ) = old_THIS; } while (0) | |||||
147 | 0, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 147, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_sh_make_entry_cbk; _new ->root = rframe->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->mkdir"; _new-> unwind_to = "stripe_sh_make_entry_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (rframe->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->mkdir) ; trav->xlator->fops->mkdir (_new, trav->xlator, & local->loc, st_mode_from_ia (local->stbuf.ia_prot, local ->stbuf.ia_type), 0, xdata); (*__glusterfs_this_location() ) = old_THIS; } while (0); | |||||
148 | } | |||||
149 | trav = trav->next; | |||||
150 | } | |||||
151 | ||||||
152 | if (xdata) | |||||
153 | dict_unref (xdata); | |||||
154 | return 0; | |||||
155 | ||||||
156 | out: | |||||
157 | if (rframe) | |||||
158 | STRIPE_STACK_DESTROY (rframe)do { stripe_local_t *__local = ((void*)0); __local = rframe-> local; rframe->local = ((void*)0); STACK_DESTROY (rframe-> root); if (__local) { stripe_local_wipe (__local); mem_put (__local ); } } while (0); | |||||
159 | if (xdata) | |||||
160 | dict_unref (xdata); | |||||
161 | ||||||
162 | return 0; | |||||
163 | } | |||||
164 | ||||||
165 | ||||||
166 | int32_t | |||||
167 | stripe_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
168 | int32_t op_ret, int32_t op_errno, inode_t *inode, | |||||
169 | struct iatt *buf, dict_t *xdata, struct iatt *postparent) | |||||
170 | { | |||||
171 | int32_t callcnt = 0; | |||||
172 | stripe_local_t *local = NULL((void*)0); | |||||
173 | call_frame_t *prev = NULL((void*)0); | |||||
174 | int ret = 0; | |||||
175 | ||||||
176 | if (!this || !frame || !frame->local || !cookie) { | |||||
177 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 177, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
178 | goto out; | |||||
179 | } | |||||
180 | ||||||
181 | prev = cookie; | |||||
182 | local = frame->local; | |||||
183 | ||||||
184 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
185 | { | |||||
186 | callcnt = --local->call_count; | |||||
187 | ||||||
188 | if (op_ret == -1) { | |||||
189 | if (op_errno != ENOENT2) | |||||
190 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 193, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
191 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 193, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
192 | prev->this->name,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 193, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
193 | strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 193, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
194 | if (local->op_errno != ESTALE116) | |||||
195 | local->op_errno = op_errno; | |||||
196 | if (((op_errno != ENOENT2) && (op_errno != ENOTCONN107)) || | |||||
197 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
198 | local->failed = 1; | |||||
199 | if (op_errno == ENOENT2) | |||||
200 | local->entry_self_heal_needed = 1; | |||||
201 | } | |||||
202 | ||||||
203 | if (op_ret >= 0) { | |||||
204 | local->op_ret = 0; | |||||
205 | if (IA_ISREG (buf->ia_type)(buf->ia_type == IA_IFREG)) { | |||||
206 | ret = stripe_ctx_handle (this, prev, local, | |||||
207 | xdata); | |||||
208 | if (ret) | |||||
209 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Error getting fctx info from" " dict" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 211, GF_LOG_ERROR, "Error getting fctx info from" " dict"); } while (0) | |||||
210 | "Error getting fctx info from"do { do { if (0) printf ("Error getting fctx info from" " dict" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 211, GF_LOG_ERROR, "Error getting fctx info from" " dict"); } while (0) | |||||
211 | " dict")do { do { if (0) printf ("Error getting fctx info from" " dict" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 211, GF_LOG_ERROR, "Error getting fctx info from" " dict"); } while (0); | |||||
212 | } | |||||
213 | ||||||
214 | if (FIRST_CHILD(this)(this->children->xlator) == prev->this) { | |||||
215 | local->stbuf = *buf; | |||||
216 | local->postparent = *postparent; | |||||
217 | local->inode = inode_ref (inode); | |||||
218 | if (xdata) | |||||
219 | local->xdata = dict_ref (xdata); | |||||
220 | if (local->xattr) { | |||||
221 | stripe_aggregate_xattr (local->xdata, | |||||
222 | local->xattr); | |||||
223 | dict_unref (local->xattr); | |||||
224 | local->xattr = NULL((void*)0); | |||||
225 | } | |||||
226 | } | |||||
227 | ||||||
228 | if (!local->xdata && !local->xattr) { | |||||
229 | local->xattr = dict_ref (xdata); | |||||
230 | } else if (local->xdata) { | |||||
231 | stripe_aggregate_xattr (local->xdata, xdata); | |||||
232 | } else if (local->xattr) { | |||||
233 | stripe_aggregate_xattr (local->xattr, xdata); | |||||
234 | } | |||||
235 | ||||||
236 | local->stbuf_blocks += buf->ia_blocks; | |||||
237 | local->postparent_blocks += postparent->ia_blocks; | |||||
238 | ||||||
239 | correct_file_size(buf, local->fctx, prev); | |||||
240 | ||||||
241 | if (local->stbuf_size < buf->ia_size) | |||||
242 | local->stbuf_size = buf->ia_size; | |||||
243 | if (local->postparent_size < postparent->ia_size) | |||||
244 | local->postparent_size = postparent->ia_size; | |||||
245 | ||||||
246 | if (uuid_is_null (local->ia_gfid)) | |||||
247 | uuid_copy (local->ia_gfid, buf->ia_gfid); | |||||
248 | ||||||
249 | /* Make sure the gfid on all the nodes are same */ | |||||
250 | if (uuid_compare (local->ia_gfid, buf->ia_gfid)) { | |||||
251 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s: gfid different on subvolume %s" , local->loc.path, prev->this->name); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 253, GF_LOG_WARNING , "%s: gfid different on subvolume %s", local->loc.path, prev ->this->name); } while (0) | |||||
252 | "%s: gfid different on subvolume %s",do { do { if (0) printf ("%s: gfid different on subvolume %s" , local->loc.path, prev->this->name); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 253, GF_LOG_WARNING , "%s: gfid different on subvolume %s", local->loc.path, prev ->this->name); } while (0) | |||||
253 | local->loc.path, prev->this->name)do { do { if (0) printf ("%s: gfid different on subvolume %s" , local->loc.path, prev->this->name); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 253, GF_LOG_WARNING , "%s: gfid different on subvolume %s", local->loc.path, prev ->this->name); } while (0); | |||||
254 | } | |||||
255 | } | |||||
256 | } | |||||
257 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
258 | ||||||
259 | if (!callcnt) { | |||||
260 | if (local->op_ret == 0 && local->entry_self_heal_needed && | |||||
261 | !uuid_is_null (local->loc.inode->gfid)) | |||||
262 | stripe_entry_self_heal (frame, this, local); | |||||
263 | ||||||
264 | if (local->failed) | |||||
265 | local->op_ret = -1; | |||||
266 | ||||||
267 | if (local->op_ret != -1) { | |||||
268 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
269 | local->stbuf.ia_size = local->stbuf_size; | |||||
270 | local->postparent.ia_blocks = local->postparent_blocks; | |||||
271 | local->postparent.ia_size = local->postparent_size; | |||||
272 | inode_ctx_put (local->inode, this, | |||||
273 | (uint64_t) (long)local->fctx); | |||||
274 | } | |||||
275 | ||||||
276 | STRIPE_STACK_UNWIND (lookup, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 279, 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->xdata, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
277 | local->op_errno, local->inode,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 279, 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->xdata, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
278 | &local->stbuf, local->xdata,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 279, 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->xdata, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
279 | &local->postparent)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 279, 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->xdata, &local->postparent ); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
280 | } | |||||
281 | out: | |||||
282 | return 0; | |||||
283 | } | |||||
284 | ||||||
285 | int32_t | |||||
286 | stripe_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, | |||||
287 | dict_t *xdata) | |||||
288 | { | |||||
289 | stripe_local_t *local = NULL((void*)0); | |||||
290 | xlator_list_t *trav = NULL((void*)0); | |||||
291 | stripe_private_t *priv = NULL((void*)0); | |||||
292 | int32_t op_errno = EINVAL22; | |||||
293 | int64_t filesize = 0; | |||||
294 | int ret = 0; | |||||
295 | uint64_t tmpctx = 0; | |||||
296 | ||||||
297 | 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!)"), "stripe.c" , __FUNCTION__, 297, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
298 | 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!)"), "stripe.c" , __FUNCTION__, 298, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
299 | 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!)"), "stripe.c" , __FUNCTION__, 299, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
300 | 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!)" ), "stripe.c", __FUNCTION__, 300, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
301 | 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!)" ), "stripe.c", __FUNCTION__, 301, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
302 | ||||||
303 | priv = this->private; | |||||
304 | trav = this->children; | |||||
305 | ||||||
306 | /* Initialization */ | |||||
307 | local = mem_get0 (this->local_pool); | |||||
308 | if (!local) { | |||||
309 | op_errno = ENOMEM12; | |||||
310 | goto err; | |||||
311 | } | |||||
312 | local->op_ret = -1; | |||||
313 | frame->local = local; | |||||
314 | loc_copy (&local->loc, loc); | |||||
315 | ||||||
316 | inode_ctx_get (local->inode, this, &tmpctx)inode_ctx_get2(local->inode,this,&tmpctx,0); | |||||
317 | if (tmpctx) | |||||
318 | local->fctx = (stripe_fd_ctx_t*) (long)tmpctx; | |||||
319 | ||||||
320 | /* quick-read friendly changes */ | |||||
321 | if (xdata && dict_get (xdata, GF_CONTENT_KEY"glusterfs.content")) { | |||||
322 | ret = dict_get_int64 (xdata, GF_CONTENT_KEY"glusterfs.content", &filesize); | |||||
323 | if (!ret && (filesize > priv->block_size)) | |||||
324 | dict_del (xdata, GF_CONTENT_KEY"glusterfs.content"); | |||||
325 | } | |||||
326 | ||||||
327 | /* get stripe-size xattr on lookup. This would be required for | |||||
328 | * open/read/write/pathinfo calls. Hence we send down the request | |||||
329 | * even when type == IA_INVAL */ | |||||
330 | ||||||
331 | /* | |||||
332 | * We aren't guaranteed to have xdata here. We need the format info for | |||||
333 | * the file, so allocate xdata if necessary. | |||||
334 | */ | |||||
335 | if (!xdata) | |||||
336 | xdata = dict_new(); | |||||
337 | else | |||||
338 | xdata = dict_ref(xdata); | |||||
339 | ||||||
340 | if (xdata && (IA_ISREG (loc->inode->ia_type)(loc->inode->ia_type == IA_IFREG) || | |||||
341 | (loc->inode->ia_type == IA_INVAL))) { | |||||
342 | ret = stripe_xattr_request_build (this, xdata, 8, 4, 4, 0); | |||||
343 | if (ret) | |||||
344 | gf_log (this->name , GF_LOG_ERROR, "Failed to build"do { do { if (0) printf ("Failed to build" " xattr request for %s" , loc->path); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 345, GF_LOG_ERROR, "Failed to build" " xattr request for %s" , loc->path); } while (0) | |||||
345 | " xattr request for %s", loc->path)do { do { if (0) printf ("Failed to build" " xattr request for %s" , loc->path); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 345, GF_LOG_ERROR, "Failed to build" " xattr request for %s" , loc->path); } while (0); | |||||
346 | ||||||
347 | } | |||||
348 | ||||||
349 | /* Everytime in stripe lookup, all child nodes | |||||
350 | should be looked up */ | |||||
351 | local->call_count = priv->child_count; | |||||
352 | while (trav) { | |||||
353 | STACK_WIND (frame, stripe_lookup_cbk, trav->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", "stripe.c", __FUNCTION__, 354, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->lookup_cbk) tmp_cbk = stripe_lookup_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->lookup"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->lookup); trav->xlator->fops ->lookup (_new, trav->xlator, loc, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
354 | trav->xlator->fops->lookup, 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", "stripe.c", __FUNCTION__, 354, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->lookup_cbk) tmp_cbk = stripe_lookup_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->lookup"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->lookup); trav->xlator->fops ->lookup (_new, trav->xlator, loc, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
355 | trav = trav->next; | |||||
356 | } | |||||
357 | ||||||
358 | dict_unref(xdata); | |||||
359 | ||||||
360 | return 0; | |||||
361 | err: | |||||
362 | STRIPE_STACK_UNWIND (lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 362, 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); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0); | |||||
363 | return 0; | |||||
364 | } | |||||
365 | ||||||
366 | ||||||
367 | int32_t | |||||
368 | stripe_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
369 | int32_t op_ret, int32_t op_errno, struct iatt *buf, dict_t *xdata) | |||||
370 | { | |||||
371 | int32_t callcnt = 0; | |||||
372 | stripe_local_t *local = NULL((void*)0); | |||||
373 | call_frame_t *prev = NULL((void*)0); | |||||
374 | ||||||
375 | if (!this || !frame || !frame->local || !cookie) { | |||||
376 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 376, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
377 | goto out; | |||||
378 | } | |||||
379 | prev = cookie; | |||||
380 | local = frame->local; | |||||
381 | ||||||
382 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
383 | { | |||||
384 | callcnt = --local->call_count; | |||||
385 | ||||||
386 | if (op_ret == -1) { | |||||
387 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 389, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
388 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 389, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
389 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 389, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
390 | local->op_errno = op_errno; | |||||
391 | if ((op_errno != ENOENT2) || | |||||
392 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
393 | local->failed = 1; | |||||
394 | } | |||||
395 | ||||||
396 | if (op_ret == 0) { | |||||
397 | local->op_ret = 0; | |||||
398 | ||||||
399 | if (FIRST_CHILD(this)(this->children->xlator) == prev->this) { | |||||
400 | local->stbuf = *buf; | |||||
401 | } | |||||
402 | ||||||
403 | local->stbuf_blocks += buf->ia_blocks; | |||||
404 | ||||||
405 | correct_file_size(buf, local->fctx, prev); | |||||
406 | ||||||
407 | if (local->stbuf_size < buf->ia_size) | |||||
408 | local->stbuf_size = buf->ia_size; | |||||
409 | } | |||||
410 | } | |||||
411 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
412 | ||||||
413 | if (!callcnt) { | |||||
414 | if (local->failed) | |||||
415 | local->op_ret = -1; | |||||
416 | ||||||
417 | if (local->op_ret != -1) { | |||||
418 | local->stbuf.ia_size = local->stbuf_size; | |||||
419 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
420 | } | |||||
421 | ||||||
422 | STRIPE_STACK_UNWIND (stat, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_stat_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", "stripe.c", __FUNCTION__ , 423, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_stat_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-> stbuf, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
423 | local->op_errno, &local->stbuf, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_stat_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", "stripe.c", __FUNCTION__ , 423, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_stat_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-> stbuf, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
424 | } | |||||
425 | out: | |||||
426 | return 0; | |||||
427 | } | |||||
428 | ||||||
429 | int32_t | |||||
430 | stripe_stat (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) | |||||
431 | { | |||||
432 | xlator_list_t *trav = NULL((void*)0); | |||||
433 | stripe_local_t *local = NULL((void*)0); | |||||
434 | stripe_private_t *priv = NULL((void*)0); | |||||
435 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
436 | int32_t op_errno = EINVAL22; | |||||
437 | ||||||
438 | 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!)"), "stripe.c" , __FUNCTION__, 438, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
439 | 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!)"), "stripe.c" , __FUNCTION__, 439, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
440 | 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!)"), "stripe.c" , __FUNCTION__, 440, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
441 | 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!)" ), "stripe.c", __FUNCTION__, 441, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
442 | 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!)" ), "stripe.c", __FUNCTION__, 442, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
443 | ||||||
444 | priv = this->private; | |||||
445 | trav = this->children; | |||||
446 | ||||||
447 | if (priv->first_child_down) { | |||||
448 | op_errno = ENOTCONN107; | |||||
449 | goto err; | |||||
450 | } | |||||
451 | ||||||
452 | /* Initialization */ | |||||
453 | local = mem_get0 (this->local_pool); | |||||
454 | if (!local) { | |||||
455 | op_errno = ENOMEM12; | |||||
456 | goto err; | |||||
457 | } | |||||
458 | local->op_ret = -1; | |||||
459 | frame->local = local; | |||||
460 | local->call_count = priv->child_count; | |||||
461 | ||||||
462 | if (IA_ISREG(loc->inode->ia_type)(loc->inode->ia_type == IA_IFREG)) { | |||||
463 | inode_ctx_get(loc->inode, this, (uint64_t *) &fctx)inode_ctx_get2(loc->inode,this,(uint64_t *) &fctx,0); | |||||
464 | if (!fctx) | |||||
465 | goto err; | |||||
466 | local->fctx = fctx; | |||||
467 | } | |||||
468 | ||||||
469 | while (trav) { | |||||
470 | STACK_WIND (frame, stripe_stat_cbk, trav->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", "stripe.c", __FUNCTION__, 471, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->stat_cbk) tmp_cbk = stripe_stat_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->stat"; _new->unwind_to = "stripe_stat_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->stat); trav->xlator->fops ->stat (_new, trav->xlator, loc, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
471 | trav->xlator->fops->stat, loc, 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", "stripe.c", __FUNCTION__, 471, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->stat_cbk) tmp_cbk = stripe_stat_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->stat"; _new->unwind_to = "stripe_stat_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->stat); trav->xlator->fops ->stat (_new, trav->xlator, loc, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
472 | trav = trav->next; | |||||
473 | } | |||||
474 | ||||||
475 | return 0; | |||||
476 | ||||||
477 | err: | |||||
478 | STRIPE_STACK_UNWIND (stat, frame, -1, op_errno, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_stat_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", "stripe.c", __FUNCTION__ , 478, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_stat_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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
479 | return 0; | |||||
480 | } | |||||
481 | ||||||
482 | ||||||
483 | int32_t | |||||
484 | stripe_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
485 | int32_t op_ret, int32_t op_errno, struct statvfs *stbuf, dict_t *xdata) | |||||
486 | { | |||||
487 | stripe_local_t *local = NULL((void*)0); | |||||
488 | int32_t callcnt = 0; | |||||
489 | ||||||
490 | if (!this || !frame || !frame->local) { | |||||
491 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 491, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
492 | goto out; | |||||
493 | } | |||||
494 | local = frame->local; | |||||
495 | ||||||
496 | LOCK(&frame->lock)pthread_spin_lock (&frame->lock); | |||||
497 | { | |||||
498 | callcnt = --local->call_count; | |||||
499 | ||||||
500 | if (op_ret && (op_errno != ENOTCONN107)) { | |||||
501 | local->op_errno = op_errno; | |||||
502 | } | |||||
503 | if (op_ret == 0) { | |||||
504 | struct statvfs *dict_buf = &local->statvfs_buf; | |||||
505 | dict_buf->f_bsize = stbuf->f_bsize; | |||||
506 | dict_buf->f_frsize = stbuf->f_frsize; | |||||
507 | dict_buf->f_blocks += stbuf->f_blocks; | |||||
508 | dict_buf->f_bfree += stbuf->f_bfree; | |||||
509 | dict_buf->f_bavail += stbuf->f_bavail; | |||||
510 | dict_buf->f_files += stbuf->f_files; | |||||
511 | dict_buf->f_ffree += stbuf->f_ffree; | |||||
512 | dict_buf->f_favail += stbuf->f_favail; | |||||
513 | dict_buf->f_fsid = stbuf->f_fsid; | |||||
514 | dict_buf->f_flag = stbuf->f_flag; | |||||
515 | dict_buf->f_namemax = stbuf->f_namemax; | |||||
516 | local->op_ret = 0; | |||||
517 | } | |||||
518 | } | |||||
519 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
520 | ||||||
521 | if (!callcnt) { | |||||
522 | STRIPE_STACK_UNWIND (statfs, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 523, 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_buf, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
523 | local->op_errno, &local->statvfs_buf, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 523, 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_buf, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
524 | } | |||||
525 | out: | |||||
526 | return 0; | |||||
527 | } | |||||
528 | ||||||
529 | int32_t | |||||
530 | stripe_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) | |||||
531 | { | |||||
532 | stripe_local_t *local = NULL((void*)0); | |||||
533 | xlator_list_t *trav = NULL((void*)0); | |||||
534 | stripe_private_t *priv = NULL((void*)0); | |||||
535 | int32_t op_errno = EINVAL22; | |||||
536 | ||||||
537 | 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!)"), "stripe.c" , __FUNCTION__, 537, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
538 | 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!)"), "stripe.c" , __FUNCTION__, 538, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
539 | 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!)"), "stripe.c" , __FUNCTION__, 539, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
540 | ||||||
541 | trav = this->children; | |||||
542 | priv = this->private; | |||||
543 | ||||||
544 | /* Initialization */ | |||||
545 | local = mem_get0 (this->local_pool); | |||||
546 | if (!local) { | |||||
547 | op_errno = ENOMEM12; | |||||
548 | goto err; | |||||
549 | } | |||||
550 | local->op_ret = -1; | |||||
551 | local->op_errno = ENOTCONN107; | |||||
552 | frame->local = local; | |||||
553 | ||||||
554 | local->call_count = priv->child_count; | |||||
555 | while (trav) { | |||||
556 | STACK_WIND (frame, stripe_statfs_cbk, trav->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", "stripe.c", __FUNCTION__, 557, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->statfs_cbk) tmp_cbk = stripe_statfs_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->statfs"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->statfs); trav->xlator->fops ->statfs (_new, trav->xlator, loc, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
557 | trav->xlator->fops->statfs, loc, 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", "stripe.c", __FUNCTION__, 557, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->statfs_cbk) tmp_cbk = stripe_statfs_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->statfs"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->statfs); trav->xlator->fops ->statfs (_new, trav->xlator, loc, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
558 | trav = trav->next; | |||||
559 | } | |||||
560 | ||||||
561 | return 0; | |||||
562 | err: | |||||
563 | STRIPE_STACK_UNWIND (statfs, frame, -1, op_errno, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 563, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
564 | return 0; | |||||
565 | } | |||||
566 | ||||||
567 | ||||||
568 | ||||||
569 | int32_t | |||||
570 | stripe_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
571 | int32_t op_ret, int32_t op_errno, struct iatt *prebuf, | |||||
572 | struct iatt *postbuf, dict_t *xdata) | |||||
573 | { | |||||
574 | int32_t callcnt = 0; | |||||
575 | stripe_local_t *local = NULL((void*)0); | |||||
576 | call_frame_t *prev = NULL((void*)0); | |||||
577 | ||||||
578 | if (!this || !frame || !frame->local || !cookie) { | |||||
579 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 579, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
580 | goto out; | |||||
581 | } | |||||
582 | ||||||
583 | prev = cookie; | |||||
584 | local = frame->local; | |||||
585 | ||||||
586 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
587 | { | |||||
588 | callcnt = --local->call_count; | |||||
589 | ||||||
590 | if (op_ret == -1) { | |||||
591 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 593, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
592 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 593, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
593 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 593, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
594 | local->op_errno = op_errno; | |||||
595 | if ((op_errno != ENOENT2) || | |||||
596 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
597 | local->failed = 1; | |||||
598 | } | |||||
599 | ||||||
600 | if (op_ret == 0) { | |||||
601 | local->op_ret = 0; | |||||
602 | if (FIRST_CHILD(this)(this->children->xlator) == prev->this) { | |||||
603 | local->pre_buf = *prebuf; | |||||
604 | local->post_buf = *postbuf; | |||||
605 | } | |||||
606 | ||||||
607 | local->prebuf_blocks += prebuf->ia_blocks; | |||||
608 | local->postbuf_blocks += postbuf->ia_blocks; | |||||
609 | ||||||
610 | correct_file_size(prebuf, local->fctx, prev); | |||||
611 | correct_file_size(postbuf, local->fctx, prev); | |||||
612 | ||||||
613 | if (local->prebuf_size < prebuf->ia_size) | |||||
614 | local->prebuf_size = prebuf->ia_size; | |||||
615 | ||||||
616 | if (local->postbuf_size < postbuf->ia_size) | |||||
617 | local->postbuf_size = postbuf->ia_size; | |||||
618 | } | |||||
619 | } | |||||
620 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
621 | ||||||
622 | if (!callcnt) { | |||||
623 | if (local->failed) | |||||
624 | local->op_ret = -1; | |||||
625 | ||||||
626 | if (local->op_ret != -1) { | |||||
627 | local->pre_buf.ia_blocks = local->prebuf_blocks; | |||||
628 | local->pre_buf.ia_size = local->prebuf_size; | |||||
629 | local->post_buf.ia_blocks = local->postbuf_blocks; | |||||
630 | local->post_buf.ia_size = local->postbuf_size; | |||||
631 | } | |||||
632 | ||||||
633 | STRIPE_STACK_UNWIND (truncate, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_truncate_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", "stripe.c", __FUNCTION__ , 635, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_truncate_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
634 | local->op_errno, &local->pre_buf,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_truncate_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", "stripe.c", __FUNCTION__ , 635, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_truncate_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
635 | &local->post_buf, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_truncate_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", "stripe.c", __FUNCTION__ , 635, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_truncate_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
636 | } | |||||
637 | out: | |||||
638 | return 0; | |||||
639 | } | |||||
640 | ||||||
641 | int32_t | |||||
642 | stripe_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, dict_t *xdata) | |||||
643 | { | |||||
644 | stripe_local_t *local = NULL((void*)0); | |||||
645 | stripe_private_t *priv = NULL((void*)0); | |||||
646 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
647 | int32_t op_errno = EINVAL22; | |||||
648 | int i, eof_idx; | |||||
649 | off_t dest_offset, tmp_offset; | |||||
650 | ||||||
651 | 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!)"), "stripe.c" , __FUNCTION__, 651, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
652 | 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!)"), "stripe.c" , __FUNCTION__, 652, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
653 | 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!)"), "stripe.c" , __FUNCTION__, 653, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
654 | 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!)" ), "stripe.c", __FUNCTION__, 654, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
655 | 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!)" ), "stripe.c", __FUNCTION__, 655, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
656 | ||||||
657 | priv = this->private; | |||||
658 | ||||||
659 | if (priv->first_child_down) { | |||||
660 | op_errno = ENOTCONN107; | |||||
661 | goto err; | |||||
662 | } | |||||
663 | ||||||
664 | /* Initialization */ | |||||
665 | local = mem_get0 (this->local_pool); | |||||
666 | if (!local) { | |||||
667 | op_errno = ENOMEM12; | |||||
668 | goto err; | |||||
669 | } | |||||
670 | local->op_ret = -1; | |||||
671 | frame->local = local; | |||||
672 | local->call_count = priv->child_count; | |||||
673 | ||||||
674 | inode_ctx_get(loc->inode, this, (uint64_t *) &fctx)inode_ctx_get2(loc->inode,this,(uint64_t *) &fctx,0); | |||||
675 | if (!fctx) { | |||||
676 | gf_log(this->name, GF_LOG_ERROR, "no stripe context")do { do { if (0) printf ("no stripe context"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 676, GF_LOG_ERROR, "no stripe context"); } while (0); | |||||
677 | op_errno = EINVAL22; | |||||
678 | goto err; | |||||
679 | } | |||||
680 | ||||||
681 | local->fctx = fctx; | |||||
682 | eof_idx = (offset / fctx->stripe_size) % fctx->stripe_count; | |||||
683 | ||||||
684 | for (i = 0; i < fctx->stripe_count; i++) { | |||||
685 | if (!fctx->xl_array[i]) { | |||||
686 | gf_log(this->name, GF_LOG_ERROR,do { do { if (0) printf ("no xlator at index %d", i); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 687, GF_LOG_ERROR , "no xlator at index %d", i); } while (0) | |||||
687 | "no xlator at index %d", i)do { do { if (0) printf ("no xlator at index %d", i); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 687, GF_LOG_ERROR , "no xlator at index %d", i); } while (0); | |||||
688 | op_errno = EINVAL22; | |||||
689 | goto err; | |||||
690 | } | |||||
691 | ||||||
692 | if (fctx->stripe_coalesce) { | |||||
693 | /* | |||||
694 | * The node that owns EOF is truncated to the exact | |||||
695 | * coalesced offset. Nodes prior to this index should | |||||
696 | * be rounded up to the size of the complete stripe, | |||||
697 | * while nodes after this index should be rounded down | |||||
698 | * to the size of the previous stripe. | |||||
699 | */ | |||||
700 | if (i < eof_idx) | |||||
701 | tmp_offset = roof(offset, fctx->stripe_size *((((offset)+(fctx->stripe_size * fctx->stripe_count)-1) /((fctx->stripe_size * fctx->stripe_count)?(fctx->stripe_size * fctx->stripe_count):1))*(fctx->stripe_size * fctx-> stripe_count)) | |||||
702 | fctx->stripe_count)((((offset)+(fctx->stripe_size * fctx->stripe_count)-1) /((fctx->stripe_size * fctx->stripe_count)?(fctx->stripe_size * fctx->stripe_count):1))*(fctx->stripe_size * fctx-> stripe_count)); | |||||
703 | else if (i > eof_idx) | |||||
704 | tmp_offset = floor(offset, fctx->stripe_size *(((offset)/((fctx->stripe_size * fctx->stripe_count)?(fctx ->stripe_size * fctx->stripe_count):1))*(fctx->stripe_size * fctx->stripe_count)) | |||||
705 | fctx->stripe_count)(((offset)/((fctx->stripe_size * fctx->stripe_count)?(fctx ->stripe_size * fctx->stripe_count):1))*(fctx->stripe_size * fctx->stripe_count)); | |||||
706 | else | |||||
707 | tmp_offset = offset; | |||||
708 | ||||||
709 | dest_offset = coalesced_offset(tmp_offset, | |||||
710 | fctx->stripe_size, fctx->stripe_count); | |||||
711 | } else { | |||||
712 | dest_offset = offset; | |||||
713 | } | |||||
714 | ||||||
715 | STACK_WIND(frame, stripe_truncate_cbk, fctx->xl_array[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", "stripe.c", __FUNCTION__, 717, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [i]->fops->truncate_cbk) tmp_cbk = stripe_truncate_cbk; _new->root = frame->root; _new->this = fctx->xl_array [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[i]->fops->truncate"; _new ->unwind_to = "stripe_truncate_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[i]; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, fctx->xl_array[i]->fops->truncate ); fctx->xl_array[i]->fops->truncate (_new, fctx-> xl_array[i], loc, dest_offset, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
716 | fctx->xl_array[i]->fops->truncate, loc, dest_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", "stripe.c", __FUNCTION__, 717, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [i]->fops->truncate_cbk) tmp_cbk = stripe_truncate_cbk; _new->root = frame->root; _new->this = fctx->xl_array [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[i]->fops->truncate"; _new ->unwind_to = "stripe_truncate_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[i]; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, fctx->xl_array[i]->fops->truncate ); fctx->xl_array[i]->fops->truncate (_new, fctx-> xl_array[i], loc, dest_offset, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
717 | 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", "stripe.c", __FUNCTION__, 717, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [i]->fops->truncate_cbk) tmp_cbk = stripe_truncate_cbk; _new->root = frame->root; _new->this = fctx->xl_array [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[i]->fops->truncate"; _new ->unwind_to = "stripe_truncate_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&frame->root-> stack_lock); { _new->next = frame->root->frames.next ; _new->prev = &frame->root->frames; if (frame-> root->frames.next) frame->root->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count ++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[i]; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, fctx->xl_array[i]->fops->truncate ); fctx->xl_array[i]->fops->truncate (_new, fctx-> xl_array[i], loc, dest_offset, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
718 | } | |||||
719 | ||||||
720 | return 0; | |||||
721 | err: | |||||
722 | STRIPE_STACK_UNWIND (truncate, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_truncate_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", "stripe.c", __FUNCTION__ , 722, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_truncate_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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
723 | return 0; | |||||
724 | } | |||||
725 | ||||||
726 | ||||||
727 | int32_t | |||||
728 | stripe_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
729 | int32_t op_ret, int32_t op_errno, | |||||
730 | struct iatt *preop, struct iatt *postop, dict_t *xdata) | |||||
731 | { | |||||
732 | int32_t callcnt = 0; | |||||
733 | stripe_local_t *local = NULL((void*)0); | |||||
734 | call_frame_t *prev = NULL((void*)0); | |||||
735 | ||||||
736 | if (!this || !frame || !frame->local || !cookie) { | |||||
737 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 737, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
738 | goto out; | |||||
739 | } | |||||
740 | ||||||
741 | prev = cookie; | |||||
742 | local = frame->local; | |||||
743 | ||||||
744 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
745 | { | |||||
746 | callcnt = --local->call_count; | |||||
747 | ||||||
748 | if (op_ret == -1) { | |||||
749 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 751, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
750 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 751, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
751 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 751, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
752 | local->op_errno = op_errno; | |||||
753 | if ((op_errno != ENOENT2) || | |||||
754 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
755 | local->failed = 1; | |||||
756 | } | |||||
757 | ||||||
758 | if (op_ret == 0) { | |||||
759 | local->op_ret = 0; | |||||
760 | ||||||
761 | if (FIRST_CHILD(this)(this->children->xlator) == prev->this) { | |||||
762 | local->pre_buf = *preop; | |||||
763 | local->post_buf = *postop; | |||||
764 | } | |||||
765 | ||||||
766 | local->prebuf_blocks += preop->ia_blocks; | |||||
767 | local->postbuf_blocks += postop->ia_blocks; | |||||
768 | ||||||
769 | correct_file_size(preop, local->fctx, prev); | |||||
770 | correct_file_size(postop, local->fctx, prev); | |||||
771 | ||||||
772 | if (local->prebuf_size < preop->ia_size) | |||||
773 | local->prebuf_size = preop->ia_size; | |||||
774 | if (local->postbuf_size < postop->ia_size) | |||||
775 | local->postbuf_size = postop->ia_size; | |||||
776 | } | |||||
777 | } | |||||
778 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
779 | ||||||
780 | if (!callcnt) { | |||||
781 | if (local->failed) | |||||
782 | local->op_ret = -1; | |||||
783 | ||||||
784 | if (local->op_ret != -1) { | |||||
785 | local->pre_buf.ia_blocks = local->prebuf_blocks; | |||||
786 | local->pre_buf.ia_size = local->prebuf_size; | |||||
787 | local->post_buf.ia_blocks = local->postbuf_blocks; | |||||
788 | local->post_buf.ia_size = local->postbuf_size; | |||||
789 | } | |||||
790 | ||||||
791 | STRIPE_STACK_UNWIND (setattr, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_setattr_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", "stripe.c", __FUNCTION__ , 793, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setattr_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
792 | local->op_errno, &local->pre_buf,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_setattr_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", "stripe.c", __FUNCTION__ , 793, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setattr_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
793 | &local->post_buf, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_setattr_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", "stripe.c", __FUNCTION__ , 793, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setattr_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
794 | } | |||||
795 | out: | |||||
796 | return 0; | |||||
797 | } | |||||
798 | ||||||
799 | ||||||
800 | int32_t | |||||
801 | stripe_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, | |||||
802 | struct iatt *stbuf, int32_t valid, dict_t *xdata) | |||||
803 | { | |||||
804 | xlator_list_t *trav = NULL((void*)0); | |||||
805 | stripe_local_t *local = NULL((void*)0); | |||||
806 | stripe_private_t *priv = NULL((void*)0); | |||||
807 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
808 | int32_t op_errno = EINVAL22; | |||||
809 | ||||||
810 | 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!)"), "stripe.c" , __FUNCTION__, 810, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
811 | 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!)"), "stripe.c" , __FUNCTION__, 811, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
812 | 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!)"), "stripe.c" , __FUNCTION__, 812, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
813 | 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!)" ), "stripe.c", __FUNCTION__, 813, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
814 | 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!)" ), "stripe.c", __FUNCTION__, 814, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
815 | ||||||
816 | priv = this->private; | |||||
817 | trav = this->children; | |||||
818 | ||||||
819 | if (priv->first_child_down) { | |||||
820 | op_errno = ENOTCONN107; | |||||
821 | goto err; | |||||
822 | } | |||||
823 | ||||||
824 | /* Initialization */ | |||||
825 | local = mem_get0 (this->local_pool); | |||||
826 | if (!local) { | |||||
827 | op_errno = ENOMEM12; | |||||
828 | goto err; | |||||
829 | } | |||||
830 | local->op_ret = -1; | |||||
831 | frame->local = local; | |||||
832 | if (!IA_ISDIR (loc->inode->ia_type)(loc->inode->ia_type == IA_IFDIR) && | |||||
833 | !IA_ISREG (loc->inode->ia_type)(loc->inode->ia_type == IA_IFREG)) { | |||||
834 | local->call_count = 1; | |||||
835 | STACK_WIND (frame, stripe_setattr_cbk, FIRST_CHILD (this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 837, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->setattr_cbk) tmp_cbk = stripe_setattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->setattr" ; _new->unwind_to = "stripe_setattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->setattr); (this->children->xlator )->fops->setattr (_new, (this->children->xlator), loc, stbuf, valid, ((void*)0)); (*__glusterfs_this_location( )) = old_THIS; } while (0) | |||||
836 | FIRST_CHILD (this)->fops->setattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 837, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->setattr_cbk) tmp_cbk = stripe_setattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->setattr" ; _new->unwind_to = "stripe_setattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->setattr); (this->children->xlator )->fops->setattr (_new, (this->children->xlator), loc, stbuf, valid, ((void*)0)); (*__glusterfs_this_location( )) = old_THIS; } while (0) | |||||
837 | loc, stbuf, valid, 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", "stripe.c", __FUNCTION__, 837, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->setattr_cbk) tmp_cbk = stripe_setattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->setattr" ; _new->unwind_to = "stripe_setattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->setattr); (this->children->xlator )->fops->setattr (_new, (this->children->xlator), loc, stbuf, valid, ((void*)0)); (*__glusterfs_this_location( )) = old_THIS; } while (0); | |||||
838 | return 0; | |||||
839 | } | |||||
840 | ||||||
841 | if (IA_ISREG(loc->inode->ia_type)(loc->inode->ia_type == IA_IFREG)) { | |||||
842 | inode_ctx_get(loc->inode, this, (uint64_t *) &fctx)inode_ctx_get2(loc->inode,this,(uint64_t *) &fctx,0); | |||||
843 | if (!fctx) | |||||
844 | goto err; | |||||
845 | local->fctx = fctx; | |||||
846 | } | |||||
847 | ||||||
848 | local->call_count = priv->child_count; | |||||
849 | while (trav) { | |||||
850 | STACK_WIND (frame, stripe_setattr_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", "stripe.c", __FUNCTION__, 852, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->setattr_cbk) tmp_cbk = stripe_setattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->setattr"; _new->unwind_to = "stripe_setattr_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->setattr); trav->xlator-> fops->setattr (_new, trav->xlator, loc, stbuf, valid, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
851 | trav->xlator, trav->xlator->fops->setattr,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 852, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->setattr_cbk) tmp_cbk = stripe_setattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->setattr"; _new->unwind_to = "stripe_setattr_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->setattr); trav->xlator-> fops->setattr (_new, trav->xlator, loc, stbuf, valid, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
852 | loc, stbuf, valid, 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", "stripe.c", __FUNCTION__, 852, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->setattr_cbk) tmp_cbk = stripe_setattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->setattr"; _new->unwind_to = "stripe_setattr_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->setattr); trav->xlator-> fops->setattr (_new, trav->xlator, loc, stbuf, valid, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
853 | trav = trav->next; | |||||
854 | } | |||||
855 | ||||||
856 | return 0; | |||||
857 | err: | |||||
858 | STRIPE_STACK_UNWIND (setattr, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_setattr_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", "stripe.c", __FUNCTION__ , 858, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_setattr_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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
859 | return 0; | |||||
860 | } | |||||
861 | ||||||
862 | ||||||
863 | int32_t | |||||
864 | stripe_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, | |||||
865 | struct iatt *stbuf, int32_t valid, dict_t *xdata) | |||||
866 | { | |||||
867 | stripe_local_t *local = NULL((void*)0); | |||||
868 | stripe_private_t *priv = NULL((void*)0); | |||||
869 | xlator_list_t *trav = NULL((void*)0); | |||||
870 | int32_t op_errno = EINVAL22; | |||||
871 | ||||||
872 | 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!)"), "stripe.c" , __FUNCTION__, 872, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
873 | 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!)"), "stripe.c" , __FUNCTION__, 873, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
874 | 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!)"), "stripe.c" , __FUNCTION__, 874, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
875 | 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!)" ), "stripe.c", __FUNCTION__, 875, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
876 | ||||||
877 | priv = this->private; | |||||
878 | trav = this->children; | |||||
879 | ||||||
880 | /* Initialization */ | |||||
881 | local = mem_get0 (this->local_pool); | |||||
882 | if (!local) { | |||||
883 | op_errno = ENOMEM12; | |||||
884 | goto err; | |||||
885 | } | |||||
886 | local->op_ret = -1; | |||||
887 | frame->local = local; | |||||
888 | local->call_count = priv->child_count; | |||||
889 | ||||||
890 | while (trav) { | |||||
891 | STACK_WIND (frame, stripe_setattr_cbk, trav->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", "stripe.c", __FUNCTION__, 892, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsetattr_cbk) tmp_cbk = stripe_setattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->fsetattr"; _new->unwind_to = "stripe_setattr_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->fsetattr); trav->xlator-> fops->fsetattr (_new, trav->xlator, fd, stbuf, valid, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
892 | trav->xlator->fops->fsetattr, fd, stbuf, valid, 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", "stripe.c", __FUNCTION__, 892, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsetattr_cbk) tmp_cbk = stripe_setattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->fsetattr"; _new->unwind_to = "stripe_setattr_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->fsetattr); trav->xlator-> fops->fsetattr (_new, trav->xlator, fd, stbuf, valid, ( (void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
893 | trav = trav->next; | |||||
894 | } | |||||
895 | ||||||
896 | return 0; | |||||
897 | err: | |||||
898 | STRIPE_STACK_UNWIND (fsetattr, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_fsetattr_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", "stripe.c", __FUNCTION__ , 898, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsetattr_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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
899 | return 0; | |||||
900 | } | |||||
901 | ||||||
902 | int32_t | |||||
903 | stripe_stack_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
904 | int32_t op_ret, int32_t op_errno, struct iatt *buf, | |||||
905 | struct iatt *preoldparent, struct iatt *postoldparent, | |||||
906 | struct iatt *prenewparent, struct iatt *postnewparent, | |||||
907 | dict_t *xdata) | |||||
908 | { | |||||
909 | int32_t callcnt = 0; | |||||
910 | stripe_local_t *local = NULL((void*)0); | |||||
911 | call_frame_t *prev = NULL((void*)0); | |||||
912 | ||||||
913 | if (!this || !frame || !frame->local || !cookie) { | |||||
914 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 914, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
915 | goto out; | |||||
916 | } | |||||
917 | ||||||
918 | prev = cookie; | |||||
919 | local = frame->local; | |||||
920 | ||||||
921 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
922 | { | |||||
923 | callcnt = --local->call_count; | |||||
924 | ||||||
925 | if (op_ret == -1) { | |||||
926 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 928, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
927 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 928, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
928 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 928, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
929 | local->op_errno = op_errno; | |||||
930 | if ((op_errno != ENOENT2) || | |||||
931 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
932 | local->failed = 1; | |||||
933 | } | |||||
934 | ||||||
935 | if (op_ret == 0) { | |||||
936 | local->op_ret = 0; | |||||
937 | ||||||
938 | local->stbuf.ia_blocks += buf->ia_blocks; | |||||
939 | local->preparent.ia_blocks += preoldparent->ia_blocks; | |||||
940 | local->postparent.ia_blocks += postoldparent->ia_blocks; | |||||
941 | local->pre_buf.ia_blocks += prenewparent->ia_blocks; | |||||
942 | local->post_buf.ia_blocks += postnewparent->ia_blocks; | |||||
943 | ||||||
944 | correct_file_size(buf, local->fctx, prev); | |||||
945 | ||||||
946 | if (local->stbuf.ia_size < buf->ia_size) | |||||
947 | local->stbuf.ia_size = buf->ia_size; | |||||
948 | ||||||
949 | if (local->preparent.ia_size < preoldparent->ia_size) | |||||
950 | local->preparent.ia_size = preoldparent->ia_size; | |||||
951 | ||||||
952 | if (local->postparent.ia_size < postoldparent->ia_size) | |||||
953 | local->postparent.ia_size = postoldparent->ia_size; | |||||
954 | ||||||
955 | if (local->pre_buf.ia_size < prenewparent->ia_size) | |||||
956 | local->pre_buf.ia_size = prenewparent->ia_size; | |||||
957 | ||||||
958 | if (local->post_buf.ia_size < postnewparent->ia_size) | |||||
959 | local->post_buf.ia_size = postnewparent->ia_size; | |||||
960 | } | |||||
961 | } | |||||
962 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
963 | ||||||
964 | if (!callcnt) { | |||||
965 | if (local->failed) | |||||
966 | local->op_ret = -1; | |||||
967 | ||||||
968 | STRIPE_STACK_UNWIND (rename, frame, local->op_ret, local->op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_rename_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", "stripe.c", __FUNCTION__ , 971, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rename_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-> stbuf, &local->preparent, &local->postparent, & local->pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
969 | &local->stbuf, &local->preparent,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_rename_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", "stripe.c", __FUNCTION__ , 971, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rename_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-> stbuf, &local->preparent, &local->postparent, & local->pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
970 | &local->postparent, &local->pre_buf,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_rename_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", "stripe.c", __FUNCTION__ , 971, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rename_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-> stbuf, &local->preparent, &local->postparent, & local->pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
971 | &local->post_buf, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_rename_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", "stripe.c", __FUNCTION__ , 971, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rename_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-> stbuf, &local->preparent, &local->postparent, & local->pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
972 | } | |||||
973 | out: | |||||
974 | return 0; | |||||
975 | } | |||||
976 | ||||||
977 | int32_t | |||||
978 | stripe_first_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
979 | int32_t op_ret, int32_t op_errno, struct iatt *buf, | |||||
980 | struct iatt *preoldparent, struct iatt *postoldparent, | |||||
981 | struct iatt *prenewparent, struct iatt *postnewparent, | |||||
982 | dict_t *xdata) | |||||
983 | { | |||||
984 | stripe_local_t *local = NULL((void*)0); | |||||
985 | xlator_list_t *trav = NULL((void*)0); | |||||
986 | ||||||
987 | if (!this || !frame || !frame->local) { | |||||
988 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 988, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
989 | op_errno = EINVAL22; | |||||
990 | goto unwind; | |||||
991 | } | |||||
992 | ||||||
993 | if (op_ret == -1) { | |||||
994 | goto unwind; | |||||
995 | } | |||||
996 | ||||||
997 | local = frame->local; | |||||
998 | trav = this->children; | |||||
999 | ||||||
1000 | local->stbuf = *buf; | |||||
1001 | local->preparent = *preoldparent; | |||||
1002 | local->postparent = *postoldparent; | |||||
1003 | local->pre_buf = *prenewparent; | |||||
1004 | local->post_buf = *postnewparent; | |||||
1005 | ||||||
1006 | local->op_ret = 0; | |||||
1007 | local->call_count--; | |||||
1008 | ||||||
1009 | trav = trav->next; /* Skip first child */ | |||||
1010 | while (trav) { | |||||
1011 | STACK_WIND (frame, stripe_stack_rename_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", "stripe.c", __FUNCTION__, 1013, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->rename_cbk) tmp_cbk = stripe_stack_rename_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->rename"; _new->unwind_to = "stripe_stack_rename_cbk"; pthread_spin_init (&_new-> lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->rename); trav->xlator->fops ->rename (_new, trav->xlator, &local->loc, & local->loc2, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1012 | trav->xlator, trav->xlator->fops->rename,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 1013, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->rename_cbk) tmp_cbk = stripe_stack_rename_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->rename"; _new->unwind_to = "stripe_stack_rename_cbk"; pthread_spin_init (&_new-> lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->rename); trav->xlator->fops ->rename (_new, trav->xlator, &local->loc, & local->loc2, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1013 | &local->loc, &local->loc2, 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", "stripe.c", __FUNCTION__, 1013, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->rename_cbk) tmp_cbk = stripe_stack_rename_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->rename"; _new->unwind_to = "stripe_stack_rename_cbk"; pthread_spin_init (&_new-> lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->rename); trav->xlator->fops ->rename (_new, trav->xlator, &local->loc, & local->loc2, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1014 | trav = trav->next; | |||||
1015 | } | |||||
1016 | return 0; | |||||
1017 | ||||||
1018 | unwind: | |||||
1019 | STRIPE_STACK_UNWIND (rename, frame, -1, op_errno, buf, preoldparent,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_rename_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", "stripe.c", __FUNCTION__ , 1020, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rename_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, buf, preoldparent, postoldparent, prenewparent , postnewparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local ); mem_put (__local); } } while (0) | |||||
1020 | postoldparent, prenewparent, postnewparent, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_rename_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", "stripe.c", __FUNCTION__ , 1020, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rename_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, buf, preoldparent, postoldparent, prenewparent , postnewparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local ); mem_put (__local); } } while (0); | |||||
1021 | return 0; | |||||
1022 | } | |||||
1023 | ||||||
1024 | int32_t | |||||
1025 | stripe_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, | |||||
1026 | loc_t *newloc, dict_t *xdata) | |||||
1027 | { | |||||
1028 | stripe_private_t *priv = NULL((void*)0); | |||||
1029 | stripe_local_t *local = NULL((void*)0); | |||||
1030 | xlator_list_t *trav = NULL((void*)0); | |||||
1031 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
1032 | int32_t op_errno = EINVAL22; | |||||
1033 | ||||||
1034 | 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!)"), "stripe.c" , __FUNCTION__, 1034, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
1035 | 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!)"), "stripe.c" , __FUNCTION__, 1035, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
1036 | 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!)"), "stripe.c" , __FUNCTION__, 1036, GF_LOG_WARNING, "invalid argument: " "oldloc" ); } while (0); goto err; } } while (0); | |||||
1037 | VALIDATE_OR_GOTO (oldloc->path, err)do { if (!oldloc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "oldloc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "stripe.c", __FUNCTION__, 1037, GF_LOG_WARNING, "invalid argument: " "oldloc->path"); } while (0); goto err; } } while (0); | |||||
1038 | VALIDATE_OR_GOTO (oldloc->inode, err)do { if (!oldloc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "oldloc->inode" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "stripe.c", __FUNCTION__, 1038, GF_LOG_WARNING, "invalid argument: " "oldloc->inode"); } while (0); goto err; } } while (0); | |||||
1039 | 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!)"), "stripe.c" , __FUNCTION__, 1039, GF_LOG_WARNING, "invalid argument: " "newloc" ); } while (0); goto err; } } while (0); | |||||
1040 | ||||||
1041 | priv = this->private; | |||||
1042 | trav = this->children; | |||||
1043 | ||||||
1044 | /* If any one node is down, don't allow rename */ | |||||
1045 | if (priv->nodes_down) { | |||||
1046 | op_errno = ENOTCONN107; | |||||
1047 | goto err; | |||||
1048 | } | |||||
1049 | ||||||
1050 | /* Initialization */ | |||||
1051 | local = mem_get0 (this->local_pool); | |||||
1052 | if (!local) { | |||||
1053 | op_errno = ENOMEM12; | |||||
1054 | goto err; | |||||
1055 | } | |||||
1056 | local->op_ret = -1; | |||||
1057 | loc_copy (&local->loc, oldloc); | |||||
1058 | loc_copy (&local->loc2, newloc); | |||||
1059 | ||||||
1060 | local->call_count = priv->child_count; | |||||
1061 | ||||||
1062 | if (IA_ISREG(oldloc->inode->ia_type)(oldloc->inode->ia_type == IA_IFREG)) { | |||||
1063 | inode_ctx_get(oldloc->inode, this, (uint64_t *) &fctx)inode_ctx_get2(oldloc->inode,this,(uint64_t *) &fctx,0 ); | |||||
1064 | if (!fctx) | |||||
1065 | goto err; | |||||
1066 | local->fctx = fctx; | |||||
1067 | } | |||||
1068 | ||||||
1069 | frame->local = local; | |||||
1070 | ||||||
1071 | STACK_WIND (frame, stripe_first_rename_cbk, trav->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", "stripe.c", __FUNCTION__, 1072, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->rename_cbk) tmp_cbk = stripe_first_rename_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->rename"; _new->unwind_to = "stripe_first_rename_cbk"; pthread_spin_init (&_new-> lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->rename); trav->xlator->fops ->rename (_new, trav->xlator, oldloc, newloc, ((void*)0 )); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1072 | trav->xlator->fops->rename, oldloc, newloc, 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", "stripe.c", __FUNCTION__, 1072, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->rename_cbk) tmp_cbk = stripe_first_rename_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->rename"; _new->unwind_to = "stripe_first_rename_cbk"; pthread_spin_init (&_new-> lock, 0); pthread_spin_lock (&frame->root->stack_lock ); { _new->next = frame->root->frames.next; _new-> prev = &frame->root->frames; if (frame->root-> frames.next) frame->root->frames.next->prev = _new; frame ->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->rename); trav->xlator->fops ->rename (_new, trav->xlator, oldloc, newloc, ((void*)0 )); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1073 | ||||||
1074 | return 0; | |||||
1075 | err: | |||||
1076 | STRIPE_STACK_UNWIND (rename, frame, -1, op_errno, NULL, NULL, NULL,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_rename_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", "stripe.c", __FUNCTION__ , 1077, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rename_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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
1077 | NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_rename_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", "stripe.c", __FUNCTION__ , 1077, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_rename_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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
1078 | return 0; | |||||
1079 | } | |||||
1080 | int32_t | |||||
1081 | stripe_first_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1082 | int32_t op_ret, int32_t op_errno, struct iatt *preparent, | |||||
1083 | struct iatt *postparent, dict_t *xdata) | |||||
1084 | { | |||||
1085 | stripe_local_t *local = NULL((void*)0); | |||||
1086 | call_frame_t *prev = NULL((void*)0); | |||||
1087 | ||||||
1088 | if (!this || !frame || !frame->local || !cookie) { | |||||
1089 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1089, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1090 | goto out; | |||||
1091 | } | |||||
1092 | ||||||
1093 | prev = cookie; | |||||
1094 | local = frame->local; | |||||
1095 | ||||||
1096 | if (op_ret == -1) { | |||||
1097 | gf_log (this->name, GF_LOG_DEBUG, "%s returned %s",do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 1098, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1098 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 1098, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1099 | goto out; | |||||
1100 | } | |||||
1101 | local->op_ret = 0; | |||||
1102 | local->preparent = *preparent; | |||||
1103 | local->postparent = *postparent; | |||||
1104 | local->preparent_blocks += preparent->ia_blocks; | |||||
1105 | local->postparent_blocks += postparent->ia_blocks; | |||||
1106 | ||||||
1107 | STRIPE_STACK_UNWIND(unlink, frame, local->op_ret, local->op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1108, 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, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
1108 | &local->preparent, &local->postparent, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1108, 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, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
1109 | return 0; | |||||
1110 | out: | |||||
1111 | STRIPE_STACK_UNWIND (unlink, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1111, 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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1112 | ||||||
1113 | return 0; | |||||
1114 | } | |||||
1115 | ||||||
1116 | ||||||
1117 | ||||||
1118 | ||||||
1119 | int32_t | |||||
1120 | stripe_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1121 | int32_t op_ret, int32_t op_errno, struct iatt *preparent, | |||||
1122 | struct iatt *postparent, dict_t *xdata) | |||||
1123 | { | |||||
1124 | int32_t callcnt = 0; | |||||
1125 | stripe_local_t *local = NULL((void*)0); | |||||
1126 | call_frame_t *prev = NULL((void*)0); | |||||
1127 | ||||||
1128 | if (!this || !frame || !frame->local || !cookie) { | |||||
1129 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1129, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1130 | goto out; | |||||
1131 | } | |||||
1132 | ||||||
1133 | prev = cookie; | |||||
1134 | local = frame->local; | |||||
1135 | ||||||
1136 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1137 | { | |||||
1138 | callcnt = --local->call_count; | |||||
1139 | ||||||
1140 | if (op_ret == -1) { | |||||
1141 | gf_log (this->name, GF_LOG_DEBUG, "%s returned %s",do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 1142, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1142 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 1142, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1143 | local->op_errno = op_errno; | |||||
1144 | if (op_errno != ENOENT2) { | |||||
1145 | local->failed = 1; | |||||
1146 | local->op_ret = op_ret; | |||||
1147 | } | |||||
1148 | } | |||||
1149 | } | |||||
1150 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1151 | ||||||
1152 | if (callcnt == 1) { | |||||
1153 | if (local->failed) { | |||||
1154 | op_errno = local->op_errno; | |||||
1155 | goto out; | |||||
1156 | } | |||||
1157 | STACK_WIND(frame, stripe_first_unlink_cbk, FIRST_CHILD (this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 1159, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->unlink_cbk) tmp_cbk = stripe_first_unlink_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->unlink" ; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->unlink); (this->children->xlator )->fops->unlink (_new, (this->children->xlator), & local->loc, local->xflag, local->xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1158 | FIRST_CHILD (this)->fops->unlink, &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", "stripe.c", __FUNCTION__, 1159, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->unlink_cbk) tmp_cbk = stripe_first_unlink_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->unlink" ; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->unlink); (this->children->xlator )->fops->unlink (_new, (this->children->xlator), & local->loc, local->xflag, local->xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1159 | local->xflag, local->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", "stripe.c", __FUNCTION__, 1159, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->unlink_cbk) tmp_cbk = stripe_first_unlink_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->unlink" ; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->unlink); (this->children->xlator )->fops->unlink (_new, (this->children->xlator), & local->loc, local->xflag, local->xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1160 | } | |||||
1161 | return 0; | |||||
1162 | out: | |||||
1163 | STRIPE_STACK_UNWIND (unlink, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1163, 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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1164 | ||||||
1165 | return 0; | |||||
1166 | } | |||||
1167 | ||||||
1168 | int32_t | |||||
1169 | stripe_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, | |||||
1170 | int xflag, dict_t *xdata) | |||||
1171 | { | |||||
1172 | xlator_list_t *trav = NULL((void*)0); | |||||
1173 | stripe_local_t *local = NULL((void*)0); | |||||
1174 | stripe_private_t *priv = NULL((void*)0); | |||||
1175 | int32_t op_errno = EINVAL22; | |||||
1176 | ||||||
1177 | 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!)"), "stripe.c" , __FUNCTION__, 1177, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
1178 | 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!)"), "stripe.c" , __FUNCTION__, 1178, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
1179 | 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!)"), "stripe.c" , __FUNCTION__, 1179, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
1180 | 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!)" ), "stripe.c", __FUNCTION__, 1180, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
1181 | 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!)" ), "stripe.c", __FUNCTION__, 1181, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
1182 | ||||||
1183 | priv = this->private; | |||||
1184 | trav = this->children; | |||||
1185 | ||||||
1186 | if (priv->first_child_down) { | |||||
1187 | op_errno = ENOTCONN107; | |||||
1188 | goto err; | |||||
1189 | } | |||||
1190 | ||||||
1191 | /* Don't unlink a file if a node is down */ | |||||
1192 | if (priv->nodes_down) { | |||||
1193 | op_errno = ENOTCONN107; | |||||
1194 | goto err; | |||||
1195 | } | |||||
1196 | ||||||
1197 | /* Initialization */ | |||||
1198 | local = mem_get0 (this->local_pool); | |||||
1199 | if (!local) { | |||||
1200 | op_errno = ENOMEM12; | |||||
1201 | goto err; | |||||
1202 | } | |||||
1203 | local->op_ret = -1; | |||||
1204 | loc_copy (&local->loc, loc); | |||||
1205 | local->xflag = xflag; | |||||
1206 | ||||||
1207 | if (xdata) | |||||
1208 | local->xdata = dict_ref (xdata); | |||||
1209 | ||||||
1210 | frame->local = local; | |||||
1211 | local->call_count = priv->child_count; | |||||
1212 | trav = trav->next; /* Skip the first child */ | |||||
1213 | ||||||
1214 | while (trav) { | |||||
1215 | STACK_WIND (frame, stripe_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", "stripe.c", __FUNCTION__, 1217, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_unlink_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->unlink"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->unlink); trav->xlator->fops ->unlink (_new, trav->xlator, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1216 | trav->xlator, trav->xlator->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", "stripe.c", __FUNCTION__, 1217, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_unlink_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->unlink"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->unlink); trav->xlator->fops ->unlink (_new, trav->xlator, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1217 | 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", "stripe.c", __FUNCTION__, 1217, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_unlink_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->unlink"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->unlink); trav->xlator->fops ->unlink (_new, trav->xlator, loc, xflag, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1218 | trav = trav->next; | |||||
1219 | } | |||||
1220 | ||||||
1221 | return 0; | |||||
1222 | err: | |||||
1223 | STRIPE_STACK_UNWIND (unlink, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1223, 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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1224 | return 0; | |||||
1225 | } | |||||
1226 | ||||||
1227 | ||||||
1228 | int32_t | |||||
1229 | stripe_first_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1230 | int32_t op_ret, int32_t op_errno,struct iatt *preparent, | |||||
1231 | struct iatt *postparent, dict_t *xdata) | |||||
1232 | { | |||||
1233 | stripe_local_t *local = NULL((void*)0); | |||||
1234 | ||||||
1235 | if (!this || !frame || !frame->local) { | |||||
1236 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1236, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1237 | op_errno = EINVAL22; | |||||
1238 | goto err; | |||||
1239 | } | |||||
1240 | ||||||
1241 | if (op_ret == -1) { | |||||
1242 | goto err; | |||||
1243 | } | |||||
1244 | ||||||
1245 | local = frame->local; | |||||
1246 | local->op_ret = 0; | |||||
1247 | ||||||
1248 | local->call_count--; /* First child successful */ | |||||
1249 | ||||||
1250 | local->preparent = *preparent; | |||||
1251 | local->postparent = *postparent; | |||||
1252 | local->preparent_size = preparent->ia_size; | |||||
1253 | local->postparent_size = postparent->ia_size; | |||||
1254 | local->preparent_blocks += preparent->ia_blocks; | |||||
1255 | local->postparent_blocks += postparent->ia_blocks; | |||||
1256 | ||||||
1257 | STRIPE_STACK_UNWIND (rmdir, frame, local->op_ret, local->op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1258, 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, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
1258 | &local->preparent, &local->postparent, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1258, 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, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
1259 | return 0; | |||||
1260 | err: | |||||
1261 | STRIPE_STACK_UNWIND (rmdir, frame, op_ret, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1261, 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, op_ret, op_errno, ((void*)0), ((void*)0), ((void*) 0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1262 | return 0; | |||||
1263 | ||||||
1264 | } | |||||
1265 | ||||||
1266 | int32_t | |||||
1267 | stripe_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1268 | int32_t op_ret, int32_t op_errno, struct iatt *preparent, | |||||
1269 | struct iatt *postparent, dict_t *xdata) | |||||
1270 | { | |||||
1271 | int32_t callcnt = 0; | |||||
1272 | stripe_local_t *local = NULL((void*)0); | |||||
1273 | call_frame_t *prev = NULL((void*)0); | |||||
1274 | ||||||
1275 | if (!this || !frame || !frame->local || !cookie) { | |||||
1276 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1276, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1277 | goto out; | |||||
1278 | } | |||||
1279 | ||||||
1280 | prev = cookie; | |||||
1281 | local = frame->local; | |||||
1282 | ||||||
1283 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1284 | { | |||||
1285 | callcnt = --local->call_count; | |||||
1286 | ||||||
1287 | if (op_ret == -1) { | |||||
1288 | gf_log (this->name, GF_LOG_DEBUG, "%s returned %s",do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 1289, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1289 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 1289, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1290 | if (op_errno != ENOENT2) | |||||
1291 | local->failed = 1; | |||||
1292 | } | |||||
1293 | } | |||||
1294 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1295 | ||||||
1296 | if (callcnt == 1) { | |||||
1297 | if (local->failed) | |||||
1298 | goto out; | |||||
1299 | STACK_WIND (frame, stripe_first_rmdir_cbk, FIRST_CHILD (this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 1301, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->rmdir_cbk) tmp_cbk = stripe_first_rmdir_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->rmdir"; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->rmdir); (this->children->xlator )->fops->rmdir (_new, (this->children->xlator), & local->loc, local->flags, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1300 | FIRST_CHILD (this)->fops->rmdir, &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", "stripe.c", __FUNCTION__, 1301, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->rmdir_cbk) tmp_cbk = stripe_first_rmdir_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->rmdir"; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->rmdir); (this->children->xlator )->fops->rmdir (_new, (this->children->xlator), & local->loc, local->flags, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1301 | 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", "stripe.c", __FUNCTION__, 1301, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->rmdir_cbk) tmp_cbk = stripe_first_rmdir_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->rmdir"; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->rmdir); (this->children->xlator )->fops->rmdir (_new, (this->children->xlator), & local->loc, local->flags, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1302 | } | |||||
1303 | return 0; | |||||
1304 | out: | |||||
1305 | STRIPE_STACK_UNWIND (rmdir, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1305, 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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1306 | return 0; | |||||
1307 | } | |||||
1308 | ||||||
1309 | int32_t | |||||
1310 | stripe_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, dict_t *xdata) | |||||
1311 | { | |||||
1312 | xlator_list_t *trav = NULL((void*)0); | |||||
1313 | stripe_local_t *local = NULL((void*)0); | |||||
1314 | stripe_private_t *priv = NULL((void*)0); | |||||
1315 | int32_t op_errno = EINVAL22; | |||||
1316 | ||||||
1317 | 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!)"), "stripe.c" , __FUNCTION__, 1317, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
1318 | 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!)"), "stripe.c" , __FUNCTION__, 1318, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
1319 | 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!)"), "stripe.c" , __FUNCTION__, 1319, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
1320 | 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!)" ), "stripe.c", __FUNCTION__, 1320, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
1321 | 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!)" ), "stripe.c", __FUNCTION__, 1321, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
1322 | ||||||
1323 | priv = this->private; | |||||
1324 | trav = this->children; | |||||
1325 | ||||||
1326 | /* don't delete a directory if any of the subvolume is down */ | |||||
1327 | if (priv->nodes_down) { | |||||
1328 | op_errno = ENOTCONN107; | |||||
1329 | goto err; | |||||
1330 | } | |||||
1331 | ||||||
1332 | /* Initialization */ | |||||
1333 | local = mem_get0 (this->local_pool); | |||||
1334 | if (!local) { | |||||
1335 | op_errno = ENOMEM12; | |||||
1336 | goto err; | |||||
1337 | } | |||||
1338 | local->op_ret = -1; | |||||
1339 | frame->local = local; | |||||
1340 | loc_copy (&local->loc, loc); | |||||
1341 | local->flags = flags; | |||||
1342 | local->call_count = priv->child_count; | |||||
1343 | trav = trav->next; /* skip the first child */ | |||||
1344 | ||||||
1345 | while (trav) { | |||||
1346 | STACK_WIND (frame, stripe_rmdir_cbk, trav->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", "stripe.c", __FUNCTION__, 1347, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->rmdir_cbk) tmp_cbk = stripe_rmdir_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->rmdir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->rmdir); trav->xlator->fops ->rmdir (_new, trav->xlator, loc, flags, ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1347 | trav->xlator->fops->rmdir, loc, 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", "stripe.c", __FUNCTION__, 1347, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->rmdir_cbk) tmp_cbk = stripe_rmdir_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->rmdir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->rmdir); trav->xlator->fops ->rmdir (_new, trav->xlator, loc, flags, ((void*)0)); ( *__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1348 | trav = trav->next; | |||||
1349 | } | |||||
1350 | ||||||
1351 | return 0; | |||||
1352 | err: | |||||
1353 | STRIPE_STACK_UNWIND (rmdir, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1353, 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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1354 | return 0; | |||||
1355 | } | |||||
1356 | ||||||
1357 | ||||||
1358 | int32_t | |||||
1359 | stripe_mknod_ifreg_fail_unlink_cbk (call_frame_t *frame, void *cookie, | |||||
1360 | xlator_t *this, int32_t op_ret, | |||||
1361 | int32_t op_errno, struct iatt *preparent, | |||||
1362 | struct iatt *postparent, dict_t *xdata) | |||||
1363 | { | |||||
1364 | int32_t callcnt = 0; | |||||
1365 | stripe_local_t *local = NULL((void*)0); | |||||
1366 | ||||||
1367 | if (!this || !frame || !frame->local) { | |||||
1368 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1368, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1369 | goto out; | |||||
1370 | } | |||||
1371 | ||||||
1372 | local = frame->local; | |||||
1373 | ||||||
1374 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1375 | { | |||||
1376 | callcnt = --local->call_count; | |||||
1377 | } | |||||
1378 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1379 | ||||||
1380 | if (!callcnt) { | |||||
1381 | STRIPE_STACK_UNWIND (mknod, frame, local->op_ret, local->op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1383, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1382 | local->inode, &local->stbuf,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1383, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1383 | &local->preparent, &local->postparent, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1383, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1384 | } | |||||
1385 | out: | |||||
1386 | return 0; | |||||
1387 | } | |||||
1388 | ||||||
1389 | ||||||
1390 | /** | |||||
1391 | */ | |||||
1392 | int32_t | |||||
1393 | stripe_mknod_ifreg_setxattr_cbk (call_frame_t *frame, void *cookie, | |||||
1394 | xlator_t *this, int32_t op_ret, | |||||
1395 | int32_t op_errno, dict_t *xdata) | |||||
1396 | { | |||||
1397 | int32_t callcnt = 0; | |||||
1398 | stripe_local_t *local = NULL((void*)0); | |||||
1399 | stripe_private_t *priv = NULL((void*)0); | |||||
1400 | xlator_list_t *trav = NULL((void*)0); | |||||
1401 | call_frame_t *prev = NULL((void*)0); | |||||
1402 | ||||||
1403 | if (!this || !frame || !frame->local || !cookie) { | |||||
1404 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1404, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1405 | goto out; | |||||
1406 | } | |||||
1407 | ||||||
1408 | prev = cookie; | |||||
1409 | priv = this->private; | |||||
1410 | local = frame->local; | |||||
1411 | ||||||
1412 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1413 | { | |||||
1414 | callcnt = --local->call_count; | |||||
1415 | ||||||
1416 | if (op_ret == -1) { | |||||
1417 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1419, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1418 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1419, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1419 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1419, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1420 | local->op_ret = -1; | |||||
1421 | local->op_errno = op_errno; | |||||
1422 | } | |||||
1423 | } | |||||
1424 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1425 | ||||||
1426 | if (!callcnt) { | |||||
1427 | if (local->op_ret == -1) { | |||||
1428 | local->call_count = priv->child_count; | |||||
1429 | while (trav) { | |||||
1430 | STACK_WIND (frame,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 1434, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1431 | stripe_mknod_ifreg_fail_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", "stripe.c", __FUNCTION__, 1434, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1432 | trav->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", "stripe.c", __FUNCTION__, 1434, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1433 | trav->xlator->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", "stripe.c", __FUNCTION__, 1434, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1434 | &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", "stripe.c", __FUNCTION__, 1434, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1435 | trav = trav->next; | |||||
1436 | } | |||||
1437 | return 0; | |||||
1438 | } | |||||
1439 | ||||||
1440 | STRIPE_STACK_UNWIND (mknod, frame, local->op_ret, local->op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1442, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1441 | local->inode, &local->stbuf,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1442, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1442 | &local->preparent, &local->postparent, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1442, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1443 | } | |||||
1444 | out: | |||||
1445 | return 0; | |||||
1446 | } | |||||
1447 | ||||||
1448 | int32_t | |||||
1449 | stripe_mknod_ifreg_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1450 | int32_t op_ret, int32_t op_errno, inode_t *inode, | |||||
1451 | struct iatt *buf, struct iatt *preparent, | |||||
1452 | struct iatt *postparent, dict_t *xdata) | |||||
1453 | { | |||||
1454 | int32_t callcnt = 0; | |||||
1455 | stripe_local_t *local = NULL((void*)0); | |||||
1456 | stripe_private_t *priv = NULL((void*)0); | |||||
1457 | call_frame_t *prev = NULL((void*)0); | |||||
1458 | xlator_list_t *trav = NULL((void*)0); | |||||
1459 | ||||||
1460 | if (!this || !frame || !frame->local || !cookie) { | |||||
1461 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1461, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1462 | goto out; | |||||
1463 | } | |||||
1464 | ||||||
1465 | prev = cookie; | |||||
1466 | priv = this->private; | |||||
1467 | local = frame->local; | |||||
1468 | ||||||
1469 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1470 | { | |||||
1471 | callcnt = --local->call_count; | |||||
1472 | ||||||
1473 | if (op_ret == -1) { | |||||
1474 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1476, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1475 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1476, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1476 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1476, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1477 | if ((op_errno != ENOENT2) || | |||||
1478 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
1479 | local->failed = 1; | |||||
1480 | local->op_errno = op_errno; | |||||
1481 | } | |||||
1482 | if (op_ret >= 0) { | |||||
1483 | local->op_ret = op_ret; | |||||
1484 | ||||||
1485 | /* Can be used as a mechanism to understand if mknod | |||||
1486 | was successful in at least one place */ | |||||
1487 | if (uuid_is_null (local->ia_gfid)) | |||||
1488 | uuid_copy (local->ia_gfid, buf->ia_gfid); | |||||
1489 | ||||||
1490 | if (stripe_ctx_handle(this, prev, local, xdata)) | |||||
1491 | gf_log(this->name, GF_LOG_ERROR,do { do { if (0) printf ("Error getting fctx info from dict") ; } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 1492, GF_LOG_ERROR, "Error getting fctx info from dict"); } while (0) | |||||
1492 | "Error getting fctx info from dict")do { do { if (0) printf ("Error getting fctx info from dict") ; } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 1492, GF_LOG_ERROR, "Error getting fctx info from dict"); } while (0); | |||||
1493 | ||||||
1494 | local->stbuf_blocks += buf->ia_blocks; | |||||
1495 | local->preparent_blocks += preparent->ia_blocks; | |||||
1496 | local->postparent_blocks += postparent->ia_blocks; | |||||
1497 | ||||||
1498 | correct_file_size(buf, local->fctx, prev); | |||||
1499 | ||||||
1500 | if (local->stbuf_size < buf->ia_size) | |||||
1501 | local->stbuf_size = buf->ia_size; | |||||
1502 | if (local->preparent_size < preparent->ia_size) | |||||
1503 | local->preparent_size = preparent->ia_size; | |||||
1504 | if (local->postparent_size < postparent->ia_size) | |||||
1505 | local->postparent_size = postparent->ia_size; | |||||
1506 | } | |||||
1507 | } | |||||
1508 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1509 | ||||||
1510 | if (!callcnt) { | |||||
1511 | if (local->failed) | |||||
1512 | local->op_ret = -1; | |||||
1513 | ||||||
1514 | if ((local->op_ret == -1) && !uuid_is_null (local->ia_gfid)) { | |||||
1515 | /* ia_gfid set means, at least on one node 'mknod' | |||||
1516 | is successful */ | |||||
1517 | local->call_count = priv->child_count; | |||||
1518 | trav = this->children; | |||||
1519 | while (trav) { | |||||
1520 | STACK_WIND (frame,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 1524, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1521 | stripe_mknod_ifreg_fail_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", "stripe.c", __FUNCTION__, 1524, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1522 | trav->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", "stripe.c", __FUNCTION__, 1524, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1523 | trav->xlator->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", "stripe.c", __FUNCTION__, 1524, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1524 | &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", "stripe.c", __FUNCTION__, 1524, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_mknod_ifreg_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_mknod_ifreg_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1525 | trav = trav->next; | |||||
1526 | } | |||||
1527 | return 0; | |||||
1528 | } | |||||
1529 | ||||||
1530 | ||||||
1531 | if (local->op_ret != -1) { | |||||
1532 | local->preparent.ia_blocks = local->preparent_blocks; | |||||
1533 | local->preparent.ia_size = local->preparent_size; | |||||
1534 | local->postparent.ia_blocks = local->postparent_blocks; | |||||
1535 | local->postparent.ia_size = local->postparent_size; | |||||
1536 | local->stbuf.ia_size = local->stbuf_size; | |||||
1537 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
1538 | inode_ctx_put (local->inode, this, | |||||
1539 | (uint64_t)(long) local->fctx); | |||||
1540 | ||||||
1541 | } | |||||
1542 | STRIPE_STACK_UNWIND (mknod, frame, local->op_ret, local->op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1544, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1543 | local->inode, &local->stbuf,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1544, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1544 | &local->preparent, &local->postparent, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1544, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1545 | } | |||||
1546 | out: | |||||
1547 | return 0; | |||||
1548 | } | |||||
1549 | ||||||
1550 | ||||||
1551 | int32_t | |||||
1552 | stripe_mknod_first_ifreg_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1553 | int32_t op_ret, int32_t op_errno, inode_t *inode, | |||||
1554 | struct iatt *buf, struct iatt *preparent, | |||||
1555 | struct iatt *postparent, dict_t *xdata) | |||||
1556 | { | |||||
1557 | stripe_local_t *local = NULL((void*)0); | |||||
1558 | stripe_private_t *priv = NULL((void*)0); | |||||
1559 | call_frame_t *prev = NULL((void*)0); | |||||
1560 | xlator_list_t *trav = NULL((void*)0); | |||||
1561 | int i = 1; | |||||
1562 | dict_t *dict = NULL((void*)0); | |||||
1563 | int ret = 0; | |||||
1564 | int need_unref = 0; | |||||
1565 | ||||||
1566 | if (!this || !frame || !frame->local || !cookie) { | |||||
1567 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1567, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1568 | goto out; | |||||
1569 | } | |||||
1570 | ||||||
1571 | prev = cookie; | |||||
1572 | priv = this->private; | |||||
1573 | local = frame->local; | |||||
1574 | trav = this->children; | |||||
1575 | ||||||
1576 | local->call_count--; | |||||
1577 | ||||||
1578 | if (op_ret == -1) { | |||||
1579 | gf_log (this->name, GF_LOG_DEBUG, "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1580, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1580 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1580, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1581 | local->failed = 1; | |||||
1582 | local->op_errno = op_errno; | |||||
1583 | goto out; | |||||
1584 | } | |||||
1585 | ||||||
1586 | local->op_ret = op_ret; | |||||
1587 | ||||||
1588 | local->stbuf = *buf; | |||||
1589 | local->preparent = *preparent; | |||||
1590 | local->postparent = *postparent; | |||||
1591 | ||||||
1592 | if (uuid_is_null (local->ia_gfid)) | |||||
1593 | uuid_copy (local->ia_gfid, buf->ia_gfid); | |||||
1594 | local->preparent.ia_blocks = local->preparent_blocks; | |||||
1595 | local->preparent.ia_size = local->preparent_size; | |||||
1596 | local->postparent.ia_blocks = local->postparent_blocks; | |||||
1597 | local->postparent.ia_size = local->postparent_size; | |||||
1598 | local->stbuf.ia_size = local->stbuf_size; | |||||
1599 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
1600 | ||||||
1601 | trav = trav->next; | |||||
1602 | while (trav) { | |||||
1603 | if (priv->xattr_supported) { | |||||
1604 | dict = dict_new (); | |||||
1605 | if (!dict) { | |||||
1606 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to allocate dict %s", local-> loc.path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 1607, GF_LOG_ERROR, "failed to allocate dict %s", local-> loc.path); } while (0) | |||||
1607 | "failed to allocate dict %s", local->loc.path)do { do { if (0) printf ("failed to allocate dict %s", local-> loc.path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 1607, GF_LOG_ERROR, "failed to allocate dict %s", local-> loc.path); } while (0); | |||||
1608 | } | |||||
1609 | need_unref = 1; | |||||
1610 | ||||||
1611 | dict_copy (local->xattr, dict); | |||||
1612 | ||||||
1613 | ret = stripe_xattr_request_build (this, dict, | |||||
1614 | local->stripe_size, | |||||
1615 | priv->child_count, i, | |||||
1616 | priv->coalesce); | |||||
1617 | if (ret) | |||||
1618 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Failed to build xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 1619, GF_LOG_ERROR, "Failed to build xattr request"); } while (0) | |||||
1619 | "Failed to build xattr request")do { do { if (0) printf ("Failed to build xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 1619, GF_LOG_ERROR, "Failed to build xattr request"); } while (0); | |||||
1620 | ||||||
1621 | } else { | |||||
1622 | dict = local->xattr; | |||||
1623 | } | |||||
1624 | ||||||
1625 | STACK_WIND (frame, stripe_mknod_ifreg_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", "stripe.c", __FUNCTION__, 1627, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_mknod_ifreg_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->mknod"; _new->unwind_to = "stripe_mknod_ifreg_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->mknod); trav->xlator->fops ->mknod (_new, trav->xlator, &local->loc, local-> mode, local->rdev, 0, dict); (*__glusterfs_this_location() ) = old_THIS; } while (0) | |||||
1626 | trav->xlator, trav->xlator->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", "stripe.c", __FUNCTION__, 1627, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_mknod_ifreg_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->mknod"; _new->unwind_to = "stripe_mknod_ifreg_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->mknod); trav->xlator->fops ->mknod (_new, trav->xlator, &local->loc, local-> mode, local->rdev, 0, dict); (*__glusterfs_this_location() ) = old_THIS; } while (0) | |||||
1627 | &local->loc, local->mode, local->rdev, 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", "stripe.c", __FUNCTION__, 1627, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mknod_cbk) tmp_cbk = stripe_mknod_ifreg_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->mknod"; _new->unwind_to = "stripe_mknod_ifreg_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->mknod); trav->xlator->fops ->mknod (_new, trav->xlator, &local->loc, local-> mode, local->rdev, 0, dict); (*__glusterfs_this_location() ) = old_THIS; } while (0); | |||||
1628 | trav = trav->next; | |||||
1629 | i++; | |||||
1630 | ||||||
1631 | if (dict && need_unref) | |||||
1632 | dict_unref (dict); | |||||
1633 | } | |||||
1634 | ||||||
1635 | return 0; | |||||
1636 | ||||||
1637 | out: | |||||
1638 | ||||||
1639 | STRIPE_STACK_UNWIND (mknod, frame, op_ret, op_errno, NULL, NULL, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1639, 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, ((void*)0), ((void*)0), ((void*) 0), ((void*)0), ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local ); mem_put (__local); } } while (0); | |||||
1640 | return 0; | |||||
1641 | } | |||||
1642 | ||||||
1643 | ||||||
1644 | int32_t | |||||
1645 | stripe_single_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1646 | int32_t op_ret, int32_t op_errno, inode_t *inode, | |||||
1647 | struct iatt *buf, struct iatt *preparent, | |||||
1648 | struct iatt *postparent, dict_t *xdata) | |||||
1649 | { | |||||
1650 | STRIPE_STACK_UNWIND (mknod, frame, op_ret, op_errno, inode, buf,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1651, 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, buf, preparent, postparent , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0) | |||||
1651 | preparent, postparent, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1651, 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, buf, preparent, postparent , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0); | |||||
1652 | return 0; | |||||
1653 | } | |||||
1654 | ||||||
1655 | ||||||
1656 | int | |||||
1657 | stripe_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, | |||||
1658 | dev_t rdev, mode_t umask, dict_t *xdata) | |||||
1659 | { | |||||
1660 | stripe_private_t *priv = NULL((void*)0); | |||||
1661 | stripe_local_t *local = NULL((void*)0); | |||||
1662 | int32_t op_errno = EINVAL22; | |||||
1663 | int32_t i = 0; | |||||
1664 | dict_t *dict = NULL((void*)0); | |||||
1665 | int ret = 0; | |||||
1666 | int need_unref = 0; | |||||
1667 | ||||||
1668 | 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!)"), "stripe.c" , __FUNCTION__, 1668, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
1669 | 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!)"), "stripe.c" , __FUNCTION__, 1669, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
1670 | 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!)"), "stripe.c" , __FUNCTION__, 1670, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
1671 | 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!)" ), "stripe.c", __FUNCTION__, 1671, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
1672 | 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!)" ), "stripe.c", __FUNCTION__, 1672, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
1673 | ||||||
1674 | priv = this->private; | |||||
1675 | ||||||
1676 | if (priv->first_child_down) { | |||||
1677 | op_errno = ENOTCONN107; | |||||
1678 | goto err; | |||||
1679 | } | |||||
1680 | ||||||
1681 | if (S_ISREG(mode)((((mode)) & 0170000) == (0100000))) { | |||||
1682 | /* NOTE: on older kernels (older than 2.6.9), | |||||
1683 | creat() fops is sent as mknod() + open(). Hence handling | |||||
1684 | S_IFREG files is necessary */ | |||||
1685 | if (priv->nodes_down) { | |||||
1686 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("Some node down, returning EIO"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 1687, GF_LOG_WARNING, "Some node down, returning EIO"); } while (0 ) | |||||
1687 | "Some node down, returning EIO")do { do { if (0) printf ("Some node down, returning EIO"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 1687, GF_LOG_WARNING, "Some node down, returning EIO"); } while (0 ); | |||||
1688 | op_errno = EIO5; | |||||
1689 | goto err; | |||||
1690 | } | |||||
1691 | ||||||
1692 | /* Initialization */ | |||||
1693 | local = mem_get0 (this->local_pool); | |||||
1694 | if (!local) { | |||||
1695 | op_errno = ENOMEM12; | |||||
1696 | goto err; | |||||
1697 | } | |||||
1698 | local->op_ret = -1; | |||||
1699 | local->op_errno = ENOTCONN107; | |||||
1700 | local->stripe_size = stripe_get_matching_bs (loc->path, priv); | |||||
1701 | frame->local = local; | |||||
1702 | local->inode = inode_ref (loc->inode); | |||||
1703 | loc_copy (&local->loc, loc); | |||||
1704 | local->xattr = dict_copy_with_ref (xdata, NULL((void*)0)); | |||||
1705 | local->mode = mode; | |||||
1706 | local->umask = umask; | |||||
1707 | local->rdev = rdev; | |||||
1708 | ||||||
1709 | /* Everytime in stripe lookup, all child nodes should | |||||
1710 | be looked up */ | |||||
1711 | local->call_count = priv->child_count; | |||||
1712 | ||||||
1713 | if (priv->xattr_supported) { | |||||
1714 | dict = dict_new (); | |||||
1715 | if (!dict) { | |||||
1716 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to allocate dict %s", loc-> path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 1717, GF_LOG_ERROR, "failed to allocate dict %s", loc->path ); } while (0) | |||||
1717 | "failed to allocate dict %s", loc->path)do { do { if (0) printf ("failed to allocate dict %s", loc-> path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 1717, GF_LOG_ERROR, "failed to allocate dict %s", loc->path ); } while (0); | |||||
1718 | } | |||||
1719 | need_unref = 1; | |||||
1720 | ||||||
1721 | dict_copy (xdata, dict); | |||||
1722 | ||||||
1723 | ret = stripe_xattr_request_build (this, dict, | |||||
1724 | local->stripe_size, | |||||
1725 | priv->child_count, | |||||
1726 | i, priv->coalesce); | |||||
1727 | if (ret) | |||||
1728 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to build xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 1729, GF_LOG_ERROR, "failed to build xattr request"); } while (0) | |||||
1729 | "failed to build xattr request")do { do { if (0) printf ("failed to build xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 1729, GF_LOG_ERROR, "failed to build xattr request"); } while (0); | |||||
1730 | } else { | |||||
1731 | dict = xdata; | |||||
1732 | } | |||||
1733 | ||||||
1734 | STACK_WIND (frame, stripe_mknod_first_ifreg_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", "stripe.c", __FUNCTION__, 1736, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->mknod_cbk) tmp_cbk = stripe_mknod_first_ifreg_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->mknod"; _new->unwind_to = "stripe_mknod_first_ifreg_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->mknod); (this->children->xlator )->fops->mknod (_new, (this->children->xlator), loc , mode, rdev, umask, dict); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
1735 | FIRST_CHILD (this), FIRST_CHILD (this)->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", "stripe.c", __FUNCTION__, 1736, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->mknod_cbk) tmp_cbk = stripe_mknod_first_ifreg_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->mknod"; _new->unwind_to = "stripe_mknod_first_ifreg_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->mknod); (this->children->xlator )->fops->mknod (_new, (this->children->xlator), loc , mode, rdev, umask, dict); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
1736 | loc, mode, rdev, umask, 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", "stripe.c", __FUNCTION__, 1736, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->mknod_cbk) tmp_cbk = stripe_mknod_first_ifreg_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->mknod"; _new->unwind_to = "stripe_mknod_first_ifreg_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->mknod); (this->children->xlator )->fops->mknod (_new, (this->children->xlator), loc , mode, rdev, umask, dict); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
1737 | ||||||
1738 | if (dict && need_unref) | |||||
1739 | dict_unref (dict); | |||||
1740 | return 0; | |||||
1741 | } | |||||
1742 | ||||||
1743 | STACK_WIND (frame, stripe_single_mknod_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", "stripe.c", __FUNCTION__, 1745, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->mknod_cbk) tmp_cbk = stripe_single_mknod_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->mknod"; _new ->unwind_to = "stripe_single_mknod_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->mknod); (this->children->xlator )->fops->mknod (_new, (this->children->xlator), loc , mode, rdev, umask, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1744 | FIRST_CHILD(this), FIRST_CHILD(this)->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", "stripe.c", __FUNCTION__, 1745, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->mknod_cbk) tmp_cbk = stripe_single_mknod_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->mknod"; _new ->unwind_to = "stripe_single_mknod_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->mknod); (this->children->xlator )->fops->mknod (_new, (this->children->xlator), loc , mode, rdev, umask, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1745 | loc, mode, rdev, umask, 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", "stripe.c", __FUNCTION__, 1745, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->mknod_cbk) tmp_cbk = stripe_single_mknod_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->mknod"; _new ->unwind_to = "stripe_single_mknod_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->mknod); (this->children->xlator )->fops->mknod (_new, (this->children->xlator), loc , mode, rdev, umask, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1746 | ||||||
1747 | return 0; | |||||
1748 | err: | |||||
1749 | STRIPE_STACK_UNWIND (mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1749, 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); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1750 | return 0; | |||||
1751 | } | |||||
1752 | ||||||
1753 | ||||||
1754 | int32_t | |||||
1755 | stripe_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1756 | int32_t op_ret, int32_t op_errno, inode_t *inode, | |||||
1757 | struct iatt *buf, struct iatt *preparent, | |||||
1758 | struct iatt *postparent, dict_t *xdata) | |||||
1759 | { | |||||
1760 | int32_t callcnt = 0; | |||||
1761 | stripe_local_t *local = NULL((void*)0); | |||||
1762 | call_frame_t *prev = NULL((void*)0); | |||||
1763 | ||||||
1764 | if (!this || !frame || !frame->local || !cookie) { | |||||
1765 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1765, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1766 | goto out; | |||||
1767 | } | |||||
1768 | ||||||
1769 | prev = cookie; | |||||
1770 | local = frame->local; | |||||
1771 | ||||||
1772 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1773 | { | |||||
1774 | callcnt = --local->call_count; | |||||
1775 | ||||||
1776 | if (op_ret == -1) { | |||||
1777 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1779, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1778 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1779, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1779 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1779, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1780 | local->op_errno = op_errno; | |||||
1781 | if ((op_errno != ENOENT2) || | |||||
1782 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
1783 | local->failed = 1; | |||||
1784 | } | |||||
1785 | ||||||
1786 | if (op_ret >= 0) { | |||||
1787 | local->op_ret = 0; | |||||
1788 | ||||||
1789 | local->stbuf_blocks += buf->ia_blocks; | |||||
1790 | local->preparent_blocks += preparent->ia_blocks; | |||||
1791 | local->postparent_blocks += postparent->ia_blocks; | |||||
1792 | ||||||
1793 | if (local->stbuf_size < buf->ia_size) | |||||
1794 | local->stbuf_size = buf->ia_size; | |||||
1795 | if (local->preparent_size < preparent->ia_size) | |||||
1796 | local->preparent_size = preparent->ia_size; | |||||
1797 | if (local->postparent_size < postparent->ia_size) | |||||
1798 | local->postparent_size = postparent->ia_size; | |||||
1799 | } | |||||
1800 | } | |||||
1801 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1802 | ||||||
1803 | if (!callcnt) { | |||||
1804 | if (local->failed != -1) { | |||||
1805 | local->preparent.ia_blocks = local->preparent_blocks; | |||||
1806 | local->preparent.ia_size = local->preparent_size; | |||||
1807 | local->postparent.ia_blocks = local->postparent_blocks; | |||||
1808 | local->postparent.ia_size = local->postparent_size; | |||||
1809 | local->stbuf.ia_size = local->stbuf_size; | |||||
1810 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
1811 | } | |||||
1812 | STRIPE_STACK_UNWIND (mkdir, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1815, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1813 | local->op_errno, local->inode,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1815, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1814 | &local->stbuf, &local->preparent,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1815, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1815 | &local->postparent, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1815, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1816 | } | |||||
1817 | out: | |||||
1818 | return 0; | |||||
1819 | } | |||||
1820 | ||||||
1821 | ||||||
1822 | int32_t | |||||
1823 | stripe_first_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1824 | int32_t op_ret, int32_t op_errno, inode_t *inode, | |||||
1825 | struct iatt *buf, struct iatt *preparent, | |||||
1826 | struct iatt *postparent, dict_t *xdata) | |||||
1827 | { | |||||
1828 | stripe_local_t *local = NULL((void*)0); | |||||
1829 | call_frame_t *prev = NULL((void*)0); | |||||
1830 | xlator_list_t *trav = NULL((void*)0); | |||||
1831 | ||||||
1832 | if (!this || !frame || !frame->local || !cookie) { | |||||
1833 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1833, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1834 | goto out; | |||||
1835 | } | |||||
1836 | ||||||
1837 | prev = cookie; | |||||
1838 | local = frame->local; | |||||
1839 | trav = this->children; | |||||
1840 | ||||||
1841 | local->call_count--; /* first child is successful */ | |||||
1842 | trav = trav->next; /* skip first child */ | |||||
1843 | ||||||
1844 | if (op_ret == -1) { | |||||
1845 | gf_log (this->name, GF_LOG_DEBUG, "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1846, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1846 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1846, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1847 | local->op_errno = op_errno; | |||||
1848 | goto out; | |||||
1849 | } | |||||
1850 | ||||||
1851 | local->op_ret = 0; | |||||
1852 | ||||||
1853 | local->inode = inode_ref (inode); | |||||
1854 | local->stbuf = *buf; | |||||
1855 | local->postparent = *postparent; | |||||
1856 | local->preparent = *preparent; | |||||
1857 | ||||||
1858 | local->stbuf_blocks += buf->ia_blocks; | |||||
1859 | local->preparent_blocks += preparent->ia_blocks; | |||||
1860 | local->postparent_blocks += postparent->ia_blocks; | |||||
1861 | ||||||
1862 | local->stbuf_size = buf->ia_size; | |||||
1863 | local->preparent_size = preparent->ia_size; | |||||
1864 | local->postparent_size = postparent->ia_size; | |||||
1865 | ||||||
1866 | while (trav) { | |||||
1867 | STACK_WIND (frame, stripe_mkdir_cbk, trav->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", "stripe.c", __FUNCTION__, 1869, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_mkdir_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->mkdir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->mkdir); trav->xlator->fops ->mkdir (_new, trav->xlator, &local->loc, local-> mode, local->umask, local->xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1868 | trav->xlator->fops->mkdir, &local->loc, 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", "stripe.c", __FUNCTION__, 1869, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_mkdir_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->mkdir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->mkdir); trav->xlator->fops ->mkdir (_new, trav->xlator, &local->loc, local-> mode, local->umask, local->xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
1869 | local->umask, local->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", "stripe.c", __FUNCTION__, 1869, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_mkdir_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->mkdir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->mkdir); trav->xlator->fops ->mkdir (_new, trav->xlator, &local->loc, local-> mode, local->umask, local->xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
1870 | trav = trav->next; | |||||
1871 | } | |||||
1872 | return 0; | |||||
1873 | out: | |||||
1874 | STRIPE_STACK_UNWIND (mkdir, frame, -1, op_errno, NULL, NULL, NULL,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1875, 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); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
1875 | NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1875, 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); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1876 | ||||||
1877 | return 0; | |||||
1878 | ||||||
1879 | } | |||||
1880 | ||||||
1881 | ||||||
1882 | int | |||||
1883 | stripe_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, | |||||
1884 | mode_t umask, dict_t *xdata) | |||||
1885 | { | |||||
1886 | stripe_private_t *priv = NULL((void*)0); | |||||
1887 | stripe_local_t *local = NULL((void*)0); | |||||
1888 | xlator_list_t *trav = NULL((void*)0); | |||||
1889 | int32_t op_errno = 1; | |||||
1890 | ||||||
1891 | 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!)"), "stripe.c" , __FUNCTION__, 1891, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
1892 | 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!)"), "stripe.c" , __FUNCTION__, 1892, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
1893 | 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!)"), "stripe.c" , __FUNCTION__, 1893, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
1894 | 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!)" ), "stripe.c", __FUNCTION__, 1894, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
1895 | 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!)" ), "stripe.c", __FUNCTION__, 1895, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
1896 | ||||||
1897 | priv = this->private; | |||||
1898 | trav = this->children; | |||||
1899 | ||||||
1900 | if (priv->first_child_down) { | |||||
1901 | op_errno = ENOTCONN107; | |||||
1902 | goto err; | |||||
1903 | } | |||||
1904 | ||||||
1905 | /* Initialization */ | |||||
1906 | local = mem_get0 (this->local_pool); | |||||
1907 | if (!local) { | |||||
1908 | op_errno = ENOMEM12; | |||||
1909 | goto err; | |||||
1910 | } | |||||
1911 | local->op_ret = -1; | |||||
1912 | local->call_count = priv->child_count; | |||||
1913 | if (xdata) | |||||
1914 | local->xdata = dict_ref (xdata); | |||||
1915 | local->mode = mode; | |||||
1916 | local->umask = umask; | |||||
1917 | loc_copy (&local->loc, loc); | |||||
1918 | frame->local = local; | |||||
1919 | ||||||
1920 | /* Everytime in stripe lookup, all child nodes should be looked up */ | |||||
1921 | STACK_WIND (frame, stripe_first_mkdir_cbk, trav->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", "stripe.c", __FUNCTION__, 1922, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_first_mkdir_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->mkdir"; _new->unwind_to = "stripe_first_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->mkdir); trav->xlator->fops ->mkdir (_new, trav->xlator, loc, mode, umask, xdata); ( *__glusterfs_this_location()) = old_THIS; } while (0) | |||||
1922 | trav->xlator->fops->mkdir, loc, mode, umask, 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", "stripe.c", __FUNCTION__, 1922, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->mkdir_cbk) tmp_cbk = stripe_first_mkdir_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->mkdir"; _new->unwind_to = "stripe_first_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->mkdir); trav->xlator->fops ->mkdir (_new, trav->xlator, loc, mode, umask, xdata); ( *__glusterfs_this_location()) = old_THIS; } while (0); | |||||
1923 | ||||||
1924 | return 0; | |||||
1925 | err: | |||||
1926 | STRIPE_STACK_UNWIND (mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 1926, 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); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
1927 | return 0; | |||||
1928 | } | |||||
1929 | ||||||
1930 | ||||||
1931 | int32_t | |||||
1932 | stripe_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
1933 | int32_t op_ret, int32_t op_errno, inode_t *inode, | |||||
1934 | struct iatt *buf, struct iatt *preparent, | |||||
1935 | struct iatt *postparent, dict_t *xdata) | |||||
1936 | { | |||||
1937 | int32_t callcnt = 0; | |||||
1938 | stripe_local_t *local = NULL((void*)0); | |||||
1939 | call_frame_t *prev = NULL((void*)0); | |||||
1940 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
1941 | ||||||
1942 | if (!this || !frame || !frame->local || !cookie) { | |||||
1943 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 1943, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
1944 | goto out; | |||||
1945 | } | |||||
1946 | ||||||
1947 | prev = cookie; | |||||
1948 | local = frame->local; | |||||
1949 | ||||||
1950 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
1951 | { | |||||
1952 | callcnt = --local->call_count; | |||||
1953 | ||||||
1954 | if (op_ret == -1) { | |||||
1955 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1957, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1956 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1957, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
1957 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 1957, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
1958 | local->op_errno = op_errno; | |||||
1959 | if ((op_errno != ENOENT2) || | |||||
1960 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
1961 | local->failed = 1; | |||||
1962 | } | |||||
1963 | ||||||
1964 | if (op_ret >= 0) { | |||||
1965 | local->op_ret = 0; | |||||
1966 | ||||||
1967 | if (IA_ISREG(inode->ia_type)(inode->ia_type == IA_IFREG)) { | |||||
1968 | inode_ctx_get(inode, this, (uint64_t *) &fctx)inode_ctx_get2(inode,this,(uint64_t *) &fctx,0); | |||||
1969 | if (!fctx) { | |||||
1970 | gf_log(this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to get stripe context"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 1971, GF_LOG_ERROR, "failed to get stripe context"); } while (0) | |||||
1971 | "failed to get stripe context")do { do { if (0) printf ("failed to get stripe context"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 1971, GF_LOG_ERROR, "failed to get stripe context"); } while (0); | |||||
1972 | op_ret = -1; | |||||
1973 | op_errno = EINVAL22; | |||||
1974 | } | |||||
1975 | } | |||||
1976 | ||||||
1977 | if (FIRST_CHILD(this)(this->children->xlator) == prev->this) { | |||||
1978 | local->inode = inode_ref (inode); | |||||
1979 | local->stbuf = *buf; | |||||
1980 | local->postparent = *postparent; | |||||
1981 | local->preparent = *preparent; | |||||
1982 | } | |||||
1983 | local->stbuf_blocks += buf->ia_blocks; | |||||
1984 | local->preparent_blocks += preparent->ia_blocks; | |||||
1985 | local->postparent_blocks += postparent->ia_blocks; | |||||
1986 | ||||||
1987 | correct_file_size(buf, fctx, prev); | |||||
1988 | ||||||
1989 | if (local->stbuf_size < buf->ia_size) | |||||
1990 | local->stbuf_size = buf->ia_size; | |||||
1991 | if (local->preparent_size < preparent->ia_size) | |||||
1992 | local->preparent_size = preparent->ia_size; | |||||
1993 | if (local->postparent_size < postparent->ia_size) | |||||
1994 | local->postparent_size = postparent->ia_size; | |||||
1995 | } | |||||
1996 | } | |||||
1997 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
1998 | ||||||
1999 | if (!callcnt) { | |||||
2000 | if (local->failed) | |||||
2001 | local->op_ret = -1; | |||||
2002 | ||||||
2003 | if (local->op_ret != -1) { | |||||
2004 | local->preparent.ia_blocks = local->preparent_blocks; | |||||
2005 | local->preparent.ia_size = local->preparent_size; | |||||
2006 | local->postparent.ia_blocks = local->postparent_blocks; | |||||
2007 | local->postparent.ia_size = local->postparent_size; | |||||
2008 | local->stbuf.ia_size = local->stbuf_size; | |||||
2009 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
2010 | } | |||||
2011 | STRIPE_STACK_UNWIND (link, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2014, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
2012 | local->op_errno, local->inode,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2014, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
2013 | &local->stbuf, &local->preparent,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2014, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
2014 | &local->postparent, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2014, 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, local->op_ret, local->op_errno, local->inode , &local->stbuf, &local->preparent, &local-> postparent, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
2015 | } | |||||
2016 | out: | |||||
2017 | return 0; | |||||
2018 | } | |||||
2019 | ||||||
2020 | int32_t | |||||
2021 | stripe_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, dict_t *xdata) | |||||
2022 | { | |||||
2023 | xlator_list_t *trav = NULL((void*)0); | |||||
2024 | stripe_local_t *local = NULL((void*)0); | |||||
2025 | stripe_private_t *priv = NULL((void*)0); | |||||
2026 | int32_t op_errno = 1; | |||||
2027 | ||||||
2028 | 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!)"), "stripe.c" , __FUNCTION__, 2028, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2029 | 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!)"), "stripe.c" , __FUNCTION__, 2029, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2030 | 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!)"), "stripe.c" , __FUNCTION__, 2030, GF_LOG_WARNING, "invalid argument: " "oldloc" ); } while (0); goto err; } } while (0); | |||||
2031 | VALIDATE_OR_GOTO (oldloc->path, err)do { if (!oldloc->path) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "oldloc->path"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "stripe.c", __FUNCTION__, 2031, GF_LOG_WARNING, "invalid argument: " "oldloc->path"); } while (0); goto err; } } while (0); | |||||
2032 | VALIDATE_OR_GOTO (oldloc->inode, err)do { if (!oldloc->inode) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "oldloc->inode" ); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)" ), "stripe.c", __FUNCTION__, 2032, GF_LOG_WARNING, "invalid argument: " "oldloc->inode"); } while (0); goto err; } } while (0); | |||||
2033 | ||||||
2034 | priv = this->private; | |||||
2035 | trav = this->children; | |||||
2036 | ||||||
2037 | /* If any one node is down, don't allow link operation */ | |||||
2038 | if (priv->nodes_down) { | |||||
2039 | op_errno = ENOTCONN107; | |||||
2040 | goto err; | |||||
2041 | } | |||||
2042 | ||||||
2043 | /* Initialization */ | |||||
2044 | local = mem_get0 (this->local_pool); | |||||
2045 | if (!local) { | |||||
2046 | op_errno = ENOMEM12; | |||||
2047 | goto err; | |||||
2048 | } | |||||
2049 | local->op_ret = -1; | |||||
2050 | frame->local = local; | |||||
2051 | local->call_count = priv->child_count; | |||||
2052 | ||||||
2053 | /* Everytime in stripe lookup, all child | |||||
2054 | nodes should be looked up */ | |||||
2055 | while (trav) { | |||||
2056 | STACK_WIND (frame, stripe_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", "stripe.c", __FUNCTION__, 2058, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->link_cbk) tmp_cbk = stripe_link_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->link"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->link); trav->xlator->fops ->link (_new, trav->xlator, oldloc, newloc, ((void*)0)) ; (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2057 | trav->xlator, trav->xlator->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", "stripe.c", __FUNCTION__, 2058, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->link_cbk) tmp_cbk = stripe_link_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->link"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->link); trav->xlator->fops ->link (_new, trav->xlator, oldloc, newloc, ((void*)0)) ; (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2058 | oldloc, newloc, 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", "stripe.c", __FUNCTION__, 2058, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->link_cbk) tmp_cbk = stripe_link_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->link"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->link); trav->xlator->fops ->link (_new, trav->xlator, oldloc, newloc, ((void*)0)) ; (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2059 | trav = trav->next; | |||||
2060 | } | |||||
2061 | ||||||
2062 | return 0; | |||||
2063 | err: | |||||
2064 | STRIPE_STACK_UNWIND (link, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2064, 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); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
2065 | return 0; | |||||
2066 | } | |||||
2067 | ||||||
2068 | int32_t | |||||
2069 | stripe_create_fail_unlink_cbk (call_frame_t *frame, void *cookie, | |||||
2070 | xlator_t *this, int32_t op_ret, | |||||
2071 | int32_t op_errno, struct iatt *preparent, | |||||
2072 | struct iatt *postparent, dict_t *xdata) | |||||
2073 | { | |||||
2074 | int32_t callcnt = 0; | |||||
2075 | stripe_local_t *local = NULL((void*)0); | |||||
2076 | ||||||
2077 | if (!this || !frame || !frame->local) { | |||||
2078 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2078, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2079 | goto out; | |||||
2080 | } | |||||
2081 | ||||||
2082 | local = frame->local; | |||||
2083 | ||||||
2084 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2085 | { | |||||
2086 | callcnt = --local->call_count; | |||||
2087 | } | |||||
2088 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2089 | ||||||
2090 | if (!callcnt) { | |||||
2091 | STRIPE_STACK_UNWIND (create, frame, local->op_ret, local->op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2093, 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, local->op_ret, local->op_errno, local->fd , local->inode, &local->stbuf, &local->preparent , &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
2092 | local->fd, local->inode, &local->stbuf,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2093, 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, local->op_ret, local->op_errno, local->fd , local->inode, &local->stbuf, &local->preparent , &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
2093 | &local->preparent, &local->postparent, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2093, 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, local->op_ret, local->op_errno, local->fd , local->inode, &local->stbuf, &local->preparent , &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
2094 | } | |||||
2095 | out: | |||||
2096 | return 0; | |||||
2097 | } | |||||
2098 | ||||||
2099 | ||||||
2100 | int32_t | |||||
2101 | stripe_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2102 | int32_t op_ret, int32_t op_errno, fd_t *fd, | |||||
2103 | inode_t *inode, struct iatt *buf, struct iatt *preparent, | |||||
2104 | struct iatt *postparent, dict_t *xdata) | |||||
2105 | { | |||||
2106 | int32_t callcnt = 0; | |||||
2107 | stripe_local_t *local = NULL((void*)0); | |||||
2108 | stripe_private_t *priv = NULL((void*)0); | |||||
2109 | call_frame_t *prev = NULL((void*)0); | |||||
2110 | xlator_list_t *trav = NULL((void*)0); | |||||
2111 | ||||||
2112 | if (!this || !frame || !frame->local || !cookie) { | |||||
2113 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2113, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2114 | goto out; | |||||
2115 | } | |||||
2116 | ||||||
2117 | prev = cookie; | |||||
2118 | priv = this->private; | |||||
2119 | local = frame->local; | |||||
2120 | ||||||
2121 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2122 | { | |||||
2123 | callcnt = --local->call_count; | |||||
2124 | ||||||
2125 | if (op_ret == -1) { | |||||
2126 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2128, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2127 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2128, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2128 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2128, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
2129 | local->failed = 1; | |||||
2130 | local->op_errno = op_errno; | |||||
2131 | } | |||||
2132 | ||||||
2133 | if (op_ret >= 0) { | |||||
2134 | if (IA_ISREG(buf->ia_type)(buf->ia_type == IA_IFREG)) { | |||||
2135 | if (stripe_ctx_handle(this, prev, local, xdata)) | |||||
2136 | gf_log(this->name, GF_LOG_ERROR,do { do { if (0) printf ("Error getting fctx info from " "dict" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 2138, GF_LOG_ERROR, "Error getting fctx info from " "dict") ; } while (0) | |||||
2137 | "Error getting fctx info from "do { do { if (0) printf ("Error getting fctx info from " "dict" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 2138, GF_LOG_ERROR, "Error getting fctx info from " "dict") ; } while (0) | |||||
2138 | "dict")do { do { if (0) printf ("Error getting fctx info from " "dict" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 2138, GF_LOG_ERROR, "Error getting fctx info from " "dict") ; } while (0); | |||||
2139 | } | |||||
2140 | ||||||
2141 | local->op_ret = op_ret; | |||||
2142 | ||||||
2143 | local->stbuf_blocks += buf->ia_blocks; | |||||
2144 | local->preparent_blocks += preparent->ia_blocks; | |||||
2145 | local->postparent_blocks += postparent->ia_blocks; | |||||
2146 | ||||||
2147 | correct_file_size(buf, local->fctx, prev); | |||||
2148 | ||||||
2149 | if (local->stbuf_size < buf->ia_size) | |||||
2150 | local->stbuf_size = buf->ia_size; | |||||
2151 | if (local->preparent_size < preparent->ia_size) | |||||
2152 | local->preparent_size = preparent->ia_size; | |||||
2153 | if (local->postparent_size < postparent->ia_size) | |||||
2154 | local->postparent_size = postparent->ia_size; | |||||
2155 | } | |||||
2156 | } | |||||
2157 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2158 | ||||||
2159 | if (!callcnt) { | |||||
2160 | if (local->failed) | |||||
2161 | local->op_ret = -1; | |||||
2162 | ||||||
2163 | if (local->op_ret == -1) { | |||||
2164 | local->call_count = priv->child_count; | |||||
2165 | trav = this->children; | |||||
2166 | while (trav) { | |||||
2167 | STACK_WIND (frame,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 2171, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_create_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_create_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2168 | stripe_create_fail_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", "stripe.c", __FUNCTION__, 2171, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_create_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_create_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2169 | trav->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", "stripe.c", __FUNCTION__, 2171, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_create_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_create_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2170 | trav->xlator->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", "stripe.c", __FUNCTION__, 2171, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_create_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_create_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2171 | &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", "stripe.c", __FUNCTION__, 2171, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->unlink_cbk) tmp_cbk = stripe_create_fail_unlink_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->unlink"; _new-> unwind_to = "stripe_create_fail_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 ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->unlink ); trav->xlator->fops->unlink (_new, trav->xlator , &local->loc, 0, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
2172 | trav = trav->next; | |||||
2173 | } | |||||
2174 | ||||||
2175 | return 0; | |||||
2176 | } | |||||
2177 | ||||||
2178 | if (local->op_ret >= 0) { | |||||
2179 | local->preparent.ia_blocks = local->preparent_blocks; | |||||
2180 | local->preparent.ia_size = local->preparent_size; | |||||
2181 | local->postparent.ia_blocks = local->postparent_blocks; | |||||
2182 | local->postparent.ia_size = local->postparent_size; | |||||
2183 | local->stbuf.ia_size = local->stbuf_size; | |||||
2184 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
2185 | ||||||
2186 | stripe_copy_xl_array(local->fctx->xl_array, | |||||
2187 | priv->xl_array, | |||||
2188 | local->fctx->stripe_count); | |||||
2189 | inode_ctx_put(local->inode, this, | |||||
2190 | (uint64_t) local->fctx); | |||||
2191 | } | |||||
2192 | ||||||
2193 | /* Create itself has failed.. so return | |||||
2194 | without setxattring */ | |||||
2195 | STRIPE_STACK_UNWIND (create, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2198, 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, local->op_ret, local->op_errno, local->fd , local->inode, &local->stbuf, &local->preparent , &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
2196 | local->op_errno, local->fd,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2198, 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, local->op_ret, local->op_errno, local->fd , local->inode, &local->stbuf, &local->preparent , &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
2197 | local->inode, &local->stbuf,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2198, 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, local->op_ret, local->op_errno, local->fd , local->inode, &local->stbuf, &local->preparent , &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
2198 | &local->preparent, &local->postparent, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2198, 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, local->op_ret, local->op_errno, local->fd , local->inode, &local->stbuf, &local->preparent , &local->postparent, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
2199 | } | |||||
2200 | ||||||
2201 | out: | |||||
2202 | return 0; | |||||
2203 | } | |||||
2204 | ||||||
2205 | ||||||
2206 | ||||||
2207 | int32_t | |||||
2208 | stripe_first_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2209 | int32_t op_ret, int32_t op_errno, fd_t *fd, | |||||
2210 | inode_t *inode, struct iatt *buf, struct iatt *preparent, | |||||
2211 | struct iatt *postparent, dict_t *xdata) | |||||
2212 | { | |||||
2213 | stripe_local_t *local = NULL((void*)0); | |||||
2214 | stripe_private_t *priv = NULL((void*)0); | |||||
2215 | call_frame_t *prev = NULL((void*)0); | |||||
2216 | xlator_list_t *trav = NULL((void*)0); | |||||
2217 | int i = 1; | |||||
2218 | dict_t *dict = NULL((void*)0); | |||||
2219 | loc_t *loc = NULL((void*)0); | |||||
2220 | int32_t need_unref = 0; | |||||
2221 | int32_t ret = -1; | |||||
2222 | ||||||
2223 | if (!this || !frame || !frame->local || !cookie) { | |||||
2224 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2224, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2225 | goto out; | |||||
2226 | } | |||||
2227 | ||||||
2228 | prev = cookie; | |||||
2229 | priv = this->private; | |||||
2230 | local = frame->local; | |||||
2231 | trav = this->children; | |||||
2232 | loc = &local->loc; | |||||
2233 | ||||||
2234 | --local->call_count; | |||||
2235 | ||||||
2236 | if (op_ret == -1) { | |||||
2237 | gf_log (this->name, GF_LOG_DEBUG, "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2238, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2238 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2238, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
2239 | local->failed = 1; | |||||
2240 | local->op_errno = op_errno; | |||||
2241 | } | |||||
2242 | ||||||
2243 | local->op_ret = 0; | |||||
2244 | /* Get the mapping in inode private */ | |||||
2245 | /* Get the stat buf right */ | |||||
2246 | local->stbuf = *buf; | |||||
2247 | local->preparent = *preparent; | |||||
2248 | local->postparent = *postparent; | |||||
2249 | ||||||
2250 | local->stbuf_blocks += buf->ia_blocks; | |||||
2251 | local->preparent_blocks += preparent->ia_blocks; | |||||
2252 | local->postparent_blocks += postparent->ia_blocks; | |||||
2253 | ||||||
2254 | if (local->stbuf_size < buf->ia_size) | |||||
2255 | local->stbuf_size = buf->ia_size; | |||||
2256 | if (local->preparent_size < preparent->ia_size) | |||||
2257 | local->preparent_size = preparent->ia_size; | |||||
2258 | if (local->postparent_size < postparent->ia_size) | |||||
2259 | local->postparent_size = postparent->ia_size; | |||||
2260 | ||||||
2261 | if (local->failed) | |||||
2262 | local->op_ret = -1; | |||||
2263 | ||||||
2264 | if (local->op_ret == -1) { | |||||
2265 | local->call_count = 1; | |||||
2266 | STACK_WIND (frame, stripe_create_fail_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", "stripe.c", __FUNCTION__, 2268, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->unlink_cbk) tmp_cbk = stripe_create_fail_unlink_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->unlink" ; _new->unwind_to = "stripe_create_fail_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->unlink); (this->children->xlator )->fops->unlink (_new, (this->children->xlator), & local->loc, 0, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2267 | FIRST_CHILD (this), FIRST_CHILD (this)->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", "stripe.c", __FUNCTION__, 2268, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->unlink_cbk) tmp_cbk = stripe_create_fail_unlink_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->unlink" ; _new->unwind_to = "stripe_create_fail_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->unlink); (this->children->xlator )->fops->unlink (_new, (this->children->xlator), & local->loc, 0, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2268 | &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", "stripe.c", __FUNCTION__, 2268, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->unlink_cbk) tmp_cbk = stripe_create_fail_unlink_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->unlink" ; _new->unwind_to = "stripe_create_fail_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->unlink); (this->children->xlator )->fops->unlink (_new, (this->children->xlator), & local->loc, 0, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2269 | return 0; | |||||
2270 | } | |||||
2271 | ||||||
2272 | if (local->op_ret >= 0) { | |||||
2273 | local->preparent.ia_blocks = local->preparent_blocks; | |||||
2274 | local->preparent.ia_size = local->preparent_size; | |||||
2275 | local->postparent.ia_blocks = local->postparent_blocks; | |||||
2276 | local->postparent.ia_size = local->postparent_size; | |||||
2277 | local->stbuf.ia_size = local->stbuf_size; | |||||
2278 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
2279 | } | |||||
2280 | ||||||
2281 | /* Send a setxattr request to nodes where the | |||||
2282 | files are created */ | |||||
2283 | trav = trav->next; | |||||
2284 | while (trav) { | |||||
2285 | if (priv->xattr_supported) { | |||||
2286 | dict = dict_new (); | |||||
2287 | if (!dict) { | |||||
2288 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to allocate dict %s", loc-> path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 2289, GF_LOG_ERROR, "failed to allocate dict %s", loc->path ); } while (0) | |||||
2289 | "failed to allocate dict %s", loc->path)do { do { if (0) printf ("failed to allocate dict %s", loc-> path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 2289, GF_LOG_ERROR, "failed to allocate dict %s", loc->path ); } while (0); | |||||
2290 | } | |||||
2291 | need_unref = 1; | |||||
2292 | ||||||
2293 | dict_copy (local->xattr, dict); | |||||
2294 | ||||||
2295 | ret = stripe_xattr_request_build (this, dict, | |||||
2296 | local->stripe_size, | |||||
2297 | priv->child_count, | |||||
2298 | i, priv->coalesce); | |||||
2299 | if (ret) | |||||
2300 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to build xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 2301, GF_LOG_ERROR, "failed to build xattr request"); } while (0) | |||||
2301 | "failed to build xattr request")do { do { if (0) printf ("failed to build xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 2301, GF_LOG_ERROR, "failed to build xattr request"); } while (0); | |||||
2302 | } else { | |||||
2303 | dict = local->xattr; | |||||
2304 | } | |||||
2305 | ||||||
2306 | STACK_WIND (frame, stripe_create_cbk, trav->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", "stripe.c", __FUNCTION__, 2309, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->create_cbk) tmp_cbk = stripe_create_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->create"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->create); trav->xlator->fops ->create (_new, trav->xlator, &local->loc, local ->flags, local->mode, local->umask, local->fd, dict ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2307 | trav->xlator->fops->create, &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", "stripe.c", __FUNCTION__, 2309, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->create_cbk) tmp_cbk = stripe_create_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->create"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->create); trav->xlator->fops ->create (_new, trav->xlator, &local->loc, local ->flags, local->mode, local->umask, local->fd, dict ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2308 | local->flags, local->mode, local->umask, local->fd,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 2309, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->create_cbk) tmp_cbk = stripe_create_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->create"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->create); trav->xlator->fops ->create (_new, trav->xlator, &local->loc, local ->flags, local->mode, local->umask, local->fd, dict ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2309 | 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", "stripe.c", __FUNCTION__, 2309, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->create_cbk) tmp_cbk = stripe_create_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->create"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->create); trav->xlator->fops ->create (_new, trav->xlator, &local->loc, local ->flags, local->mode, local->umask, local->fd, dict ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2310 | trav = trav->next; | |||||
2311 | if (need_unref && dict) | |||||
2312 | dict_unref (dict); | |||||
2313 | i++; | |||||
2314 | } | |||||
2315 | ||||||
2316 | out: | |||||
2317 | return 0; | |||||
2318 | } | |||||
2319 | ||||||
2320 | ||||||
2321 | ||||||
2322 | /** | |||||
2323 | * stripe_create - If a block-size is specified for the 'name', create the | |||||
2324 | * file in all the child nodes. If not, create it in only first child. | |||||
2325 | * | |||||
2326 | * @name- complete path of the file to be created. | |||||
2327 | */ | |||||
2328 | int32_t | |||||
2329 | stripe_create (call_frame_t *frame, xlator_t *this, loc_t *loc, | |||||
2330 | int32_t flags, mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata) | |||||
2331 | { | |||||
2332 | stripe_private_t *priv = NULL((void*)0); | |||||
2333 | stripe_local_t *local = NULL((void*)0); | |||||
2334 | int32_t op_errno = EINVAL22; | |||||
2335 | int ret = 0; | |||||
2336 | int need_unref = 0; | |||||
2337 | int i = 0; | |||||
2338 | dict_t *dict = NULL((void*)0); | |||||
2339 | ||||||
2340 | 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!)"), "stripe.c" , __FUNCTION__, 2340, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2341 | 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!)"), "stripe.c" , __FUNCTION__, 2341, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2342 | 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!)"), "stripe.c" , __FUNCTION__, 2342, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
2343 | 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!)" ), "stripe.c", __FUNCTION__, 2343, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
2344 | 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!)" ), "stripe.c", __FUNCTION__, 2344, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
2345 | ||||||
2346 | priv = this->private; | |||||
2347 | ||||||
2348 | /* files created in O_APPEND mode does not allow lseek() on fd */ | |||||
2349 | flags &= ~O_APPEND02000; | |||||
2350 | ||||||
2351 | if (priv->first_child_down || priv->nodes_down) { | |||||
2352 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("First node down, returning EIO"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 2353, GF_LOG_DEBUG, "First node down, returning EIO"); } while (0) | |||||
2353 | "First node down, returning EIO")do { do { if (0) printf ("First node down, returning EIO"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 2353, GF_LOG_DEBUG, "First node down, returning EIO"); } while (0); | |||||
2354 | op_errno = EIO5; | |||||
2355 | goto err; | |||||
2356 | } | |||||
2357 | ||||||
2358 | /* Initialization */ | |||||
2359 | local = mem_get0 (this->local_pool); | |||||
2360 | if (!local) { | |||||
2361 | op_errno = ENOMEM12; | |||||
2362 | goto err; | |||||
2363 | } | |||||
2364 | local->op_ret = -1; | |||||
2365 | local->op_errno = ENOTCONN107; | |||||
2366 | local->stripe_size = stripe_get_matching_bs (loc->path, priv); | |||||
2367 | frame->local = local; | |||||
2368 | local->inode = inode_ref (loc->inode); | |||||
2369 | loc_copy (&local->loc, loc); | |||||
2370 | local->fd = fd_ref (fd); | |||||
2371 | local->flags = flags; | |||||
2372 | local->mode = mode; | |||||
2373 | local->umask = umask; | |||||
2374 | if (xdata) | |||||
2375 | local->xattr = dict_ref (xdata); | |||||
2376 | ||||||
2377 | local->call_count = priv->child_count; | |||||
2378 | /* Send a setxattr request to nodes where the | |||||
2379 | files are created */ | |||||
2380 | ||||||
2381 | if (priv->xattr_supported) { | |||||
2382 | dict = dict_new (); | |||||
2383 | if (!dict) { | |||||
2384 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to allocate dict %s", loc-> path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 2385, GF_LOG_ERROR, "failed to allocate dict %s", loc->path ); } while (0) | |||||
2385 | "failed to allocate dict %s", loc->path)do { do { if (0) printf ("failed to allocate dict %s", loc-> path); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 2385, GF_LOG_ERROR, "failed to allocate dict %s", loc->path ); } while (0); | |||||
2386 | } | |||||
2387 | need_unref = 1; | |||||
2388 | ||||||
2389 | dict_copy (xdata, dict); | |||||
2390 | ||||||
2391 | ret = stripe_xattr_request_build (this, dict, | |||||
2392 | local->stripe_size, | |||||
2393 | priv->child_count, | |||||
2394 | i, priv->coalesce); | |||||
2395 | if (ret) | |||||
2396 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to build xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 2397, GF_LOG_ERROR, "failed to build xattr request"); } while (0) | |||||
2397 | "failed to build xattr request")do { do { if (0) printf ("failed to build xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 2397, GF_LOG_ERROR, "failed to build xattr request"); } while (0); | |||||
2398 | } else { | |||||
2399 | dict = xdata; | |||||
2400 | } | |||||
2401 | ||||||
2402 | ||||||
2403 | STACK_WIND (frame, stripe_first_create_cbk, FIRST_CHILD (this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 2405, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->create_cbk) tmp_cbk = stripe_first_create_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->create" ; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->create); (this->children->xlator )->fops->create (_new, (this->children->xlator), loc , flags, mode, umask, fd, dict); (*__glusterfs_this_location( )) = old_THIS; } while (0) | |||||
2404 | FIRST_CHILD (this)->fops->create, loc, flags, 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", "stripe.c", __FUNCTION__, 2405, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->create_cbk) tmp_cbk = stripe_first_create_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->create" ; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->create); (this->children->xlator )->fops->create (_new, (this->children->xlator), loc , flags, mode, umask, fd, dict); (*__glusterfs_this_location( )) = old_THIS; } while (0) | |||||
2405 | umask, fd, 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", "stripe.c", __FUNCTION__, 2405, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->create_cbk) tmp_cbk = stripe_first_create_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD (this)->fops->create" ; _new->unwind_to = "stripe_first_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->create); (this->children->xlator )->fops->create (_new, (this->children->xlator), loc , flags, mode, umask, fd, dict); (*__glusterfs_this_location( )) = old_THIS; } while (0); | |||||
2406 | ||||||
2407 | if (need_unref && dict) | |||||
2408 | dict_unref (dict); | |||||
2409 | ||||||
2410 | ||||||
2411 | return 0; | |||||
2412 | err: | |||||
2413 | STRIPE_STACK_UNWIND (create, frame, -1, op_errno, NULL, NULL, NULL,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2414, 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), xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local ); mem_put (__local); } } while (0) | |||||
2414 | NULL, NULL, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2414, 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), xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local ); mem_put (__local); } } while (0); | |||||
2415 | return 0; | |||||
2416 | } | |||||
2417 | ||||||
2418 | int32_t | |||||
2419 | stripe_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2420 | int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata) | |||||
2421 | { | |||||
2422 | int32_t callcnt = 0; | |||||
2423 | stripe_local_t *local = NULL((void*)0); | |||||
2424 | call_frame_t *prev = NULL((void*)0); | |||||
2425 | ||||||
2426 | if (!this || !frame || !frame->local || !cookie) { | |||||
2427 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2427, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2428 | goto out; | |||||
2429 | } | |||||
2430 | ||||||
2431 | prev = cookie; | |||||
2432 | local = frame->local; | |||||
2433 | ||||||
2434 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2435 | { | |||||
2436 | callcnt = --local->call_count; | |||||
2437 | ||||||
2438 | if (op_ret == -1) { | |||||
2439 | ||||||
2440 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2442, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2441 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2442, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2442 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2442, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
2443 | if ((op_errno != ENOENT2) || | |||||
2444 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
2445 | local->failed = 1; | |||||
2446 | local->op_errno = op_errno; | |||||
2447 | } | |||||
2448 | ||||||
2449 | if (op_ret >= 0) | |||||
2450 | local->op_ret = op_ret; | |||||
2451 | } | |||||
2452 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2453 | ||||||
2454 | if (!callcnt) { | |||||
2455 | if (local->failed) | |||||
2456 | local->op_ret = -1; | |||||
2457 | ||||||
2458 | STRIPE_STACK_UNWIND (open, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2459, 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 , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0) | |||||
2459 | local->op_errno, local->fd, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2459, 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 , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0); | |||||
2460 | } | |||||
2461 | out: | |||||
2462 | return 0; | |||||
2463 | } | |||||
2464 | ||||||
2465 | ||||||
2466 | /** | |||||
2467 | * stripe_open - | |||||
2468 | */ | |||||
2469 | int32_t | |||||
2470 | stripe_open (call_frame_t *frame, xlator_t *this, loc_t *loc, | |||||
2471 | int32_t flags, fd_t *fd, dict_t *xdata) | |||||
2472 | { | |||||
2473 | stripe_local_t *local = NULL((void*)0); | |||||
2474 | stripe_private_t *priv = NULL((void*)0); | |||||
2475 | xlator_list_t *trav = NULL((void*)0); | |||||
2476 | int32_t op_errno = 1; | |||||
2477 | ||||||
2478 | 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!)"), "stripe.c" , __FUNCTION__, 2478, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2479 | 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!)"), "stripe.c" , __FUNCTION__, 2479, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2480 | 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!)"), "stripe.c" , __FUNCTION__, 2480, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
2481 | 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!)" ), "stripe.c", __FUNCTION__, 2481, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
2482 | 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!)" ), "stripe.c", __FUNCTION__, 2482, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
2483 | ||||||
2484 | priv = this->private; | |||||
2485 | trav = this->children; | |||||
2486 | ||||||
2487 | if (priv->first_child_down) { | |||||
2488 | op_errno = ENOTCONN107; | |||||
2489 | goto err; | |||||
2490 | } | |||||
2491 | ||||||
2492 | /* Initialization */ | |||||
2493 | local = mem_get0 (this->local_pool); | |||||
2494 | if (!local) { | |||||
2495 | op_errno = ENOMEM12; | |||||
2496 | goto err; | |||||
2497 | } | |||||
2498 | ||||||
2499 | /* files opened in O_APPEND mode does not allow lseek() on fd */ | |||||
2500 | flags &= ~O_APPEND02000; | |||||
2501 | ||||||
2502 | local->fd = fd_ref (fd); | |||||
2503 | frame->local = local; | |||||
2504 | loc_copy (&local->loc, loc); | |||||
2505 | ||||||
2506 | /* Striped files */ | |||||
2507 | local->flags = flags; | |||||
2508 | local->call_count = priv->child_count; | |||||
2509 | local->stripe_size = stripe_get_matching_bs (loc->path, priv); | |||||
2510 | ||||||
2511 | while (trav) { | |||||
2512 | STACK_WIND (frame, stripe_open_cbk, trav->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", "stripe.c", __FUNCTION__, 2515, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->open_cbk) tmp_cbk = stripe_open_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->open"; _new->unwind_to = "stripe_open_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->open); trav->xlator->fops ->open (_new, trav->xlator, &local->loc, local-> flags, local->fd, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2513 | trav->xlator->fops->open,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 2515, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->open_cbk) tmp_cbk = stripe_open_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->open"; _new->unwind_to = "stripe_open_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->open); trav->xlator->fops ->open (_new, trav->xlator, &local->loc, local-> flags, local->fd, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2514 | &local->loc, local->flags, local->fd,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 2515, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->open_cbk) tmp_cbk = stripe_open_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->open"; _new->unwind_to = "stripe_open_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->open); trav->xlator->fops ->open (_new, trav->xlator, &local->loc, local-> flags, local->fd, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2515 | 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", "stripe.c", __FUNCTION__, 2515, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->open_cbk) tmp_cbk = stripe_open_cbk; _new->root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->open"; _new->unwind_to = "stripe_open_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->open); trav->xlator->fops ->open (_new, trav->xlator, &local->loc, local-> flags, local->fd, xdata); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2516 | trav = trav->next; | |||||
2517 | } | |||||
2518 | return 0; | |||||
2519 | err: | |||||
2520 | STRIPE_STACK_UNWIND (open, frame, -1, op_errno, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2520, 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, -1, op_errno, ((void*)0), ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
2521 | return 0; | |||||
2522 | } | |||||
2523 | ||||||
2524 | ||||||
2525 | int32_t | |||||
2526 | stripe_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2527 | int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata) | |||||
2528 | { | |||||
2529 | int32_t callcnt = 0; | |||||
2530 | stripe_local_t *local = NULL((void*)0); | |||||
2531 | call_frame_t *prev = NULL((void*)0); | |||||
2532 | ||||||
2533 | if (!this || !frame || !frame->local || !cookie) { | |||||
2534 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2534, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2535 | goto out; | |||||
2536 | } | |||||
2537 | ||||||
2538 | prev = cookie; | |||||
2539 | local = frame->local; | |||||
2540 | ||||||
2541 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2542 | { | |||||
2543 | callcnt = --local->call_count; | |||||
2544 | ||||||
2545 | if (op_ret == -1) { | |||||
2546 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2548, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2547 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2548, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2548 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2548, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
2549 | local->op_ret = -1; | |||||
2550 | local->op_errno = op_errno; | |||||
2551 | } | |||||
2552 | ||||||
2553 | if (op_ret >= 0) | |||||
2554 | local->op_ret = op_ret; | |||||
2555 | } | |||||
2556 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2557 | ||||||
2558 | if (!callcnt) { | |||||
2559 | STRIPE_STACK_UNWIND (opendir, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2560, 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, local->op_ret, local->op_errno, local->fd , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0) | |||||
2560 | local->op_errno, local->fd, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2560, 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, local->op_ret, local->op_errno, local->fd , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0); | |||||
2561 | } | |||||
2562 | out: | |||||
2563 | return 0; | |||||
2564 | } | |||||
2565 | ||||||
2566 | ||||||
2567 | int32_t | |||||
2568 | stripe_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd, dict_t *xdata) | |||||
2569 | { | |||||
2570 | xlator_list_t *trav = NULL((void*)0); | |||||
2571 | stripe_local_t *local = NULL((void*)0); | |||||
2572 | stripe_private_t *priv = NULL((void*)0); | |||||
2573 | int32_t op_errno = EINVAL22; | |||||
2574 | ||||||
2575 | 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!)"), "stripe.c" , __FUNCTION__, 2575, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2576 | 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!)"), "stripe.c" , __FUNCTION__, 2576, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2577 | 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!)"), "stripe.c" , __FUNCTION__, 2577, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
2578 | 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!)" ), "stripe.c", __FUNCTION__, 2578, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
2579 | 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!)" ), "stripe.c", __FUNCTION__, 2579, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
2580 | ||||||
2581 | priv = this->private; | |||||
2582 | trav = this->children; | |||||
2583 | ||||||
2584 | if (priv->first_child_down) { | |||||
2585 | op_errno = ENOTCONN107; | |||||
2586 | goto err; | |||||
2587 | } | |||||
2588 | ||||||
2589 | /* Initialization */ | |||||
2590 | local = mem_get0 (this->local_pool); | |||||
2591 | if (!local) { | |||||
2592 | op_errno = ENOMEM12; | |||||
2593 | goto err; | |||||
2594 | } | |||||
2595 | frame->local = local; | |||||
2596 | local->call_count = priv->child_count; | |||||
2597 | local->fd = fd_ref (fd); | |||||
2598 | ||||||
2599 | while (trav) { | |||||
2600 | STACK_WIND (frame, stripe_opendir_cbk, trav->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", "stripe.c", __FUNCTION__, 2601, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->opendir_cbk) tmp_cbk = stripe_opendir_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->opendir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->opendir); trav->xlator-> fops->opendir (_new, trav->xlator, loc, fd, ((void*)0)) ; (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
2601 | trav->xlator->fops->opendir, loc, 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", "stripe.c", __FUNCTION__, 2601, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->opendir_cbk) tmp_cbk = stripe_opendir_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->opendir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->opendir); trav->xlator-> fops->opendir (_new, trav->xlator, loc, fd, ((void*)0)) ; (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
2602 | trav = trav->next; | |||||
2603 | } | |||||
2604 | ||||||
2605 | return 0; | |||||
2606 | err: | |||||
2607 | STRIPE_STACK_UNWIND (opendir, frame, -1, op_errno, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 2607, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
2608 | return 0; | |||||
2609 | } | |||||
2610 | ||||||
2611 | int32_t | |||||
2612 | stripe_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2613 | int32_t op_ret, int32_t op_errno, struct gf_flock *lock, dict_t *xdata) | |||||
2614 | { | |||||
2615 | int32_t callcnt = 0; | |||||
2616 | stripe_local_t *local = NULL((void*)0); | |||||
2617 | call_frame_t *prev = NULL((void*)0); | |||||
2618 | ||||||
2619 | if (!this || !frame || !frame->local || !cookie) { | |||||
2620 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2620, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2621 | goto out; | |||||
2622 | } | |||||
2623 | ||||||
2624 | prev = cookie; | |||||
2625 | local = frame->local; | |||||
2626 | ||||||
2627 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2628 | { | |||||
2629 | callcnt = --local->call_count; | |||||
2630 | if (op_ret == -1) { | |||||
2631 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2633, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2632 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2633, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2633 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2633, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
2634 | local->op_errno = op_errno; | |||||
2635 | if ((op_errno != ENOENT2) || | |||||
2636 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
2637 | local->failed = 1; | |||||
2638 | } | |||||
2639 | if (op_ret >= 0) { | |||||
2640 | if (FIRST_CHILD(this)(this->children->xlator) == prev->this) { | |||||
2641 | /* First successful call, copy the *lock */ | |||||
2642 | local->op_ret = op_ret; | |||||
2643 | local->lock = *lock; | |||||
2644 | } | |||||
2645 | } | |||||
2646 | } | |||||
2647 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2648 | ||||||
2649 | if (!callcnt) { | |||||
2650 | if (local->failed) | |||||
2651 | local->op_ret = -1; | |||||
2652 | STRIPE_STACK_UNWIND (lk, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_lk_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", "stripe.c", __FUNCTION__ , 2653, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lk_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-> lock, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
2653 | local->op_errno, &local->lock, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_lk_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", "stripe.c", __FUNCTION__ , 2653, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lk_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-> lock, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
2654 | } | |||||
2655 | out: | |||||
2656 | return 0; | |||||
2657 | } | |||||
2658 | ||||||
2659 | int32_t | |||||
2660 | stripe_lk (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd, | |||||
2661 | struct gf_flock *lock, dict_t *xdata) | |||||
2662 | { | |||||
2663 | stripe_local_t *local = NULL((void*)0); | |||||
2664 | xlator_list_t *trav = NULL((void*)0); | |||||
2665 | stripe_private_t *priv = NULL((void*)0); | |||||
2666 | int32_t op_errno = EINVAL22; | |||||
2667 | ||||||
2668 | 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!)"), "stripe.c" , __FUNCTION__, 2668, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2669 | 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!)"), "stripe.c" , __FUNCTION__, 2669, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2670 | 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!)"), "stripe.c" , __FUNCTION__, 2670, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
2671 | 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!)" ), "stripe.c", __FUNCTION__, 2671, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
2672 | ||||||
2673 | trav = this->children; | |||||
2674 | priv = this->private; | |||||
2675 | ||||||
2676 | /* Initialization */ | |||||
2677 | local = mem_get0 (this->local_pool); | |||||
2678 | if (!local) { | |||||
2679 | op_errno = ENOMEM12; | |||||
2680 | goto err; | |||||
2681 | } | |||||
2682 | local->op_ret = -1; | |||||
2683 | frame->local = local; | |||||
2684 | local->call_count = priv->child_count; | |||||
2685 | ||||||
2686 | while (trav) { | |||||
2687 | STACK_WIND (frame, stripe_lk_cbk, trav->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", "stripe.c", __FUNCTION__, 2688, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->lk_cbk) tmp_cbk = stripe_lk_cbk; _new->root = frame->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->lk"; _new->unwind_to = "stripe_lk_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->lk); trav->xlator->fops-> lk (_new, trav->xlator, fd, cmd, lock, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2688 | trav->xlator->fops->lk, fd, cmd, lock, 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", "stripe.c", __FUNCTION__, 2688, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->lk_cbk) tmp_cbk = stripe_lk_cbk; _new->root = frame->root; _new->this = trav->xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->lk"; _new->unwind_to = "stripe_lk_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->lk); trav->xlator->fops-> lk (_new, trav->xlator, fd, cmd, lock, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
2689 | trav = trav->next; | |||||
2690 | } | |||||
2691 | ||||||
2692 | return 0; | |||||
2693 | err: | |||||
2694 | STRIPE_STACK_UNWIND (lk, frame, -1, op_errno, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_lk_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", "stripe.c", __FUNCTION__ , 2694, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_lk_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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
2695 | return 0; | |||||
2696 | } | |||||
2697 | ||||||
2698 | ||||||
2699 | int32_t | |||||
2700 | stripe_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2701 | int32_t op_ret, int32_t op_errno, dict_t *xdata) | |||||
2702 | { | |||||
2703 | int32_t callcnt = 0; | |||||
2704 | stripe_local_t *local = NULL((void*)0); | |||||
2705 | call_frame_t *prev = NULL((void*)0); | |||||
2706 | ||||||
2707 | if (!this || !frame || !frame->local || !cookie) { | |||||
2708 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2708, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2709 | goto out; | |||||
2710 | } | |||||
2711 | ||||||
2712 | prev = cookie; | |||||
2713 | local = frame->local; | |||||
2714 | ||||||
2715 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2716 | { | |||||
2717 | callcnt = --local->call_count; | |||||
2718 | ||||||
2719 | if (op_ret == -1) { | |||||
2720 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 2722, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2721 | "%s returned %s",do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 2722, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2722 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 2722, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
2723 | local->op_errno = op_errno; | |||||
2724 | if ((op_errno != ENOENT2) || | |||||
2725 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
2726 | local->failed = 1; | |||||
2727 | } | |||||
2728 | if (op_ret >= 0) | |||||
2729 | local->op_ret = op_ret; | |||||
2730 | } | |||||
2731 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2732 | ||||||
2733 | if (!callcnt) { | |||||
2734 | if (local->failed) | |||||
2735 | local->op_ret = -1; | |||||
2736 | ||||||
2737 | STRIPE_STACK_UNWIND (flush, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_flush_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", "stripe.c", __FUNCTION__ , 2738, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_flush_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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
2738 | local->op_errno, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_flush_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", "stripe.c", __FUNCTION__ , 2738, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_flush_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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
2739 | } | |||||
2740 | out: | |||||
2741 | return 0; | |||||
2742 | } | |||||
2743 | ||||||
2744 | int32_t | |||||
2745 | stripe_flush (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) | |||||
2746 | { | |||||
2747 | stripe_local_t *local = NULL((void*)0); | |||||
2748 | stripe_private_t *priv = NULL((void*)0); | |||||
2749 | xlator_list_t *trav = NULL((void*)0); | |||||
2750 | int32_t op_errno = 1; | |||||
2751 | ||||||
2752 | 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!)"), "stripe.c" , __FUNCTION__, 2752, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2753 | 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!)"), "stripe.c" , __FUNCTION__, 2753, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2754 | 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!)"), "stripe.c" , __FUNCTION__, 2754, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
2755 | 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!)" ), "stripe.c", __FUNCTION__, 2755, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
2756 | ||||||
2757 | priv = this->private; | |||||
2758 | trav = this->children; | |||||
2759 | ||||||
2760 | if (priv->first_child_down) { | |||||
2761 | op_errno = ENOTCONN107; | |||||
2762 | goto err; | |||||
2763 | } | |||||
2764 | /* Initialization */ | |||||
2765 | local = mem_get0 (this->local_pool); | |||||
2766 | if (!local) { | |||||
2767 | op_errno = ENOMEM12; | |||||
2768 | goto err; | |||||
2769 | } | |||||
2770 | local->op_ret = -1; | |||||
2771 | frame->local = local; | |||||
2772 | local->call_count = priv->child_count; | |||||
2773 | ||||||
2774 | while (trav) { | |||||
2775 | STACK_WIND (frame, stripe_flush_cbk, trav->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", "stripe.c", __FUNCTION__, 2776, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->flush_cbk) tmp_cbk = stripe_flush_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->flush"; _new->unwind_to = "stripe_flush_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->flush); trav->xlator->fops ->flush (_new, trav->xlator, fd, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
2776 | trav->xlator->fops->flush, 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", "stripe.c", __FUNCTION__, 2776, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->flush_cbk) tmp_cbk = stripe_flush_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->flush"; _new->unwind_to = "stripe_flush_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->flush); trav->xlator->fops ->flush (_new, trav->xlator, fd, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
2777 | trav = trav->next; | |||||
2778 | } | |||||
2779 | ||||||
2780 | return 0; | |||||
2781 | err: | |||||
2782 | STRIPE_STACK_UNWIND (flush, frame, -1, op_errno, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_flush_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", "stripe.c", __FUNCTION__ , 2782, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_flush_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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
2783 | return 0; | |||||
2784 | } | |||||
2785 | ||||||
2786 | ||||||
2787 | ||||||
2788 | int32_t | |||||
2789 | stripe_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2790 | int32_t op_ret, int32_t op_errno, struct iatt *prebuf, | |||||
2791 | struct iatt *postbuf, dict_t *xdata) | |||||
2792 | { | |||||
2793 | int32_t callcnt = 0; | |||||
2794 | stripe_local_t *local = NULL((void*)0); | |||||
2795 | call_frame_t *prev = NULL((void*)0); | |||||
2796 | ||||||
2797 | if (!this || !frame || !frame->local || !cookie) { | |||||
2798 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2798, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2799 | goto out; | |||||
2800 | } | |||||
2801 | ||||||
2802 | prev = cookie; | |||||
2803 | local = frame->local; | |||||
2804 | ||||||
2805 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2806 | { | |||||
2807 | callcnt = --local->call_count; | |||||
2808 | ||||||
2809 | if (op_ret == -1) { | |||||
2810 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 2812, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2811 | "%s returned %s",do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 2812, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2812 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 2812, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
2813 | local->op_errno = op_errno; | |||||
2814 | if ((op_errno != ENOENT2) || | |||||
2815 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
2816 | local->failed = 1; | |||||
2817 | } | |||||
2818 | if (op_ret >= 0) { | |||||
2819 | local->op_ret = op_ret; | |||||
2820 | if (FIRST_CHILD(this)(this->children->xlator) == prev->this) { | |||||
2821 | local->pre_buf = *prebuf; | |||||
2822 | local->post_buf = *postbuf; | |||||
2823 | } | |||||
2824 | local->prebuf_blocks += prebuf->ia_blocks; | |||||
2825 | local->postbuf_blocks += postbuf->ia_blocks; | |||||
2826 | ||||||
2827 | correct_file_size(prebuf, local->fctx, prev); | |||||
2828 | correct_file_size(postbuf, local->fctx, prev); | |||||
2829 | ||||||
2830 | if (local->prebuf_size < prebuf->ia_size) | |||||
2831 | local->prebuf_size = prebuf->ia_size; | |||||
2832 | ||||||
2833 | if (local->postbuf_size < postbuf->ia_size) | |||||
2834 | local->postbuf_size = postbuf->ia_size; | |||||
2835 | } | |||||
2836 | } | |||||
2837 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2838 | ||||||
2839 | if (!callcnt) { | |||||
2840 | if (local->failed) | |||||
2841 | local->op_ret = -1; | |||||
2842 | ||||||
2843 | if (local->op_ret != -1) { | |||||
2844 | local->pre_buf.ia_blocks = local->prebuf_blocks; | |||||
2845 | local->pre_buf.ia_size = local->prebuf_size; | |||||
2846 | local->post_buf.ia_blocks = local->postbuf_blocks; | |||||
2847 | local->post_buf.ia_size = local->postbuf_size; | |||||
2848 | } | |||||
2849 | ||||||
2850 | STRIPE_STACK_UNWIND (fsync, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_fsync_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", "stripe.c", __FUNCTION__ , 2852, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsync_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
2851 | local->op_errno, &local->pre_buf,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_fsync_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", "stripe.c", __FUNCTION__ , 2852, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsync_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
2852 | &local->post_buf, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_fsync_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", "stripe.c", __FUNCTION__ , 2852, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsync_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-> pre_buf, &local->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
2853 | } | |||||
2854 | out: | |||||
2855 | return 0; | |||||
2856 | } | |||||
2857 | ||||||
2858 | int32_t | |||||
2859 | stripe_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags, dict_t *xdata) | |||||
2860 | { | |||||
2861 | stripe_local_t *local = NULL((void*)0); | |||||
2862 | stripe_private_t *priv = NULL((void*)0); | |||||
2863 | xlator_list_t *trav = NULL((void*)0); | |||||
2864 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
2865 | int32_t op_errno = 1; | |||||
2866 | ||||||
2867 | 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!)"), "stripe.c" , __FUNCTION__, 2867, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2868 | 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!)"), "stripe.c" , __FUNCTION__, 2868, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2869 | 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!)"), "stripe.c" , __FUNCTION__, 2869, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
2870 | 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!)" ), "stripe.c", __FUNCTION__, 2870, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
2871 | ||||||
2872 | priv = this->private; | |||||
2873 | trav = this->children; | |||||
2874 | ||||||
2875 | /* Initialization */ | |||||
2876 | local = mem_get0 (this->local_pool); | |||||
2877 | if (!local) { | |||||
2878 | op_errno = ENOMEM12; | |||||
2879 | goto err; | |||||
2880 | } | |||||
2881 | ||||||
2882 | inode_ctx_get(fd->inode, this, (uint64_t *) &fctx)inode_ctx_get2(fd->inode,this,(uint64_t *) &fctx,0); | |||||
2883 | if (!fctx) { | |||||
2884 | op_errno = EINVAL22; | |||||
2885 | goto err; | |||||
2886 | } | |||||
2887 | local->fctx = fctx; | |||||
2888 | ||||||
2889 | local->op_ret = -1; | |||||
2890 | frame->local = local; | |||||
2891 | local->call_count = priv->child_count; | |||||
2892 | ||||||
2893 | while (trav) { | |||||
2894 | STACK_WIND (frame, stripe_fsync_cbk, trav->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", "stripe.c", __FUNCTION__, 2895, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsync_cbk) tmp_cbk = stripe_fsync_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->fsync"; _new->unwind_to = "stripe_fsync_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->fsync); trav->xlator->fops ->fsync (_new, trav->xlator, fd, flags, ((void*)0)); (* __glusterfs_this_location()) = old_THIS; } while (0) | |||||
2895 | trav->xlator->fops->fsync, fd, 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", "stripe.c", __FUNCTION__, 2895, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsync_cbk) tmp_cbk = stripe_fsync_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->fsync"; _new->unwind_to = "stripe_fsync_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->fsync); trav->xlator->fops ->fsync (_new, trav->xlator, fd, flags, ((void*)0)); (* __glusterfs_this_location()) = old_THIS; } while (0); | |||||
2896 | trav = trav->next; | |||||
2897 | } | |||||
2898 | ||||||
2899 | return 0; | |||||
2900 | err: | |||||
2901 | STRIPE_STACK_UNWIND (fsync, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_fsync_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", "stripe.c", __FUNCTION__ , 2901, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fsync_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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
2902 | return 0; | |||||
2903 | } | |||||
2904 | ||||||
2905 | int32_t | |||||
2906 | stripe_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
2907 | int32_t op_ret, int32_t op_errno, struct iatt *buf, dict_t *xdata) | |||||
2908 | { | |||||
2909 | int32_t callcnt = 0; | |||||
2910 | stripe_local_t *local = NULL((void*)0); | |||||
2911 | call_frame_t *prev = NULL((void*)0); | |||||
2912 | ||||||
2913 | if (!this || !frame || !frame->local || !cookie) { | |||||
2914 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 2914, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
2915 | goto out; | |||||
2916 | } | |||||
2917 | ||||||
2918 | prev = cookie; | |||||
2919 | local = frame->local; | |||||
2920 | ||||||
2921 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
2922 | { | |||||
2923 | callcnt = --local->call_count; | |||||
2924 | ||||||
2925 | if (op_ret == -1) { | |||||
2926 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2928, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2927 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2928, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
2928 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 2928, GF_LOG_DEBUG, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
2929 | local->op_errno = op_errno; | |||||
2930 | if ((op_errno != ENOENT2) || | |||||
2931 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
2932 | local->failed = 1; | |||||
2933 | } | |||||
2934 | ||||||
2935 | if (op_ret == 0) { | |||||
2936 | local->op_ret = 0; | |||||
2937 | ||||||
2938 | if (FIRST_CHILD(this)(this->children->xlator) == prev->this) | |||||
2939 | local->stbuf = *buf; | |||||
2940 | ||||||
2941 | local->stbuf_blocks += buf->ia_blocks; | |||||
2942 | ||||||
2943 | correct_file_size(buf, local->fctx, prev); | |||||
2944 | ||||||
2945 | if (local->stbuf_size < buf->ia_size) | |||||
2946 | local->stbuf_size = buf->ia_size; | |||||
2947 | } | |||||
2948 | } | |||||
2949 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
2950 | ||||||
2951 | if (!callcnt) { | |||||
2952 | if (local->failed) | |||||
2953 | local->op_ret = -1; | |||||
2954 | ||||||
2955 | if (local->op_ret != -1) { | |||||
2956 | local->stbuf.ia_size = local->stbuf_size; | |||||
2957 | local->stbuf.ia_blocks = local->stbuf_blocks; | |||||
2958 | } | |||||
2959 | ||||||
2960 | STRIPE_STACK_UNWIND (fstat, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_fstat_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", "stripe.c", __FUNCTION__ , 2961, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fstat_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-> stbuf, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
2961 | local->op_errno, &local->stbuf, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_fstat_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", "stripe.c", __FUNCTION__ , 2961, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fstat_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-> stbuf, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
2962 | } | |||||
2963 | ||||||
2964 | out: | |||||
2965 | return 0; | |||||
2966 | } | |||||
2967 | ||||||
2968 | int32_t | |||||
2969 | stripe_fstat (call_frame_t *frame, | |||||
2970 | xlator_t *this, | |||||
2971 | fd_t *fd, dict_t *xdata) | |||||
2972 | { | |||||
2973 | stripe_local_t *local = NULL((void*)0); | |||||
2974 | stripe_private_t *priv = NULL((void*)0); | |||||
2975 | xlator_list_t *trav = NULL((void*)0); | |||||
2976 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
2977 | int32_t op_errno = 1; | |||||
2978 | ||||||
2979 | 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!)"), "stripe.c" , __FUNCTION__, 2979, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
2980 | 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!)"), "stripe.c" , __FUNCTION__, 2980, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
2981 | 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!)"), "stripe.c" , __FUNCTION__, 2981, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
2982 | 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!)" ), "stripe.c", __FUNCTION__, 2982, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
2983 | ||||||
2984 | priv = this->private; | |||||
2985 | trav = this->children; | |||||
2986 | ||||||
2987 | /* Initialization */ | |||||
2988 | local = mem_get0 (this->local_pool); | |||||
2989 | if (!local) { | |||||
2990 | op_errno = ENOMEM12; | |||||
2991 | goto err; | |||||
2992 | } | |||||
2993 | local->op_ret = -1; | |||||
2994 | frame->local = local; | |||||
2995 | local->call_count = priv->child_count; | |||||
2996 | ||||||
2997 | if (IA_ISREG(fd->inode->ia_type)(fd->inode->ia_type == IA_IFREG)) { | |||||
2998 | inode_ctx_get(fd->inode, this, (uint64_t *) &fctx)inode_ctx_get2(fd->inode,this,(uint64_t *) &fctx,0); | |||||
2999 | if (!fctx) | |||||
3000 | goto err; | |||||
3001 | local->fctx = fctx; | |||||
3002 | } | |||||
3003 | ||||||
3004 | while (trav) { | |||||
3005 | STACK_WIND (frame, stripe_fstat_cbk, trav->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", "stripe.c", __FUNCTION__, 3006, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fstat_cbk) tmp_cbk = stripe_fstat_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->fstat"; _new->unwind_to = "stripe_fstat_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->fstat); trav->xlator->fops ->fstat (_new, trav->xlator, fd, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3006 | trav->xlator->fops->fstat, 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", "stripe.c", __FUNCTION__, 3006, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fstat_cbk) tmp_cbk = stripe_fstat_cbk; _new-> root = frame->root; _new->this = trav->xlator; _new-> ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->fstat"; _new->unwind_to = "stripe_fstat_cbk" ; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame ->root->frames.next; _new->prev = &frame->root ->frames; if (frame->root->frames.next) frame->root ->frames.next->prev = _new; frame->root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame ->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->fstat); trav->xlator->fops ->fstat (_new, trav->xlator, fd, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3007 | trav = trav->next; | |||||
3008 | } | |||||
3009 | ||||||
3010 | return 0; | |||||
3011 | err: | |||||
3012 | STRIPE_STACK_UNWIND (fstat, frame, -1, op_errno, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_fstat_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", "stripe.c", __FUNCTION__ , 3012, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_fstat_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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
3013 | return 0; | |||||
3014 | } | |||||
3015 | ||||||
3016 | ||||||
3017 | int32_t | |||||
3018 | stripe_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, dict_t *xdata) | |||||
3019 | { | |||||
3020 | stripe_local_t *local = NULL((void*)0); | |||||
3021 | stripe_private_t *priv = NULL((void*)0); | |||||
3022 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
3023 | int i, eof_idx; | |||||
3024 | off_t dest_offset, tmp_offset; | |||||
3025 | int32_t op_errno = 1; | |||||
3026 | ||||||
3027 | 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!)"), "stripe.c" , __FUNCTION__, 3027, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3028 | 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!)"), "stripe.c" , __FUNCTION__, 3028, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3029 | 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!)"), "stripe.c" , __FUNCTION__, 3029, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
3030 | 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!)" ), "stripe.c", __FUNCTION__, 3030, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
3031 | ||||||
3032 | priv = this->private; | |||||
3033 | ||||||
3034 | /* Initialization */ | |||||
3035 | local = mem_get0 (this->local_pool); | |||||
3036 | if (!local) { | |||||
3037 | op_errno = ENOMEM12; | |||||
3038 | goto err; | |||||
3039 | } | |||||
3040 | local->op_ret = -1; | |||||
3041 | frame->local = local; | |||||
3042 | local->call_count = priv->child_count; | |||||
3043 | ||||||
3044 | inode_ctx_get(fd->inode, this, (uint64_t *) &fctx)inode_ctx_get2(fd->inode,this,(uint64_t *) &fctx,0); | |||||
3045 | if (!fctx) { | |||||
3046 | gf_log(this->name, GF_LOG_ERROR, "no stripe context")do { do { if (0) printf ("no stripe context"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3046, GF_LOG_ERROR , "no stripe context"); } while (0); | |||||
3047 | op_errno = EINVAL22; | |||||
3048 | goto err; | |||||
3049 | } | |||||
3050 | if (!fctx->stripe_count) { | |||||
3051 | gf_log(this->name, GF_LOG_ERROR, "no stripe count")do { do { if (0) printf ("no stripe count"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3051, GF_LOG_ERROR , "no stripe count"); } while (0); | |||||
3052 | op_errno = EINVAL22; | |||||
3053 | goto err; | |||||
3054 | } | |||||
3055 | ||||||
3056 | local->fctx = fctx; | |||||
3057 | eof_idx = (offset / fctx->stripe_size) % fctx->stripe_count; | |||||
3058 | ||||||
3059 | for (i = 0; i < fctx->stripe_count; i++) { | |||||
3060 | if (!fctx->xl_array[i]) { | |||||
3061 | gf_log(this->name, GF_LOG_ERROR, "no xlator at index "do { do { if (0) printf ("no xlator at index " "%d", i); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3062, GF_LOG_ERROR, "no xlator at index " "%d", i); } while (0) | |||||
3062 | "%d", i)do { do { if (0) printf ("no xlator at index " "%d", i); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3062, GF_LOG_ERROR, "no xlator at index " "%d", i); } while (0); | |||||
3063 | op_errno = EINVAL22; | |||||
3064 | goto err; | |||||
3065 | } | |||||
3066 | ||||||
3067 | if (fctx->stripe_coalesce) { | |||||
3068 | if (i < eof_idx) | |||||
3069 | tmp_offset = roof(offset, fctx->stripe_size *((((offset)+(fctx->stripe_size * fctx->stripe_count)-1) /((fctx->stripe_size * fctx->stripe_count)?(fctx->stripe_size * fctx->stripe_count):1))*(fctx->stripe_size * fctx-> stripe_count)) | |||||
3070 | fctx->stripe_count)((((offset)+(fctx->stripe_size * fctx->stripe_count)-1) /((fctx->stripe_size * fctx->stripe_count)?(fctx->stripe_size * fctx->stripe_count):1))*(fctx->stripe_size * fctx-> stripe_count)); | |||||
3071 | else if (i > eof_idx) | |||||
3072 | tmp_offset = floor(offset, fctx->stripe_size *(((offset)/((fctx->stripe_size * fctx->stripe_count)?(fctx ->stripe_size * fctx->stripe_count):1))*(fctx->stripe_size * fctx->stripe_count)) | |||||
3073 | fctx->stripe_count)(((offset)/((fctx->stripe_size * fctx->stripe_count)?(fctx ->stripe_size * fctx->stripe_count):1))*(fctx->stripe_size * fctx->stripe_count)); | |||||
3074 | else | |||||
3075 | tmp_offset = offset; | |||||
3076 | ||||||
3077 | dest_offset = coalesced_offset(tmp_offset, | |||||
3078 | fctx->stripe_size, fctx->stripe_count); | |||||
3079 | } else { | |||||
3080 | dest_offset = offset; | |||||
3081 | } | |||||
3082 | ||||||
3083 | STACK_WIND(frame, stripe_truncate_cbk, fctx->xl_array[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", "stripe.c", __FUNCTION__, 3085, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [i]->fops->ftruncate_cbk) tmp_cbk = stripe_truncate_cbk ; _new->root = frame->root; _new->this = fctx->xl_array [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[i]->fops->ftruncate"; _new->unwind_to = "stripe_truncate_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[i]; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, fctx->xl_array[i]->fops->ftruncate ); fctx->xl_array[i]->fops->ftruncate (_new, fctx-> xl_array[i], fd, dest_offset, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3084 | fctx->xl_array[i]->fops->ftruncate, fd, dest_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", "stripe.c", __FUNCTION__, 3085, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [i]->fops->ftruncate_cbk) tmp_cbk = stripe_truncate_cbk ; _new->root = frame->root; _new->this = fctx->xl_array [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[i]->fops->ftruncate"; _new->unwind_to = "stripe_truncate_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[i]; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, fctx->xl_array[i]->fops->ftruncate ); fctx->xl_array[i]->fops->ftruncate (_new, fctx-> xl_array[i], fd, dest_offset, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
3085 | 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", "stripe.c", __FUNCTION__, 3085, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [i]->fops->ftruncate_cbk) tmp_cbk = stripe_truncate_cbk ; _new->root = frame->root; _new->this = fctx->xl_array [i]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[i]->fops->ftruncate"; _new->unwind_to = "stripe_truncate_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[i]; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, fctx->xl_array[i]->fops->ftruncate ); fctx->xl_array[i]->fops->ftruncate (_new, fctx-> xl_array[i], fd, dest_offset, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
3086 | } | |||||
3087 | ||||||
3088 | return 0; | |||||
3089 | err: | |||||
3090 | STRIPE_STACK_UNWIND (ftruncate, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_ftruncate_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", "stripe.c", __FUNCTION__ , 3090, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_ftruncate_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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
3091 | return 0; | |||||
3092 | } | |||||
3093 | ||||||
3094 | ||||||
3095 | int32_t | |||||
3096 | stripe_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3097 | int32_t op_ret, int32_t op_errno, dict_t *xdata) | |||||
3098 | { | |||||
3099 | int32_t callcnt = 0; | |||||
3100 | stripe_local_t *local = NULL((void*)0); | |||||
3101 | call_frame_t *prev = NULL((void*)0); | |||||
3102 | ||||||
3103 | if (!this || !frame || !frame->local || !cookie) { | |||||
3104 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 3104, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
3105 | goto out; | |||||
3106 | } | |||||
3107 | ||||||
3108 | prev = cookie; | |||||
3109 | local = frame->local; | |||||
3110 | ||||||
3111 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
3112 | { | |||||
3113 | callcnt = --local->call_count; | |||||
3114 | ||||||
3115 | if (op_ret == -1) { | |||||
3116 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 3118, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
3117 | "%s returned %s",do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 3118, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
3118 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned %s", prev->this-> name, strerror (op_errno)); } while (0); _gf_log (this->name , "stripe.c", __FUNCTION__, 3118, GF_LOG_DEBUG, "%s returned %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
3119 | local->op_errno = op_errno; | |||||
3120 | if ((op_errno != ENOENT2) || | |||||
3121 | (prev->this == FIRST_CHILD (this)(this->children->xlator))) | |||||
3122 | local->failed = 1; | |||||
3123 | } | |||||
3124 | if (op_ret >= 0) | |||||
3125 | local->op_ret = op_ret; | |||||
3126 | } | |||||
3127 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
3128 | ||||||
3129 | if (!callcnt) { | |||||
3130 | if (local->failed) | |||||
3131 | local->op_ret = -1; | |||||
3132 | ||||||
3133 | STRIPE_STACK_UNWIND (fsyncdir, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 3134, 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, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
3134 | local->op_errno, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 3134, 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, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
3135 | } | |||||
3136 | out: | |||||
3137 | return 0; | |||||
3138 | } | |||||
3139 | ||||||
3140 | int32_t | |||||
3141 | stripe_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags, dict_t *xdata) | |||||
3142 | { | |||||
3143 | stripe_local_t *local = NULL((void*)0); | |||||
3144 | stripe_private_t *priv = NULL((void*)0); | |||||
3145 | xlator_list_t *trav = NULL((void*)0); | |||||
3146 | int32_t op_errno = 1; | |||||
3147 | ||||||
3148 | 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!)"), "stripe.c" , __FUNCTION__, 3148, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3149 | 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!)"), "stripe.c" , __FUNCTION__, 3149, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3150 | 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!)"), "stripe.c" , __FUNCTION__, 3150, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
3151 | 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!)" ), "stripe.c", __FUNCTION__, 3151, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
3152 | ||||||
3153 | priv = this->private; | |||||
3154 | trav = this->children; | |||||
3155 | ||||||
3156 | /* Initialization */ | |||||
3157 | local = mem_get0 (this->local_pool); | |||||
3158 | if (!local) { | |||||
3159 | op_errno = ENOMEM12; | |||||
3160 | goto err; | |||||
3161 | } | |||||
3162 | local->op_ret = -1; | |||||
3163 | frame->local = local; | |||||
3164 | local->call_count = priv->child_count; | |||||
3165 | ||||||
3166 | while (trav) { | |||||
3167 | STACK_WIND (frame, stripe_fsyncdir_cbk, trav->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", "stripe.c", __FUNCTION__, 3168, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsyncdir_cbk) tmp_cbk = stripe_fsyncdir_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->fsyncdir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->fsyncdir); trav->xlator-> fops->fsyncdir (_new, trav->xlator, fd, flags, ((void*) 0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3168 | trav->xlator->fops->fsyncdir, fd, 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", "stripe.c", __FUNCTION__, 3168, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsyncdir_cbk) tmp_cbk = stripe_fsyncdir_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->fsyncdir"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->fsyncdir); trav->xlator-> fops->fsyncdir (_new, trav->xlator, fd, flags, ((void*) 0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3169 | trav = trav->next; | |||||
3170 | } | |||||
3171 | ||||||
3172 | return 0; | |||||
3173 | err: | |||||
3174 | STRIPE_STACK_UNWIND (fsyncdir, frame, -1, op_errno, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 3174, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
3175 | return 0; | |||||
3176 | } | |||||
3177 | ||||||
3178 | ||||||
3179 | int32_t | |||||
3180 | stripe_readv_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3181 | int32_t op_ret, int32_t op_errno, struct iatt *buf, dict_t *xdata) | |||||
3182 | { | |||||
3183 | int32_t i = 0; | |||||
3184 | int32_t callcnt = 0; | |||||
3185 | int32_t count = 0; | |||||
3186 | stripe_local_t *local = NULL((void*)0); | |||||
3187 | struct iovec *vec = NULL((void*)0); | |||||
3188 | struct iatt tmp_stbuf = {0,}; | |||||
3189 | struct iobref *tmp_iobref = NULL((void*)0); | |||||
3190 | struct iobuf *iobuf = NULL((void*)0); | |||||
3191 | call_frame_t *prev = NULL((void*)0); | |||||
3192 | ||||||
3193 | if (!this || !frame || !frame->local) { | |||||
3194 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 3194, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
3195 | goto out; | |||||
3196 | } | |||||
3197 | ||||||
3198 | local = frame->local; | |||||
3199 | prev = cookie; | |||||
3200 | ||||||
3201 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
3202 | { | |||||
3203 | callcnt = --local->call_count; | |||||
3204 | if (op_ret != -1) { | |||||
3205 | correct_file_size(buf, local->fctx, prev); | |||||
3206 | if (local->stbuf_size < buf->ia_size) | |||||
3207 | local->stbuf_size = buf->ia_size; | |||||
3208 | } | |||||
3209 | } | |||||
3210 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
3211 | ||||||
3212 | if (!callcnt) { | |||||
3213 | op_ret = 0; | |||||
3214 | ||||||
3215 | /* Keep extra space for filling in '\0's */ | |||||
3216 | vec = GF_CALLOC ((local->count * 2), sizeof (struct iovec),__gf_calloc ((local->count * 2), sizeof (struct iovec), gf_stripe_mt_iovec ) | |||||
3217 | gf_stripe_mt_iovec)__gf_calloc ((local->count * 2), sizeof (struct iovec), gf_stripe_mt_iovec ); | |||||
3218 | if (!vec) { | |||||
3219 | op_ret = -1; | |||||
3220 | goto done; | |||||
3221 | } | |||||
3222 | ||||||
3223 | for (i = 0; i < local->wind_count; i++) { | |||||
3224 | if (local->replies[i].op_ret) { | |||||
3225 | memcpy ((vec + count), local->replies[i].vector, | |||||
3226 | (local->replies[i].count * sizeof (struct iovec))); | |||||
3227 | count += local->replies[i].count; | |||||
3228 | op_ret += local->replies[i].op_ret; | |||||
3229 | } | |||||
3230 | if ((local->replies[i].op_ret < | |||||
3231 | local->replies[i].requested_size) && | |||||
3232 | (local->stbuf_size > (local->offset + op_ret))) { | |||||
3233 | /* Fill in 0s here */ | |||||
3234 | vec[count].iov_len = | |||||
3235 | (local->replies[i].requested_size - | |||||
3236 | local->replies[i].op_ret); | |||||
3237 | iobuf = iobuf_get2 (this->ctx->iobuf_pool, | |||||
3238 | vec[count].iov_len); | |||||
3239 | if (!iobuf) { | |||||
3240 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Out of memory."); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3241, GF_LOG_ERROR , "Out of memory."); } while (0) | |||||
3241 | "Out of memory.")do { do { if (0) printf ("Out of memory."); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3241, GF_LOG_ERROR , "Out of memory."); } while (0); | |||||
3242 | op_ret = -1; | |||||
3243 | op_errno = ENOMEM12; | |||||
3244 | goto done; | |||||
3245 | } | |||||
3246 | memset (iobuf->ptr, 0, vec[count].iov_len); | |||||
3247 | vec[count].iov_base = iobuf->ptr; | |||||
3248 | ||||||
3249 | iobref_add (local->iobref, iobuf); | |||||
3250 | iobuf_unref(iobuf); | |||||
3251 | ||||||
3252 | op_ret += vec[count].iov_len; | |||||
3253 | count++; | |||||
3254 | } | |||||
3255 | GF_FREE (local->replies[i].vector)__gf_free (local->replies[i].vector); | |||||
3256 | } | |||||
3257 | ||||||
3258 | /* FIXME: notice that st_ino, and st_dev (gen) will be | |||||
3259 | * different than what inode will have. Make sure this doesn't | |||||
3260 | * cause any bugs at higher levels */ | |||||
3261 | memcpy (&tmp_stbuf, &local->replies[0].stbuf, | |||||
3262 | sizeof (struct iatt)); | |||||
3263 | tmp_stbuf.ia_size = local->stbuf_size; | |||||
3264 | ||||||
3265 | done: | |||||
3266 | GF_FREE (local->replies)__gf_free (local->replies); | |||||
3267 | tmp_iobref = local->iobref; | |||||
3268 | STRIPE_STACK_UNWIND (readv, frame, op_ret, op_errno, vec,do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_readv_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", "stripe.c", __FUNCTION__ , 3269, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_readv_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, vec, count, &tmp_stbuf, tmp_iobref , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0) | |||||
3269 | count, &tmp_stbuf, tmp_iobref, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_readv_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", "stripe.c", __FUNCTION__ , 3269, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_readv_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, vec, count, &tmp_stbuf, tmp_iobref , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0); | |||||
3270 | ||||||
3271 | iobref_unref (tmp_iobref); | |||||
3272 | GF_FREE (vec)__gf_free (vec); | |||||
3273 | } | |||||
3274 | out: | |||||
3275 | return 0; | |||||
3276 | } | |||||
3277 | ||||||
3278 | /** | |||||
3279 | * stripe_readv_cbk - get all the striped reads, and order it properly, send it | |||||
3280 | * to above layer after putting it in a single vector. | |||||
3281 | */ | |||||
3282 | int32_t | |||||
3283 | stripe_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3284 | int32_t op_ret, int32_t op_errno, struct iovec *vector, | |||||
3285 | int32_t count, struct iatt *stbuf, struct iobref *iobref, dict_t *xdata) | |||||
3286 | { | |||||
3287 | int32_t index = 0; | |||||
3288 | int32_t callcnt = 0; | |||||
3289 | int32_t final_count = 0; | |||||
3290 | int32_t need_to_check_proper_size = 0; | |||||
3291 | call_frame_t *mframe = NULL((void*)0); | |||||
3292 | stripe_local_t *mlocal = NULL((void*)0); | |||||
3293 | stripe_local_t *local = NULL((void*)0); | |||||
3294 | struct iovec *final_vec = NULL((void*)0); | |||||
3295 | struct iatt tmp_stbuf = {0,}; | |||||
3296 | struct iatt *tmp_stbuf_p = NULL((void*)0); //need it for a warning | |||||
3297 | struct iobref *tmp_iobref = NULL((void*)0); | |||||
3298 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
3299 | call_frame_t *prev = NULL((void*)0); | |||||
3300 | ||||||
3301 | if (!this || !frame || !frame->local || !cookie) { | |||||
3302 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 3302, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
3303 | goto end; | |||||
3304 | } | |||||
3305 | ||||||
3306 | local = frame->local; | |||||
3307 | index = local->node_index; | |||||
3308 | prev = cookie; | |||||
3309 | mframe = local->orig_frame; | |||||
3310 | if (!mframe) | |||||
3311 | goto out; | |||||
3312 | ||||||
3313 | mlocal = mframe->local; | |||||
3314 | if (!mlocal) | |||||
3315 | goto out; | |||||
3316 | ||||||
3317 | fctx = mlocal->fctx; | |||||
3318 | ||||||
3319 | LOCK (&mframe->lock)pthread_spin_lock (&mframe->lock); | |||||
3320 | { | |||||
3321 | mlocal->replies[index].op_ret = op_ret; | |||||
3322 | mlocal->replies[index].op_errno = op_errno; | |||||
3323 | mlocal->replies[index].requested_size = local->readv_size; | |||||
3324 | if (op_ret >= 0) { | |||||
3325 | mlocal->replies[index].stbuf = *stbuf; | |||||
3326 | mlocal->replies[index].count = count; | |||||
3327 | mlocal->replies[index].vector = iov_dup (vector, count); | |||||
3328 | ||||||
3329 | correct_file_size(stbuf, fctx, prev); | |||||
3330 | ||||||
3331 | if (local->stbuf_size < stbuf->ia_size) | |||||
3332 | local->stbuf_size = stbuf->ia_size; | |||||
3333 | local->stbuf_blocks += stbuf->ia_blocks; | |||||
3334 | ||||||
3335 | if (!mlocal->iobref) | |||||
3336 | mlocal->iobref = iobref_new (); | |||||
3337 | iobref_merge (mlocal->iobref, iobref); | |||||
3338 | } | |||||
3339 | callcnt = ++mlocal->call_count; | |||||
3340 | } | |||||
3341 | UNLOCK(&mframe->lock)pthread_spin_unlock (&mframe->lock); | |||||
3342 | ||||||
3343 | if (callcnt == mlocal->wind_count) { | |||||
3344 | op_ret = 0; | |||||
3345 | ||||||
3346 | for (index=0; index < mlocal->wind_count; index++) { | |||||
3347 | /* check whether each stripe returned | |||||
3348 | * 'expected' number of bytes */ | |||||
3349 | if (mlocal->replies[index].op_ret == -1) { | |||||
3350 | op_ret = -1; | |||||
3351 | op_errno = mlocal->replies[index].op_errno; | |||||
3352 | break; | |||||
3353 | } | |||||
3354 | /* TODO: handle the 'holes' within the read range | |||||
3355 | properly */ | |||||
3356 | if (mlocal->replies[index].op_ret < | |||||
3357 | mlocal->replies[index].requested_size) { | |||||
3358 | need_to_check_proper_size = 1; | |||||
3359 | } | |||||
3360 | ||||||
3361 | op_ret += mlocal->replies[index].op_ret; | |||||
3362 | mlocal->count += mlocal->replies[index].count; | |||||
3363 | } | |||||
3364 | if (op_ret == -1) | |||||
3365 | goto done; | |||||
3366 | if (need_to_check_proper_size) | |||||
3367 | goto check_size; | |||||
3368 | ||||||
3369 | final_vec = GF_CALLOC (mlocal->count, sizeof (struct iovec),__gf_calloc (mlocal->count, sizeof (struct iovec), gf_stripe_mt_iovec ) | |||||
3370 | gf_stripe_mt_iovec)__gf_calloc (mlocal->count, sizeof (struct iovec), gf_stripe_mt_iovec ); | |||||
3371 | ||||||
3372 | if (!final_vec) { | |||||
3373 | op_ret = -1; | |||||
3374 | goto done; | |||||
3375 | } | |||||
3376 | ||||||
3377 | for (index = 0; index < mlocal->wind_count; index++) { | |||||
3378 | memcpy ((final_vec + final_count), | |||||
3379 | mlocal->replies[index].vector, | |||||
3380 | (mlocal->replies[index].count * | |||||
3381 | sizeof (struct iovec))); | |||||
3382 | final_count += mlocal->replies[index].count; | |||||
3383 | GF_FREE (mlocal->replies[index].vector)__gf_free (mlocal->replies[index].vector); | |||||
3384 | } | |||||
3385 | ||||||
3386 | /* FIXME: notice that st_ino, and st_dev (gen) will be | |||||
3387 | * different than what inode will have. Make sure this doesn't | |||||
3388 | * cause any bugs at higher levels */ | |||||
3389 | memcpy (&tmp_stbuf, &mlocal->replies[0].stbuf, | |||||
3390 | sizeof (struct iatt)); | |||||
3391 | tmp_stbuf.ia_size = local->stbuf_size; | |||||
3392 | tmp_stbuf.ia_blocks = local->stbuf_blocks; | |||||
3393 | ||||||
3394 | done: | |||||
3395 | /* */ | |||||
3396 | GF_FREE (mlocal->replies)__gf_free (mlocal->replies); | |||||
3397 | tmp_iobref = mlocal->iobref; | |||||
3398 | /* work around for nfs truncated read. Bug 3774 */ | |||||
3399 | tmp_stbuf_p = &tmp_stbuf; | |||||
3400 | WIPE (tmp_stbuf_p)do { typeof(*tmp_stbuf_p) z = {0,}; if (tmp_stbuf_p) *tmp_stbuf_p = z; } while (0); | |||||
3401 | STRIPE_STACK_UNWIND (readv, mframe, op_ret, op_errno, final_vec,do { stripe_local_t *__local = ((void*)0); if (mframe) { __local = mframe->local; mframe->local = ((void*)0); } do { fop_readv_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!mframe) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__ , 3402, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_readv_cbk_t )mframe->ret; _parent = mframe->parent ; pthread_spin_lock (&mframe->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&mframe->root ->stack_lock); old_THIS = (*__glusterfs_this_location()); ( *__glusterfs_this_location()) = _parent->this; mframe-> complete = _gf_true; mframe->unwind_from = __FUNCTION__; if (mframe->this->ctx->measure_latency) gf_latency_end (mframe); fn (_parent, mframe->cookie, _parent->this, op_ret , op_errno, final_vec, final_count, &tmp_stbuf, tmp_iobref , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0) | |||||
3402 | final_count, &tmp_stbuf, tmp_iobref, NULL)do { stripe_local_t *__local = ((void*)0); if (mframe) { __local = mframe->local; mframe->local = ((void*)0); } do { fop_readv_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!mframe) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__ , 3402, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_readv_cbk_t )mframe->ret; _parent = mframe->parent ; pthread_spin_lock (&mframe->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&mframe->root ->stack_lock); old_THIS = (*__glusterfs_this_location()); ( *__glusterfs_this_location()) = _parent->this; mframe-> complete = _gf_true; mframe->unwind_from = __FUNCTION__; if (mframe->this->ctx->measure_latency) gf_latency_end (mframe); fn (_parent, mframe->cookie, _parent->this, op_ret , op_errno, final_vec, final_count, &tmp_stbuf, tmp_iobref , ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0); | |||||
3403 | ||||||
3404 | iobref_unref (tmp_iobref); | |||||
3405 | GF_FREE (final_vec)__gf_free (final_vec); | |||||
3406 | } | |||||
3407 | ||||||
3408 | goto out; | |||||
3409 | ||||||
3410 | check_size: | |||||
3411 | mlocal->call_count = fctx->stripe_count; | |||||
3412 | ||||||
3413 | for (index = 0; index < fctx->stripe_count; index++) { | |||||
3414 | STACK_WIND (mframe, stripe_readv_fstat_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (mframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3417, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (fctx->xl_array [index])->fops->fstat_cbk) tmp_cbk = stripe_readv_fstat_cbk ; _new->root = mframe->root; _new->this = (fctx-> xl_array[index]); _new->ret = (ret_fn_t) tmp_cbk; _new-> parent = mframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "(fctx->xl_array[index])->fops->fstat" ; _new->unwind_to = "stripe_readv_fstat_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&mframe-> root->stack_lock); { _new->next = mframe->root->frames .next; _new->prev = &mframe->root->frames; if (mframe ->root->frames.next) mframe->root->frames.next-> prev = _new; mframe->root->frames.next = _new; mframe-> ref_count++; } pthread_spin_unlock (&mframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (fctx->xl_array[index]); if (mframe->this->ctx ->measure_latency) gf_latency_begin (_new, (fctx->xl_array [index])->fops->fstat); (fctx->xl_array[index])-> fops->fstat (_new, (fctx->xl_array[index]), mlocal-> fd, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3415 | (fctx->xl_array[index]),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (mframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3417, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (fctx->xl_array [index])->fops->fstat_cbk) tmp_cbk = stripe_readv_fstat_cbk ; _new->root = mframe->root; _new->this = (fctx-> xl_array[index]); _new->ret = (ret_fn_t) tmp_cbk; _new-> parent = mframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "(fctx->xl_array[index])->fops->fstat" ; _new->unwind_to = "stripe_readv_fstat_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&mframe-> root->stack_lock); { _new->next = mframe->root->frames .next; _new->prev = &mframe->root->frames; if (mframe ->root->frames.next) mframe->root->frames.next-> prev = _new; mframe->root->frames.next = _new; mframe-> ref_count++; } pthread_spin_unlock (&mframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (fctx->xl_array[index]); if (mframe->this->ctx ->measure_latency) gf_latency_begin (_new, (fctx->xl_array [index])->fops->fstat); (fctx->xl_array[index])-> fops->fstat (_new, (fctx->xl_array[index]), mlocal-> fd, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3416 | (fctx->xl_array[index])->fops->fstat,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (mframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3417, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (fctx->xl_array [index])->fops->fstat_cbk) tmp_cbk = stripe_readv_fstat_cbk ; _new->root = mframe->root; _new->this = (fctx-> xl_array[index]); _new->ret = (ret_fn_t) tmp_cbk; _new-> parent = mframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "(fctx->xl_array[index])->fops->fstat" ; _new->unwind_to = "stripe_readv_fstat_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&mframe-> root->stack_lock); { _new->next = mframe->root->frames .next; _new->prev = &mframe->root->frames; if (mframe ->root->frames.next) mframe->root->frames.next-> prev = _new; mframe->root->frames.next = _new; mframe-> ref_count++; } pthread_spin_unlock (&mframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (fctx->xl_array[index]); if (mframe->this->ctx ->measure_latency) gf_latency_begin (_new, (fctx->xl_array [index])->fops->fstat); (fctx->xl_array[index])-> fops->fstat (_new, (fctx->xl_array[index]), mlocal-> fd, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3417 | mlocal->fd, NULL)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (mframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3417, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (fctx->xl_array [index])->fops->fstat_cbk) tmp_cbk = stripe_readv_fstat_cbk ; _new->root = mframe->root; _new->this = (fctx-> xl_array[index]); _new->ret = (ret_fn_t) tmp_cbk; _new-> parent = mframe; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "(fctx->xl_array[index])->fops->fstat" ; _new->unwind_to = "stripe_readv_fstat_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&mframe-> root->stack_lock); { _new->next = mframe->root->frames .next; _new->prev = &mframe->root->frames; if (mframe ->root->frames.next) mframe->root->frames.next-> prev = _new; mframe->root->frames.next = _new; mframe-> ref_count++; } pthread_spin_unlock (&mframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (fctx->xl_array[index]); if (mframe->this->ctx ->measure_latency) gf_latency_begin (_new, (fctx->xl_array [index])->fops->fstat); (fctx->xl_array[index])-> fops->fstat (_new, (fctx->xl_array[index]), mlocal-> fd, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3418 | } | |||||
3419 | ||||||
3420 | out: | |||||
3421 | STRIPE_STACK_DESTROY (frame)do { stripe_local_t *__local = ((void*)0); __local = frame-> local; frame->local = ((void*)0); STACK_DESTROY (frame-> root); if (__local) { stripe_local_wipe (__local); mem_put (__local ); } } while (0); | |||||
3422 | end: | |||||
3423 | return 0; | |||||
3424 | } | |||||
3425 | ||||||
3426 | ||||||
3427 | int32_t | |||||
3428 | stripe_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, | |||||
3429 | size_t size, off_t offset, uint32_t flags, dict_t *xdata) | |||||
3430 | { | |||||
3431 | int32_t op_errno = EINVAL22; | |||||
3432 | int32_t idx = 0; | |||||
3433 | int32_t index = 0; | |||||
3434 | int32_t num_stripe = 0; | |||||
3435 | int32_t off_index = 0; | |||||
3436 | size_t frame_size = 0; | |||||
3437 | off_t rounded_end = 0; | |||||
3438 | uint64_t tmp_fctx = 0; | |||||
3439 | uint64_t stripe_size = 0; | |||||
3440 | off_t rounded_start = 0; | |||||
3441 | off_t frame_offset = offset; | |||||
3442 | off_t dest_offset = 0; | |||||
3443 | stripe_local_t *local = NULL((void*)0); | |||||
3444 | call_frame_t *rframe = NULL((void*)0); | |||||
3445 | stripe_local_t *rlocal = NULL((void*)0); | |||||
3446 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
3447 | ||||||
3448 | 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!)"), "stripe.c" , __FUNCTION__, 3448, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3449 | 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!)"), "stripe.c" , __FUNCTION__, 3449, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3450 | 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!)"), "stripe.c" , __FUNCTION__, 3450, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
3451 | 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!)" ), "stripe.c", __FUNCTION__, 3451, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
3452 | ||||||
3453 | inode_ctx_get (fd->inode, this, &tmp_fctx)inode_ctx_get2(fd->inode,this,&tmp_fctx,0); | |||||
3454 | if (!tmp_fctx) { | |||||
3455 | op_errno = EBADFD77; | |||||
3456 | goto err; | |||||
3457 | } | |||||
3458 | fctx = (stripe_fd_ctx_t *)(long)tmp_fctx; | |||||
3459 | stripe_size = fctx->stripe_size; | |||||
3460 | ||||||
3461 | STRIPE_VALIDATE_FCTX (fctx, err)do { int idx = 0; if (!fctx) { op_errno = 22; goto err; } for (idx = 0; idx < fctx->stripe_count; idx++) { if (!fctx ->xl_array[idx]) { do { do { if (0) printf ("fctx->xl_array[%d] is NULL" , idx); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 3461, GF_LOG_ERROR, "fctx->xl_array[%d] is NULL", idx); } while (0); op_errno = 116; goto err; } } } while (0); | |||||
3462 | ||||||
3463 | if (!stripe_size) { | |||||
3464 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Wrong stripe size for the file"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3465, GF_LOG_DEBUG, "Wrong stripe size for the file"); } while (0) | |||||
3465 | "Wrong stripe size for the file")do { do { if (0) printf ("Wrong stripe size for the file"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3465, GF_LOG_DEBUG, "Wrong stripe size for the file"); } while (0); | |||||
3466 | goto err; | |||||
3467 | } | |||||
3468 | /* The file is stripe across the child nodes. Send the read request | |||||
3469 | * to the child nodes appropriately after checking which region of | |||||
3470 | * the file is in which child node. Always '0-<stripe_size>' part of | |||||
3471 | * the file resides in the first child. | |||||
3472 | */ | |||||
3473 | rounded_start = floor (offset, stripe_size)(((offset)/((stripe_size)?(stripe_size):1))*(stripe_size)); | |||||
3474 | rounded_end = roof (offset+size, stripe_size)((((offset+size)+(stripe_size)-1)/((stripe_size)?(stripe_size ):1))*(stripe_size)); | |||||
3475 | num_stripe = (rounded_end- rounded_start)/stripe_size; | |||||
3476 | ||||||
3477 | local = mem_get0 (this->local_pool); | |||||
3478 | if (!local) { | |||||
3479 | op_errno = ENOMEM12; | |||||
3480 | goto err; | |||||
3481 | } | |||||
3482 | frame->local = local; | |||||
3483 | ||||||
3484 | /* This is where all the vectors should be copied. */ | |||||
3485 | local->replies = GF_CALLOC (num_stripe, sizeof (struct stripe_replies),__gf_calloc (num_stripe, sizeof (struct stripe_replies), gf_stripe_mt_stripe_replies ) | |||||
3486 | gf_stripe_mt_stripe_replies)__gf_calloc (num_stripe, sizeof (struct stripe_replies), gf_stripe_mt_stripe_replies ); | |||||
3487 | if (!local->replies) { | |||||
3488 | op_errno = ENOMEM12; | |||||
3489 | goto err; | |||||
3490 | } | |||||
3491 | ||||||
3492 | off_index = (offset / stripe_size) % fctx->stripe_count; | |||||
3493 | local->wind_count = num_stripe; | |||||
3494 | local->readv_size = size; | |||||
3495 | local->offset = offset; | |||||
3496 | local->fd = fd_ref (fd); | |||||
3497 | local->fctx = fctx; | |||||
3498 | ||||||
3499 | for (index = off_index; index < (num_stripe + off_index); index++) { | |||||
3500 | rframe = copy_frame (frame); | |||||
3501 | rlocal = mem_get0 (this->local_pool); | |||||
3502 | if (!rlocal) { | |||||
3503 | op_errno = ENOMEM12; | |||||
3504 | goto err; | |||||
3505 | } | |||||
3506 | ||||||
3507 | frame_size = min (roof (frame_offset+1, stripe_size),((((((frame_offset+1)+(stripe_size)-1)/((stripe_size)?(stripe_size ):1))*(stripe_size)))<((offset + size))?(((((frame_offset+ 1)+(stripe_size)-1)/((stripe_size)?(stripe_size):1))*(stripe_size ))):((offset + size))) | |||||
3508 | (offset + size))((((((frame_offset+1)+(stripe_size)-1)/((stripe_size)?(stripe_size ):1))*(stripe_size)))<((offset + size))?(((((frame_offset+ 1)+(stripe_size)-1)/((stripe_size)?(stripe_size):1))*(stripe_size ))):((offset + size))) - frame_offset; | |||||
3509 | ||||||
3510 | rlocal->node_index = index - off_index; | |||||
3511 | rlocal->orig_frame = frame; | |||||
3512 | rlocal->readv_size = frame_size; | |||||
3513 | rframe->local = rlocal; | |||||
3514 | idx = (index % fctx->stripe_count); | |||||
3515 | ||||||
3516 | if (fctx->stripe_coalesce) | |||||
3517 | dest_offset = coalesced_offset(frame_offset, | |||||
3518 | stripe_size, fctx->stripe_count); | |||||
3519 | else | |||||
3520 | dest_offset = frame_offset; | |||||
3521 | ||||||
3522 | STACK_WIND (rframe, stripe_readv_cbk, fctx->xl_array[idx],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3524, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [idx]->fops->readv_cbk) tmp_cbk = stripe_readv_cbk; _new ->root = rframe->root; _new->this = fctx->xl_array [idx]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[idx]->fops->readv"; _new ->unwind_to = "stripe_readv_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[idx]; if (rframe->this->ctx-> measure_latency) gf_latency_begin (_new, fctx->xl_array[idx ]->fops->readv); fctx->xl_array[idx]->fops->readv (_new, fctx->xl_array[idx], fd, frame_size, dest_offset, flags , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0) | |||||
3523 | fctx->xl_array[idx]->fops->readv,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3524, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [idx]->fops->readv_cbk) tmp_cbk = stripe_readv_cbk; _new ->root = rframe->root; _new->this = fctx->xl_array [idx]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[idx]->fops->readv"; _new ->unwind_to = "stripe_readv_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[idx]; if (rframe->this->ctx-> measure_latency) gf_latency_begin (_new, fctx->xl_array[idx ]->fops->readv); fctx->xl_array[idx]->fops->readv (_new, fctx->xl_array[idx], fd, frame_size, dest_offset, flags , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0) | |||||
3524 | fd, frame_size, dest_offset, flags, xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (rframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3524, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [idx]->fops->readv_cbk) tmp_cbk = stripe_readv_cbk; _new ->root = rframe->root; _new->this = fctx->xl_array [idx]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = rframe ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[idx]->fops->readv"; _new ->unwind_to = "stripe_readv_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&rframe->root-> stack_lock); { _new->next = rframe->root->frames.next ; _new->prev = &rframe->root->frames; if (rframe ->root->frames.next) rframe->root->frames.next-> prev = _new; rframe->root->frames.next = _new; rframe-> ref_count++; } pthread_spin_unlock (&rframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[idx]; if (rframe->this->ctx-> measure_latency) gf_latency_begin (_new, fctx->xl_array[idx ]->fops->readv); fctx->xl_array[idx]->fops->readv (_new, fctx->xl_array[idx], fd, frame_size, dest_offset, flags , xdata); (*__glusterfs_this_location()) = old_THIS; } while ( 0); | |||||
3525 | ||||||
3526 | frame_offset += frame_size; | |||||
3527 | } | |||||
3528 | ||||||
3529 | return 0; | |||||
3530 | err: | |||||
3531 | if (rframe) | |||||
3532 | STRIPE_STACK_DESTROY (rframe)do { stripe_local_t *__local = ((void*)0); __local = rframe-> local; rframe->local = ((void*)0); STACK_DESTROY (rframe-> root); if (__local) { stripe_local_wipe (__local); mem_put (__local ); } } while (0); | |||||
3533 | ||||||
3534 | STRIPE_STACK_UNWIND (readv, frame, -1, op_errno, NULL, 0, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_readv_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", "stripe.c", __FUNCTION__ , 3534, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_readv_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), 0, ((void*)0), ((void*)0 ), ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0); | |||||
3535 | return 0; | |||||
3536 | } | |||||
3537 | ||||||
3538 | ||||||
3539 | int32_t | |||||
3540 | stripe_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
3541 | int32_t op_ret, int32_t op_errno, struct iatt *prebuf, | |||||
3542 | struct iatt *postbuf, dict_t *xdata) | |||||
3543 | { | |||||
3544 | int32_t callcnt = 0; | |||||
3545 | stripe_local_t *local = NULL((void*)0); | |||||
3546 | stripe_local_t *mlocal = NULL((void*)0); | |||||
3547 | call_frame_t *prev = NULL((void*)0); | |||||
3548 | call_frame_t *mframe = NULL((void*)0); | |||||
3549 | struct stripe_replies *reply = NULL((void*)0); | |||||
3550 | int32_t i = 0; | |||||
3551 | ||||||
3552 | if (!this || !frame || !frame->local || !cookie) { | |||||
3553 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 3553, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
3554 | goto out; | |||||
3555 | } | |||||
3556 | ||||||
3557 | prev = cookie; | |||||
3558 | local = frame->local; | |||||
3559 | mframe = local->orig_frame; | |||||
3560 | mlocal = mframe->local; | |||||
3561 | ||||||
3562 | LOCK(&frame->lock)pthread_spin_lock (&frame->lock); | |||||
3563 | { | |||||
3564 | callcnt = ++mlocal->call_count; | |||||
3565 | ||||||
3566 | mlocal->replies[local->node_index].op_ret = op_ret; | |||||
3567 | mlocal->replies[local->node_index].op_errno = op_errno; | |||||
3568 | ||||||
3569 | if (op_ret >= 0) { | |||||
3570 | mlocal->post_buf = *postbuf; | |||||
3571 | mlocal->pre_buf = *prebuf; | |||||
3572 | ||||||
3573 | mlocal->prebuf_blocks += prebuf->ia_blocks; | |||||
3574 | mlocal->postbuf_blocks += postbuf->ia_blocks; | |||||
3575 | ||||||
3576 | correct_file_size(prebuf, mlocal->fctx, prev); | |||||
3577 | correct_file_size(postbuf, mlocal->fctx, prev); | |||||
3578 | ||||||
3579 | if (mlocal->prebuf_size < prebuf->ia_size) | |||||
3580 | mlocal->prebuf_size = prebuf->ia_size; | |||||
3581 | if (mlocal->postbuf_size < postbuf->ia_size) | |||||
3582 | mlocal->postbuf_size = postbuf->ia_size; | |||||
3583 | } | |||||
3584 | } | |||||
3585 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
3586 | ||||||
3587 | if ((callcnt == mlocal->wind_count) && mlocal->unwind) { | |||||
3588 | mlocal->pre_buf.ia_size = mlocal->prebuf_size; | |||||
3589 | mlocal->pre_buf.ia_blocks = mlocal->prebuf_blocks; | |||||
3590 | mlocal->post_buf.ia_size = mlocal->postbuf_size; | |||||
3591 | mlocal->post_buf.ia_blocks = mlocal->postbuf_blocks; | |||||
3592 | ||||||
3593 | /* | |||||
3594 | * Only return the number of consecutively written bytes up until | |||||
3595 | * the first error. Only return an error if it occurs first. | |||||
3596 | * | |||||
3597 | * When a short write occurs, the application should retry at the | |||||
3598 | * appropriate offset, at which point we'll potentially pass back | |||||
3599 | * the error. | |||||
3600 | */ | |||||
3601 | for (i = 0, reply = mlocal->replies; i < mlocal->wind_count; | |||||
3602 | i++, reply++) { | |||||
3603 | if (reply->op_ret == -1) { | |||||
3604 | gf_log(this->name, GF_LOG_DEBUG, "reply %d "do { do { if (0) printf ("reply %d " "returned error %s", i, strerror (reply->op_errno)); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 3606, GF_LOG_DEBUG, "reply %d " "returned error %s" , i, strerror(reply->op_errno)); } while (0) | |||||
3605 | "returned error %s", i,do { do { if (0) printf ("reply %d " "returned error %s", i, strerror (reply->op_errno)); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 3606, GF_LOG_DEBUG, "reply %d " "returned error %s" , i, strerror(reply->op_errno)); } while (0) | |||||
3606 | strerror(reply->op_errno))do { do { if (0) printf ("reply %d " "returned error %s", i, strerror (reply->op_errno)); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 3606, GF_LOG_DEBUG, "reply %d " "returned error %s" , i, strerror(reply->op_errno)); } while (0); | |||||
3607 | if (!mlocal->op_ret) { | |||||
3608 | mlocal->op_ret = -1; | |||||
3609 | mlocal->op_errno = reply->op_errno; | |||||
3610 | } | |||||
3611 | break; | |||||
3612 | } | |||||
3613 | ||||||
3614 | mlocal->op_ret += reply->op_ret; | |||||
3615 | ||||||
3616 | if (reply->op_ret < reply->requested_size) | |||||
3617 | break; | |||||
3618 | } | |||||
3619 | ||||||
3620 | GF_FREE(mlocal->replies)__gf_free (mlocal->replies); | |||||
3621 | ||||||
3622 | STRIPE_STACK_UNWIND (writev, mframe, mlocal->op_ret,do { stripe_local_t *__local = ((void*)0); if (mframe) { __local = mframe->local; mframe->local = ((void*)0); } do { fop_writev_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!mframe) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__ , 3624, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_writev_cbk_t )mframe->ret; _parent = mframe->parent ; pthread_spin_lock (&mframe->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&mframe->root ->stack_lock); old_THIS = (*__glusterfs_this_location()); ( *__glusterfs_this_location()) = _parent->this; mframe-> complete = _gf_true; mframe->unwind_from = __FUNCTION__; if (mframe->this->ctx->measure_latency) gf_latency_end (mframe); fn (_parent, mframe->cookie, _parent->this, mlocal ->op_ret, mlocal->op_errno, &mlocal->pre_buf, & mlocal->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
3623 | mlocal->op_errno, &mlocal->pre_buf,do { stripe_local_t *__local = ((void*)0); if (mframe) { __local = mframe->local; mframe->local = ((void*)0); } do { fop_writev_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!mframe) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__ , 3624, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_writev_cbk_t )mframe->ret; _parent = mframe->parent ; pthread_spin_lock (&mframe->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&mframe->root ->stack_lock); old_THIS = (*__glusterfs_this_location()); ( *__glusterfs_this_location()) = _parent->this; mframe-> complete = _gf_true; mframe->unwind_from = __FUNCTION__; if (mframe->this->ctx->measure_latency) gf_latency_end (mframe); fn (_parent, mframe->cookie, _parent->this, mlocal ->op_ret, mlocal->op_errno, &mlocal->pre_buf, & mlocal->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
3624 | &mlocal->post_buf, NULL)do { stripe_local_t *__local = ((void*)0); if (mframe) { __local = mframe->local; mframe->local = ((void*)0); } do { fop_writev_cbk_t fn = ((void*)0); call_frame_t *_parent = ((void*)0); xlator_t *old_THIS = ((void*)0); if (!mframe) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__ , 3624, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_writev_cbk_t )mframe->ret; _parent = mframe->parent ; pthread_spin_lock (&mframe->root->stack_lock); { _parent ->ref_count--; } pthread_spin_unlock (&mframe->root ->stack_lock); old_THIS = (*__glusterfs_this_location()); ( *__glusterfs_this_location()) = _parent->this; mframe-> complete = _gf_true; mframe->unwind_from = __FUNCTION__; if (mframe->this->ctx->measure_latency) gf_latency_end (mframe); fn (_parent, mframe->cookie, _parent->this, mlocal ->op_ret, mlocal->op_errno, &mlocal->pre_buf, & mlocal->post_buf, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
3625 | } | |||||
3626 | out: | |||||
3627 | STRIPE_STACK_DESTROY(frame)do { stripe_local_t *__local = ((void*)0); __local = frame-> local; frame->local = ((void*)0); STACK_DESTROY (frame-> root); if (__local) { stripe_local_wipe (__local); mem_put (__local ); } } while (0); | |||||
3628 | return 0; | |||||
3629 | } | |||||
3630 | ||||||
3631 | int32_t | |||||
3632 | stripe_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, | |||||
3633 | struct iovec *vector, int32_t count, off_t offset, | |||||
3634 | uint32_t flags, struct iobref *iobref, dict_t *xdata) | |||||
3635 | { | |||||
3636 | struct iovec *tmp_vec = NULL((void*)0); | |||||
3637 | stripe_local_t *local = NULL((void*)0); | |||||
3638 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
3639 | int32_t op_errno = 1; | |||||
3640 | int32_t idx = 0; | |||||
3641 | int32_t total_size = 0; | |||||
3642 | int32_t offset_offset = 0; | |||||
3643 | int32_t remaining_size = 0; | |||||
3644 | int32_t tmp_count = count; | |||||
3645 | off_t fill_size = 0; | |||||
3646 | uint64_t stripe_size = 0; | |||||
3647 | uint64_t tmp_fctx = 0; | |||||
3648 | off_t dest_offset = 0; | |||||
3649 | off_t rounded_start = 0; | |||||
3650 | off_t rounded_end = 0; | |||||
3651 | int32_t total_chunks = 0; | |||||
3652 | call_frame_t *wframe = NULL((void*)0); | |||||
3653 | stripe_local_t *wlocal = NULL((void*)0); | |||||
3654 | ||||||
3655 | 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!)"), "stripe.c" , __FUNCTION__, 3655, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3656 | 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!)"), "stripe.c" , __FUNCTION__, 3656, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3657 | 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!)"), "stripe.c" , __FUNCTION__, 3657, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
3658 | 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!)" ), "stripe.c", __FUNCTION__, 3658, GF_LOG_WARNING, "invalid argument: " "fd->inode"); } while (0); goto err; } } while (0); | |||||
3659 | ||||||
3660 | inode_ctx_get (fd->inode, this, &tmp_fctx)inode_ctx_get2(fd->inode,this,&tmp_fctx,0); | |||||
3661 | if (!tmp_fctx) { | |||||
3662 | op_errno = EINVAL22; | |||||
3663 | goto err; | |||||
3664 | } | |||||
3665 | fctx = (stripe_fd_ctx_t *)(long)tmp_fctx; | |||||
3666 | stripe_size = fctx->stripe_size; | |||||
3667 | ||||||
3668 | STRIPE_VALIDATE_FCTX (fctx, err)do { int idx = 0; if (!fctx) { op_errno = 22; goto err; } for (idx = 0; idx < fctx->stripe_count; idx++) { if (!fctx ->xl_array[idx]) { do { do { if (0) printf ("fctx->xl_array[%d] is NULL" , idx); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 3668, GF_LOG_ERROR, "fctx->xl_array[%d] is NULL", idx); } while (0); op_errno = 116; goto err; } } } while (0); | |||||
3669 | ||||||
3670 | /* File has to be stripped across the child nodes */ | |||||
3671 | for (idx = 0; idx< count; idx ++) { | |||||
3672 | total_size += vector[idx].iov_len; | |||||
3673 | } | |||||
3674 | remaining_size = total_size; | |||||
3675 | ||||||
3676 | local = mem_get0 (this->local_pool); | |||||
3677 | if (!local) { | |||||
3678 | op_errno = ENOMEM12; | |||||
3679 | goto err; | |||||
3680 | } | |||||
3681 | frame->local = local; | |||||
3682 | local->stripe_size = stripe_size; | |||||
3683 | local->fctx = fctx; | |||||
3684 | ||||||
3685 | if (!stripe_size) { | |||||
3686 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Wrong stripe size for the file"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3687, GF_LOG_DEBUG, "Wrong stripe size for the file"); } while (0) | |||||
3687 | "Wrong stripe size for the file")do { do { if (0) printf ("Wrong stripe size for the file"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 3687, GF_LOG_DEBUG, "Wrong stripe size for the file"); } while (0); | |||||
3688 | op_errno = EINVAL22; | |||||
3689 | goto err; | |||||
3690 | } | |||||
3691 | ||||||
3692 | rounded_start = floor(offset, stripe_size)(((offset)/((stripe_size)?(stripe_size):1))*(stripe_size)); | |||||
3693 | rounded_end = roof(offset + total_size, stripe_size)((((offset + total_size)+(stripe_size)-1)/((stripe_size)?(stripe_size ):1))*(stripe_size)); | |||||
3694 | total_chunks = (rounded_end - rounded_start) / stripe_size; | |||||
3695 | local->replies = GF_CALLOC(total_chunks, sizeof(struct stripe_replies),__gf_calloc (total_chunks, sizeof(struct stripe_replies), gf_stripe_mt_stripe_replies ) | |||||
3696 | gf_stripe_mt_stripe_replies)__gf_calloc (total_chunks, sizeof(struct stripe_replies), gf_stripe_mt_stripe_replies ); | |||||
3697 | if (!local->replies) { | |||||
3698 | op_errno = ENOMEM12; | |||||
3699 | goto err; | |||||
3700 | } | |||||
3701 | ||||||
3702 | total_chunks = 0; | |||||
3703 | while (1) { | |||||
3704 | wframe = copy_frame(frame); | |||||
3705 | wlocal = mem_get0(this->local_pool); | |||||
3706 | if (!wlocal) { | |||||
3707 | op_errno = ENOMEM12; | |||||
3708 | goto err; | |||||
3709 | } | |||||
3710 | wlocal->orig_frame = frame; | |||||
3711 | wframe->local = wlocal; | |||||
3712 | ||||||
3713 | /* Send striped chunk of the vector to child | |||||
3714 | nodes appropriately. */ | |||||
3715 | idx = (((offset + offset_offset) / | |||||
3716 | local->stripe_size) % fctx->stripe_count); | |||||
3717 | ||||||
3718 | fill_size = (local->stripe_size - | |||||
3719 | ((offset + offset_offset) % local->stripe_size)); | |||||
3720 | if (fill_size > remaining_size) | |||||
3721 | fill_size = remaining_size; | |||||
3722 | ||||||
3723 | remaining_size -= fill_size; | |||||
3724 | ||||||
3725 | tmp_count = iov_subset (vector, count, offset_offset, | |||||
3726 | offset_offset + fill_size, NULL((void*)0)); | |||||
3727 | tmp_vec = GF_CALLOC (tmp_count, sizeof (struct iovec),__gf_calloc (tmp_count, sizeof (struct iovec), gf_stripe_mt_iovec ) | |||||
3728 | gf_stripe_mt_iovec)__gf_calloc (tmp_count, sizeof (struct iovec), gf_stripe_mt_iovec ); | |||||
3729 | if (!tmp_vec) { | |||||
3730 | op_errno = ENOMEM12; | |||||
3731 | goto err; | |||||
3732 | } | |||||
3733 | tmp_count = iov_subset (vector, count, offset_offset, | |||||
3734 | offset_offset + fill_size, tmp_vec); | |||||
3735 | ||||||
3736 | local->wind_count++; | |||||
3737 | if (remaining_size == 0) | |||||
3738 | local->unwind = 1; | |||||
3739 | ||||||
3740 | /* | |||||
3741 | * Store off the request index (with respect to the chunk of the | |||||
3742 | * initial offset) and the size of the request. This is required | |||||
3743 | * in the callback to calculate an appropriate return value in | |||||
3744 | * the event of a write failure in one or more requests. | |||||
3745 | */ | |||||
3746 | wlocal->node_index = total_chunks; | |||||
3747 | local->replies[total_chunks].requested_size = fill_size; | |||||
3748 | ||||||
3749 | dest_offset = offset + offset_offset; | |||||
3750 | if (fctx->stripe_coalesce) | |||||
3751 | dest_offset = coalesced_offset(dest_offset, | |||||
3752 | local->stripe_size, fctx->stripe_count); | |||||
3753 | ||||||
3754 | STACK_WIND (wframe, stripe_writev_cbk, fctx->xl_array[idx],do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (wframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3757, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [idx]->fops->writev_cbk) tmp_cbk = stripe_writev_cbk; _new ->root = wframe->root; _new->this = fctx->xl_array [idx]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = wframe ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[idx]->fops->writev"; _new ->unwind_to = "stripe_writev_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&wframe->root-> stack_lock); { _new->next = wframe->root->frames.next ; _new->prev = &wframe->root->frames; if (wframe ->root->frames.next) wframe->root->frames.next-> prev = _new; wframe->root->frames.next = _new; wframe-> ref_count++; } pthread_spin_unlock (&wframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[idx]; if (wframe->this->ctx-> measure_latency) gf_latency_begin (_new, fctx->xl_array[idx ]->fops->writev); fctx->xl_array[idx]->fops->writev (_new, fctx->xl_array[idx], fd, tmp_vec, tmp_count, dest_offset , flags, iobref, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
3755 | fctx->xl_array[idx]->fops->writev, fd, tmp_vec,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (wframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3757, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [idx]->fops->writev_cbk) tmp_cbk = stripe_writev_cbk; _new ->root = wframe->root; _new->this = fctx->xl_array [idx]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = wframe ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[idx]->fops->writev"; _new ->unwind_to = "stripe_writev_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&wframe->root-> stack_lock); { _new->next = wframe->root->frames.next ; _new->prev = &wframe->root->frames; if (wframe ->root->frames.next) wframe->root->frames.next-> prev = _new; wframe->root->frames.next = _new; wframe-> ref_count++; } pthread_spin_unlock (&wframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[idx]; if (wframe->this->ctx-> measure_latency) gf_latency_begin (_new, fctx->xl_array[idx ]->fops->writev); fctx->xl_array[idx]->fops->writev (_new, fctx->xl_array[idx], fd, tmp_vec, tmp_count, dest_offset , flags, iobref, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
3756 | tmp_count, dest_offset, flags, iobref,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (wframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3757, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [idx]->fops->writev_cbk) tmp_cbk = stripe_writev_cbk; _new ->root = wframe->root; _new->this = fctx->xl_array [idx]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = wframe ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[idx]->fops->writev"; _new ->unwind_to = "stripe_writev_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&wframe->root-> stack_lock); { _new->next = wframe->root->frames.next ; _new->prev = &wframe->root->frames; if (wframe ->root->frames.next) wframe->root->frames.next-> prev = _new; wframe->root->frames.next = _new; wframe-> ref_count++; } pthread_spin_unlock (&wframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[idx]; if (wframe->this->ctx-> measure_latency) gf_latency_begin (_new, fctx->xl_array[idx ]->fops->writev); fctx->xl_array[idx]->fops->writev (_new, fctx->xl_array[idx], fd, tmp_vec, tmp_count, dest_offset , flags, iobref, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
3757 | xdata)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (wframe->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3757, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( fctx->xl_array [idx]->fops->writev_cbk) tmp_cbk = stripe_writev_cbk; _new ->root = wframe->root; _new->this = fctx->xl_array [idx]; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = wframe ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "fctx->xl_array[idx]->fops->writev"; _new ->unwind_to = "stripe_writev_cbk"; pthread_spin_init (& _new->lock, 0); pthread_spin_lock (&wframe->root-> stack_lock); { _new->next = wframe->root->frames.next ; _new->prev = &wframe->root->frames; if (wframe ->root->frames.next) wframe->root->frames.next-> prev = _new; wframe->root->frames.next = _new; wframe-> ref_count++; } pthread_spin_unlock (&wframe->root-> stack_lock); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = fctx->xl_array[idx]; if (wframe->this->ctx-> measure_latency) gf_latency_begin (_new, fctx->xl_array[idx ]->fops->writev); fctx->xl_array[idx]->fops->writev (_new, fctx->xl_array[idx], fd, tmp_vec, tmp_count, dest_offset , flags, iobref, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
3758 | ||||||
3759 | GF_FREE (tmp_vec)__gf_free (tmp_vec); | |||||
3760 | offset_offset += fill_size; | |||||
3761 | total_chunks++; | |||||
3762 | if (remaining_size == 0) | |||||
3763 | break; | |||||
3764 | } | |||||
3765 | ||||||
3766 | return 0; | |||||
3767 | err: | |||||
3768 | if (wframe) | |||||
3769 | STRIPE_STACK_DESTROY(wframe)do { stripe_local_t *__local = ((void*)0); __local = wframe-> local; wframe->local = ((void*)0); STACK_DESTROY (wframe-> root); if (__local) { stripe_local_wipe (__local); mem_put (__local ); } } while (0); | |||||
3770 | ||||||
3771 | STRIPE_STACK_UNWIND (writev, frame, -1, op_errno, NULL, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __local = frame->local; frame->local = ((void*)0); } do { fop_writev_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", "stripe.c", __FUNCTION__ , 3771, GF_LOG_CRITICAL, "!frame"); } while (0); break; } fn = (fop_writev_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); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
3772 | return 0; | |||||
3773 | } | |||||
3774 | ||||||
3775 | ||||||
3776 | int32_t | |||||
3777 | stripe_release (xlator_t *this, fd_t *fd) | |||||
3778 | { | |||||
3779 | return 0; | |||||
3780 | } | |||||
3781 | ||||||
3782 | int | |||||
3783 | stripe_forget (xlator_t *this, inode_t *inode) | |||||
3784 | { | |||||
3785 | uint64_t tmp_fctx = 0; | |||||
3786 | stripe_fd_ctx_t *fctx = NULL((void*)0); | |||||
3787 | ||||||
3788 | 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!)"), "stripe.c" , __FUNCTION__, 3788, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3789 | VALIDATE_OR_GOTO (inode, err)do { if (!inode) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "inode"); } while (0); _gf_log_callingfn ((this ? (this->name) : "(Govinda! Govinda!)"), "stripe.c" , __FUNCTION__, 3789, GF_LOG_WARNING, "invalid argument: " "inode" ); } while (0); goto err; } } while (0); | |||||
3790 | ||||||
3791 | (void) inode_ctx_del (inode, this, &tmp_fctx)inode_ctx_del2(inode,this,&tmp_fctx,0); | |||||
3792 | if (!tmp_fctx) { | |||||
3793 | goto err; | |||||
3794 | } | |||||
3795 | ||||||
3796 | fctx = (stripe_fd_ctx_t *)(long)tmp_fctx; | |||||
3797 | ||||||
3798 | if (!fctx->static_array) | |||||
3799 | GF_FREE (fctx->xl_array)__gf_free (fctx->xl_array); | |||||
3800 | ||||||
3801 | GF_FREE (fctx)__gf_free (fctx); | |||||
3802 | err: | |||||
3803 | return 0; | |||||
3804 | } | |||||
3805 | ||||||
3806 | int32_t | |||||
3807 | notify (xlator_t *this, int32_t event, void *data, ...) | |||||
3808 | { | |||||
3809 | stripe_private_t *priv = NULL((void*)0); | |||||
3810 | int down_client = 0; | |||||
3811 | int i = 0; | |||||
3812 | gf_boolean_t heard_from_all_children = _gf_false; | |||||
3813 | ||||||
3814 | if (!this) | |||||
3815 | return 0; | |||||
3816 | ||||||
3817 | priv = this->private; | |||||
3818 | if (!priv) | |||||
3819 | return 0; | |||||
3820 | ||||||
3821 | switch (event) | |||||
3822 | { | |||||
3823 | case GF_EVENT_CHILD_UP: | |||||
3824 | { | |||||
3825 | /* get an index number to set */ | |||||
3826 | for (i = 0; i < priv->child_count; i++) { | |||||
3827 | if (data == priv->xl_array[i]) | |||||
3828 | break; | |||||
3829 | } | |||||
3830 | ||||||
3831 | if (priv->child_count == i) { | |||||
3832 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("got GF_EVENT_CHILD_UP bad subvolume %s" , data? ((xlator_t *)data)->name: ((void*)0)); } while (0) ; _gf_log (this->name, "stripe.c", __FUNCTION__, 3834, GF_LOG_ERROR , "got GF_EVENT_CHILD_UP bad subvolume %s", data? ((xlator_t * )data)->name: ((void*)0)); } while (0) | |||||
3833 | "got GF_EVENT_CHILD_UP bad subvolume %s",do { do { if (0) printf ("got GF_EVENT_CHILD_UP bad subvolume %s" , data? ((xlator_t *)data)->name: ((void*)0)); } while (0) ; _gf_log (this->name, "stripe.c", __FUNCTION__, 3834, GF_LOG_ERROR , "got GF_EVENT_CHILD_UP bad subvolume %s", data? ((xlator_t * )data)->name: ((void*)0)); } while (0) | |||||
3834 | data? ((xlator_t *)data)->name: NULL)do { do { if (0) printf ("got GF_EVENT_CHILD_UP bad subvolume %s" , data? ((xlator_t *)data)->name: ((void*)0)); } while (0) ; _gf_log (this->name, "stripe.c", __FUNCTION__, 3834, GF_LOG_ERROR , "got GF_EVENT_CHILD_UP bad subvolume %s", data? ((xlator_t * )data)->name: ((void*)0)); } while (0); | |||||
3835 | break; | |||||
3836 | } | |||||
3837 | ||||||
3838 | LOCK (&priv->lock)pthread_spin_lock (&priv->lock); | |||||
3839 | { | |||||
3840 | if (data == FIRST_CHILD (this)(this->children->xlator)) | |||||
3841 | priv->first_child_down = 0; | |||||
3842 | priv->last_event[i] = event; | |||||
3843 | } | |||||
3844 | UNLOCK (&priv->lock)pthread_spin_unlock (&priv->lock); | |||||
3845 | } | |||||
3846 | break; | |||||
3847 | case GF_EVENT_CHILD_CONNECTING: | |||||
3848 | { | |||||
3849 | // 'CONNECTING' doesn't ensure its CHILD_UP, so do nothing | |||||
3850 | goto out; | |||||
3851 | } | |||||
3852 | case GF_EVENT_CHILD_DOWN: | |||||
3853 | { | |||||
3854 | /* get an index number to set */ | |||||
3855 | for (i = 0; i < priv->child_count; i++) { | |||||
3856 | if (data == priv->xl_array[i]) | |||||
3857 | break; | |||||
3858 | } | |||||
3859 | ||||||
3860 | if (priv->child_count == i) { | |||||
3861 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("got GF_EVENT_CHILD_DOWN bad subvolume %s" , data? ((xlator_t *)data)->name: ((void*)0)); } while (0) ; _gf_log (this->name, "stripe.c", __FUNCTION__, 3863, GF_LOG_ERROR , "got GF_EVENT_CHILD_DOWN bad subvolume %s", data? ((xlator_t *)data)->name: ((void*)0)); } while (0) | |||||
3862 | "got GF_EVENT_CHILD_DOWN bad subvolume %s",do { do { if (0) printf ("got GF_EVENT_CHILD_DOWN bad subvolume %s" , data? ((xlator_t *)data)->name: ((void*)0)); } while (0) ; _gf_log (this->name, "stripe.c", __FUNCTION__, 3863, GF_LOG_ERROR , "got GF_EVENT_CHILD_DOWN bad subvolume %s", data? ((xlator_t *)data)->name: ((void*)0)); } while (0) | |||||
3863 | data? ((xlator_t *)data)->name: NULL)do { do { if (0) printf ("got GF_EVENT_CHILD_DOWN bad subvolume %s" , data? ((xlator_t *)data)->name: ((void*)0)); } while (0) ; _gf_log (this->name, "stripe.c", __FUNCTION__, 3863, GF_LOG_ERROR , "got GF_EVENT_CHILD_DOWN bad subvolume %s", data? ((xlator_t *)data)->name: ((void*)0)); } while (0); | |||||
3864 | break; | |||||
3865 | } | |||||
3866 | ||||||
3867 | LOCK (&priv->lock)pthread_spin_lock (&priv->lock); | |||||
3868 | { | |||||
3869 | if (data == FIRST_CHILD (this)(this->children->xlator)) | |||||
3870 | priv->first_child_down = 1; | |||||
3871 | priv->last_event[i] = event; | |||||
3872 | } | |||||
3873 | UNLOCK (&priv->lock)pthread_spin_unlock (&priv->lock); | |||||
3874 | } | |||||
3875 | break; | |||||
3876 | ||||||
3877 | default: | |||||
3878 | { | |||||
3879 | /* */ | |||||
3880 | default_notify (this, event, data); | |||||
3881 | goto out; | |||||
3882 | } | |||||
3883 | break; | |||||
3884 | } | |||||
3885 | ||||||
3886 | // Consider child as down if it's last_event is not CHILD_UP | |||||
3887 | for (i = 0, down_client = 0; i < priv->child_count; i++) | |||||
3888 | if (priv->last_event[i] != GF_EVENT_CHILD_UP) | |||||
3889 | down_client++; | |||||
3890 | ||||||
3891 | LOCK (&priv->lock)pthread_spin_lock (&priv->lock); | |||||
3892 | { | |||||
3893 | priv->nodes_down = down_client; | |||||
3894 | } | |||||
3895 | UNLOCK (&priv->lock)pthread_spin_unlock (&priv->lock); | |||||
3896 | ||||||
3897 | heard_from_all_children = _gf_true; | |||||
3898 | for (i = 0; i < priv->child_count; i++) | |||||
3899 | if (!priv->last_event[i]) | |||||
3900 | heard_from_all_children = _gf_false; | |||||
3901 | ||||||
3902 | if (heard_from_all_children) | |||||
3903 | default_notify (this, event, data); | |||||
3904 | out: | |||||
3905 | return 0; | |||||
3906 | } | |||||
3907 | ||||||
3908 | int | |||||
3909 | stripe_setxattr_cbk (call_frame_t *frame, void *cookie, | |||||
3910 | xlator_t *this, int op_ret, int op_errno, dict_t *xdata) | |||||
3911 | { | |||||
3912 | int ret = -1; | |||||
3913 | int call_cnt = 0; | |||||
3914 | stripe_local_t *local = NULL((void*)0); | |||||
3915 | ||||||
3916 | if (!frame || !frame->local || !this) { | |||||
3917 | gf_log ("", GF_LOG_ERROR, "Possible NULL deref")do { do { if (0) printf ("Possible NULL deref"); } while (0); _gf_log ("", "stripe.c", __FUNCTION__, 3917, GF_LOG_ERROR, "Possible NULL deref" ); } while (0); | |||||
3918 | return ret; | |||||
3919 | } | |||||
3920 | ||||||
3921 | local = frame->local; | |||||
3922 | ||||||
3923 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
3924 | { | |||||
3925 | call_cnt = --local->wind_count; | |||||
3926 | ||||||
3927 | /** | |||||
3928 | * We overwrite ->op_* values here for subsequent faliure | |||||
3929 | * conditions, hence we propogate the last errno down the | |||||
3930 | * stack. | |||||
3931 | */ | |||||
3932 | if (op_ret < 0) { | |||||
3933 | local->op_ret = op_ret; | |||||
3934 | local->op_errno = op_errno; | |||||
3935 | goto unlock; | |||||
3936 | } | |||||
3937 | } | |||||
3938 | ||||||
3939 | unlock: | |||||
3940 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
3941 | ||||||
3942 | if (!call_cnt) { | |||||
3943 | STRIPE_STACK_UNWIND (setxattr, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 3944, 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, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
3944 | local->op_errno, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 3944, 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, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
3945 | } | |||||
3946 | ||||||
3947 | return 0; | |||||
3948 | } | |||||
3949 | ||||||
3950 | int | |||||
3951 | stripe_setxattr (call_frame_t *frame, xlator_t *this, | |||||
3952 | loc_t *loc, dict_t *dict, int flags, dict_t *xdata) | |||||
3953 | { | |||||
3954 | int32_t op_errno = EINVAL22; | |||||
3955 | xlator_list_t *trav = NULL((void*)0); | |||||
3956 | stripe_private_t *priv = NULL((void*)0); | |||||
3957 | stripe_local_t *local = NULL((void*)0); | |||||
3958 | int i = 0; | |||||
3959 | ||||||
3960 | 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!)"), "stripe.c" , __FUNCTION__, 3960, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
3961 | 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!)"), "stripe.c" , __FUNCTION__, 3961, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
3962 | 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!)"), "stripe.c" , __FUNCTION__, 3962, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
3963 | 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!)" ), "stripe.c", __FUNCTION__, 3963, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
3964 | ||||||
3965 | GF_IF_INTERNAL_XATTR_GOTO ("trusted.*stripe*", dict,do { if (!dict) { do { do { if (0) printf ("setxattr dict is null" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 3966, GF_LOG_ERROR, "setxattr dict is null"); } while (0); goto err; } if (dict_foreach_fnmatch (dict, "trusted.*stripe*", dict_null_foreach_fn , ((void*)0)) > 0) { op_errno = 1; do { do { if (0) printf ("attempt to set internal" " xattr: %s: %s", "trusted.*stripe*" , strerror (op_errno)); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 3966, GF_LOG_ERROR, "attempt to set internal" " xattr: %s: %s", "trusted.*stripe*", strerror (op_errno)); } while (0); goto err; } } while (0) | |||||
3966 | op_errno, err)do { if (!dict) { do { do { if (0) printf ("setxattr dict is null" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 3966, GF_LOG_ERROR, "setxattr dict is null"); } while (0); goto err; } if (dict_foreach_fnmatch (dict, "trusted.*stripe*", dict_null_foreach_fn , ((void*)0)) > 0) { op_errno = 1; do { do { if (0) printf ("attempt to set internal" " xattr: %s: %s", "trusted.*stripe*" , strerror (op_errno)); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 3966, GF_LOG_ERROR, "attempt to set internal" " xattr: %s: %s", "trusted.*stripe*", strerror (op_errno)); } while (0); goto err; } } while (0); | |||||
3967 | ||||||
3968 | priv = this->private; | |||||
3969 | trav = this->children; | |||||
3970 | ||||||
3971 | local = mem_get0 (this->local_pool); | |||||
3972 | if (!local) { | |||||
3973 | op_errno = ENOMEM12; | |||||
3974 | goto err; | |||||
3975 | } | |||||
3976 | ||||||
3977 | frame->local = local; | |||||
3978 | local->wind_count = priv->child_count; | |||||
3979 | local->op_ret = local->op_errno = 0; | |||||
3980 | ||||||
3981 | /** | |||||
3982 | * Set xattrs for directories on all subvolumes. Additionally | |||||
3983 | * this power is only given to a special client. | |||||
3984 | */ | |||||
3985 | if ((frame->root->pid == GF_CLIENT_PID_GSYNCD) && IA_ISDIR (loc->inode->ia_type)(loc->inode->ia_type == IA_IFDIR)) { | |||||
3986 | for (i = 0; i < priv->child_count; i++, trav = trav->next) { | |||||
3987 | STACK_WIND (frame, stripe_setxattr_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", "stripe.c", __FUNCTION__, 3989, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->setxattr_cbk) tmp_cbk = stripe_setxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->setxattr"; _new->unwind_to = "stripe_setxattr_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->setxattr); trav->xlator-> fops->setxattr (_new, trav->xlator, loc, dict, flags, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3988 | trav->xlator, trav->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", "stripe.c", __FUNCTION__, 3989, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->setxattr_cbk) tmp_cbk = stripe_setxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->setxattr"; _new->unwind_to = "stripe_setxattr_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->setxattr); trav->xlator-> fops->setxattr (_new, trav->xlator, loc, dict, flags, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
3989 | loc, dict, 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", "stripe.c", __FUNCTION__, 3989, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->setxattr_cbk) tmp_cbk = stripe_setxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->setxattr"; _new->unwind_to = "stripe_setxattr_cbk"; pthread_spin_init (&_new->lock , 0); pthread_spin_lock (&frame->root->stack_lock); { _new->next = frame->root->frames.next; _new->prev = &frame->root->frames; if (frame->root->frames .next) frame->root->frames.next->prev = _new; frame-> root->frames.next = _new; frame->ref_count++; } pthread_spin_unlock (&frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->setxattr); trav->xlator-> fops->setxattr (_new, trav->xlator, loc, dict, flags, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
3990 | } | |||||
3991 | } else { | |||||
3992 | local->wind_count = 1; | |||||
3993 | STACK_WIND (frame, stripe_setxattr_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", "stripe.c", __FUNCTION__, 3996, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->setxattr_cbk) tmp_cbk = stripe_setxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->setxattr" ; _new->unwind_to = "stripe_setxattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->setxattr); (this->children->xlator )->fops->setxattr (_new, (this->children->xlator) , loc, dict, flags, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
3994 | FIRST_CHILD(this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 3996, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->setxattr_cbk) tmp_cbk = stripe_setxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->setxattr" ; _new->unwind_to = "stripe_setxattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->setxattr); (this->children->xlator )->fops->setxattr (_new, (this->children->xlator) , loc, dict, flags, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
3995 | FIRST_CHILD(this)->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", "stripe.c", __FUNCTION__, 3996, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->setxattr_cbk) tmp_cbk = stripe_setxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->setxattr" ; _new->unwind_to = "stripe_setxattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->setxattr); (this->children->xlator )->fops->setxattr (_new, (this->children->xlator) , loc, dict, flags, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
3996 | loc, dict, 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", "stripe.c", __FUNCTION__, 3996, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->setxattr_cbk) tmp_cbk = stripe_setxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->setxattr" ; _new->unwind_to = "stripe_setxattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->setxattr); (this->children->xlator )->fops->setxattr (_new, (this->children->xlator) , loc, dict, flags, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
3997 | } | |||||
3998 | ||||||
3999 | return 0; | |||||
4000 | err: | |||||
4001 | STRIPE_STACK_UNWIND (setxattr, frame, -1, op_errno, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4001, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4002 | return 0; | |||||
4003 | } | |||||
4004 | ||||||
4005 | ||||||
4006 | int | |||||
4007 | stripe_fsetxattr_cbk (call_frame_t *frame, void *cookie, | |||||
4008 | xlator_t *this, int op_ret, int op_errno, dict_t *xdata) | |||||
4009 | { | |||||
4010 | STRIPE_STACK_UNWIND (fsetxattr, frame, op_ret, op_errno, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4010, 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, op_ret, op_errno, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4011 | return 0; | |||||
4012 | } | |||||
4013 | ||||||
4014 | ||||||
4015 | int | |||||
4016 | stripe_is_lockinfo (dict_t *this, | |||||
4017 | char *key, | |||||
4018 | data_t *value, | |||||
4019 | void *data) | |||||
4020 | { | |||||
4021 | gf_boolean_t *is_lockinfo = NULL((void*)0); | |||||
4022 | ||||||
4023 | if (data == NULL((void*)0)) { | |||||
4024 | goto out; | |||||
4025 | } | |||||
4026 | ||||||
4027 | is_lockinfo = data; | |||||
4028 | ||||||
4029 | if (XATTR_IS_LOCKINFO (key)(strncmp (key, "trusted.glusterfs.lockinfo", strlen ("trusted.glusterfs.lockinfo" )) == 0)) | |||||
4030 | *is_lockinfo = _gf_true; | |||||
4031 | ||||||
4032 | out: | |||||
4033 | return 0; | |||||
4034 | } | |||||
4035 | ||||||
4036 | int32_t | |||||
4037 | stripe_fsetxattr_everyone_cbk (call_frame_t *frame, void *cookie, | |||||
4038 | xlator_t *this, int32_t op_ret, int32_t op_errno, | |||||
4039 | dict_t *xdata) | |||||
4040 | { | |||||
4041 | int call_count = 0; | |||||
4042 | stripe_local_t *local = NULL((void*)0); | |||||
4043 | ||||||
4044 | local = frame->local; | |||||
4045 | ||||||
4046 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4047 | { | |||||
4048 | call_count = --local->wind_count; | |||||
4049 | ||||||
4050 | if (op_ret < 0) { | |||||
4051 | local->op_ret = op_ret; | |||||
4052 | local->op_errno = op_errno; | |||||
4053 | } | |||||
4054 | } | |||||
4055 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4056 | ||||||
4057 | if (call_count == 0) { | |||||
4058 | STRIPE_STACK_UNWIND (fsetxattr, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4059, 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, local->op_ret, local->op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
4059 | local->op_errno, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4059, 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, local->op_ret, local->op_errno, ((void*)0)); (*__glusterfs_this_location()) = old_THIS; } while (0); if ( __local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
4060 | } | |||||
4061 | return 0; | |||||
4062 | } | |||||
4063 | ||||||
4064 | int | |||||
4065 | stripe_fsetxattr_to_everyone (call_frame_t *frame, xlator_t *this, fd_t *fd, | |||||
4066 | dict_t *dict, int flags, dict_t *xdata) | |||||
4067 | { | |||||
4068 | xlator_list_t *trav = NULL((void*)0); | |||||
4069 | stripe_private_t *priv = NULL((void*)0); | |||||
4070 | int ret = -1; | |||||
4071 | stripe_local_t *local = NULL((void*)0); | |||||
4072 | ||||||
4073 | priv = this->private; | |||||
4074 | ||||||
4075 | local = mem_get0 (this->local_pool); | |||||
4076 | if (local == NULL((void*)0)) { | |||||
4077 | goto out; | |||||
4078 | } | |||||
4079 | ||||||
4080 | frame->local = local; | |||||
4081 | ||||||
4082 | local->wind_count = priv->child_count; | |||||
4083 | ||||||
4084 | trav = this->children; | |||||
4085 | ||||||
4086 | while (trav) { | |||||
4087 | STACK_WIND (frame, stripe_fsetxattr_everyone_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", "stripe.c", __FUNCTION__, 4089, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsetxattr_cbk) tmp_cbk = stripe_fsetxattr_everyone_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->fsetxattr"; _new ->unwind_to = "stripe_fsetxattr_everyone_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->fsetxattr ); trav->xlator->fops->fsetxattr (_new, trav->xlator , fd, dict, flags, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4088 | trav->xlator, trav->xlator->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", "stripe.c", __FUNCTION__, 4089, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsetxattr_cbk) tmp_cbk = stripe_fsetxattr_everyone_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->fsetxattr"; _new ->unwind_to = "stripe_fsetxattr_everyone_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->fsetxattr ); trav->xlator->fops->fsetxattr (_new, trav->xlator , fd, dict, flags, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4089 | fd, dict, 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", "stripe.c", __FUNCTION__, 4089, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fsetxattr_cbk) tmp_cbk = stripe_fsetxattr_everyone_cbk ; _new->root = frame->root; _new->this = trav->xlator ; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->fsetxattr"; _new ->unwind_to = "stripe_fsetxattr_everyone_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (frame->this->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->fsetxattr ); trav->xlator->fops->fsetxattr (_new, trav->xlator , fd, dict, flags, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4090 | trav = trav->next; | |||||
4091 | } | |||||
4092 | ||||||
4093 | ret = 0; | |||||
4094 | out: | |||||
4095 | return ret; | |||||
4096 | } | |||||
4097 | ||||||
4098 | inline gf_boolean_t | |||||
4099 | stripe_fsetxattr_is_special (dict_t *dict) | |||||
4100 | { | |||||
4101 | gf_boolean_t is_spl = _gf_false; | |||||
4102 | ||||||
4103 | if (dict == NULL((void*)0)) { | |||||
4104 | goto out; | |||||
4105 | } | |||||
4106 | ||||||
4107 | dict_foreach (dict, stripe_is_lockinfo, &is_spl); | |||||
4108 | ||||||
4109 | out: | |||||
4110 | return is_spl; | |||||
4111 | } | |||||
4112 | ||||||
4113 | int | |||||
4114 | stripe_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, | |||||
4115 | dict_t *dict, int flags, dict_t *xdata) | |||||
4116 | { | |||||
4117 | int32_t op_ret = -1, ret = -1, op_errno = EINVAL22; | |||||
4118 | gf_boolean_t is_spl = _gf_false; | |||||
4119 | ||||||
4120 | 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!)"), "stripe.c" , __FUNCTION__, 4120, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4121 | 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!)"), "stripe.c" , __FUNCTION__, 4121, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4122 | 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!)"), "stripe.c" , __FUNCTION__, 4122, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
4123 | ||||||
4124 | GF_IF_INTERNAL_XATTR_GOTO ("trusted.*stripe*", dict,do { if (!dict) { do { do { if (0) printf ("setxattr dict is null" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4125, GF_LOG_ERROR, "setxattr dict is null"); } while (0); goto err; } if (dict_foreach_fnmatch (dict, "trusted.*stripe*", dict_null_foreach_fn , ((void*)0)) > 0) { op_errno = 1; do { do { if (0) printf ("attempt to set internal" " xattr: %s: %s", "trusted.*stripe*" , strerror (op_errno)); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 4125, GF_LOG_ERROR, "attempt to set internal" " xattr: %s: %s", "trusted.*stripe*", strerror (op_errno)); } while (0); goto err; } } while (0) | |||||
4125 | op_errno, err)do { if (!dict) { do { do { if (0) printf ("setxattr dict is null" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4125, GF_LOG_ERROR, "setxattr dict is null"); } while (0); goto err; } if (dict_foreach_fnmatch (dict, "trusted.*stripe*", dict_null_foreach_fn , ((void*)0)) > 0) { op_errno = 1; do { do { if (0) printf ("attempt to set internal" " xattr: %s: %s", "trusted.*stripe*" , strerror (op_errno)); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 4125, GF_LOG_ERROR, "attempt to set internal" " xattr: %s: %s", "trusted.*stripe*", strerror (op_errno)); } while (0); goto err; } } while (0); | |||||
4126 | ||||||
4127 | is_spl = stripe_fsetxattr_is_special (dict); | |||||
4128 | if (is_spl) { | |||||
4129 | ret = stripe_fsetxattr_to_everyone (frame, this, fd, dict, | |||||
4130 | flags, xdata); | |||||
4131 | if (ret < 0) { | |||||
4132 | op_errno = ENOMEM12; | |||||
4133 | goto err; | |||||
4134 | } | |||||
4135 | ||||||
4136 | goto out; | |||||
4137 | } | |||||
4138 | ||||||
4139 | STACK_WIND (frame, stripe_fsetxattr_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", "stripe.c", __FUNCTION__, 4142, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fsetxattr_cbk) tmp_cbk = stripe_fsetxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fsetxattr" ; _new->unwind_to = "stripe_fsetxattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fsetxattr); (this->children-> xlator)->fops->fsetxattr (_new, (this->children-> xlator), fd, dict, flags, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4140 | FIRST_CHILD(this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 4142, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fsetxattr_cbk) tmp_cbk = stripe_fsetxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fsetxattr" ; _new->unwind_to = "stripe_fsetxattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fsetxattr); (this->children-> xlator)->fops->fsetxattr (_new, (this->children-> xlator), fd, dict, flags, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4141 | FIRST_CHILD(this)->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", "stripe.c", __FUNCTION__, 4142, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fsetxattr_cbk) tmp_cbk = stripe_fsetxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fsetxattr" ; _new->unwind_to = "stripe_fsetxattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fsetxattr); (this->children-> xlator)->fops->fsetxattr (_new, (this->children-> xlator), fd, dict, flags, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4142 | fd, dict, 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", "stripe.c", __FUNCTION__, 4142, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fsetxattr_cbk) tmp_cbk = stripe_fsetxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fsetxattr" ; _new->unwind_to = "stripe_fsetxattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fsetxattr); (this->children-> xlator)->fops->fsetxattr (_new, (this->children-> xlator), fd, dict, flags, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
4143 | out: | |||||
4144 | return 0; | |||||
4145 | err: | |||||
4146 | STRIPE_STACK_UNWIND (fsetxattr, frame, op_ret, op_errno, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4146, 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, op_ret, op_errno, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4147 | return 0; | |||||
4148 | } | |||||
4149 | ||||||
4150 | int | |||||
4151 | stripe_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4152 | int32_t op_ret, int32_t op_errno, dict_t *xdata) | |||||
4153 | { | |||||
4154 | STRIPE_STACK_UNWIND (removexattr, frame, op_ret, op_errno, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4154, 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, op_ret, op_errno, xdata); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4155 | return 0; | |||||
4156 | } | |||||
4157 | ||||||
4158 | int | |||||
4159 | stripe_removexattr (call_frame_t *frame, xlator_t *this, | |||||
4160 | loc_t *loc, const char *name, dict_t *xdata) | |||||
4161 | { | |||||
4162 | int32_t op_errno = EINVAL22; | |||||
4163 | ||||||
4164 | 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!)"), "stripe.c" , __FUNCTION__, 4164, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4165 | ||||||
4166 | GF_IF_NATIVE_XATTR_GOTO ("trusted.*stripe*",do { if (!name) { do { do { if (0) printf ("no key for removexattr" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4167, GF_LOG_ERROR, "no key for removexattr"); } while (0); goto err; } if (!fnmatch ("trusted.*stripe*", name, 0)) { op_errno = 1; do { do { if (0) printf ("attempt to remove internal " "xattr: %s: %s" , name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 4167, GF_LOG_ERROR, "attempt to remove internal " "xattr: %s: %s", name, strerror (op_errno)); } while (0); goto err; } } while (0) | |||||
4167 | name, op_errno, err)do { if (!name) { do { do { if (0) printf ("no key for removexattr" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4167, GF_LOG_ERROR, "no key for removexattr"); } while (0); goto err; } if (!fnmatch ("trusted.*stripe*", name, 0)) { op_errno = 1; do { do { if (0) printf ("attempt to remove internal " "xattr: %s: %s" , name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 4167, GF_LOG_ERROR, "attempt to remove internal " "xattr: %s: %s", name, strerror (op_errno)); } while (0); goto err; } } while (0); | |||||
4168 | ||||||
4169 | 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!)"), "stripe.c" , __FUNCTION__, 4169, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4170 | 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!)"), "stripe.c" , __FUNCTION__, 4170, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
4171 | ||||||
4172 | STACK_WIND (frame, stripe_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", "stripe.c", __FUNCTION__, 4175, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->removexattr_cbk) tmp_cbk = stripe_removexattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->removexattr" ; _new->unwind_to = "stripe_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->removexattr); (this->children-> xlator)->fops->removexattr (_new, (this->children-> xlator), loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4173 | FIRST_CHILD(this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 4175, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->removexattr_cbk) tmp_cbk = stripe_removexattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->removexattr" ; _new->unwind_to = "stripe_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->removexattr); (this->children-> xlator)->fops->removexattr (_new, (this->children-> xlator), loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4174 | FIRST_CHILD(this)->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", "stripe.c", __FUNCTION__, 4175, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->removexattr_cbk) tmp_cbk = stripe_removexattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->removexattr" ; _new->unwind_to = "stripe_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->removexattr); (this->children-> xlator)->fops->removexattr (_new, (this->children-> xlator), loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4175 | loc, name, 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", "stripe.c", __FUNCTION__, 4175, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->removexattr_cbk) tmp_cbk = stripe_removexattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->removexattr" ; _new->unwind_to = "stripe_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->removexattr); (this->children-> xlator)->fops->removexattr (_new, (this->children-> xlator), loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4176 | return 0; | |||||
4177 | err: | |||||
4178 | STRIPE_STACK_UNWIND (removexattr, frame, -1, op_errno, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4178, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4179 | return 0; | |||||
4180 | } | |||||
4181 | ||||||
4182 | ||||||
4183 | int | |||||
4184 | stripe_fremovexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4185 | int32_t op_ret, int32_t op_errno, dict_t *xdata) | |||||
4186 | { | |||||
4187 | STRIPE_STACK_UNWIND (fremovexattr, frame, op_ret, op_errno, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4187, 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, op_ret , op_errno, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
4188 | return 0; | |||||
4189 | } | |||||
4190 | ||||||
4191 | int | |||||
4192 | stripe_fremovexattr (call_frame_t *frame, xlator_t *this, | |||||
4193 | fd_t *fd, const char *name, dict_t *xdata) | |||||
4194 | { | |||||
4195 | int32_t op_ret = -1; | |||||
4196 | int32_t op_errno = EINVAL22; | |||||
4197 | ||||||
4198 | 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!)"), "stripe.c" , __FUNCTION__, 4198, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4199 | 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!)"), "stripe.c" , __FUNCTION__, 4199, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4200 | 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!)"), "stripe.c" , __FUNCTION__, 4200, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
4201 | ||||||
4202 | GF_IF_NATIVE_XATTR_GOTO ("trusted.*stripe*",do { if (!name) { do { do { if (0) printf ("no key for removexattr" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4203, GF_LOG_ERROR, "no key for removexattr"); } while (0); goto err; } if (!fnmatch ("trusted.*stripe*", name, 0)) { op_errno = 1; do { do { if (0) printf ("attempt to remove internal " "xattr: %s: %s" , name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 4203, GF_LOG_ERROR, "attempt to remove internal " "xattr: %s: %s", name, strerror (op_errno)); } while (0); goto err; } } while (0) | |||||
4203 | name, op_errno, err)do { if (!name) { do { do { if (0) printf ("no key for removexattr" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4203, GF_LOG_ERROR, "no key for removexattr"); } while (0); goto err; } if (!fnmatch ("trusted.*stripe*", name, 0)) { op_errno = 1; do { do { if (0) printf ("attempt to remove internal " "xattr: %s: %s" , name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 4203, GF_LOG_ERROR, "attempt to remove internal " "xattr: %s: %s", name, strerror (op_errno)); } while (0); goto err; } } while (0); | |||||
4204 | ||||||
4205 | STACK_WIND (frame, stripe_fremovexattr_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", "stripe.c", __FUNCTION__, 4208, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fremovexattr_cbk) tmp_cbk = stripe_fremovexattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fremovexattr" ; _new->unwind_to = "stripe_fremovexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fremovexattr); (this->children-> xlator)->fops->fremovexattr (_new, (this->children-> xlator), fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4206 | FIRST_CHILD(this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 4208, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fremovexattr_cbk) tmp_cbk = stripe_fremovexattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fremovexattr" ; _new->unwind_to = "stripe_fremovexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fremovexattr); (this->children-> xlator)->fops->fremovexattr (_new, (this->children-> xlator), fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4207 | FIRST_CHILD(this)->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", "stripe.c", __FUNCTION__, 4208, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fremovexattr_cbk) tmp_cbk = stripe_fremovexattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fremovexattr" ; _new->unwind_to = "stripe_fremovexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fremovexattr); (this->children-> xlator)->fops->fremovexattr (_new, (this->children-> xlator), fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
4208 | fd, name, 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", "stripe.c", __FUNCTION__, 4208, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fremovexattr_cbk) tmp_cbk = stripe_fremovexattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fremovexattr" ; _new->unwind_to = "stripe_fremovexattr_cbk"; pthread_spin_init (&_new->lock, 0); pthread_spin_lock (&frame->root ->stack_lock); { _new->next = frame->root->frames .next; _new->prev = &frame->root->frames; if (frame ->root->frames.next) frame->root->frames.next-> prev = _new; frame->root->frames.next = _new; frame-> ref_count++; } pthread_spin_unlock (&frame->root->stack_lock ); old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fremovexattr); (this->children-> xlator)->fops->fremovexattr (_new, (this->children-> xlator), fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
4209 | return 0; | |||||
4210 | err: | |||||
4211 | STRIPE_STACK_UNWIND (fremovexattr, frame, op_ret, op_errno, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4211, 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, op_ret , op_errno, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
4212 | return 0; | |||||
4213 | } | |||||
4214 | ||||||
4215 | int32_t | |||||
4216 | stripe_readdirp_lookup_cbk (call_frame_t *frame, void *cookie, | |||||
4217 | xlator_t *this, int op_ret, int op_errno, | |||||
4218 | inode_t *inode, struct iatt *stbuf, | |||||
4219 | dict_t *xattr, struct iatt *parent) | |||||
4220 | { | |||||
4221 | stripe_local_t *local = NULL((void*)0); | |||||
4222 | call_frame_t *main_frame = NULL((void*)0); | |||||
4223 | stripe_local_t *main_local = NULL((void*)0); | |||||
4224 | gf_dirent_t *entry = NULL((void*)0); | |||||
4225 | call_frame_t *prev = NULL((void*)0); | |||||
4226 | int done = 0; | |||||
4227 | ||||||
4228 | local = frame->local; | |||||
4229 | prev = cookie; | |||||
4230 | ||||||
4231 | entry = local->dirent; | |||||
4232 | ||||||
4233 | main_frame = local->orig_frame; | |||||
4234 | main_local = main_frame->local; | |||||
4235 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4236 | { | |||||
4237 | ||||||
4238 | local->call_count--; | |||||
4239 | if (!local->call_count) | |||||
4240 | done = 1; | |||||
4241 | if (op_ret == -1) { | |||||
4242 | local->op_errno = op_errno; | |||||
4243 | local->op_ret = op_ret; | |||||
4244 | goto unlock; | |||||
4245 | } | |||||
4246 | ||||||
4247 | if (stripe_ctx_handle(this, prev, local, xattr)) | |||||
4248 | gf_log(this->name, GF_LOG_ERROR,do { do { if (0) printf ("Error getting fctx info from dict." ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4249, GF_LOG_ERROR, "Error getting fctx info from dict."); } while (0) | |||||
4249 | "Error getting fctx info from dict.")do { do { if (0) printf ("Error getting fctx info from dict." ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4249, GF_LOG_ERROR, "Error getting fctx info from dict."); } while (0); | |||||
4250 | ||||||
4251 | correct_file_size(stbuf, local->fctx, prev); | |||||
4252 | ||||||
4253 | stripe_iatt_merge (stbuf, &entry->d_stat); | |||||
4254 | local->stbuf_blocks += stbuf->ia_blocks; | |||||
4255 | } | |||||
4256 | unlock: | |||||
4257 | UNLOCK(&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4258 | ||||||
4259 | if (done) { | |||||
4260 | inode_ctx_put (entry->inode, this, | |||||
4261 | (uint64_t) (long)local->fctx); | |||||
4262 | ||||||
4263 | done = 0; | |||||
4264 | LOCK (&main_frame->lock)pthread_spin_lock (&main_frame->lock); | |||||
4265 | { | |||||
4266 | main_local->wind_count--; | |||||
4267 | if (!main_local->wind_count) | |||||
4268 | done = 1; | |||||
4269 | if (local->op_ret == -1) { | |||||
4270 | main_local->op_errno = local->op_errno; | |||||
4271 | main_local->op_ret = local->op_ret; | |||||
4272 | } | |||||
4273 | entry->d_stat.ia_blocks = local->stbuf_blocks; | |||||
4274 | } | |||||
4275 | UNLOCK (&main_frame->lock)pthread_spin_unlock (&main_frame->lock); | |||||
4276 | if (done) { | |||||
4277 | main_frame->local = NULL((void*)0); | |||||
4278 | STRIPE_STACK_UNWIND (readdir, main_frame,do { stripe_local_t *__local = ((void*)0); if (main_frame) { __local = main_frame->local; main_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 (!main_frame ) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ( "stack", "stripe.c", __FUNCTION__, 4281, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_readdir_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, main_local->op_ret , main_local->op_errno, &main_local->entries, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) ; if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0) | |||||
4279 | main_local->op_ret,do { stripe_local_t *__local = ((void*)0); if (main_frame) { __local = main_frame->local; main_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 (!main_frame ) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ( "stack", "stripe.c", __FUNCTION__, 4281, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_readdir_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, main_local->op_ret , main_local->op_errno, &main_local->entries, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) ; if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0) | |||||
4280 | main_local->op_errno,do { stripe_local_t *__local = ((void*)0); if (main_frame) { __local = main_frame->local; main_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 (!main_frame ) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ( "stack", "stripe.c", __FUNCTION__, 4281, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_readdir_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, main_local->op_ret , main_local->op_errno, &main_local->entries, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) ; if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0) | |||||
4281 | &main_local->entries, NULL)do { stripe_local_t *__local = ((void*)0); if (main_frame) { __local = main_frame->local; main_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 (!main_frame ) { do { do { if (0) printf ("!frame"); } while (0); _gf_log ( "stack", "stripe.c", __FUNCTION__, 4281, GF_LOG_CRITICAL, "!frame" ); } while (0); break; } fn = (fop_readdir_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, main_local->op_ret , main_local->op_errno, &main_local->entries, ((void *)0)); (*__glusterfs_this_location()) = old_THIS; } while (0) ; if (__local) { stripe_local_wipe(__local); mem_put (__local ); } } while (0); | |||||
4282 | gf_dirent_free (&main_local->entries); | |||||
4283 | stripe_local_wipe (main_local); | |||||
4284 | mem_put (main_local); | |||||
4285 | } | |||||
4286 | frame->local = NULL((void*)0); | |||||
4287 | stripe_local_wipe (local); | |||||
4288 | mem_put (local); | |||||
4289 | STRIPE_STACK_DESTROY (frame)do { stripe_local_t *__local = ((void*)0); __local = frame-> local; frame->local = ((void*)0); STACK_DESTROY (frame-> root); if (__local) { stripe_local_wipe (__local); mem_put (__local ); } } while (0); | |||||
4290 | } | |||||
4291 | ||||||
4292 | return 0; | |||||
4293 | } | |||||
4294 | ||||||
4295 | int32_t | |||||
4296 | stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4297 | int32_t op_ret, int32_t op_errno, | |||||
4298 | gf_dirent_t *orig_entries, dict_t *xdata) | |||||
4299 | { | |||||
4300 | stripe_local_t *local = NULL((void*)0); | |||||
4301 | call_frame_t *prev = NULL((void*)0); | |||||
4302 | gf_dirent_t *local_entry = NULL((void*)0); | |||||
4303 | gf_dirent_t *tmp_entry = NULL((void*)0); | |||||
4304 | xlator_list_t *trav = NULL((void*)0); | |||||
4305 | loc_t loc = {0, }; | |||||
4306 | int32_t count = 0; | |||||
4307 | stripe_private_t *priv = NULL((void*)0); | |||||
4308 | int32_t subvols = 0; | |||||
4309 | dict_t *xattrs = NULL((void*)0); | |||||
4310 | call_frame_t *local_frame = NULL((void*)0); | |||||
4311 | stripe_local_t *local_ent = NULL((void*)0); | |||||
4312 | ||||||
4313 | if (!this || !frame || !frame->local || !cookie) { | |||||
4314 | gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref")do { do { if (0) printf ("possible NULL deref"); } while (0); _gf_log ("stripe", "stripe.c", __FUNCTION__, 4314, GF_LOG_DEBUG , "possible NULL deref"); } while (0); | |||||
4315 | goto out; | |||||
4316 | } | |||||
4317 | prev = cookie; | |||||
4318 | local = frame->local; | |||||
4319 | trav = this->children; | |||||
4320 | priv = this->private; | |||||
4321 | ||||||
4322 | subvols = priv->child_count; | |||||
4323 | ||||||
4324 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4325 | { | |||||
4326 | if (op_ret == -1) { | |||||
4327 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 4329, GF_LOG_WARNING, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
4328 | "%s returned error %s",do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 4329, GF_LOG_WARNING, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0) | |||||
4329 | prev->this->name, strerror (op_errno))do { do { if (0) printf ("%s returned error %s", prev->this ->name, strerror (op_errno)); } while (0); _gf_log (this-> name, "stripe.c", __FUNCTION__, 4329, GF_LOG_WARNING, "%s returned error %s" , prev->this->name, strerror (op_errno)); } while (0); | |||||
4330 | local->op_errno = op_errno; | |||||
4331 | local->op_ret = op_ret; | |||||
4332 | goto unlock; | |||||
4333 | } else { | |||||
4334 | local->op_ret = op_ret; | |||||
4335 | list_splice_init (&orig_entries->list, | |||||
4336 | &local->entries.list); | |||||
4337 | local->wind_count = op_ret; | |||||
4338 | } | |||||
4339 | ||||||
4340 | } | |||||
4341 | unlock: | |||||
4342 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4343 | ||||||
4344 | if (op_ret == -1) | |||||
4345 | goto out; | |||||
4346 | ||||||
4347 | xattrs = dict_new (); | |||||
4348 | if (xattrs) | |||||
4349 | (void) stripe_xattr_request_build (this, xattrs, 0, 0, 0, 0); | |||||
4350 | count = op_ret; | |||||
4351 | list_for_each_entry_safe (local_entry, tmp_entry,for (local_entry = ((typeof(*local_entry) *)((char *)(((& local->entries.list))->next)-(unsigned long)(&((typeof (*local_entry) *)0)->list))), tmp_entry = ((typeof(*local_entry ) *)((char *)(local_entry->list.next)-(unsigned long)(& ((typeof(*local_entry) *)0)->list))); &local_entry-> list != ((&local->entries.list)); local_entry = tmp_entry , tmp_entry = ((typeof(*tmp_entry) *)((char *)(tmp_entry-> list.next)-(unsigned long)(&((typeof(*tmp_entry) *)0)-> list)))) | |||||
4352 | (&local->entries.list), list)for (local_entry = ((typeof(*local_entry) *)((char *)(((& local->entries.list))->next)-(unsigned long)(&((typeof (*local_entry) *)0)->list))), tmp_entry = ((typeof(*local_entry ) *)((char *)(local_entry->list.next)-(unsigned long)(& ((typeof(*local_entry) *)0)->list))); &local_entry-> list != ((&local->entries.list)); local_entry = tmp_entry , tmp_entry = ((typeof(*tmp_entry) *)((char *)(tmp_entry-> list.next)-(unsigned long)(&((typeof(*tmp_entry) *)0)-> list)))) { | |||||
4353 | ||||||
4354 | if (!local_entry) | |||||
4355 | break; | |||||
4356 | if (!IA_ISREG (local_entry->d_stat.ia_type)(local_entry->d_stat.ia_type == IA_IFREG)) { | |||||
4357 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4358 | { | |||||
4359 | local->wind_count--; | |||||
4360 | count = local->wind_count; | |||||
4361 | } | |||||
4362 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4363 | continue; | |||||
4364 | } | |||||
4365 | ||||||
4366 | local_frame = copy_frame (frame); | |||||
4367 | ||||||
4368 | if (!local_frame) { | |||||
4369 | op_errno = ENOMEM12; | |||||
4370 | op_ret = -1; | |||||
4371 | goto out; | |||||
4372 | } | |||||
4373 | ||||||
4374 | local_ent = mem_get0 (this->local_pool); | |||||
4375 | if (!local_ent) { | |||||
4376 | op_errno = ENOMEM12; | |||||
4377 | op_ret = -1; | |||||
4378 | goto out; | |||||
4379 | } | |||||
4380 | ||||||
4381 | loc.inode = inode_ref (local_entry->inode); | |||||
4382 | ||||||
4383 | uuid_copy (loc.gfid, local_entry->d_stat.ia_gfid); | |||||
4384 | ||||||
4385 | local_ent->orig_frame = frame; | |||||
4386 | ||||||
4387 | local_ent->call_count = subvols; | |||||
4388 | ||||||
4389 | local_ent->dirent = local_entry; | |||||
4390 | ||||||
4391 | local_frame->local = local_ent; | |||||
4392 | ||||||
4393 | trav = this->children; | |||||
4394 | while (trav) { | |||||
4395 | STACK_WIND (local_frame, stripe_readdirp_lookup_cbk,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (local_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 4397 , GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( trav->xlator->fops->lookup_cbk) tmp_cbk = stripe_readdirp_lookup_cbk ; _new->root = local_frame->root; _new->this = trav-> xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = local_frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->lookup"; _new-> unwind_to = "stripe_readdirp_lookup_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&local_frame-> root->stack_lock); { _new->next = local_frame->root-> frames.next; _new->prev = &local_frame->root->frames ; if (local_frame->root->frames.next) local_frame->root ->frames.next->prev = _new; local_frame->root->frames .next = _new; local_frame->ref_count++; } pthread_spin_unlock (&local_frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (local_frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->lookup); trav->xlator->fops ->lookup (_new, trav->xlator, &loc, xattrs); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4396 | trav->xlator, trav->xlator->fops->lookup,do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (local_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 4397 , GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( trav->xlator->fops->lookup_cbk) tmp_cbk = stripe_readdirp_lookup_cbk ; _new->root = local_frame->root; _new->this = trav-> xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = local_frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->lookup"; _new-> unwind_to = "stripe_readdirp_lookup_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&local_frame-> root->stack_lock); { _new->next = local_frame->root-> frames.next; _new->prev = &local_frame->root->frames ; if (local_frame->root->frames.next) local_frame->root ->frames.next->prev = _new; local_frame->root->frames .next = _new; local_frame->ref_count++; } pthread_spin_unlock (&local_frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (local_frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->lookup); trav->xlator->fops ->lookup (_new, trav->xlator, &loc, xattrs); (*__glusterfs_this_location ()) = old_THIS; } while (0) | |||||
4397 | &loc, xattrs)do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (local_frame->root->pool-> frame_mem_pool); if (!_new) { do { do { if (0) printf ("alloc failed" ); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 4397 , GF_LOG_ERROR, "alloc failed"); } while (0); break; } typeof ( trav->xlator->fops->lookup_cbk) tmp_cbk = stripe_readdirp_lookup_cbk ; _new->root = local_frame->root; _new->this = trav-> xlator; _new->ret = (ret_fn_t) tmp_cbk; _new->parent = local_frame ; _new->cookie = _new; _new->wind_from = __FUNCTION__; _new ->wind_to = "trav->xlator->fops->lookup"; _new-> unwind_to = "stripe_readdirp_lookup_cbk"; pthread_spin_init ( &_new->lock, 0); pthread_spin_lock (&local_frame-> root->stack_lock); { _new->next = local_frame->root-> frames.next; _new->prev = &local_frame->root->frames ; if (local_frame->root->frames.next) local_frame->root ->frames.next->prev = _new; local_frame->root->frames .next = _new; local_frame->ref_count++; } pthread_spin_unlock (&local_frame->root->stack_lock); old_THIS = (*__glusterfs_this_location ()); (*__glusterfs_this_location()) = trav->xlator; if (local_frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->lookup); trav->xlator->fops ->lookup (_new, trav->xlator, &loc, xattrs); (*__glusterfs_this_location ()) = old_THIS; } while (0); | |||||
4398 | trav = trav->next; | |||||
4399 | } | |||||
4400 | loc_wipe (&loc); | |||||
4401 | } | |||||
4402 | out: | |||||
4403 | if (!count) { | |||||
4404 | /* all entries are directories */ | |||||
4405 | frame->local = NULL((void*)0); | |||||
4406 | STRIPE_STACK_UNWIND (readdir, frame, local->op_ret,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4407, 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, local->op_ret, local->op_errno, &local-> entries, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
4407 | local->op_errno, &local->entries, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4407, 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, local->op_ret, local->op_errno, &local-> entries, ((void*)0)); (*__glusterfs_this_location()) = old_THIS ; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
4408 | gf_dirent_free (&local->entries); | |||||
4409 | stripe_local_wipe (local); | |||||
4410 | mem_put (local); | |||||
4411 | } | |||||
4412 | if (xattrs) | |||||
4413 | dict_unref (xattrs); | |||||
4414 | return 0; | |||||
4415 | ||||||
4416 | } | |||||
4417 | int32_t | |||||
4418 | stripe_readdirp (call_frame_t *frame, xlator_t *this, | |||||
4419 | fd_t *fd, size_t size, off_t off, dict_t *xdata) | |||||
4420 | { | |||||
4421 | stripe_local_t *local = NULL((void*)0); | |||||
4422 | stripe_private_t *priv = NULL((void*)0); | |||||
4423 | xlator_list_t *trav = NULL((void*)0); | |||||
4424 | int op_errno = -1; | |||||
4425 | ||||||
4426 | 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!)"), "stripe.c" , __FUNCTION__, 4426, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4427 | 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!)"), "stripe.c" , __FUNCTION__, 4427, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4428 | 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!)"), "stripe.c" , __FUNCTION__, 4428, GF_LOG_WARNING, "invalid argument: " "fd" ); } while (0); goto err; } } while (0); | |||||
4429 | ||||||
4430 | priv = this->private; | |||||
4431 | trav = this->children; | |||||
4432 | ||||||
4433 | if (priv->first_child_down) { | |||||
4434 | op_errno = ENOTCONN107; | |||||
4435 | goto err; | |||||
4436 | } | |||||
4437 | ||||||
4438 | /* Initialization */ | |||||
4439 | local = mem_get0 (this->local_pool); | |||||
4440 | if (!local) { | |||||
4441 | op_errno = ENOMEM12; | |||||
4442 | goto err; | |||||
4443 | } | |||||
4444 | ||||||
4445 | frame->local = local; | |||||
4446 | ||||||
4447 | local->fd = fd_ref (fd); | |||||
4448 | ||||||
4449 | local->wind_count = 0; | |||||
4450 | ||||||
4451 | local->count = 0; | |||||
4452 | local->op_ret = -1; | |||||
4453 | INIT_LIST_HEAD(&local->entries)do { (&local->entries)->next = (&local->entries )->prev = &local->entries; } while (0); | |||||
4454 | ||||||
4455 | if (!trav) | |||||
4456 | goto err; | |||||
4457 | ||||||
4458 | STACK_WIND (frame, stripe_readdirp_cbk, trav->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", "stripe.c", __FUNCTION__, 4459, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->readdirp_cbk) tmp_cbk = stripe_readdirp_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->readdirp"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->readdirp); trav->xlator-> fops->readdirp (_new, trav->xlator, fd, size, off, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4459 | trav->xlator->fops->readdirp, fd, size, off, 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", "stripe.c", __FUNCTION__, 4459, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->readdirp_cbk) tmp_cbk = stripe_readdirp_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->readdirp"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->readdirp); trav->xlator-> fops->readdirp (_new, trav->xlator, fd, size, off, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0); | |||||
4460 | return 0; | |||||
4461 | err: | |||||
4462 | op_errno = (op_errno == -1) ? errno(*__errno_location ()) : op_errno; | |||||
4463 | STRIPE_STACK_UNWIND (readdir, frame, -1, op_errno, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4463, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4464 | ||||||
4465 | return 0; | |||||
4466 | ||||||
4467 | } | |||||
4468 | ||||||
4469 | int32_t | |||||
4470 | mem_acct_init (xlator_t *this) | |||||
4471 | { | |||||
4472 | int ret = -1; | |||||
4473 | ||||||
4474 | if (!this) | |||||
4475 | goto out; | |||||
4476 | ||||||
4477 | ret = xlator_mem_acct_init (this, gf_stripe_mt_end + 1); | |||||
4478 | ||||||
4479 | if (ret != 0) { | |||||
4480 | gf_log (this->name, GF_LOG_ERROR, "Memory accounting init"do { do { if (0) printf ("Memory accounting init" "failed"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4481, GF_LOG_ERROR, "Memory accounting init" "failed"); } while (0) | |||||
4481 | "failed")do { do { if (0) printf ("Memory accounting init" "failed"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4481, GF_LOG_ERROR, "Memory accounting init" "failed"); } while (0); | |||||
4482 | goto out; | |||||
4483 | } | |||||
4484 | ||||||
4485 | out: | |||||
4486 | return ret; | |||||
4487 | } | |||||
4488 | ||||||
4489 | static int | |||||
4490 | clear_pattern_list (stripe_private_t *priv) | |||||
4491 | { | |||||
4492 | struct stripe_options *prev = NULL((void*)0); | |||||
4493 | struct stripe_options *trav = NULL((void*)0); | |||||
4494 | int ret = -1; | |||||
4495 | ||||||
4496 | GF_VALIDATE_OR_GOTO ("stripe", priv, out)do { if (!priv) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "priv"); } while (0); _gf_log_callingfn ("stripe", "stripe.c", __FUNCTION__, 4496, GF_LOG_ERROR, "invalid argument: " "priv"); } while (0); goto out; } } while (0); | |||||
4497 | ||||||
4498 | trav = priv->pattern; | |||||
4499 | priv->pattern = NULL((void*)0); | |||||
4500 | while (trav) { | |||||
4501 | prev = trav; | |||||
4502 | trav = trav->next; | |||||
4503 | GF_FREE (prev)__gf_free (prev); | |||||
4504 | } | |||||
4505 | ||||||
4506 | ret = 0; | |||||
4507 | out: | |||||
4508 | return ret; | |||||
4509 | ||||||
4510 | ||||||
4511 | } | |||||
4512 | ||||||
4513 | ||||||
4514 | int | |||||
4515 | reconfigure (xlator_t *this, dict_t *options) | |||||
4516 | { | |||||
4517 | ||||||
4518 | stripe_private_t *priv = NULL((void*)0); | |||||
4519 | data_t *data = NULL((void*)0); | |||||
4520 | int ret = -1; | |||||
4521 | volume_option_t *opt = NULL((void*)0); | |||||
4522 | ||||||
4523 | GF_ASSERT (this)do { if (!(this)) { do { do { if (0) printf ("Assertion failed: " "this"); } while (0); _gf_log_callingfn ("", "stripe.c", __FUNCTION__ , 4523, GF_LOG_ERROR, "Assertion failed: " "this"); } while ( 0); } } while (0); | |||||
4524 | GF_ASSERT (this->private)do { if (!(this->private)) { do { do { if (0) printf ("Assertion failed: " "this->private"); } while (0); _gf_log_callingfn ("", "stripe.c" , __FUNCTION__, 4524, GF_LOG_ERROR, "Assertion failed: " "this->private" ); } while (0); } } while (0); | |||||
4525 | ||||||
4526 | priv = this->private; | |||||
4527 | ||||||
4528 | ||||||
4529 | ret = 0; | |||||
4530 | LOCK (&priv->lock)pthread_spin_lock (&priv->lock); | |||||
4531 | { | |||||
4532 | ret = clear_pattern_list (priv); | |||||
4533 | if (ret) | |||||
4534 | goto unlock; | |||||
4535 | ||||||
4536 | data = dict_get (options, "block-size"); | |||||
4537 | if (data) { | |||||
4538 | ret = set_stripe_block_size (this, priv, data->data); | |||||
4539 | if (ret) | |||||
4540 | goto unlock; | |||||
4541 | } else { | |||||
4542 | opt = xlator_volume_option_get (this, "block-size"); | |||||
4543 | if (!opt) { | |||||
4544 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("option 'block-size' not found"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4545, GF_LOG_WARNING, "option 'block-size' not found"); } while (0 ) | |||||
4545 | "option 'block-size' not found")do { do { if (0) printf ("option 'block-size' not found"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4545, GF_LOG_WARNING, "option 'block-size' not found"); } while (0 ); | |||||
4546 | ret = -1; | |||||
4547 | goto unlock; | |||||
4548 | } | |||||
4549 | ||||||
4550 | if (gf_string2bytesize (opt->default_value, &priv->block_size)){ | |||||
4551 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Unable to set default block-size ") ; } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4552, GF_LOG_ERROR, "Unable to set default block-size "); } while (0) | |||||
4552 | "Unable to set default block-size ")do { do { if (0) printf ("Unable to set default block-size ") ; } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4552, GF_LOG_ERROR, "Unable to set default block-size "); } while (0); | |||||
4553 | ret = -1; | |||||
4554 | goto unlock; | |||||
4555 | } | |||||
4556 | } | |||||
4557 | ||||||
4558 | GF_OPTION_RECONF("coalesce", priv->coalesce, options, bool,do { int val_ret = 0; val_ret = xlator_option_reconf_bool ((* __glusterfs_this_location()), options, "coalesce", &(priv ->coalesce)); if (val_ret) goto unlock; } while (0) | |||||
4559 | unlock)do { int val_ret = 0; val_ret = xlator_option_reconf_bool ((* __glusterfs_this_location()), options, "coalesce", &(priv ->coalesce)); if (val_ret) goto unlock; } while (0); | |||||
4560 | } | |||||
4561 | unlock: | |||||
4562 | UNLOCK (&priv->lock)pthread_spin_unlock (&priv->lock); | |||||
4563 | if (ret) | |||||
4564 | goto out; | |||||
4565 | ||||||
4566 | ret = 0; | |||||
4567 | out: | |||||
4568 | return ret; | |||||
4569 | ||||||
4570 | } | |||||
4571 | ||||||
4572 | /** | |||||
4573 | * init - This function is called when xlator-graph gets initialized. | |||||
4574 | * The option given in volfiles are parsed here. | |||||
4575 | * @this - | |||||
4576 | */ | |||||
4577 | int32_t | |||||
4578 | init (xlator_t *this) | |||||
4579 | { | |||||
4580 | stripe_private_t *priv = NULL((void*)0); | |||||
4581 | volume_option_t *opt = NULL((void*)0); | |||||
4582 | xlator_list_t *trav = NULL((void*)0); | |||||
4583 | data_t *data = NULL((void*)0); | |||||
4584 | int32_t count = 0; | |||||
4585 | int ret = -1; | |||||
4586 | ||||||
4587 | if (!this) | |||||
4588 | goto out; | |||||
4589 | ||||||
4590 | trav = this->children; | |||||
4591 | while (trav) { | |||||
4592 | count++; | |||||
4593 | trav = trav->next; | |||||
4594 | } | |||||
4595 | ||||||
4596 | if (!count) { | |||||
4597 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("stripe configured without \"subvolumes\" option. " "exiting"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4599, GF_LOG_ERROR, "stripe configured without \"subvolumes\" option. " "exiting"); } while (0) | |||||
4598 | "stripe configured without \"subvolumes\" option. "do { do { if (0) printf ("stripe configured without \"subvolumes\" option. " "exiting"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4599, GF_LOG_ERROR, "stripe configured without \"subvolumes\" option. " "exiting"); } while (0) | |||||
4599 | "exiting")do { do { if (0) printf ("stripe configured without \"subvolumes\" option. " "exiting"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4599, GF_LOG_ERROR, "stripe configured without \"subvolumes\" option. " "exiting"); } while (0); | |||||
4600 | goto out; | |||||
4601 | } | |||||
4602 | ||||||
4603 | if (!this->parents) { | |||||
4604 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("dangling volume. check volfile "); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4605, GF_LOG_WARNING, "dangling volume. check volfile "); } while (0) | |||||
4605 | "dangling volume. check volfile ")do { do { if (0) printf ("dangling volume. check volfile "); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4605, GF_LOG_WARNING, "dangling volume. check volfile "); } while (0); | |||||
4606 | } | |||||
4607 | ||||||
4608 | if (count == 1) { | |||||
4609 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("stripe configured with only one \"subvolumes\" option." " please check the volume. exiting"); } while (0); _gf_log ( this->name, "stripe.c", __FUNCTION__, 4611, GF_LOG_ERROR, "stripe configured with only one \"subvolumes\" option." " please check the volume. exiting"); } while (0) | |||||
4610 | "stripe configured with only one \"subvolumes\" option."do { do { if (0) printf ("stripe configured with only one \"subvolumes\" option." " please check the volume. exiting"); } while (0); _gf_log ( this->name, "stripe.c", __FUNCTION__, 4611, GF_LOG_ERROR, "stripe configured with only one \"subvolumes\" option." " please check the volume. exiting"); } while (0) | |||||
4611 | " please check the volume. exiting")do { do { if (0) printf ("stripe configured with only one \"subvolumes\" option." " please check the volume. exiting"); } while (0); _gf_log ( this->name, "stripe.c", __FUNCTION__, 4611, GF_LOG_ERROR, "stripe configured with only one \"subvolumes\" option." " please check the volume. exiting"); } while (0); | |||||
4612 | goto out; | |||||
4613 | } | |||||
4614 | ||||||
4615 | priv = GF_CALLOC (1, sizeof (stripe_private_t),__gf_calloc (1, sizeof (stripe_private_t), gf_stripe_mt_stripe_private_t ) | |||||
4616 | gf_stripe_mt_stripe_private_t)__gf_calloc (1, sizeof (stripe_private_t), gf_stripe_mt_stripe_private_t ); | |||||
4617 | ||||||
4618 | if (!priv) | |||||
4619 | goto out; | |||||
4620 | priv->xl_array = GF_CALLOC (count, sizeof (xlator_t *),__gf_calloc (count, sizeof (xlator_t *), gf_stripe_mt_xlator_t ) | |||||
4621 | gf_stripe_mt_xlator_t)__gf_calloc (count, sizeof (xlator_t *), gf_stripe_mt_xlator_t ); | |||||
4622 | if (!priv->xl_array) | |||||
4623 | goto out; | |||||
4624 | ||||||
4625 | priv->last_event = GF_CALLOC (count, sizeof (int),__gf_calloc (count, sizeof (int), gf_stripe_mt_int32_t) | |||||
4626 | gf_stripe_mt_int32_t)__gf_calloc (count, sizeof (int), gf_stripe_mt_int32_t); | |||||
4627 | if (!priv->last_event) | |||||
4628 | goto out; | |||||
4629 | ||||||
4630 | priv->child_count = count; | |||||
4631 | LOCK_INIT (&priv->lock)pthread_spin_init (&priv->lock, 0); | |||||
4632 | ||||||
4633 | trav = this->children; | |||||
4634 | count = 0; | |||||
4635 | while (trav) { | |||||
4636 | priv->xl_array[count++] = trav->xlator; | |||||
4637 | trav = trav->next; | |||||
4638 | } | |||||
4639 | ||||||
4640 | if (count > 256) { | |||||
4641 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("maximum number of stripe subvolumes supported " "is 256"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4643, GF_LOG_ERROR, "maximum number of stripe subvolumes supported " "is 256"); } while (0) | |||||
4642 | "maximum number of stripe subvolumes supported "do { do { if (0) printf ("maximum number of stripe subvolumes supported " "is 256"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4643, GF_LOG_ERROR, "maximum number of stripe subvolumes supported " "is 256"); } while (0) | |||||
4643 | "is 256")do { do { if (0) printf ("maximum number of stripe subvolumes supported " "is 256"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4643, GF_LOG_ERROR, "maximum number of stripe subvolumes supported " "is 256"); } while (0); | |||||
4644 | goto out; | |||||
4645 | } | |||||
4646 | ||||||
4647 | ret = 0; | |||||
4648 | LOCK (&priv->lock)pthread_spin_lock (&priv->lock); | |||||
4649 | { | |||||
4650 | opt = xlator_volume_option_get (this, "block-size"); | |||||
4651 | if (!opt) { | |||||
4652 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("option 'block-size' not found"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4653, GF_LOG_WARNING, "option 'block-size' not found"); } while (0 ) | |||||
4653 | "option 'block-size' not found")do { do { if (0) printf ("option 'block-size' not found"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4653, GF_LOG_WARNING, "option 'block-size' not found"); } while (0 ); | |||||
4654 | ret = -1; | |||||
4655 | goto unlock; | |||||
4656 | } | |||||
4657 | if (gf_string2bytesize (opt->default_value, &priv->block_size)){ | |||||
4658 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Unable to set default block-size ") ; } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4659, GF_LOG_ERROR, "Unable to set default block-size "); } while (0) | |||||
4659 | "Unable to set default block-size ")do { do { if (0) printf ("Unable to set default block-size ") ; } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4659, GF_LOG_ERROR, "Unable to set default block-size "); } while (0); | |||||
4660 | ret = -1; | |||||
4661 | goto unlock; | |||||
4662 | } | |||||
4663 | /* option stripe-pattern *avi:1GB,*pdf:16K */ | |||||
4664 | data = dict_get (this->options, "block-size"); | |||||
4665 | if (data) { | |||||
4666 | ret = set_stripe_block_size (this, priv, data->data); | |||||
4667 | if (ret) | |||||
4668 | goto unlock; | |||||
4669 | } | |||||
4670 | } | |||||
4671 | unlock: | |||||
4672 | UNLOCK (&priv->lock)pthread_spin_unlock (&priv->lock); | |||||
4673 | if (ret) | |||||
4674 | goto out; | |||||
4675 | ||||||
4676 | GF_OPTION_INIT ("use-xattr", priv->xattr_supported, bool, out)do { int val_ret = 0; val_ret = xlator_option_init_bool ((*__glusterfs_this_location ()), (*__glusterfs_this_location())->options, "use-xattr", &(priv->xattr_supported)); if (val_ret) goto out; } while (0); | |||||
4677 | /* notify related */ | |||||
4678 | priv->nodes_down = priv->child_count; | |||||
4679 | ||||||
4680 | GF_OPTION_INIT("coalesce", priv->coalesce, bool, out)do { int val_ret = 0; val_ret = xlator_option_init_bool ((*__glusterfs_this_location ()), (*__glusterfs_this_location())->options, "coalesce", & (priv->coalesce)); if (val_ret) goto out; } while (0); | |||||
4681 | ||||||
4682 | this->local_pool = mem_pool_new (stripe_local_t, 128)mem_pool_new_fn (sizeof(stripe_local_t), 128, "stripe_local_t" ); | |||||
4683 | if (!this->local_pool) { | |||||
4684 | ret = -1; | |||||
4685 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to create local_t's memory pool" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4686, GF_LOG_ERROR, "failed to create local_t's memory pool" ); } while (0) | |||||
4686 | "failed to create local_t's memory pool")do { do { if (0) printf ("failed to create local_t's memory pool" ); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4686, GF_LOG_ERROR, "failed to create local_t's memory pool" ); } while (0); | |||||
4687 | goto out; | |||||
4688 | } | |||||
4689 | ||||||
4690 | this->private = priv; | |||||
4691 | ||||||
4692 | ret = 0; | |||||
4693 | out: | |||||
4694 | if (ret) { | |||||
4695 | if (priv) { | |||||
4696 | GF_FREE (priv->xl_array)__gf_free (priv->xl_array); | |||||
4697 | GF_FREE (priv)__gf_free (priv); | |||||
4698 | } | |||||
4699 | } | |||||
4700 | return ret; | |||||
4701 | } | |||||
4702 | ||||||
4703 | /** | |||||
4704 | * fini - Free all the private variables | |||||
4705 | * @this - | |||||
4706 | */ | |||||
4707 | void | |||||
4708 | fini (xlator_t *this) | |||||
4709 | { | |||||
4710 | stripe_private_t *priv = NULL((void*)0); | |||||
4711 | struct stripe_options *prev = NULL((void*)0); | |||||
4712 | struct stripe_options *trav = NULL((void*)0); | |||||
4713 | ||||||
4714 | if (!this) | |||||
4715 | goto out; | |||||
4716 | ||||||
4717 | priv = this->private; | |||||
4718 | if (priv) { | |||||
4719 | this->private = NULL((void*)0); | |||||
4720 | GF_FREE (priv->xl_array)__gf_free (priv->xl_array); | |||||
4721 | ||||||
4722 | trav = priv->pattern; | |||||
4723 | while (trav) { | |||||
4724 | prev = trav; | |||||
4725 | trav = trav->next; | |||||
4726 | GF_FREE (prev)__gf_free (prev); | |||||
4727 | } | |||||
4728 | GF_FREE (priv->last_event)__gf_free (priv->last_event); | |||||
4729 | LOCK_DESTROY (&priv->lock)pthread_spin_destroy (&priv->lock); | |||||
4730 | GF_FREE (priv)__gf_free (priv); | |||||
4731 | } | |||||
4732 | ||||||
4733 | out: | |||||
4734 | return; | |||||
4735 | } | |||||
4736 | ||||||
4737 | int32_t | |||||
4738 | stripe_getxattr_unwind (call_frame_t *frame, | |||||
4739 | int op_ret, int op_errno, dict_t *dict, dict_t *xdata) | |||||
4740 | ||||||
4741 | { | |||||
4742 | STRIPE_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4742, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4743 | return 0; | |||||
4744 | } | |||||
4745 | ||||||
4746 | int | |||||
4747 | stripe_internal_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4748 | int op_ret, int op_errno, dict_t *xattr, | |||||
4749 | dict_t *xdata) | |||||
4750 | { | |||||
4751 | ||||||
4752 | char size_key[256] = {0,}; | |||||
4753 | char index_key[256] = {0,}; | |||||
4754 | char count_key[256] = {0,}; | |||||
4755 | char coalesce_key[256] = {0,}; | |||||
4756 | ||||||
4757 | 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!)"), "stripe.c" , __FUNCTION__, 4757, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto out; } } while (0); | |||||
4758 | 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!)" ), "stripe.c", __FUNCTION__, 4758, GF_LOG_WARNING, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
4759 | ||||||
4760 | if (!xattr || (op_ret == -1)) | |||||
4761 | goto out; | |||||
4762 | ||||||
4763 | sprintf (size_key, "trusted.%s.stripe-size", this->name); | |||||
4764 | sprintf (count_key, "trusted.%s.stripe-count", this->name); | |||||
4765 | sprintf (index_key, "trusted.%s.stripe-index", this->name); | |||||
4766 | sprintf (coalesce_key, "trusted.%s.stripe-coalesce", this->name); | |||||
4767 | ||||||
4768 | dict_del (xattr, size_key); | |||||
4769 | dict_del (xattr, count_key); | |||||
4770 | dict_del (xattr, index_key); | |||||
4771 | dict_del (xattr, coalesce_key); | |||||
4772 | ||||||
4773 | out: | |||||
4774 | STRIPE_STACK_UNWIND (getxattr, frame, op_ret, op_errno, xattr, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4774, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4775 | ||||||
4776 | return 0; | |||||
4777 | ||||||
4778 | } | |||||
4779 | ||||||
4780 | int | |||||
4781 | stripe_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, | |||||
4782 | int op_ret, int op_errno, dict_t *xattr, dict_t *xdata) | |||||
4783 | { | |||||
4784 | int call_cnt = 0; | |||||
4785 | stripe_local_t *local = NULL((void*)0); | |||||
| ||||||
4786 | ||||||
4787 | 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!)"), "stripe.c" , __FUNCTION__, 4787, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto out; } } while (0); | |||||
4788 | 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!)" ), "stripe.c", __FUNCTION__, 4788, GF_LOG_WARNING, "invalid argument: " "frame->local"); } while (0); goto out; } } while (0); | |||||
4789 | ||||||
4790 | local = frame->local; | |||||
4791 | ||||||
4792 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4793 | { | |||||
4794 | call_cnt = --local->wind_count; | |||||
4795 | } | |||||
4796 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4797 | ||||||
4798 | if (!xattr || (op_ret < 0)) | |||||
4799 | goto out; | |||||
4800 | ||||||
4801 | local->op_ret = 0; | |||||
4802 | ||||||
4803 | if (!local->xattr) { | |||||
4804 | local->xattr = dict_ref (xattr); | |||||
4805 | } else { | |||||
4806 | stripe_aggregate_xattr (local->xattr, xattr); | |||||
4807 | } | |||||
4808 | ||||||
4809 | out: | |||||
4810 | if (!call_cnt) { | |||||
4811 | STRIPE_STACK_UNWIND (getxattr, frame, local->op_ret, op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4812, 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, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0) | |||||
| ||||||
4812 | local->xattr, xdata)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4812, 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, xdata ); (*__glusterfs_this_location()) = old_THIS; } while (0); if (__local) { stripe_local_wipe(__local); mem_put (__local); } } while (0); | |||||
4813 | } | |||||
4814 | ||||||
4815 | return 0; | |||||
4816 | } | |||||
4817 | ||||||
4818 | int32_t | |||||
4819 | stripe_vgetxattr_cbk (call_frame_t *frame, void *cookie, | |||||
4820 | xlator_t *this, int32_t op_ret, int32_t op_errno, | |||||
4821 | dict_t *dict, dict_t *xdata) | |||||
4822 | { | |||||
4823 | stripe_local_t *local = NULL((void*)0); | |||||
4824 | int32_t callcnt = 0; | |||||
4825 | int32_t ret = -1; | |||||
4826 | long cky = 0; | |||||
4827 | void *xattr_val = NULL((void*)0); | |||||
4828 | void *xattr_serz = NULL((void*)0); | |||||
4829 | stripe_xattr_sort_t *xattr = NULL((void*)0); | |||||
4830 | dict_t *stripe_xattr = NULL((void*)0); | |||||
4831 | ||||||
4832 | if (!frame || !frame->local || !this) { | |||||
4833 | gf_log ("", GF_LOG_ERROR, "Possible NULL deref")do { do { if (0) printf ("Possible NULL deref"); } while (0); _gf_log ("", "stripe.c", __FUNCTION__, 4833, GF_LOG_ERROR, "Possible NULL deref" ); } while (0); | |||||
4834 | return ret; | |||||
4835 | } | |||||
4836 | ||||||
4837 | local = frame->local; | |||||
4838 | cky = (long) cookie; | |||||
4839 | ||||||
4840 | if (local->xsel[0] == '\0') { | |||||
4841 | gf_log (this->name, GF_LOG_ERROR, "Empty xattr in cbk")do { do { if (0) printf ("Empty xattr in cbk"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4841, GF_LOG_ERROR , "Empty xattr in cbk"); } while (0); | |||||
4842 | return ret; | |||||
4843 | } | |||||
4844 | ||||||
4845 | LOCK (&frame->lock)pthread_spin_lock (&frame->lock); | |||||
4846 | { | |||||
4847 | callcnt = --local->wind_count; | |||||
4848 | ||||||
4849 | if (!dict || (op_ret < 0)) | |||||
4850 | goto out; | |||||
4851 | ||||||
4852 | if (!local->xattr_list) | |||||
4853 | local->xattr_list = (stripe_xattr_sort_t *) | |||||
4854 | GF_CALLOC (local->nallocs,__gf_calloc (local->nallocs, sizeof (stripe_xattr_sort_t), gf_stripe_mt_xattr_sort_t) | |||||
4855 | sizeof (stripe_xattr_sort_t),__gf_calloc (local->nallocs, sizeof (stripe_xattr_sort_t), gf_stripe_mt_xattr_sort_t) | |||||
4856 | gf_stripe_mt_xattr_sort_t)__gf_calloc (local->nallocs, sizeof (stripe_xattr_sort_t), gf_stripe_mt_xattr_sort_t); | |||||
4857 | ||||||
4858 | if (local->xattr_list) { | |||||
4859 | xattr = local->xattr_list + (int32_t) cky; | |||||
4860 | ||||||
4861 | ret = dict_get_ptr_and_len (dict, local->xsel, | |||||
4862 | &xattr_val, | |||||
4863 | &xattr->xattr_len); | |||||
4864 | if (xattr->xattr_len == 0) | |||||
4865 | goto out; | |||||
4866 | ||||||
4867 | xattr->pos = cky; | |||||
4868 | xattr->xattr_value = gf_memdup (xattr_val, | |||||
4869 | xattr->xattr_value, | |||||
4870 | xattr->xattr_len); | |||||
4871 | ||||||
4872 | local->xattr_total_len += xattr->xattr_len + 1; | |||||
4873 | } | |||||
4874 | } | |||||
4875 | out: | |||||
4876 | UNLOCK (&frame->lock)pthread_spin_unlock (&frame->lock); | |||||
4877 | ||||||
4878 | if (!callcnt) { | |||||
4879 | if (!local->xattr_total_len) | |||||
4880 | goto unwind; | |||||
4881 | ||||||
4882 | stripe_xattr = dict_new (); | |||||
4883 | if (!stripe_xattr) | |||||
4884 | goto unwind; | |||||
4885 | ||||||
4886 | /* select filler based on ->xsel */ | |||||
4887 | if (XATTR_IS_PATHINFO (local->xsel)(strncmp (local->xsel, "trusted.glusterfs.pathinfo", strlen ("trusted.glusterfs.pathinfo")) == 0)) | |||||
4888 | ret = stripe_fill_pathinfo_xattr (this, local, | |||||
4889 | (char **)&xattr_serz); | |||||
4890 | else if (XATTR_IS_LOCKINFO (local->xsel)(strncmp (local->xsel, "trusted.glusterfs.lockinfo", strlen ("trusted.glusterfs.lockinfo")) == 0)) { | |||||
4891 | ret = stripe_fill_lockinfo_xattr (this, local, | |||||
4892 | &xattr_serz); | |||||
4893 | } else { | |||||
4894 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("Unknown xattr in xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4895, GF_LOG_WARNING, "Unknown xattr in xattr request"); } while (0) | |||||
4895 | "Unknown xattr in xattr request")do { do { if (0) printf ("Unknown xattr in xattr request"); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__, 4895, GF_LOG_WARNING, "Unknown xattr in xattr request"); } while (0); | |||||
4896 | goto unwind; | |||||
4897 | } | |||||
4898 | ||||||
4899 | if (!ret) { | |||||
4900 | ret = dict_set_dynptr (stripe_xattr, local->xsel, | |||||
4901 | xattr_serz, | |||||
4902 | local->xattr_total_len); | |||||
4903 | if (ret) | |||||
4904 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Can't set %s key in dict", local-> xsel); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4906, GF_LOG_ERROR, "Can't set %s key in dict", local->xsel ); } while (0) | |||||
4905 | "Can't set %s key in dict",do { do { if (0) printf ("Can't set %s key in dict", local-> xsel); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4906, GF_LOG_ERROR, "Can't set %s key in dict", local->xsel ); } while (0) | |||||
4906 | local->xsel)do { do { if (0) printf ("Can't set %s key in dict", local-> xsel); } while (0); _gf_log (this->name, "stripe.c", __FUNCTION__ , 4906, GF_LOG_ERROR, "Can't set %s key in dict", local->xsel ); } while (0); | |||||
4907 | } | |||||
4908 | ||||||
4909 | unwind: | |||||
4910 | STRIPE_STACK_UNWIND (getxattr, frame, op_ret, op_errno,do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4911, 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, stripe_xattr, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0) | |||||
4911 | stripe_xattr, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 4911, 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, stripe_xattr, ((void*)0)); (*__glusterfs_this_location ()) = old_THIS; } while (0); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
4912 | ||||||
4913 | ret = stripe_free_xattr_str (local); | |||||
4914 | ||||||
4915 | GF_FREE (local->xattr_list)__gf_free (local->xattr_list); | |||||
4916 | ||||||
4917 | if (stripe_xattr) | |||||
4918 | dict_unref (stripe_xattr); | |||||
4919 | } | |||||
4920 | ||||||
4921 | return ret; | |||||
4922 | } | |||||
4923 | ||||||
4924 | int32_t | |||||
4925 | stripe_getxattr (call_frame_t *frame, xlator_t *this, | |||||
4926 | loc_t *loc, const char *name, dict_t *xdata) | |||||
4927 | { | |||||
4928 | stripe_local_t *local = NULL((void*)0); | |||||
4929 | xlator_list_t *trav = NULL((void*)0); | |||||
4930 | stripe_private_t *priv = NULL((void*)0); | |||||
4931 | int32_t op_errno = EINVAL22; | |||||
4932 | int i = 0; | |||||
4933 | xlator_t **sub_volumes; | |||||
4934 | int ret = 0; | |||||
4935 | ||||||
4936 | 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!)"), "stripe.c" , __FUNCTION__, 4936, GF_LOG_WARNING, "invalid argument: " "frame" ); } while (0); goto err; } } while (0); | |||||
4937 | 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!)"), "stripe.c" , __FUNCTION__, 4937, GF_LOG_WARNING, "invalid argument: " "this" ); } while (0); goto err; } } while (0); | |||||
4938 | 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!)"), "stripe.c" , __FUNCTION__, 4938, GF_LOG_WARNING, "invalid argument: " "loc" ); } while (0); goto err; } } while (0); | |||||
4939 | 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!)" ), "stripe.c", __FUNCTION__, 4939, GF_LOG_WARNING, "invalid argument: " "loc->path"); } while (0); goto err; } } while (0); | |||||
4940 | 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!)" ), "stripe.c", __FUNCTION__, 4940, GF_LOG_WARNING, "invalid argument: " "loc->inode"); } while (0); goto err; } } while (0); | |||||
4941 | ||||||
4942 | priv = this->private; | |||||
4943 | trav = this->children; | |||||
4944 | ||||||
4945 | /* Initialization */ | |||||
4946 | local = mem_get0 (this->local_pool); | |||||
4947 | if (!local) { | |||||
4948 | op_errno = ENOMEM12; | |||||
4949 | goto err; | |||||
4950 | } | |||||
4951 | local->op_ret = -1; | |||||
4952 | frame->local = local; | |||||
4953 | loc_copy (&local->loc, loc); | |||||
4954 | ||||||
4955 | ||||||
4956 | if (name && (strcmp (GF_XATTR_MARKER_KEY"trusted.glusterfs" "." "volume-mark", name) == 0) | |||||
4957 | && (GF_CLIENT_PID_GSYNCD == frame->root->pid)) { | |||||
4958 | local->marker.call_count = priv->child_count; | |||||
4959 | ||||||
4960 | sub_volumes = alloca ( priv->child_count *__builtin_alloca (priv->child_count * sizeof (xlator_t *)) | |||||
4961 | sizeof (xlator_t *))__builtin_alloca (priv->child_count * sizeof (xlator_t *)); | |||||
4962 | for (i = 0, trav = this->children; trav ; | |||||
4963 | trav = trav->next, i++) { | |||||
4964 | ||||||
4965 | *(sub_volumes + i) = trav->xlator; | |||||
4966 | ||||||
4967 | } | |||||
4968 | ||||||
4969 | if (cluster_getmarkerattr (frame, this, loc, name, | |||||
4970 | local, stripe_getxattr_unwind, | |||||
4971 | sub_volumes, priv->child_count, | |||||
4972 | MARKER_UUID_TYPE1, priv->vol_uuid)) { | |||||
4973 | op_errno = EINVAL22; | |||||
4974 | goto err; | |||||
4975 | } | |||||
4976 | ||||||
4977 | return 0; | |||||
4978 | } | |||||
4979 | ||||||
4980 | if (name && strncmp (name, GF_XATTR_QUOTA_SIZE_KEY"trusted.glusterfs.quota.size", | |||||
4981 | strlen (GF_XATTR_QUOTA_SIZE_KEY"trusted.glusterfs.quota.size")) == 0) { | |||||
4982 | local->wind_count = priv->child_count; | |||||
4983 | ||||||
4984 | for (i = 0, trav=this->children; i < priv->child_count; i++, | |||||
4985 | trav = trav->next) { | |||||
4986 | STACK_WIND (frame, stripe_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", "stripe.c", __FUNCTION__, 4988, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->getxattr_cbk) tmp_cbk = stripe_getxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->getxattr"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->getxattr); trav->xlator-> fops->getxattr (_new, trav->xlator, loc, name, xdata); ( *__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4987 | trav->xlator, trav->xlator->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", "stripe.c", __FUNCTION__, 4988, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->getxattr_cbk) tmp_cbk = stripe_getxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->getxattr"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->getxattr); trav->xlator-> fops->getxattr (_new, trav->xlator, loc, name, xdata); ( *__glusterfs_this_location()) = old_THIS; } while (0) | |||||
4988 | loc, name, 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", "stripe.c", __FUNCTION__, 4988, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->getxattr_cbk) tmp_cbk = stripe_getxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = _new; _new->wind_from = __FUNCTION__; _new->wind_to = "trav->xlator->fops->getxattr"; _new->unwind_to = "stripe_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()) = trav->xlator; if (frame ->this->ctx->measure_latency) gf_latency_begin (_new , trav->xlator->fops->getxattr); trav->xlator-> fops->getxattr (_new, trav->xlator, loc, name, xdata); ( *__glusterfs_this_location()) = old_THIS; } while (0); | |||||
4989 | } | |||||
4990 | ||||||
4991 | return 0; | |||||
4992 | } | |||||
4993 | ||||||
4994 | if (name && | |||||
4995 | ((strncmp (name, GF_XATTR_PATHINFO_KEY"trusted.glusterfs.pathinfo", | |||||
4996 | strlen (GF_XATTR_PATHINFO_KEY"trusted.glusterfs.pathinfo")) == 0))) { | |||||
4997 | if (IA_ISREG (loc->inode->ia_type)(loc->inode->ia_type == IA_IFREG)) { | |||||
4998 | ret = inode_ctx_get (loc->inode, this,inode_ctx_get2(loc->inode,this,(uint64_t *) &local-> fctx,0) | |||||
4999 | (uint64_t *) &local->fctx)inode_ctx_get2(loc->inode,this,(uint64_t *) &local-> fctx,0); | |||||
5000 | if (ret) | |||||
5001 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("stripe size unavailable from fctx" " relying on pathinfo could lead to" " wrong results"); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 5004, GF_LOG_ERROR, "stripe size unavailable from fctx" " relying on pathinfo could lead to" " wrong results"); } while (0) | |||||
5002 | "stripe size unavailable from fctx"do { do { if (0) printf ("stripe size unavailable from fctx" " relying on pathinfo could lead to" " wrong results"); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 5004, GF_LOG_ERROR, "stripe size unavailable from fctx" " relying on pathinfo could lead to" " wrong results"); } while (0) | |||||
5003 | " relying on pathinfo could lead to"do { do { if (0) printf ("stripe size unavailable from fctx" " relying on pathinfo could lead to" " wrong results"); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 5004, GF_LOG_ERROR, "stripe size unavailable from fctx" " relying on pathinfo could lead to" " wrong results"); } while (0) | |||||
5004 | " wrong results")do { do { if (0) printf ("stripe size unavailable from fctx" " relying on pathinfo could lead to" " wrong results"); } while (0); _gf_log (this->name, "stripe.c" , __FUNCTION__, 5004, GF_LOG_ERROR, "stripe size unavailable from fctx" " relying on pathinfo could lead to" " wrong results"); } while (0); | |||||
5005 | } | |||||
5006 | ||||||
5007 | local->nallocs = local->wind_count = priv->child_count; | |||||
5008 | (void) strncpy (local->xsel, name, strlen (name)); | |||||
5009 | ||||||
5010 | /** | |||||
5011 | * for xattrs that need info from all childs, fill ->xsel | |||||
5012 | * as above and call the filler function in cbk based on | |||||
5013 | * it | |||||
5014 | */ | |||||
5015 | for (i = 0, trav = this->children; i < priv->child_count; i++, | |||||
5016 | trav = trav->next) { | |||||
5017 | STACK_WIND_COOKIE (frame, stripe_vgetxattr_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", "stripe.c", __FUNCTION__, 5020, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->getxattr_cbk) tmp_cbk = stripe_vgetxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = (void *) (long) i; _new->wind_from = __FUNCTION__ ; _new->wind_to = "trav->xlator->fops->getxattr"; _new->unwind_to = "stripe_vgetxattr_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 ); trav->xlator->fops->getxattr_cbk = stripe_vgetxattr_cbk ; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (trav->xlator->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->getxattr ); trav->xlator->fops->getxattr (_new, trav->xlator , loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
5018 | (void *) (long) i, trav->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", "stripe.c", __FUNCTION__, 5020, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->getxattr_cbk) tmp_cbk = stripe_vgetxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = (void *) (long) i; _new->wind_from = __FUNCTION__ ; _new->wind_to = "trav->xlator->fops->getxattr"; _new->unwind_to = "stripe_vgetxattr_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 ); trav->xlator->fops->getxattr_cbk = stripe_vgetxattr_cbk ; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (trav->xlator->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->getxattr ); trav->xlator->fops->getxattr (_new, trav->xlator , loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
5019 | trav->xlator->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", "stripe.c", __FUNCTION__, 5020, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->getxattr_cbk) tmp_cbk = stripe_vgetxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = (void *) (long) i; _new->wind_from = __FUNCTION__ ; _new->wind_to = "trav->xlator->fops->getxattr"; _new->unwind_to = "stripe_vgetxattr_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 ); trav->xlator->fops->getxattr_cbk = stripe_vgetxattr_cbk ; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (trav->xlator->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->getxattr ); trav->xlator->fops->getxattr (_new, trav->xlator , loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
5020 | loc, name, 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", "stripe.c", __FUNCTION__, 5020, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->getxattr_cbk) tmp_cbk = stripe_vgetxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = (void *) (long) i; _new->wind_from = __FUNCTION__ ; _new->wind_to = "trav->xlator->fops->getxattr"; _new->unwind_to = "stripe_vgetxattr_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 ); trav->xlator->fops->getxattr_cbk = stripe_vgetxattr_cbk ; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (trav->xlator->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->getxattr ); trav->xlator->fops->getxattr (_new, trav->xlator , loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
5021 | } | |||||
5022 | ||||||
5023 | return 0; | |||||
5024 | } | |||||
5025 | ||||||
5026 | if (name &&(*priv->vol_uuid)) { | |||||
5027 | if ((match_uuid_local (name, priv->vol_uuid) == 0) | |||||
5028 | && (GF_CLIENT_PID_GSYNCD == frame->root->pid)) { | |||||
5029 | ||||||
5030 | if (!IA_FILE_OR_DIR (loc->inode->ia_type)((loc->inode->ia_type == IA_IFREG) || (loc->inode-> ia_type == IA_IFDIR))) | |||||
5031 | local->marker.call_count = 1; | |||||
5032 | else | |||||
5033 | local->marker.call_count = priv->child_count; | |||||
5034 | ||||||
5035 | sub_volumes = alloca (local->marker.call_count *__builtin_alloca (local->marker.call_count * sizeof (xlator_t *)) | |||||
5036 | sizeof (xlator_t *))__builtin_alloca (local->marker.call_count * sizeof (xlator_t *)); | |||||
5037 | ||||||
5038 | for (i = 0, trav = this->children; | |||||
5039 | i < local->marker.call_count; | |||||
5040 | i++, trav = trav->next) { | |||||
5041 | *(sub_volumes + i) = trav->xlator; | |||||
5042 | ||||||
5043 | } | |||||
5044 | ||||||
5045 | if (cluster_getmarkerattr (frame, this, loc, name, | |||||
5046 | local, | |||||
5047 | stripe_getxattr_unwind, | |||||
5048 | sub_volumes, | |||||
5049 | local->marker.call_count, | |||||
5050 | MARKER_XTIME_TYPE2, | |||||
5051 | priv->vol_uuid)) { | |||||
5052 | op_errno = EINVAL22; | |||||
5053 | goto err; | |||||
5054 | } | |||||
5055 | ||||||
5056 | return 0; | |||||
5057 | } | |||||
5058 | } | |||||
5059 | ||||||
5060 | ||||||
5061 | STACK_WIND (frame, stripe_internal_getxattr_cbk, FIRST_CHILD(this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 5062, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->getxattr_cbk) tmp_cbk = stripe_internal_getxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->getxattr" ; _new->unwind_to = "stripe_internal_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->getxattr); (this->children->xlator )->fops->getxattr (_new, (this->children->xlator) , loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
5062 | FIRST_CHILD(this)->fops->getxattr, loc, name, 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", "stripe.c", __FUNCTION__, 5062, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->getxattr_cbk) tmp_cbk = stripe_internal_getxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->getxattr" ; _new->unwind_to = "stripe_internal_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->getxattr); (this->children->xlator )->fops->getxattr (_new, (this->children->xlator) , loc, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
5063 | ||||||
5064 | return 0; | |||||
5065 | ||||||
5066 | err: | |||||
5067 | STRIPE_STACK_UNWIND (getxattr, frame, -1, op_errno, NULL, NULL)do { stripe_local_t *__local = ((void*)0); if (frame) { __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", "stripe.c", __FUNCTION__ , 5067, 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); if (__local) { stripe_local_wipe (__local); mem_put (__local); } } while (0); | |||||
5068 | return 0; | |||||
5069 | } | |||||
5070 | ||||||
5071 | inline gf_boolean_t | |||||
5072 | stripe_is_special_xattr (const char *name) | |||||
5073 | { | |||||
5074 | gf_boolean_t is_spl = _gf_false; | |||||
5075 | ||||||
5076 | if (!name) { | |||||
5077 | goto out; | |||||
5078 | } | |||||
5079 | ||||||
5080 | if (!strncmp (name, GF_XATTR_LOCKINFO_KEY"trusted.glusterfs.lockinfo", | |||||
5081 | strlen (GF_XATTR_LOCKINFO_KEY"trusted.glusterfs.lockinfo")) | |||||
5082 | || !strncmp (name, GF_XATTR_PATHINFO_KEY"trusted.glusterfs.pathinfo", | |||||
5083 | strlen (GF_XATTR_PATHINFO_KEY"trusted.glusterfs.pathinfo"))) | |||||
5084 | is_spl = _gf_true; | |||||
5085 | out: | |||||
5086 | return is_spl; | |||||
5087 | } | |||||
5088 | ||||||
5089 | int32_t | |||||
5090 | stripe_fgetxattr_from_everyone (call_frame_t *frame, xlator_t *this, fd_t *fd, | |||||
5091 | const char *name, dict_t *xdata) | |||||
5092 | { | |||||
5093 | stripe_local_t *local = NULL((void*)0); | |||||
5094 | stripe_private_t *priv = NULL((void*)0); | |||||
5095 | int32_t ret = -1, op_errno = 0; | |||||
5096 | int i = 0; | |||||
5097 | xlator_list_t *trav = NULL((void*)0); | |||||
5098 | ||||||
5099 | priv = this->private; | |||||
5100 | ||||||
5101 | local = mem_get0 (this->local_pool); | |||||
5102 | if (!local) { | |||||
5103 | op_errno = ENOMEM12; | |||||
5104 | goto err; | |||||
5105 | } | |||||
5106 | ||||||
5107 | local->op_ret = -1; | |||||
5108 | frame->local = local; | |||||
5109 | ||||||
5110 | strncpy (local->xsel, name, strlen (name)); | |||||
5111 | local->nallocs = local->wind_count = priv->child_count; | |||||
5112 | ||||||
5113 | for (i = 0, trav = this->children; i < priv->child_count; i++, | |||||
5114 | trav = trav->next) { | |||||
5115 | STACK_WIND_COOKIE (frame, stripe_vgetxattr_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", "stripe.c", __FUNCTION__, 5118, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fgetxattr_cbk) tmp_cbk = stripe_vgetxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = (void *) (long) i; _new->wind_from = __FUNCTION__ ; _new->wind_to = "trav->xlator->fops->fgetxattr" ; _new->unwind_to = "stripe_vgetxattr_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 ); trav->xlator->fops->fgetxattr_cbk = stripe_vgetxattr_cbk ; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (trav->xlator->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->fgetxattr ); trav->xlator->fops->fgetxattr (_new, trav->xlator , fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
5116 | (void *) (long) i, trav->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", "stripe.c", __FUNCTION__, 5118, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fgetxattr_cbk) tmp_cbk = stripe_vgetxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = (void *) (long) i; _new->wind_from = __FUNCTION__ ; _new->wind_to = "trav->xlator->fops->fgetxattr" ; _new->unwind_to = "stripe_vgetxattr_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 ); trav->xlator->fops->fgetxattr_cbk = stripe_vgetxattr_cbk ; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (trav->xlator->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->fgetxattr ); trav->xlator->fops->fgetxattr (_new, trav->xlator , fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
5117 | trav->xlator->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", "stripe.c", __FUNCTION__, 5118, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fgetxattr_cbk) tmp_cbk = stripe_vgetxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = (void *) (long) i; _new->wind_from = __FUNCTION__ ; _new->wind_to = "trav->xlator->fops->fgetxattr" ; _new->unwind_to = "stripe_vgetxattr_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 ); trav->xlator->fops->fgetxattr_cbk = stripe_vgetxattr_cbk ; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (trav->xlator->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->fgetxattr ); trav->xlator->fops->fgetxattr (_new, trav->xlator , fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
5118 | fd, name, 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", "stripe.c", __FUNCTION__, 5118, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( trav->xlator ->fops->fgetxattr_cbk) tmp_cbk = stripe_vgetxattr_cbk; _new ->root = frame->root; _new->this = trav->xlator; _new ->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new-> cookie = (void *) (long) i; _new->wind_from = __FUNCTION__ ; _new->wind_to = "trav->xlator->fops->fgetxattr" ; _new->unwind_to = "stripe_vgetxattr_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 ); trav->xlator->fops->fgetxattr_cbk = stripe_vgetxattr_cbk ; old_THIS = (*__glusterfs_this_location()); (*__glusterfs_this_location ()) = trav->xlator; if (trav->xlator->ctx->measure_latency ) gf_latency_begin (_new, trav->xlator->fops->fgetxattr ); trav->xlator->fops->fgetxattr (_new, trav->xlator , fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
5119 | } | |||||
5120 | ||||||
5121 | return 0; | |||||
5122 | ||||||
5123 | err: | |||||
5124 | STACK_UNWIND_STRICT (fgetxattr, frame, -1, op_errno, NULL, NULL)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" , "stripe.c", __FUNCTION__, 5124, 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); | |||||
5125 | return ret; | |||||
5126 | } | |||||
5127 | ||||||
5128 | int32_t | |||||
5129 | stripe_fgetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, | |||||
5130 | const char *name, dict_t *xdata) | |||||
5131 | { | |||||
5132 | if (stripe_is_special_xattr (name)) { | |||||
5133 | stripe_fgetxattr_from_everyone (frame, this, fd, name, xdata); | |||||
5134 | goto out; | |||||
5135 | } | |||||
5136 | ||||||
5137 | STACK_WIND (frame, stripe_internal_getxattr_cbk, FIRST_CHILD(this),do { call_frame_t *_new = ((void*)0); xlator_t *old_THIS = (( void*)0); _new = mem_get0 (frame->root->pool->frame_mem_pool ); if (!_new) { do { do { if (0) printf ("alloc failed"); } while (0); _gf_log ("stack", "stripe.c", __FUNCTION__, 5138, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fgetxattr_cbk) tmp_cbk = stripe_internal_getxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fgetxattr" ; _new->unwind_to = "stripe_internal_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fgetxattr); (this->children-> xlator)->fops->fgetxattr (_new, (this->children-> xlator), fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0) | |||||
5138 | FIRST_CHILD(this)->fops->fgetxattr, fd, name, 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", "stripe.c", __FUNCTION__, 5138, GF_LOG_ERROR , "alloc failed"); } while (0); break; } typeof( (this->children ->xlator)->fops->fgetxattr_cbk) tmp_cbk = stripe_internal_getxattr_cbk ; _new->root = frame->root; _new->this = (this->children ->xlator); _new->ret = (ret_fn_t) tmp_cbk; _new->parent = frame; _new->cookie = _new; _new->wind_from = __FUNCTION__ ; _new->wind_to = "FIRST_CHILD(this)->fops->fgetxattr" ; _new->unwind_to = "stripe_internal_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 ()) = (this->children->xlator); if (frame->this-> ctx->measure_latency) gf_latency_begin (_new, (this->children ->xlator)->fops->fgetxattr); (this->children-> xlator)->fops->fgetxattr (_new, (this->children-> xlator), fd, name, xdata); (*__glusterfs_this_location()) = old_THIS ; } while (0); | |||||
5139 | ||||||
5140 | out: | |||||
5141 | return 0; | |||||
5142 | } | |||||
5143 | ||||||
5144 | ||||||
5145 | ||||||
5146 | int32_t | |||||
5147 | stripe_priv_dump (xlator_t *this) | |||||
5148 | { | |||||
5149 | char key[GF_DUMP_MAX_BUF_LEN4096]; | |||||
5150 | int i = 0; | |||||
5151 | stripe_private_t *priv = NULL((void*)0); | |||||
5152 | int ret = -1; | |||||
5153 | struct stripe_options *options = NULL((void*)0); | |||||
5154 | ||||||
5155 | GF_VALIDATE_OR_GOTO ("stripe", this, out)do { if (!this) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "this"); } while (0); _gf_log_callingfn ("stripe", "stripe.c", __FUNCTION__, 5155, GF_LOG_ERROR, "invalid argument: " "this"); } while (0); goto out; } } while (0); | |||||
5156 | ||||||
5157 | priv = this->private; | |||||
5158 | if (!priv) | |||||
5159 | goto out; | |||||
5160 | ||||||
5161 | ret = TRY_LOCK (&priv->lock)pthread_spin_trylock (&priv->lock); | |||||
5162 | if (ret != 0) | |||||
5163 | goto out; | |||||
5164 | ||||||
5165 | gf_proc_dump_add_section("xlator.cluster.stripe.%s.priv", this->name); | |||||
5166 | gf_proc_dump_write("child_count","%d", priv->child_count); | |||||
5167 | ||||||
5168 | for (i = 0; i < priv->child_count; i++) { | |||||
5169 | sprintf (key, "subvolumes[%d]", i); | |||||
5170 | gf_proc_dump_write (key, "%s.%s", priv->xl_array[i]->type, | |||||
5171 | priv->xl_array[i]->name); | |||||
5172 | } | |||||
5173 | ||||||
5174 | options = priv->pattern; | |||||
5175 | while (options != NULL((void*)0)) { | |||||
5176 | gf_proc_dump_write ("path_pattern", "%s", priv->pattern->path_pattern); | |||||
5177 | gf_proc_dump_write ("options_block_size", "%ul", options->block_size); | |||||
5178 | ||||||
5179 | options = options->next; | |||||
5180 | } | |||||
5181 | ||||||
5182 | gf_proc_dump_write ("block_size", "%ul", priv->block_size); | |||||
5183 | gf_proc_dump_write ("nodes-down", "%d", priv->nodes_down); | |||||
5184 | gf_proc_dump_write ("first-child_down", "%d", priv->first_child_down); | |||||
5185 | gf_proc_dump_write ("xattr_supported", "%d", priv->xattr_supported); | |||||
5186 | ||||||
5187 | UNLOCK (&priv->lock)pthread_spin_unlock (&priv->lock); | |||||
5188 | ||||||
5189 | out: | |||||
5190 | return ret; | |||||
5191 | } | |||||
5192 | ||||||
5193 | struct xlator_fops fops = { | |||||
5194 | .stat = stripe_stat, | |||||
5195 | .unlink = stripe_unlink, | |||||
5196 | .rename = stripe_rename, | |||||
5197 | .link = stripe_link, | |||||
5198 | .truncate = stripe_truncate, | |||||
5199 | .create = stripe_create, | |||||
5200 | .open = stripe_open, | |||||
5201 | .readv = stripe_readv, | |||||
5202 | .writev = stripe_writev, | |||||
5203 | .statfs = stripe_statfs, | |||||
5204 | .flush = stripe_flush, | |||||
5205 | .fsync = stripe_fsync, | |||||
5206 | .ftruncate = stripe_ftruncate, | |||||
5207 | .fstat = stripe_fstat, | |||||
5208 | .mkdir = stripe_mkdir, | |||||
5209 | .rmdir = stripe_rmdir, | |||||
5210 | .lk = stripe_lk, | |||||
5211 | .opendir = stripe_opendir, | |||||
5212 | .fsyncdir = stripe_fsyncdir, | |||||
5213 | .setattr = stripe_setattr, | |||||
5214 | .fsetattr = stripe_fsetattr, | |||||
5215 | .lookup = stripe_lookup, | |||||
5216 | .mknod = stripe_mknod, | |||||
5217 | .setxattr = stripe_setxattr, | |||||
5218 | .fsetxattr = stripe_fsetxattr, | |||||
5219 | .getxattr = stripe_getxattr, | |||||
5220 | .fgetxattr = stripe_fgetxattr, | |||||
5221 | .removexattr = stripe_removexattr, | |||||
5222 | .fremovexattr = stripe_fremovexattr, | |||||
5223 | .readdirp = stripe_readdirp, | |||||
5224 | }; | |||||
5225 | ||||||
5226 | struct xlator_cbks cbks = { | |||||
5227 | .release = stripe_release, | |||||
5228 | .forget = stripe_forget, | |||||
5229 | }; | |||||
5230 | ||||||
5231 | struct xlator_dumpops dumpops = { | |||||
5232 | .priv = stripe_priv_dump, | |||||
5233 | }; | |||||
5234 | ||||||
5235 | struct volume_options options[] = { | |||||
5236 | { .key = {"block-size"}, | |||||
5237 | .type = GF_OPTION_TYPE_SIZE_LIST, | |||||
5238 | .default_value = "128KB", | |||||
5239 | .min = STRIPE_MIN_BLOCK_SIZE(16*1024ULL), | |||||
5240 | .description = "Size of the stripe unit that would be read " | |||||
5241 | "from or written to the striped servers." | |||||
5242 | }, | |||||
5243 | { .key = {"use-xattr"}, | |||||
5244 | .type = GF_OPTION_TYPE_BOOL, | |||||
5245 | .default_value = "true" | |||||
5246 | }, | |||||
5247 | { .key = {"coalesce"}, | |||||
5248 | .type = GF_OPTION_TYPE_BOOL, | |||||
5249 | .default_value = "false", | |||||
5250 | .description = "Enable coalesce mode to flatten striped files as " | |||||
5251 | "stored on the server (i.e., eliminate holes caused " | |||||
5252 | "by the traditional format)." | |||||
5253 | }, | |||||
5254 | { .key = {NULL((void*)0)} }, | |||||
5255 | }; |