aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/telephony
ModeNameSize
-rw-r--r--Kconfig1532logstatsplainblame
-rw-r--r--Makefile152logstatsplainblame
-rw-r--r--ixj-ver.h115logstatsplainblame
-rw-r--r--ixj.c320042logstatsplainblame
-rw-r--r--ixj.h29650logstatsplainblame
-rw-r--r--ixj_pcmcia.c4100logstatsplainblame
-rw-r--r--phonedev.c3523logstatsplainblame
Mason <chris.mason@oracle.com> 2007-12-17 20:14:04 -0500 committer Chris Mason <chris.mason@oracle.com> 2008-09-25 11:03:58 -0400 Btrfs: Add mount option to enforce a max extent size' href='/cgit/cgit.cgi/litmus-rt.git/commit/fs/btrfs/super.c?h=archived-2013.1&id=c59f8951d48c5eb000926935f3ab063d8181d1ee'>c59f8951d48c
6da6abae027e
a9218f6b00ad
1bcbf3133739
5a0e3ad6af86
4b4e25f2a6dd
2e635a278354
e20d96d64f9c
d57197629283
2c90e5d65842
c5739bba5260
3a686375629d
5103e947b9b7
8a4b83cc8bd7
b3c3da71ed88
be6e8dc0ba84
c8b978188c9a
2e635a278354
b87221de6a49
75dfe3960e60
d397712bcc6a
b18c6685810a
39279cc3d270
b18c6685810a
b18c6685810a
39279cc3d270
39279cc3d270
75dfe3960e60

95e0528919cb
73f73415cadd
287a0ab91d25


e244a0aeb6a5
95e0528919cb


dfe25020689b
95e0528919cb
73f73415cadd
43e570b08a6c
b6cda9bcb4df
be20aa9dbadc
21ad10cf3e9c
6f568d35a045
8f662a76c6af
4543df7ecc8a
c8b978188c9a
a555f810af6d
e18e4809b10e
451d7585a8bb
3b30c22f64a6
33268eaf0b3d
3a5e14048a0a
dccae9999508
97e728d4353f
e244a0aeb6a5
33268eaf0b3d
95e0528919cb

edf24abe5149




95e0528919cb
edf24abe5149
95e0528919cb
da495ecc0fb0
4543df7ecc8a
a7a3f7cadd9b
b6cda9bcb4df
95e0528919cb
edf24abe5149
95e0528919cb
be20aa9dbadc







da495ecc0fb0
be20aa9dbadc
edf24abe5149
95e0528919cb





dfe25020689b
edf24abe5149

dfe25020689b
95e0528919cb
73f73415cadd
43e570b08a6c
edf24abe5149
43e570b08a6c
edf24abe5149

b6cda9bcb4df

067c28adc538
edf24abe5149
be20aa9dbadc

edf24abe5149


95e0528919cb
c8b978188c9a



a555f810af6d




e18e4809b10e
edf24abe5149

e18e4809b10e
451d7585a8bb





3b30c22f64a6
451d7585a8bb

c289811cc096
3b30c22f64a6
451d7585a8bb
3b30c22f64a6
21ad10cf3e9c
edf24abe5149

21ad10cf3e9c
4543df7ecc8a








6f568d35a045
edf24abe5149

91748467a5c5
edf24abe5149

15ada040d7cd




edf24abe5149
21380931eb4d
6f568d35a045

8f662a76c6af
edf24abe5149

91748467a5c5
edf24abe5149


21380931eb4d
8f662a76c6af

33268eaf0b3d


3a5e14048a0a



dccae9999508



97e728d4353f








e244a0aeb6a5


a7a3f7cadd9b




95e0528919cb
be20aa9dbadc
95e0528919cb

a7a3f7cadd9b
da495ecc0fb0
a7a3f7cadd9b
edf24abe5149







97288f2c71e4
73f73415cadd
43e570b08a6c
edf24abe5149



73f73415cadd
edf24abe5149





















73f73415cadd

4849f01d153b








73f73415cadd
43e570b08a6c





edf24abe5149




43e570b08a6c
edf24abe5149



3de4586c5278
edf24abe5149


3de4586c5278
edf24abe5149



95e0528919cb

73f73415cadd



































fb4f6f910ca6

73f73415cadd





























4cbd1149fbcc

73f73415cadd



































d397712bcc6a
8a4b83cc8bd7
d397712bcc6a
75dfe3960e60
d397712bcc6a

39279cc3d270

5d4f98a28c7d
39279cc3d270
a429e51371ee
39279cc3d270


be6e8dc0ba84
5103e947b9b7
39279cc3d270
0eda294dfc98
33268eaf0b3d
49cf6f4529b7
a429e51371ee
dfe25020689b
6567e837df07
e58ca0203d32
39279cc3d270
e58ca0203d32
a429e51371ee
39279cc3d270
5f39d397dfbe
a429e51371ee
5d4f98a28c7d


73f73415cadd
5d4f98a28c7d

39279cc3d270
f254e52c1ce5
f254e52c1ce5
39279cc3d270




f254e52c1ce5
58176a9604c5
39279cc3d270
6885f308b557
6885f308b557
2619ba1f0ff9
39279cc3d270



2619ba1f0ff9

6bf13c0cc833
c5739bba5260

dccae9999508
c5739bba5260
2619ba1f0ff9
39279cc3d270



771ed689d2cd
24bbcf0442ee

771ed689d2cd
a22285a6a323
c5739bba5260
54aa1f4dfdac
2c90e5d65842

a9572a15a854












a9572a15a854
21380931eb4d

a9572a15a854
21380931eb4d

a9572a15a854




c289811cc096

451d7585a8bb


a9572a15a854
3a5e14048a0a
6b65c5c61bf8
dccae9999508
6b65c5c61bf8
20a5239a5d0f

a9572a15a854




a061fc8da7b9
4b82d6e4a592
a061fc8da7b9

4b82d6e4a592
a061fc8da7b9
4b82d6e4a592

edf24abe5149







4b82d6e4a592



8a4b83cc8bd7
97288f2c71e4
73f73415cadd

4b82d6e4a592
73f73415cadd
4b82d6e4a592
97288f2c71e4



73f73415cadd

edf24abe5149
1f48366084a7
edf24abe5149
97288f2c71e4
8a4b83cc8bd7
edf24abe5149
4b82d6e4a592
97288f2c71e4
8a4b83cc8bd7
edf24abe5149
8a4b83cc8bd7
2b82032c34ec




dfe25020689b
a061fc8da7b9
4b82d6e4a592




6f5bbff9a1b7
4b82d6e4a592
c146afad2c7f
4b82d6e4a592

73f73415cadd
2b82032c34ec
4b82d6e4a592




8a4b83cc8bd7

4b82d6e4a592
6f5bbff9a1b7
1f48366084a7
4b82d6e4a592

788f20eb5aff
4b82d6e4a592


73f73415cadd










d397712bcc6a
73f73415cadd
d397712bcc6a
73f73415cadd
6f5bbff9a1b7
73f73415cadd


76fcef19c403
73f73415cadd
76fcef19c403
73f73415cadd
6f5bbff9a1b7
76fcef19c403
73f73415cadd
76fcef19c403
73f73415cadd

4b82d6e4a592



edf24abe5149

4b82d6e4a592



c146afad2c7f
8a4b83cc8bd7
edf24abe5149

73f73415cadd
4b82d6e4a592

2e635a278354
c146afad2c7f




b288052e1779



c146afad2c7f








2b82032c34ec


c146afad2c7f


d68fc57b7e32
c146afad2c7f

d68fc57b7e32

c146afad2c7f







8fd17795b226


4b52dff6d371
bd4d10888990


db94535db75e
9d03632e26e1
8fd17795b226
bd4d10888990
b742bb82f167

bd4d10888990

8fd17795b226
db94535db75e
bd4d10888990
b742bb82f167
8fd17795b226

d397712bcc6a
9d03632e26e1
d397712bcc6a
9d03632e26e1


32d48fa1af1f



8fd17795b226

b51338628f60
2e635a278354



a061fc8da7b9
2e635a278354

a9218f6b00ad
d352ac68148b


8a4b83cc8bd7




c071fcfdb60e
8a4b83cc8bd7
e441d54de4fd


dae7b665cf6d


c071fcfdb60e
8a4b83cc8bd7

97288f2c71e4
8a4b83cc8bd7


dae7b665cf6d
8a4b83cc8bd7
f819d837eea9
8a4b83cc8bd7

0176260fc308
ed0dab6b86ce

a74a4b97b61b

0176260fc308
ed0dab6b86ce

0176260fc308
ed0dab6b86ce

a74a4b97b61b

0176260fc308
ed0dab6b86ce
2e635a278354
b87221de6a49
76dda93c6ae2
bd55597520a2
e20d96d64f9c
d57197629283
a9572a15a854
4730a4bc5bf3
b51338628f60
2c90e5d65842

8fd17795b226
c146afad2c7f
0176260fc308

e20d96d64f9c
a9218f6b00ad







578454ff7eab
a9218f6b00ad



578454ff7eab


a9218f6b00ad




b2950863c61b
a9218f6b00ad

d397712bcc6a
a9218f6b00ad

2e635a278354

2c90e5d65842
58176a9604c5




39279cc3d270
2c90e5d65842
a74a4b97b61b
d1310b2e0cd9

2f4cbe6442d3


d1310b2e0cd9



a9218f6b00ad
2f4cbe6442d3

c8b978188c9a
a9218f6b00ad


b3c3da71ed88

2f4cbe6442d3

a9218f6b00ad

2f4cbe6442d3

d1310b2e0cd9

2f4cbe6442d3

a74a4b97b61b
2f4cbe6442d3

2e635a278354



39279cc3d270
a52d9a8033c4
d1310b2e0cd9
a9218f6b00ad
2e635a278354
58176a9604c5
8a4b83cc8bd7
c8b978188c9a
2e635a278354





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899

















                                                                    
                         
                         
                              




                          
                           
                         
                              
                        
                        

                            
                         
                         
                         
                        
                        
                             
                        
                       
                   
                  
                    
                        
                        
                  
                       
                  
                    
                    
                   
                        
 
                                                     
 
                                                   
 
                                               
                
 
                                
                             

 
      
                                                                          


                                                                               
                             


                               
                                   
                                  
                                      
                                  
                                     
                                     
                                     
                                          
                                            
                                            
                                   
                                               
                         
                                       
                             
                             
                                     
                                             
                                         
                                 
                        

  




                                                                     
 
                                                   
                                       
                             
                   
                    
 
                     
                         
 







                                                                        
                       
 
                                                     





                                                     
                                  

                                                                              
                              
                                
                                  
                                
                          
                                                                        

                                                           

                                   
                                                                       
                                                                  

                                   


                                                                       
                              



                                                                     




                                                                         
                             

                                                                               
                              





                                                                   
                               

                                                                           
                                                              
                                                              
                                                                     
                              
                                   

                                                                          
                              








                                                                           
                                    

                                                     
                                                                       

                                           




                                                                     
                                                                               
                                                                              

                              
                                     

                                                     
                                                                        


                                                                             
                                                                               

                              


                                                                   



                                                                        



                                                                                








                                                                              


                                                                




                                                                            
                        
                              

                 
    
                    
                   







                                                                          
                                                                        
                                                                       
                                                     



                                       
                   





















                                                                        

                                   








                                                                       
                              





                                                                             




                              
               



                                                                              
                                                                  


                                                                             
                                                        



                                       

 



































                                                                              

                                    





























                                                                            

                                       



































                                                                               
                                                   
                                                                
                                                   
 

                                   

                                             
                             
                
 


                                          
                                            
                                           
                            
                                
                                   
      
 
                                                             
 
                                
                                                     
                                          
         
                                  
                                                     
 


                                                 
                                                                        

                                     
                                
         
 




                                          
         
 
                                 
 
                                     
                 



                               

 
                                                   

                                         
                                               
                
 



                                                                     
 

                                               
 
                                                 
                                                    
                   

 












                                                                         
                                            

                                                                 
                                   

                                                                  




                                                                           

                                        


                                             
                                      
                                            
                                            
                                                
                                                

                                          




                                                        
                                                              
 

                                                        
 
                                                            

 







                                                                           



                                         
                                                   
                                  

                                 
                      
                      
 



                                                              

                                                                         
                  
                             
 
                                                                            
                  
                                            
 
                                                              
                  
                                            
 




                                                                  
                                       
                                                                        




                                                       
                                                   
                                       
                                                 

                 
                          
                                                




                                                                     

                                                                    
                            
                                                   
                                                    

                 
                                                            


                                        










                                                                   
                                                           
                                                      
 
                                       
                                                   


                                                  
                 
                                         
                                   
                                       
                                                   
                                       
                                                 
                 

                                



                             

                           



                           
                    
                                        

                           
      

                     
 




                                                                        



                                              








                                                              


                                                               


                                                                          
                                                            

                             

                                                     







                                          


                                                                   
                                                                          


                                                            
                                                  
                                                     
 
                        

                                                  

                          
                                        
                                                                    
                                                            
                                     

                                                 
 
                                                                         
                                                                        


                                                                         



                                                                             

                 
 



                                                
                                          

                                          
 


                                                         




                                                                    
                          
 


                                    


                                                            
 

                                
                                                                  


                                                                         
 
                   
                   

 
                                               

                                               

                                                              
                 

 
                                                 

                                               

                                                                
                 
 
 
                                                        
                                           
                                            
                                          
                                        
                                             
                                            
                                            

                                              
                                       
                                        

                                         
  







                                                      
                                      



                                          


                                      




                                          
                                      

                                             
                                                                              

 

                                     
                




                                 
                                  
                
                                

                               


                                 



                                    
                                     

                                     
 


                                                  

                                                             

                 

                               

                          

                         

                               
           

                           



                                      
                               
                          
                         
                               
                                              
                           
                                 
                          





                          
/*
 * Copyright (C) 2007 Oracle.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License v2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 021110-1307, USA.
 */

#include <linux/blkdev.h>
#include <linux/module.h>
#include <linux/buffer_head.h>
#include <linux/fs.h>
#include <linux/pagemap.h>
#include <linux/highmem.h>
#include <linux/time.h>
#include <linux/init.h>
#include <linux/seq_file.h>
#include <linux/string.h>
#include <linux/backing-dev.h>
#include <linux/mount.h>
#include <linux/mpage.h>
#include <linux/swap.h>
#include <linux/writeback.h>
#include <linux/statfs.h>
#include <linux/compat.h>
#include <linux/parser.h>
#include <linux/ctype.h>
#include <linux/namei.h>
#include <linux/miscdevice.h>
#include <linux/magic.h>
#include <linux/slab.h>
#include "compat.h"
#include "ctree.h"
#include "disk-io.h"
#include "transaction.h"
#include "btrfs_inode.h"
#include "ioctl.h"
#include "print-tree.h"
#include "xattr.h"
#include "volumes.h"
#include "version.h"
#include "export.h"
#include "compression.h"

static const struct super_operations btrfs_super_ops;

static void btrfs_put_super(struct super_block *sb)
{
	struct btrfs_root *root = btrfs_sb(sb);
	int ret;

	ret = close_ctree(root);
	sb->s_fs_info = NULL;
}

enum {
	Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum,
	Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd,
	Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress,
	Opt_compress_force, Opt_notreelog, Opt_ratio, Opt_flushoncommit,
	Opt_discard, Opt_err,
};

static match_table_t tokens = {
	{Opt_degraded, "degraded"},
	{Opt_subvol, "subvol=%s"},
	{Opt_subvolid, "subvolid=%d"},
	{Opt_device, "device=%s"},
	{Opt_nodatasum, "nodatasum"},
	{Opt_nodatacow, "nodatacow"},
	{Opt_nobarrier, "nobarrier"},
	{Opt_max_inline, "max_inline=%s"},
	{Opt_alloc_start, "alloc_start=%s"},
	{Opt_thread_pool, "thread_pool=%d"},
	{Opt_compress, "compress"},
	{Opt_compress_force, "compress-force"},
	{Opt_ssd, "ssd"},
	{Opt_ssd_spread, "ssd_spread"},
	{Opt_nossd, "nossd"},
	{Opt_noacl, "noacl"},
	{Opt_notreelog, "notreelog"},
	{Opt_flushoncommit, "flushoncommit"},
	{Opt_ratio, "metadata_ratio=%d"},
	{Opt_discard, "discard"},
	{Opt_err, NULL},
};

/*
 * Regular mount options parser.  Everything that is needed only when
 * reading in a new superblock is parsed here.
 */
int btrfs_parse_options(struct btrfs_root *root, char *options)
{
	struct btrfs_fs_info *info = root->fs_info;
	substring_t args[MAX_OPT_ARGS];
	char *p, *num, *orig;
	int intarg;
	int ret = 0;

	if (!options)
		return 0;

	/*
	 * strsep changes the string, duplicate it because parse_options
	 * gets called twice
	 */
	options = kstrdup(options, GFP_NOFS);
	if (!options)
		return -ENOMEM;

	orig = options;

	while ((p = strsep(&options, ",")) != NULL) {
		int token;
		if (!*p)
			continue;

		token = match_token(p, tokens, args);
		switch (token) {
		case Opt_degraded:
			printk(KERN_INFO "btrfs: allowing degraded mounts\n");
			btrfs_set_opt(info->mount_opt, DEGRADED);
			break;
		case Opt_subvol:
		case Opt_subvolid:
		case Opt_device:
			/*
			 * These are parsed by btrfs_parse_early_options
			 * and can be happily ignored here.
			 */
			break;
		case Opt_nodatasum:
			printk(KERN_INFO "btrfs: setting nodatasum\n");
			btrfs_set_opt(info->mount_opt, NODATASUM);
			break;
		case Opt_nodatacow:
			printk(KERN_INFO "btrfs: setting nodatacow\n");
			btrfs_set_opt(info->mount_opt, NODATACOW);
			btrfs_set_opt(info->mount_opt, NODATASUM);
			break;
		case Opt_compress:
			printk(KERN_INFO "btrfs: use compression\n");
			btrfs_set_opt(info->mount_opt, COMPRESS);
			break;
		case Opt_compress_force:
			printk(KERN_INFO "btrfs: forcing compression\n");
			btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
			btrfs_set_opt(info->mount_opt, COMPRESS);
			break;
		case Opt_ssd:
			printk(KERN_INFO "btrfs: use ssd allocation scheme\n");
			btrfs_set_opt(info->mount_opt, SSD);
			break;
		case Opt_ssd_spread:
			printk(KERN_INFO "btrfs: use spread ssd "
			       "allocation scheme\n");
			btrfs_set_opt(info->mount_opt, SSD);
			btrfs_set_opt(info->mount_opt, SSD_SPREAD);
			break;
		case Opt_nossd:
			printk(KERN_INFO "btrfs: not using ssd allocation "
			       "scheme\n");
			btrfs_set_opt(info->mount_opt, NOSSD);
			btrfs_clear_opt(info->mount_opt, SSD);
			btrfs_clear_opt(info->mount_opt, SSD_SPREAD);
			break;
		case Opt_nobarrier:
			printk(KERN_INFO "btrfs: turning off barriers\n");
			btrfs_set_opt(info->mount_opt, NOBARRIER);
			break;
		case Opt_thread_pool:
			intarg = 0;
			match_int(&args[0], &intarg);
			if (intarg) {
				info->thread_pool_size = intarg;
				printk(KERN_INFO "btrfs: thread pool %d\n",
				       info->thread_pool_size);
			}
			break;
		case Opt_max_inline:
			num = match_strdup(&args[0]);
			if (num) {
				info->max_inline = memparse(num, NULL);
				kfree(num);

				if (info->max_inline) {
					info->max_inline = max_t(u64,
						info->max_inline,
						root->sectorsize);
				}
				printk(KERN_INFO "btrfs: max_inline at %llu\n",
					(unsigned long long)info->max_inline);
			}
			break;
		case Opt_alloc_start:
			num = match_strdup(&args[0]);
			if (num) {
				info->alloc_start = memparse(num, NULL);
				kfree(num);
				printk(KERN_INFO
					"btrfs: allocations start at %llu\n",
					(unsigned long long)info->alloc_start);
			}
			break;
		case Opt_noacl:
			root->fs_info->sb->s_flags &= ~MS_POSIXACL;
			break;
		case Opt_notreelog:
			printk(KERN_INFO "btrfs: disabling tree log\n");
			btrfs_set_opt(info->mount_opt, NOTREELOG);
			break;
		case Opt_flushoncommit:
			printk(KERN_INFO "btrfs: turning on flush-on-commit\n");
			btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
			break;
		case Opt_ratio:
			intarg = 0;
			match_int(&args[0], &intarg);
			if (intarg) {
				info->metadata_ratio = intarg;
				printk(KERN_INFO "btrfs: metadata ratio %d\n",
				       info->metadata_ratio);
			}
			break;
		case Opt_discard:
			btrfs_set_opt(info->mount_opt, DISCARD);
			break;
		case Opt_err:
			printk(KERN_INFO "btrfs: unrecognized mount option "
			       "'%s'\n", p);
			ret = -EINVAL;
			goto out;
		default:
			break;
		}
	}
out:
	kfree(orig);
	return ret;
}

/*
 * Parse mount options that are required early in the mount process.
 *
 * All other options will be parsed on much later in the mount process and
 * only when we need to allocate a new super block.
 */
static int btrfs_parse_early_options(const char *options, fmode_t flags,
		void *holder, char **subvol_name, u64 *subvol_objectid,
		struct btrfs_fs_devices **fs_devices)
{
	substring_t args[MAX_OPT_ARGS];
	char *opts, *p;
	int error = 0;
	int intarg;

	if (!options)
		goto out;

	/*
	 * strsep changes the string, duplicate it because parse_options
	 * gets called twice
	 */
	opts = kstrdup(options, GFP_KERNEL);
	if (!opts)
		return -ENOMEM;

	while ((p = strsep(&opts, ",")) != NULL) {
		int token;
		if (!*p)
			continue;

		token = match_token(p, tokens, args);
		switch (token) {
		case Opt_subvol:
			*subvol_name = match_strdup(&args[0]);
			break;
		case Opt_subvolid:
			intarg = 0;
			error = match_int(&args[0], &intarg);
			if (!error) {
				/* we want the original fs_tree */
				if (!intarg)
					*subvol_objectid =
						BTRFS_FS_TREE_OBJECTID;
				else
					*subvol_objectid = intarg;
			}
			break;
		case Opt_device:
			error = btrfs_scan_one_device(match_strdup(&args[0]),
					flags, holder, fs_devices);
			if (error)
				goto out_free_opts;
			break;
		default:
			break;
		}
	}

 out_free_opts:
	kfree(opts);
 out:
	/*
	 * If no subvolume name is specified we use the default one.  Allocate
	 * a copy of the string "." here so that code later in the
	 * mount path doesn't care if it's the default volume or another one.
	 */
	if (!*subvol_name) {
		*subvol_name = kstrdup(".", GFP_KERNEL);
		if (!*subvol_name)
			return -ENOMEM;
	}
	return error;
}

static struct dentry *get_default_root(struct super_block *sb,
				       u64 subvol_objectid)
{
	struct btrfs_root *root = sb->s_fs_info;
	struct btrfs_root *new_root;
	struct btrfs_dir_item *di;
	struct btrfs_path *path;
	struct btrfs_key location;
	struct inode *inode;
	struct dentry *dentry;
	u64 dir_id;
	int new = 0;

	/*
	 * We have a specific subvol we want to mount, just setup location and
	 * go look up the root.
	 */
	if (subvol_objectid) {
		location.objectid = subvol_objectid;
		location.type = BTRFS_ROOT_ITEM_KEY;
		location.offset = (u64)-1;
		goto find_root;
	}

	path = btrfs_alloc_path();
	if (!path)
		return ERR_PTR(-ENOMEM);
	path->leave_spinning = 1;

	/*
	 * Find the "default" dir item which points to the root item that we
	 * will mount by default if we haven't been given a specific subvolume
	 * to mount.
	 */
	dir_id = btrfs_super_root_dir(&root->fs_info->super_copy);
	di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0);
	if (IS_ERR(di))
		return ERR_CAST(di);
	if (!di) {
		/*
		 * Ok the default dir item isn't there.  This is weird since
		 * it's always been there, but don't freak out, just try and
		 * mount to root most subvolume.
		 */
		btrfs_free_path(path);
		dir_id = BTRFS_FIRST_FREE_OBJECTID;
		new_root = root->fs_info->fs_root;
		goto setup_root;
	}

	btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
	btrfs_free_path(path);

find_root:
	new_root = btrfs_read_fs_root_no_name(root->fs_info, &location);
	if (IS_ERR(new_root))
		return ERR_PTR(PTR_ERR(new_root));

	if (btrfs_root_refs(&new_root->root_item) == 0)
		return ERR_PTR(-ENOENT);

	dir_id = btrfs_root_dirid(&new_root->root_item);
setup_root:
	location.objectid = dir_id;
	location.type = BTRFS_INODE_ITEM_KEY;
	location.offset = 0;

	inode = btrfs_iget(sb, &location, new_root, &new);
	if (IS_ERR(inode))
		return ERR_CAST(inode);

	/*
	 * If we're just mounting the root most subvol put the inode and return
	 * a reference to the dentry.  We will have already gotten a reference
	 * to the inode in btrfs_fill_super so we're good to go.
	 */
	if (!new && sb->s_root->d_inode == inode) {
		iput(inode);
		return dget(sb->s_root);
	}

	if (new) {
		const struct qstr name = { .name = "/", .len = 1 };

		/*
		 * New inode, we need to make the dentry a sibling of s_root so
		 * everything gets cleaned up properly on unmount.
		 */
		dentry = d_alloc(sb->s_root, &name);
		if (!dentry) {
			iput(inode);
			return ERR_PTR(-ENOMEM);
		}
		d_splice_alias(inode, dentry);
	} else {
		/*
		 * We found the inode in cache, just find a dentry for it and
		 * put the reference to the inode we just got.
		 */
		dentry = d_find_alias(inode);
		iput(inode);
	}

	return dentry;
}

static int btrfs_fill_super(struct super_block *sb,
			    struct btrfs_fs_devices *fs_devices,
			    void *data, int silent)
{
	struct inode *inode;
	struct dentry *root_dentry;
	struct btrfs_super_block *disk_super;
	struct btrfs_root *tree_root;
	struct btrfs_key key;
	int err;

	sb->s_maxbytes = MAX_LFS_FILESIZE;
	sb->s_magic = BTRFS_SUPER_MAGIC;
	sb->s_op = &btrfs_super_ops;
	sb->s_export_op = &btrfs_export_ops;
	sb->s_xattr = btrfs_xattr_handlers;
	sb->s_time_gran = 1;
#ifdef CONFIG_BTRFS_FS_POSIX_ACL
	sb->s_flags |= MS_POSIXACL;
#endif

	tree_root = open_ctree(sb, fs_devices, (char *)data);

	if (IS_ERR(tree_root)) {
		printk("btrfs: open_ctree failed\n");
		return PTR_ERR(tree_root);
	}
	sb->s_fs_info = tree_root;
	disk_super = &tree_root->fs_info->super_copy;

	key.objectid = BTRFS_FIRST_FREE_OBJECTID;
	key.type = BTRFS_INODE_ITEM_KEY;
	key.offset = 0;
	inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root, NULL);
	if (IS_ERR(inode)) {
		err = PTR_ERR(inode);
		goto fail_close;
	}

	root_dentry = d_alloc_root(inode);
	if (!root_dentry) {
		iput(inode);
		err = -ENOMEM;
		goto fail_close;
	}

	sb->s_root = root_dentry;

	save_mount_options(sb, data);
	return 0;

fail_close:
	close_ctree(tree_root);
	return err;
}

int btrfs_sync_fs(struct super_block *sb, int wait)
{
	struct btrfs_trans_handle *trans;
	struct btrfs_root *root = btrfs_sb(sb);
	int ret;

	if (!wait) {
		filemap_flush(root->fs_info->btree_inode->i_mapping);
		return 0;
	}

	btrfs_start_delalloc_inodes(root, 0);
	btrfs_wait_ordered_extents(root, 0, 0);

	trans = btrfs_start_transaction(root, 0);
	ret = btrfs_commit_transaction(trans, root);
	return ret;
}

static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
{
	struct btrfs_root *root = btrfs_sb(vfs->mnt_sb);
	struct btrfs_fs_info *info = root->fs_info;

	if (btrfs_test_opt(root, DEGRADED))
		seq_puts(seq, ",degraded");
	if (btrfs_test_opt(root, NODATASUM))
		seq_puts(seq, ",nodatasum");
	if (btrfs_test_opt(root, NODATACOW))
		seq_puts(seq, ",nodatacow");
	if (btrfs_test_opt(root, NOBARRIER))
		seq_puts(seq, ",nobarrier");
	if (info->max_inline != 8192 * 1024)
		seq_printf(seq, ",max_inline=%llu",
			   (unsigned long long)info->max_inline);
	if (info->alloc_start != 0)
		seq_printf(seq, ",alloc_start=%llu",
			   (unsigned long long)info->alloc_start);
	if (info->thread_pool_size !=  min_t(unsigned long,
					     num_online_cpus() + 2, 8))
		seq_printf(seq, ",thread_pool=%d", info->thread_pool_size);
	if (btrfs_test_opt(root, COMPRESS))
		seq_puts(seq, ",compress");
	if (btrfs_test_opt(root, NOSSD))
		seq_puts(seq, ",nossd");
	if (btrfs_test_opt(root, SSD_SPREAD))
		seq_puts(seq, ",ssd_spread");
	else if (btrfs_test_opt(root, SSD))
		seq_puts(seq, ",ssd");
	if (btrfs_test_opt(root, NOTREELOG))
		seq_puts(seq, ",notreelog");
	if (btrfs_test_opt(root, FLUSHONCOMMIT))
		seq_puts(seq, ",flushoncommit");
	if (btrfs_test_opt(root, DISCARD))
		seq_puts(seq, ",discard");
	if (!(root->fs_info->sb->s_flags & MS_POSIXACL))
		seq_puts(seq, ",noacl");
	return 0;
}

static int btrfs_test_super(struct super_block *s, void *data)
{
	struct btrfs_fs_devices *test_fs_devices = data;
	struct btrfs_root *root = btrfs_sb(s);

	return root->fs_info->fs_devices == test_fs_devices;
}

/*
 * Find a superblock for the given device / mount point.
 *
 * Note:  This is based on get_sb_bdev from fs/super.c with a few additions
 *	  for multiple device setup.  Make sure to keep it in sync.
 */
static int btrfs_get_sb(struct file_system_type *fs_type, int flags,
		const char *dev_name, void *data, struct vfsmount *mnt)
{
	struct block_device *bdev = NULL;
	struct super_block *s;
	struct dentry *root;
	struct btrfs_fs_devices *fs_devices = NULL;
	fmode_t mode = FMODE_READ;
	char *subvol_name = NULL;
	u64 subvol_objectid = 0;
	int error = 0;
	int found = 0;

	if (!(flags & MS_RDONLY))
		mode |= FMODE_WRITE;

	error = btrfs_parse_early_options(data, mode, fs_type,
					  &subvol_name, &subvol_objectid,
					  &fs_devices);
	if (error)
		return error;

	error = btrfs_scan_one_device(dev_name, mode, fs_type, &fs_devices);
	if (error)
		goto error_free_subvol_name;

	error = btrfs_open_devices(fs_devices, mode, fs_type);
	if (error)
		goto error_free_subvol_name;

	if (!(flags & MS_RDONLY) && fs_devices->rw_devices == 0) {
		error = -EACCES;
		goto error_close_devices;
	}

	bdev = fs_devices->latest_bdev;
	s = sget(fs_type, btrfs_test_super, set_anon_super, fs_devices);
	if (IS_ERR(s))
		goto error_s;

	if (s->s_root) {
		if ((flags ^ s->s_flags) & MS_RDONLY) {
			deactivate_locked_super(s);
			error = -EBUSY;
			goto error_close_devices;
		}

		found = 1;
		btrfs_close_devices(fs_devices);
	} else {
		char b[BDEVNAME_SIZE];

		s->s_flags = flags;
		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
		error = btrfs_fill_super(s, fs_devices, data,
					 flags & MS_SILENT ? 1 : 0);
		if (error) {
			deactivate_locked_super(s);
			goto error_free_subvol_name;
		}

		btrfs_sb(s)->fs_info->bdev_holder = fs_type;
		s->s_flags |= MS_ACTIVE;
	}

	root = get_default_root(s, subvol_objectid);
	if (IS_ERR(root)) {
		error = PTR_ERR(root);
		deactivate_locked_super(s);
		goto error;
	}
	/* if they gave us a subvolume name bind mount into that */
	if (strcmp(subvol_name, ".")) {
		struct dentry *new_root;
		mutex_lock(&root->d_inode->i_mutex);
		new_root = lookup_one_len(subvol_name, root,
				      strlen(subvol_name));
		mutex_unlock(&root->d_inode->i_mutex);

		if (IS_ERR(new_root)) {
			deactivate_locked_super(s);
			error = PTR_ERR(new_root);
			dput(root);
			goto error_close_devices;
		}
		if (!new_root->d_inode) {
			dput(root);
			dput(new_root);
			deactivate_locked_super(s);
			error = -ENXIO;
			goto error_close_devices;
		}
		dput(root);
		root = new_root;
	}

	mnt->mnt_sb = s;
	mnt->mnt_root = root;

	kfree(subvol_name);
	return 0;

error_s:
	error = PTR_ERR(s);
error_close_devices:
	btrfs_close_devices(fs_devices);
error_free_subvol_name:
	kfree(subvol_name);
error:
	return error;
}

static int btrfs_remount(struct super_block *sb, int *flags, char *data)
{
	struct btrfs_root *root = btrfs_sb(sb);
	int ret;

	ret = btrfs_parse_options(root, data);
	if (ret)
		return -EINVAL;

	if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
		return 0;

	if (*flags & MS_RDONLY) {
		sb->s_flags |= MS_RDONLY;

		ret =  btrfs_commit_super(root);
		WARN_ON(ret);
	} else {
		if (root->fs_info->fs_devices->rw_devices == 0)
			return -EACCES;

		if (btrfs_super_log_root(&root->fs_info->super_copy) != 0)
			return -EINVAL;

		ret = btrfs_cleanup_fs_roots(root->fs_info);
		WARN_ON(ret);

		/* recover relocation */
		ret = btrfs_recover_relocation(root);
		WARN_ON(ret);

		sb->s_flags &= ~MS_RDONLY;
	}

	return 0;
}

static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
	struct btrfs_root *root = btrfs_sb(dentry->d_sb);
	struct btrfs_super_block *disk_super = &root->fs_info->super_copy;
	struct list_head *head = &root->fs_info->space_info;
	struct btrfs_space_info *found;
	u64 total_used = 0;
	int bits = dentry->d_sb->s_blocksize_bits;
	__be32 *fsid = (__be32 *)root->fs_info->fsid;

	rcu_read_lock();
	list_for_each_entry_rcu(found, head, list)
		total_used += found->disk_used;
	rcu_read_unlock();

	buf->f_namelen = BTRFS_NAME_LEN;
	buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits;
	buf->f_bfree = buf->f_blocks - (total_used >> bits);
	buf->f_bavail = buf->f_bfree;
	buf->f_bsize = dentry->d_sb->s_blocksize;
	buf->f_type = BTRFS_SUPER_MAGIC;

	/* We treat it as constant endianness (it doesn't matter _which_)
	   because we want the fsid to come out the same whether mounted
	   on a big-endian or little-endian host */
	buf->f_fsid.val[0] = be32_to_cpu(fsid[0]) ^ be32_to_cpu(fsid[2]);
	buf->f_fsid.val[1] = be32_to_cpu(fsid[1]) ^ be32_to_cpu(fsid[3]);
	/* Mask in the root object ID too, to disambiguate subvols */
	buf->f_fsid.val[0] ^= BTRFS_I(dentry->d_inode)->root->objectid >> 32;
	buf->f_fsid.val[1] ^= BTRFS_I(dentry->d_inode)->root->objectid;

	return 0;
}

static struct file_system_type btrfs_fs_type = {
	.owner		= THIS_MODULE,
	.name		= "btrfs",
	.get_sb		= btrfs_get_sb,
	.kill_sb	= kill_anon_super,
	.fs_flags	= FS_REQUIRES_DEV,
};

/*
 * used by btrfsctl to scan devices when no FS is mounted
 */
static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
				unsigned long arg)
{
	struct btrfs_ioctl_vol_args *vol;
	struct btrfs_fs_devices *fs_devices;
	int ret = -ENOTTY;

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	vol = memdup_user((void __user *)arg, sizeof(*vol));
	if (IS_ERR(vol))
		return PTR_ERR(vol);

	switch (cmd) {
	case BTRFS_IOC_SCAN_DEV:
		ret = btrfs_scan_one_device(vol->name, FMODE_READ,
					    &btrfs_fs_type, &fs_devices);
		break;
	}

	kfree(vol);
	return ret;
}

static int btrfs_freeze(struct super_block *sb)
{
	struct btrfs_root *root = btrfs_sb(sb);
	mutex_lock(&root->fs_info->transaction_kthread_mutex);
	mutex_lock(&root->fs_info->cleaner_mutex);
	return 0;
}

static int btrfs_unfreeze(struct super_block *sb)
{
	struct btrfs_root *root = btrfs_sb(sb);
	mutex_unlock(&root->fs_info->cleaner_mutex);
	mutex_unlock(&root->fs_info->transaction_kthread_mutex);
	return 0;
}

static const struct super_operations btrfs_super_ops = {
	.drop_inode	= btrfs_drop_inode,
	.evict_inode	= btrfs_evict_inode,
	.put_super	= btrfs_put_super,
	.sync_fs	= btrfs_sync_fs,
	.show_options	= btrfs_show_options,
	.write_inode	= btrfs_write_inode,
	.dirty_inode	= btrfs_dirty_inode,
	.alloc_inode	= btrfs_alloc_inode,
	.destroy_inode	= btrfs_destroy_inode,
	.statfs		= btrfs_statfs,
	.remount_fs	= btrfs_remount,
	.freeze_fs	= btrfs_freeze,
	.unfreeze_fs	= btrfs_unfreeze,
};

static const struct file_operations btrfs_ctl_fops = {
	.unlocked_ioctl	 = btrfs_control_ioctl,
	.compat_ioctl = btrfs_control_ioctl,
	.owner	 = THIS_MODULE,
};