1
2
3
4
5
6#include "xfs.h"
7#include "xfs_fs.h"
8#include "xfs_shared.h"
9#include "xfs_format.h"
10#include "xfs_log_format.h"
11#include "xfs_trans_resv.h"
12#include "xfs_bit.h"
13#include "xfs_sb.h"
14#include "xfs_mount.h"
15#include "xfs_defer.h"
16#include "xfs_da_format.h"
17#include "xfs_da_btree.h"
18#include "xfs_inode.h"
19#include "xfs_dir2.h"
20#include "xfs_ialloc.h"
21#include "xfs_alloc.h"
22#include "xfs_rtalloc.h"
23#include "xfs_bmap.h"
24#include "xfs_trans.h"
25#include "xfs_trans_priv.h"
26#include "xfs_log.h"
27#include "xfs_error.h"
28#include "xfs_quota.h"
29#include "xfs_fsops.h"
30#include "xfs_trace.h"
31#include "xfs_icache.h"
32#include "xfs_sysfs.h"
33#include "xfs_rmap_btree.h"
34#include "xfs_refcount_btree.h"
35#include "xfs_reflink.h"
36#include "xfs_extent_busy.h"
37
38
39static DEFINE_MUTEX(xfs_uuid_table_mutex);
40static int xfs_uuid_table_size;
41static uuid_t *xfs_uuid_table;
42
43void
44xfs_uuid_table_free(void)
45{
46 if (xfs_uuid_table_size == 0)
47 return;
48 kmem_free(xfs_uuid_table);
49 xfs_uuid_table = NULL;
50 xfs_uuid_table_size = 0;
51}
52
53
54
55
56
57STATIC int
58xfs_uuid_mount(
59 struct xfs_mount *mp)
60{
61 uuid_t *uuid = &mp->m_sb.sb_uuid;
62 int hole, i;
63
64
65 uuid_copy(&mp->m_super->s_uuid, uuid);
66
67 if (mp->m_flags & XFS_MOUNT_NOUUID)
68 return 0;
69
70 if (uuid_is_null(uuid)) {
71 xfs_warn(mp, "Filesystem has null UUID - can't mount");
72 return -EINVAL;
73 }
74
75 mutex_lock(&xfs_uuid_table_mutex);
76 for (i = 0, hole = -1; i < xfs_uuid_table_size; i++) {
77 if (uuid_is_null(&xfs_uuid_table[i])) {
78 hole = i;
79 continue;
80 }
81 if (uuid_equal(uuid, &xfs_uuid_table[i]))
82 goto out_duplicate;
83 }
84
85 if (hole < 0) {
86 xfs_uuid_table = kmem_realloc(xfs_uuid_table,
87 (xfs_uuid_table_size + 1) * sizeof(*xfs_uuid_table),
88 KM_SLEEP);
89 hole = xfs_uuid_table_size++;
90 }
91 xfs_uuid_table[hole] = *uuid;
92 mutex_unlock(&xfs_uuid_table_mutex);
93
94 return 0;
95
96 out_duplicate:
97 mutex_unlock(&xfs_uuid_table_mutex);
98 xfs_warn(mp, "Filesystem has duplicate UUID %pU - can't mount", uuid);
99 return -EINVAL;
100}
101
102STATIC void
103xfs_uuid_unmount(
104 struct xfs_mount *mp)
105{
106 uuid_t *uuid = &mp->m_sb.sb_uuid;
107 int i;
108
109 if (mp->m_flags & XFS_MOUNT_NOUUID)
110 return;
111
112 mutex_lock(&xfs_uuid_table_mutex);
113 for (i = 0; i < xfs_uuid_table_size; i++) {
114 if (uuid_is_null(&xfs_uuid_table[i]))
115 continue;
116 if (!uuid_equal(uuid, &xfs_uuid_table[i]))
117 continue;
118 memset(&xfs_uuid_table[i], 0, sizeof(uuid_t));
119 break;
120 }
121 ASSERT(i < xfs_uuid_table_size);
122 mutex_unlock(&xfs_uuid_table_mutex);
123}
124
125
126STATIC void
127__xfs_free_perag(
128 struct rcu_head *head)
129{
130 struct xfs_perag *pag = container_of(head, struct xfs_perag, rcu_head);
131
132 ASSERT(atomic_read(&pag->pag_ref) == 0);
133 kmem_free(pag);
134}
135
136
137
138
139STATIC void
140xfs_free_perag(
141 xfs_mount_t *mp)
142{
143 xfs_agnumber_t agno;
144 struct xfs_perag *pag;
145
146 for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
147 spin_lock(&mp->m_perag_lock);
148 pag = radix_tree_delete(&mp->m_perag_tree, agno);
149 spin_unlock(&mp->m_perag_lock);
150 ASSERT(pag);
151 ASSERT(atomic_read(&pag->pag_ref) == 0);
152 xfs_buf_hash_destroy(pag);
153 mutex_destroy(&pag->pag_ici_reclaim_lock);
154 call_rcu(&pag->rcu_head, __xfs_free_perag);
155 }
156}
157
158
159
160
161
162int
163xfs_sb_validate_fsb_count(
164 xfs_sb_t *sbp,
165 uint64_t nblocks)
166{
167 ASSERT(PAGE_SHIFT >= sbp->sb_blocklog);
168 ASSERT(sbp->sb_blocklog >= BBSHIFT);
169
170
171 if (nblocks >> (PAGE_SHIFT - sbp->sb_blocklog) > ULONG_MAX)
172 return -EFBIG;
173 return 0;
174}
175
176int
177xfs_initialize_perag(
178 xfs_mount_t *mp,
179 xfs_agnumber_t agcount,
180 xfs_agnumber_t *maxagi)
181{
182 xfs_agnumber_t index;
183 xfs_agnumber_t first_initialised = NULLAGNUMBER;
184 xfs_perag_t *pag;
185 int error = -ENOMEM;
186
187
188
189
190
191
192 for (index = 0; index < agcount; index++) {
193 pag = xfs_perag_get(mp, index);
194 if (pag) {
195 xfs_perag_put(pag);
196 continue;
197 }
198
199 pag = kmem_zalloc(sizeof(*pag), KM_MAYFAIL);
200 if (!pag)
201 goto out_unwind_new_pags;
202 pag->pag_agno = index;
203 pag->pag_mount = mp;
204 spin_lock_init(&pag->pag_ici_lock);
205 mutex_init(&pag->pag_ici_reclaim_lock);
206 INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC);
207 if (xfs_buf_hash_init(pag))
208 goto out_free_pag;
209 init_waitqueue_head(&pag->pagb_wait);
210 spin_lock_init(&pag->pagb_lock);
211 pag->pagb_count = 0;
212 pag->pagb_tree = RB_ROOT;
213
214 if (radix_tree_preload(GFP_NOFS))
215 goto out_hash_destroy;
216
217 spin_lock(&mp->m_perag_lock);
218 if (radix_tree_insert(&mp->m_perag_tree, index, pag)) {
219 BUG();
220 spin_unlock(&mp->m_perag_lock);
221 radix_tree_preload_end();
222 error = -EEXIST;
223 goto out_hash_destroy;
224 }
225 spin_unlock(&mp->m_perag_lock);
226 radix_tree_preload_end();
227
228 if (first_initialised == NULLAGNUMBER)
229 first_initialised = index;
230 }
231
232 index = xfs_set_inode_alloc(mp, agcount);
233
234 if (maxagi)
235 *maxagi = index;
236
237 mp->m_ag_prealloc_blocks = xfs_prealloc_blocks(mp);
238 return 0;
239
240out_hash_destroy:
241 xfs_buf_hash_destroy(pag);
242out_free_pag:
243 mutex_destroy(&pag->pag_ici_reclaim_lock);
244 kmem_free(pag);
245out_unwind_new_pags:
246
247 for (index = first_initialised; index < agcount; index++) {
248 pag = radix_tree_delete(&mp->m_perag_tree, index);
249 if (!pag)
250 break;
251 xfs_buf_hash_destroy(pag);
252 mutex_destroy(&pag->pag_ici_reclaim_lock);
253 kmem_free(pag);
254 }
255 return error;
256}
257
258
259
260
261
262
263int
264xfs_readsb(
265 struct xfs_mount *mp,
266 int flags)
267{
268 unsigned int sector_size;
269 struct xfs_buf *bp;
270 struct xfs_sb *sbp = &mp->m_sb;
271 int error;
272 int loud = !(flags & XFS_MFSI_QUIET);
273 const struct xfs_buf_ops *buf_ops;
274
275 ASSERT(mp->m_sb_bp == NULL);
276 ASSERT(mp->m_ddev_targp != NULL);
277
278
279
280
281
282
283
284
285 sector_size = xfs_getsize_buftarg(mp->m_ddev_targp);
286 buf_ops = NULL;
287
288
289
290
291
292
293
294reread:
295 error = xfs_buf_read_uncached(mp->m_ddev_targp, XFS_SB_DADDR,
296 BTOBB(sector_size), XBF_NO_IOACCT, &bp,
297 buf_ops);
298 if (error) {
299 if (loud)
300 xfs_warn(mp, "SB validate failed with error %d.", error);
301
302 if (error == -EFSBADCRC)
303 error = -EFSCORRUPTED;
304 return error;
305 }
306
307
308
309
310 xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp));
311
312
313
314
315
316 if (sbp->sb_magicnum != XFS_SB_MAGIC) {
317 if (loud)
318 xfs_warn(mp, "Invalid superblock magic number");
319 error = -EINVAL;
320 goto release_buf;
321 }
322
323
324
325
326 if (sector_size > sbp->sb_sectsize) {
327 if (loud)
328 xfs_warn(mp, "device supports %u byte sectors (not %u)",
329 sector_size, sbp->sb_sectsize);
330 error = -ENOSYS;
331 goto release_buf;
332 }
333
334 if (buf_ops == NULL) {
335
336
337
338
339 xfs_buf_relse(bp);
340 sector_size = sbp->sb_sectsize;
341 buf_ops = loud ? &xfs_sb_buf_ops : &xfs_sb_quiet_buf_ops;
342 goto reread;
343 }
344
345 xfs_reinit_percpu_counters(mp);
346
347
348 bp->b_ops = &xfs_sb_buf_ops;
349
350 mp->m_sb_bp = bp;
351 xfs_buf_unlock(bp);
352 return 0;
353
354release_buf:
355 xfs_buf_relse(bp);
356 return error;
357}
358
359
360
361
362STATIC int
363xfs_update_alignment(xfs_mount_t *mp)
364{
365 xfs_sb_t *sbp = &(mp->m_sb);
366
367 if (mp->m_dalign) {
368
369
370
371
372 if ((BBTOB(mp->m_dalign) & mp->m_blockmask) ||
373 (BBTOB(mp->m_swidth) & mp->m_blockmask)) {
374 xfs_warn(mp,
375 "alignment check failed: sunit/swidth vs. blocksize(%d)",
376 sbp->sb_blocksize);
377 return -EINVAL;
378 } else {
379
380
381
382 mp->m_dalign = XFS_BB_TO_FSBT(mp, mp->m_dalign);
383 if (mp->m_dalign && (sbp->sb_agblocks % mp->m_dalign)) {
384 xfs_warn(mp,
385 "alignment check failed: sunit/swidth vs. agsize(%d)",
386 sbp->sb_agblocks);
387 return -EINVAL;
388 } else if (mp->m_dalign) {
389 mp->m_swidth = XFS_BB_TO_FSBT(mp, mp->m_swidth);
390 } else {
391 xfs_warn(mp,
392 "alignment check failed: sunit(%d) less than bsize(%d)",
393 mp->m_dalign, sbp->sb_blocksize);
394 return -EINVAL;
395 }
396 }
397
398
399
400
401
402 if (xfs_sb_version_hasdalign(sbp)) {
403 if (sbp->sb_unit != mp->m_dalign) {
404 sbp->sb_unit = mp->m_dalign;
405 mp->m_update_sb = true;
406 }
407 if (sbp->sb_width != mp->m_swidth) {
408 sbp->sb_width = mp->m_swidth;
409 mp->m_update_sb = true;
410 }
411 } else {
412 xfs_warn(mp,
413 "cannot change alignment: superblock does not support data alignment");
414 return -EINVAL;
415 }
416 } else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN &&
417 xfs_sb_version_hasdalign(&mp->m_sb)) {
418 mp->m_dalign = sbp->sb_unit;
419 mp->m_swidth = sbp->sb_width;
420 }
421
422 return 0;
423}
424
425
426
427
428STATIC void
429xfs_set_maxicount(xfs_mount_t *mp)
430{
431 xfs_sb_t *sbp = &(mp->m_sb);
432 uint64_t icount;
433
434 if (sbp->sb_imax_pct) {
435
436
437
438
439 icount = sbp->sb_dblocks * sbp->sb_imax_pct;
440 do_div(icount, 100);
441 do_div(icount, mp->m_ialloc_blks);
442 mp->m_maxicount = (icount * mp->m_ialloc_blks) <<
443 sbp->sb_inopblog;
444 } else {
445 mp->m_maxicount = 0;
446 }
447}
448
449
450
451
452
453
454
455STATIC void
456xfs_set_rw_sizes(xfs_mount_t *mp)
457{
458 xfs_sb_t *sbp = &(mp->m_sb);
459 int readio_log, writeio_log;
460
461 if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) {
462 if (mp->m_flags & XFS_MOUNT_WSYNC) {
463 readio_log = XFS_WSYNC_READIO_LOG;
464 writeio_log = XFS_WSYNC_WRITEIO_LOG;
465 } else {
466 readio_log = XFS_READIO_LOG_LARGE;
467 writeio_log = XFS_WRITEIO_LOG_LARGE;
468 }
469 } else {
470 readio_log = mp->m_readio_log;
471 writeio_log = mp->m_writeio_log;
472 }
473
474 if (sbp->sb_blocklog > readio_log) {
475 mp->m_readio_log = sbp->sb_blocklog;
476 } else {
477 mp->m_readio_log = readio_log;
478 }
479 mp->m_readio_blocks = 1 << (mp->m_readio_log - sbp->sb_blocklog);
480 if (sbp->sb_blocklog > writeio_log) {
481 mp->m_writeio_log = sbp->sb_blocklog;
482 } else {
483 mp->m_writeio_log = writeio_log;
484 }
485 mp->m_writeio_blocks = 1 << (mp->m_writeio_log - sbp->sb_blocklog);
486}
487
488
489
490
491void
492xfs_set_low_space_thresholds(
493 struct xfs_mount *mp)
494{
495 int i;
496
497 for (i = 0; i < XFS_LOWSP_MAX; i++) {
498 uint64_t space = mp->m_sb.sb_dblocks;
499
500 do_div(space, 100);
501 mp->m_low_space[i] = space * (i + 1);
502 }
503}
504
505
506
507
508
509STATIC void
510xfs_set_inoalignment(xfs_mount_t *mp)
511{
512 if (xfs_sb_version_hasalign(&mp->m_sb) &&
513 mp->m_sb.sb_inoalignmt >= xfs_icluster_size_fsb(mp))
514 mp->m_inoalign_mask = mp->m_sb.sb_inoalignmt - 1;
515 else
516 mp->m_inoalign_mask = 0;
517
518
519
520
521 if (mp->m_dalign && mp->m_inoalign_mask &&
522 !(mp->m_dalign & mp->m_inoalign_mask))
523 mp->m_sinoalign = mp->m_dalign;
524 else
525 mp->m_sinoalign = 0;
526}
527
528
529
530
531STATIC int
532xfs_check_sizes(
533 struct xfs_mount *mp)
534{
535 struct xfs_buf *bp;
536 xfs_daddr_t d;
537 int error;
538
539 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks);
540 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) {
541 xfs_warn(mp, "filesystem size mismatch detected");
542 return -EFBIG;
543 }
544 error = xfs_buf_read_uncached(mp->m_ddev_targp,
545 d - XFS_FSS_TO_BB(mp, 1),
546 XFS_FSS_TO_BB(mp, 1), 0, &bp, NULL);
547 if (error) {
548 xfs_warn(mp, "last sector read failed");
549 return error;
550 }
551 xfs_buf_relse(bp);
552
553 if (mp->m_logdev_targp == mp->m_ddev_targp)
554 return 0;
555
556 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks);
557 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) {
558 xfs_warn(mp, "log size mismatch detected");
559 return -EFBIG;
560 }
561 error = xfs_buf_read_uncached(mp->m_logdev_targp,
562 d - XFS_FSB_TO_BB(mp, 1),
563 XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL);
564 if (error) {
565 xfs_warn(mp, "log device read failed");
566 return error;
567 }
568 xfs_buf_relse(bp);
569 return 0;
570}
571
572
573
574
575int
576xfs_mount_reset_sbqflags(
577 struct xfs_mount *mp)
578{
579 mp->m_qflags = 0;
580
581
582 if (mp->m_sb.sb_qflags == 0)
583 return 0;
584 spin_lock(&mp->m_sb_lock);
585 mp->m_sb.sb_qflags = 0;
586 spin_unlock(&mp->m_sb_lock);
587
588 if (!xfs_fs_writable(mp, SB_FREEZE_WRITE))
589 return 0;
590
591 return xfs_sync_sb(mp, false);
592}
593
594uint64_t
595xfs_default_resblks(xfs_mount_t *mp)
596{
597 uint64_t resblks;
598
599
600
601
602
603
604
605
606 resblks = mp->m_sb.sb_dblocks;
607 do_div(resblks, 20);
608 resblks = min_t(uint64_t, resblks, 8192);
609 return resblks;
610}
611
612
613STATIC int
614xfs_check_summary_counts(
615 struct xfs_mount *mp)
616{
617
618
619
620
621 if (mp->m_sb.sb_inprogress) {
622 xfs_err(mp, "sb_inprogress set after log recovery??");
623 WARN_ON(1);
624 return -EFSCORRUPTED;
625 }
626
627
628
629
630
631
632
633
634
635
636
637
638 if (XFS_LAST_UNMOUNT_WAS_CLEAN(mp) &&
639 (mp->m_sb.sb_fdblocks > mp->m_sb.sb_dblocks ||
640 !xfs_verify_icount(mp, mp->m_sb.sb_icount) ||
641 mp->m_sb.sb_ifree > mp->m_sb.sb_icount))
642 mp->m_flags |= XFS_MOUNT_BAD_SUMMARY;
643
644
645
646
647
648
649
650
651
652
653
654
655 if ((!xfs_sb_version_haslazysbcount(&mp->m_sb) ||
656 XFS_LAST_UNMOUNT_WAS_CLEAN(mp)) &&
657 !(mp->m_flags & XFS_MOUNT_BAD_SUMMARY))
658 return 0;
659
660 return xfs_initialize_perag_data(mp, mp->m_sb.sb_agcount);
661}
662
663
664
665
666
667
668
669
670
671
672
673int
674xfs_mountfs(
675 struct xfs_mount *mp)
676{
677 struct xfs_sb *sbp = &(mp->m_sb);
678 struct xfs_inode *rip;
679 uint64_t resblks;
680 uint quotamount = 0;
681 uint quotaflags = 0;
682 int error = 0;
683
684 xfs_sb_mount_common(mp, sbp);
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702 if (xfs_sb_has_mismatched_features2(sbp)) {
703 xfs_warn(mp, "correcting sb_features alignment problem");
704 sbp->sb_features2 |= sbp->sb_bad_features2;
705 mp->m_update_sb = true;
706
707
708
709
710
711 if (xfs_sb_version_hasattr2(&mp->m_sb) &&
712 !(mp->m_flags & XFS_MOUNT_NOATTR2))
713 mp->m_flags |= XFS_MOUNT_ATTR2;
714 }
715
716 if (xfs_sb_version_hasattr2(&mp->m_sb) &&
717 (mp->m_flags & XFS_MOUNT_NOATTR2)) {
718 xfs_sb_version_removeattr2(&mp->m_sb);
719 mp->m_update_sb = true;
720
721
722 if (!sbp->sb_features2)
723 mp->m_update_sb = true;
724 }
725
726
727 if (!(mp->m_sb.sb_versionnum & XFS_SB_VERSION_NLINKBIT)) {
728 mp->m_sb.sb_versionnum |= XFS_SB_VERSION_NLINKBIT;
729 mp->m_update_sb = true;
730 }
731
732
733
734
735
736
737
738 error = xfs_update_alignment(mp);
739 if (error)
740 goto out;
741
742 xfs_alloc_compute_maxlevels(mp);
743 xfs_bmap_compute_maxlevels(mp, XFS_DATA_FORK);
744 xfs_bmap_compute_maxlevels(mp, XFS_ATTR_FORK);
745 xfs_ialloc_compute_maxlevels(mp);
746 xfs_rmapbt_compute_maxlevels(mp);
747 xfs_refcountbt_compute_maxlevels(mp);
748
749 xfs_set_maxicount(mp);
750
751
752 mp->m_fail_unmount = true;
753
754 error = xfs_sysfs_init(&mp->m_kobj, &xfs_mp_ktype, NULL, mp->m_fsname);
755 if (error)
756 goto out;
757
758 error = xfs_sysfs_init(&mp->m_stats.xs_kobj, &xfs_stats_ktype,
759 &mp->m_kobj, "stats");
760 if (error)
761 goto out_remove_sysfs;
762
763 error = xfs_error_sysfs_init(mp);
764 if (error)
765 goto out_del_stats;
766
767 error = xfs_errortag_init(mp);
768 if (error)
769 goto out_remove_error_sysfs;
770
771 error = xfs_uuid_mount(mp);
772 if (error)
773 goto out_remove_errortag;
774
775
776
777
778 xfs_set_rw_sizes(mp);
779
780
781 xfs_set_low_space_thresholds(mp);
782
783
784
785
786
787
788
789
790
791
792
793 mp->m_inode_cluster_size = XFS_INODE_BIG_CLUSTER_SIZE;
794 if (xfs_sb_version_hascrc(&mp->m_sb)) {
795 int new_size = mp->m_inode_cluster_size;
796
797 new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE;
798 if (mp->m_sb.sb_inoalignmt >= XFS_B_TO_FSBT(mp, new_size))
799 mp->m_inode_cluster_size = new_size;
800 }
801 mp->m_blocks_per_cluster = xfs_icluster_size_fsb(mp);
802 mp->m_inodes_per_cluster = XFS_FSB_TO_INO(mp, mp->m_blocks_per_cluster);
803 mp->m_cluster_align = xfs_ialloc_cluster_alignment(mp);
804 mp->m_cluster_align_inodes = XFS_FSB_TO_INO(mp, mp->m_cluster_align);
805
806
807
808
809
810
811 if (xfs_sb_version_hassparseinodes(&mp->m_sb) &&
812 mp->m_sb.sb_spino_align !=
813 XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) {
814 xfs_warn(mp,
815 "Sparse inode block alignment (%u) must match cluster size (%llu).",
816 mp->m_sb.sb_spino_align,
817 XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size));
818 error = -EINVAL;
819 goto out_remove_uuid;
820 }
821
822
823
824
825 xfs_set_inoalignment(mp);
826
827
828
829
830 error = xfs_check_sizes(mp);
831 if (error)
832 goto out_remove_uuid;
833
834
835
836
837 error = xfs_rtmount_init(mp);
838 if (error) {
839 xfs_warn(mp, "RT mount failed");
840 goto out_remove_uuid;
841 }
842
843
844
845
846
847 mp->m_fixedfsid[0] =
848 (get_unaligned_be16(&sbp->sb_uuid.b[8]) << 16) |
849 get_unaligned_be16(&sbp->sb_uuid.b[4]);
850 mp->m_fixedfsid[1] = get_unaligned_be32(&sbp->sb_uuid.b[0]);
851
852 error = xfs_da_mount(mp);
853 if (error) {
854 xfs_warn(mp, "Failed dir/attr init: %d", error);
855 goto out_remove_uuid;
856 }
857
858
859
860
861 xfs_trans_init(mp);
862
863
864
865
866 error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi);
867 if (error) {
868 xfs_warn(mp, "Failed per-ag init: %d", error);
869 goto out_free_dir;
870 }
871
872 if (!sbp->sb_logblocks) {
873 xfs_warn(mp, "no log defined");
874 XFS_ERROR_REPORT("xfs_mountfs", XFS_ERRLEVEL_LOW, mp);
875 error = -EFSCORRUPTED;
876 goto out_free_perag;
877 }
878
879
880
881
882
883
884 error = xfs_log_mount(mp, mp->m_logdev_targp,
885 XFS_FSB_TO_DADDR(mp, sbp->sb_logstart),
886 XFS_FSB_TO_BB(mp, sbp->sb_logblocks));
887 if (error) {
888 xfs_warn(mp, "log mount failed");
889 goto out_fail_wait;
890 }
891
892
893 error = xfs_check_summary_counts(mp);
894 if (error)
895 goto out_log_dealloc;
896
897
898
899
900
901 error = xfs_iget(mp, NULL, sbp->sb_rootino, XFS_IGET_UNTRUSTED,
902 XFS_ILOCK_EXCL, &rip);
903 if (error) {
904 xfs_warn(mp,
905 "Failed to read root inode 0x%llx, error %d",
906 sbp->sb_rootino, -error);
907 goto out_log_dealloc;
908 }
909
910 ASSERT(rip != NULL);
911
912 if (unlikely(!S_ISDIR(VFS_I(rip)->i_mode))) {
913 xfs_warn(mp, "corrupted root inode %llu: not a directory",
914 (unsigned long long)rip->i_ino);
915 xfs_iunlock(rip, XFS_ILOCK_EXCL);
916 XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW,
917 mp);
918 error = -EFSCORRUPTED;
919 goto out_rele_rip;
920 }
921 mp->m_rootip = rip;
922
923 xfs_iunlock(rip, XFS_ILOCK_EXCL);
924
925
926
927
928 error = xfs_rtmount_inodes(mp);
929 if (error) {
930
931
932
933 xfs_warn(mp, "failed to read RT inodes");
934 goto out_rele_rip;
935 }
936
937
938
939
940
941
942 if (mp->m_update_sb && !(mp->m_flags & XFS_MOUNT_RDONLY)) {
943 error = xfs_sync_sb(mp, false);
944 if (error) {
945 xfs_warn(mp, "failed to write sb changes");
946 goto out_rtunmount;
947 }
948 }
949
950
951
952
953 if (XFS_IS_QUOTA_RUNNING(mp)) {
954 error = xfs_qm_newmount(mp, "amount, "aflags);
955 if (error)
956 goto out_rtunmount;
957 } else {
958 ASSERT(!XFS_IS_QUOTA_ON(mp));
959
960
961
962
963
964
965 if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
966 xfs_notice(mp, "resetting quota flags");
967 error = xfs_mount_reset_sbqflags(mp);
968 if (error)
969 goto out_rtunmount;
970 }
971 }
972
973
974
975
976
977
978 error = xfs_log_mount_finish(mp);
979 if (error) {
980 xfs_warn(mp, "log mount finish failed");
981 goto out_rtunmount;
982 }
983
984
985
986
987
988
989
990
991
992
993 if ((mp->m_flags & (XFS_MOUNT_RDONLY|XFS_MOUNT_NORECOVERY)) ==
994 XFS_MOUNT_RDONLY) {
995 xfs_quiesce_attr(mp);
996 }
997
998
999
1000
1001 if (quotamount) {
1002 ASSERT(mp->m_qflags == 0);
1003 mp->m_qflags = quotaflags;
1004
1005 xfs_qm_mount_quotas(mp);
1006 }
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019 if (!(mp->m_flags & XFS_MOUNT_RDONLY)) {
1020 resblks = xfs_default_resblks(mp);
1021 error = xfs_reserve_blocks(mp, &resblks, NULL);
1022 if (error)
1023 xfs_warn(mp,
1024 "Unable to allocate reserve blocks. Continuing without reserve pool.");
1025
1026
1027 error = xfs_reflink_recover_cow(mp);
1028 if (error) {
1029 xfs_err(mp,
1030 "Error %d recovering leftover CoW allocations.", error);
1031 xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
1032 goto out_quota;
1033 }
1034
1035
1036 error = xfs_fs_reserve_ag_blocks(mp);
1037 if (error && error != -ENOSPC)
1038 goto out_agresv;
1039 }
1040
1041 return 0;
1042
1043 out_agresv:
1044 xfs_fs_unreserve_ag_blocks(mp);
1045 out_quota:
1046 xfs_qm_unmount_quotas(mp);
1047 out_rtunmount:
1048 xfs_rtunmount_inodes(mp);
1049 out_rele_rip:
1050 xfs_irele(rip);
1051
1052 xfs_qm_unmount(mp);
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064 cancel_delayed_work_sync(&mp->m_reclaim_work);
1065 xfs_reclaim_inodes(mp, SYNC_WAIT);
1066 out_log_dealloc:
1067 mp->m_flags |= XFS_MOUNT_UNMOUNTING;
1068 xfs_log_mount_cancel(mp);
1069 out_fail_wait:
1070 if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp)
1071 xfs_wait_buftarg(mp->m_logdev_targp);
1072 xfs_wait_buftarg(mp->m_ddev_targp);
1073 out_free_perag:
1074 xfs_free_perag(mp);
1075 out_free_dir:
1076 xfs_da_unmount(mp);
1077 out_remove_uuid:
1078 xfs_uuid_unmount(mp);
1079 out_remove_errortag:
1080 xfs_errortag_del(mp);
1081 out_remove_error_sysfs:
1082 xfs_error_sysfs_del(mp);
1083 out_del_stats:
1084 xfs_sysfs_del(&mp->m_stats.xs_kobj);
1085 out_remove_sysfs:
1086 xfs_sysfs_del(&mp->m_kobj);
1087 out:
1088 return error;
1089}
1090
1091
1092
1093
1094
1095void
1096xfs_unmountfs(
1097 struct xfs_mount *mp)
1098{
1099 uint64_t resblks;
1100 int error;
1101
1102 xfs_icache_disable_reclaim(mp);
1103 xfs_fs_unreserve_ag_blocks(mp);
1104 xfs_qm_unmount_quotas(mp);
1105 xfs_rtunmount_inodes(mp);
1106 xfs_irele(mp->m_rootip);
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118 xfs_log_force(mp, XFS_LOG_SYNC);
1119
1120
1121
1122
1123
1124 xfs_extent_busy_wait_all(mp);
1125 flush_workqueue(xfs_discard_wq);
1126
1127
1128
1129
1130
1131
1132
1133 mp->m_flags |= XFS_MOUNT_UNMOUNTING;
1134
1135
1136
1137
1138 xfs_ail_push_all_sync(mp->m_ail);
1139
1140
1141
1142
1143
1144
1145
1146 cancel_delayed_work_sync(&mp->m_reclaim_work);
1147 xfs_reclaim_inodes(mp, SYNC_WAIT);
1148
1149 xfs_qm_unmount(mp);
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165 resblks = 0;
1166 error = xfs_reserve_blocks(mp, &resblks, NULL);
1167 if (error)
1168 xfs_warn(mp, "Unable to free reserved block pool. "
1169 "Freespace may not be correct on next mount.");
1170
1171 error = xfs_log_sbcount(mp);
1172 if (error)
1173 xfs_warn(mp, "Unable to update superblock counters. "
1174 "Freespace may not be correct on next mount.");
1175
1176
1177 xfs_log_unmount(mp);
1178 xfs_da_unmount(mp);
1179 xfs_uuid_unmount(mp);
1180
1181#if defined(DEBUG)
1182 xfs_errortag_clearall(mp);
1183#endif
1184 xfs_free_perag(mp);
1185
1186 xfs_errortag_del(mp);
1187 xfs_error_sysfs_del(mp);
1188 xfs_sysfs_del(&mp->m_stats.xs_kobj);
1189 xfs_sysfs_del(&mp->m_kobj);
1190}
1191
1192
1193
1194
1195
1196
1197
1198bool
1199xfs_fs_writable(
1200 struct xfs_mount *mp,
1201 int level)
1202{
1203 ASSERT(level > SB_UNFROZEN);
1204 if ((mp->m_super->s_writers.frozen >= level) ||
1205 XFS_FORCED_SHUTDOWN(mp) || (mp->m_flags & XFS_MOUNT_RDONLY))
1206 return false;
1207
1208 return true;
1209}
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220int
1221xfs_log_sbcount(xfs_mount_t *mp)
1222{
1223
1224 if (!xfs_fs_writable(mp, SB_FREEZE_COMPLETE))
1225 return 0;
1226
1227
1228
1229
1230
1231 if (!xfs_sb_version_haslazysbcount(&mp->m_sb))
1232 return 0;
1233
1234 return xfs_sync_sb(mp, true);
1235}
1236
1237
1238
1239
1240
1241#define XFS_ICOUNT_BATCH 128
1242int
1243xfs_mod_icount(
1244 struct xfs_mount *mp,
1245 int64_t delta)
1246{
1247 percpu_counter_add_batch(&mp->m_icount, delta, XFS_ICOUNT_BATCH);
1248 if (__percpu_counter_compare(&mp->m_icount, 0, XFS_ICOUNT_BATCH) < 0) {
1249 ASSERT(0);
1250 percpu_counter_add(&mp->m_icount, -delta);
1251 return -EINVAL;
1252 }
1253 return 0;
1254}
1255
1256int
1257xfs_mod_ifree(
1258 struct xfs_mount *mp,
1259 int64_t delta)
1260{
1261 percpu_counter_add(&mp->m_ifree, delta);
1262 if (percpu_counter_compare(&mp->m_ifree, 0) < 0) {
1263 ASSERT(0);
1264 percpu_counter_add(&mp->m_ifree, -delta);
1265 return -EINVAL;
1266 }
1267 return 0;
1268}
1269
1270
1271
1272
1273
1274
1275
1276
1277#define XFS_FDBLOCKS_BATCH 1024
1278int
1279xfs_mod_fdblocks(
1280 struct xfs_mount *mp,
1281 int64_t delta,
1282 bool rsvd)
1283{
1284 int64_t lcounter;
1285 long long res_used;
1286 s32 batch;
1287
1288 if (delta > 0) {
1289
1290
1291
1292
1293 if (likely(mp->m_resblks == mp->m_resblks_avail)) {
1294 percpu_counter_add(&mp->m_fdblocks, delta);
1295 return 0;
1296 }
1297
1298 spin_lock(&mp->m_sb_lock);
1299 res_used = (long long)(mp->m_resblks - mp->m_resblks_avail);
1300
1301 if (res_used > delta) {
1302 mp->m_resblks_avail += delta;
1303 } else {
1304 delta -= res_used;
1305 mp->m_resblks_avail = mp->m_resblks;
1306 percpu_counter_add(&mp->m_fdblocks, delta);
1307 }
1308 spin_unlock(&mp->m_sb_lock);
1309 return 0;
1310 }
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320 if (__percpu_counter_compare(&mp->m_fdblocks, 2 * XFS_FDBLOCKS_BATCH,
1321 XFS_FDBLOCKS_BATCH) < 0)
1322 batch = 1;
1323 else
1324 batch = XFS_FDBLOCKS_BATCH;
1325
1326 percpu_counter_add_batch(&mp->m_fdblocks, delta, batch);
1327 if (__percpu_counter_compare(&mp->m_fdblocks, mp->m_alloc_set_aside,
1328 XFS_FDBLOCKS_BATCH) >= 0) {
1329
1330 return 0;
1331 }
1332
1333
1334
1335
1336
1337 spin_lock(&mp->m_sb_lock);
1338 percpu_counter_add(&mp->m_fdblocks, -delta);
1339 if (!rsvd)
1340 goto fdblocks_enospc;
1341
1342 lcounter = (long long)mp->m_resblks_avail + delta;
1343 if (lcounter >= 0) {
1344 mp->m_resblks_avail = lcounter;
1345 spin_unlock(&mp->m_sb_lock);
1346 return 0;
1347 }
1348 printk_once(KERN_WARNING
1349 "Filesystem \"%s\": reserve blocks depleted! "
1350 "Consider increasing reserve pool size.",
1351 mp->m_fsname);
1352fdblocks_enospc:
1353 spin_unlock(&mp->m_sb_lock);
1354 return -ENOSPC;
1355}
1356
1357int
1358xfs_mod_frextents(
1359 struct xfs_mount *mp,
1360 int64_t delta)
1361{
1362 int64_t lcounter;
1363 int ret = 0;
1364
1365 spin_lock(&mp->m_sb_lock);
1366 lcounter = mp->m_sb.sb_frextents + delta;
1367 if (lcounter < 0)
1368 ret = -ENOSPC;
1369 else
1370 mp->m_sb.sb_frextents = lcounter;
1371 spin_unlock(&mp->m_sb_lock);
1372 return ret;
1373}
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384struct xfs_buf *
1385xfs_getsb(
1386 struct xfs_mount *mp,
1387 int flags)
1388{
1389 struct xfs_buf *bp = mp->m_sb_bp;
1390
1391 if (!xfs_buf_trylock(bp)) {
1392 if (flags & XBF_TRYLOCK)
1393 return NULL;
1394 xfs_buf_lock(bp);
1395 }
1396
1397 xfs_buf_hold(bp);
1398 ASSERT(bp->b_flags & XBF_DONE);
1399 return bp;
1400}
1401
1402
1403
1404
1405void
1406xfs_freesb(
1407 struct xfs_mount *mp)
1408{
1409 struct xfs_buf *bp = mp->m_sb_bp;
1410
1411 xfs_buf_lock(bp);
1412 mp->m_sb_bp = NULL;
1413 xfs_buf_relse(bp);
1414}
1415
1416
1417
1418
1419
1420int
1421xfs_dev_is_read_only(
1422 struct xfs_mount *mp,
1423 char *message)
1424{
1425 if (xfs_readonly_buftarg(mp->m_ddev_targp) ||
1426 xfs_readonly_buftarg(mp->m_logdev_targp) ||
1427 (mp->m_rtdev_targp && xfs_readonly_buftarg(mp->m_rtdev_targp))) {
1428 xfs_notice(mp, "%s required on read-only device.", message);
1429 xfs_notice(mp, "write access unavailable, cannot proceed.");
1430 return -EROFS;
1431 }
1432 return 0;
1433}
1434
1435
1436void
1437xfs_force_summary_recalc(
1438 struct xfs_mount *mp)
1439{
1440 if (!xfs_sb_version_haslazysbcount(&mp->m_sb))
1441 return;
1442
1443 spin_lock(&mp->m_sb_lock);
1444 mp->m_flags |= XFS_MOUNT_BAD_SUMMARY;
1445 spin_unlock(&mp->m_sb_lock);
1446}
1447