xfs: allocate log vector buffers outside CIL context lock
[cascardo/linux.git] / fs / xfs / xfs_extfree_item.c
1 /*
2  * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_format.h"
21 #include "xfs_log_format.h"
22 #include "xfs_trans_resv.h"
23 #include "xfs_mount.h"
24 #include "xfs_trans.h"
25 #include "xfs_trans_priv.h"
26 #include "xfs_buf_item.h"
27 #include "xfs_extfree_item.h"
28 #include "xfs_log.h"
29
30
31 kmem_zone_t     *xfs_efi_zone;
32 kmem_zone_t     *xfs_efd_zone;
33
34 static inline struct xfs_efi_log_item *EFI_ITEM(struct xfs_log_item *lip)
35 {
36         return container_of(lip, struct xfs_efi_log_item, efi_item);
37 }
38
39 void
40 xfs_efi_item_free(
41         struct xfs_efi_log_item *efip)
42 {
43         kmem_free(efip->efi_item.li_lv_shadow);
44         if (efip->efi_format.efi_nextents > XFS_EFI_MAX_FAST_EXTENTS)
45                 kmem_free(efip);
46         else
47                 kmem_zone_free(xfs_efi_zone, efip);
48 }
49
50 /*
51  * This returns the number of iovecs needed to log the given efi item.
52  * We only need 1 iovec for an efi item.  It just logs the efi_log_format
53  * structure.
54  */
55 static inline int
56 xfs_efi_item_sizeof(
57         struct xfs_efi_log_item *efip)
58 {
59         return sizeof(struct xfs_efi_log_format) +
60                (efip->efi_format.efi_nextents - 1) * sizeof(xfs_extent_t);
61 }
62
63 STATIC void
64 xfs_efi_item_size(
65         struct xfs_log_item     *lip,
66         int                     *nvecs,
67         int                     *nbytes)
68 {
69         *nvecs += 1;
70         *nbytes += xfs_efi_item_sizeof(EFI_ITEM(lip));
71 }
72
73 /*
74  * This is called to fill in the vector of log iovecs for the
75  * given efi log item. We use only 1 iovec, and we point that
76  * at the efi_log_format structure embedded in the efi item.
77  * It is at this point that we assert that all of the extent
78  * slots in the efi item have been filled.
79  */
80 STATIC void
81 xfs_efi_item_format(
82         struct xfs_log_item     *lip,
83         struct xfs_log_vec      *lv)
84 {
85         struct xfs_efi_log_item *efip = EFI_ITEM(lip);
86         struct xfs_log_iovec    *vecp = NULL;
87
88         ASSERT(atomic_read(&efip->efi_next_extent) ==
89                                 efip->efi_format.efi_nextents);
90
91         efip->efi_format.efi_type = XFS_LI_EFI;
92         efip->efi_format.efi_size = 1;
93
94         xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_EFI_FORMAT,
95                         &efip->efi_format,
96                         xfs_efi_item_sizeof(efip));
97 }
98
99
100 /*
101  * Pinning has no meaning for an efi item, so just return.
102  */
103 STATIC void
104 xfs_efi_item_pin(
105         struct xfs_log_item     *lip)
106 {
107 }
108
109 /*
110  * The unpin operation is the last place an EFI is manipulated in the log. It is
111  * either inserted in the AIL or aborted in the event of a log I/O error. In
112  * either case, the EFI transaction has been successfully committed to make it
113  * this far. Therefore, we expect whoever committed the EFI to either construct
114  * and commit the EFD or drop the EFD's reference in the event of error. Simply
115  * drop the log's EFI reference now that the log is done with it.
116  */
117 STATIC void
118 xfs_efi_item_unpin(
119         struct xfs_log_item     *lip,
120         int                     remove)
121 {
122         struct xfs_efi_log_item *efip = EFI_ITEM(lip);
123         xfs_efi_release(efip);
124 }
125
126 /*
127  * Efi items have no locking or pushing.  However, since EFIs are pulled from
128  * the AIL when their corresponding EFDs are committed to disk, their situation
129  * is very similar to being pinned.  Return XFS_ITEM_PINNED so that the caller
130  * will eventually flush the log.  This should help in getting the EFI out of
131  * the AIL.
132  */
133 STATIC uint
134 xfs_efi_item_push(
135         struct xfs_log_item     *lip,
136         struct list_head        *buffer_list)
137 {
138         return XFS_ITEM_PINNED;
139 }
140
141 /*
142  * The EFI has been either committed or aborted if the transaction has been
143  * cancelled. If the transaction was cancelled, an EFD isn't going to be
144  * constructed and thus we free the EFI here directly.
145  */
146 STATIC void
147 xfs_efi_item_unlock(
148         struct xfs_log_item     *lip)
149 {
150         if (lip->li_flags & XFS_LI_ABORTED)
151                 xfs_efi_item_free(EFI_ITEM(lip));
152 }
153
154 /*
155  * The EFI is logged only once and cannot be moved in the log, so simply return
156  * the lsn at which it's been logged.
157  */
158 STATIC xfs_lsn_t
159 xfs_efi_item_committed(
160         struct xfs_log_item     *lip,
161         xfs_lsn_t               lsn)
162 {
163         return lsn;
164 }
165
166 /*
167  * The EFI dependency tracking op doesn't do squat.  It can't because
168  * it doesn't know where the free extent is coming from.  The dependency
169  * tracking has to be handled by the "enclosing" metadata object.  For
170  * example, for inodes, the inode is locked throughout the extent freeing
171  * so the dependency should be recorded there.
172  */
173 STATIC void
174 xfs_efi_item_committing(
175         struct xfs_log_item     *lip,
176         xfs_lsn_t               lsn)
177 {
178 }
179
180 /*
181  * This is the ops vector shared by all efi log items.
182  */
183 static const struct xfs_item_ops xfs_efi_item_ops = {
184         .iop_size       = xfs_efi_item_size,
185         .iop_format     = xfs_efi_item_format,
186         .iop_pin        = xfs_efi_item_pin,
187         .iop_unpin      = xfs_efi_item_unpin,
188         .iop_unlock     = xfs_efi_item_unlock,
189         .iop_committed  = xfs_efi_item_committed,
190         .iop_push       = xfs_efi_item_push,
191         .iop_committing = xfs_efi_item_committing
192 };
193
194
195 /*
196  * Allocate and initialize an efi item with the given number of extents.
197  */
198 struct xfs_efi_log_item *
199 xfs_efi_init(
200         struct xfs_mount        *mp,
201         uint                    nextents)
202
203 {
204         struct xfs_efi_log_item *efip;
205         uint                    size;
206
207         ASSERT(nextents > 0);
208         if (nextents > XFS_EFI_MAX_FAST_EXTENTS) {
209                 size = (uint)(sizeof(xfs_efi_log_item_t) +
210                         ((nextents - 1) * sizeof(xfs_extent_t)));
211                 efip = kmem_zalloc(size, KM_SLEEP);
212         } else {
213                 efip = kmem_zone_zalloc(xfs_efi_zone, KM_SLEEP);
214         }
215
216         xfs_log_item_init(mp, &efip->efi_item, XFS_LI_EFI, &xfs_efi_item_ops);
217         efip->efi_format.efi_nextents = nextents;
218         efip->efi_format.efi_id = (uintptr_t)(void *)efip;
219         atomic_set(&efip->efi_next_extent, 0);
220         atomic_set(&efip->efi_refcount, 2);
221
222         return efip;
223 }
224
225 /*
226  * Copy an EFI format buffer from the given buf, and into the destination
227  * EFI format structure.
228  * The given buffer can be in 32 bit or 64 bit form (which has different padding),
229  * one of which will be the native format for this kernel.
230  * It will handle the conversion of formats if necessary.
231  */
232 int
233 xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt)
234 {
235         xfs_efi_log_format_t *src_efi_fmt = buf->i_addr;
236         uint i;
237         uint len = sizeof(xfs_efi_log_format_t) + 
238                 (src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_t);  
239         uint len32 = sizeof(xfs_efi_log_format_32_t) + 
240                 (src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_32_t);  
241         uint len64 = sizeof(xfs_efi_log_format_64_t) + 
242                 (src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_64_t);  
243
244         if (buf->i_len == len) {
245                 memcpy((char *)dst_efi_fmt, (char*)src_efi_fmt, len);
246                 return 0;
247         } else if (buf->i_len == len32) {
248                 xfs_efi_log_format_32_t *src_efi_fmt_32 = buf->i_addr;
249
250                 dst_efi_fmt->efi_type     = src_efi_fmt_32->efi_type;
251                 dst_efi_fmt->efi_size     = src_efi_fmt_32->efi_size;
252                 dst_efi_fmt->efi_nextents = src_efi_fmt_32->efi_nextents;
253                 dst_efi_fmt->efi_id       = src_efi_fmt_32->efi_id;
254                 for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
255                         dst_efi_fmt->efi_extents[i].ext_start =
256                                 src_efi_fmt_32->efi_extents[i].ext_start;
257                         dst_efi_fmt->efi_extents[i].ext_len =
258                                 src_efi_fmt_32->efi_extents[i].ext_len;
259                 }
260                 return 0;
261         } else if (buf->i_len == len64) {
262                 xfs_efi_log_format_64_t *src_efi_fmt_64 = buf->i_addr;
263
264                 dst_efi_fmt->efi_type     = src_efi_fmt_64->efi_type;
265                 dst_efi_fmt->efi_size     = src_efi_fmt_64->efi_size;
266                 dst_efi_fmt->efi_nextents = src_efi_fmt_64->efi_nextents;
267                 dst_efi_fmt->efi_id       = src_efi_fmt_64->efi_id;
268                 for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
269                         dst_efi_fmt->efi_extents[i].ext_start =
270                                 src_efi_fmt_64->efi_extents[i].ext_start;
271                         dst_efi_fmt->efi_extents[i].ext_len =
272                                 src_efi_fmt_64->efi_extents[i].ext_len;
273                 }
274                 return 0;
275         }
276         return -EFSCORRUPTED;
277 }
278
279 /*
280  * Freeing the efi requires that we remove it from the AIL if it has already
281  * been placed there. However, the EFI may not yet have been placed in the AIL
282  * when called by xfs_efi_release() from EFD processing due to the ordering of
283  * committed vs unpin operations in bulk insert operations. Hence the reference
284  * count to ensure only the last caller frees the EFI.
285  */
286 void
287 xfs_efi_release(
288         struct xfs_efi_log_item *efip)
289 {
290         if (atomic_dec_and_test(&efip->efi_refcount)) {
291                 xfs_trans_ail_remove(&efip->efi_item, SHUTDOWN_LOG_IO_ERROR);
292                 xfs_efi_item_free(efip);
293         }
294 }
295
296 static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip)
297 {
298         return container_of(lip, struct xfs_efd_log_item, efd_item);
299 }
300
301 STATIC void
302 xfs_efd_item_free(struct xfs_efd_log_item *efdp)
303 {
304         kmem_free(efdp->efd_item.li_lv_shadow);
305         if (efdp->efd_format.efd_nextents > XFS_EFD_MAX_FAST_EXTENTS)
306                 kmem_free(efdp);
307         else
308                 kmem_zone_free(xfs_efd_zone, efdp);
309 }
310
311 /*
312  * This returns the number of iovecs needed to log the given efd item.
313  * We only need 1 iovec for an efd item.  It just logs the efd_log_format
314  * structure.
315  */
316 static inline int
317 xfs_efd_item_sizeof(
318         struct xfs_efd_log_item *efdp)
319 {
320         return sizeof(xfs_efd_log_format_t) +
321                (efdp->efd_format.efd_nextents - 1) * sizeof(xfs_extent_t);
322 }
323
324 STATIC void
325 xfs_efd_item_size(
326         struct xfs_log_item     *lip,
327         int                     *nvecs,
328         int                     *nbytes)
329 {
330         *nvecs += 1;
331         *nbytes += xfs_efd_item_sizeof(EFD_ITEM(lip));
332 }
333
334 /*
335  * This is called to fill in the vector of log iovecs for the
336  * given efd log item. We use only 1 iovec, and we point that
337  * at the efd_log_format structure embedded in the efd item.
338  * It is at this point that we assert that all of the extent
339  * slots in the efd item have been filled.
340  */
341 STATIC void
342 xfs_efd_item_format(
343         struct xfs_log_item     *lip,
344         struct xfs_log_vec      *lv)
345 {
346         struct xfs_efd_log_item *efdp = EFD_ITEM(lip);
347         struct xfs_log_iovec    *vecp = NULL;
348
349         ASSERT(efdp->efd_next_extent == efdp->efd_format.efd_nextents);
350
351         efdp->efd_format.efd_type = XFS_LI_EFD;
352         efdp->efd_format.efd_size = 1;
353
354         xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_EFD_FORMAT,
355                         &efdp->efd_format,
356                         xfs_efd_item_sizeof(efdp));
357 }
358
359 /*
360  * Pinning has no meaning for an efd item, so just return.
361  */
362 STATIC void
363 xfs_efd_item_pin(
364         struct xfs_log_item     *lip)
365 {
366 }
367
368 /*
369  * Since pinning has no meaning for an efd item, unpinning does
370  * not either.
371  */
372 STATIC void
373 xfs_efd_item_unpin(
374         struct xfs_log_item     *lip,
375         int                     remove)
376 {
377 }
378
379 /*
380  * There isn't much you can do to push on an efd item.  It is simply stuck
381  * waiting for the log to be flushed to disk.
382  */
383 STATIC uint
384 xfs_efd_item_push(
385         struct xfs_log_item     *lip,
386         struct list_head        *buffer_list)
387 {
388         return XFS_ITEM_PINNED;
389 }
390
391 /*
392  * The EFD is either committed or aborted if the transaction is cancelled. If
393  * the transaction is cancelled, drop our reference to the EFI and free the EFD.
394  */
395 STATIC void
396 xfs_efd_item_unlock(
397         struct xfs_log_item     *lip)
398 {
399         struct xfs_efd_log_item *efdp = EFD_ITEM(lip);
400
401         if (lip->li_flags & XFS_LI_ABORTED) {
402                 xfs_efi_release(efdp->efd_efip);
403                 xfs_efd_item_free(efdp);
404         }
405 }
406
407 /*
408  * When the efd item is committed to disk, all we need to do is delete our
409  * reference to our partner efi item and then free ourselves. Since we're
410  * freeing ourselves we must return -1 to keep the transaction code from further
411  * referencing this item.
412  */
413 STATIC xfs_lsn_t
414 xfs_efd_item_committed(
415         struct xfs_log_item     *lip,
416         xfs_lsn_t               lsn)
417 {
418         struct xfs_efd_log_item *efdp = EFD_ITEM(lip);
419
420         /*
421          * Drop the EFI reference regardless of whether the EFD has been
422          * aborted. Once the EFD transaction is constructed, it is the sole
423          * responsibility of the EFD to release the EFI (even if the EFI is
424          * aborted due to log I/O error).
425          */
426         xfs_efi_release(efdp->efd_efip);
427         xfs_efd_item_free(efdp);
428
429         return (xfs_lsn_t)-1;
430 }
431
432 /*
433  * The EFD dependency tracking op doesn't do squat.  It can't because
434  * it doesn't know where the free extent is coming from.  The dependency
435  * tracking has to be handled by the "enclosing" metadata object.  For
436  * example, for inodes, the inode is locked throughout the extent freeing
437  * so the dependency should be recorded there.
438  */
439 STATIC void
440 xfs_efd_item_committing(
441         struct xfs_log_item     *lip,
442         xfs_lsn_t               lsn)
443 {
444 }
445
446 /*
447  * This is the ops vector shared by all efd log items.
448  */
449 static const struct xfs_item_ops xfs_efd_item_ops = {
450         .iop_size       = xfs_efd_item_size,
451         .iop_format     = xfs_efd_item_format,
452         .iop_pin        = xfs_efd_item_pin,
453         .iop_unpin      = xfs_efd_item_unpin,
454         .iop_unlock     = xfs_efd_item_unlock,
455         .iop_committed  = xfs_efd_item_committed,
456         .iop_push       = xfs_efd_item_push,
457         .iop_committing = xfs_efd_item_committing
458 };
459
460 /*
461  * Allocate and initialize an efd item with the given number of extents.
462  */
463 struct xfs_efd_log_item *
464 xfs_efd_init(
465         struct xfs_mount        *mp,
466         struct xfs_efi_log_item *efip,
467         uint                    nextents)
468
469 {
470         struct xfs_efd_log_item *efdp;
471         uint                    size;
472
473         ASSERT(nextents > 0);
474         if (nextents > XFS_EFD_MAX_FAST_EXTENTS) {
475                 size = (uint)(sizeof(xfs_efd_log_item_t) +
476                         ((nextents - 1) * sizeof(xfs_extent_t)));
477                 efdp = kmem_zalloc(size, KM_SLEEP);
478         } else {
479                 efdp = kmem_zone_zalloc(xfs_efd_zone, KM_SLEEP);
480         }
481
482         xfs_log_item_init(mp, &efdp->efd_item, XFS_LI_EFD, &xfs_efd_item_ops);
483         efdp->efd_efip = efip;
484         efdp->efd_format.efd_nextents = nextents;
485         efdp->efd_format.efd_efi_id = efip->efi_format.efi_id;
486
487         return efdp;
488 }