File: | xlators/cluster/stripe/src/stripe.c |
Location: | line 4370, column 25 |
Description: | Value stored to 'op_ret' is never read |
1 | /* |
2 | Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> |
3 | This file is part of GlusterFS. |
4 | |
5 | This file is licensed to you under your choice of the GNU Lesser |
6 | General Public License, version 3 or any later version (LGPLv3 or |
7 | later), or the GNU General Public License, version 2 (GPLv2), in all |
8 | cases as published by the Free Software Foundation. |
9 | */ |
10 | |
11 | /** |
12 | * 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; |
Value stored to 'op_ret' is never read | |
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 | }; |