fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / fs / xfs / xfs_inode.c
1 /*
2  * Copyright (c) 2000-2006 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_bit.h"
22 #include "xfs_log.h"
23 #include "xfs_inum.h"
24 #include "xfs_imap.h"
25 #include "xfs_trans.h"
26 #include "xfs_trans_priv.h"
27 #include "xfs_sb.h"
28 #include "xfs_ag.h"
29 #include "xfs_dir2.h"
30 #include "xfs_dmapi.h"
31 #include "xfs_mount.h"
32 #include "xfs_bmap_btree.h"
33 #include "xfs_alloc_btree.h"
34 #include "xfs_ialloc_btree.h"
35 #include "xfs_dir2_sf.h"
36 #include "xfs_attr_sf.h"
37 #include "xfs_dinode.h"
38 #include "xfs_inode.h"
39 #include "xfs_buf_item.h"
40 #include "xfs_inode_item.h"
41 #include "xfs_btree.h"
42 #include "xfs_alloc.h"
43 #include "xfs_ialloc.h"
44 #include "xfs_bmap.h"
45 #include "xfs_rw.h"
46 #include "xfs_error.h"
47 #include "xfs_utils.h"
48 #include "xfs_dir2_trace.h"
49 #include "xfs_quota.h"
50 #include "xfs_mac.h"
51 #include "xfs_acl.h"
52
53 #include <linux/vs_tag.h>
54
55 kmem_zone_t *xfs_ifork_zone;
56 kmem_zone_t *xfs_inode_zone;
57 kmem_zone_t *xfs_chashlist_zone;
58
59 /*
60  * Used in xfs_itruncate().  This is the maximum number of extents
61  * freed from a file in a single transaction.
62  */
63 #define XFS_ITRUNC_MAX_EXTENTS  2
64
65 STATIC int xfs_iflush_int(xfs_inode_t *, xfs_buf_t *);
66 STATIC int xfs_iformat_local(xfs_inode_t *, xfs_dinode_t *, int, int);
67 STATIC int xfs_iformat_extents(xfs_inode_t *, xfs_dinode_t *, int);
68 STATIC int xfs_iformat_btree(xfs_inode_t *, xfs_dinode_t *, int);
69
70
71 #ifdef DEBUG
72 /*
73  * Make sure that the extents in the given memory buffer
74  * are valid.
75  */
76 STATIC void
77 xfs_validate_extents(
78         xfs_ifork_t             *ifp,
79         int                     nrecs,
80         int                     disk,
81         xfs_exntfmt_t           fmt)
82 {
83         xfs_bmbt_rec_t          *ep;
84         xfs_bmbt_irec_t         irec;
85         xfs_bmbt_rec_t          rec;
86         int                     i;
87
88         for (i = 0; i < nrecs; i++) {
89                 ep = xfs_iext_get_ext(ifp, i);
90                 rec.l0 = get_unaligned((__uint64_t*)&ep->l0);
91                 rec.l1 = get_unaligned((__uint64_t*)&ep->l1);
92                 if (disk)
93                         xfs_bmbt_disk_get_all(&rec, &irec);
94                 else
95                         xfs_bmbt_get_all(&rec, &irec);
96                 if (fmt == XFS_EXTFMT_NOSTATE)
97                         ASSERT(irec.br_state == XFS_EXT_NORM);
98         }
99 }
100 #else /* DEBUG */
101 #define xfs_validate_extents(ifp, nrecs, disk, fmt)
102 #endif /* DEBUG */
103
104 /*
105  * Check that none of the inode's in the buffer have a next
106  * unlinked field of 0.
107  */
108 #if defined(DEBUG)
109 void
110 xfs_inobp_check(
111         xfs_mount_t     *mp,
112         xfs_buf_t       *bp)
113 {
114         int             i;
115         int             j;
116         xfs_dinode_t    *dip;
117
118         j = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog;
119
120         for (i = 0; i < j; i++) {
121                 dip = (xfs_dinode_t *)xfs_buf_offset(bp,
122                                         i * mp->m_sb.sb_inodesize);
123                 if (!dip->di_next_unlinked)  {
124                         xfs_fs_cmn_err(CE_ALERT, mp,
125                                 "Detected a bogus zero next_unlinked field in incore inode buffer 0x%p.  About to pop an ASSERT.",
126                                 bp);
127                         ASSERT(dip->di_next_unlinked);
128                 }
129         }
130 }
131 #endif
132
133 /*
134  * This routine is called to map an inode number within a file
135  * system to the buffer containing the on-disk version of the
136  * inode.  It returns a pointer to the buffer containing the
137  * on-disk inode in the bpp parameter, and in the dip parameter
138  * it returns a pointer to the on-disk inode within that buffer.
139  *
140  * If a non-zero error is returned, then the contents of bpp and
141  * dipp are undefined.
142  *
143  * Use xfs_imap() to determine the size and location of the
144  * buffer to read from disk.
145  */
146 STATIC int
147 xfs_inotobp(
148         xfs_mount_t     *mp,
149         xfs_trans_t     *tp,
150         xfs_ino_t       ino,
151         xfs_dinode_t    **dipp,
152         xfs_buf_t       **bpp,
153         int             *offset)
154 {
155         int             di_ok;
156         xfs_imap_t      imap;
157         xfs_buf_t       *bp;
158         int             error;
159         xfs_dinode_t    *dip;
160
161         /*
162          * Call the space management code to find the location of the
163          * inode on disk.
164          */
165         imap.im_blkno = 0;
166         error = xfs_imap(mp, tp, ino, &imap, XFS_IMAP_LOOKUP);
167         if (error != 0) {
168                 cmn_err(CE_WARN,
169         "xfs_inotobp: xfs_imap()  returned an "
170         "error %d on %s.  Returning error.", error, mp->m_fsname);
171                 return error;
172         }
173
174         /*
175          * If the inode number maps to a block outside the bounds of the
176          * file system then return NULL rather than calling read_buf
177          * and panicing when we get an error from the driver.
178          */
179         if ((imap.im_blkno + imap.im_len) >
180             XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) {
181                 cmn_err(CE_WARN,
182         "xfs_inotobp: inode number (%llu + %d) maps to a block outside the bounds "
183         "of the file system %s.  Returning EINVAL.",
184                         (unsigned long long)imap.im_blkno,
185                         imap.im_len, mp->m_fsname);
186                 return XFS_ERROR(EINVAL);
187         }
188
189         /*
190          * Read in the buffer.  If tp is NULL, xfs_trans_read_buf() will
191          * default to just a read_buf() call.
192          */
193         error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap.im_blkno,
194                                    (int)imap.im_len, XFS_BUF_LOCK, &bp);
195
196         if (error) {
197                 cmn_err(CE_WARN,
198         "xfs_inotobp: xfs_trans_read_buf()  returned an "
199         "error %d on %s.  Returning error.", error, mp->m_fsname);
200                 return error;
201         }
202         dip = (xfs_dinode_t *)xfs_buf_offset(bp, 0);
203         di_ok =
204                 INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC &&
205                 XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT));
206         if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP,
207                         XFS_RANDOM_ITOBP_INOTOBP))) {
208                 XFS_CORRUPTION_ERROR("xfs_inotobp", XFS_ERRLEVEL_LOW, mp, dip);
209                 xfs_trans_brelse(tp, bp);
210                 cmn_err(CE_WARN,
211         "xfs_inotobp: XFS_TEST_ERROR()  returned an "
212         "error on %s.  Returning EFSCORRUPTED.",  mp->m_fsname);
213                 return XFS_ERROR(EFSCORRUPTED);
214         }
215
216         xfs_inobp_check(mp, bp);
217
218         /*
219          * Set *dipp to point to the on-disk inode in the buffer.
220          */
221         *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset);
222         *bpp = bp;
223         *offset = imap.im_boffset;
224         return 0;
225 }
226
227
228 /*
229  * This routine is called to map an inode to the buffer containing
230  * the on-disk version of the inode.  It returns a pointer to the
231  * buffer containing the on-disk inode in the bpp parameter, and in
232  * the dip parameter it returns a pointer to the on-disk inode within
233  * that buffer.
234  *
235  * If a non-zero error is returned, then the contents of bpp and
236  * dipp are undefined.
237  *
238  * If the inode is new and has not yet been initialized, use xfs_imap()
239  * to determine the size and location of the buffer to read from disk.
240  * If the inode has already been mapped to its buffer and read in once,
241  * then use the mapping information stored in the inode rather than
242  * calling xfs_imap().  This allows us to avoid the overhead of looking
243  * at the inode btree for small block file systems (see xfs_dilocate()).
244  * We can tell whether the inode has been mapped in before by comparing
245  * its disk block address to 0.  Only uninitialized inodes will have
246  * 0 for the disk block address.
247  */
248 int
249 xfs_itobp(
250         xfs_mount_t     *mp,
251         xfs_trans_t     *tp,
252         xfs_inode_t     *ip,
253         xfs_dinode_t    **dipp,
254         xfs_buf_t       **bpp,
255         xfs_daddr_t     bno,
256         uint            imap_flags)
257 {
258         xfs_imap_t      imap;
259         xfs_buf_t       *bp;
260         int             error;
261         int             i;
262         int             ni;
263
264         if (ip->i_blkno == (xfs_daddr_t)0) {
265                 /*
266                  * Call the space management code to find the location of the
267                  * inode on disk.
268                  */
269                 imap.im_blkno = bno;
270                 if ((error = xfs_imap(mp, tp, ip->i_ino, &imap,
271                                         XFS_IMAP_LOOKUP | imap_flags)))
272                         return error;
273
274                 /*
275                  * If the inode number maps to a block outside the bounds
276                  * of the file system then return NULL rather than calling
277                  * read_buf and panicing when we get an error from the
278                  * driver.
279                  */
280                 if ((imap.im_blkno + imap.im_len) >
281                     XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) {
282 #ifdef DEBUG
283                         xfs_fs_cmn_err(CE_ALERT, mp, "xfs_itobp: "
284                                         "(imap.im_blkno (0x%llx) "
285                                         "+ imap.im_len (0x%llx)) > "
286                                         " XFS_FSB_TO_BB(mp, "
287                                         "mp->m_sb.sb_dblocks) (0x%llx)",
288                                         (unsigned long long) imap.im_blkno,
289                                         (unsigned long long) imap.im_len,
290                                         XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks));
291 #endif /* DEBUG */
292                         return XFS_ERROR(EINVAL);
293                 }
294
295                 /*
296                  * Fill in the fields in the inode that will be used to
297                  * map the inode to its buffer from now on.
298                  */
299                 ip->i_blkno = imap.im_blkno;
300                 ip->i_len = imap.im_len;
301                 ip->i_boffset = imap.im_boffset;
302         } else {
303                 /*
304                  * We've already mapped the inode once, so just use the
305                  * mapping that we saved the first time.
306                  */
307                 imap.im_blkno = ip->i_blkno;
308                 imap.im_len = ip->i_len;
309                 imap.im_boffset = ip->i_boffset;
310         }
311         ASSERT(bno == 0 || bno == imap.im_blkno);
312
313         /*
314          * Read in the buffer.  If tp is NULL, xfs_trans_read_buf() will
315          * default to just a read_buf() call.
316          */
317         error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap.im_blkno,
318                                    (int)imap.im_len, XFS_BUF_LOCK, &bp);
319         if (error) {
320 #ifdef DEBUG
321                 xfs_fs_cmn_err(CE_ALERT, mp, "xfs_itobp: "
322                                 "xfs_trans_read_buf() returned error %d, "
323                                 "imap.im_blkno 0x%llx, imap.im_len 0x%llx",
324                                 error, (unsigned long long) imap.im_blkno,
325                                 (unsigned long long) imap.im_len);
326 #endif /* DEBUG */
327                 return error;
328         }
329
330         /*
331          * Validate the magic number and version of every inode in the buffer
332          * (if DEBUG kernel) or the first inode in the buffer, otherwise.
333          * No validation is done here in userspace (xfs_repair).
334          */
335 #if !defined(__KERNEL__)
336         ni = 0;
337 #elif defined(DEBUG)
338         ni = BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog;
339 #else   /* usual case */
340         ni = 1;
341 #endif
342
343         for (i = 0; i < ni; i++) {
344                 int             di_ok;
345                 xfs_dinode_t    *dip;
346
347                 dip = (xfs_dinode_t *)xfs_buf_offset(bp,
348                                         (i << mp->m_sb.sb_inodelog));
349                 di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC &&
350                             XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT));
351                 if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
352                                                 XFS_ERRTAG_ITOBP_INOTOBP,
353                                                 XFS_RANDOM_ITOBP_INOTOBP))) {
354                         if (imap_flags & XFS_IMAP_BULKSTAT) {
355                                 xfs_trans_brelse(tp, bp);
356                                 return XFS_ERROR(EINVAL);
357                         }
358 #ifdef DEBUG
359                         cmn_err(CE_ALERT,
360                                         "Device %s - bad inode magic/vsn "
361                                         "daddr %lld #%d (magic=%x)",
362                                 XFS_BUFTARG_NAME(mp->m_ddev_targp),
363                                 (unsigned long long)imap.im_blkno, i,
364                                 INT_GET(dip->di_core.di_magic, ARCH_CONVERT));
365 #endif
366                         XFS_CORRUPTION_ERROR("xfs_itobp", XFS_ERRLEVEL_HIGH,
367                                              mp, dip);
368                         xfs_trans_brelse(tp, bp);
369                         return XFS_ERROR(EFSCORRUPTED);
370                 }
371         }
372
373         xfs_inobp_check(mp, bp);
374
375         /*
376          * Mark the buffer as an inode buffer now that it looks good
377          */
378         XFS_BUF_SET_VTYPE(bp, B_FS_INO);
379
380         /*
381          * Set *dipp to point to the on-disk inode in the buffer.
382          */
383         *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset);
384         *bpp = bp;
385         return 0;
386 }
387
388 /*
389  * Move inode type and inode format specific information from the
390  * on-disk inode to the in-core inode.  For fifos, devs, and sockets
391  * this means set if_rdev to the proper value.  For files, directories,
392  * and symlinks this means to bring in the in-line data or extent
393  * pointers.  For a file in B-tree format, only the root is immediately
394  * brought in-core.  The rest will be in-lined in if_extents when it
395  * is first referenced (see xfs_iread_extents()).
396  */
397 STATIC int
398 xfs_iformat(
399         xfs_inode_t             *ip,
400         xfs_dinode_t            *dip)
401 {
402         xfs_attr_shortform_t    *atp;
403         int                     size;
404         int                     error;
405         xfs_fsize_t             di_size;
406         ip->i_df.if_ext_max =
407                 XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t);
408         error = 0;
409
410         if (unlikely(
411             INT_GET(dip->di_core.di_nextents, ARCH_CONVERT) +
412                 INT_GET(dip->di_core.di_anextents, ARCH_CONVERT) >
413             INT_GET(dip->di_core.di_nblocks, ARCH_CONVERT))) {
414                 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
415                         "corrupt dinode %Lu, extent total = %d, nblocks = %Lu.",
416                         (unsigned long long)ip->i_ino,
417                         (int)(INT_GET(dip->di_core.di_nextents, ARCH_CONVERT)
418                             + INT_GET(dip->di_core.di_anextents, ARCH_CONVERT)),
419                         (unsigned long long)
420                         INT_GET(dip->di_core.di_nblocks, ARCH_CONVERT));
421                 XFS_CORRUPTION_ERROR("xfs_iformat(1)", XFS_ERRLEVEL_LOW,
422                                      ip->i_mount, dip);
423                 return XFS_ERROR(EFSCORRUPTED);
424         }
425
426         if (unlikely(INT_GET(dip->di_core.di_forkoff, ARCH_CONVERT) > ip->i_mount->m_sb.sb_inodesize)) {
427                 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
428                         "corrupt dinode %Lu, forkoff = 0x%x.",
429                         (unsigned long long)ip->i_ino,
430                         (int)(INT_GET(dip->di_core.di_forkoff, ARCH_CONVERT)));
431                 XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW,
432                                      ip->i_mount, dip);
433                 return XFS_ERROR(EFSCORRUPTED);
434         }
435
436         switch (ip->i_d.di_mode & S_IFMT) {
437         case S_IFIFO:
438         case S_IFCHR:
439         case S_IFBLK:
440         case S_IFSOCK:
441                 if (unlikely(INT_GET(dip->di_core.di_format, ARCH_CONVERT) != XFS_DINODE_FMT_DEV)) {
442                         XFS_CORRUPTION_ERROR("xfs_iformat(3)", XFS_ERRLEVEL_LOW,
443                                               ip->i_mount, dip);
444                         return XFS_ERROR(EFSCORRUPTED);
445                 }
446                 ip->i_d.di_size = 0;
447                 ip->i_df.if_u2.if_rdev = INT_GET(dip->di_u.di_dev, ARCH_CONVERT);
448                 break;
449
450         case S_IFREG:
451         case S_IFLNK:
452         case S_IFDIR:
453                 switch (INT_GET(dip->di_core.di_format, ARCH_CONVERT)) {
454                 case XFS_DINODE_FMT_LOCAL:
455                         /*
456                          * no local regular files yet
457                          */
458                         if (unlikely((INT_GET(dip->di_core.di_mode, ARCH_CONVERT) & S_IFMT) == S_IFREG)) {
459                                 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
460                                         "corrupt inode %Lu "
461                                         "(local format for regular file).",
462                                         (unsigned long long) ip->i_ino);
463                                 XFS_CORRUPTION_ERROR("xfs_iformat(4)",
464                                                      XFS_ERRLEVEL_LOW,
465                                                      ip->i_mount, dip);
466                                 return XFS_ERROR(EFSCORRUPTED);
467                         }
468
469                         di_size = INT_GET(dip->di_core.di_size, ARCH_CONVERT);
470                         if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) {
471                                 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
472                                         "corrupt inode %Lu "
473                                         "(bad size %Ld for local inode).",
474                                         (unsigned long long) ip->i_ino,
475                                         (long long) di_size);
476                                 XFS_CORRUPTION_ERROR("xfs_iformat(5)",
477                                                      XFS_ERRLEVEL_LOW,
478                                                      ip->i_mount, dip);
479                                 return XFS_ERROR(EFSCORRUPTED);
480                         }
481
482                         size = (int)di_size;
483                         error = xfs_iformat_local(ip, dip, XFS_DATA_FORK, size);
484                         break;
485                 case XFS_DINODE_FMT_EXTENTS:
486                         error = xfs_iformat_extents(ip, dip, XFS_DATA_FORK);
487                         break;
488                 case XFS_DINODE_FMT_BTREE:
489                         error = xfs_iformat_btree(ip, dip, XFS_DATA_FORK);
490                         break;
491                 default:
492                         XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW,
493                                          ip->i_mount);
494                         return XFS_ERROR(EFSCORRUPTED);
495                 }
496                 break;
497
498         default:
499                 XFS_ERROR_REPORT("xfs_iformat(7)", XFS_ERRLEVEL_LOW, ip->i_mount);
500                 return XFS_ERROR(EFSCORRUPTED);
501         }
502         if (error) {
503                 return error;
504         }
505         if (!XFS_DFORK_Q(dip))
506                 return 0;
507         ASSERT(ip->i_afp == NULL);
508         ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP);
509         ip->i_afp->if_ext_max =
510                 XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t);
511         switch (INT_GET(dip->di_core.di_aformat, ARCH_CONVERT)) {
512         case XFS_DINODE_FMT_LOCAL:
513                 atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip);
514                 size = be16_to_cpu(atp->hdr.totsize);
515                 error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size);
516                 break;
517         case XFS_DINODE_FMT_EXTENTS:
518                 error = xfs_iformat_extents(ip, dip, XFS_ATTR_FORK);
519                 break;
520         case XFS_DINODE_FMT_BTREE:
521                 error = xfs_iformat_btree(ip, dip, XFS_ATTR_FORK);
522                 break;
523         default:
524                 error = XFS_ERROR(EFSCORRUPTED);
525                 break;
526         }
527         if (error) {
528                 kmem_zone_free(xfs_ifork_zone, ip->i_afp);
529                 ip->i_afp = NULL;
530                 xfs_idestroy_fork(ip, XFS_DATA_FORK);
531         }
532         return error;
533 }
534
535 /*
536  * The file is in-lined in the on-disk inode.
537  * If it fits into if_inline_data, then copy
538  * it there, otherwise allocate a buffer for it
539  * and copy the data there.  Either way, set
540  * if_data to point at the data.
541  * If we allocate a buffer for the data, make
542  * sure that its size is a multiple of 4 and
543  * record the real size in i_real_bytes.
544  */
545 STATIC int
546 xfs_iformat_local(
547         xfs_inode_t     *ip,
548         xfs_dinode_t    *dip,
549         int             whichfork,
550         int             size)
551 {
552         xfs_ifork_t     *ifp;
553         int             real_size;
554
555         /*
556          * If the size is unreasonable, then something
557          * is wrong and we just bail out rather than crash in
558          * kmem_alloc() or memcpy() below.
559          */
560         if (unlikely(size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) {
561                 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
562                         "corrupt inode %Lu "
563                         "(bad size %d for local fork, size = %d).",
564                         (unsigned long long) ip->i_ino, size,
565                         XFS_DFORK_SIZE(dip, ip->i_mount, whichfork));
566                 XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW,
567                                      ip->i_mount, dip);
568                 return XFS_ERROR(EFSCORRUPTED);
569         }
570         ifp = XFS_IFORK_PTR(ip, whichfork);
571         real_size = 0;
572         if (size == 0)
573                 ifp->if_u1.if_data = NULL;
574         else if (size <= sizeof(ifp->if_u2.if_inline_data))
575                 ifp->if_u1.if_data = ifp->if_u2.if_inline_data;
576         else {
577                 real_size = roundup(size, 4);
578                 ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP);
579         }
580         ifp->if_bytes = size;
581         ifp->if_real_bytes = real_size;
582         if (size)
583                 memcpy(ifp->if_u1.if_data, XFS_DFORK_PTR(dip, whichfork), size);
584         ifp->if_flags &= ~XFS_IFEXTENTS;
585         ifp->if_flags |= XFS_IFINLINE;
586         return 0;
587 }
588
589 /*
590  * The file consists of a set of extents all
591  * of which fit into the on-disk inode.
592  * If there are few enough extents to fit into
593  * the if_inline_ext, then copy them there.
594  * Otherwise allocate a buffer for them and copy
595  * them into it.  Either way, set if_extents
596  * to point at the extents.
597  */
598 STATIC int
599 xfs_iformat_extents(
600         xfs_inode_t     *ip,
601         xfs_dinode_t    *dip,
602         int             whichfork)
603 {
604         xfs_bmbt_rec_t  *ep, *dp;
605         xfs_ifork_t     *ifp;
606         int             nex;
607         int             size;
608         int             i;
609
610         ifp = XFS_IFORK_PTR(ip, whichfork);
611         nex = XFS_DFORK_NEXTENTS(dip, whichfork);
612         size = nex * (uint)sizeof(xfs_bmbt_rec_t);
613
614         /*
615          * If the number of extents is unreasonable, then something
616          * is wrong and we just bail out rather than crash in
617          * kmem_alloc() or memcpy() below.
618          */
619         if (unlikely(size < 0 || size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) {
620                 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
621                         "corrupt inode %Lu ((a)extents = %d).",
622                         (unsigned long long) ip->i_ino, nex);
623                 XFS_CORRUPTION_ERROR("xfs_iformat_extents(1)", XFS_ERRLEVEL_LOW,
624                                      ip->i_mount, dip);
625                 return XFS_ERROR(EFSCORRUPTED);
626         }
627
628         ifp->if_real_bytes = 0;
629         if (nex == 0)
630                 ifp->if_u1.if_extents = NULL;
631         else if (nex <= XFS_INLINE_EXTS)
632                 ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext;
633         else
634                 xfs_iext_add(ifp, 0, nex);
635
636         ifp->if_bytes = size;
637         if (size) {
638                 dp = (xfs_bmbt_rec_t *) XFS_DFORK_PTR(dip, whichfork);
639                 xfs_validate_extents(ifp, nex, 1, XFS_EXTFMT_INODE(ip));
640                 for (i = 0; i < nex; i++, dp++) {
641                         ep = xfs_iext_get_ext(ifp, i);
642                         ep->l0 = INT_GET(get_unaligned((__uint64_t*)&dp->l0),
643                                                                 ARCH_CONVERT);
644                         ep->l1 = INT_GET(get_unaligned((__uint64_t*)&dp->l1),
645                                                                 ARCH_CONVERT);
646                 }
647                 xfs_bmap_trace_exlist("xfs_iformat_extents", ip, nex,
648                         whichfork);
649                 if (whichfork != XFS_DATA_FORK ||
650                         XFS_EXTFMT_INODE(ip) == XFS_EXTFMT_NOSTATE)
651                                 if (unlikely(xfs_check_nostate_extents(
652                                     ifp, 0, nex))) {
653                                         XFS_ERROR_REPORT("xfs_iformat_extents(2)",
654                                                          XFS_ERRLEVEL_LOW,
655                                                          ip->i_mount);
656                                         return XFS_ERROR(EFSCORRUPTED);
657                                 }
658         }
659         ifp->if_flags |= XFS_IFEXTENTS;
660         return 0;
661 }
662
663 /*
664  * The file has too many extents to fit into
665  * the inode, so they are in B-tree format.
666  * Allocate a buffer for the root of the B-tree
667  * and copy the root into it.  The i_extents
668  * field will remain NULL until all of the
669  * extents are read in (when they are needed).
670  */
671 STATIC int
672 xfs_iformat_btree(
673         xfs_inode_t             *ip,
674         xfs_dinode_t            *dip,
675         int                     whichfork)
676 {
677         xfs_bmdr_block_t        *dfp;
678         xfs_ifork_t             *ifp;
679         /* REFERENCED */
680         int                     nrecs;
681         int                     size;
682
683         ifp = XFS_IFORK_PTR(ip, whichfork);
684         dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork);
685         size = XFS_BMAP_BROOT_SPACE(dfp);
686         nrecs = XFS_BMAP_BROOT_NUMRECS(dfp);
687
688         /*
689          * blow out if -- fork has less extents than can fit in
690          * fork (fork shouldn't be a btree format), root btree
691          * block has more records than can fit into the fork,
692          * or the number of extents is greater than the number of
693          * blocks.
694          */
695         if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <= ifp->if_ext_max
696             || XFS_BMDR_SPACE_CALC(nrecs) >
697                         XFS_DFORK_SIZE(dip, ip->i_mount, whichfork)
698             || XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) {
699                 xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
700                         "corrupt inode %Lu (btree).",
701                         (unsigned long long) ip->i_ino);
702                 XFS_ERROR_REPORT("xfs_iformat_btree", XFS_ERRLEVEL_LOW,
703                                  ip->i_mount);
704                 return XFS_ERROR(EFSCORRUPTED);
705         }
706
707         ifp->if_broot_bytes = size;
708         ifp->if_broot = kmem_alloc(size, KM_SLEEP);
709         ASSERT(ifp->if_broot != NULL);
710         /*
711          * Copy and convert from the on-disk structure
712          * to the in-memory structure.
713          */
714         xfs_bmdr_to_bmbt(dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork),
715                 ifp->if_broot, size);
716         ifp->if_flags &= ~XFS_IFEXTENTS;
717         ifp->if_flags |= XFS_IFBROOT;
718
719         return 0;
720 }
721
722 /*
723  * xfs_xlate_dinode_core - translate an xfs_inode_core_t between ondisk
724  * and native format
725  *
726  * buf  = on-disk representation
727  * dip  = native representation
728  * dir  = direction - +ve -> disk to native
729  *                    -ve -> native to disk
730  */
731 void
732 xfs_xlate_dinode_core(
733         xfs_caddr_t             buf,
734         xfs_dinode_core_t       *dip,
735         int                     dir)
736 {
737         xfs_dinode_core_t       *buf_core = (xfs_dinode_core_t *)buf;
738         xfs_dinode_core_t       *mem_core = (xfs_dinode_core_t *)dip;
739         xfs_arch_t              arch = ARCH_CONVERT;
740         uint32_t                uid = 0, gid = 0;
741         uint16_t                tag = 0;
742
743         ASSERT(dir);
744
745         if (dir < 0) {
746                 tag = mem_core->di_tag;
747                 /* FIXME: supposed to use superblock flag */
748                 uid = TAGINO_UID(1, mem_core->di_uid, tag);
749                 gid = TAGINO_GID(1, mem_core->di_gid, tag);
750                 tag = TAGINO_TAG(1, tag);
751         }
752
753         INT_XLATE(buf_core->di_magic, mem_core->di_magic, dir, arch);
754         INT_XLATE(buf_core->di_mode, mem_core->di_mode, dir, arch);
755         INT_XLATE(buf_core->di_version, mem_core->di_version, dir, arch);
756         INT_XLATE(buf_core->di_format, mem_core->di_format, dir, arch);
757         INT_XLATE(buf_core->di_onlink, mem_core->di_onlink, dir, arch);
758         INT_XLATE(buf_core->di_uid, uid, dir, arch);
759         INT_XLATE(buf_core->di_gid, gid, dir, arch);
760         INT_XLATE(buf_core->di_tag, tag, dir, arch);
761         INT_XLATE(buf_core->di_nlink, mem_core->di_nlink, dir, arch);
762         INT_XLATE(buf_core->di_projid, mem_core->di_projid, dir, arch);
763
764         if (dir > 0) {
765                 /* FIXME: supposed to use superblock flag */
766                 mem_core->di_uid = INOTAG_UID(1, uid, gid);
767                 mem_core->di_gid = INOTAG_GID(1, uid, gid);
768                 mem_core->di_tag = INOTAG_TAG(1, uid, gid, tag);
769                 memcpy(mem_core->di_pad, buf_core->di_pad,
770                         sizeof(buf_core->di_pad));
771         } else {
772                 memcpy(buf_core->di_pad, mem_core->di_pad,
773                         sizeof(buf_core->di_pad));
774         }
775
776         INT_XLATE(buf_core->di_flushiter, mem_core->di_flushiter, dir, arch);
777
778         INT_XLATE(buf_core->di_atime.t_sec, mem_core->di_atime.t_sec,
779                         dir, arch);
780         INT_XLATE(buf_core->di_atime.t_nsec, mem_core->di_atime.t_nsec,
781                         dir, arch);
782         INT_XLATE(buf_core->di_mtime.t_sec, mem_core->di_mtime.t_sec,
783                         dir, arch);
784         INT_XLATE(buf_core->di_mtime.t_nsec, mem_core->di_mtime.t_nsec,
785                         dir, arch);
786         INT_XLATE(buf_core->di_ctime.t_sec, mem_core->di_ctime.t_sec,
787                         dir, arch);
788         INT_XLATE(buf_core->di_ctime.t_nsec, mem_core->di_ctime.t_nsec,
789                         dir, arch);
790         INT_XLATE(buf_core->di_size, mem_core->di_size, dir, arch);
791         INT_XLATE(buf_core->di_nblocks, mem_core->di_nblocks, dir, arch);
792         INT_XLATE(buf_core->di_extsize, mem_core->di_extsize, dir, arch);
793         INT_XLATE(buf_core->di_nextents, mem_core->di_nextents, dir, arch);
794         INT_XLATE(buf_core->di_anextents, mem_core->di_anextents, dir, arch);
795         INT_XLATE(buf_core->di_forkoff, mem_core->di_forkoff, dir, arch);
796         INT_XLATE(buf_core->di_aformat, mem_core->di_aformat, dir, arch);
797         INT_XLATE(buf_core->di_dmevmask, mem_core->di_dmevmask, dir, arch);
798         INT_XLATE(buf_core->di_dmstate, mem_core->di_dmstate, dir, arch);
799         INT_XLATE(buf_core->di_flags, mem_core->di_flags, dir, arch);
800         INT_XLATE(buf_core->di_gen, mem_core->di_gen, dir, arch);
801 }
802
803 STATIC uint
804 _xfs_dic2xflags(
805         __uint16_t              di_flags)
806 {
807         uint                    flags = 0;
808
809         if (di_flags & XFS_DIFLAG_ANY) {
810                 if (di_flags & XFS_DIFLAG_REALTIME)
811                         flags |= XFS_XFLAG_REALTIME;
812                 if (di_flags & XFS_DIFLAG_PREALLOC)
813                         flags |= XFS_XFLAG_PREALLOC;
814                 if (di_flags & XFS_DIFLAG_IMMUTABLE)
815                         flags |= XFS_XFLAG_IMMUTABLE;
816                 if (di_flags & XFS_DIFLAG_IUNLINK)
817                         flags |= XFS_XFLAG_IUNLINK;
818                 if (di_flags & XFS_DIFLAG_BARRIER)
819                         flags |= XFS_XFLAG_BARRIER;
820                 if (di_flags & XFS_DIFLAG_APPEND)
821                         flags |= XFS_XFLAG_APPEND;
822                 if (di_flags & XFS_DIFLAG_SYNC)
823                         flags |= XFS_XFLAG_SYNC;
824                 if (di_flags & XFS_DIFLAG_NOATIME)
825                         flags |= XFS_XFLAG_NOATIME;
826                 if (di_flags & XFS_DIFLAG_NODUMP)
827                         flags |= XFS_XFLAG_NODUMP;
828                 if (di_flags & XFS_DIFLAG_RTINHERIT)
829                         flags |= XFS_XFLAG_RTINHERIT;
830                 if (di_flags & XFS_DIFLAG_PROJINHERIT)
831                         flags |= XFS_XFLAG_PROJINHERIT;
832                 if (di_flags & XFS_DIFLAG_NOSYMLINKS)
833                         flags |= XFS_XFLAG_NOSYMLINKS;
834                 if (di_flags & XFS_DIFLAG_EXTSIZE)
835                         flags |= XFS_XFLAG_EXTSIZE;
836                 if (di_flags & XFS_DIFLAG_EXTSZINHERIT)
837                         flags |= XFS_XFLAG_EXTSZINHERIT;
838                 if (di_flags & XFS_DIFLAG_NODEFRAG)
839                         flags |= XFS_XFLAG_NODEFRAG;
840         }
841
842         return flags;
843 }
844
845 uint
846 xfs_ip2xflags(
847         xfs_inode_t             *ip)
848 {
849         xfs_dinode_core_t       *dic = &ip->i_d;
850
851         return _xfs_dic2xflags(dic->di_flags) |
852                                 (XFS_CFORK_Q(dic) ? XFS_XFLAG_HASATTR : 0);
853 }
854
855 uint
856 xfs_dic2xflags(
857         xfs_dinode_core_t       *dic)
858 {
859         return _xfs_dic2xflags(INT_GET(dic->di_flags, ARCH_CONVERT)) |
860                                 (XFS_CFORK_Q_DISK(dic) ? XFS_XFLAG_HASATTR : 0);
861 }
862
863 /*
864  * Given a mount structure and an inode number, return a pointer
865  * to a newly allocated in-core inode corresponding to the given
866  * inode number.
867  *
868  * Initialize the inode's attributes and extent pointers if it
869  * already has them (it will not if the inode has no links).
870  */
871 int
872 xfs_iread(
873         xfs_mount_t     *mp,
874         xfs_trans_t     *tp,
875         xfs_ino_t       ino,
876         xfs_inode_t     **ipp,
877         xfs_daddr_t     bno,
878         uint            imap_flags)
879 {
880         xfs_buf_t       *bp;
881         xfs_dinode_t    *dip;
882         xfs_inode_t     *ip;
883         int             error;
884
885         ASSERT(xfs_inode_zone != NULL);
886
887         ip = kmem_zone_zalloc(xfs_inode_zone, KM_SLEEP);
888         ip->i_ino = ino;
889         ip->i_mount = mp;
890         spin_lock_init(&ip->i_flags_lock);
891
892         /*
893          * Get pointer's to the on-disk inode and the buffer containing it.
894          * If the inode number refers to a block outside the file system
895          * then xfs_itobp() will return NULL.  In this case we should
896          * return NULL as well.  Set i_blkno to 0 so that xfs_itobp() will
897          * know that this is a new incore inode.
898          */
899         error = xfs_itobp(mp, tp, ip, &dip, &bp, bno, imap_flags);
900         if (error) {
901                 kmem_zone_free(xfs_inode_zone, ip);
902                 return error;
903         }
904
905         /*
906          * Initialize inode's trace buffers.
907          * Do this before xfs_iformat in case it adds entries.
908          */
909 #ifdef XFS_BMAP_TRACE
910         ip->i_xtrace = ktrace_alloc(XFS_BMAP_KTRACE_SIZE, KM_SLEEP);
911 #endif
912 #ifdef XFS_BMBT_TRACE
913         ip->i_btrace = ktrace_alloc(XFS_BMBT_KTRACE_SIZE, KM_SLEEP);
914 #endif
915 #ifdef XFS_RW_TRACE
916         ip->i_rwtrace = ktrace_alloc(XFS_RW_KTRACE_SIZE, KM_SLEEP);
917 #endif
918 #ifdef XFS_ILOCK_TRACE
919         ip->i_lock_trace = ktrace_alloc(XFS_ILOCK_KTRACE_SIZE, KM_SLEEP);
920 #endif
921 #ifdef XFS_DIR2_TRACE
922         ip->i_dir_trace = ktrace_alloc(XFS_DIR2_KTRACE_SIZE, KM_SLEEP);
923 #endif
924
925         /*
926          * If we got something that isn't an inode it means someone
927          * (nfs or dmi) has a stale handle.
928          */
929         if (INT_GET(dip->di_core.di_magic, ARCH_CONVERT) != XFS_DINODE_MAGIC) {
930                 kmem_zone_free(xfs_inode_zone, ip);
931                 xfs_trans_brelse(tp, bp);
932 #ifdef DEBUG
933                 xfs_fs_cmn_err(CE_ALERT, mp, "xfs_iread: "
934                                 "dip->di_core.di_magic (0x%x) != "
935                                 "XFS_DINODE_MAGIC (0x%x)",
936                                 INT_GET(dip->di_core.di_magic, ARCH_CONVERT),
937                                 XFS_DINODE_MAGIC);
938 #endif /* DEBUG */
939                 return XFS_ERROR(EINVAL);
940         }
941
942         /*
943          * If the on-disk inode is already linked to a directory
944          * entry, copy all of the inode into the in-core inode.
945          * xfs_iformat() handles copying in the inode format
946          * specific information.
947          * Otherwise, just get the truly permanent information.
948          */
949         if (dip->di_core.di_mode) {
950                 xfs_xlate_dinode_core((xfs_caddr_t)&dip->di_core,
951                      &(ip->i_d), 1);
952                 error = xfs_iformat(ip, dip);
953                 if (error)  {
954                         kmem_zone_free(xfs_inode_zone, ip);
955                         xfs_trans_brelse(tp, bp);
956 #ifdef DEBUG
957                         xfs_fs_cmn_err(CE_ALERT, mp, "xfs_iread: "
958                                         "xfs_iformat() returned error %d",
959                                         error);
960 #endif /* DEBUG */
961                         return error;
962                 }
963         } else {
964                 ip->i_d.di_magic = INT_GET(dip->di_core.di_magic, ARCH_CONVERT);
965                 ip->i_d.di_version = INT_GET(dip->di_core.di_version, ARCH_CONVERT);
966                 ip->i_d.di_gen = INT_GET(dip->di_core.di_gen, ARCH_CONVERT);
967                 ip->i_d.di_flushiter = INT_GET(dip->di_core.di_flushiter, ARCH_CONVERT);
968                 /*
969                  * Make sure to pull in the mode here as well in
970                  * case the inode is released without being used.
971                  * This ensures that xfs_inactive() will see that
972                  * the inode is already free and not try to mess
973                  * with the uninitialized part of it.
974                  */
975                 ip->i_d.di_mode = 0;
976                 /*
977                  * Initialize the per-fork minima and maxima for a new
978                  * inode here.  xfs_iformat will do it for old inodes.
979                  */
980                 ip->i_df.if_ext_max =
981                         XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t);
982         }
983
984         INIT_LIST_HEAD(&ip->i_reclaim);
985
986         /*
987          * The inode format changed when we moved the link count and
988          * made it 32 bits long.  If this is an old format inode,
989          * convert it in memory to look like a new one.  If it gets
990          * flushed to disk we will convert back before flushing or
991          * logging it.  We zero out the new projid field and the old link
992          * count field.  We'll handle clearing the pad field (the remains
993          * of the old uuid field) when we actually convert the inode to
994          * the new format. We don't change the version number so that we
995          * can distinguish this from a real new format inode.
996          */
997         if (ip->i_d.di_version == XFS_DINODE_VERSION_1) {
998                 ip->i_d.di_nlink = ip->i_d.di_onlink;
999                 ip->i_d.di_onlink = 0;
1000                 ip->i_d.di_projid = 0;
1001         }
1002
1003         ip->i_delayed_blks = 0;
1004
1005         /*
1006          * Mark the buffer containing the inode as something to keep
1007          * around for a while.  This helps to keep recently accessed
1008          * meta-data in-core longer.
1009          */
1010          XFS_BUF_SET_REF(bp, XFS_INO_REF);
1011
1012         /*
1013          * Use xfs_trans_brelse() to release the buffer containing the
1014          * on-disk inode, because it was acquired with xfs_trans_read_buf()
1015          * in xfs_itobp() above.  If tp is NULL, this is just a normal
1016          * brelse().  If we're within a transaction, then xfs_trans_brelse()
1017          * will only release the buffer if it is not dirty within the
1018          * transaction.  It will be OK to release the buffer in this case,
1019          * because inodes on disk are never destroyed and we will be
1020          * locking the new in-core inode before putting it in the hash
1021          * table where other processes can find it.  Thus we don't have
1022          * to worry about the inode being changed just because we released
1023          * the buffer.
1024          */
1025         xfs_trans_brelse(tp, bp);
1026         *ipp = ip;
1027         return 0;
1028 }
1029
1030 /*
1031  * Read in extents from a btree-format inode.
1032  * Allocate and fill in if_extents.  Real work is done in xfs_bmap.c.
1033  */
1034 int
1035 xfs_iread_extents(
1036         xfs_trans_t     *tp,
1037         xfs_inode_t     *ip,
1038         int             whichfork)
1039 {
1040         int             error;
1041         xfs_ifork_t     *ifp;
1042         xfs_extnum_t    nextents;
1043         size_t          size;
1044
1045         if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) {
1046                 XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW,
1047                                  ip->i_mount);
1048                 return XFS_ERROR(EFSCORRUPTED);
1049         }
1050         nextents = XFS_IFORK_NEXTENTS(ip, whichfork);
1051         size = nextents * sizeof(xfs_bmbt_rec_t);
1052         ifp = XFS_IFORK_PTR(ip, whichfork);
1053
1054         /*
1055          * We know that the size is valid (it's checked in iformat_btree)
1056          */
1057         ifp->if_lastex = NULLEXTNUM;
1058         ifp->if_bytes = ifp->if_real_bytes = 0;
1059         ifp->if_flags |= XFS_IFEXTENTS;
1060         xfs_iext_add(ifp, 0, nextents);
1061         error = xfs_bmap_read_extents(tp, ip, whichfork);
1062         if (error) {
1063                 xfs_iext_destroy(ifp);
1064                 ifp->if_flags &= ~XFS_IFEXTENTS;
1065                 return error;
1066         }
1067         xfs_validate_extents(ifp, nextents, 0, XFS_EXTFMT_INODE(ip));
1068         return 0;
1069 }
1070
1071 /*
1072  * Allocate an inode on disk and return a copy of its in-core version.
1073  * The in-core inode is locked exclusively.  Set mode, nlink, and rdev
1074  * appropriately within the inode.  The uid and gid for the inode are
1075  * set according to the contents of the given cred structure.
1076  *
1077  * Use xfs_dialloc() to allocate the on-disk inode. If xfs_dialloc()
1078  * has a free inode available, call xfs_iget()
1079  * to obtain the in-core version of the allocated inode.  Finally,
1080  * fill in the inode and log its initial contents.  In this case,
1081  * ialloc_context would be set to NULL and call_again set to false.
1082  *
1083  * If xfs_dialloc() does not have an available inode,
1084  * it will replenish its supply by doing an allocation. Since we can
1085  * only do one allocation within a transaction without deadlocks, we
1086  * must commit the current transaction before returning the inode itself.
1087  * In this case, therefore, we will set call_again to true and return.
1088  * The caller should then commit the current transaction, start a new
1089  * transaction, and call xfs_ialloc() again to actually get the inode.
1090  *
1091  * To ensure that some other process does not grab the inode that
1092  * was allocated during the first call to xfs_ialloc(), this routine
1093  * also returns the [locked] bp pointing to the head of the freelist
1094  * as ialloc_context.  The caller should hold this buffer across
1095  * the commit and pass it back into this routine on the second call.
1096  */
1097 int
1098 xfs_ialloc(
1099         xfs_trans_t     *tp,
1100         xfs_inode_t     *pip,
1101         mode_t          mode,
1102         xfs_nlink_t     nlink,
1103         xfs_dev_t       rdev,
1104         cred_t          *cr,
1105         xfs_prid_t      prid,
1106         int             okalloc,
1107         xfs_buf_t       **ialloc_context,
1108         boolean_t       *call_again,
1109         xfs_inode_t     **ipp)
1110 {
1111         xfs_ino_t       ino;
1112         xfs_inode_t     *ip;
1113         bhv_vnode_t     *vp;
1114         uint            flags;
1115         int             error;
1116
1117         /*
1118          * Call the space management code to pick
1119          * the on-disk inode to be allocated.
1120          */
1121         error = xfs_dialloc(tp, pip->i_ino, mode, okalloc,
1122                             ialloc_context, call_again, &ino);
1123         if (error != 0) {
1124                 return error;
1125         }
1126         if (*call_again || ino == NULLFSINO) {
1127                 *ipp = NULL;
1128                 return 0;
1129         }
1130         ASSERT(*ialloc_context == NULL);
1131
1132         /*
1133          * Get the in-core inode with the lock held exclusively.
1134          * This is because we're setting fields here we need
1135          * to prevent others from looking at until we're done.
1136          */
1137         error = xfs_trans_iget(tp->t_mountp, tp, ino,
1138                                 XFS_IGET_CREATE, XFS_ILOCK_EXCL, &ip);
1139         if (error != 0) {
1140                 return error;
1141         }
1142         ASSERT(ip != NULL);
1143
1144         vp = XFS_ITOV(ip);
1145         ip->i_d.di_mode = (__uint16_t)mode;
1146         ip->i_d.di_onlink = 0;
1147         ip->i_d.di_nlink = nlink;
1148         ASSERT(ip->i_d.di_nlink == nlink);
1149         ip->i_d.di_uid = current_fsuid(cr);
1150         ip->i_d.di_gid = current_fsgid(cr);
1151         ip->i_d.di_tag = current_fstag(cr, vp);
1152         ip->i_d.di_projid = prid;
1153         memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
1154
1155         /*
1156          * If the superblock version is up to where we support new format
1157          * inodes and this is currently an old format inode, then change
1158          * the inode version number now.  This way we only do the conversion
1159          * here rather than here and in the flush/logging code.
1160          */
1161         if (XFS_SB_VERSION_HASNLINK(&tp->t_mountp->m_sb) &&
1162             ip->i_d.di_version == XFS_DINODE_VERSION_1) {
1163                 ip->i_d.di_version = XFS_DINODE_VERSION_2;
1164                 /*
1165                  * We've already zeroed the old link count, the projid field,
1166                  * and the pad field.
1167                  */
1168         }
1169
1170         /*
1171          * Project ids won't be stored on disk if we are using a version 1 inode.
1172          */
1173         if ( (prid != 0) && (ip->i_d.di_version == XFS_DINODE_VERSION_1))
1174                 xfs_bump_ino_vers2(tp, ip);
1175
1176         if (XFS_INHERIT_GID(pip, vp->v_vfsp)) {
1177                 ip->i_d.di_gid = pip->i_d.di_gid;
1178                 if ((pip->i_d.di_mode & S_ISGID) && (mode & S_IFMT) == S_IFDIR) {
1179                         ip->i_d.di_mode |= S_ISGID;
1180                 }
1181         }
1182
1183         /*
1184          * If the group ID of the new file does not match the effective group
1185          * ID or one of the supplementary group IDs, the S_ISGID bit is cleared
1186          * (and only if the irix_sgid_inherit compatibility variable is set).
1187          */
1188         if ((irix_sgid_inherit) &&
1189             (ip->i_d.di_mode & S_ISGID) &&
1190             (!in_group_p((gid_t)ip->i_d.di_gid))) {
1191                 ip->i_d.di_mode &= ~S_ISGID;
1192         }
1193
1194         ip->i_d.di_size = 0;
1195         ip->i_d.di_nextents = 0;
1196         ASSERT(ip->i_d.di_nblocks == 0);
1197         xfs_ichgtime(ip, XFS_ICHGTIME_CHG|XFS_ICHGTIME_ACC|XFS_ICHGTIME_MOD);
1198         /*
1199          * di_gen will have been taken care of in xfs_iread.
1200          */
1201         ip->i_d.di_extsize = 0;
1202         ip->i_d.di_dmevmask = 0;
1203         ip->i_d.di_dmstate = 0;
1204         ip->i_d.di_flags = 0;
1205         flags = XFS_ILOG_CORE;
1206         switch (mode & S_IFMT) {
1207         case S_IFIFO:
1208         case S_IFCHR:
1209         case S_IFBLK:
1210         case S_IFSOCK:
1211                 ip->i_d.di_format = XFS_DINODE_FMT_DEV;
1212                 ip->i_df.if_u2.if_rdev = rdev;
1213                 ip->i_df.if_flags = 0;
1214                 flags |= XFS_ILOG_DEV;
1215                 break;
1216         case S_IFREG:
1217         case S_IFDIR:
1218                 if (unlikely(pip->i_d.di_flags & XFS_DIFLAG_ANY)) {
1219                         uint    di_flags = 0;
1220
1221                         if ((mode & S_IFMT) == S_IFDIR) {
1222                                 if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
1223                                         di_flags |= XFS_DIFLAG_RTINHERIT;
1224                                 if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
1225                                         di_flags |= XFS_DIFLAG_EXTSZINHERIT;
1226                                         ip->i_d.di_extsize = pip->i_d.di_extsize;
1227                                 }
1228                         } else if ((mode & S_IFMT) == S_IFREG) {
1229                                 if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) {
1230                                         di_flags |= XFS_DIFLAG_REALTIME;
1231                                         ip->i_iocore.io_flags |= XFS_IOCORE_RT;
1232                                 }
1233                                 if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
1234                                         di_flags |= XFS_DIFLAG_EXTSIZE;
1235                                         ip->i_d.di_extsize = pip->i_d.di_extsize;
1236                                 }
1237                         }
1238                         if ((pip->i_d.di_flags & XFS_DIFLAG_NOATIME) &&
1239                             xfs_inherit_noatime)
1240                                 di_flags |= XFS_DIFLAG_NOATIME;
1241                         if ((pip->i_d.di_flags & XFS_DIFLAG_NODUMP) &&
1242                             xfs_inherit_nodump)
1243                                 di_flags |= XFS_DIFLAG_NODUMP;
1244                         if ((pip->i_d.di_flags & XFS_DIFLAG_SYNC) &&
1245                             xfs_inherit_sync)
1246                                 di_flags |= XFS_DIFLAG_SYNC;
1247                         if ((pip->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) &&
1248                             xfs_inherit_nosymlinks)
1249                                 di_flags |= XFS_DIFLAG_NOSYMLINKS;
1250                         if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
1251                                 di_flags |= XFS_DIFLAG_PROJINHERIT;
1252                         if ((pip->i_d.di_flags & XFS_DIFLAG_NODEFRAG) &&
1253                             xfs_inherit_nodefrag)
1254                                 di_flags |= XFS_DIFLAG_NODEFRAG;
1255                         ip->i_d.di_flags |= di_flags;
1256                 }
1257                 /* FALLTHROUGH */
1258         case S_IFLNK:
1259                 ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
1260                 ip->i_df.if_flags = XFS_IFEXTENTS;
1261                 ip->i_df.if_bytes = ip->i_df.if_real_bytes = 0;
1262                 ip->i_df.if_u1.if_extents = NULL;
1263                 break;
1264         default:
1265                 ASSERT(0);
1266         }
1267         /*
1268          * Attribute fork settings for new inode.
1269          */
1270         ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
1271         ip->i_d.di_anextents = 0;
1272
1273         /*
1274          * Log the new values stuffed into the inode.
1275          */
1276         xfs_trans_log_inode(tp, ip, flags);
1277
1278         /* now that we have an i_mode we can setup inode ops and unlock */
1279         bhv_vfs_init_vnode(XFS_MTOVFS(tp->t_mountp), vp, XFS_ITOBHV(ip), 1);
1280
1281         *ipp = ip;
1282         return 0;
1283 }
1284
1285 /*
1286  * Check to make sure that there are no blocks allocated to the
1287  * file beyond the size of the file.  We don't check this for
1288  * files with fixed size extents or real time extents, but we
1289  * at least do it for regular files.
1290  */
1291 #ifdef DEBUG
1292 void
1293 xfs_isize_check(
1294         xfs_mount_t     *mp,
1295         xfs_inode_t     *ip,
1296         xfs_fsize_t     isize)
1297 {
1298         xfs_fileoff_t   map_first;
1299         int             nimaps;
1300         xfs_bmbt_irec_t imaps[2];
1301
1302         if ((ip->i_d.di_mode & S_IFMT) != S_IFREG)
1303                 return;
1304
1305         if (ip->i_d.di_flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_EXTSIZE))
1306                 return;
1307
1308         nimaps = 2;
1309         map_first = XFS_B_TO_FSB(mp, (xfs_ufsize_t)isize);
1310         /*
1311          * The filesystem could be shutting down, so bmapi may return
1312          * an error.
1313          */
1314         if (xfs_bmapi(NULL, ip, map_first,
1315                          (XFS_B_TO_FSB(mp,
1316                                        (xfs_ufsize_t)XFS_MAXIOFFSET(mp)) -
1317                           map_first),
1318                          XFS_BMAPI_ENTIRE, NULL, 0, imaps, &nimaps,
1319                          NULL, NULL))
1320             return;
1321         ASSERT(nimaps == 1);
1322         ASSERT(imaps[0].br_startblock == HOLESTARTBLOCK);
1323 }
1324 #endif  /* DEBUG */
1325
1326 /*
1327  * Calculate the last possible buffered byte in a file.  This must
1328  * include data that was buffered beyond the EOF by the write code.
1329  * This also needs to deal with overflowing the xfs_fsize_t type
1330  * which can happen for sizes near the limit.
1331  *
1332  * We also need to take into account any blocks beyond the EOF.  It
1333  * may be the case that they were buffered by a write which failed.
1334  * In that case the pages will still be in memory, but the inode size
1335  * will never have been updated.
1336  */
1337 xfs_fsize_t
1338 xfs_file_last_byte(
1339         xfs_inode_t     *ip)
1340 {
1341         xfs_mount_t     *mp;
1342         xfs_fsize_t     last_byte;
1343         xfs_fileoff_t   last_block;
1344         xfs_fileoff_t   size_last_block;
1345         int             error;
1346
1347         ASSERT(ismrlocked(&(ip->i_iolock), MR_UPDATE | MR_ACCESS));
1348
1349         mp = ip->i_mount;
1350         /*
1351          * Only check for blocks beyond the EOF if the extents have
1352          * been read in.  This eliminates the need for the inode lock,
1353          * and it also saves us from looking when it really isn't
1354          * necessary.
1355          */
1356         if (ip->i_df.if_flags & XFS_IFEXTENTS) {
1357                 error = xfs_bmap_last_offset(NULL, ip, &last_block,
1358                         XFS_DATA_FORK);
1359                 if (error) {
1360                         last_block = 0;
1361                 }
1362         } else {
1363                 last_block = 0;
1364         }
1365         size_last_block = XFS_B_TO_FSB(mp, (xfs_ufsize_t)ip->i_d.di_size);
1366         last_block = XFS_FILEOFF_MAX(last_block, size_last_block);
1367
1368         last_byte = XFS_FSB_TO_B(mp, last_block);
1369         if (last_byte < 0) {
1370                 return XFS_MAXIOFFSET(mp);
1371         }
1372         last_byte += (1 << mp->m_writeio_log);
1373         if (last_byte < 0) {
1374                 return XFS_MAXIOFFSET(mp);
1375         }
1376         return last_byte;
1377 }
1378
1379 #if defined(XFS_RW_TRACE)
1380 STATIC void
1381 xfs_itrunc_trace(
1382         int             tag,
1383         xfs_inode_t     *ip,
1384         int             flag,
1385         xfs_fsize_t     new_size,
1386         xfs_off_t       toss_start,
1387         xfs_off_t       toss_finish)
1388 {
1389         if (ip->i_rwtrace == NULL) {
1390                 return;
1391         }
1392
1393         ktrace_enter(ip->i_rwtrace,
1394                      (void*)((long)tag),
1395                      (void*)ip,
1396                      (void*)(unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff),
1397                      (void*)(unsigned long)(ip->i_d.di_size & 0xffffffff),
1398                      (void*)((long)flag),
1399                      (void*)(unsigned long)((new_size >> 32) & 0xffffffff),
1400                      (void*)(unsigned long)(new_size & 0xffffffff),
1401                      (void*)(unsigned long)((toss_start >> 32) & 0xffffffff),
1402                      (void*)(unsigned long)(toss_start & 0xffffffff),
1403                      (void*)(unsigned long)((toss_finish >> 32) & 0xffffffff),
1404                      (void*)(unsigned long)(toss_finish & 0xffffffff),
1405                      (void*)(unsigned long)current_cpu(),
1406                      (void*)(unsigned long)current_pid(),
1407                      (void*)NULL,
1408                      (void*)NULL,
1409                      (void*)NULL);
1410 }
1411 #else
1412 #define xfs_itrunc_trace(tag, ip, flag, new_size, toss_start, toss_finish)
1413 #endif
1414
1415 /*
1416  * Start the truncation of the file to new_size.  The new size
1417  * must be smaller than the current size.  This routine will
1418  * clear the buffer and page caches of file data in the removed
1419  * range, and xfs_itruncate_finish() will remove the underlying
1420  * disk blocks.
1421  *
1422  * The inode must have its I/O lock locked EXCLUSIVELY, and it
1423  * must NOT have the inode lock held at all.  This is because we're
1424  * calling into the buffer/page cache code and we can't hold the
1425  * inode lock when we do so.
1426  *
1427  * We need to wait for any direct I/Os in flight to complete before we
1428  * proceed with the truncate. This is needed to prevent the extents
1429  * being read or written by the direct I/Os from being removed while the
1430  * I/O is in flight as there is no other method of synchronising
1431  * direct I/O with the truncate operation.  Also, because we hold
1432  * the IOLOCK in exclusive mode, we prevent new direct I/Os from being
1433  * started until the truncate completes and drops the lock. Essentially,
1434  * the vn_iowait() call forms an I/O barrier that provides strict ordering
1435  * between direct I/Os and the truncate operation.
1436  *
1437  * The flags parameter can have either the value XFS_ITRUNC_DEFINITE
1438  * or XFS_ITRUNC_MAYBE.  The XFS_ITRUNC_MAYBE value should be used
1439  * in the case that the caller is locking things out of order and
1440  * may not be able to call xfs_itruncate_finish() with the inode lock
1441  * held without dropping the I/O lock.  If the caller must drop the
1442  * I/O lock before calling xfs_itruncate_finish(), then xfs_itruncate_start()
1443  * must be called again with all the same restrictions as the initial
1444  * call.
1445  */
1446 void
1447 xfs_itruncate_start(
1448         xfs_inode_t     *ip,
1449         uint            flags,
1450         xfs_fsize_t     new_size)
1451 {
1452         xfs_fsize_t     last_byte;
1453         xfs_off_t       toss_start;
1454         xfs_mount_t     *mp;
1455         bhv_vnode_t     *vp;
1456
1457         ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE) != 0);
1458         ASSERT((new_size == 0) || (new_size <= ip->i_d.di_size));
1459         ASSERT((flags == XFS_ITRUNC_DEFINITE) ||
1460                (flags == XFS_ITRUNC_MAYBE));
1461
1462         mp = ip->i_mount;
1463         vp = XFS_ITOV(ip);
1464
1465         vn_iowait(vp);  /* wait for the completion of any pending DIOs */
1466         
1467         /*
1468          * Call toss_pages or flushinval_pages to get rid of pages
1469          * overlapping the region being removed.  We have to use
1470          * the less efficient flushinval_pages in the case that the
1471          * caller may not be able to finish the truncate without
1472          * dropping the inode's I/O lock.  Make sure
1473          * to catch any pages brought in by buffers overlapping
1474          * the EOF by searching out beyond the isize by our
1475          * block size. We round new_size up to a block boundary
1476          * so that we don't toss things on the same block as
1477          * new_size but before it.
1478          *
1479          * Before calling toss_page or flushinval_pages, make sure to
1480          * call remapf() over the same region if the file is mapped.
1481          * This frees up mapped file references to the pages in the
1482          * given range and for the flushinval_pages case it ensures
1483          * that we get the latest mapped changes flushed out.
1484          */
1485         toss_start = XFS_B_TO_FSB(mp, (xfs_ufsize_t)new_size);
1486         toss_start = XFS_FSB_TO_B(mp, toss_start);
1487         if (toss_start < 0) {
1488                 /*
1489                  * The place to start tossing is beyond our maximum
1490                  * file size, so there is no way that the data extended
1491                  * out there.
1492                  */
1493                 return;
1494         }
1495         last_byte = xfs_file_last_byte(ip);
1496         xfs_itrunc_trace(XFS_ITRUNC_START, ip, flags, new_size, toss_start,
1497                          last_byte);
1498         if (last_byte > toss_start) {
1499                 if (flags & XFS_ITRUNC_DEFINITE) {
1500                         bhv_vop_toss_pages(vp, toss_start, -1, FI_REMAPF_LOCKED);
1501                 } else {
1502                         bhv_vop_flushinval_pages(vp, toss_start, -1, FI_REMAPF_LOCKED);
1503                 }
1504         }
1505
1506 #ifdef DEBUG
1507         if (new_size == 0) {
1508                 ASSERT(VN_CACHED(vp) == 0);
1509         }
1510 #endif
1511 }
1512
1513 /*
1514  * Shrink the file to the given new_size.  The new
1515  * size must be smaller than the current size.
1516  * This will free up the underlying blocks
1517  * in the removed range after a call to xfs_itruncate_start()
1518  * or xfs_atruncate_start().
1519  *
1520  * The transaction passed to this routine must have made
1521  * a permanent log reservation of at least XFS_ITRUNCATE_LOG_RES.
1522  * This routine may commit the given transaction and
1523  * start new ones, so make sure everything involved in
1524  * the transaction is tidy before calling here.
1525  * Some transaction will be returned to the caller to be
1526  * committed.  The incoming transaction must already include
1527  * the inode, and both inode locks must be held exclusively.
1528  * The inode must also be "held" within the transaction.  On
1529  * return the inode will be "held" within the returned transaction.
1530  * This routine does NOT require any disk space to be reserved
1531  * for it within the transaction.
1532  *
1533  * The fork parameter must be either xfs_attr_fork or xfs_data_fork,
1534  * and it indicates the fork which is to be truncated.  For the
1535  * attribute fork we only support truncation to size 0.
1536  *
1537  * We use the sync parameter to indicate whether or not the first
1538  * transaction we perform might have to be synchronous.  For the attr fork,
1539  * it needs to be so if the unlink of the inode is not yet known to be
1540  * permanent in the log.  This keeps us from freeing and reusing the
1541  * blocks of the attribute fork before the unlink of the inode becomes
1542  * permanent.
1543  *
1544  * For the data fork, we normally have to run synchronously if we're
1545  * being called out of the inactive path or we're being called
1546  * out of the create path where we're truncating an existing file.
1547  * Either way, the truncate needs to be sync so blocks don't reappear
1548  * in the file with altered data in case of a crash.  wsync filesystems
1549  * can run the first case async because anything that shrinks the inode
1550  * has to run sync so by the time we're called here from inactive, the
1551  * inode size is permanently set to 0.
1552  *
1553  * Calls from the truncate path always need to be sync unless we're
1554  * in a wsync filesystem and the file has already been unlinked.
1555  *
1556  * The caller is responsible for correctly setting the sync parameter.
1557  * It gets too hard for us to guess here which path we're being called
1558  * out of just based on inode state.
1559  */
1560 int
1561 xfs_itruncate_finish(
1562         xfs_trans_t     **tp,
1563         xfs_inode_t     *ip,
1564         xfs_fsize_t     new_size,
1565         int             fork,
1566         int             sync)
1567 {
1568         xfs_fsblock_t   first_block;
1569         xfs_fileoff_t   first_unmap_block;
1570         xfs_fileoff_t   last_block;
1571         xfs_filblks_t   unmap_len=0;
1572         xfs_mount_t     *mp;
1573         xfs_trans_t     *ntp;
1574         int             done;
1575         int             committed;
1576         xfs_bmap_free_t free_list;
1577         int             error;
1578
1579         ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE) != 0);
1580         ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE) != 0);
1581         ASSERT((new_size == 0) || (new_size <= ip->i_d.di_size));
1582         ASSERT(*tp != NULL);
1583         ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES);
1584         ASSERT(ip->i_transp == *tp);
1585         ASSERT(ip->i_itemp != NULL);
1586         ASSERT(ip->i_itemp->ili_flags & XFS_ILI_HOLD);
1587
1588
1589         ntp = *tp;
1590         mp = (ntp)->t_mountp;
1591         ASSERT(! XFS_NOT_DQATTACHED(mp, ip));
1592
1593         /*
1594          * We only support truncating the entire attribute fork.
1595          */
1596         if (fork == XFS_ATTR_FORK) {
1597                 new_size = 0LL;
1598         }
1599         first_unmap_block = XFS_B_TO_FSB(mp, (xfs_ufsize_t)new_size);
1600         xfs_itrunc_trace(XFS_ITRUNC_FINISH1, ip, 0, new_size, 0, 0);
1601         /*
1602          * The first thing we do is set the size to new_size permanently
1603          * on disk.  This way we don't have to worry about anyone ever
1604          * being able to look at the data being freed even in the face
1605          * of a crash.  What we're getting around here is the case where
1606          * we free a block, it is allocated to another file, it is written
1607          * to, and then we crash.  If the new data gets written to the
1608          * file but the log buffers containing the free and reallocation
1609          * don't, then we'd end up with garbage in the blocks being freed.
1610          * As long as we make the new_size permanent before actually
1611          * freeing any blocks it doesn't matter if they get writtten to.
1612          *
1613          * The callers must signal into us whether or not the size
1614          * setting here must be synchronous.  There are a few cases
1615          * where it doesn't have to be synchronous.  Those cases
1616          * occur if the file is unlinked and we know the unlink is
1617          * permanent or if the blocks being truncated are guaranteed
1618          * to be beyond the inode eof (regardless of the link count)
1619          * and the eof value is permanent.  Both of these cases occur
1620          * only on wsync-mounted filesystems.  In those cases, we're
1621          * guaranteed that no user will ever see the data in the blocks
1622          * that are being truncated so the truncate can run async.
1623          * In the free beyond eof case, the file may wind up with
1624          * more blocks allocated to it than it needs if we crash
1625          * and that won't get fixed until the next time the file
1626          * is re-opened and closed but that's ok as that shouldn't
1627          * be too many blocks.
1628          *
1629          * However, we can't just make all wsync xactions run async
1630          * because there's one call out of the create path that needs
1631          * to run sync where it's truncating an existing file to size
1632          * 0 whose size is > 0.
1633          *
1634          * It's probably possible to come up with a test in this
1635          * routine that would correctly distinguish all the above
1636          * cases from the values of the function parameters and the
1637          * inode state but for sanity's sake, I've decided to let the
1638          * layers above just tell us.  It's simpler to correctly figure
1639          * out in the layer above exactly under what conditions we
1640          * can run async and I think it's easier for others read and
1641          * follow the logic in case something has to be changed.
1642          * cscope is your friend -- rcc.
1643          *
1644          * The attribute fork is much simpler.
1645          *
1646          * For the attribute fork we allow the caller to tell us whether
1647          * the unlink of the inode that led to this call is yet permanent
1648          * in the on disk log.  If it is not and we will be freeing extents
1649          * in this inode then we make the first transaction synchronous
1650          * to make sure that the unlink is permanent by the time we free
1651          * the blocks.
1652          */
1653         if (fork == XFS_DATA_FORK) {
1654                 if (ip->i_d.di_nextents > 0) {
1655                         ip->i_d.di_size = new_size;
1656                         xfs_trans_log_inode(ntp, ip, XFS_ILOG_CORE);
1657                 }
1658         } else if (sync) {
1659                 ASSERT(!(mp->m_flags & XFS_MOUNT_WSYNC));
1660                 if (ip->i_d.di_anextents > 0)
1661                         xfs_trans_set_sync(ntp);
1662         }
1663         ASSERT(fork == XFS_DATA_FORK ||
1664                 (fork == XFS_ATTR_FORK &&
1665                         ((sync && !(mp->m_flags & XFS_MOUNT_WSYNC)) ||
1666                          (sync == 0 && (mp->m_flags & XFS_MOUNT_WSYNC)))));
1667
1668         /*
1669          * Since it is possible for space to become allocated beyond
1670          * the end of the file (in a crash where the space is allocated
1671          * but the inode size is not yet updated), simply remove any
1672          * blocks which show up between the new EOF and the maximum
1673          * possible file size.  If the first block to be removed is
1674          * beyond the maximum file size (ie it is the same as last_block),
1675          * then there is nothing to do.
1676          */
1677         last_block = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp));
1678         ASSERT(first_unmap_block <= last_block);
1679         done = 0;
1680         if (last_block == first_unmap_block) {
1681                 done = 1;
1682         } else {
1683                 unmap_len = last_block - first_unmap_block + 1;
1684         }
1685         while (!done) {
1686                 /*
1687                  * Free up up to XFS_ITRUNC_MAX_EXTENTS.  xfs_bunmapi()
1688                  * will tell us whether it freed the entire range or
1689                  * not.  If this is a synchronous mount (wsync),
1690                  * then we can tell bunmapi to keep all the
1691                  * transactions asynchronous since the unlink
1692                  * transaction that made this inode inactive has
1693                  * already hit the disk.  There's no danger of
1694                  * the freed blocks being reused, there being a
1695                  * crash, and the reused blocks suddenly reappearing
1696                  * in this file with garbage in them once recovery
1697                  * runs.
1698                  */
1699                 XFS_BMAP_INIT(&free_list, &first_block);
1700                 error = XFS_BUNMAPI(mp, ntp, &ip->i_iocore,
1701                                     first_unmap_block, unmap_len,
1702                                     XFS_BMAPI_AFLAG(fork) |
1703                                       (sync ? 0 : XFS_BMAPI_ASYNC),
1704                                     XFS_ITRUNC_MAX_EXTENTS,
1705                                     &first_block, &free_list,
1706                                     NULL, &done);
1707                 if (error) {
1708                         /*
1709                          * If the bunmapi call encounters an error,
1710                          * return to the caller where the transaction
1711                          * can be properly aborted.  We just need to
1712                          * make sure we're not holding any resources
1713                          * that we were not when we came in.
1714                          */
1715                         xfs_bmap_cancel(&free_list);
1716                         return error;
1717                 }
1718
1719                 /*
1720                  * Duplicate the transaction that has the permanent
1721                  * reservation and commit the old transaction.
1722                  */
1723                 error = xfs_bmap_finish(tp, &free_list, first_block,
1724                                         &committed);
1725                 ntp = *tp;
1726                 if (error) {
1727                         /*
1728                          * If the bmap finish call encounters an error,
1729                          * return to the caller where the transaction
1730                          * can be properly aborted.  We just need to
1731                          * make sure we're not holding any resources
1732                          * that we were not when we came in.
1733                          *
1734                          * Aborting from this point might lose some
1735                          * blocks in the file system, but oh well.
1736                          */
1737                         xfs_bmap_cancel(&free_list);
1738                         if (committed) {
1739                                 /*
1740                                  * If the passed in transaction committed
1741                                  * in xfs_bmap_finish(), then we want to
1742                                  * add the inode to this one before returning.
1743                                  * This keeps things simple for the higher
1744                                  * level code, because it always knows that
1745                                  * the inode is locked and held in the
1746                                  * transaction that returns to it whether
1747                                  * errors occur or not.  We don't mark the
1748                                  * inode dirty so that this transaction can
1749                                  * be easily aborted if possible.
1750                                  */
1751                                 xfs_trans_ijoin(ntp, ip,
1752                                         XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1753                                 xfs_trans_ihold(ntp, ip);
1754                         }
1755                         return error;
1756                 }
1757
1758                 if (committed) {
1759                         /*
1760                          * The first xact was committed,
1761                          * so add the inode to the new one.
1762                          * Mark it dirty so it will be logged
1763                          * and moved forward in the log as
1764                          * part of every commit.
1765                          */
1766                         xfs_trans_ijoin(ntp, ip,
1767                                         XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1768                         xfs_trans_ihold(ntp, ip);
1769                         xfs_trans_log_inode(ntp, ip, XFS_ILOG_CORE);
1770                 }
1771                 ntp = xfs_trans_dup(ntp);
1772                 (void) xfs_trans_commit(*tp, 0, NULL);
1773                 *tp = ntp;
1774                 error = xfs_trans_reserve(ntp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
1775                                           XFS_TRANS_PERM_LOG_RES,
1776                                           XFS_ITRUNCATE_LOG_COUNT);
1777                 /*
1778                  * Add the inode being truncated to the next chained
1779                  * transaction.
1780                  */
1781                 xfs_trans_ijoin(ntp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1782                 xfs_trans_ihold(ntp, ip);
1783                 if (error)
1784                         return (error);
1785         }
1786         /*
1787          * Only update the size in the case of the data fork, but
1788          * always re-log the inode so that our permanent transaction
1789          * can keep on rolling it forward in the log.
1790          */
1791         if (fork == XFS_DATA_FORK) {
1792                 xfs_isize_check(mp, ip, new_size);
1793                 ip->i_d.di_size = new_size;
1794         }
1795         xfs_trans_log_inode(ntp, ip, XFS_ILOG_CORE);
1796         ASSERT((new_size != 0) ||
1797                (fork == XFS_ATTR_FORK) ||
1798                (ip->i_delayed_blks == 0));
1799         ASSERT((new_size != 0) ||
1800                (fork == XFS_ATTR_FORK) ||
1801                (ip->i_d.di_nextents == 0));
1802         xfs_itrunc_trace(XFS_ITRUNC_FINISH2, ip, 0, new_size, 0, 0);
1803         return 0;
1804 }
1805
1806
1807 /*
1808  * xfs_igrow_start
1809  *
1810  * Do the first part of growing a file: zero any data in the last
1811  * block that is beyond the old EOF.  We need to do this before
1812  * the inode is joined to the transaction to modify the i_size.
1813  * That way we can drop the inode lock and call into the buffer
1814  * cache to get the buffer mapping the EOF.
1815  */
1816 int
1817 xfs_igrow_start(
1818         xfs_inode_t     *ip,
1819         xfs_fsize_t     new_size,
1820         cred_t          *credp)
1821 {
1822         int             error;
1823
1824         ASSERT(ismrlocked(&(ip->i_lock), MR_UPDATE) != 0);
1825         ASSERT(ismrlocked(&(ip->i_iolock), MR_UPDATE) != 0);
1826         ASSERT(new_size > ip->i_d.di_size);
1827
1828         /*
1829          * Zero any pages that may have been created by
1830          * xfs_write_file() beyond the end of the file
1831          * and any blocks between the old and new file sizes.
1832          */
1833         error = xfs_zero_eof(XFS_ITOV(ip), &ip->i_iocore, new_size,
1834                              ip->i_d.di_size, new_size);
1835         return error;
1836 }
1837
1838 /*
1839  * xfs_igrow_finish
1840  *
1841  * This routine is called to extend the size of a file.
1842  * The inode must have both the iolock and the ilock locked
1843  * for update and it must be a part of the current transaction.
1844  * The xfs_igrow_start() function must have been called previously.
1845  * If the change_flag is not zero, the inode change timestamp will
1846  * be updated.
1847  */
1848 void
1849 xfs_igrow_finish(
1850         xfs_trans_t     *tp,
1851         xfs_inode_t     *ip,
1852         xfs_fsize_t     new_size,
1853         int             change_flag)
1854 {
1855         ASSERT(ismrlocked(&(ip->i_lock), MR_UPDATE) != 0);
1856         ASSERT(ismrlocked(&(ip->i_iolock), MR_UPDATE) != 0);
1857         ASSERT(ip->i_transp == tp);
1858         ASSERT(new_size > ip->i_d.di_size);
1859
1860         /*
1861          * Update the file size.  Update the inode change timestamp
1862          * if change_flag set.
1863          */
1864         ip->i_d.di_size = new_size;
1865         if (change_flag)
1866                 xfs_ichgtime(ip, XFS_ICHGTIME_CHG);
1867         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1868
1869 }
1870
1871
1872 /*
1873  * This is called when the inode's link count goes to 0.
1874  * We place the on-disk inode on a list in the AGI.  It
1875  * will be pulled from this list when the inode is freed.
1876  */
1877 int
1878 xfs_iunlink(
1879         xfs_trans_t     *tp,
1880         xfs_inode_t     *ip)
1881 {
1882         xfs_mount_t     *mp;
1883         xfs_agi_t       *agi;
1884         xfs_dinode_t    *dip;
1885         xfs_buf_t       *agibp;
1886         xfs_buf_t       *ibp;
1887         xfs_agnumber_t  agno;
1888         xfs_daddr_t     agdaddr;
1889         xfs_agino_t     agino;
1890         short           bucket_index;
1891         int             offset;
1892         int             error;
1893         int             agi_ok;
1894
1895         ASSERT(ip->i_d.di_nlink == 0);
1896         ASSERT(ip->i_d.di_mode != 0);
1897         ASSERT(ip->i_transp == tp);
1898
1899         mp = tp->t_mountp;
1900
1901         agno = XFS_INO_TO_AGNO(mp, ip->i_ino);
1902         agdaddr = XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp));
1903
1904         /*
1905          * Get the agi buffer first.  It ensures lock ordering
1906          * on the list.
1907          */
1908         error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, agdaddr,
1909                                    XFS_FSS_TO_BB(mp, 1), 0, &agibp);
1910         if (error) {
1911                 return error;
1912         }
1913         /*
1914          * Validate the magic number of the agi block.
1915          */
1916         agi = XFS_BUF_TO_AGI(agibp);
1917         agi_ok =
1918                 be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC &&
1919                 XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum));
1920         if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IUNLINK,
1921                         XFS_RANDOM_IUNLINK))) {
1922                 XFS_CORRUPTION_ERROR("xfs_iunlink", XFS_ERRLEVEL_LOW, mp, agi);
1923                 xfs_trans_brelse(tp, agibp);
1924                 return XFS_ERROR(EFSCORRUPTED);
1925         }
1926         /*
1927          * Get the index into the agi hash table for the
1928          * list this inode will go on.
1929          */
1930         agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
1931         ASSERT(agino != 0);
1932         bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
1933         ASSERT(agi->agi_unlinked[bucket_index]);
1934         ASSERT(be32_to_cpu(agi->agi_unlinked[bucket_index]) != agino);
1935
1936         if (be32_to_cpu(agi->agi_unlinked[bucket_index]) != NULLAGINO) {
1937                 /*
1938                  * There is already another inode in the bucket we need
1939                  * to add ourselves to.  Add us at the front of the list.
1940                  * Here we put the head pointer into our next pointer,
1941                  * and then we fall through to point the head at us.
1942                  */
1943                 error = xfs_itobp(mp, tp, ip, &dip, &ibp, 0, 0);
1944                 if (error) {
1945                         return error;
1946                 }
1947                 ASSERT(INT_GET(dip->di_next_unlinked, ARCH_CONVERT) == NULLAGINO);
1948                 ASSERT(dip->di_next_unlinked);
1949                 /* both on-disk, don't endian flip twice */
1950                 dip->di_next_unlinked = agi->agi_unlinked[bucket_index];
1951                 offset = ip->i_boffset +
1952                         offsetof(xfs_dinode_t, di_next_unlinked);
1953                 xfs_trans_inode_buf(tp, ibp);
1954                 xfs_trans_log_buf(tp, ibp, offset,
1955                                   (offset + sizeof(xfs_agino_t) - 1));
1956                 xfs_inobp_check(mp, ibp);
1957         }
1958
1959         /*
1960          * Point the bucket head pointer at the inode being inserted.
1961          */
1962         ASSERT(agino != 0);
1963         agi->agi_unlinked[bucket_index] = cpu_to_be32(agino);
1964         offset = offsetof(xfs_agi_t, agi_unlinked) +
1965                 (sizeof(xfs_agino_t) * bucket_index);
1966         xfs_trans_log_buf(tp, agibp, offset,
1967                           (offset + sizeof(xfs_agino_t) - 1));
1968         return 0;
1969 }
1970
1971 /*
1972  * Pull the on-disk inode from the AGI unlinked list.
1973  */
1974 STATIC int
1975 xfs_iunlink_remove(
1976         xfs_trans_t     *tp,
1977         xfs_inode_t     *ip)
1978 {
1979         xfs_ino_t       next_ino;
1980         xfs_mount_t     *mp;
1981         xfs_agi_t       *agi;
1982         xfs_dinode_t    *dip;
1983         xfs_buf_t       *agibp;
1984         xfs_buf_t       *ibp;
1985         xfs_agnumber_t  agno;
1986         xfs_daddr_t     agdaddr;
1987         xfs_agino_t     agino;
1988         xfs_agino_t     next_agino;
1989         xfs_buf_t       *last_ibp;
1990         xfs_dinode_t    *last_dip = NULL;
1991         short           bucket_index;
1992         int             offset, last_offset = 0;
1993         int             error;
1994         int             agi_ok;
1995
1996         /*
1997          * First pull the on-disk inode from the AGI unlinked list.
1998          */
1999         mp = tp->t_mountp;
2000
2001         agno = XFS_INO_TO_AGNO(mp, ip->i_ino);
2002         agdaddr = XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp));
2003
2004         /*
2005          * Get the agi buffer first.  It ensures lock ordering
2006          * on the list.
2007          */
2008         error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, agdaddr,
2009                                    XFS_FSS_TO_BB(mp, 1), 0, &agibp);
2010         if (error) {
2011                 cmn_err(CE_WARN,
2012                         "xfs_iunlink_remove: xfs_trans_read_buf()  returned an error %d on %s.  Returning error.",
2013                         error, mp->m_fsname);
2014                 return error;
2015         }
2016         /*
2017          * Validate the magic number of the agi block.
2018          */
2019         agi = XFS_BUF_TO_AGI(agibp);
2020         agi_ok =
2021                 be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC &&
2022                 XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum));
2023         if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IUNLINK_REMOVE,
2024                         XFS_RANDOM_IUNLINK_REMOVE))) {
2025                 XFS_CORRUPTION_ERROR("xfs_iunlink_remove", XFS_ERRLEVEL_LOW,
2026                                      mp, agi);
2027                 xfs_trans_brelse(tp, agibp);
2028                 cmn_err(CE_WARN,
2029                         "xfs_iunlink_remove: XFS_TEST_ERROR()  returned an error on %s.  Returning EFSCORRUPTED.",
2030                          mp->m_fsname);
2031                 return XFS_ERROR(EFSCORRUPTED);
2032         }
2033         /*
2034          * Get the index into the agi hash table for the
2035          * list this inode will go on.
2036          */
2037         agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
2038         ASSERT(agino != 0);
2039         bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
2040         ASSERT(be32_to_cpu(agi->agi_unlinked[bucket_index]) != NULLAGINO);
2041         ASSERT(agi->agi_unlinked[bucket_index]);
2042
2043         if (be32_to_cpu(agi->agi_unlinked[bucket_index]) == agino) {
2044                 /*
2045                  * We're at the head of the list.  Get the inode's
2046                  * on-disk buffer to see if there is anyone after us
2047                  * on the list.  Only modify our next pointer if it
2048                  * is not already NULLAGINO.  This saves us the overhead
2049                  * of dealing with the buffer when there is no need to
2050                  * change it.
2051                  */
2052                 error = xfs_itobp(mp, tp, ip, &dip, &ibp, 0, 0);
2053                 if (error) {
2054                         cmn_err(CE_WARN,
2055                                 "xfs_iunlink_remove: xfs_itobp()  returned an error %d on %s.  Returning error.",
2056                                 error, mp->m_fsname);
2057                         return error;
2058                 }
2059                 next_agino = INT_GET(dip->di_next_unlinked, ARCH_CONVERT);
2060                 ASSERT(next_agino != 0);
2061                 if (next_agino != NULLAGINO) {
2062                         INT_SET(dip->di_next_unlinked, ARCH_CONVERT, NULLAGINO);
2063                         offset = ip->i_boffset +
2064                                 offsetof(xfs_dinode_t, di_next_unlinked);
2065                         xfs_trans_inode_buf(tp, ibp);
2066                         xfs_trans_log_buf(tp, ibp, offset,
2067                                           (offset + sizeof(xfs_agino_t) - 1));
2068                         xfs_inobp_check(mp, ibp);
2069                 } else {
2070                         xfs_trans_brelse(tp, ibp);
2071                 }
2072                 /*
2073                  * Point the bucket head pointer at the next inode.
2074                  */
2075                 ASSERT(next_agino != 0);
2076                 ASSERT(next_agino != agino);
2077                 agi->agi_unlinked[bucket_index] = cpu_to_be32(next_agino);
2078                 offset = offsetof(xfs_agi_t, agi_unlinked) +
2079                         (sizeof(xfs_agino_t) * bucket_index);
2080                 xfs_trans_log_buf(tp, agibp, offset,
2081                                   (offset + sizeof(xfs_agino_t) - 1));
2082         } else {
2083                 /*
2084                  * We need to search the list for the inode being freed.
2085                  */
2086                 next_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]);
2087                 last_ibp = NULL;
2088                 while (next_agino != agino) {
2089                         /*
2090                          * If the last inode wasn't the one pointing to
2091                          * us, then release its buffer since we're not
2092                          * going to do anything with it.
2093                          */
2094                         if (last_ibp != NULL) {
2095                                 xfs_trans_brelse(tp, last_ibp);
2096                         }
2097                         next_ino = XFS_AGINO_TO_INO(mp, agno, next_agino);
2098                         error = xfs_inotobp(mp, tp, next_ino, &last_dip,
2099                                             &last_ibp, &last_offset);
2100                         if (error) {
2101                                 cmn_err(CE_WARN,
2102                         "xfs_iunlink_remove: xfs_inotobp()  returned an error %d on %s.  Returning error.",
2103                                         error, mp->m_fsname);
2104                                 return error;
2105                         }
2106                         next_agino = INT_GET(last_dip->di_next_unlinked, ARCH_CONVERT);
2107                         ASSERT(next_agino != NULLAGINO);
2108                         ASSERT(next_agino != 0);
2109                 }
2110                 /*
2111                  * Now last_ibp points to the buffer previous to us on
2112                  * the unlinked list.  Pull us from the list.
2113                  */
2114                 error = xfs_itobp(mp, tp, ip, &dip, &ibp, 0, 0);
2115                 if (error) {
2116                         cmn_err(CE_WARN,
2117                                 "xfs_iunlink_remove: xfs_itobp()  returned an error %d on %s.  Returning error.",
2118                                 error, mp->m_fsname);
2119                         return error;
2120                 }
2121                 next_agino = INT_GET(dip->di_next_unlinked, ARCH_CONVERT);
2122                 ASSERT(next_agino != 0);
2123                 ASSERT(next_agino != agino);
2124                 if (next_agino != NULLAGINO) {
2125                         INT_SET(dip->di_next_unlinked, ARCH_CONVERT, NULLAGINO);
2126                         offset = ip->i_boffset +
2127                                 offsetof(xfs_dinode_t, di_next_unlinked);
2128                         xfs_trans_inode_buf(tp, ibp);
2129                         xfs_trans_log_buf(tp, ibp, offset,
2130                                           (offset + sizeof(xfs_agino_t) - 1));
2131                         xfs_inobp_check(mp, ibp);
2132                 } else {
2133                         xfs_trans_brelse(tp, ibp);
2134                 }
2135                 /*
2136                  * Point the previous inode on the list to the next inode.
2137                  */
2138                 INT_SET(last_dip->di_next_unlinked, ARCH_CONVERT, next_agino);
2139                 ASSERT(next_agino != 0);
2140                 offset = last_offset + offsetof(xfs_dinode_t, di_next_unlinked);
2141                 xfs_trans_inode_buf(tp, last_ibp);
2142                 xfs_trans_log_buf(tp, last_ibp, offset,
2143                                   (offset + sizeof(xfs_agino_t) - 1));
2144                 xfs_inobp_check(mp, last_ibp);
2145         }
2146         return 0;
2147 }
2148
2149 static __inline__ int xfs_inode_clean(xfs_inode_t *ip)
2150 {
2151         return (((ip->i_itemp == NULL) ||
2152                 !(ip->i_itemp->ili_format.ilf_fields & XFS_ILOG_ALL)) &&
2153                 (ip->i_update_core == 0));
2154 }
2155
2156 STATIC void
2157 xfs_ifree_cluster(
2158         xfs_inode_t     *free_ip,
2159         xfs_trans_t     *tp,
2160         xfs_ino_t       inum)
2161 {
2162         xfs_mount_t             *mp = free_ip->i_mount;
2163         int                     blks_per_cluster;
2164         int                     nbufs;
2165         int                     ninodes;
2166         int                     i, j, found, pre_flushed;
2167         xfs_daddr_t             blkno;
2168         xfs_buf_t               *bp;
2169         xfs_ihash_t             *ih;
2170         xfs_inode_t             *ip, **ip_found;
2171         xfs_inode_log_item_t    *iip;
2172         xfs_log_item_t          *lip;
2173         SPLDECL(s);
2174
2175         if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) {
2176                 blks_per_cluster = 1;
2177                 ninodes = mp->m_sb.sb_inopblock;
2178                 nbufs = XFS_IALLOC_BLOCKS(mp);
2179         } else {
2180                 blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) /
2181                                         mp->m_sb.sb_blocksize;
2182                 ninodes = blks_per_cluster * mp->m_sb.sb_inopblock;
2183                 nbufs = XFS_IALLOC_BLOCKS(mp) / blks_per_cluster;
2184         }
2185
2186         ip_found = kmem_alloc(ninodes * sizeof(xfs_inode_t *), KM_NOFS);
2187
2188         for (j = 0; j < nbufs; j++, inum += ninodes) {
2189                 blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum),
2190                                          XFS_INO_TO_AGBNO(mp, inum));
2191
2192
2193                 /*
2194                  * Look for each inode in memory and attempt to lock it,
2195                  * we can be racing with flush and tail pushing here.
2196                  * any inode we get the locks on, add to an array of
2197                  * inode items to process later.
2198                  *
2199                  * The get the buffer lock, we could beat a flush
2200                  * or tail pushing thread to the lock here, in which
2201                  * case they will go looking for the inode buffer
2202                  * and fail, we need some other form of interlock
2203                  * here.
2204                  */
2205                 found = 0;
2206                 for (i = 0; i < ninodes; i++) {
2207                         ih = XFS_IHASH(mp, inum + i);
2208                         read_lock(&ih->ih_lock);
2209                         for (ip = ih->ih_next; ip != NULL; ip = ip->i_next) {
2210                                 if (ip->i_ino == inum + i)
2211                                         break;
2212                         }
2213
2214                         /* Inode not in memory or we found it already,
2215                          * nothing to do
2216                          */
2217                         if (!ip || xfs_iflags_test(ip, XFS_ISTALE)) {
2218                                 read_unlock(&ih->ih_lock);
2219                                 continue;
2220                         }
2221
2222                         if (xfs_inode_clean(ip)) {
2223                                 read_unlock(&ih->ih_lock);
2224                                 continue;
2225                         }
2226
2227                         /* If we can get the locks then add it to the
2228                          * list, otherwise by the time we get the bp lock
2229                          * below it will already be attached to the
2230                          * inode buffer.
2231                          */
2232
2233                         /* This inode will already be locked - by us, lets
2234                          * keep it that way.
2235                          */
2236
2237                         if (ip == free_ip) {
2238                                 if (xfs_iflock_nowait(ip)) {
2239                                         xfs_iflags_set(ip, XFS_ISTALE);
2240                                         if (xfs_inode_clean(ip)) {
2241                                                 xfs_ifunlock(ip);
2242                                         } else {
2243                                                 ip_found[found++] = ip;
2244                                         }
2245                                 }
2246                                 read_unlock(&ih->ih_lock);
2247                                 continue;
2248                         }
2249
2250                         if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) {
2251                                 if (xfs_iflock_nowait(ip)) {
2252                                         xfs_iflags_set(ip, XFS_ISTALE);
2253
2254                                         if (xfs_inode_clean(ip)) {
2255                                                 xfs_ifunlock(ip);
2256                                                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2257                                         } else {
2258                                                 ip_found[found++] = ip;
2259                                         }
2260                                 } else {
2261                                         xfs_iunlock(ip, XFS_ILOCK_EXCL);
2262                                 }
2263                         }
2264
2265                         read_unlock(&ih->ih_lock);
2266                 }
2267
2268                 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno, 
2269                                         mp->m_bsize * blks_per_cluster,
2270                                         XFS_BUF_LOCK);
2271
2272                 pre_flushed = 0;
2273                 lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *);
2274                 while (lip) {
2275                         if (lip->li_type == XFS_LI_INODE) {
2276                                 iip = (xfs_inode_log_item_t *)lip;
2277                                 ASSERT(iip->ili_logged == 1);
2278                                 lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done;
2279                                 AIL_LOCK(mp,s);
2280                                 iip->ili_flush_lsn = iip->ili_item.li_lsn;
2281                                 AIL_UNLOCK(mp, s);
2282                                 xfs_iflags_set(iip->ili_inode, XFS_ISTALE);
2283                                 pre_flushed++;
2284                         }
2285                         lip = lip->li_bio_list;
2286                 }
2287
2288                 for (i = 0; i < found; i++) {
2289                         ip = ip_found[i];
2290                         iip = ip->i_itemp;
2291
2292                         if (!iip) {
2293                                 ip->i_update_core = 0;
2294                                 xfs_ifunlock(ip);
2295                                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2296                                 continue;
2297                         }
2298
2299                         iip->ili_last_fields = iip->ili_format.ilf_fields;
2300                         iip->ili_format.ilf_fields = 0;
2301                         iip->ili_logged = 1;
2302                         AIL_LOCK(mp,s);
2303                         iip->ili_flush_lsn = iip->ili_item.li_lsn;
2304                         AIL_UNLOCK(mp, s);
2305
2306                         xfs_buf_attach_iodone(bp,
2307                                 (void(*)(xfs_buf_t*,xfs_log_item_t*))
2308                                 xfs_istale_done, (xfs_log_item_t *)iip);
2309                         if (ip != free_ip) {
2310                                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2311                         }
2312                 }
2313
2314                 if (found || pre_flushed)
2315                         xfs_trans_stale_inode_buf(tp, bp);
2316                 xfs_trans_binval(tp, bp);
2317         }
2318
2319         kmem_free(ip_found, ninodes * sizeof(xfs_inode_t *));
2320 }
2321
2322 /*
2323  * This is called to return an inode to the inode free list.
2324  * The inode should already be truncated to 0 length and have
2325  * no pages associated with it.  This routine also assumes that
2326  * the inode is already a part of the transaction.
2327  *
2328  * The on-disk copy of the inode will have been added to the list
2329  * of unlinked inodes in the AGI. We need to remove the inode from
2330  * that list atomically with respect to freeing it here.
2331  */
2332 int
2333 xfs_ifree(
2334         xfs_trans_t     *tp,
2335         xfs_inode_t     *ip,
2336         xfs_bmap_free_t *flist)
2337 {
2338         int                     error;
2339         int                     delete;
2340         xfs_ino_t               first_ino;
2341
2342         ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE));
2343         ASSERT(ip->i_transp == tp);
2344         ASSERT(ip->i_d.di_nlink == 0);
2345         ASSERT(ip->i_d.di_nextents == 0);
2346         ASSERT(ip->i_d.di_anextents == 0);
2347         ASSERT((ip->i_d.di_size == 0) ||
2348                ((ip->i_d.di_mode & S_IFMT) != S_IFREG));
2349         ASSERT(ip->i_d.di_nblocks == 0);
2350
2351         /*
2352          * Pull the on-disk inode from the AGI unlinked list.
2353          */
2354         error = xfs_iunlink_remove(tp, ip);
2355         if (error != 0) {
2356                 return error;
2357         }
2358
2359         error = xfs_difree(tp, ip->i_ino, flist, &delete, &first_ino);
2360         if (error != 0) {
2361                 return error;
2362         }
2363         ip->i_d.di_mode = 0;            /* mark incore inode as free */
2364         ip->i_d.di_flags = 0;
2365         ip->i_d.di_dmevmask = 0;
2366         ip->i_d.di_forkoff = 0;         /* mark the attr fork not in use */
2367         ip->i_df.if_ext_max =
2368                 XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t);
2369         ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
2370         ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
2371         /*
2372          * Bump the generation count so no one will be confused
2373          * by reincarnations of this inode.
2374          */
2375         ip->i_d.di_gen++;
2376         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
2377
2378         if (delete) {
2379                 xfs_ifree_cluster(ip, tp, first_ino);
2380         }
2381
2382         return 0;
2383 }
2384
2385 /*
2386  * Reallocate the space for if_broot based on the number of records
2387  * being added or deleted as indicated in rec_diff.  Move the records
2388  * and pointers in if_broot to fit the new size.  When shrinking this
2389  * will eliminate holes between the records and pointers created by
2390  * the caller.  When growing this will create holes to be filled in
2391  * by the caller.
2392  *
2393  * The caller must not request to add more records than would fit in
2394  * the on-disk inode root.  If the if_broot is currently NULL, then
2395  * if we adding records one will be allocated.  The caller must also
2396  * not request that the number of records go below zero, although
2397  * it can go to zero.
2398  *
2399  * ip -- the inode whose if_broot area is changing
2400  * ext_diff -- the change in the number of records, positive or negative,
2401  *       requested for the if_broot array.
2402  */
2403 void
2404 xfs_iroot_realloc(
2405         xfs_inode_t             *ip,
2406         int                     rec_diff,
2407         int                     whichfork)
2408 {
2409         int                     cur_max;
2410         xfs_ifork_t             *ifp;
2411         xfs_bmbt_block_t        *new_broot;
2412         int                     new_max;
2413         size_t                  new_size;
2414         char                    *np;
2415         char                    *op;
2416
2417         /*
2418          * Handle the degenerate case quietly.
2419          */
2420         if (rec_diff == 0) {
2421                 return;
2422         }
2423
2424         ifp = XFS_IFORK_PTR(ip, whichfork);
2425         if (rec_diff > 0) {
2426                 /*
2427                  * If there wasn't any memory allocated before, just
2428                  * allocate it now and get out.
2429                  */
2430                 if (ifp->if_broot_bytes == 0) {
2431                         new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff);
2432                         ifp->if_broot = (xfs_bmbt_block_t*)kmem_alloc(new_size,
2433                                                                      KM_SLEEP);
2434                         ifp->if_broot_bytes = (int)new_size;
2435                         return;
2436                 }
2437
2438                 /*
2439                  * If there is already an existing if_broot, then we need
2440                  * to realloc() it and shift the pointers to their new
2441                  * location.  The records don't change location because
2442                  * they are kept butted up against the btree block header.
2443                  */
2444                 cur_max = XFS_BMAP_BROOT_MAXRECS(ifp->if_broot_bytes);
2445                 new_max = cur_max + rec_diff;
2446                 new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max);
2447                 ifp->if_broot = (xfs_bmbt_block_t *)
2448                   kmem_realloc(ifp->if_broot,
2449                                 new_size,
2450                                 (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */
2451                                 KM_SLEEP);
2452                 op = (char *)XFS_BMAP_BROOT_PTR_ADDR(ifp->if_broot, 1,
2453                                                       ifp->if_broot_bytes);
2454                 np = (char *)XFS_BMAP_BROOT_PTR_ADDR(ifp->if_broot, 1,
2455                                                       (int)new_size);
2456                 ifp->if_broot_bytes = (int)new_size;
2457                 ASSERT(ifp->if_broot_bytes <=
2458                         XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ);
2459                 memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t));
2460                 return;
2461         }
2462
2463         /*
2464          * rec_diff is less than 0.  In this case, we are shrinking the
2465          * if_broot buffer.  It must already exist.  If we go to zero
2466          * records, just get rid of the root and clear the status bit.
2467          */
2468         ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0));
2469         cur_max = XFS_BMAP_BROOT_MAXRECS(ifp->if_broot_bytes);
2470         new_max = cur_max + rec_diff;
2471         ASSERT(new_max >= 0);
2472         if (new_max > 0)
2473                 new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max);
2474         else
2475                 new_size = 0;
2476         if (new_size > 0) {
2477                 new_broot = (xfs_bmbt_block_t *)kmem_alloc(new_size, KM_SLEEP);
2478                 /*
2479                  * First copy over the btree block header.
2480                  */
2481                 memcpy(new_broot, ifp->if_broot, sizeof(xfs_bmbt_block_t));
2482         } else {
2483                 new_broot = NULL;
2484                 ifp->if_flags &= ~XFS_IFBROOT;
2485         }
2486
2487         /*
2488          * Only copy the records and pointers if there are any.
2489          */
2490         if (new_max > 0) {
2491                 /*
2492                  * First copy the records.
2493                  */
2494                 op = (char *)XFS_BMAP_BROOT_REC_ADDR(ifp->if_broot, 1,
2495                                                      ifp->if_broot_bytes);
2496                 np = (char *)XFS_BMAP_BROOT_REC_ADDR(new_broot, 1,
2497                                                      (int)new_size);
2498                 memcpy(np, op, new_max * (uint)sizeof(xfs_bmbt_rec_t));
2499
2500                 /*
2501                  * Then copy the pointers.
2502                  */
2503                 op = (char *)XFS_BMAP_BROOT_PTR_ADDR(ifp->if_broot, 1,
2504                                                      ifp->if_broot_bytes);
2505                 np = (char *)XFS_BMAP_BROOT_PTR_ADDR(new_broot, 1,
2506                                                      (int)new_size);
2507                 memcpy(np, op, new_max * (uint)sizeof(xfs_dfsbno_t));
2508         }
2509         kmem_free(ifp->if_broot, ifp->if_broot_bytes);
2510         ifp->if_broot = new_broot;
2511         ifp->if_broot_bytes = (int)new_size;
2512         ASSERT(ifp->if_broot_bytes <=
2513                 XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ);
2514         return;
2515 }
2516
2517
2518 /*
2519  * This is called when the amount of space needed for if_data
2520  * is increased or decreased.  The change in size is indicated by
2521  * the number of bytes that need to be added or deleted in the
2522  * byte_diff parameter.
2523  *
2524  * If the amount of space needed has decreased below the size of the
2525  * inline buffer, then switch to using the inline buffer.  Otherwise,
2526  * use kmem_realloc() or kmem_alloc() to adjust the size of the buffer
2527  * to what is needed.
2528  *
2529  * ip -- the inode whose if_data area is changing
2530  * byte_diff -- the change in the number of bytes, positive or negative,
2531  *       requested for the if_data array.
2532  */
2533 void
2534 xfs_idata_realloc(
2535         xfs_inode_t     *ip,
2536         int             byte_diff,
2537         int             whichfork)
2538 {
2539         xfs_ifork_t     *ifp;
2540         int             new_size;
2541         int             real_size;
2542
2543         if (byte_diff == 0) {
2544                 return;
2545         }
2546
2547         ifp = XFS_IFORK_PTR(ip, whichfork);
2548         new_size = (int)ifp->if_bytes + byte_diff;
2549         ASSERT(new_size >= 0);
2550
2551         if (new_size == 0) {
2552                 if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) {
2553                         kmem_free(ifp->if_u1.if_data, ifp->if_real_bytes);
2554                 }
2555                 ifp->if_u1.if_data = NULL;
2556                 real_size = 0;
2557         } else if (new_size <= sizeof(ifp->if_u2.if_inline_data)) {
2558                 /*
2559                  * If the valid extents/data can fit in if_inline_ext/data,
2560                  * copy them from the malloc'd vector and free it.
2561                  */
2562                 if (ifp->if_u1.if_data == NULL) {
2563                         ifp->if_u1.if_data = ifp->if_u2.if_inline_data;
2564                 } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) {
2565                         ASSERT(ifp->if_real_bytes != 0);
2566                         memcpy(ifp->if_u2.if_inline_data, ifp->if_u1.if_data,
2567                               new_size);
2568                         kmem_free(ifp->if_u1.if_data, ifp->if_real_bytes);
2569                         ifp->if_u1.if_data = ifp->if_u2.if_inline_data;
2570                 }
2571                 real_size = 0;
2572         } else {
2573                 /*
2574                  * Stuck with malloc/realloc.
2575                  * For inline data, the underlying buffer must be
2576                  * a multiple of 4 bytes in size so that it can be
2577                  * logged and stay on word boundaries.  We enforce
2578                  * that here.
2579                  */
2580                 real_size = roundup(new_size, 4);
2581                 if (ifp->if_u1.if_data == NULL) {
2582                         ASSERT(ifp->if_real_bytes == 0);
2583                         ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP);
2584                 } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) {
2585                         /*
2586                          * Only do the realloc if the underlying size
2587                          * is really changing.
2588                          */
2589                         if (ifp->if_real_bytes != real_size) {
2590                                 ifp->if_u1.if_data =
2591                                         kmem_realloc(ifp->if_u1.if_data,
2592                                                         real_size,
2593                                                         ifp->if_real_bytes,
2594                                                         KM_SLEEP);
2595                         }
2596                 } else {
2597                         ASSERT(ifp->if_real_bytes == 0);
2598                         ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP);
2599                         memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data,
2600                                 ifp->if_bytes);
2601                 }
2602         }
2603         ifp->if_real_bytes = real_size;
2604         ifp->if_bytes = new_size;
2605         ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork));
2606 }
2607
2608
2609
2610
2611 /*
2612  * Map inode to disk block and offset.
2613  *
2614  * mp -- the mount point structure for the current file system
2615  * tp -- the current transaction
2616  * ino -- the inode number of the inode to be located
2617  * imap -- this structure is filled in with the information necessary
2618  *       to retrieve the given inode from disk
2619  * flags -- flags to pass to xfs_dilocate indicating whether or not
2620  *       lookups in the inode btree were OK or not
2621  */
2622 int
2623 xfs_imap(
2624         xfs_mount_t     *mp,
2625         xfs_trans_t     *tp,
2626         xfs_ino_t       ino,
2627         xfs_imap_t      *imap,
2628         uint            flags)
2629 {
2630         xfs_fsblock_t   fsbno;
2631         int             len;
2632         int             off;
2633         int             error;
2634
2635         fsbno = imap->im_blkno ?
2636                 XFS_DADDR_TO_FSB(mp, imap->im_blkno) : NULLFSBLOCK;
2637         error = xfs_dilocate(mp, tp, ino, &fsbno, &len, &off, flags);
2638         if (error != 0) {
2639                 return error;
2640         }
2641         imap->im_blkno = XFS_FSB_TO_DADDR(mp, fsbno);
2642         imap->im_len = XFS_FSB_TO_BB(mp, len);
2643         imap->im_agblkno = XFS_FSB_TO_AGBNO(mp, fsbno);
2644         imap->im_ioffset = (ushort)off;
2645         imap->im_boffset = (ushort)(off << mp->m_sb.sb_inodelog);
2646         return 0;
2647 }
2648
2649 void
2650 xfs_idestroy_fork(
2651         xfs_inode_t     *ip,
2652         int             whichfork)
2653 {
2654         xfs_ifork_t     *ifp;
2655
2656         ifp = XFS_IFORK_PTR(ip, whichfork);
2657         if (ifp->if_broot != NULL) {
2658                 kmem_free(ifp->if_broot, ifp->if_broot_bytes);
2659                 ifp->if_broot = NULL;
2660         }
2661
2662         /*
2663          * If the format is local, then we can't have an extents
2664          * array so just look for an inline data array.  If we're
2665          * not local then we may or may not have an extents list,
2666          * so check and free it up if we do.
2667          */
2668         if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) {
2669                 if ((ifp->if_u1.if_data != ifp->if_u2.if_inline_data) &&
2670                     (ifp->if_u1.if_data != NULL)) {
2671                         ASSERT(ifp->if_real_bytes != 0);
2672                         kmem_free(ifp->if_u1.if_data, ifp->if_real_bytes);
2673                         ifp->if_u1.if_data = NULL;
2674                         ifp->if_real_bytes = 0;
2675                 }
2676         } else if ((ifp->if_flags & XFS_IFEXTENTS) &&
2677                    ((ifp->if_flags & XFS_IFEXTIREC) ||
2678                     ((ifp->if_u1.if_extents != NULL) &&
2679                      (ifp->if_u1.if_extents != ifp->if_u2.if_inline_ext)))) {
2680                 ASSERT(ifp->if_real_bytes != 0);
2681                 xfs_iext_destroy(ifp);
2682         }
2683         ASSERT(ifp->if_u1.if_extents == NULL ||
2684                ifp->if_u1.if_extents == ifp->if_u2.if_inline_ext);
2685         ASSERT(ifp->if_real_bytes == 0);
2686         if (whichfork == XFS_ATTR_FORK) {
2687                 kmem_zone_free(xfs_ifork_zone, ip->i_afp);
2688                 ip->i_afp = NULL;
2689         }
2690 }
2691
2692 /*
2693  * This is called free all the memory associated with an inode.
2694  * It must free the inode itself and any buffers allocated for
2695  * if_extents/if_data and if_broot.  It must also free the lock
2696  * associated with the inode.
2697  */
2698 void
2699 xfs_idestroy(
2700         xfs_inode_t     *ip)
2701 {
2702
2703         switch (ip->i_d.di_mode & S_IFMT) {
2704         case S_IFREG:
2705         case S_IFDIR:
2706         case S_IFLNK:
2707                 xfs_idestroy_fork(ip, XFS_DATA_FORK);
2708                 break;
2709         }
2710         if (ip->i_afp)
2711                 xfs_idestroy_fork(ip, XFS_ATTR_FORK);
2712         mrfree(&ip->i_lock);
2713         mrfree(&ip->i_iolock);
2714         freesema(&ip->i_flock);
2715 #ifdef XFS_BMAP_TRACE
2716         ktrace_free(ip->i_xtrace);
2717 #endif
2718 #ifdef XFS_BMBT_TRACE
2719         ktrace_free(ip->i_btrace);
2720 #endif
2721 #ifdef XFS_RW_TRACE
2722         ktrace_free(ip->i_rwtrace);
2723 #endif
2724 #ifdef XFS_ILOCK_TRACE
2725         ktrace_free(ip->i_lock_trace);
2726 #endif
2727 #ifdef XFS_DIR2_TRACE
2728         ktrace_free(ip->i_dir_trace);
2729 #endif
2730         if (ip->i_itemp) {
2731                 /* XXXdpd should be able to assert this but shutdown
2732                  * is leaving the AIL behind. */
2733                 ASSERT(((ip->i_itemp->ili_item.li_flags & XFS_LI_IN_AIL) == 0) ||
2734                        XFS_FORCED_SHUTDOWN(ip->i_mount));
2735                 xfs_inode_item_destroy(ip);
2736         }
2737         kmem_zone_free(xfs_inode_zone, ip);
2738 }
2739
2740
2741 /*
2742  * Increment the pin count of the given buffer.
2743  * This value is protected by ipinlock spinlock in the mount structure.
2744  */
2745 void
2746 xfs_ipin(
2747         xfs_inode_t     *ip)
2748 {
2749         ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE));
2750
2751         atomic_inc(&ip->i_pincount);
2752 }
2753
2754 /*
2755  * Decrement the pin count of the given inode, and wake up
2756  * anyone in xfs_iwait_unpin() if the count goes to 0.  The
2757  * inode must have been previously pinned with a call to xfs_ipin().
2758  */
2759 void
2760 xfs_iunpin(
2761         xfs_inode_t     *ip)
2762 {
2763         ASSERT(atomic_read(&ip->i_pincount) > 0);
2764
2765         if (atomic_dec_and_lock(&ip->i_pincount, &ip->i_flags_lock)) {
2766
2767                 /*
2768                  * If the inode is currently being reclaimed, the link between
2769                  * the bhv_vnode and the xfs_inode will be broken after the
2770                  * XFS_IRECLAIM* flag is set. Hence, if these flags are not
2771                  * set, then we can move forward and mark the linux inode dirty
2772                  * knowing that it is still valid as it won't freed until after
2773                  * the bhv_vnode<->xfs_inode link is broken in xfs_reclaim. The
2774                  * i_flags_lock is used to synchronise the setting of the
2775                  * XFS_IRECLAIM* flags and the breaking of the link, and so we
2776                  * can execute atomically w.r.t to reclaim by holding this lock
2777                  * here.
2778                  *
2779                  * However, we still need to issue the unpin wakeup call as the
2780                  * inode reclaim may be blocked waiting for the inode to become
2781                  * unpinned.
2782                  */
2783
2784                 if (!__xfs_iflags_test(ip, XFS_IRECLAIM|XFS_IRECLAIMABLE)) {
2785                         bhv_vnode_t     *vp = XFS_ITOV_NULL(ip);
2786                         struct inode *inode = NULL;
2787
2788                         BUG_ON(vp == NULL);
2789                         inode = vn_to_inode(vp);
2790                         BUG_ON(inode->i_state & I_CLEAR);
2791
2792                         /* make sync come back and flush this inode */
2793                         if (!(inode->i_state & (I_NEW|I_FREEING)))
2794                                 mark_inode_dirty_sync(inode);
2795                 }
2796                 spin_unlock(&ip->i_flags_lock);
2797                 wake_up(&ip->i_ipin_wait);
2798         }
2799 }
2800
2801 /*
2802  * This is called to wait for the given inode to be unpinned.
2803  * It will sleep until this happens.  The caller must have the
2804  * inode locked in at least shared mode so that the buffer cannot
2805  * be subsequently pinned once someone is waiting for it to be
2806  * unpinned.
2807  */
2808 STATIC void
2809 xfs_iunpin_wait(
2810         xfs_inode_t     *ip)
2811 {
2812         xfs_inode_log_item_t    *iip;
2813         xfs_lsn_t       lsn;
2814
2815         ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE | MR_ACCESS));
2816
2817         if (atomic_read(&ip->i_pincount) == 0) {
2818                 return;
2819         }
2820
2821         iip = ip->i_itemp;
2822         if (iip && iip->ili_last_lsn) {
2823                 lsn = iip->ili_last_lsn;
2824         } else {
2825                 lsn = (xfs_lsn_t)0;
2826         }
2827
2828         /*
2829          * Give the log a push so we don't wait here too long.
2830          */
2831         xfs_log_force(ip->i_mount, lsn, XFS_LOG_FORCE);
2832
2833         wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0));
2834 }
2835
2836
2837 /*
2838  * xfs_iextents_copy()
2839  *
2840  * This is called to copy the REAL extents (as opposed to the delayed
2841  * allocation extents) from the inode into the given buffer.  It
2842  * returns the number of bytes copied into the buffer.
2843  *
2844  * If there are no delayed allocation extents, then we can just
2845  * memcpy() the extents into the buffer.  Otherwise, we need to
2846  * examine each extent in turn and skip those which are delayed.
2847  */
2848 int
2849 xfs_iextents_copy(
2850         xfs_inode_t             *ip,
2851         xfs_bmbt_rec_t          *buffer,
2852         int                     whichfork)
2853 {
2854         int                     copied;
2855         xfs_bmbt_rec_t          *dest_ep;
2856         xfs_bmbt_rec_t          *ep;
2857 #ifdef XFS_BMAP_TRACE
2858         static char             fname[] = "xfs_iextents_copy";
2859 #endif
2860         int                     i;
2861         xfs_ifork_t             *ifp;
2862         int                     nrecs;
2863         xfs_fsblock_t           start_block;
2864
2865         ifp = XFS_IFORK_PTR(ip, whichfork);
2866         ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS));
2867         ASSERT(ifp->if_bytes > 0);
2868
2869         nrecs = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
2870         xfs_bmap_trace_exlist(fname, ip, nrecs, whichfork);
2871         ASSERT(nrecs > 0);
2872
2873         /*
2874          * There are some delayed allocation extents in the
2875          * inode, so copy the extents one at a time and skip
2876          * the delayed ones.  There must be at least one
2877          * non-delayed extent.
2878          */
2879         dest_ep = buffer;
2880         copied = 0;
2881         for (i = 0; i < nrecs; i++) {
2882                 ep = xfs_iext_get_ext(ifp, i);
2883                 start_block = xfs_bmbt_get_startblock(ep);
2884                 if (ISNULLSTARTBLOCK(start_block)) {
2885                         /*
2886                          * It's a delayed allocation extent, so skip it.
2887                          */
2888                         continue;
2889                 }
2890
2891                 /* Translate to on disk format */
2892                 put_unaligned(INT_GET(ep->l0, ARCH_CONVERT),
2893                               (__uint64_t*)&dest_ep->l0);
2894                 put_unaligned(INT_GET(ep->l1, ARCH_CONVERT),
2895                               (__uint64_t*)&dest_ep->l1);
2896                 dest_ep++;
2897                 copied++;
2898         }
2899         ASSERT(copied != 0);
2900         xfs_validate_extents(ifp, copied, 1, XFS_EXTFMT_INODE(ip));
2901
2902         return (copied * (uint)sizeof(xfs_bmbt_rec_t));
2903 }
2904
2905 /*
2906  * Each of the following cases stores data into the same region
2907  * of the on-disk inode, so only one of them can be valid at
2908  * any given time. While it is possible to have conflicting formats
2909  * and log flags, e.g. having XFS_ILOG_?DATA set when the fork is
2910  * in EXTENTS format, this can only happen when the fork has
2911  * changed formats after being modified but before being flushed.
2912  * In these cases, the format always takes precedence, because the
2913  * format indicates the current state of the fork.
2914  */
2915 /*ARGSUSED*/
2916 STATIC int
2917 xfs_iflush_fork(
2918         xfs_inode_t             *ip,
2919         xfs_dinode_t            *dip,
2920         xfs_inode_log_item_t    *iip,
2921         int                     whichfork,
2922         xfs_buf_t               *bp)
2923 {
2924         char                    *cp;
2925         xfs_ifork_t             *ifp;
2926         xfs_mount_t             *mp;
2927 #ifdef XFS_TRANS_DEBUG
2928         int                     first;
2929 #endif
2930         static const short      brootflag[2] =
2931                 { XFS_ILOG_DBROOT, XFS_ILOG_ABROOT };
2932         static const short      dataflag[2] =
2933                 { XFS_ILOG_DDATA, XFS_ILOG_ADATA };
2934         static const short      extflag[2] =
2935                 { XFS_ILOG_DEXT, XFS_ILOG_AEXT };
2936
2937         if (iip == NULL)
2938                 return 0;
2939         ifp = XFS_IFORK_PTR(ip, whichfork);
2940         /*
2941          * This can happen if we gave up in iformat in an error path,
2942          * for the attribute fork.
2943          */
2944         if (ifp == NULL) {
2945                 ASSERT(whichfork == XFS_ATTR_FORK);
2946                 return 0;
2947         }
2948         cp = XFS_DFORK_PTR(dip, whichfork);
2949         mp = ip->i_mount;
2950         switch (XFS_IFORK_FORMAT(ip, whichfork)) {
2951         case XFS_DINODE_FMT_LOCAL:
2952                 if ((iip->ili_format.ilf_fields & dataflag[whichfork]) &&
2953                     (ifp->if_bytes > 0)) {
2954                         ASSERT(ifp->if_u1.if_data != NULL);
2955                         ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork));
2956                         memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes);
2957                 }
2958                 break;
2959
2960         case XFS_DINODE_FMT_EXTENTS:
2961                 ASSERT((ifp->if_flags & XFS_IFEXTENTS) ||
2962                        !(iip->ili_format.ilf_fields & extflag[whichfork]));
2963                 ASSERT((xfs_iext_get_ext(ifp, 0) != NULL) ||
2964                         (ifp->if_bytes == 0));
2965                 ASSERT((xfs_iext_get_ext(ifp, 0) == NULL) ||
2966                         (ifp->if_bytes > 0));
2967                 if ((iip->ili_format.ilf_fields & extflag[whichfork]) &&
2968                     (ifp->if_bytes > 0)) {
2969                         ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) > 0);
2970                         (void)xfs_iextents_copy(ip, (xfs_bmbt_rec_t *)cp,
2971                                 whichfork);
2972                 }
2973                 break;
2974
2975         case XFS_DINODE_FMT_BTREE:
2976                 if ((iip->ili_format.ilf_fields & brootflag[whichfork]) &&
2977                     (ifp->if_broot_bytes > 0)) {
2978                         ASSERT(ifp->if_broot != NULL);
2979                         ASSERT(ifp->if_broot_bytes <=
2980                                (XFS_IFORK_SIZE(ip, whichfork) +
2981                                 XFS_BROOT_SIZE_ADJ));
2982                         xfs_bmbt_to_bmdr(ifp->if_broot, ifp->if_broot_bytes,
2983                                 (xfs_bmdr_block_t *)cp,
2984                                 XFS_DFORK_SIZE(dip, mp, whichfork));
2985                 }
2986                 break;
2987
2988         case XFS_DINODE_FMT_DEV:
2989                 if (iip->ili_format.ilf_fields & XFS_ILOG_DEV) {
2990                         ASSERT(whichfork == XFS_DATA_FORK);
2991                         INT_SET(dip->di_u.di_dev, ARCH_CONVERT, ip->i_df.if_u2.if_rdev);
2992                 }
2993                 break;
2994
2995         case XFS_DINODE_FMT_UUID:
2996                 if (iip->ili_format.ilf_fields & XFS_ILOG_UUID) {
2997                         ASSERT(whichfork == XFS_DATA_FORK);
2998                         memcpy(&dip->di_u.di_muuid, &ip->i_df.if_u2.if_uuid,
2999                                 sizeof(uuid_t));
3000                 }
3001                 break;
3002
3003         default:
3004                 ASSERT(0);
3005                 break;
3006         }
3007
3008         return 0;
3009 }
3010
3011 /*
3012  * xfs_iflush() will write a modified inode's changes out to the
3013  * inode's on disk home.  The caller must have the inode lock held
3014  * in at least shared mode and the inode flush semaphore must be
3015  * held as well.  The inode lock will still be held upon return from
3016  * the call and the caller is free to unlock it.
3017  * The inode flush lock will be unlocked when the inode reaches the disk.
3018  * The flags indicate how the inode's buffer should be written out.
3019  */
3020 int
3021 xfs_iflush(
3022         xfs_inode_t             *ip,
3023         uint                    flags)
3024 {
3025         xfs_inode_log_item_t    *iip;
3026         xfs_buf_t               *bp;
3027         xfs_dinode_t            *dip;
3028         xfs_mount_t             *mp;
3029         int                     error;
3030         /* REFERENCED */
3031         xfs_chash_t             *ch;
3032         xfs_inode_t             *iq;
3033         int                     clcount;        /* count of inodes clustered */
3034         int                     bufwasdelwri;
3035         enum { INT_DELWRI = (1 << 0), INT_ASYNC = (1 << 1) };
3036         SPLDECL(s);
3037
3038         XFS_STATS_INC(xs_iflush_count);
3039
3040         ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS));
3041         ASSERT(issemalocked(&(ip->i_flock)));
3042         ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
3043                ip->i_d.di_nextents > ip->i_df.if_ext_max);
3044
3045         iip = ip->i_itemp;
3046         mp = ip->i_mount;
3047
3048         /*
3049          * If the inode isn't dirty, then just release the inode
3050          * flush lock and do nothing.
3051          */
3052         if ((ip->i_update_core == 0) &&
3053             ((iip == NULL) || !(iip->ili_format.ilf_fields & XFS_ILOG_ALL))) {
3054                 ASSERT((iip != NULL) ?
3055                          !(iip->ili_item.li_flags & XFS_LI_IN_AIL) : 1);
3056                 xfs_ifunlock(ip);
3057                 return 0;
3058         }
3059
3060         /*
3061          * We can't flush the inode until it is unpinned, so
3062          * wait for it.  We know noone new can pin it, because
3063          * we are holding the inode lock shared and you need
3064          * to hold it exclusively to pin the inode.
3065          */
3066         xfs_iunpin_wait(ip);
3067
3068         /*
3069          * This may have been unpinned because the filesystem is shutting
3070          * down forcibly. If that's the case we must not write this inode
3071          * to disk, because the log record didn't make it to disk!
3072          */
3073         if (XFS_FORCED_SHUTDOWN(mp)) {
3074                 ip->i_update_core = 0;
3075                 if (iip)
3076                         iip->ili_format.ilf_fields = 0;
3077                 xfs_ifunlock(ip);
3078                 return XFS_ERROR(EIO);
3079         }
3080
3081         /*
3082          * Get the buffer containing the on-disk inode.
3083          */
3084         error = xfs_itobp(mp, NULL, ip, &dip, &bp, 0, 0);
3085         if (error) {
3086                 xfs_ifunlock(ip);
3087                 return error;
3088         }
3089
3090         /*
3091          * Decide how buffer will be flushed out.  This is done before
3092          * the call to xfs_iflush_int because this field is zeroed by it.
3093          */
3094         if (iip != NULL && iip->ili_format.ilf_fields != 0) {
3095                 /*
3096                  * Flush out the inode buffer according to the directions
3097                  * of the caller.  In the cases where the caller has given
3098                  * us a choice choose the non-delwri case.  This is because
3099                  * the inode is in the AIL and we need to get it out soon.
3100                  */
3101                 switch (flags) {
3102                 case XFS_IFLUSH_SYNC:
3103                 case XFS_IFLUSH_DELWRI_ELSE_SYNC:
3104                         flags = 0;
3105                         break;
3106                 case XFS_IFLUSH_ASYNC:
3107                 case XFS_IFLUSH_DELWRI_ELSE_ASYNC:
3108                         flags = INT_ASYNC;
3109                         break;
3110                 case XFS_IFLUSH_DELWRI:
3111                         flags = INT_DELWRI;
3112                         break;
3113                 default:
3114                         ASSERT(0);
3115                         flags = 0;
3116                         break;
3117                 }
3118         } else {
3119                 switch (flags) {
3120                 case XFS_IFLUSH_DELWRI_ELSE_SYNC:
3121                 case XFS_IFLUSH_DELWRI_ELSE_ASYNC:
3122                 case XFS_IFLUSH_DELWRI:
3123                         flags = INT_DELWRI;
3124                         break;
3125                 case XFS_IFLUSH_ASYNC:
3126                         flags = INT_ASYNC;
3127                         break;
3128                 case XFS_IFLUSH_SYNC:
3129                         flags = 0;
3130                         break;
3131                 default:
3132                         ASSERT(0);
3133                         flags = 0;
3134                         break;
3135                 }
3136         }
3137
3138         /*
3139          * First flush out the inode that xfs_iflush was called with.
3140          */
3141         error = xfs_iflush_int(ip, bp);
3142         if (error) {
3143                 goto corrupt_out;
3144         }
3145
3146         /*
3147          * inode clustering:
3148          * see if other inodes can be gathered into this write
3149          */
3150
3151         ip->i_chash->chl_buf = bp;
3152
3153         ch = XFS_CHASH(mp, ip->i_blkno);
3154         s = mutex_spinlock(&ch->ch_lock);
3155
3156         clcount = 0;
3157         for (iq = ip->i_cnext; iq != ip; iq = iq->i_cnext) {
3158                 /*
3159                  * Do an un-protected check to see if the inode is dirty and
3160                  * is a candidate for flushing.  These checks will be repeated
3161                  * later after the appropriate locks are acquired.
3162                  */
3163                 iip = iq->i_itemp;
3164                 if ((iq->i_update_core == 0) &&
3165                     ((iip == NULL) ||
3166                      !(iip->ili_format.ilf_fields & XFS_ILOG_ALL)) &&
3167                       xfs_ipincount(iq) == 0) {
3168                         continue;
3169                 }
3170
3171                 /*
3172                  * Try to get locks.  If any are unavailable,
3173                  * then this inode cannot be flushed and is skipped.
3174                  */
3175
3176                 /* get inode locks (just i_lock) */
3177                 if (xfs_ilock_nowait(iq, XFS_ILOCK_SHARED)) {
3178                         /* get inode flush lock */
3179                         if (xfs_iflock_nowait(iq)) {
3180                                 /* check if pinned */
3181                                 if (xfs_ipincount(iq) == 0) {
3182                                         /* arriving here means that
3183                                          * this inode can be flushed.
3184                                          * first re-check that it's
3185                                          * dirty
3186                                          */
3187                                         iip = iq->i_itemp;
3188                                         if ((iq->i_update_core != 0)||
3189                                             ((iip != NULL) &&
3190                                              (iip->ili_format.ilf_fields & XFS_ILOG_ALL))) {
3191                                                 clcount++;
3192                                                 error = xfs_iflush_int(iq, bp);
3193                                                 if (error) {
3194                                                         xfs_iunlock(iq,
3195                                                                     XFS_ILOCK_SHARED);
3196                                                         goto cluster_corrupt_out;
3197                                                 }
3198                                         } else {
3199                                                 xfs_ifunlock(iq);
3200                                         }
3201                                 } else {
3202                                         xfs_ifunlock(iq);
3203                                 }
3204                         }
3205                         xfs_iunlock(iq, XFS_ILOCK_SHARED);
3206                 }
3207         }
3208         mutex_spinunlock(&ch->ch_lock, s);
3209
3210         if (clcount) {
3211                 XFS_STATS_INC(xs_icluster_flushcnt);
3212                 XFS_STATS_ADD(xs_icluster_flushinode, clcount);
3213         }
3214
3215         /*
3216          * If the buffer is pinned then push on the log so we won't
3217          * get stuck waiting in the write for too long.
3218          */
3219         if (XFS_BUF_ISPINNED(bp)){
3220                 xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE);
3221         }
3222
3223         if (flags & INT_DELWRI) {
3224                 xfs_bdwrite(mp, bp);
3225         } else if (flags & INT_ASYNC) {
3226                 xfs_bawrite(mp, bp);
3227         } else {
3228                 error = xfs_bwrite(mp, bp);
3229         }
3230         return error;
3231
3232 corrupt_out:
3233         xfs_buf_relse(bp);
3234         xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
3235         xfs_iflush_abort(ip);
3236         /*
3237          * Unlocks the flush lock
3238          */
3239         return XFS_ERROR(EFSCORRUPTED);
3240
3241 cluster_corrupt_out:
3242         /* Corruption detected in the clustering loop.  Invalidate the
3243          * inode buffer and shut down the filesystem.
3244          */
3245         mutex_spinunlock(&ch->ch_lock, s);
3246
3247         /*
3248          * Clean up the buffer.  If it was B_DELWRI, just release it --
3249          * brelse can handle it with no problems.  If not, shut down the
3250          * filesystem before releasing the buffer.
3251          */
3252         if ((bufwasdelwri= XFS_BUF_ISDELAYWRITE(bp))) {
3253                 xfs_buf_relse(bp);
3254         }
3255
3256         xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
3257
3258         if(!bufwasdelwri)  {
3259                 /*
3260                  * Just like incore_relse: if we have b_iodone functions,
3261                  * mark the buffer as an error and call them.  Otherwise
3262                  * mark it as stale and brelse.
3263                  */
3264                 if (XFS_BUF_IODONE_FUNC(bp)) {
3265                         XFS_BUF_CLR_BDSTRAT_FUNC(bp);
3266                         XFS_BUF_UNDONE(bp);
3267                         XFS_BUF_STALE(bp);
3268                         XFS_BUF_SHUT(bp);
3269                         XFS_BUF_ERROR(bp,EIO);
3270                         xfs_biodone(bp);
3271                 } else {
3272                         XFS_BUF_STALE(bp);
3273                         xfs_buf_relse(bp);
3274                 }
3275         }
3276
3277         xfs_iflush_abort(iq);
3278         /*
3279          * Unlocks the flush lock
3280          */
3281         return XFS_ERROR(EFSCORRUPTED);
3282 }
3283
3284
3285 STATIC int
3286 xfs_iflush_int(
3287         xfs_inode_t             *ip,
3288         xfs_buf_t               *bp)
3289 {
3290         xfs_inode_log_item_t    *iip;
3291         xfs_dinode_t            *dip;
3292         xfs_mount_t             *mp;
3293 #ifdef XFS_TRANS_DEBUG
3294         int                     first;
3295 #endif
3296         SPLDECL(s);
3297
3298         ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS));
3299         ASSERT(issemalocked(&(ip->i_flock)));
3300         ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
3301                ip->i_d.di_nextents > ip->i_df.if_ext_max);
3302
3303         iip = ip->i_itemp;
3304         mp = ip->i_mount;
3305
3306
3307         /*
3308          * If the inode isn't dirty, then just release the inode
3309          * flush lock and do nothing.
3310          */
3311         if ((ip->i_update_core == 0) &&
3312             ((iip == NULL) || !(iip->ili_format.ilf_fields & XFS_ILOG_ALL))) {
3313                 xfs_ifunlock(ip);
3314                 return 0;
3315         }
3316
3317         /* set *dip = inode's place in the buffer */
3318         dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_boffset);
3319
3320         /*
3321          * Clear i_update_core before copying out the data.
3322          * This is for coordination with our timestamp updates
3323          * that don't hold the inode lock. They will always
3324          * update the timestamps BEFORE setting i_update_core,
3325          * so if we clear i_update_core after they set it we
3326          * are guaranteed to see their updates to the timestamps.
3327          * I believe that this depends on strongly ordered memory
3328          * semantics, but we have that.  We use the SYNCHRONIZE
3329          * macro to make sure that the compiler does not reorder
3330          * the i_update_core access below the data copy below.
3331          */
3332         ip->i_update_core = 0;
3333         SYNCHRONIZE();
3334
3335         /*
3336          * Make sure to get the latest atime from the Linux inode.
3337          */
3338         xfs_synchronize_atime(ip);
3339
3340         if (XFS_TEST_ERROR(INT_GET(dip->di_core.di_magic,ARCH_CONVERT) != XFS_DINODE_MAGIC,
3341                                mp, XFS_ERRTAG_IFLUSH_1, XFS_RANDOM_IFLUSH_1)) {
3342                 xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
3343                     "xfs_iflush: Bad inode %Lu magic number 0x%x, ptr 0x%p",
3344                         ip->i_ino, (int) INT_GET(dip->di_core.di_magic, ARCH_CONVERT), dip);
3345                 goto corrupt_out;
3346         }
3347         if (XFS_TEST_ERROR(ip->i_d.di_magic != XFS_DINODE_MAGIC,
3348                                 mp, XFS_ERRTAG_IFLUSH_2, XFS_RANDOM_IFLUSH_2)) {
3349                 xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
3350                         "xfs_iflush: Bad inode %Lu, ptr 0x%p, magic number 0x%x",
3351                         ip->i_ino, ip, ip->i_d.di_magic);
3352                 goto corrupt_out;
3353         }
3354         if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) {
3355                 if (XFS_TEST_ERROR(
3356                     (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
3357                     (ip->i_d.di_format != XFS_DINODE_FMT_BTREE),
3358                     mp, XFS_ERRTAG_IFLUSH_3, XFS_RANDOM_IFLUSH_3)) {
3359                         xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
3360                                 "xfs_iflush: Bad regular inode %Lu, ptr 0x%p",
3361                                 ip->i_ino, ip);
3362                         goto corrupt_out;
3363                 }
3364         } else if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) {
3365                 if (XFS_TEST_ERROR(
3366                     (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
3367                     (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
3368                     (ip->i_d.di_format != XFS_DINODE_FMT_LOCAL),
3369                     mp, XFS_ERRTAG_IFLUSH_4, XFS_RANDOM_IFLUSH_4)) {
3370                         xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
3371                                 "xfs_iflush: Bad directory inode %Lu, ptr 0x%p",
3372                                 ip->i_ino, ip);
3373                         goto corrupt_out;
3374                 }
3375         }
3376         if (XFS_TEST_ERROR(ip->i_d.di_nextents + ip->i_d.di_anextents >
3377                                 ip->i_d.di_nblocks, mp, XFS_ERRTAG_IFLUSH_5,
3378                                 XFS_RANDOM_IFLUSH_5)) {
3379                 xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
3380                         "xfs_iflush: detected corrupt incore inode %Lu, total extents = %d, nblocks = %Ld, ptr 0x%p",
3381                         ip->i_ino,
3382                         ip->i_d.di_nextents + ip->i_d.di_anextents,
3383                         ip->i_d.di_nblocks,
3384                         ip);
3385                 goto corrupt_out;
3386         }
3387         if (XFS_TEST_ERROR(ip->i_d.di_forkoff > mp->m_sb.sb_inodesize,
3388                                 mp, XFS_ERRTAG_IFLUSH_6, XFS_RANDOM_IFLUSH_6)) {
3389                 xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
3390                         "xfs_iflush: bad inode %Lu, forkoff 0x%x, ptr 0x%p",
3391                         ip->i_ino, ip->i_d.di_forkoff, ip);
3392                 goto corrupt_out;
3393         }
3394         /*
3395          * bump the flush iteration count, used to detect flushes which
3396          * postdate a log record during recovery.
3397          */
3398
3399         ip->i_d.di_flushiter++;
3400
3401         /*
3402          * Copy the dirty parts of the inode into the on-disk
3403          * inode.  We always copy out the core of the inode,
3404          * because if the inode is dirty at all the core must
3405          * be.
3406          */
3407         xfs_xlate_dinode_core((xfs_caddr_t)&(dip->di_core), &(ip->i_d), -1);
3408
3409         /* Wrap, we never let the log put out DI_MAX_FLUSH */
3410         if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
3411                 ip->i_d.di_flushiter = 0;
3412
3413         /*
3414          * If this is really an old format inode and the superblock version
3415          * has not been updated to support only new format inodes, then
3416          * convert back to the old inode format.  If the superblock version
3417          * has been updated, then make the conversion permanent.
3418          */
3419         ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1 ||
3420                XFS_SB_VERSION_HASNLINK(&mp->m_sb));
3421         if (ip->i_d.di_version == XFS_DINODE_VERSION_1) {
3422                 if (!XFS_SB_VERSION_HASNLINK(&mp->m_sb)) {
3423                         /*
3424                          * Convert it back.
3425                          */
3426                         ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1);
3427                         INT_SET(dip->di_core.di_onlink, ARCH_CONVERT, ip->i_d.di_nlink);
3428                 } else {
3429                         /*
3430                          * The superblock version has already been bumped,
3431                          * so just make the conversion to the new inode
3432                          * format permanent.
3433                          */
3434                         ip->i_d.di_version = XFS_DINODE_VERSION_2;
3435                         INT_SET(dip->di_core.di_version, ARCH_CONVERT, XFS_DINODE_VERSION_2);
3436                         ip->i_d.di_onlink = 0;
3437                         dip->di_core.di_onlink = 0;
3438                         memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
3439                         memset(&(dip->di_core.di_pad[0]), 0,
3440                               sizeof(dip->di_core.di_pad));
3441                         ASSERT(ip->i_d.di_projid == 0);
3442                 }
3443         }
3444
3445         if (xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK, bp) == EFSCORRUPTED) {
3446                 goto corrupt_out;
3447         }
3448
3449         if (XFS_IFORK_Q(ip)) {
3450                 /*
3451                  * The only error from xfs_iflush_fork is on the data fork.
3452                  */
3453                 (void) xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK, bp);
3454         }
3455         xfs_inobp_check(mp, bp);
3456
3457         /*
3458          * We've recorded everything logged in the inode, so we'd
3459          * like to clear the ilf_fields bits so we don't log and
3460          * flush things unnecessarily.  However, we can't stop
3461          * logging all this information until the data we've copied
3462          * into the disk buffer is written to disk.  If we did we might
3463          * overwrite the copy of the inode in the log with all the
3464          * data after re-logging only part of it, and in the face of
3465          * a crash we wouldn't have all the data we need to recover.
3466          *
3467          * What we do is move the bits to the ili_last_fields field.
3468          * When logging the inode, these bits are moved back to the
3469          * ilf_fields field.  In the xfs_iflush_done() routine we
3470          * clear ili_last_fields, since we know that the information
3471          * those bits represent is permanently on disk.  As long as
3472          * the flush completes before the inode is logged again, then
3473          * both ilf_fields and ili_last_fields will be cleared.
3474          *
3475          * We can play with the ilf_fields bits here, because the inode
3476          * lock must be held exclusively in order to set bits there
3477          * and the flush lock protects the ili_last_fields bits.
3478          * Set ili_logged so the flush done
3479          * routine can tell whether or not to look in the AIL.
3480          * Also, store the current LSN of the inode so that we can tell
3481          * whether the item has moved in the AIL from xfs_iflush_done().
3482          * In order to read the lsn we need the AIL lock, because
3483          * it is a 64 bit value that cannot be read atomically.
3484          */
3485         if (iip != NULL && iip->ili_format.ilf_fields != 0) {
3486                 iip->ili_last_fields = iip->ili_format.ilf_fields;
3487                 iip->ili_format.ilf_fields = 0;
3488                 iip->ili_logged = 1;
3489
3490                 ASSERT(sizeof(xfs_lsn_t) == 8); /* don't lock if it shrinks */
3491                 AIL_LOCK(mp,s);
3492                 iip->ili_flush_lsn = iip->ili_item.li_lsn;
3493                 AIL_UNLOCK(mp, s);
3494
3495                 /*
3496                  * Attach the function xfs_iflush_done to the inode's
3497                  * buffer.  This will remove the inode from the AIL
3498                  * and unlock the inode's flush lock when the inode is
3499                  * completely written to disk.
3500                  */
3501                 xfs_buf_attach_iodone(bp, (void(*)(xfs_buf_t*,xfs_log_item_t*))
3502                                       xfs_iflush_done, (xfs_log_item_t *)iip);
3503
3504                 ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL);
3505                 ASSERT(XFS_BUF_IODONE_FUNC(bp) != NULL);
3506         } else {
3507                 /*
3508                  * We're flushing an inode which is not in the AIL and has
3509                  * not been logged but has i_update_core set.  For this
3510                  * case we can use a B_DELWRI flush and immediately drop
3511                  * the inode flush lock because we can avoid the whole
3512                  * AIL state thing.  It's OK to drop the flush lock now,
3513                  * because we've already locked the buffer and to do anything
3514                  * you really need both.
3515                  */
3516                 if (iip != NULL) {
3517                         ASSERT(iip->ili_logged == 0);
3518                         ASSERT(iip->ili_last_fields == 0);
3519                         ASSERT((iip->ili_item.li_flags & XFS_LI_IN_AIL) == 0);
3520                 }
3521                 xfs_ifunlock(ip);
3522         }
3523
3524         return 0;
3525
3526 corrupt_out:
3527         return XFS_ERROR(EFSCORRUPTED);
3528 }
3529
3530
3531 /*
3532  * Flush all inactive inodes in mp.
3533  */
3534 void
3535 xfs_iflush_all(
3536         xfs_mount_t     *mp)
3537 {
3538         xfs_inode_t     *ip;
3539         bhv_vnode_t     *vp;
3540
3541  again:
3542         XFS_MOUNT_ILOCK(mp);
3543         ip = mp->m_inodes;
3544         if (ip == NULL)
3545                 goto out;
3546
3547         do {
3548                 /* Make sure we skip markers inserted by sync */
3549                 if (ip->i_mount == NULL) {
3550                         ip = ip->i_mnext;
3551                         continue;
3552                 }
3553
3554                 vp = XFS_ITOV_NULL(ip);
3555                 if (!vp) {
3556                         XFS_MOUNT_IUNLOCK(mp);
3557                         xfs_finish_reclaim(ip, 0, XFS_IFLUSH_ASYNC);
3558                         goto again;
3559                 }
3560
3561                 ASSERT(vn_count(vp) == 0);
3562
3563                 ip = ip->i_mnext;
3564         } while (ip != mp->m_inodes);
3565  out:
3566         XFS_MOUNT_IUNLOCK(mp);
3567 }
3568
3569 /*
3570  * xfs_iaccess: check accessibility of inode for mode.
3571  */
3572 int
3573 xfs_iaccess(
3574         xfs_inode_t     *ip,
3575         mode_t          mode,
3576         cred_t          *cr)
3577 {
3578         int             error;
3579         mode_t          orgmode = mode;
3580         struct inode    *inode = vn_to_inode(XFS_ITOV(ip));
3581
3582         if (mode & S_IWUSR) {
3583                 umode_t         imode = inode->i_mode;
3584
3585                 if (IS_RDONLY(inode) &&
3586                     (S_ISREG(imode) || S_ISDIR(imode) || S_ISLNK(imode)))
3587                         return XFS_ERROR(EROFS);
3588
3589                 if (IS_IMMUTABLE(inode))
3590                         return XFS_ERROR(EACCES);
3591         }
3592
3593         /*
3594          * If there's an Access Control List it's used instead of
3595          * the mode bits.
3596          */
3597         if ((error = _ACL_XFS_IACCESS(ip, mode, cr)) != -1)
3598                 return error ? XFS_ERROR(error) : 0;
3599
3600         if (current_fsuid(cr) != ip->i_d.di_uid) {
3601                 mode >>= 3;
3602                 if (!in_group_p((gid_t)ip->i_d.di_gid))
3603                         mode >>= 3;
3604         }
3605
3606         /*
3607          * If the DACs are ok we don't need any capability check.
3608          */
3609         if ((ip->i_d.di_mode & mode) == mode)
3610                 return 0;
3611         /*
3612          * Read/write DACs are always overridable.
3613          * Executable DACs are overridable if at least one exec bit is set.
3614          */
3615         if (!(orgmode & S_IXUSR) ||
3616             (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode))
3617                 if (capable_cred(cr, CAP_DAC_OVERRIDE))
3618                         return 0;
3619
3620         if ((orgmode == S_IRUSR) ||
3621             (S_ISDIR(inode->i_mode) && (!(orgmode & S_IWUSR)))) {
3622                 if (capable_cred(cr, CAP_DAC_READ_SEARCH))
3623                         return 0;
3624 #ifdef  NOISE
3625                 cmn_err(CE_NOTE, "Ick: mode=%o, orgmode=%o", mode, orgmode);
3626 #endif  /* NOISE */
3627                 return XFS_ERROR(EACCES);
3628         }
3629         return XFS_ERROR(EACCES);
3630 }
3631
3632 /*
3633  * xfs_iroundup: round up argument to next power of two
3634  */
3635 uint
3636 xfs_iroundup(
3637         uint    v)
3638 {
3639         int i;
3640         uint m;
3641
3642         if ((v & (v - 1)) == 0)
3643                 return v;
3644         ASSERT((v & 0x80000000) == 0);
3645         if ((v & (v + 1)) == 0)
3646                 return v + 1;
3647         for (i = 0, m = 1; i < 31; i++, m <<= 1) {
3648                 if (v & m)
3649                         continue;
3650                 v |= m;
3651                 if ((v & (v + 1)) == 0)
3652                         return v + 1;
3653         }
3654         ASSERT(0);
3655         return( 0 );
3656 }
3657
3658 #ifdef XFS_ILOCK_TRACE
3659 ktrace_t        *xfs_ilock_trace_buf;
3660
3661 void
3662 xfs_ilock_trace(xfs_inode_t *ip, int lock, unsigned int lockflags, inst_t *ra)
3663 {
3664         ktrace_enter(ip->i_lock_trace,
3665                      (void *)ip,
3666                      (void *)(unsigned long)lock, /* 1 = LOCK, 3=UNLOCK, etc */
3667                      (void *)(unsigned long)lockflags, /* XFS_ILOCK_EXCL etc */
3668                      (void *)ra,                /* caller of ilock */
3669                      (void *)(unsigned long)current_cpu(),
3670                      (void *)(unsigned long)current_pid(),
3671                      NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
3672 }
3673 #endif
3674
3675 /*
3676  * Return a pointer to the extent record at file index idx.
3677  */
3678 xfs_bmbt_rec_t *
3679 xfs_iext_get_ext(
3680         xfs_ifork_t     *ifp,           /* inode fork pointer */
3681         xfs_extnum_t    idx)            /* index of target extent */
3682 {
3683         ASSERT(idx >= 0);
3684         if ((ifp->if_flags & XFS_IFEXTIREC) && (idx == 0)) {
3685                 return ifp->if_u1.if_ext_irec->er_extbuf;
3686         } else if (ifp->if_flags & XFS_IFEXTIREC) {
3687                 xfs_ext_irec_t  *erp;           /* irec pointer */
3688                 int             erp_idx = 0;    /* irec index */
3689                 xfs_extnum_t    page_idx = idx; /* ext index in target list */
3690
3691                 erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0);
3692                 return &erp->er_extbuf[page_idx];
3693         } else if (ifp->if_bytes) {
3694                 return &ifp->if_u1.if_extents[idx];
3695         } else {
3696                 return NULL;
3697         }
3698 }
3699
3700 /*
3701  * Insert new item(s) into the extent records for incore inode
3702  * fork 'ifp'.  'count' new items are inserted at index 'idx'.
3703  */
3704 void
3705 xfs_iext_insert(
3706         xfs_ifork_t     *ifp,           /* inode fork pointer */
3707         xfs_extnum_t    idx,            /* starting index of new items */
3708         xfs_extnum_t    count,          /* number of inserted items */
3709         xfs_bmbt_irec_t *new)           /* items to insert */
3710 {
3711         xfs_bmbt_rec_t  *ep;            /* extent record pointer */
3712         xfs_extnum_t    i;              /* extent record index */
3713
3714         ASSERT(ifp->if_flags & XFS_IFEXTENTS);
3715         xfs_iext_add(ifp, idx, count);
3716         for (i = idx; i < idx + count; i++, new++) {
3717                 ep = xfs_iext_get_ext(ifp, i);
3718                 xfs_bmbt_set_all(ep, new);
3719         }
3720 }
3721
3722 /*
3723  * This is called when the amount of space required for incore file
3724  * extents needs to be increased. The ext_diff parameter stores the
3725  * number of new extents being added and the idx parameter contains
3726  * the extent index where the new extents will be added. If the new
3727  * extents are being appended, then we just need to (re)allocate and
3728  * initialize the space. Otherwise, if the new extents are being
3729  * inserted into the middle of the existing entries, a bit more work
3730  * is required to make room for the new extents to be inserted. The
3731  * caller is responsible for filling in the new extent entries upon
3732  * return.
3733  */
3734 void
3735 xfs_iext_add(
3736         xfs_ifork_t     *ifp,           /* inode fork pointer */
3737         xfs_extnum_t    idx,            /* index to begin adding exts */
3738         int             ext_diff)       /* number of extents to add */
3739 {
3740         int             byte_diff;      /* new bytes being added */
3741         int             new_size;       /* size of extents after adding */
3742         xfs_extnum_t    nextents;       /* number of extents in file */
3743
3744         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3745         ASSERT((idx >= 0) && (idx <= nextents));
3746         byte_diff = ext_diff * sizeof(xfs_bmbt_rec_t);
3747         new_size = ifp->if_bytes + byte_diff;
3748         /*
3749          * If the new number of extents (nextents + ext_diff)
3750          * fits inside the inode, then continue to use the inline
3751          * extent buffer.
3752          */
3753         if (nextents + ext_diff <= XFS_INLINE_EXTS) {
3754                 if (idx < nextents) {
3755                         memmove(&ifp->if_u2.if_inline_ext[idx + ext_diff],
3756                                 &ifp->if_u2.if_inline_ext[idx],
3757                                 (nextents - idx) * sizeof(xfs_bmbt_rec_t));
3758                         memset(&ifp->if_u2.if_inline_ext[idx], 0, byte_diff);
3759                 }
3760                 ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext;
3761                 ifp->if_real_bytes = 0;
3762                 ifp->if_lastex = nextents + ext_diff;
3763         }
3764         /*
3765          * Otherwise use a linear (direct) extent list.
3766          * If the extents are currently inside the inode,
3767          * xfs_iext_realloc_direct will switch us from
3768          * inline to direct extent allocation mode.
3769          */
3770         else if (nextents + ext_diff <= XFS_LINEAR_EXTS) {
3771                 xfs_iext_realloc_direct(ifp, new_size);
3772                 if (idx < nextents) {
3773                         memmove(&ifp->if_u1.if_extents[idx + ext_diff],
3774                                 &ifp->if_u1.if_extents[idx],
3775                                 (nextents - idx) * sizeof(xfs_bmbt_rec_t));
3776                         memset(&ifp->if_u1.if_extents[idx], 0, byte_diff);
3777                 }
3778         }
3779         /* Indirection array */
3780         else {
3781                 xfs_ext_irec_t  *erp;
3782                 int             erp_idx = 0;
3783                 int             page_idx = idx;
3784
3785                 ASSERT(nextents + ext_diff > XFS_LINEAR_EXTS);
3786                 if (ifp->if_flags & XFS_IFEXTIREC) {
3787                         erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 1);
3788                 } else {
3789                         xfs_iext_irec_init(ifp);
3790                         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3791                         erp = ifp->if_u1.if_ext_irec;
3792                 }
3793                 /* Extents fit in target extent page */
3794                 if (erp && erp->er_extcount + ext_diff <= XFS_LINEAR_EXTS) {
3795                         if (page_idx < erp->er_extcount) {
3796                                 memmove(&erp->er_extbuf[page_idx + ext_diff],
3797                                         &erp->er_extbuf[page_idx],
3798                                         (erp->er_extcount - page_idx) *
3799                                         sizeof(xfs_bmbt_rec_t));
3800                                 memset(&erp->er_extbuf[page_idx], 0, byte_diff);
3801                         }
3802                         erp->er_extcount += ext_diff;
3803                         xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff);
3804                 }
3805                 /* Insert a new extent page */
3806                 else if (erp) {
3807                         xfs_iext_add_indirect_multi(ifp,
3808                                 erp_idx, page_idx, ext_diff);
3809                 }
3810                 /*
3811                  * If extent(s) are being appended to the last page in
3812                  * the indirection array and the new extent(s) don't fit
3813                  * in the page, then erp is NULL and erp_idx is set to
3814                  * the next index needed in the indirection array.
3815                  */
3816                 else {
3817                         int     count = ext_diff;
3818
3819                         while (count) {
3820                                 erp = xfs_iext_irec_new(ifp, erp_idx);
3821                                 erp->er_extcount = count;
3822                                 count -= MIN(count, (int)XFS_LINEAR_EXTS);
3823                                 if (count) {
3824                                         erp_idx++;
3825                                 }
3826                         }
3827                 }
3828         }
3829         ifp->if_bytes = new_size;
3830 }
3831
3832 /*
3833  * This is called when incore extents are being added to the indirection
3834  * array and the new extents do not fit in the target extent list. The
3835  * erp_idx parameter contains the irec index for the target extent list
3836  * in the indirection array, and the idx parameter contains the extent
3837  * index within the list. The number of extents being added is stored
3838  * in the count parameter.
3839  *
3840  *    |-------|   |-------|
3841  *    |       |   |       |    idx - number of extents before idx
3842  *    |  idx  |   | count |
3843  *    |       |   |       |    count - number of extents being inserted at idx
3844  *    |-------|   |-------|
3845  *    | count |   | nex2  |    nex2 - number of extents after idx + count
3846  *    |-------|   |-------|
3847  */
3848 void
3849 xfs_iext_add_indirect_multi(
3850         xfs_ifork_t     *ifp,                   /* inode fork pointer */
3851         int             erp_idx,                /* target extent irec index */
3852         xfs_extnum_t    idx,                    /* index within target list */
3853         int             count)                  /* new extents being added */
3854 {
3855         int             byte_diff;              /* new bytes being added */
3856         xfs_ext_irec_t  *erp;                   /* pointer to irec entry */
3857         xfs_extnum_t    ext_diff;               /* number of extents to add */
3858         xfs_extnum_t    ext_cnt;                /* new extents still needed */
3859         xfs_extnum_t    nex2;                   /* extents after idx + count */
3860         xfs_bmbt_rec_t  *nex2_ep = NULL;        /* temp list for nex2 extents */
3861         int             nlists;                 /* number of irec's (lists) */
3862
3863         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3864         erp = &ifp->if_u1.if_ext_irec[erp_idx];
3865         nex2 = erp->er_extcount - idx;
3866         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3867
3868         /*
3869          * Save second part of target extent list
3870          * (all extents past */
3871         if (nex2) {
3872                 byte_diff = nex2 * sizeof(xfs_bmbt_rec_t);
3873                 nex2_ep = (xfs_bmbt_rec_t *) kmem_alloc(byte_diff, KM_SLEEP);
3874                 memmove(nex2_ep, &erp->er_extbuf[idx], byte_diff);
3875                 erp->er_extcount -= nex2;
3876                 xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, -nex2);
3877                 memset(&erp->er_extbuf[idx], 0, byte_diff);
3878         }
3879
3880         /*
3881          * Add the new extents to the end of the target
3882          * list, then allocate new irec record(s) and
3883          * extent buffer(s) as needed to store the rest
3884          * of the new extents.
3885          */
3886         ext_cnt = count;
3887         ext_diff = MIN(ext_cnt, (int)XFS_LINEAR_EXTS - erp->er_extcount);
3888         if (ext_diff) {
3889                 erp->er_extcount += ext_diff;
3890                 xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff);
3891                 ext_cnt -= ext_diff;
3892         }
3893         while (ext_cnt) {
3894                 erp_idx++;
3895                 erp = xfs_iext_irec_new(ifp, erp_idx);
3896                 ext_diff = MIN(ext_cnt, (int)XFS_LINEAR_EXTS);
3897                 erp->er_extcount = ext_diff;
3898                 xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff);
3899                 ext_cnt -= ext_diff;
3900         }
3901
3902         /* Add nex2 extents back to indirection array */
3903         if (nex2) {
3904                 xfs_extnum_t    ext_avail;
3905                 int             i;
3906
3907                 byte_diff = nex2 * sizeof(xfs_bmbt_rec_t);
3908                 ext_avail = XFS_LINEAR_EXTS - erp->er_extcount;
3909                 i = 0;
3910                 /*
3911                  * If nex2 extents fit in the current page, append
3912                  * nex2_ep after the new extents.
3913                  */
3914                 if (nex2 <= ext_avail) {
3915                         i = erp->er_extcount;
3916                 }
3917                 /*
3918                  * Otherwise, check if space is available in the
3919                  * next page.
3920                  */
3921                 else if ((erp_idx < nlists - 1) &&
3922                          (nex2 <= (ext_avail = XFS_LINEAR_EXTS -
3923                           ifp->if_u1.if_ext_irec[erp_idx+1].er_extcount))) {
3924                         erp_idx++;
3925                         erp++;
3926                         /* Create a hole for nex2 extents */
3927                         memmove(&erp->er_extbuf[nex2], erp->er_extbuf,
3928                                 erp->er_extcount * sizeof(xfs_bmbt_rec_t));
3929                 }
3930                 /*
3931                  * Final choice, create a new extent page for
3932                  * nex2 extents.
3933                  */
3934                 else {
3935                         erp_idx++;
3936                         erp = xfs_iext_irec_new(ifp, erp_idx);
3937                 }
3938                 memmove(&erp->er_extbuf[i], nex2_ep, byte_diff);
3939                 kmem_free(nex2_ep, byte_diff);
3940                 erp->er_extcount += nex2;
3941                 xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, nex2);
3942         }
3943 }
3944
3945 /*
3946  * This is called when the amount of space required for incore file
3947  * extents needs to be decreased. The ext_diff parameter stores the
3948  * number of extents to be removed and the idx parameter contains
3949  * the extent index where the extents will be removed from.
3950  *
3951  * If the amount of space needed has decreased below the linear
3952  * limit, XFS_IEXT_BUFSZ, then switch to using the contiguous
3953  * extent array.  Otherwise, use kmem_realloc() to adjust the
3954  * size to what is needed.
3955  */
3956 void
3957 xfs_iext_remove(
3958         xfs_ifork_t     *ifp,           /* inode fork pointer */
3959         xfs_extnum_t    idx,            /* index to begin removing exts */
3960         int             ext_diff)       /* number of extents to remove */
3961 {
3962         xfs_extnum_t    nextents;       /* number of extents in file */
3963         int             new_size;       /* size of extents after removal */
3964
3965         ASSERT(ext_diff > 0);
3966         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3967         new_size = (nextents - ext_diff) * sizeof(xfs_bmbt_rec_t);
3968
3969         if (new_size == 0) {
3970                 xfs_iext_destroy(ifp);
3971         } else if (ifp->if_flags & XFS_IFEXTIREC) {
3972                 xfs_iext_remove_indirect(ifp, idx, ext_diff);
3973         } else if (ifp->if_real_bytes) {
3974                 xfs_iext_remove_direct(ifp, idx, ext_diff);
3975         } else {
3976                 xfs_iext_remove_inline(ifp, idx, ext_diff);
3977         }
3978         ifp->if_bytes = new_size;
3979 }
3980
3981 /*
3982  * This removes ext_diff extents from the inline buffer, beginning
3983  * at extent index idx.
3984  */
3985 void
3986 xfs_iext_remove_inline(
3987         xfs_ifork_t     *ifp,           /* inode fork pointer */
3988         xfs_extnum_t    idx,            /* index to begin removing exts */
3989         int             ext_diff)       /* number of extents to remove */
3990 {
3991         int             nextents;       /* number of extents in file */
3992
3993         ASSERT(!(ifp->if_flags & XFS_IFEXTIREC));
3994         ASSERT(idx < XFS_INLINE_EXTS);
3995         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3996         ASSERT(((nextents - ext_diff) > 0) &&
3997                 (nextents - ext_diff) < XFS_INLINE_EXTS);
3998
3999         if (idx + ext_diff < nextents) {
4000                 memmove(&ifp->if_u2.if_inline_ext[idx],
4001                         &ifp->if_u2.if_inline_ext[idx + ext_diff],
4002                         (nextents - (idx + ext_diff)) *
4003                          sizeof(xfs_bmbt_rec_t));
4004                 memset(&ifp->if_u2.if_inline_ext[nextents - ext_diff],
4005                         0, ext_diff * sizeof(xfs_bmbt_rec_t));
4006         } else {
4007                 memset(&ifp->if_u2.if_inline_ext[idx], 0,
4008                         ext_diff * sizeof(xfs_bmbt_rec_t));
4009         }
4010 }
4011
4012 /*
4013  * This removes ext_diff extents from a linear (direct) extent list,
4014  * beginning at extent index idx. If the extents are being removed
4015  * from the end of the list (ie. truncate) then we just need to re-
4016  * allocate the list to remove the extra space. Otherwise, if the
4017  * extents are being removed from the middle of the existing extent
4018  * entries, then we first need to move the extent records beginning
4019  * at idx + ext_diff up in the list to overwrite the records being
4020  * removed, then remove the extra space via kmem_realloc.
4021  */
4022 void
4023 xfs_iext_remove_direct(
4024         xfs_ifork_t     *ifp,           /* inode fork pointer */
4025         xfs_extnum_t    idx,            /* index to begin removing exts */
4026         int             ext_diff)       /* number of extents to remove */
4027 {
4028         xfs_extnum_t    nextents;       /* number of extents in file */
4029         int             new_size;       /* size of extents after removal */
4030
4031         ASSERT(!(ifp->if_flags & XFS_IFEXTIREC));
4032         new_size = ifp->if_bytes -
4033                 (ext_diff * sizeof(xfs_bmbt_rec_t));
4034         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
4035
4036         if (new_size == 0) {
4037                 xfs_iext_destroy(ifp);
4038                 return;
4039         }
4040         /* Move extents up in the list (if needed) */
4041         if (idx + ext_diff < nextents) {
4042                 memmove(&ifp->if_u1.if_extents[idx],
4043                         &ifp->if_u1.if_extents[idx + ext_diff],
4044                         (nextents - (idx + ext_diff)) *
4045                          sizeof(xfs_bmbt_rec_t));
4046         }
4047         memset(&ifp->if_u1.if_extents[nextents - ext_diff],
4048                 0, ext_diff * sizeof(xfs_bmbt_rec_t));
4049         /*
4050          * Reallocate the direct extent list. If the extents
4051          * will fit inside the inode then xfs_iext_realloc_direct
4052          * will switch from direct to inline extent allocation
4053          * mode for us.
4054          */
4055         xfs_iext_realloc_direct(ifp, new_size);
4056         ifp->if_bytes = new_size;
4057 }
4058
4059 /*
4060  * This is called when incore extents are being removed from the
4061  * indirection array and the extents being removed span multiple extent
4062  * buffers. The idx parameter contains the file extent index where we
4063  * want to begin removing extents, and the count parameter contains
4064  * how many extents need to be removed.
4065  *
4066  *    |-------|   |-------|
4067  *    | nex1  |   |       |    nex1 - number of extents before idx
4068  *    |-------|   | count |
4069  *    |       |   |       |    count - number of extents being removed at idx
4070  *    | count |   |-------|
4071  *    |       |   | nex2  |    nex2 - number of extents after idx + count
4072  *    |-------|   |-------|
4073  */
4074 void
4075 xfs_iext_remove_indirect(
4076         xfs_ifork_t     *ifp,           /* inode fork pointer */
4077         xfs_extnum_t    idx,            /* index to begin removing extents */
4078         int             count)          /* number of extents to remove */
4079 {
4080         xfs_ext_irec_t  *erp;           /* indirection array pointer */
4081         int             erp_idx = 0;    /* indirection array index */
4082         xfs_extnum_t    ext_cnt;        /* extents left to remove */
4083         xfs_extnum_t    ext_diff;       /* extents to remove in current list */
4084         xfs_extnum_t    nex1;           /* number of extents before idx */
4085         xfs_extnum_t    nex2;           /* extents after idx + count */
4086         int             nlists;         /* entries in indirection array */
4087         int             page_idx = idx; /* index in target extent list */
4088
4089         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4090         erp = xfs_iext_idx_to_irec(ifp,  &page_idx, &erp_idx, 0);
4091         ASSERT(erp != NULL);
4092         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4093         nex1 = page_idx;
4094         ext_cnt = count;
4095         while (ext_cnt) {
4096                 nex2 = MAX((erp->er_extcount - (nex1 + ext_cnt)), 0);
4097                 ext_diff = MIN(ext_cnt, (erp->er_extcount - nex1));
4098                 /*
4099                  * Check for deletion of entire list;
4100                  * xfs_iext_irec_remove() updates extent offsets.
4101                  */
4102                 if (ext_diff == erp->er_extcount) {
4103                         xfs_iext_irec_remove(ifp, erp_idx);
4104                         ext_cnt -= ext_diff;
4105                         nex1 = 0;
4106                         if (ext_cnt) {
4107                                 ASSERT(erp_idx < ifp->if_real_bytes /
4108                                         XFS_IEXT_BUFSZ);
4109                                 erp = &ifp->if_u1.if_ext_irec[erp_idx];
4110                                 nex1 = 0;
4111                                 continue;
4112                         } else {
4113                                 break;
4114                         }
4115                 }
4116                 /* Move extents up (if needed) */
4117                 if (nex2) {
4118                         memmove(&erp->er_extbuf[nex1],
4119                                 &erp->er_extbuf[nex1 + ext_diff],
4120                                 nex2 * sizeof(xfs_bmbt_rec_t));
4121                 }
4122                 /* Zero out rest of page */
4123                 memset(&erp->er_extbuf[nex1 + nex2], 0, (XFS_IEXT_BUFSZ -
4124                         ((nex1 + nex2) * sizeof(xfs_bmbt_rec_t))));
4125                 /* Update remaining counters */
4126                 erp->er_extcount -= ext_diff;
4127                 xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, -ext_diff);
4128                 ext_cnt -= ext_diff;
4129                 nex1 = 0;
4130                 erp_idx++;
4131                 erp++;
4132         }
4133         ifp->if_bytes -= count * sizeof(xfs_bmbt_rec_t);
4134         xfs_iext_irec_compact(ifp);
4135 }
4136
4137 /*
4138  * Create, destroy, or resize a linear (direct) block of extents.
4139  */
4140 void
4141 xfs_iext_realloc_direct(
4142         xfs_ifork_t     *ifp,           /* inode fork pointer */
4143         int             new_size)       /* new size of extents */
4144 {
4145         int             rnew_size;      /* real new size of extents */
4146
4147         rnew_size = new_size;
4148
4149         ASSERT(!(ifp->if_flags & XFS_IFEXTIREC) ||
4150                 ((new_size >= 0) && (new_size <= XFS_IEXT_BUFSZ) &&
4151                  (new_size != ifp->if_real_bytes)));
4152
4153         /* Free extent records */
4154         if (new_size == 0) {
4155                 xfs_iext_destroy(ifp);
4156         }
4157         /* Resize direct extent list and zero any new bytes */
4158         else if (ifp->if_real_bytes) {
4159                 /* Check if extents will fit inside the inode */
4160                 if (new_size <= XFS_INLINE_EXTS * sizeof(xfs_bmbt_rec_t)) {
4161                         xfs_iext_direct_to_inline(ifp, new_size /
4162                                 (uint)sizeof(xfs_bmbt_rec_t));
4163                         ifp->if_bytes = new_size;
4164                         return;
4165                 }
4166                 if ((new_size & (new_size - 1)) != 0) {
4167                         rnew_size = xfs_iroundup(new_size);
4168                 }
4169                 if (rnew_size != ifp->if_real_bytes) {
4170                         ifp->if_u1.if_extents = (xfs_bmbt_rec_t *)
4171                                 kmem_realloc(ifp->if_u1.if_extents,
4172                                                 rnew_size,
4173                                                 ifp->if_real_bytes,
4174                                                 KM_SLEEP);
4175                 }
4176                 if (rnew_size > ifp->if_real_bytes) {
4177                         memset(&ifp->if_u1.if_extents[ifp->if_bytes /
4178                                 (uint)sizeof(xfs_bmbt_rec_t)], 0,
4179                                 rnew_size - ifp->if_real_bytes);
4180                 }
4181         }
4182         /*
4183          * Switch from the inline extent buffer to a direct
4184          * extent list. Be sure to include the inline extent
4185          * bytes in new_size.
4186          */
4187         else {
4188                 new_size += ifp->if_bytes;
4189                 if ((new_size & (new_size - 1)) != 0) {
4190                         rnew_size = xfs_iroundup(new_size);
4191                 }
4192                 xfs_iext_inline_to_direct(ifp, rnew_size);
4193         }
4194         ifp->if_real_bytes = rnew_size;
4195         ifp->if_bytes = new_size;
4196 }
4197
4198 /*
4199  * Switch from linear (direct) extent records to inline buffer.
4200  */
4201 void
4202 xfs_iext_direct_to_inline(
4203         xfs_ifork_t     *ifp,           /* inode fork pointer */
4204         xfs_extnum_t    nextents)       /* number of extents in file */
4205 {
4206         ASSERT(ifp->if_flags & XFS_IFEXTENTS);
4207         ASSERT(nextents <= XFS_INLINE_EXTS);
4208         /*
4209          * The inline buffer was zeroed when we switched
4210          * from inline to direct extent allocation mode,
4211          * so we don't need to clear it here.
4212          */
4213         memcpy(ifp->if_u2.if_inline_ext, ifp->if_u1.if_extents,
4214                 nextents * sizeof(xfs_bmbt_rec_t));
4215         kmem_free(ifp->if_u1.if_extents, ifp->if_real_bytes);
4216         ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext;
4217         ifp->if_real_bytes = 0;
4218 }
4219
4220 /*
4221  * Switch from inline buffer to linear (direct) extent records.
4222  * new_size should already be rounded up to the next power of 2
4223  * by the caller (when appropriate), so use new_size as it is.
4224  * However, since new_size may be rounded up, we can't update
4225  * if_bytes here. It is the caller's responsibility to update
4226  * if_bytes upon return.
4227  */
4228 void
4229 xfs_iext_inline_to_direct(
4230         xfs_ifork_t     *ifp,           /* inode fork pointer */
4231         int             new_size)       /* number of extents in file */
4232 {
4233         ifp->if_u1.if_extents = (xfs_bmbt_rec_t *)
4234                 kmem_alloc(new_size, KM_SLEEP);
4235         memset(ifp->if_u1.if_extents, 0, new_size);
4236         if (ifp->if_bytes) {
4237                 memcpy(ifp->if_u1.if_extents, ifp->if_u2.if_inline_ext,
4238                         ifp->if_bytes);
4239                 memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS *
4240                         sizeof(xfs_bmbt_rec_t));
4241         }
4242         ifp->if_real_bytes = new_size;
4243 }
4244
4245 /*
4246  * Resize an extent indirection array to new_size bytes.
4247  */
4248 void
4249 xfs_iext_realloc_indirect(
4250         xfs_ifork_t     *ifp,           /* inode fork pointer */
4251         int             new_size)       /* new indirection array size */
4252 {
4253         int             nlists;         /* number of irec's (ex lists) */
4254         int             size;           /* current indirection array size */
4255
4256         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4257         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4258         size = nlists * sizeof(xfs_ext_irec_t);
4259         ASSERT(ifp->if_real_bytes);
4260         ASSERT((new_size >= 0) && (new_size != size));
4261         if (new_size == 0) {
4262                 xfs_iext_destroy(ifp);
4263         } else {
4264                 ifp->if_u1.if_ext_irec = (xfs_ext_irec_t *)
4265                         kmem_realloc(ifp->if_u1.if_ext_irec,
4266                                 new_size, size, KM_SLEEP);
4267         }
4268 }
4269
4270 /*
4271  * Switch from indirection array to linear (direct) extent allocations.
4272  */
4273 void
4274 xfs_iext_indirect_to_direct(
4275          xfs_ifork_t    *ifp)           /* inode fork pointer */
4276 {
4277         xfs_bmbt_rec_t  *ep;            /* extent record pointer */
4278         xfs_extnum_t    nextents;       /* number of extents in file */
4279         int             size;           /* size of file extents */
4280
4281         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4282         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
4283         ASSERT(nextents <= XFS_LINEAR_EXTS);
4284         size = nextents * sizeof(xfs_bmbt_rec_t);
4285
4286         xfs_iext_irec_compact_full(ifp);
4287         ASSERT(ifp->if_real_bytes == XFS_IEXT_BUFSZ);
4288
4289         ep = ifp->if_u1.if_ext_irec->er_extbuf;
4290         kmem_free(ifp->if_u1.if_ext_irec, sizeof(xfs_ext_irec_t));
4291         ifp->if_flags &= ~XFS_IFEXTIREC;
4292         ifp->if_u1.if_extents = ep;
4293         ifp->if_bytes = size;
4294         if (nextents < XFS_LINEAR_EXTS) {
4295                 xfs_iext_realloc_direct(ifp, size);
4296         }
4297 }
4298
4299 /*
4300  * Free incore file extents.
4301  */
4302 void
4303 xfs_iext_destroy(
4304         xfs_ifork_t     *ifp)           /* inode fork pointer */
4305 {
4306         if (ifp->if_flags & XFS_IFEXTIREC) {
4307                 int     erp_idx;
4308                 int     nlists;
4309
4310                 nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4311                 for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) {
4312                         xfs_iext_irec_remove(ifp, erp_idx);
4313                 }
4314                 ifp->if_flags &= ~XFS_IFEXTIREC;
4315         } else if (ifp->if_real_bytes) {
4316                 kmem_free(ifp->if_u1.if_extents, ifp->if_real_bytes);
4317         } else if (ifp->if_bytes) {
4318                 memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS *
4319                         sizeof(xfs_bmbt_rec_t));
4320         }
4321         ifp->if_u1.if_extents = NULL;
4322         ifp->if_real_bytes = 0;
4323         ifp->if_bytes = 0;
4324 }
4325
4326 /*
4327  * Return a pointer to the extent record for file system block bno.
4328  */
4329 xfs_bmbt_rec_t *                        /* pointer to found extent record */
4330 xfs_iext_bno_to_ext(
4331         xfs_ifork_t     *ifp,           /* inode fork pointer */
4332         xfs_fileoff_t   bno,            /* block number to search for */
4333         xfs_extnum_t    *idxp)          /* index of target extent */
4334 {
4335         xfs_bmbt_rec_t  *base;          /* pointer to first extent */
4336         xfs_filblks_t   blockcount = 0; /* number of blocks in extent */
4337         xfs_bmbt_rec_t  *ep = NULL;     /* pointer to target extent */
4338         xfs_ext_irec_t  *erp = NULL;    /* indirection array pointer */
4339         int             high;           /* upper boundary in search */
4340         xfs_extnum_t    idx = 0;        /* index of target extent */
4341         int             low;            /* lower boundary in search */
4342         xfs_extnum_t    nextents;       /* number of file extents */
4343         xfs_fileoff_t   startoff = 0;   /* start offset of extent */
4344
4345         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
4346         if (nextents == 0) {
4347                 *idxp = 0;
4348                 return NULL;
4349         }
4350         low = 0;
4351         if (ifp->if_flags & XFS_IFEXTIREC) {
4352                 /* Find target extent list */
4353                 int     erp_idx = 0;
4354                 erp = xfs_iext_bno_to_irec(ifp, bno, &erp_idx);
4355                 base = erp->er_extbuf;
4356                 high = erp->er_extcount - 1;
4357         } else {
4358                 base = ifp->if_u1.if_extents;
4359                 high = nextents - 1;
4360         }
4361         /* Binary search extent records */
4362         while (low <= high) {
4363                 idx = (low + high) >> 1;
4364                 ep = base + idx;
4365                 startoff = xfs_bmbt_get_startoff(ep);
4366                 blockcount = xfs_bmbt_get_blockcount(ep);
4367                 if (bno < startoff) {
4368                         high = idx - 1;
4369                 } else if (bno >= startoff + blockcount) {
4370                         low = idx + 1;
4371                 } else {
4372                         /* Convert back to file-based extent index */
4373                         if (ifp->if_flags & XFS_IFEXTIREC) {
4374                                 idx += erp->er_extoff;
4375                         }
4376                         *idxp = idx;
4377                         return ep;
4378                 }
4379         }
4380         /* Convert back to file-based extent index */
4381         if (ifp->if_flags & XFS_IFEXTIREC) {
4382                 idx += erp->er_extoff;
4383         }
4384         if (bno >= startoff + blockcount) {
4385                 if (++idx == nextents) {
4386                         ep = NULL;
4387                 } else {
4388                         ep = xfs_iext_get_ext(ifp, idx);
4389                 }
4390         }
4391         *idxp = idx;
4392         return ep;
4393 }
4394
4395 /*
4396  * Return a pointer to the indirection array entry containing the
4397  * extent record for filesystem block bno. Store the index of the
4398  * target irec in *erp_idxp.
4399  */
4400 xfs_ext_irec_t *                        /* pointer to found extent record */
4401 xfs_iext_bno_to_irec(
4402         xfs_ifork_t     *ifp,           /* inode fork pointer */
4403         xfs_fileoff_t   bno,            /* block number to search for */
4404         int             *erp_idxp)      /* irec index of target ext list */
4405 {
4406         xfs_ext_irec_t  *erp = NULL;    /* indirection array pointer */
4407         xfs_ext_irec_t  *erp_next;      /* next indirection array entry */
4408         int             erp_idx;        /* indirection array index */
4409         int             nlists;         /* number of extent irec's (lists) */
4410         int             high;           /* binary search upper limit */
4411         int             low;            /* binary search lower limit */
4412
4413         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4414         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4415         erp_idx = 0;
4416         low = 0;
4417         high = nlists - 1;
4418         while (low <= high) {
4419                 erp_idx = (low + high) >> 1;
4420                 erp = &ifp->if_u1.if_ext_irec[erp_idx];
4421                 erp_next = erp_idx < nlists - 1 ? erp + 1 : NULL;
4422                 if (bno < xfs_bmbt_get_startoff(erp->er_extbuf)) {
4423                         high = erp_idx - 1;
4424                 } else if (erp_next && bno >=
4425                            xfs_bmbt_get_startoff(erp_next->er_extbuf)) {
4426                         low = erp_idx + 1;
4427                 } else {
4428                         break;
4429                 }
4430         }
4431         *erp_idxp = erp_idx;
4432         return erp;
4433 }
4434
4435 /*
4436  * Return a pointer to the indirection array entry containing the
4437  * extent record at file extent index *idxp. Store the index of the
4438  * target irec in *erp_idxp and store the page index of the target
4439  * extent record in *idxp.
4440  */
4441 xfs_ext_irec_t *
4442 xfs_iext_idx_to_irec(
4443         xfs_ifork_t     *ifp,           /* inode fork pointer */
4444         xfs_extnum_t    *idxp,          /* extent index (file -> page) */
4445         int             *erp_idxp,      /* pointer to target irec */
4446         int             realloc)        /* new bytes were just added */
4447 {
4448         xfs_ext_irec_t  *prev;          /* pointer to previous irec */
4449         xfs_ext_irec_t  *erp = NULL;    /* pointer to current irec */
4450         int             erp_idx;        /* indirection array index */
4451         int             nlists;         /* number of irec's (ex lists) */
4452         int             high;           /* binary search upper limit */
4453         int             low;            /* binary search lower limit */
4454         xfs_extnum_t    page_idx = *idxp; /* extent index in target list */
4455
4456         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4457         ASSERT(page_idx >= 0 && page_idx <=
4458                 ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t));
4459         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4460         erp_idx = 0;
4461         low = 0;
4462         high = nlists - 1;
4463
4464         /* Binary search extent irec's */
4465         while (low <= high) {
4466                 erp_idx = (low + high) >> 1;
4467                 erp = &ifp->if_u1.if_ext_irec[erp_idx];
4468                 prev = erp_idx > 0 ? erp - 1 : NULL;
4469                 if (page_idx < erp->er_extoff || (page_idx == erp->er_extoff &&
4470                      realloc && prev && prev->er_extcount < XFS_LINEAR_EXTS)) {
4471                         high = erp_idx - 1;
4472                 } else if (page_idx > erp->er_extoff + erp->er_extcount ||
4473                            (page_idx == erp->er_extoff + erp->er_extcount &&
4474                             !realloc)) {
4475                         low = erp_idx + 1;
4476                 } else if (page_idx == erp->er_extoff + erp->er_extcount &&
4477                            erp->er_extcount == XFS_LINEAR_EXTS) {
4478                         ASSERT(realloc);
4479                         page_idx = 0;
4480                         erp_idx++;
4481                         erp = erp_idx < nlists ? erp + 1 : NULL;
4482                         break;
4483                 } else {
4484                         page_idx -= erp->er_extoff;
4485                         break;
4486                 }
4487         }
4488         *idxp = page_idx;
4489         *erp_idxp = erp_idx;
4490         return(erp);
4491 }
4492
4493 /*
4494  * Allocate and initialize an indirection array once the space needed
4495  * for incore extents increases above XFS_IEXT_BUFSZ.
4496  */
4497 void
4498 xfs_iext_irec_init(
4499         xfs_ifork_t     *ifp)           /* inode fork pointer */
4500 {
4501         xfs_ext_irec_t  *erp;           /* indirection array pointer */
4502         xfs_extnum_t    nextents;       /* number of extents in file */
4503
4504         ASSERT(!(ifp->if_flags & XFS_IFEXTIREC));
4505         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
4506         ASSERT(nextents <= XFS_LINEAR_EXTS);
4507
4508         erp = (xfs_ext_irec_t *)
4509                 kmem_alloc(sizeof(xfs_ext_irec_t), KM_SLEEP);
4510
4511         if (nextents == 0) {
4512                 ifp->if_u1.if_extents = (xfs_bmbt_rec_t *)
4513                         kmem_alloc(XFS_IEXT_BUFSZ, KM_SLEEP);
4514         } else if (!ifp->if_real_bytes) {
4515                 xfs_iext_inline_to_direct(ifp, XFS_IEXT_BUFSZ);
4516         } else if (ifp->if_real_bytes < XFS_IEXT_BUFSZ) {
4517                 xfs_iext_realloc_direct(ifp, XFS_IEXT_BUFSZ);
4518         }
4519         erp->er_extbuf = ifp->if_u1.if_extents;
4520         erp->er_extcount = nextents;
4521         erp->er_extoff = 0;
4522
4523         ifp->if_flags |= XFS_IFEXTIREC;
4524         ifp->if_real_bytes = XFS_IEXT_BUFSZ;
4525         ifp->if_bytes = nextents * sizeof(xfs_bmbt_rec_t);
4526         ifp->if_u1.if_ext_irec = erp;
4527
4528         return;
4529 }
4530
4531 /*
4532  * Allocate and initialize a new entry in the indirection array.
4533  */
4534 xfs_ext_irec_t *
4535 xfs_iext_irec_new(
4536         xfs_ifork_t     *ifp,           /* inode fork pointer */
4537         int             erp_idx)        /* index for new irec */
4538 {
4539         xfs_ext_irec_t  *erp;           /* indirection array pointer */
4540         int             i;              /* loop counter */
4541         int             nlists;         /* number of irec's (ex lists) */
4542
4543         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4544         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4545
4546         /* Resize indirection array */
4547         xfs_iext_realloc_indirect(ifp, ++nlists *
4548                                   sizeof(xfs_ext_irec_t));
4549         /*
4550          * Move records down in the array so the
4551          * new page can use erp_idx.
4552          */
4553         erp = ifp->if_u1.if_ext_irec;
4554         for (i = nlists - 1; i > erp_idx; i--) {
4555                 memmove(&erp[i], &erp[i-1], sizeof(xfs_ext_irec_t));
4556         }
4557         ASSERT(i == erp_idx);
4558
4559         /* Initialize new extent record */
4560         erp = ifp->if_u1.if_ext_irec;
4561         erp[erp_idx].er_extbuf = (xfs_bmbt_rec_t *)
4562                 kmem_alloc(XFS_IEXT_BUFSZ, KM_SLEEP);
4563         ifp->if_real_bytes = nlists * XFS_IEXT_BUFSZ;
4564         memset(erp[erp_idx].er_extbuf, 0, XFS_IEXT_BUFSZ);
4565         erp[erp_idx].er_extcount = 0;
4566         erp[erp_idx].er_extoff = erp_idx > 0 ?
4567                 erp[erp_idx-1].er_extoff + erp[erp_idx-1].er_extcount : 0;
4568         return (&erp[erp_idx]);
4569 }
4570
4571 /*
4572  * Remove a record from the indirection array.
4573  */
4574 void
4575 xfs_iext_irec_remove(
4576         xfs_ifork_t     *ifp,           /* inode fork pointer */
4577         int             erp_idx)        /* irec index to remove */
4578 {
4579         xfs_ext_irec_t  *erp;           /* indirection array pointer */
4580         int             i;              /* loop counter */
4581         int             nlists;         /* number of irec's (ex lists) */
4582
4583         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4584         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4585         erp = &ifp->if_u1.if_ext_irec[erp_idx];
4586         if (erp->er_extbuf) {
4587                 xfs_iext_irec_update_extoffs(ifp, erp_idx + 1,
4588                         -erp->er_extcount);
4589                 kmem_free(erp->er_extbuf, XFS_IEXT_BUFSZ);
4590         }
4591         /* Compact extent records */
4592         erp = ifp->if_u1.if_ext_irec;
4593         for (i = erp_idx; i < nlists - 1; i++) {
4594                 memmove(&erp[i], &erp[i+1], sizeof(xfs_ext_irec_t));
4595         }
4596         /*
4597          * Manually free the last extent record from the indirection
4598          * array.  A call to xfs_iext_realloc_indirect() with a size
4599          * of zero would result in a call to xfs_iext_destroy() which
4600          * would in turn call this function again, creating a nasty
4601          * infinite loop.
4602          */
4603         if (--nlists) {
4604                 xfs_iext_realloc_indirect(ifp,
4605                         nlists * sizeof(xfs_ext_irec_t));
4606         } else {
4607                 kmem_free(ifp->if_u1.if_ext_irec,
4608                         sizeof(xfs_ext_irec_t));
4609         }
4610         ifp->if_real_bytes = nlists * XFS_IEXT_BUFSZ;
4611 }
4612
4613 /*
4614  * This is called to clean up large amounts of unused memory allocated
4615  * by the indirection array.  Before compacting anything though, verify
4616  * that the indirection array is still needed and switch back to the
4617  * linear extent list (or even the inline buffer) if possible.  The
4618  * compaction policy is as follows:
4619  *
4620  *    Full Compaction: Extents fit into a single page (or inline buffer)
4621  *    Full Compaction: Extents occupy less than 10% of allocated space
4622  * Partial Compaction: Extents occupy > 10% and < 50% of allocated space
4623  *      No Compaction: Extents occupy at least 50% of allocated space
4624  */
4625 void
4626 xfs_iext_irec_compact(
4627         xfs_ifork_t     *ifp)           /* inode fork pointer */
4628 {
4629         xfs_extnum_t    nextents;       /* number of extents in file */
4630         int             nlists;         /* number of irec's (ex lists) */
4631
4632         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4633         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4634         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
4635
4636         if (nextents == 0) {
4637                 xfs_iext_destroy(ifp);
4638         } else if (nextents <= XFS_INLINE_EXTS) {
4639                 xfs_iext_indirect_to_direct(ifp);
4640                 xfs_iext_direct_to_inline(ifp, nextents);
4641         } else if (nextents <= XFS_LINEAR_EXTS) {
4642                 xfs_iext_indirect_to_direct(ifp);
4643         } else if (nextents < (nlists * XFS_LINEAR_EXTS) >> 3) {
4644                 xfs_iext_irec_compact_full(ifp);
4645         } else if (nextents < (nlists * XFS_LINEAR_EXTS) >> 1) {
4646                 xfs_iext_irec_compact_pages(ifp);
4647         }
4648 }
4649
4650 /*
4651  * Combine extents from neighboring extent pages.
4652  */
4653 void
4654 xfs_iext_irec_compact_pages(
4655         xfs_ifork_t     *ifp)           /* inode fork pointer */
4656 {
4657         xfs_ext_irec_t  *erp, *erp_next;/* pointers to irec entries */
4658         int             erp_idx = 0;    /* indirection array index */
4659         int             nlists;         /* number of irec's (ex lists) */
4660
4661         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4662         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4663         while (erp_idx < nlists - 1) {
4664                 erp = &ifp->if_u1.if_ext_irec[erp_idx];
4665                 erp_next = erp + 1;
4666                 if (erp_next->er_extcount <=
4667                     (XFS_LINEAR_EXTS - erp->er_extcount)) {
4668                         memmove(&erp->er_extbuf[erp->er_extcount],
4669                                 erp_next->er_extbuf, erp_next->er_extcount *
4670                                 sizeof(xfs_bmbt_rec_t));
4671                         erp->er_extcount += erp_next->er_extcount;
4672                         /*
4673                          * Free page before removing extent record
4674                          * so er_extoffs don't get modified in
4675                          * xfs_iext_irec_remove.
4676                          */
4677                         kmem_free(erp_next->er_extbuf, XFS_IEXT_BUFSZ);
4678                         erp_next->er_extbuf = NULL;
4679                         xfs_iext_irec_remove(ifp, erp_idx + 1);
4680                         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4681                 } else {
4682                         erp_idx++;
4683                 }
4684         }
4685 }
4686
4687 /*
4688  * Fully compact the extent records managed by the indirection array.
4689  */
4690 void
4691 xfs_iext_irec_compact_full(
4692         xfs_ifork_t     *ifp)                   /* inode fork pointer */
4693 {
4694         xfs_bmbt_rec_t  *ep, *ep_next;          /* extent record pointers */
4695         xfs_ext_irec_t  *erp, *erp_next;        /* extent irec pointers */
4696         int             erp_idx = 0;            /* extent irec index */
4697         int             ext_avail;              /* empty entries in ex list */
4698         int             ext_diff;               /* number of exts to add */
4699         int             nlists;                 /* number of irec's (ex lists) */
4700
4701         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4702         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4703         erp = ifp->if_u1.if_ext_irec;
4704         ep = &erp->er_extbuf[erp->er_extcount];
4705         erp_next = erp + 1;
4706         ep_next = erp_next->er_extbuf;
4707         while (erp_idx < nlists - 1) {
4708                 ext_avail = XFS_LINEAR_EXTS - erp->er_extcount;
4709                 ext_diff = MIN(ext_avail, erp_next->er_extcount);
4710                 memcpy(ep, ep_next, ext_diff * sizeof(xfs_bmbt_rec_t));
4711                 erp->er_extcount += ext_diff;
4712                 erp_next->er_extcount -= ext_diff;
4713                 /* Remove next page */
4714                 if (erp_next->er_extcount == 0) {
4715                         /*
4716                          * Free page before removing extent record
4717                          * so er_extoffs don't get modified in
4718                          * xfs_iext_irec_remove.
4719                          */
4720                         kmem_free(erp_next->er_extbuf,
4721                                 erp_next->er_extcount * sizeof(xfs_bmbt_rec_t));
4722                         erp_next->er_extbuf = NULL;
4723                         xfs_iext_irec_remove(ifp, erp_idx + 1);
4724                         erp = &ifp->if_u1.if_ext_irec[erp_idx];
4725                         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4726                 /* Update next page */
4727                 } else {
4728                         /* Move rest of page up to become next new page */
4729                         memmove(erp_next->er_extbuf, ep_next,
4730                                 erp_next->er_extcount * sizeof(xfs_bmbt_rec_t));
4731                         ep_next = erp_next->er_extbuf;
4732                         memset(&ep_next[erp_next->er_extcount], 0,
4733                                 (XFS_LINEAR_EXTS - erp_next->er_extcount) *
4734                                 sizeof(xfs_bmbt_rec_t));
4735                 }
4736                 if (erp->er_extcount == XFS_LINEAR_EXTS) {
4737                         erp_idx++;
4738                         if (erp_idx < nlists)
4739                                 erp = &ifp->if_u1.if_ext_irec[erp_idx];
4740                         else
4741                                 break;
4742                 }
4743                 ep = &erp->er_extbuf[erp->er_extcount];
4744                 erp_next = erp + 1;
4745                 ep_next = erp_next->er_extbuf;
4746         }
4747 }
4748
4749 /*
4750  * This is called to update the er_extoff field in the indirection
4751  * array when extents have been added or removed from one of the
4752  * extent lists. erp_idx contains the irec index to begin updating
4753  * at and ext_diff contains the number of extents that were added
4754  * or removed.
4755  */
4756 void
4757 xfs_iext_irec_update_extoffs(
4758         xfs_ifork_t     *ifp,           /* inode fork pointer */
4759         int             erp_idx,        /* irec index to update */
4760         int             ext_diff)       /* number of new extents */
4761 {
4762         int             i;              /* loop counter */
4763         int             nlists;         /* number of irec's (ex lists */
4764
4765         ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4766         nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4767         for (i = erp_idx; i < nlists; i++) {
4768                 ifp->if_u1.if_ext_irec[i].er_extoff += ext_diff;
4769         }
4770 }