xref: /openbmc/linux/fs/xfs/xfs_extfree_item.c (revision a1e58bbd)
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_types.h"
21 #include "xfs_log.h"
22 #include "xfs_inum.h"
23 #include "xfs_trans.h"
24 #include "xfs_buf_item.h"
25 #include "xfs_sb.h"
26 #include "xfs_ag.h"
27 #include "xfs_dmapi.h"
28 #include "xfs_mount.h"
29 #include "xfs_trans_priv.h"
30 #include "xfs_extfree_item.h"
31 
32 
33 kmem_zone_t	*xfs_efi_zone;
34 kmem_zone_t	*xfs_efd_zone;
35 
36 STATIC void	xfs_efi_item_unlock(xfs_efi_log_item_t *);
37 
38 void
39 xfs_efi_item_free(xfs_efi_log_item_t *efip)
40 {
41 	int nexts = efip->efi_format.efi_nextents;
42 
43 	if (nexts > XFS_EFI_MAX_FAST_EXTENTS) {
44 		kmem_free(efip, sizeof(xfs_efi_log_item_t) +
45 				(nexts - 1) * sizeof(xfs_extent_t));
46 	} else {
47 		kmem_zone_free(xfs_efi_zone, efip);
48 	}
49 }
50 
51 /*
52  * This returns the number of iovecs needed to log the given efi item.
53  * We only need 1 iovec for an efi item.  It just logs the efi_log_format
54  * structure.
55  */
56 /*ARGSUSED*/
57 STATIC uint
58 xfs_efi_item_size(xfs_efi_log_item_t *efip)
59 {
60 	return 1;
61 }
62 
63 /*
64  * This is called to fill in the vector of log iovecs for the
65  * given efi log item. We use only 1 iovec, and we point that
66  * at the efi_log_format structure embedded in the efi item.
67  * It is at this point that we assert that all of the extent
68  * slots in the efi item have been filled.
69  */
70 STATIC void
71 xfs_efi_item_format(xfs_efi_log_item_t	*efip,
72 		    xfs_log_iovec_t	*log_vector)
73 {
74 	uint	size;
75 
76 	ASSERT(efip->efi_next_extent == efip->efi_format.efi_nextents);
77 
78 	efip->efi_format.efi_type = XFS_LI_EFI;
79 
80 	size = sizeof(xfs_efi_log_format_t);
81 	size += (efip->efi_format.efi_nextents - 1) * sizeof(xfs_extent_t);
82 	efip->efi_format.efi_size = 1;
83 
84 	log_vector->i_addr = (xfs_caddr_t)&(efip->efi_format);
85 	log_vector->i_len = size;
86 	XLOG_VEC_SET_TYPE(log_vector, XLOG_REG_TYPE_EFI_FORMAT);
87 	ASSERT(size >= sizeof(xfs_efi_log_format_t));
88 }
89 
90 
91 /*
92  * Pinning has no meaning for an efi item, so just return.
93  */
94 /*ARGSUSED*/
95 STATIC void
96 xfs_efi_item_pin(xfs_efi_log_item_t *efip)
97 {
98 	return;
99 }
100 
101 
102 /*
103  * While EFIs cannot really be pinned, the unpin operation is the
104  * last place at which the EFI is manipulated during a transaction.
105  * Here we coordinate with xfs_efi_cancel() to determine who gets to
106  * free the EFI.
107  */
108 /*ARGSUSED*/
109 STATIC void
110 xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale)
111 {
112 	xfs_mount_t	*mp;
113 
114 	mp = efip->efi_item.li_mountp;
115 	spin_lock(&mp->m_ail_lock);
116 	if (efip->efi_flags & XFS_EFI_CANCELED) {
117 		/*
118 		 * xfs_trans_delete_ail() drops the AIL lock.
119 		 */
120 		xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip);
121 		xfs_efi_item_free(efip);
122 	} else {
123 		efip->efi_flags |= XFS_EFI_COMMITTED;
124 		spin_unlock(&mp->m_ail_lock);
125 	}
126 }
127 
128 /*
129  * like unpin only we have to also clear the xaction descriptor
130  * pointing the log item if we free the item.  This routine duplicates
131  * unpin because efi_flags is protected by the AIL lock.  Freeing
132  * the descriptor and then calling unpin would force us to drop the AIL
133  * lock which would open up a race condition.
134  */
135 STATIC void
136 xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp)
137 {
138 	xfs_mount_t	*mp;
139 	xfs_log_item_desc_t	*lidp;
140 
141 	mp = efip->efi_item.li_mountp;
142 	spin_lock(&mp->m_ail_lock);
143 	if (efip->efi_flags & XFS_EFI_CANCELED) {
144 		/*
145 		 * free the xaction descriptor pointing to this item
146 		 */
147 		lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) efip);
148 		xfs_trans_free_item(tp, lidp);
149 		/*
150 		 * pull the item off the AIL.
151 		 * xfs_trans_delete_ail() drops the AIL lock.
152 		 */
153 		xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip);
154 		xfs_efi_item_free(efip);
155 	} else {
156 		efip->efi_flags |= XFS_EFI_COMMITTED;
157 		spin_unlock(&mp->m_ail_lock);
158 	}
159 }
160 
161 /*
162  * Efi items have no locking or pushing.  However, since EFIs are
163  * pulled from the AIL when their corresponding EFDs are committed
164  * to disk, their situation is very similar to being pinned.  Return
165  * XFS_ITEM_PINNED so that the caller will eventually flush the log.
166  * This should help in getting the EFI out of the AIL.
167  */
168 /*ARGSUSED*/
169 STATIC uint
170 xfs_efi_item_trylock(xfs_efi_log_item_t *efip)
171 {
172 	return XFS_ITEM_PINNED;
173 }
174 
175 /*
176  * Efi items have no locking, so just return.
177  */
178 /*ARGSUSED*/
179 STATIC void
180 xfs_efi_item_unlock(xfs_efi_log_item_t *efip)
181 {
182 	if (efip->efi_item.li_flags & XFS_LI_ABORTED)
183 		xfs_efi_item_free(efip);
184 	return;
185 }
186 
187 /*
188  * The EFI is logged only once and cannot be moved in the log, so
189  * simply return the lsn at which it's been logged.  The canceled
190  * flag is not paid any attention here.  Checking for that is delayed
191  * until the EFI is unpinned.
192  */
193 /*ARGSUSED*/
194 STATIC xfs_lsn_t
195 xfs_efi_item_committed(xfs_efi_log_item_t *efip, xfs_lsn_t lsn)
196 {
197 	return lsn;
198 }
199 
200 /*
201  * There isn't much you can do to push on an efi item.  It is simply
202  * stuck waiting for all of its corresponding efd items to be
203  * committed to disk.
204  */
205 /*ARGSUSED*/
206 STATIC void
207 xfs_efi_item_push(xfs_efi_log_item_t *efip)
208 {
209 	return;
210 }
211 
212 /*
213  * The EFI dependency tracking op doesn't do squat.  It can't because
214  * it doesn't know where the free extent is coming from.  The dependency
215  * tracking has to be handled by the "enclosing" metadata object.  For
216  * example, for inodes, the inode is locked throughout the extent freeing
217  * so the dependency should be recorded there.
218  */
219 /*ARGSUSED*/
220 STATIC void
221 xfs_efi_item_committing(xfs_efi_log_item_t *efip, xfs_lsn_t lsn)
222 {
223 	return;
224 }
225 
226 /*
227  * This is the ops vector shared by all efi log items.
228  */
229 static struct xfs_item_ops xfs_efi_item_ops = {
230 	.iop_size	= (uint(*)(xfs_log_item_t*))xfs_efi_item_size,
231 	.iop_format	= (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
232 					xfs_efi_item_format,
233 	.iop_pin	= (void(*)(xfs_log_item_t*))xfs_efi_item_pin,
234 	.iop_unpin	= (void(*)(xfs_log_item_t*, int))xfs_efi_item_unpin,
235 	.iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t *))
236 					xfs_efi_item_unpin_remove,
237 	.iop_trylock	= (uint(*)(xfs_log_item_t*))xfs_efi_item_trylock,
238 	.iop_unlock	= (void(*)(xfs_log_item_t*))xfs_efi_item_unlock,
239 	.iop_committed	= (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t))
240 					xfs_efi_item_committed,
241 	.iop_push	= (void(*)(xfs_log_item_t*))xfs_efi_item_push,
242 	.iop_pushbuf	= NULL,
243 	.iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t))
244 					xfs_efi_item_committing
245 };
246 
247 
248 /*
249  * Allocate and initialize an efi item with the given number of extents.
250  */
251 xfs_efi_log_item_t *
252 xfs_efi_init(xfs_mount_t	*mp,
253 	     uint		nextents)
254 
255 {
256 	xfs_efi_log_item_t	*efip;
257 	uint			size;
258 
259 	ASSERT(nextents > 0);
260 	if (nextents > XFS_EFI_MAX_FAST_EXTENTS) {
261 		size = (uint)(sizeof(xfs_efi_log_item_t) +
262 			((nextents - 1) * sizeof(xfs_extent_t)));
263 		efip = (xfs_efi_log_item_t*)kmem_zalloc(size, KM_SLEEP);
264 	} else {
265 		efip = (xfs_efi_log_item_t*)kmem_zone_zalloc(xfs_efi_zone,
266 							     KM_SLEEP);
267 	}
268 
269 	efip->efi_item.li_type = XFS_LI_EFI;
270 	efip->efi_item.li_ops = &xfs_efi_item_ops;
271 	efip->efi_item.li_mountp = mp;
272 	efip->efi_format.efi_nextents = nextents;
273 	efip->efi_format.efi_id = (__psint_t)(void*)efip;
274 
275 	return (efip);
276 }
277 
278 /*
279  * Copy an EFI format buffer from the given buf, and into the destination
280  * EFI format structure.
281  * The given buffer can be in 32 bit or 64 bit form (which has different padding),
282  * one of which will be the native format for this kernel.
283  * It will handle the conversion of formats if necessary.
284  */
285 int
286 xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt)
287 {
288 	xfs_efi_log_format_t *src_efi_fmt = (xfs_efi_log_format_t *)buf->i_addr;
289 	uint i;
290 	uint len = sizeof(xfs_efi_log_format_t) +
291 		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_t);
292 	uint len32 = sizeof(xfs_efi_log_format_32_t) +
293 		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_32_t);
294 	uint len64 = sizeof(xfs_efi_log_format_64_t) +
295 		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_64_t);
296 
297 	if (buf->i_len == len) {
298 		memcpy((char *)dst_efi_fmt, (char*)src_efi_fmt, len);
299 		return 0;
300 	} else if (buf->i_len == len32) {
301 		xfs_efi_log_format_32_t *src_efi_fmt_32 =
302 			(xfs_efi_log_format_32_t *)buf->i_addr;
303 
304 		dst_efi_fmt->efi_type     = src_efi_fmt_32->efi_type;
305 		dst_efi_fmt->efi_size     = src_efi_fmt_32->efi_size;
306 		dst_efi_fmt->efi_nextents = src_efi_fmt_32->efi_nextents;
307 		dst_efi_fmt->efi_id       = src_efi_fmt_32->efi_id;
308 		for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
309 			dst_efi_fmt->efi_extents[i].ext_start =
310 				src_efi_fmt_32->efi_extents[i].ext_start;
311 			dst_efi_fmt->efi_extents[i].ext_len =
312 				src_efi_fmt_32->efi_extents[i].ext_len;
313 		}
314 		return 0;
315 	} else if (buf->i_len == len64) {
316 		xfs_efi_log_format_64_t *src_efi_fmt_64 =
317 			(xfs_efi_log_format_64_t *)buf->i_addr;
318 
319 		dst_efi_fmt->efi_type     = src_efi_fmt_64->efi_type;
320 		dst_efi_fmt->efi_size     = src_efi_fmt_64->efi_size;
321 		dst_efi_fmt->efi_nextents = src_efi_fmt_64->efi_nextents;
322 		dst_efi_fmt->efi_id       = src_efi_fmt_64->efi_id;
323 		for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
324 			dst_efi_fmt->efi_extents[i].ext_start =
325 				src_efi_fmt_64->efi_extents[i].ext_start;
326 			dst_efi_fmt->efi_extents[i].ext_len =
327 				src_efi_fmt_64->efi_extents[i].ext_len;
328 		}
329 		return 0;
330 	}
331 	return EFSCORRUPTED;
332 }
333 
334 /*
335  * This is called by the efd item code below to release references to
336  * the given efi item.  Each efd calls this with the number of
337  * extents that it has logged, and when the sum of these reaches
338  * the total number of extents logged by this efi item we can free
339  * the efi item.
340  *
341  * Freeing the efi item requires that we remove it from the AIL.
342  * We'll use the AIL lock to protect our counters as well as
343  * the removal from the AIL.
344  */
345 void
346 xfs_efi_release(xfs_efi_log_item_t	*efip,
347 		uint			nextents)
348 {
349 	xfs_mount_t	*mp;
350 	int		extents_left;
351 
352 	mp = efip->efi_item.li_mountp;
353 	ASSERT(efip->efi_next_extent > 0);
354 	ASSERT(efip->efi_flags & XFS_EFI_COMMITTED);
355 
356 	spin_lock(&mp->m_ail_lock);
357 	ASSERT(efip->efi_next_extent >= nextents);
358 	efip->efi_next_extent -= nextents;
359 	extents_left = efip->efi_next_extent;
360 	if (extents_left == 0) {
361 		/*
362 		 * xfs_trans_delete_ail() drops the AIL lock.
363 		 */
364 		xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip);
365 		xfs_efi_item_free(efip);
366 	} else {
367 		spin_unlock(&mp->m_ail_lock);
368 	}
369 }
370 
371 STATIC void
372 xfs_efd_item_free(xfs_efd_log_item_t *efdp)
373 {
374 	int nexts = efdp->efd_format.efd_nextents;
375 
376 	if (nexts > XFS_EFD_MAX_FAST_EXTENTS) {
377 		kmem_free(efdp, sizeof(xfs_efd_log_item_t) +
378 				(nexts - 1) * sizeof(xfs_extent_t));
379 	} else {
380 		kmem_zone_free(xfs_efd_zone, efdp);
381 	}
382 }
383 
384 /*
385  * This returns the number of iovecs needed to log the given efd item.
386  * We only need 1 iovec for an efd item.  It just logs the efd_log_format
387  * structure.
388  */
389 /*ARGSUSED*/
390 STATIC uint
391 xfs_efd_item_size(xfs_efd_log_item_t *efdp)
392 {
393 	return 1;
394 }
395 
396 /*
397  * This is called to fill in the vector of log iovecs for the
398  * given efd log item. We use only 1 iovec, and we point that
399  * at the efd_log_format structure embedded in the efd item.
400  * It is at this point that we assert that all of the extent
401  * slots in the efd item have been filled.
402  */
403 STATIC void
404 xfs_efd_item_format(xfs_efd_log_item_t	*efdp,
405 		    xfs_log_iovec_t	*log_vector)
406 {
407 	uint	size;
408 
409 	ASSERT(efdp->efd_next_extent == efdp->efd_format.efd_nextents);
410 
411 	efdp->efd_format.efd_type = XFS_LI_EFD;
412 
413 	size = sizeof(xfs_efd_log_format_t);
414 	size += (efdp->efd_format.efd_nextents - 1) * sizeof(xfs_extent_t);
415 	efdp->efd_format.efd_size = 1;
416 
417 	log_vector->i_addr = (xfs_caddr_t)&(efdp->efd_format);
418 	log_vector->i_len = size;
419 	XLOG_VEC_SET_TYPE(log_vector, XLOG_REG_TYPE_EFD_FORMAT);
420 	ASSERT(size >= sizeof(xfs_efd_log_format_t));
421 }
422 
423 
424 /*
425  * Pinning has no meaning for an efd item, so just return.
426  */
427 /*ARGSUSED*/
428 STATIC void
429 xfs_efd_item_pin(xfs_efd_log_item_t *efdp)
430 {
431 	return;
432 }
433 
434 
435 /*
436  * Since pinning has no meaning for an efd item, unpinning does
437  * not either.
438  */
439 /*ARGSUSED*/
440 STATIC void
441 xfs_efd_item_unpin(xfs_efd_log_item_t *efdp, int stale)
442 {
443 	return;
444 }
445 
446 /*ARGSUSED*/
447 STATIC void
448 xfs_efd_item_unpin_remove(xfs_efd_log_item_t *efdp, xfs_trans_t *tp)
449 {
450 	return;
451 }
452 
453 /*
454  * Efd items have no locking, so just return success.
455  */
456 /*ARGSUSED*/
457 STATIC uint
458 xfs_efd_item_trylock(xfs_efd_log_item_t *efdp)
459 {
460 	return XFS_ITEM_LOCKED;
461 }
462 
463 /*
464  * Efd items have no locking or pushing, so return failure
465  * so that the caller doesn't bother with us.
466  */
467 /*ARGSUSED*/
468 STATIC void
469 xfs_efd_item_unlock(xfs_efd_log_item_t *efdp)
470 {
471 	if (efdp->efd_item.li_flags & XFS_LI_ABORTED)
472 		xfs_efd_item_free(efdp);
473 	return;
474 }
475 
476 /*
477  * When the efd item is committed to disk, all we need to do
478  * is delete our reference to our partner efi item and then
479  * free ourselves.  Since we're freeing ourselves we must
480  * return -1 to keep the transaction code from further referencing
481  * this item.
482  */
483 /*ARGSUSED*/
484 STATIC xfs_lsn_t
485 xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn)
486 {
487 	/*
488 	 * If we got a log I/O error, it's always the case that the LR with the
489 	 * EFI got unpinned and freed before the EFD got aborted.
490 	 */
491 	if ((efdp->efd_item.li_flags & XFS_LI_ABORTED) == 0)
492 		xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents);
493 
494 	xfs_efd_item_free(efdp);
495 	return (xfs_lsn_t)-1;
496 }
497 
498 /*
499  * There isn't much you can do to push on an efd item.  It is simply
500  * stuck waiting for the log to be flushed to disk.
501  */
502 /*ARGSUSED*/
503 STATIC void
504 xfs_efd_item_push(xfs_efd_log_item_t *efdp)
505 {
506 	return;
507 }
508 
509 /*
510  * The EFD dependency tracking op doesn't do squat.  It can't because
511  * it doesn't know where the free extent is coming from.  The dependency
512  * tracking has to be handled by the "enclosing" metadata object.  For
513  * example, for inodes, the inode is locked throughout the extent freeing
514  * so the dependency should be recorded there.
515  */
516 /*ARGSUSED*/
517 STATIC void
518 xfs_efd_item_committing(xfs_efd_log_item_t *efip, xfs_lsn_t lsn)
519 {
520 	return;
521 }
522 
523 /*
524  * This is the ops vector shared by all efd log items.
525  */
526 static struct xfs_item_ops xfs_efd_item_ops = {
527 	.iop_size	= (uint(*)(xfs_log_item_t*))xfs_efd_item_size,
528 	.iop_format	= (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
529 					xfs_efd_item_format,
530 	.iop_pin	= (void(*)(xfs_log_item_t*))xfs_efd_item_pin,
531 	.iop_unpin	= (void(*)(xfs_log_item_t*, int))xfs_efd_item_unpin,
532 	.iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t*))
533 					xfs_efd_item_unpin_remove,
534 	.iop_trylock	= (uint(*)(xfs_log_item_t*))xfs_efd_item_trylock,
535 	.iop_unlock	= (void(*)(xfs_log_item_t*))xfs_efd_item_unlock,
536 	.iop_committed	= (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t))
537 					xfs_efd_item_committed,
538 	.iop_push	= (void(*)(xfs_log_item_t*))xfs_efd_item_push,
539 	.iop_pushbuf	= NULL,
540 	.iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t))
541 					xfs_efd_item_committing
542 };
543 
544 
545 /*
546  * Allocate and initialize an efd item with the given number of extents.
547  */
548 xfs_efd_log_item_t *
549 xfs_efd_init(xfs_mount_t	*mp,
550 	     xfs_efi_log_item_t	*efip,
551 	     uint		nextents)
552 
553 {
554 	xfs_efd_log_item_t	*efdp;
555 	uint			size;
556 
557 	ASSERT(nextents > 0);
558 	if (nextents > XFS_EFD_MAX_FAST_EXTENTS) {
559 		size = (uint)(sizeof(xfs_efd_log_item_t) +
560 			((nextents - 1) * sizeof(xfs_extent_t)));
561 		efdp = (xfs_efd_log_item_t*)kmem_zalloc(size, KM_SLEEP);
562 	} else {
563 		efdp = (xfs_efd_log_item_t*)kmem_zone_zalloc(xfs_efd_zone,
564 							     KM_SLEEP);
565 	}
566 
567 	efdp->efd_item.li_type = XFS_LI_EFD;
568 	efdp->efd_item.li_ops = &xfs_efd_item_ops;
569 	efdp->efd_item.li_mountp = mp;
570 	efdp->efd_efip = efip;
571 	efdp->efd_format.efd_nextents = nextents;
572 	efdp->efd_format.efd_efi_id = efip->efi_format.efi_id;
573 
574 	return (efdp);
575 }
576