]> Pileus Git - ~andy/linux/blob - fs/xfs/xfs_inode_item.c
xfs remove the XFS_TRANS_DEBUG routines
[~andy/linux] / fs / xfs / xfs_inode_item.c
1 /*
2  * Copyright (c) 2000-2002,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_trans.h"
23 #include "xfs_sb.h"
24 #include "xfs_ag.h"
25 #include "xfs_mount.h"
26 #include "xfs_trans_priv.h"
27 #include "xfs_bmap_btree.h"
28 #include "xfs_dinode.h"
29 #include "xfs_inode.h"
30 #include "xfs_inode_item.h"
31 #include "xfs_error.h"
32 #include "xfs_trace.h"
33
34
35 kmem_zone_t     *xfs_ili_zone;          /* inode log item zone */
36
37 static inline struct xfs_inode_log_item *INODE_ITEM(struct xfs_log_item *lip)
38 {
39         return container_of(lip, struct xfs_inode_log_item, ili_item);
40 }
41
42
43 /*
44  * This returns the number of iovecs needed to log the given inode item.
45  *
46  * We need one iovec for the inode log format structure, one for the
47  * inode core, and possibly one for the inode data/extents/b-tree root
48  * and one for the inode attribute data/extents/b-tree root.
49  */
50 STATIC uint
51 xfs_inode_item_size(
52         struct xfs_log_item     *lip)
53 {
54         struct xfs_inode_log_item *iip = INODE_ITEM(lip);
55         struct xfs_inode        *ip = iip->ili_inode;
56         uint                    nvecs = 2;
57
58         switch (ip->i_d.di_format) {
59         case XFS_DINODE_FMT_EXTENTS:
60                 if ((iip->ili_fields & XFS_ILOG_DEXT) &&
61                     ip->i_d.di_nextents > 0 &&
62                     ip->i_df.if_bytes > 0)
63                         nvecs++;
64                 break;
65
66         case XFS_DINODE_FMT_BTREE:
67                 if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
68                     ip->i_df.if_broot_bytes > 0)
69                         nvecs++;
70                 break;
71
72         case XFS_DINODE_FMT_LOCAL:
73                 if ((iip->ili_fields & XFS_ILOG_DDATA) &&
74                     ip->i_df.if_bytes > 0)
75                         nvecs++;
76                 break;
77
78         case XFS_DINODE_FMT_DEV:
79         case XFS_DINODE_FMT_UUID:
80                 break;
81
82         default:
83                 ASSERT(0);
84                 break;
85         }
86
87         if (!XFS_IFORK_Q(ip))
88                 return nvecs;
89
90
91         /*
92          * Log any necessary attribute data.
93          */
94         switch (ip->i_d.di_aformat) {
95         case XFS_DINODE_FMT_EXTENTS:
96                 if ((iip->ili_fields & XFS_ILOG_AEXT) &&
97                     ip->i_d.di_anextents > 0 &&
98                     ip->i_afp->if_bytes > 0)
99                         nvecs++;
100                 break;
101
102         case XFS_DINODE_FMT_BTREE:
103                 if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
104                     ip->i_afp->if_broot_bytes > 0)
105                         nvecs++;
106                 break;
107
108         case XFS_DINODE_FMT_LOCAL:
109                 if ((iip->ili_fields & XFS_ILOG_ADATA) &&
110                     ip->i_afp->if_bytes > 0)
111                         nvecs++;
112                 break;
113
114         default:
115                 ASSERT(0);
116                 break;
117         }
118
119         return nvecs;
120 }
121
122 /*
123  * xfs_inode_item_format_extents - convert in-core extents to on-disk form
124  *
125  * For either the data or attr fork in extent format, we need to endian convert
126  * the in-core extent as we place them into the on-disk inode. In this case, we
127  * need to do this conversion before we write the extents into the log. Because
128  * we don't have the disk inode to write into here, we allocate a buffer and
129  * format the extents into it via xfs_iextents_copy(). We free the buffer in
130  * the unlock routine after the copy for the log has been made.
131  *
132  * In the case of the data fork, the in-core and on-disk fork sizes can be
133  * different due to delayed allocation extents. We only log on-disk extents
134  * here, so always use the physical fork size to determine the size of the
135  * buffer we need to allocate.
136  */
137 STATIC void
138 xfs_inode_item_format_extents(
139         struct xfs_inode        *ip,
140         struct xfs_log_iovec    *vecp,
141         int                     whichfork,
142         int                     type)
143 {
144         xfs_bmbt_rec_t          *ext_buffer;
145
146         ext_buffer = kmem_alloc(XFS_IFORK_SIZE(ip, whichfork), KM_SLEEP);
147         if (whichfork == XFS_DATA_FORK)
148                 ip->i_itemp->ili_extents_buf = ext_buffer;
149         else
150                 ip->i_itemp->ili_aextents_buf = ext_buffer;
151
152         vecp->i_addr = ext_buffer;
153         vecp->i_len = xfs_iextents_copy(ip, ext_buffer, whichfork);
154         vecp->i_type = type;
155 }
156
157 /*
158  * This is called to fill in the vector of log iovecs for the
159  * given inode log item.  It fills the first item with an inode
160  * log format structure, the second with the on-disk inode structure,
161  * and a possible third and/or fourth with the inode data/extents/b-tree
162  * root and inode attributes data/extents/b-tree root.
163  */
164 STATIC void
165 xfs_inode_item_format(
166         struct xfs_log_item     *lip,
167         struct xfs_log_iovec    *vecp)
168 {
169         struct xfs_inode_log_item *iip = INODE_ITEM(lip);
170         struct xfs_inode        *ip = iip->ili_inode;
171         uint                    nvecs;
172         size_t                  data_bytes;
173         xfs_mount_t             *mp;
174
175         vecp->i_addr = &iip->ili_format;
176         vecp->i_len  = sizeof(xfs_inode_log_format_t);
177         vecp->i_type = XLOG_REG_TYPE_IFORMAT;
178         vecp++;
179         nvecs        = 1;
180
181         vecp->i_addr = &ip->i_d;
182         vecp->i_len  = sizeof(struct xfs_icdinode);
183         vecp->i_type = XLOG_REG_TYPE_ICORE;
184         vecp++;
185         nvecs++;
186
187         /*
188          * If this is really an old format inode, then we need to
189          * log it as such.  This means that we have to copy the link
190          * count from the new field to the old.  We don't have to worry
191          * about the new fields, because nothing trusts them as long as
192          * the old inode version number is there.  If the superblock already
193          * has a new version number, then we don't bother converting back.
194          */
195         mp = ip->i_mount;
196         ASSERT(ip->i_d.di_version == 1 || xfs_sb_version_hasnlink(&mp->m_sb));
197         if (ip->i_d.di_version == 1) {
198                 if (!xfs_sb_version_hasnlink(&mp->m_sb)) {
199                         /*
200                          * Convert it back.
201                          */
202                         ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1);
203                         ip->i_d.di_onlink = ip->i_d.di_nlink;
204                 } else {
205                         /*
206                          * The superblock version has already been bumped,
207                          * so just make the conversion to the new inode
208                          * format permanent.
209                          */
210                         ip->i_d.di_version = 2;
211                         ip->i_d.di_onlink = 0;
212                         memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
213                 }
214         }
215
216         switch (ip->i_d.di_format) {
217         case XFS_DINODE_FMT_EXTENTS:
218                 iip->ili_fields &=
219                         ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT |
220                           XFS_ILOG_DEV | XFS_ILOG_UUID);
221
222                 if ((iip->ili_fields & XFS_ILOG_DEXT) &&
223                     ip->i_d.di_nextents > 0 &&
224                     ip->i_df.if_bytes > 0) {
225                         ASSERT(ip->i_df.if_u1.if_extents != NULL);
226                         ASSERT(ip->i_df.if_bytes / sizeof(xfs_bmbt_rec_t) > 0);
227                         ASSERT(iip->ili_extents_buf == NULL);
228
229 #ifdef XFS_NATIVE_HOST
230                        if (ip->i_d.di_nextents == ip->i_df.if_bytes /
231                                                (uint)sizeof(xfs_bmbt_rec_t)) {
232                                 /*
233                                  * There are no delayed allocation
234                                  * extents, so just point to the
235                                  * real extents array.
236                                  */
237                                 vecp->i_addr = ip->i_df.if_u1.if_extents;
238                                 vecp->i_len = ip->i_df.if_bytes;
239                                 vecp->i_type = XLOG_REG_TYPE_IEXT;
240                         } else
241 #endif
242                         {
243                                 xfs_inode_item_format_extents(ip, vecp,
244                                         XFS_DATA_FORK, XLOG_REG_TYPE_IEXT);
245                         }
246                         ASSERT(vecp->i_len <= ip->i_df.if_bytes);
247                         iip->ili_format.ilf_dsize = vecp->i_len;
248                         vecp++;
249                         nvecs++;
250                 } else {
251                         iip->ili_fields &= ~XFS_ILOG_DEXT;
252                 }
253                 break;
254
255         case XFS_DINODE_FMT_BTREE:
256                 iip->ili_fields &=
257                         ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT |
258                           XFS_ILOG_DEV | XFS_ILOG_UUID);
259
260                 if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
261                     ip->i_df.if_broot_bytes > 0) {
262                         ASSERT(ip->i_df.if_broot != NULL);
263                         vecp->i_addr = ip->i_df.if_broot;
264                         vecp->i_len = ip->i_df.if_broot_bytes;
265                         vecp->i_type = XLOG_REG_TYPE_IBROOT;
266                         vecp++;
267                         nvecs++;
268                         iip->ili_format.ilf_dsize = ip->i_df.if_broot_bytes;
269                 } else {
270                         ASSERT(!(iip->ili_fields &
271                                  XFS_ILOG_DBROOT));
272                         iip->ili_fields &= ~XFS_ILOG_DBROOT;
273                 }
274                 break;
275
276         case XFS_DINODE_FMT_LOCAL:
277                 iip->ili_fields &=
278                         ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT |
279                           XFS_ILOG_DEV | XFS_ILOG_UUID);
280                 if ((iip->ili_fields & XFS_ILOG_DDATA) &&
281                     ip->i_df.if_bytes > 0) {
282                         ASSERT(ip->i_df.if_u1.if_data != NULL);
283                         ASSERT(ip->i_d.di_size > 0);
284
285                         vecp->i_addr = ip->i_df.if_u1.if_data;
286                         /*
287                          * Round i_bytes up to a word boundary.
288                          * The underlying memory is guaranteed to
289                          * to be there by xfs_idata_realloc().
290                          */
291                         data_bytes = roundup(ip->i_df.if_bytes, 4);
292                         ASSERT((ip->i_df.if_real_bytes == 0) ||
293                                (ip->i_df.if_real_bytes == data_bytes));
294                         vecp->i_len = (int)data_bytes;
295                         vecp->i_type = XLOG_REG_TYPE_ILOCAL;
296                         vecp++;
297                         nvecs++;
298                         iip->ili_format.ilf_dsize = (unsigned)data_bytes;
299                 } else {
300                         iip->ili_fields &= ~XFS_ILOG_DDATA;
301                 }
302                 break;
303
304         case XFS_DINODE_FMT_DEV:
305                 iip->ili_fields &=
306                         ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT |
307                           XFS_ILOG_DEXT | XFS_ILOG_UUID);
308                 if (iip->ili_fields & XFS_ILOG_DEV) {
309                         iip->ili_format.ilf_u.ilfu_rdev =
310                                 ip->i_df.if_u2.if_rdev;
311                 }
312                 break;
313
314         case XFS_DINODE_FMT_UUID:
315                 iip->ili_fields &=
316                         ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT |
317                           XFS_ILOG_DEXT | XFS_ILOG_DEV);
318                 if (iip->ili_fields & XFS_ILOG_UUID) {
319                         iip->ili_format.ilf_u.ilfu_uuid =
320                                 ip->i_df.if_u2.if_uuid;
321                 }
322                 break;
323
324         default:
325                 ASSERT(0);
326                 break;
327         }
328
329         /*
330          * If there are no attributes associated with the file, then we're done.
331          */
332         if (!XFS_IFORK_Q(ip)) {
333                 iip->ili_fields &=
334                         ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT);
335                 goto out;
336         }
337
338         switch (ip->i_d.di_aformat) {
339         case XFS_DINODE_FMT_EXTENTS:
340                 iip->ili_fields &=
341                         ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT);
342
343                 if ((iip->ili_fields & XFS_ILOG_AEXT) &&
344                     ip->i_d.di_anextents > 0 &&
345                     ip->i_afp->if_bytes > 0) {
346                         ASSERT(ip->i_afp->if_bytes / sizeof(xfs_bmbt_rec_t) ==
347                                 ip->i_d.di_anextents);
348                         ASSERT(ip->i_afp->if_u1.if_extents != NULL);
349 #ifdef XFS_NATIVE_HOST
350                         /*
351                          * There are not delayed allocation extents
352                          * for attributes, so just point at the array.
353                          */
354                         vecp->i_addr = ip->i_afp->if_u1.if_extents;
355                         vecp->i_len = ip->i_afp->if_bytes;
356                         vecp->i_type = XLOG_REG_TYPE_IATTR_EXT;
357 #else
358                         ASSERT(iip->ili_aextents_buf == NULL);
359                         xfs_inode_item_format_extents(ip, vecp,
360                                         XFS_ATTR_FORK, XLOG_REG_TYPE_IATTR_EXT);
361 #endif
362                         iip->ili_format.ilf_asize = vecp->i_len;
363                         vecp++;
364                         nvecs++;
365                 } else {
366                         iip->ili_fields &= ~XFS_ILOG_AEXT;
367                 }
368                 break;
369
370         case XFS_DINODE_FMT_BTREE:
371                 iip->ili_fields &=
372                         ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT);
373
374                 if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
375                     ip->i_afp->if_broot_bytes > 0) {
376                         ASSERT(ip->i_afp->if_broot != NULL);
377
378                         vecp->i_addr = ip->i_afp->if_broot;
379                         vecp->i_len = ip->i_afp->if_broot_bytes;
380                         vecp->i_type = XLOG_REG_TYPE_IATTR_BROOT;
381                         vecp++;
382                         nvecs++;
383                         iip->ili_format.ilf_asize = ip->i_afp->if_broot_bytes;
384                 } else {
385                         iip->ili_fields &= ~XFS_ILOG_ABROOT;
386                 }
387                 break;
388
389         case XFS_DINODE_FMT_LOCAL:
390                 iip->ili_fields &=
391                         ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT);
392
393                 if ((iip->ili_fields & XFS_ILOG_ADATA) &&
394                     ip->i_afp->if_bytes > 0) {
395                         ASSERT(ip->i_afp->if_u1.if_data != NULL);
396
397                         vecp->i_addr = ip->i_afp->if_u1.if_data;
398                         /*
399                          * Round i_bytes up to a word boundary.
400                          * The underlying memory is guaranteed to
401                          * to be there by xfs_idata_realloc().
402                          */
403                         data_bytes = roundup(ip->i_afp->if_bytes, 4);
404                         ASSERT((ip->i_afp->if_real_bytes == 0) ||
405                                (ip->i_afp->if_real_bytes == data_bytes));
406                         vecp->i_len = (int)data_bytes;
407                         vecp->i_type = XLOG_REG_TYPE_IATTR_LOCAL;
408                         vecp++;
409                         nvecs++;
410                         iip->ili_format.ilf_asize = (unsigned)data_bytes;
411                 } else {
412                         iip->ili_fields &= ~XFS_ILOG_ADATA;
413                 }
414                 break;
415
416         default:
417                 ASSERT(0);
418                 break;
419         }
420
421 out:
422         /*
423          * Now update the log format that goes out to disk from the in-core
424          * values.  We always write the inode core to make the arithmetic
425          * games in recovery easier, which isn't a big deal as just about any
426          * transaction would dirty it anyway.
427          */
428         iip->ili_format.ilf_fields = XFS_ILOG_CORE |
429                 (iip->ili_fields & ~XFS_ILOG_TIMESTAMP);
430         iip->ili_format.ilf_size = nvecs;
431 }
432
433
434 /*
435  * This is called to pin the inode associated with the inode log
436  * item in memory so it cannot be written out.
437  */
438 STATIC void
439 xfs_inode_item_pin(
440         struct xfs_log_item     *lip)
441 {
442         struct xfs_inode        *ip = INODE_ITEM(lip)->ili_inode;
443
444         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
445
446         trace_xfs_inode_pin(ip, _RET_IP_);
447         atomic_inc(&ip->i_pincount);
448 }
449
450
451 /*
452  * This is called to unpin the inode associated with the inode log
453  * item which was previously pinned with a call to xfs_inode_item_pin().
454  *
455  * Also wake up anyone in xfs_iunpin_wait() if the count goes to 0.
456  */
457 STATIC void
458 xfs_inode_item_unpin(
459         struct xfs_log_item     *lip,
460         int                     remove)
461 {
462         struct xfs_inode        *ip = INODE_ITEM(lip)->ili_inode;
463
464         trace_xfs_inode_unpin(ip, _RET_IP_);
465         ASSERT(atomic_read(&ip->i_pincount) > 0);
466         if (atomic_dec_and_test(&ip->i_pincount))
467                 wake_up_bit(&ip->i_flags, __XFS_IPINNED_BIT);
468 }
469
470 STATIC uint
471 xfs_inode_item_push(
472         struct xfs_log_item     *lip,
473         struct list_head        *buffer_list)
474 {
475         struct xfs_inode_log_item *iip = INODE_ITEM(lip);
476         struct xfs_inode        *ip = iip->ili_inode;
477         struct xfs_buf          *bp = NULL;
478         uint                    rval = XFS_ITEM_SUCCESS;
479         int                     error;
480
481         if (xfs_ipincount(ip) > 0)
482                 return XFS_ITEM_PINNED;
483
484         if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED))
485                 return XFS_ITEM_LOCKED;
486
487         /*
488          * Re-check the pincount now that we stabilized the value by
489          * taking the ilock.
490          */
491         if (xfs_ipincount(ip) > 0) {
492                 rval = XFS_ITEM_PINNED;
493                 goto out_unlock;
494         }
495
496         /*
497          * Stale inode items should force out the iclog.
498          */
499         if (ip->i_flags & XFS_ISTALE) {
500                 rval = XFS_ITEM_PINNED;
501                 goto out_unlock;
502         }
503
504         /*
505          * Someone else is already flushing the inode.  Nothing we can do
506          * here but wait for the flush to finish and remove the item from
507          * the AIL.
508          */
509         if (!xfs_iflock_nowait(ip)) {
510                 rval = XFS_ITEM_FLUSHING;
511                 goto out_unlock;
512         }
513
514         ASSERT(iip->ili_fields != 0 || XFS_FORCED_SHUTDOWN(ip->i_mount));
515         ASSERT(iip->ili_logged == 0 || XFS_FORCED_SHUTDOWN(ip->i_mount));
516
517         spin_unlock(&lip->li_ailp->xa_lock);
518
519         error = xfs_iflush(ip, &bp);
520         if (!error) {
521                 if (!xfs_buf_delwri_queue(bp, buffer_list))
522                         rval = XFS_ITEM_FLUSHING;
523                 xfs_buf_relse(bp);
524         }
525
526         spin_lock(&lip->li_ailp->xa_lock);
527 out_unlock:
528         xfs_iunlock(ip, XFS_ILOCK_SHARED);
529         return rval;
530 }
531
532 /*
533  * Unlock the inode associated with the inode log item.
534  * Clear the fields of the inode and inode log item that
535  * are specific to the current transaction.  If the
536  * hold flags is set, do not unlock the inode.
537  */
538 STATIC void
539 xfs_inode_item_unlock(
540         struct xfs_log_item     *lip)
541 {
542         struct xfs_inode_log_item *iip = INODE_ITEM(lip);
543         struct xfs_inode        *ip = iip->ili_inode;
544         unsigned short          lock_flags;
545
546         ASSERT(ip->i_itemp != NULL);
547         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
548
549         /*
550          * If the inode needed a separate buffer with which to log
551          * its extents, then free it now.
552          */
553         if (iip->ili_extents_buf != NULL) {
554                 ASSERT(ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS);
555                 ASSERT(ip->i_d.di_nextents > 0);
556                 ASSERT(iip->ili_fields & XFS_ILOG_DEXT);
557                 ASSERT(ip->i_df.if_bytes > 0);
558                 kmem_free(iip->ili_extents_buf);
559                 iip->ili_extents_buf = NULL;
560         }
561         if (iip->ili_aextents_buf != NULL) {
562                 ASSERT(ip->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS);
563                 ASSERT(ip->i_d.di_anextents > 0);
564                 ASSERT(iip->ili_fields & XFS_ILOG_AEXT);
565                 ASSERT(ip->i_afp->if_bytes > 0);
566                 kmem_free(iip->ili_aextents_buf);
567                 iip->ili_aextents_buf = NULL;
568         }
569
570         lock_flags = iip->ili_lock_flags;
571         iip->ili_lock_flags = 0;
572         if (lock_flags)
573                 xfs_iunlock(ip, lock_flags);
574 }
575
576 /*
577  * This is called to find out where the oldest active copy of the inode log
578  * item in the on disk log resides now that the last log write of it completed
579  * at the given lsn.  Since we always re-log all dirty data in an inode, the
580  * latest copy in the on disk log is the only one that matters.  Therefore,
581  * simply return the given lsn.
582  *
583  * If the inode has been marked stale because the cluster is being freed, we
584  * don't want to (re-)insert this inode into the AIL. There is a race condition
585  * where the cluster buffer may be unpinned before the inode is inserted into
586  * the AIL during transaction committed processing. If the buffer is unpinned
587  * before the inode item has been committed and inserted, then it is possible
588  * for the buffer to be written and IO completes before the inode is inserted
589  * into the AIL. In that case, we'd be inserting a clean, stale inode into the
590  * AIL which will never get removed. It will, however, get reclaimed which
591  * triggers an assert in xfs_inode_free() complaining about freein an inode
592  * still in the AIL.
593  *
594  * To avoid this, just unpin the inode directly and return a LSN of -1 so the
595  * transaction committed code knows that it does not need to do any further
596  * processing on the item.
597  */
598 STATIC xfs_lsn_t
599 xfs_inode_item_committed(
600         struct xfs_log_item     *lip,
601         xfs_lsn_t               lsn)
602 {
603         struct xfs_inode_log_item *iip = INODE_ITEM(lip);
604         struct xfs_inode        *ip = iip->ili_inode;
605
606         if (xfs_iflags_test(ip, XFS_ISTALE)) {
607                 xfs_inode_item_unpin(lip, 0);
608                 return -1;
609         }
610         return lsn;
611 }
612
613 /*
614  * XXX rcc - this one really has to do something.  Probably needs
615  * to stamp in a new field in the incore inode.
616  */
617 STATIC void
618 xfs_inode_item_committing(
619         struct xfs_log_item     *lip,
620         xfs_lsn_t               lsn)
621 {
622         INODE_ITEM(lip)->ili_last_lsn = lsn;
623 }
624
625 /*
626  * This is the ops vector shared by all buf log items.
627  */
628 static const struct xfs_item_ops xfs_inode_item_ops = {
629         .iop_size       = xfs_inode_item_size,
630         .iop_format     = xfs_inode_item_format,
631         .iop_pin        = xfs_inode_item_pin,
632         .iop_unpin      = xfs_inode_item_unpin,
633         .iop_unlock     = xfs_inode_item_unlock,
634         .iop_committed  = xfs_inode_item_committed,
635         .iop_push       = xfs_inode_item_push,
636         .iop_committing = xfs_inode_item_committing
637 };
638
639
640 /*
641  * Initialize the inode log item for a newly allocated (in-core) inode.
642  */
643 void
644 xfs_inode_item_init(
645         struct xfs_inode        *ip,
646         struct xfs_mount        *mp)
647 {
648         struct xfs_inode_log_item *iip;
649
650         ASSERT(ip->i_itemp == NULL);
651         iip = ip->i_itemp = kmem_zone_zalloc(xfs_ili_zone, KM_SLEEP);
652
653         iip->ili_inode = ip;
654         xfs_log_item_init(mp, &iip->ili_item, XFS_LI_INODE,
655                                                 &xfs_inode_item_ops);
656         iip->ili_format.ilf_type = XFS_LI_INODE;
657         iip->ili_format.ilf_ino = ip->i_ino;
658         iip->ili_format.ilf_blkno = ip->i_imap.im_blkno;
659         iip->ili_format.ilf_len = ip->i_imap.im_len;
660         iip->ili_format.ilf_boffset = ip->i_imap.im_boffset;
661 }
662
663 /*
664  * Free the inode log item and any memory hanging off of it.
665  */
666 void
667 xfs_inode_item_destroy(
668         xfs_inode_t     *ip)
669 {
670         kmem_zone_free(xfs_ili_zone, ip->i_itemp);
671 }
672
673
674 /*
675  * This is the inode flushing I/O completion routine.  It is called
676  * from interrupt level when the buffer containing the inode is
677  * flushed to disk.  It is responsible for removing the inode item
678  * from the AIL if it has not been re-logged, and unlocking the inode's
679  * flush lock.
680  *
681  * To reduce AIL lock traffic as much as possible, we scan the buffer log item
682  * list for other inodes that will run this function. We remove them from the
683  * buffer list so we can process all the inode IO completions in one AIL lock
684  * traversal.
685  */
686 void
687 xfs_iflush_done(
688         struct xfs_buf          *bp,
689         struct xfs_log_item     *lip)
690 {
691         struct xfs_inode_log_item *iip;
692         struct xfs_log_item     *blip;
693         struct xfs_log_item     *next;
694         struct xfs_log_item     *prev;
695         struct xfs_ail          *ailp = lip->li_ailp;
696         int                     need_ail = 0;
697
698         /*
699          * Scan the buffer IO completions for other inodes being completed and
700          * attach them to the current inode log item.
701          */
702         blip = bp->b_fspriv;
703         prev = NULL;
704         while (blip != NULL) {
705                 if (lip->li_cb != xfs_iflush_done) {
706                         prev = blip;
707                         blip = blip->li_bio_list;
708                         continue;
709                 }
710
711                 /* remove from list */
712                 next = blip->li_bio_list;
713                 if (!prev) {
714                         bp->b_fspriv = next;
715                 } else {
716                         prev->li_bio_list = next;
717                 }
718
719                 /* add to current list */
720                 blip->li_bio_list = lip->li_bio_list;
721                 lip->li_bio_list = blip;
722
723                 /*
724                  * while we have the item, do the unlocked check for needing
725                  * the AIL lock.
726                  */
727                 iip = INODE_ITEM(blip);
728                 if (iip->ili_logged && blip->li_lsn == iip->ili_flush_lsn)
729                         need_ail++;
730
731                 blip = next;
732         }
733
734         /* make sure we capture the state of the initial inode. */
735         iip = INODE_ITEM(lip);
736         if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn)
737                 need_ail++;
738
739         /*
740          * We only want to pull the item from the AIL if it is
741          * actually there and its location in the log has not
742          * changed since we started the flush.  Thus, we only bother
743          * if the ili_logged flag is set and the inode's lsn has not
744          * changed.  First we check the lsn outside
745          * the lock since it's cheaper, and then we recheck while
746          * holding the lock before removing the inode from the AIL.
747          */
748         if (need_ail) {
749                 struct xfs_log_item *log_items[need_ail];
750                 int i = 0;
751                 spin_lock(&ailp->xa_lock);
752                 for (blip = lip; blip; blip = blip->li_bio_list) {
753                         iip = INODE_ITEM(blip);
754                         if (iip->ili_logged &&
755                             blip->li_lsn == iip->ili_flush_lsn) {
756                                 log_items[i++] = blip;
757                         }
758                         ASSERT(i <= need_ail);
759                 }
760                 /* xfs_trans_ail_delete_bulk() drops the AIL lock. */
761                 xfs_trans_ail_delete_bulk(ailp, log_items, i,
762                                           SHUTDOWN_CORRUPT_INCORE);
763         }
764
765
766         /*
767          * clean up and unlock the flush lock now we are done. We can clear the
768          * ili_last_fields bits now that we know that the data corresponding to
769          * them is safely on disk.
770          */
771         for (blip = lip; blip; blip = next) {
772                 next = blip->li_bio_list;
773                 blip->li_bio_list = NULL;
774
775                 iip = INODE_ITEM(blip);
776                 iip->ili_logged = 0;
777                 iip->ili_last_fields = 0;
778                 xfs_ifunlock(iip->ili_inode);
779         }
780 }
781
782 /*
783  * This is the inode flushing abort routine.  It is called from xfs_iflush when
784  * the filesystem is shutting down to clean up the inode state.  It is
785  * responsible for removing the inode item from the AIL if it has not been
786  * re-logged, and unlocking the inode's flush lock.
787  */
788 void
789 xfs_iflush_abort(
790         xfs_inode_t             *ip,
791         bool                    stale)
792 {
793         xfs_inode_log_item_t    *iip = ip->i_itemp;
794
795         if (iip) {
796                 struct xfs_ail  *ailp = iip->ili_item.li_ailp;
797                 if (iip->ili_item.li_flags & XFS_LI_IN_AIL) {
798                         spin_lock(&ailp->xa_lock);
799                         if (iip->ili_item.li_flags & XFS_LI_IN_AIL) {
800                                 /* xfs_trans_ail_delete() drops the AIL lock. */
801                                 xfs_trans_ail_delete(ailp, &iip->ili_item,
802                                                 stale ?
803                                                      SHUTDOWN_LOG_IO_ERROR :
804                                                      SHUTDOWN_CORRUPT_INCORE);
805                         } else
806                                 spin_unlock(&ailp->xa_lock);
807                 }
808                 iip->ili_logged = 0;
809                 /*
810                  * Clear the ili_last_fields bits now that we know that the
811                  * data corresponding to them is safely on disk.
812                  */
813                 iip->ili_last_fields = 0;
814                 /*
815                  * Clear the inode logging fields so no more flushes are
816                  * attempted.
817                  */
818                 iip->ili_fields = 0;
819         }
820         /*
821          * Release the inode's flush lock since we're done with it.
822          */
823         xfs_ifunlock(ip);
824 }
825
826 void
827 xfs_istale_done(
828         struct xfs_buf          *bp,
829         struct xfs_log_item     *lip)
830 {
831         xfs_iflush_abort(INODE_ITEM(lip)->ili_inode, true);
832 }
833
834 /*
835  * convert an xfs_inode_log_format struct from either 32 or 64 bit versions
836  * (which can have different field alignments) to the native version
837  */
838 int
839 xfs_inode_item_format_convert(
840         xfs_log_iovec_t         *buf,
841         xfs_inode_log_format_t  *in_f)
842 {
843         if (buf->i_len == sizeof(xfs_inode_log_format_32_t)) {
844                 xfs_inode_log_format_32_t *in_f32 = buf->i_addr;
845
846                 in_f->ilf_type = in_f32->ilf_type;
847                 in_f->ilf_size = in_f32->ilf_size;
848                 in_f->ilf_fields = in_f32->ilf_fields;
849                 in_f->ilf_asize = in_f32->ilf_asize;
850                 in_f->ilf_dsize = in_f32->ilf_dsize;
851                 in_f->ilf_ino = in_f32->ilf_ino;
852                 /* copy biggest field of ilf_u */
853                 memcpy(in_f->ilf_u.ilfu_uuid.__u_bits,
854                        in_f32->ilf_u.ilfu_uuid.__u_bits,
855                        sizeof(uuid_t));
856                 in_f->ilf_blkno = in_f32->ilf_blkno;
857                 in_f->ilf_len = in_f32->ilf_len;
858                 in_f->ilf_boffset = in_f32->ilf_boffset;
859                 return 0;
860         } else if (buf->i_len == sizeof(xfs_inode_log_format_64_t)){
861                 xfs_inode_log_format_64_t *in_f64 = buf->i_addr;
862
863                 in_f->ilf_type = in_f64->ilf_type;
864                 in_f->ilf_size = in_f64->ilf_size;
865                 in_f->ilf_fields = in_f64->ilf_fields;
866                 in_f->ilf_asize = in_f64->ilf_asize;
867                 in_f->ilf_dsize = in_f64->ilf_dsize;
868                 in_f->ilf_ino = in_f64->ilf_ino;
869                 /* copy biggest field of ilf_u */
870                 memcpy(in_f->ilf_u.ilfu_uuid.__u_bits,
871                        in_f64->ilf_u.ilfu_uuid.__u_bits,
872                        sizeof(uuid_t));
873                 in_f->ilf_blkno = in_f64->ilf_blkno;
874                 in_f->ilf_len = in_f64->ilf_len;
875                 in_f->ilf_boffset = in_f64->ilf_boffset;
876                 return 0;
877         }
878         return EFSCORRUPTED;
879 }