1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include "xfs.h"
19#include "xfs_fs.h"
20#include "xfs_shared.h"
21#include "xfs_format.h"
22#include "xfs_log_format.h"
23#include "xfs_trans_resv.h"
24#include "xfs_mount.h"
25#include "xfs_defer.h"
26#include "xfs_inode.h"
27#include "xfs_errortag.h"
28#include "xfs_error.h"
29#include "xfs_cksum.h"
30#include "xfs_icache.h"
31#include "xfs_trans.h"
32#include "xfs_ialloc.h"
33#include "xfs_dir2.h"
34
35
36
37
38
39#if defined(DEBUG)
40void
41xfs_inobp_check(
42 xfs_mount_t *mp,
43 xfs_buf_t *bp)
44{
45 int i;
46 int j;
47 xfs_dinode_t *dip;
48
49 j = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog;
50
51 for (i = 0; i < j; i++) {
52 dip = xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize);
53 if (!dip->di_next_unlinked) {
54 xfs_alert(mp,
55 "Detected bogus zero next_unlinked field in inode %d buffer 0x%llx.",
56 i, (long long)bp->b_bn);
57 }
58 }
59}
60#endif
61
62bool
63xfs_dinode_good_version(
64 struct xfs_mount *mp,
65 __u8 version)
66{
67 if (xfs_sb_version_hascrc(&mp->m_sb))
68 return version == 3;
69
70 return version == 1 || version == 2;
71}
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88static void
89xfs_inode_buf_verify(
90 struct xfs_buf *bp,
91 bool readahead)
92{
93 struct xfs_mount *mp = bp->b_target->bt_mount;
94 int i;
95 int ni;
96
97
98
99
100 ni = XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock;
101 for (i = 0; i < ni; i++) {
102 int di_ok;
103 xfs_dinode_t *dip;
104
105 dip = xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog));
106 di_ok = dip->di_magic == cpu_to_be16(XFS_DINODE_MAGIC) &&
107 xfs_dinode_good_version(mp, dip->di_version);
108 if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
109 XFS_ERRTAG_ITOBP_INOTOBP))) {
110 if (readahead) {
111 bp->b_flags &= ~XBF_DONE;
112 xfs_buf_ioerror(bp, -EIO);
113 return;
114 }
115
116 xfs_buf_ioerror(bp, -EFSCORRUPTED);
117 xfs_verifier_error(bp);
118#ifdef DEBUG
119 xfs_alert(mp,
120 "bad inode magic/vsn daddr %lld #%d (magic=%x)",
121 (unsigned long long)bp->b_bn, i,
122 be16_to_cpu(dip->di_magic));
123#endif
124 }
125 }
126 xfs_inobp_check(mp, bp);
127}
128
129
130static void
131xfs_inode_buf_read_verify(
132 struct xfs_buf *bp)
133{
134 xfs_inode_buf_verify(bp, false);
135}
136
137static void
138xfs_inode_buf_readahead_verify(
139 struct xfs_buf *bp)
140{
141 xfs_inode_buf_verify(bp, true);
142}
143
144static void
145xfs_inode_buf_write_verify(
146 struct xfs_buf *bp)
147{
148 xfs_inode_buf_verify(bp, false);
149}
150
151const struct xfs_buf_ops xfs_inode_buf_ops = {
152 .name = "xfs_inode",
153 .verify_read = xfs_inode_buf_read_verify,
154 .verify_write = xfs_inode_buf_write_verify,
155};
156
157const struct xfs_buf_ops xfs_inode_buf_ra_ops = {
158 .name = "xxfs_inode_ra",
159 .verify_read = xfs_inode_buf_readahead_verify,
160 .verify_write = xfs_inode_buf_write_verify,
161};
162
163
164
165
166
167
168
169
170
171
172
173int
174xfs_imap_to_bp(
175 struct xfs_mount *mp,
176 struct xfs_trans *tp,
177 struct xfs_imap *imap,
178 struct xfs_dinode **dipp,
179 struct xfs_buf **bpp,
180 uint buf_flags,
181 uint iget_flags)
182{
183 struct xfs_buf *bp;
184 int error;
185
186 buf_flags |= XBF_UNMAPPED;
187 error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno,
188 (int)imap->im_len, buf_flags, &bp,
189 &xfs_inode_buf_ops);
190 if (error) {
191 if (error == -EAGAIN) {
192 ASSERT(buf_flags & XBF_TRYLOCK);
193 return error;
194 }
195
196 if (error == -EFSCORRUPTED &&
197 (iget_flags & XFS_IGET_UNTRUSTED))
198 return -EINVAL;
199
200 xfs_warn(mp, "%s: xfs_trans_read_buf() returned error %d.",
201 __func__, error);
202 return error;
203 }
204
205 *bpp = bp;
206 *dipp = xfs_buf_offset(bp, imap->im_boffset);
207 return 0;
208}
209
210void
211xfs_inode_from_disk(
212 struct xfs_inode *ip,
213 struct xfs_dinode *from)
214{
215 struct xfs_icdinode *to = &ip->i_d;
216 struct inode *inode = VFS_I(ip);
217
218
219
220
221
222
223 to->di_version = from->di_version;
224 if (to->di_version == 1) {
225 set_nlink(inode, be16_to_cpu(from->di_onlink));
226 to->di_projid_lo = 0;
227 to->di_projid_hi = 0;
228 to->di_version = 2;
229 } else {
230 set_nlink(inode, be32_to_cpu(from->di_nlink));
231 to->di_projid_lo = be16_to_cpu(from->di_projid_lo);
232 to->di_projid_hi = be16_to_cpu(from->di_projid_hi);
233 }
234
235 to->di_format = from->di_format;
236 to->di_uid = be32_to_cpu(from->di_uid);
237 to->di_gid = be32_to_cpu(from->di_gid);
238 to->di_flushiter = be16_to_cpu(from->di_flushiter);
239
240
241
242
243
244
245
246 inode->i_atime.tv_sec = (int)be32_to_cpu(from->di_atime.t_sec);
247 inode->i_atime.tv_nsec = (int)be32_to_cpu(from->di_atime.t_nsec);
248 inode->i_mtime.tv_sec = (int)be32_to_cpu(from->di_mtime.t_sec);
249 inode->i_mtime.tv_nsec = (int)be32_to_cpu(from->di_mtime.t_nsec);
250 inode->i_ctime.tv_sec = (int)be32_to_cpu(from->di_ctime.t_sec);
251 inode->i_ctime.tv_nsec = (int)be32_to_cpu(from->di_ctime.t_nsec);
252 inode->i_generation = be32_to_cpu(from->di_gen);
253 inode->i_mode = be16_to_cpu(from->di_mode);
254
255 to->di_size = be64_to_cpu(from->di_size);
256 to->di_nblocks = be64_to_cpu(from->di_nblocks);
257 to->di_extsize = be32_to_cpu(from->di_extsize);
258 to->di_nextents = be32_to_cpu(from->di_nextents);
259 to->di_anextents = be16_to_cpu(from->di_anextents);
260 to->di_forkoff = from->di_forkoff;
261 to->di_aformat = from->di_aformat;
262 to->di_dmevmask = be32_to_cpu(from->di_dmevmask);
263 to->di_dmstate = be16_to_cpu(from->di_dmstate);
264 to->di_flags = be16_to_cpu(from->di_flags);
265
266 if (to->di_version == 3) {
267 inode->i_version = be64_to_cpu(from->di_changecount);
268 to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec);
269 to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec);
270 to->di_flags2 = be64_to_cpu(from->di_flags2);
271 }
272}
273
274void
275xfs_inode_to_disk(
276 struct xfs_inode *ip,
277 struct xfs_dinode *to,
278 xfs_lsn_t lsn)
279{
280 struct xfs_icdinode *from = &ip->i_d;
281 struct inode *inode = VFS_I(ip);
282
283 to->di_magic = cpu_to_be16(XFS_DINODE_MAGIC);
284 to->di_onlink = 0;
285
286 to->di_version = from->di_version;
287 to->di_format = from->di_format;
288 to->di_uid = cpu_to_be32(from->di_uid);
289 to->di_gid = cpu_to_be32(from->di_gid);
290 to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
291 to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
292
293 memset(to->di_pad, 0, sizeof(to->di_pad));
294 to->di_atime.t_sec = cpu_to_be32(inode->i_atime.tv_sec);
295 to->di_atime.t_nsec = cpu_to_be32(inode->i_atime.tv_nsec);
296 to->di_mtime.t_sec = cpu_to_be32(inode->i_mtime.tv_sec);
297 to->di_mtime.t_nsec = cpu_to_be32(inode->i_mtime.tv_nsec);
298 to->di_ctime.t_sec = cpu_to_be32(inode->i_ctime.tv_sec);
299 to->di_ctime.t_nsec = cpu_to_be32(inode->i_ctime.tv_nsec);
300 to->di_nlink = cpu_to_be32(inode->i_nlink);
301 to->di_gen = cpu_to_be32(inode->i_generation);
302 to->di_mode = cpu_to_be16(inode->i_mode);
303
304 to->di_size = cpu_to_be64(from->di_size);
305 to->di_nblocks = cpu_to_be64(from->di_nblocks);
306 to->di_extsize = cpu_to_be32(from->di_extsize);
307 to->di_nextents = cpu_to_be32(from->di_nextents);
308 to->di_anextents = cpu_to_be16(from->di_anextents);
309 to->di_forkoff = from->di_forkoff;
310 to->di_aformat = from->di_aformat;
311 to->di_dmevmask = cpu_to_be32(from->di_dmevmask);
312 to->di_dmstate = cpu_to_be16(from->di_dmstate);
313 to->di_flags = cpu_to_be16(from->di_flags);
314
315 if (from->di_version == 3) {
316 to->di_changecount = cpu_to_be64(inode->i_version);
317 to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec);
318 to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec);
319 to->di_flags2 = cpu_to_be64(from->di_flags2);
320
321 to->di_ino = cpu_to_be64(ip->i_ino);
322 to->di_lsn = cpu_to_be64(lsn);
323 memset(to->di_pad2, 0, sizeof(to->di_pad2));
324 uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid);
325 to->di_flushiter = 0;
326 } else {
327 to->di_flushiter = cpu_to_be16(from->di_flushiter);
328 }
329}
330
331void
332xfs_log_dinode_to_disk(
333 struct xfs_log_dinode *from,
334 struct xfs_dinode *to)
335{
336 to->di_magic = cpu_to_be16(from->di_magic);
337 to->di_mode = cpu_to_be16(from->di_mode);
338 to->di_version = from->di_version;
339 to->di_format = from->di_format;
340 to->di_onlink = 0;
341 to->di_uid = cpu_to_be32(from->di_uid);
342 to->di_gid = cpu_to_be32(from->di_gid);
343 to->di_nlink = cpu_to_be32(from->di_nlink);
344 to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
345 to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
346 memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
347
348 to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec);
349 to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec);
350 to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec);
351 to->di_mtime.t_nsec = cpu_to_be32(from->di_mtime.t_nsec);
352 to->di_ctime.t_sec = cpu_to_be32(from->di_ctime.t_sec);
353 to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec);
354
355 to->di_size = cpu_to_be64(from->di_size);
356 to->di_nblocks = cpu_to_be64(from->di_nblocks);
357 to->di_extsize = cpu_to_be32(from->di_extsize);
358 to->di_nextents = cpu_to_be32(from->di_nextents);
359 to->di_anextents = cpu_to_be16(from->di_anextents);
360 to->di_forkoff = from->di_forkoff;
361 to->di_aformat = from->di_aformat;
362 to->di_dmevmask = cpu_to_be32(from->di_dmevmask);
363 to->di_dmstate = cpu_to_be16(from->di_dmstate);
364 to->di_flags = cpu_to_be16(from->di_flags);
365 to->di_gen = cpu_to_be32(from->di_gen);
366
367 if (from->di_version == 3) {
368 to->di_changecount = cpu_to_be64(from->di_changecount);
369 to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec);
370 to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec);
371 to->di_flags2 = cpu_to_be64(from->di_flags2);
372 to->di_ino = cpu_to_be64(from->di_ino);
373 to->di_lsn = cpu_to_be64(from->di_lsn);
374 memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2));
375 uuid_copy(&to->di_uuid, &from->di_uuid);
376 to->di_flushiter = 0;
377 } else {
378 to->di_flushiter = cpu_to_be16(from->di_flushiter);
379 }
380}
381
382bool
383xfs_dinode_verify(
384 struct xfs_mount *mp,
385 xfs_ino_t ino,
386 struct xfs_dinode *dip)
387{
388 uint16_t mode;
389 uint16_t flags;
390 uint64_t di_size;
391
392 if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC))
393 return false;
394
395
396 di_size = be64_to_cpu(dip->di_size);
397 if (di_size & (1ULL << 63))
398 return false;
399
400 mode = be16_to_cpu(dip->di_mode);
401 if (mode && xfs_mode_to_ftype(mode) == XFS_DIR3_FT_UNKNOWN)
402 return false;
403
404
405 if ((S_ISLNK(mode) || S_ISDIR(mode)) && di_size == 0)
406 return false;
407
408
409 if (mode &&
410 be32_to_cpu(dip->di_nextents) + be16_to_cpu(dip->di_anextents) >
411 be64_to_cpu(dip->di_nblocks))
412 return false;
413
414 if (mode && XFS_DFORK_BOFF(dip) > mp->m_sb.sb_inodesize)
415 return false;
416
417 flags = be16_to_cpu(dip->di_flags);
418
419 if (mode && (flags & XFS_DIFLAG_REALTIME) && !mp->m_rtdev_targp)
420 return false;
421
422
423 switch (mode & S_IFMT) {
424 case S_IFIFO:
425 case S_IFCHR:
426 case S_IFBLK:
427 case S_IFSOCK:
428 if (dip->di_format != XFS_DINODE_FMT_DEV)
429 return false;
430 break;
431 case S_IFREG:
432 case S_IFLNK:
433 case S_IFDIR:
434 switch (dip->di_format) {
435 case XFS_DINODE_FMT_LOCAL:
436
437
438
439 if (S_ISREG(mode))
440 return false;
441 if (di_size > XFS_DFORK_DSIZE(dip, mp))
442 return false;
443 if (dip->di_nextents)
444 return false;
445
446 case XFS_DINODE_FMT_EXTENTS:
447 case XFS_DINODE_FMT_BTREE:
448 break;
449 default:
450 return false;
451 }
452 break;
453 case 0:
454
455 break;
456 default:
457 return false;
458 }
459
460 if (XFS_DFORK_Q(dip)) {
461 switch (dip->di_aformat) {
462 case XFS_DINODE_FMT_LOCAL:
463 if (dip->di_anextents)
464 return false;
465
466 case XFS_DINODE_FMT_EXTENTS:
467 case XFS_DINODE_FMT_BTREE:
468 break;
469 default:
470 return false;
471 }
472 } else {
473
474
475
476
477
478
479 switch (dip->di_aformat) {
480 case 0:
481 case XFS_DINODE_FMT_EXTENTS:
482 break;
483 default:
484 return false;
485 }
486 if (dip->di_anextents)
487 return false;
488 }
489
490 if (dip->di_version < 3)
491 return true;
492
493 if (!xfs_sb_version_hascrc(&mp->m_sb))
494 return false;
495 if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize,
496 XFS_DINODE_CRC_OFF))
497 return false;
498 if (be64_to_cpu(dip->di_ino) != ino)
499 return false;
500 if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_meta_uuid))
501 return false;
502 return true;
503}
504
505void
506xfs_dinode_calc_crc(
507 struct xfs_mount *mp,
508 struct xfs_dinode *dip)
509{
510 uint32_t crc;
511
512 if (dip->di_version < 3)
513 return;
514
515 ASSERT(xfs_sb_version_hascrc(&mp->m_sb));
516 crc = xfs_start_cksum_update((char *)dip, mp->m_sb.sb_inodesize,
517 XFS_DINODE_CRC_OFF);
518 dip->di_crc = xfs_end_cksum(crc);
519}
520
521
522
523
524
525
526
527
528
529
530
531
532
533int
534xfs_iread(
535 xfs_mount_t *mp,
536 xfs_trans_t *tp,
537 xfs_inode_t *ip,
538 uint iget_flags)
539{
540 xfs_buf_t *bp;
541 xfs_dinode_t *dip;
542 int error;
543
544
545
546
547 error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags);
548 if (error)
549 return error;
550
551
552 if ((iget_flags & XFS_IGET_CREATE) &&
553 xfs_sb_version_hascrc(&mp->m_sb) &&
554 !(mp->m_flags & XFS_MOUNT_IKEEP)) {
555
556 memset(&ip->i_d, 0, sizeof(ip->i_d));
557 VFS_I(ip)->i_generation = prandom_u32();
558 if (xfs_sb_version_hascrc(&mp->m_sb))
559 ip->i_d.di_version = 3;
560 else
561 ip->i_d.di_version = 2;
562 return 0;
563 }
564
565
566
567
568 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0, iget_flags);
569 if (error)
570 return error;
571
572
573 if (!xfs_dinode_verify(mp, ip->i_ino, dip)) {
574 xfs_alert(mp, "%s: validation failed for inode %lld",
575 __func__, ip->i_ino);
576
577 XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip);
578 error = -EFSCORRUPTED;
579 goto out_brelse;
580 }
581
582
583
584
585
586
587
588
589 if (dip->di_mode) {
590 xfs_inode_from_disk(ip, dip);
591 error = xfs_iformat_fork(ip, dip);
592 if (error) {
593#ifdef DEBUG
594 xfs_alert(mp, "%s: xfs_iformat() returned error %d",
595 __func__, error);
596#endif
597 goto out_brelse;
598 }
599 } else {
600
601
602
603
604 ip->i_d.di_version = dip->di_version;
605 VFS_I(ip)->i_generation = be32_to_cpu(dip->di_gen);
606 ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter);
607
608
609
610
611
612
613
614
615 VFS_I(ip)->i_mode = 0;
616 }
617
618 ASSERT(ip->i_d.di_version >= 2);
619 ip->i_delayed_blks = 0;
620
621
622
623
624
625
626 xfs_buf_set_ref(bp, XFS_INO_REF);
627
628
629
630
631
632
633
634
635
636
637
638
639
640 out_brelse:
641 xfs_trans_brelse(tp, bp);
642 return error;
643}
644