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