GNU Linux-libre 4.19.264-gnu1
[releases.git] / fs / xfs / xfs_refcount_item.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2016 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <darrick.wong@oracle.com>
5  */
6 #include "xfs.h"
7 #include "xfs_fs.h"
8 #include "xfs_format.h"
9 #include "xfs_log_format.h"
10 #include "xfs_trans_resv.h"
11 #include "xfs_bit.h"
12 #include "xfs_shared.h"
13 #include "xfs_mount.h"
14 #include "xfs_defer.h"
15 #include "xfs_trans.h"
16 #include "xfs_trans_priv.h"
17 #include "xfs_buf_item.h"
18 #include "xfs_refcount_item.h"
19 #include "xfs_log.h"
20 #include "xfs_refcount.h"
21
22
23 kmem_zone_t     *xfs_cui_zone;
24 kmem_zone_t     *xfs_cud_zone;
25
26 static inline struct xfs_cui_log_item *CUI_ITEM(struct xfs_log_item *lip)
27 {
28         return container_of(lip, struct xfs_cui_log_item, cui_item);
29 }
30
31 void
32 xfs_cui_item_free(
33         struct xfs_cui_log_item *cuip)
34 {
35         if (cuip->cui_format.cui_nextents > XFS_CUI_MAX_FAST_EXTENTS)
36                 kmem_free(cuip);
37         else
38                 kmem_zone_free(xfs_cui_zone, cuip);
39 }
40
41 /*
42  * Freeing the CUI requires that we remove it from the AIL if it has already
43  * been placed there. However, the CUI may not yet have been placed in the AIL
44  * when called by xfs_cui_release() from CUD processing due to the ordering of
45  * committed vs unpin operations in bulk insert operations. Hence the reference
46  * count to ensure only the last caller frees the CUI.
47  */
48 void
49 xfs_cui_release(
50         struct xfs_cui_log_item *cuip)
51 {
52         ASSERT(atomic_read(&cuip->cui_refcount) > 0);
53         if (atomic_dec_and_test(&cuip->cui_refcount)) {
54                 xfs_trans_ail_remove(&cuip->cui_item, SHUTDOWN_LOG_IO_ERROR);
55                 xfs_cui_item_free(cuip);
56         }
57 }
58
59
60 STATIC void
61 xfs_cui_item_size(
62         struct xfs_log_item     *lip,
63         int                     *nvecs,
64         int                     *nbytes)
65 {
66         struct xfs_cui_log_item *cuip = CUI_ITEM(lip);
67
68         *nvecs += 1;
69         *nbytes += xfs_cui_log_format_sizeof(cuip->cui_format.cui_nextents);
70 }
71
72 /*
73  * This is called to fill in the vector of log iovecs for the
74  * given cui log item. We use only 1 iovec, and we point that
75  * at the cui_log_format structure embedded in the cui item.
76  * It is at this point that we assert that all of the extent
77  * slots in the cui item have been filled.
78  */
79 STATIC void
80 xfs_cui_item_format(
81         struct xfs_log_item     *lip,
82         struct xfs_log_vec      *lv)
83 {
84         struct xfs_cui_log_item *cuip = CUI_ITEM(lip);
85         struct xfs_log_iovec    *vecp = NULL;
86
87         ASSERT(atomic_read(&cuip->cui_next_extent) ==
88                         cuip->cui_format.cui_nextents);
89
90         cuip->cui_format.cui_type = XFS_LI_CUI;
91         cuip->cui_format.cui_size = 1;
92
93         xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_CUI_FORMAT, &cuip->cui_format,
94                         xfs_cui_log_format_sizeof(cuip->cui_format.cui_nextents));
95 }
96
97 /*
98  * Pinning has no meaning for an cui item, so just return.
99  */
100 STATIC void
101 xfs_cui_item_pin(
102         struct xfs_log_item     *lip)
103 {
104 }
105
106 /*
107  * The unpin operation is the last place an CUI is manipulated in the log. It is
108  * either inserted in the AIL or aborted in the event of a log I/O error. In
109  * either case, the CUI transaction has been successfully committed to make it
110  * this far. Therefore, we expect whoever committed the CUI to either construct
111  * and commit the CUD or drop the CUD's reference in the event of error. Simply
112  * drop the log's CUI reference now that the log is done with it.
113  */
114 STATIC void
115 xfs_cui_item_unpin(
116         struct xfs_log_item     *lip,
117         int                     remove)
118 {
119         struct xfs_cui_log_item *cuip = CUI_ITEM(lip);
120
121         xfs_cui_release(cuip);
122 }
123
124 /*
125  * CUI items have no locking or pushing.  However, since CUIs are pulled from
126  * the AIL when their corresponding CUDs are committed to disk, their situation
127  * is very similar to being pinned.  Return XFS_ITEM_PINNED so that the caller
128  * will eventually flush the log.  This should help in getting the CUI out of
129  * the AIL.
130  */
131 STATIC uint
132 xfs_cui_item_push(
133         struct xfs_log_item     *lip,
134         struct list_head        *buffer_list)
135 {
136         return XFS_ITEM_PINNED;
137 }
138
139 /*
140  * The CUI has been either committed or aborted if the transaction has been
141  * cancelled. If the transaction was cancelled, an CUD isn't going to be
142  * constructed and thus we free the CUI here directly.
143  */
144 STATIC void
145 xfs_cui_item_unlock(
146         struct xfs_log_item     *lip)
147 {
148         if (test_bit(XFS_LI_ABORTED, &lip->li_flags))
149                 xfs_cui_release(CUI_ITEM(lip));
150 }
151
152 /*
153  * The CUI is logged only once and cannot be moved in the log, so simply return
154  * the lsn at which it's been logged.
155  */
156 STATIC xfs_lsn_t
157 xfs_cui_item_committed(
158         struct xfs_log_item     *lip,
159         xfs_lsn_t               lsn)
160 {
161         return lsn;
162 }
163
164 /*
165  * The CUI dependency tracking op doesn't do squat.  It can't because
166  * it doesn't know where the free extent is coming from.  The dependency
167  * tracking has to be handled by the "enclosing" metadata object.  For
168  * example, for inodes, the inode is locked throughout the extent freeing
169  * so the dependency should be recorded there.
170  */
171 STATIC void
172 xfs_cui_item_committing(
173         struct xfs_log_item     *lip,
174         xfs_lsn_t               lsn)
175 {
176 }
177
178 /*
179  * This is the ops vector shared by all cui log items.
180  */
181 static const struct xfs_item_ops xfs_cui_item_ops = {
182         .iop_size       = xfs_cui_item_size,
183         .iop_format     = xfs_cui_item_format,
184         .iop_pin        = xfs_cui_item_pin,
185         .iop_unpin      = xfs_cui_item_unpin,
186         .iop_unlock     = xfs_cui_item_unlock,
187         .iop_committed  = xfs_cui_item_committed,
188         .iop_push       = xfs_cui_item_push,
189         .iop_committing = xfs_cui_item_committing,
190 };
191
192 /*
193  * Allocate and initialize an cui item with the given number of extents.
194  */
195 struct xfs_cui_log_item *
196 xfs_cui_init(
197         struct xfs_mount                *mp,
198         uint                            nextents)
199
200 {
201         struct xfs_cui_log_item         *cuip;
202
203         ASSERT(nextents > 0);
204         if (nextents > XFS_CUI_MAX_FAST_EXTENTS)
205                 cuip = kmem_zalloc(xfs_cui_log_item_sizeof(nextents),
206                                 KM_SLEEP);
207         else
208                 cuip = kmem_zone_zalloc(xfs_cui_zone, KM_SLEEP);
209
210         xfs_log_item_init(mp, &cuip->cui_item, XFS_LI_CUI, &xfs_cui_item_ops);
211         cuip->cui_format.cui_nextents = nextents;
212         cuip->cui_format.cui_id = (uintptr_t)(void *)cuip;
213         atomic_set(&cuip->cui_next_extent, 0);
214         atomic_set(&cuip->cui_refcount, 2);
215
216         return cuip;
217 }
218
219 static inline struct xfs_cud_log_item *CUD_ITEM(struct xfs_log_item *lip)
220 {
221         return container_of(lip, struct xfs_cud_log_item, cud_item);
222 }
223
224 STATIC void
225 xfs_cud_item_size(
226         struct xfs_log_item     *lip,
227         int                     *nvecs,
228         int                     *nbytes)
229 {
230         *nvecs += 1;
231         *nbytes += sizeof(struct xfs_cud_log_format);
232 }
233
234 /*
235  * This is called to fill in the vector of log iovecs for the
236  * given cud log item. We use only 1 iovec, and we point that
237  * at the cud_log_format structure embedded in the cud item.
238  * It is at this point that we assert that all of the extent
239  * slots in the cud item have been filled.
240  */
241 STATIC void
242 xfs_cud_item_format(
243         struct xfs_log_item     *lip,
244         struct xfs_log_vec      *lv)
245 {
246         struct xfs_cud_log_item *cudp = CUD_ITEM(lip);
247         struct xfs_log_iovec    *vecp = NULL;
248
249         cudp->cud_format.cud_type = XFS_LI_CUD;
250         cudp->cud_format.cud_size = 1;
251
252         xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_CUD_FORMAT, &cudp->cud_format,
253                         sizeof(struct xfs_cud_log_format));
254 }
255
256 /*
257  * Pinning has no meaning for an cud item, so just return.
258  */
259 STATIC void
260 xfs_cud_item_pin(
261         struct xfs_log_item     *lip)
262 {
263 }
264
265 /*
266  * Since pinning has no meaning for an cud item, unpinning does
267  * not either.
268  */
269 STATIC void
270 xfs_cud_item_unpin(
271         struct xfs_log_item     *lip,
272         int                     remove)
273 {
274 }
275
276 /*
277  * There isn't much you can do to push on an cud item.  It is simply stuck
278  * waiting for the log to be flushed to disk.
279  */
280 STATIC uint
281 xfs_cud_item_push(
282         struct xfs_log_item     *lip,
283         struct list_head        *buffer_list)
284 {
285         return XFS_ITEM_PINNED;
286 }
287
288 /*
289  * The CUD is either committed or aborted if the transaction is cancelled. If
290  * the transaction is cancelled, drop our reference to the CUI and free the
291  * CUD.
292  */
293 STATIC void
294 xfs_cud_item_unlock(
295         struct xfs_log_item     *lip)
296 {
297         struct xfs_cud_log_item *cudp = CUD_ITEM(lip);
298
299         if (test_bit(XFS_LI_ABORTED, &lip->li_flags)) {
300                 xfs_cui_release(cudp->cud_cuip);
301                 kmem_zone_free(xfs_cud_zone, cudp);
302         }
303 }
304
305 /*
306  * When the cud item is committed to disk, all we need to do is delete our
307  * reference to our partner cui item and then free ourselves. Since we're
308  * freeing ourselves we must return -1 to keep the transaction code from
309  * further referencing this item.
310  */
311 STATIC xfs_lsn_t
312 xfs_cud_item_committed(
313         struct xfs_log_item     *lip,
314         xfs_lsn_t               lsn)
315 {
316         struct xfs_cud_log_item *cudp = CUD_ITEM(lip);
317
318         /*
319          * Drop the CUI reference regardless of whether the CUD has been
320          * aborted. Once the CUD transaction is constructed, it is the sole
321          * responsibility of the CUD to release the CUI (even if the CUI is
322          * aborted due to log I/O error).
323          */
324         xfs_cui_release(cudp->cud_cuip);
325         kmem_zone_free(xfs_cud_zone, cudp);
326
327         return (xfs_lsn_t)-1;
328 }
329
330 /*
331  * The CUD dependency tracking op doesn't do squat.  It can't because
332  * it doesn't know where the free extent is coming from.  The dependency
333  * tracking has to be handled by the "enclosing" metadata object.  For
334  * example, for inodes, the inode is locked throughout the extent freeing
335  * so the dependency should be recorded there.
336  */
337 STATIC void
338 xfs_cud_item_committing(
339         struct xfs_log_item     *lip,
340         xfs_lsn_t               lsn)
341 {
342 }
343
344 /*
345  * This is the ops vector shared by all cud log items.
346  */
347 static const struct xfs_item_ops xfs_cud_item_ops = {
348         .iop_size       = xfs_cud_item_size,
349         .iop_format     = xfs_cud_item_format,
350         .iop_pin        = xfs_cud_item_pin,
351         .iop_unpin      = xfs_cud_item_unpin,
352         .iop_unlock     = xfs_cud_item_unlock,
353         .iop_committed  = xfs_cud_item_committed,
354         .iop_push       = xfs_cud_item_push,
355         .iop_committing = xfs_cud_item_committing,
356 };
357
358 /*
359  * Allocate and initialize an cud item with the given number of extents.
360  */
361 struct xfs_cud_log_item *
362 xfs_cud_init(
363         struct xfs_mount                *mp,
364         struct xfs_cui_log_item         *cuip)
365
366 {
367         struct xfs_cud_log_item *cudp;
368
369         cudp = kmem_zone_zalloc(xfs_cud_zone, KM_SLEEP);
370         xfs_log_item_init(mp, &cudp->cud_item, XFS_LI_CUD, &xfs_cud_item_ops);
371         cudp->cud_cuip = cuip;
372         cudp->cud_format.cud_cui_id = cuip->cui_format.cui_id;
373
374         return cudp;
375 }
376
377 /*
378  * Process a refcount update intent item that was recovered from the log.
379  * We need to update the refcountbt.
380  */
381 int
382 xfs_cui_recover(
383         struct xfs_trans                *parent_tp,
384         struct xfs_cui_log_item         *cuip)
385 {
386         int                             i;
387         int                             error = 0;
388         unsigned int                    refc_type;
389         struct xfs_phys_extent          *refc;
390         xfs_fsblock_t                   startblock_fsb;
391         bool                            op_ok;
392         struct xfs_cud_log_item         *cudp;
393         struct xfs_trans                *tp;
394         struct xfs_btree_cur            *rcur = NULL;
395         enum xfs_refcount_intent_type   type;
396         xfs_fsblock_t                   new_fsb;
397         xfs_extlen_t                    new_len;
398         struct xfs_bmbt_irec            irec;
399         bool                            requeue_only = false;
400         struct xfs_mount                *mp = parent_tp->t_mountp;
401
402         ASSERT(!test_bit(XFS_CUI_RECOVERED, &cuip->cui_flags));
403
404         /*
405          * First check the validity of the extents described by the
406          * CUI.  If any are bad, then assume that all are bad and
407          * just toss the CUI.
408          */
409         for (i = 0; i < cuip->cui_format.cui_nextents; i++) {
410                 refc = &cuip->cui_format.cui_extents[i];
411                 startblock_fsb = XFS_BB_TO_FSB(mp,
412                                    XFS_FSB_TO_DADDR(mp, refc->pe_startblock));
413                 switch (refc->pe_flags & XFS_REFCOUNT_EXTENT_TYPE_MASK) {
414                 case XFS_REFCOUNT_INCREASE:
415                 case XFS_REFCOUNT_DECREASE:
416                 case XFS_REFCOUNT_ALLOC_COW:
417                 case XFS_REFCOUNT_FREE_COW:
418                         op_ok = true;
419                         break;
420                 default:
421                         op_ok = false;
422                         break;
423                 }
424                 if (!op_ok || startblock_fsb == 0 ||
425                     refc->pe_len == 0 ||
426                     startblock_fsb >= mp->m_sb.sb_dblocks ||
427                     refc->pe_len >= mp->m_sb.sb_agblocks ||
428                     (refc->pe_flags & ~XFS_REFCOUNT_EXTENT_FLAGS)) {
429                         /*
430                          * This will pull the CUI from the AIL and
431                          * free the memory associated with it.
432                          */
433                         set_bit(XFS_CUI_RECOVERED, &cuip->cui_flags);
434                         xfs_cui_release(cuip);
435                         return -EIO;
436                 }
437         }
438
439         /*
440          * Under normal operation, refcount updates are deferred, so we
441          * wouldn't be adding them directly to a transaction.  All
442          * refcount updates manage reservation usage internally and
443          * dynamically by deferring work that won't fit in the
444          * transaction.  Normally, any work that needs to be deferred
445          * gets attached to the same defer_ops that scheduled the
446          * refcount update.  However, we're in log recovery here, so we
447          * we use the passed in defer_ops and to finish up any work that
448          * doesn't fit.  We need to reserve enough blocks to handle a
449          * full btree split on either end of the refcount range.
450          */
451         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate,
452                         mp->m_refc_maxlevels * 2, 0, XFS_TRANS_RESERVE, &tp);
453         if (error)
454                 return error;
455         /*
456          * Recovery stashes all deferred ops during intent processing and
457          * finishes them on completion. Transfer current dfops state to this
458          * transaction and transfer the result back before we return.
459          */
460         xfs_defer_move(tp, parent_tp);
461         cudp = xfs_trans_get_cud(tp, cuip);
462
463         for (i = 0; i < cuip->cui_format.cui_nextents; i++) {
464                 refc = &cuip->cui_format.cui_extents[i];
465                 refc_type = refc->pe_flags & XFS_REFCOUNT_EXTENT_TYPE_MASK;
466                 switch (refc_type) {
467                 case XFS_REFCOUNT_INCREASE:
468                 case XFS_REFCOUNT_DECREASE:
469                 case XFS_REFCOUNT_ALLOC_COW:
470                 case XFS_REFCOUNT_FREE_COW:
471                         type = refc_type;
472                         break;
473                 default:
474                         error = -EFSCORRUPTED;
475                         goto abort_error;
476                 }
477                 if (requeue_only) {
478                         new_fsb = refc->pe_startblock;
479                         new_len = refc->pe_len;
480                 } else
481                         error = xfs_trans_log_finish_refcount_update(tp, cudp,
482                                 type, refc->pe_startblock, refc->pe_len,
483                                 &new_fsb, &new_len, &rcur);
484                 if (error)
485                         goto abort_error;
486
487                 /* Requeue what we didn't finish. */
488                 if (new_len > 0) {
489                         irec.br_startblock = new_fsb;
490                         irec.br_blockcount = new_len;
491                         switch (type) {
492                         case XFS_REFCOUNT_INCREASE:
493                                 error = xfs_refcount_increase_extent(tp, &irec);
494                                 break;
495                         case XFS_REFCOUNT_DECREASE:
496                                 error = xfs_refcount_decrease_extent(tp, &irec);
497                                 break;
498                         case XFS_REFCOUNT_ALLOC_COW:
499                                 error = xfs_refcount_alloc_cow_extent(tp,
500                                                 irec.br_startblock,
501                                                 irec.br_blockcount);
502                                 break;
503                         case XFS_REFCOUNT_FREE_COW:
504                                 error = xfs_refcount_free_cow_extent(tp,
505                                                 irec.br_startblock,
506                                                 irec.br_blockcount);
507                                 break;
508                         default:
509                                 ASSERT(0);
510                         }
511                         if (error)
512                                 goto abort_error;
513                         requeue_only = true;
514                 }
515         }
516
517         xfs_refcount_finish_one_cleanup(tp, rcur, error);
518         set_bit(XFS_CUI_RECOVERED, &cuip->cui_flags);
519         xfs_defer_move(parent_tp, tp);
520         error = xfs_trans_commit(tp);
521         return error;
522
523 abort_error:
524         xfs_refcount_finish_one_cleanup(tp, rcur, error);
525         xfs_defer_move(parent_tp, tp);
526         xfs_trans_cancel(tp);
527         return error;
528 }