diff options
-rw-r--r-- | fs/afs/cmservice.c | 35 |
1 files changed, 7 insertions, 28 deletions
diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c index b44491410af3..c332c95a6940 100644 --- a/fs/afs/cmservice.c +++ b/fs/afs/cmservice.c | |||
@@ -133,21 +133,10 @@ bool afs_cm_incoming_call(struct afs_call *call) | |||
133 | } | 133 | } |
134 | 134 | ||
135 | /* | 135 | /* |
136 | * clean up a cache manager call | 136 | * Clean up a cache manager call. |
137 | */ | 137 | */ |
138 | static void afs_cm_destructor(struct afs_call *call) | 138 | static void afs_cm_destructor(struct afs_call *call) |
139 | { | 139 | { |
140 | _enter(""); | ||
141 | |||
142 | /* Break the callbacks here so that we do it after the final ACK is | ||
143 | * received. The step number here must match the final number in | ||
144 | * afs_deliver_cb_callback(). | ||
145 | */ | ||
146 | if (call->cm_server && call->unmarshall == 5) { | ||
147 | ASSERT(call->count && call->request); | ||
148 | afs_break_callbacks(call->cm_server, call->count, call->request); | ||
149 | } | ||
150 | |||
151 | kfree(call->buffer); | 140 | kfree(call->buffer); |
152 | call->buffer = NULL; | 141 | call->buffer = NULL; |
153 | } | 142 | } |
@@ -161,15 +150,14 @@ static void SRXAFSCB_CallBack(struct work_struct *work) | |||
161 | 150 | ||
162 | _enter(""); | 151 | _enter(""); |
163 | 152 | ||
164 | /* be sure to send the reply *before* attempting to spam the AFS server | 153 | /* We need to break the callbacks before sending the reply as the |
165 | * with FSFetchStatus requests on the vnodes with broken callbacks lest | 154 | * server holds up change visibility till it receives our reply so as |
166 | * the AFS server get into a vicious cycle of trying to break further | 155 | * to maintain cache coherency. |
167 | * callbacks because it hadn't received completion of the CBCallBack op | 156 | */ |
168 | * yet */ | ||
169 | afs_send_empty_reply(call); | ||
170 | |||
171 | if (call->cm_server) | 157 | if (call->cm_server) |
172 | afs_break_callbacks(call->cm_server, call->count, call->request); | 158 | afs_break_callbacks(call->cm_server, call->count, call->request); |
159 | |||
160 | afs_send_empty_reply(call); | ||
173 | afs_put_call(call); | 161 | afs_put_call(call); |
174 | _leave(""); | 162 | _leave(""); |
175 | } | 163 | } |
@@ -267,15 +255,6 @@ static int afs_deliver_cb_callback(struct afs_call *call) | |||
267 | 255 | ||
268 | call->offset = 0; | 256 | call->offset = 0; |
269 | call->unmarshall++; | 257 | call->unmarshall++; |
270 | |||
271 | /* Record that the message was unmarshalled successfully so | ||
272 | * that the call destructor can know do the callback breaking | ||
273 | * work, even if the final ACK isn't received. | ||
274 | * | ||
275 | * If the step number changes, then afs_cm_destructor() must be | ||
276 | * updated also. | ||
277 | */ | ||
278 | call->unmarshall++; | ||
279 | case 5: | 258 | case 5: |
280 | break; | 259 | break; |
281 | } | 260 | } |