aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/scripts/python/bin
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert@linux-m68k.org>2011-10-28 06:53:32 -0400
committerDavid S. Miller <davem@davemloft.net>2011-10-28 17:06:56 -0400
commit3ddb709af32bacaf78d124420404d1ac19be99b8 (patch)
tree60f603094ddb3ab6f63c561800b138ae965a5955 /tools/perf/scripts/python/bin
parent7011687f0f2f12cc348f6a693fafe63d89167eac (diff)
i825xx: Fix incorrect dependency for BVME6000_NET
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org> Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'tools/perf/scripts/python/bin')
0 files changed, 0 insertions, 0 deletions
s-rt.git/commit/fs/open.c?id=1da177e4c3f41524e886b7f1b8a0c1fc7321cac2'>1da177e4c3f4
ef3daeda7b58
1da177e4c3f4

ab2af1f50050
73241ccca0f7
97ac73506c0b
5ad4e53bd540
b65a9cfc2c38
2dfc1cae4c42
3f6d078d4acc
1da177e4c3f4
e81e3f4dca6c

4a30131e7dbb

1da177e4c3f4
939a9421eb53
1da177e4c3f4






4a30131e7dbb
cc4e69dee4a0



1da177e4c3f4
7b82dc0e64e9
939a9421eb53


7b82dc0e64e9
1b1dcc1b57a4
27ac0ffeac80

1b1dcc1b57a4
939a9421eb53
1da177e4c3f4

a02de9608595
1da177e4c3f4
2d8f30380ab8
a02de9608595
1da177e4c3f4
a02de9608595
1da177e4c3f4

1da177e4c3f4
a02de9608595
1da177e4c3f4
a02de9608595
1da177e4c3f4
a02de9608595
1da177e4c3f4
a02de9608595
1da177e4c3f4
256984a83880
9ac9b8474c39

1da177e4c3f4

c82e42da8a6b
9ac9b8474c39
1da177e4c3f4
9700382c3c9f
1da177e4c3f4
9ac9b8474c39
1da177e4c3f4
9700382c3c9f



8737c9305bd5
1da177e4c3f4
9700382c3c9f
1da177e4c3f4

be6d3e56a6b9
a02de9608595
907f4554e252
a02de9608595
1da177e4c3f4
9700382c3c9f

9ac9b8474c39
a02de9608595
1da177e4c3f4


a02de9608595



48f7530d3f72
a02de9608595





48f7530d3f72

a02de9608595



48f7530d3f72



a02de9608595

1da177e4c3f4
4fd8da8d6241
1da177e4c3f4
4fd8da8d6241
1da177e4c3f4

3f6d078d4acc






b01ec0ef63e9
1da177e4c3f4
bf2965d5b595
1da177e4c3f4
2903ff019b34
1da177e4c3f4





2903ff019b34

1da177e4c3f4


2903ff019b34
1da177e4c3f4

2903ff019b34
1da177e4c3f4

2903ff019b34
1da177e4c3f4










14da9200140f
2903ff019b34
1da177e4c3f4
2903ff019b34
be6d3e56a6b9
2903ff019b34
14da9200140f
1da177e4c3f4
2903ff019b34
1da177e4c3f4



bdc480e3bef6
1da177e4c3f4
2cf096668343
1da177e4c3f4

3f6d078d4acc






1da177e4c3f4

4a0fd5bf0fd0
1da177e4c3f4



4a0fd5bf0fd0
1da177e4c3f4
2cf096668343
1da177e4c3f4
6673e0c3fbea
1da177e4c3f4
3e63cbb1efca
72c72bdf7bf5
97ac73506c0b
496ad9aa8ef4
3e63cbb1efca
97ac73506c0b

3e63cbb1efca
97ac73506c0b

dd46c787788d
409332b65d3e




79124f18b335




3e63cbb1efca
97ac73506c0b
00f5e61998dd




dd46c787788d




97ac73506c0b
3e63cbb1efca
1ca551c6caae
00f5e61998dd
8fc61d92630d
00f5e61998dd
8fc61d92630d
1ca551c6caae




97ac73506c0b
6d2b6170c891
0790b31b6937

6d2b6170c891
0790b31b6937

97ac73506c0b




3e63cbb1efca
97ac73506c0b
97ac73506c0b
3e63cbb1efca
97ac73506c0b
97ac73506c0b




3e63cbb1efca
97ac73506c0b
97ac73506c0b

3e63cbb1efca
97ac73506c0b
2fe17c107583
3e63cbb1efca
97ac73506c0b
14da9200140f

820c12d5d6c0










14da9200140f

3e63cbb1efca
72c72bdf7bf5
3e63cbb1efca
4a0fd5bf0fd0
3e63cbb1efca
2903ff019b34
3e63cbb1efca

2903ff019b34
72c72bdf7bf5
2903ff019b34
3e63cbb1efca
3e63cbb1efca
97ac73506c0b
3e63cbb1efca
1da177e4c3f4




6559eed8ca7d
1da177e4c3f4
d84f4f992cbd

2d8f30380ab8
256984a83880
1da177e4c3f4
87fa55952b73
1da177e4c3f4



d84f4f992cbd


1da177e4c3f4
d84f4f992cbd

1da177e4c3f4
086f7316f0d4
1cdcbec1a337
18815a180853

d84f4f992cbd
086f7316f0d4
d84f4f992cbd

086f7316f0d4
1da177e4c3f4
d84f4f992cbd
87fa55952b73

6902d925d568


2d8f30380ab8
256984a83880

30524472c2f7




2d8f30380ab8
30524472c2f7


256984a83880
6902d925d568
256984a83880
6902d925d568
2f676cbc0d60









2d8f30380ab8
6902d925d568
1da177e4c3f4
6902d925d568
2d8f30380ab8
87fa55952b73



6902d925d568
d84f4f992cbd

1da177e4c3f4


ca013e945b1b
5590ff0d5528



3cdad42884bb
1da177e4c3f4
2d8f30380ab8
1da177e4c3f4
0291c0a551d5


1da177e4c3f4


9cfcac810e89
1da177e4c3f4


2d8f30380ab8
1da177e4c3f4

2d8f30380ab8
0291c0a551d5



1da177e4c3f4



3cdad42884bb
1da177e4c3f4
2903ff019b34
1da177e4c3f4
2903ff019b34
1da177e4c3f4

2903ff019b34
1da177e4c3f4

496ad9aa8ef4
1da177e4c3f4




9cfcac810e89
1da177e4c3f4
2903ff019b34
1da177e4c3f4
2903ff019b34
1da177e4c3f4



3480b25743cb
1da177e4c3f4
2d8f30380ab8
1da177e4c3f4
2771261ec5b6


1da177e4c3f4


9cfcac810e89
1da177e4c3f4



c7b96acf1456
1da177e4c3f4
8b8efb44033c


1da177e4c3f4
2d8f30380ab8
1da177e4c3f4

2d8f30380ab8
2771261ec5b6



1da177e4c3f4



e57712ebebbb
1da177e4c3f4
e57712ebebbb
27ac0ffeac80
1da177e4c3f4
e57712ebebbb
1da177e4c3f4
e57712ebebbb


27ac0ffeac80
fe542cf59bf0
cdcf116d44e7
e57712ebebbb
fe542cf59bf0
1da177e4c3f4

27ac0ffeac80
fe542cf59bf0
1b1dcc1b57a4
27ac0ffeac80




e57712ebebbb



49f0a0767211
e57712ebebbb
173c84012a59
e57712ebebbb

173c84012a59
9f45f5bf302d
173c84012a59

e57712ebebbb
1da177e4c3f4


49f0a0767211
1da177e4c3f4
2d8f30380ab8
1da177e4c3f4
14ff690c0f94


e57712ebebbb


14ff690c0f94



e57712ebebbb
1da177e4c3f4


49f0a0767211
5590ff0d5528



fe542cf59bf0
1da177e4c3f4
fe542cf59bf0
27ac0ffeac80
1da177e4c3f4

52137abe1820




1da177e4c3f4
c1b8940b42bb
1da177e4c3f4

52137abe1820

1da177e4c3f4
52137abe1820
1da177e4c3f4

52137abe1820

1da177e4c3f4
52137abe1820
1da177e4c3f4

b53767719b6c

1b1dcc1b57a4
d2b31ca644fd
fe542cf59bf0
27ac0ffeac80
1b1dcc1b57a4
27ac0ffeac80




1da177e4c3f4


6559eed8ca7d

5590ff0d5528
2d8f30380ab8
5590ff0d5528
65cfc6722361
5590ff0d5528
65cfc6722361
5590ff0d5528

65cfc6722361


99a5df37a03c
65cfc6722361
6902d925d568

2d8f30380ab8
2af482a7edfb

fe542cf59bf0
2d8f30380ab8
2af482a7edfb
2d8f30380ab8
99a5df37a03c



5590ff0d5528



55e4def0a6e7
1da177e4c3f4
55e4def0a6e7

1da177e4c3f4
55e4def0a6e7



1da177e4c3f4

ca013e945b1b
1da177e4c3f4
2903ff019b34
1da177e4c3f4

2903ff019b34
6902d925d568

2903ff019b34
2af482a7edfb

9f45f5bf302d
2903ff019b34

2af482a7edfb
2903ff019b34
6902d925d568
1da177e4c3f4


90ad1a8ecb9b



e748dcd095dd
90ad1a8ecb9b
90ad1a8ecb9b



02e5180d991f
96b7e579addd

1da177e4c3f4
1abf0c718f15
1da177e4c3f4


5300990c0370
a1a5b3d93ca4
1abf0c718f15
b5bcdda32736
dd37978c50bc
1da177e4c3f4
1da177e4c3f4
3f4d5a00076b

1abf0c718f15
96b7e579addd
1abf0c718f15

dd20908a8a06
0ccb286346c4
3f4d5a00076b
1da177e4c3f4
0ccb286346c4
3f4d5a00076b
0ccb286346c4


83f936c75e36
1da177e4c3f4

9c225f2655e3



1abf0c718f15
72c2d5319200



1abf0c718f15
83d498569e9a
788e7dd4c22e


f3c7691e8d30



72c2d5319200
834f2a4a1554


1da177e4c3f4


890275b5eb79

293bc9822fa9
8436318205b9
7f7f25e82d54
293bc9822fa9
8436318205b9
7f7f25e82d54
834f2a4a1554
1da177e4c3f4



96b7e579addd
1da177e4c3f4


83f936c75e36
1da177e4c3f4
83f936c75e36
4a3fd211ccfc
1da177e4c3f4
02e5180d991f


dd37978c50bc
96b7e579addd
1da177e4c3f4

834f2a4a1554
d18e9008c377
0854d450e229
d18e9008c377

0854d450e229
d18e9008c377




0854d450e229








d18e9008c377
30d904947459


d18e9008c377
96b7e579addd
3d8a00d2099e
d18e9008c377
b5bcdda32736
02e5180d991f
96b7e579addd
47237687d73c
d18e9008c377
96b7e579addd
d18e9008c377





0854d450e229
d18e9008c377


0854d450e229





d18e9008c377
e45198a6ac24
d18e9008c377
30d904947459
e45198a6ac24
d18e9008c377


765927b2d508
745ca2475a6a
a1a5b3d93ca4



e0e817392b9a

c212f9aaf910
765927b2d508
322ee5b36eac
a1a5b3d93ca4
1afc99beaf0f

4aa7c6346be3
1afc99beaf0f








2a027e7a1873

2a027e7a1873

a1a5b3d93ca4
1da177e4c3f4

4aa7c6346be3



















a218d0fdc5f9
47c805dc2d2d



e305f48bc453
e68726ff72cf


47c805dc2d2d

c6f3d8111598
47c805dc2d2d









bb458c644a59

60545d0d4610

ba57ea64cb18

60545d0d4610




1abf0c718f15




47c805dc2d2d
1abf0c718f15
47c805dc2d2d











1abf0c718f15

47c805dc2d2d









f9652e10c12b

47c805dc2d2d


669abf4e5539












f9652e10c12b

669abf4e5539


47c805dc2d2d









a218d0fdc5f9
47c805dc2d2d
516891041383







47c805dc2d2d


73d049a40fc6



f9652e10c12b


73d049a40fc6

f9652e10c12b
73d049a40fc6


a218d0fdc5f9
1da177e4c3f4
47c805dc2d2d
f9652e10c12b


















1da177e4c3f4
1da177e4c3f4
f9652e10c12b
1da177e4c3f4
1da177e4c3f4
e922efc342d5
a218d0fdc5f9
e922efc342d5



2cf096668343
e922efc342d5
1da177e4c3f4
6559eed8ca7d
a218d0fdc5f9
5590ff0d5528



2cf096668343
5590ff0d5528
5590ff0d5528
1da177e4c3f4





a218d0fdc5f9
1da177e4c3f4











45778ca819ac
1da177e4c3f4


45778ca819ac
1da177e4c3f4

72c2d5319200
75e1fcc0b18d
1da177e4c3f4
1abf0c718f15



1da177e4c3f4










ca013e945b1b
1da177e4c3f4
483ce1d4b8c3
ee731f4f7880








1da177e4c3f4
1da177e4c3f4





ca013e945b1b
1da177e4c3f4

2cb5998b5f0c
1da177e4c3f4













a9c62a18a291
1da177e4c3f4






06b1e104b7ea


1da177e4c3f4







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
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143







                                            
                       
                          
                           
                         


                              
                             
                             

                           
                        
                       

                        
                              

                           
                           
                        
                         
                            
                      
                          
                         
 

                     

                                                                              
 
                






                                                                                
                                                   



                                               
 
                                              


                                                      
 
                                              

                                                                      
                                                
                   

 
                                                   
 
                            
                   
 
                                      

                                                                            
                                   
                               
                                    
                               
 
                                          
                  
                         
 
                                                   

                                            

                       
                             
                                            
 
                                        
                  
                                            
 



                                                                           
                                             
                  
                                       

                                                           
                   
                                                     
                   
                                                                   
 

                                
                       
                                  


                     



                                                                       
                                                  





                                                       

                                                                      



                                                    



                                                

                     
 
                                                                  
 
                                             

 






                                                                                 
                                                                       
 
                            
                              
                    





                         

                      


                                                                
                                          

                          
                                       

                                
                                                                       










                                                                         
                                    
                                                             
                   
                                                                
                   
                                                                                   
                                  
         
                 



                     
                                                                   
 
                                               

 






                                                                           

                                                                 
                                                                      



                                             
                                                              
 
                                               
 
                                
 
 
                                                                         
 
                                               
                 

                                   
                               

                                                   
                                             




                                                                     




                                                
                                   
 




                                                             




                                                           
                                          
                              
 
          
                                                                
           
                                                              




                                
          
                                                                        

                               
                                

          




                                                                        
                           
 
                                    
                               
 




                                                                         
                               
 

                                                                               
                              
 
                                   
                                   
 

                                                             










                                                                               

                                  
 
                                 
 
                                                                           
 
                                

                           
                     
                                                                 
                         
         
                     
 
 




                                                                     
                                                                              
 

                                    
                         
                            
                
                                                  



                                                                     


                                        
 

                                                  
 
                                                
                                                                            

                                                                       
                                                                
                    

                                                             
         
 
                                                 

                                                               


                         
                                     

                                                          




                                                                           
                                                     


                                              
                                                         
                                                          
                                                                    
                                      









                                                              
                                        
                             
 
                 
                        



                                              
    

                                


                   
                                                                 



                                                       
                                                     
 
                         
                  


                                                                      


                         
                                                                             


                                  
                                       

             
                        



                                                



                     
                                         
 
                                    
                            
                           

                       
                    

                         
                                   




                                    
                                                              
                   
                                                         
         
                 



                     
                                                      
 
                         
                  


                                                                      


                         
                                                                             



                                  
                                                           
                                  


                                            
 
                                        

                  
                        



                                                



                     
                                                        
 
                                                    
                                             
                              
                  
 


                                          
            
                                    
                                                
                  
                                

                                                                             
                                                                         
           
                                      




                                                           



                                  
                                                        
 
                                

                         
                     
                                   

                                                          
         


                   
                                                                                 
 
                         
                  


                                                                 


                                                  



                                                        
         


                     
                                                                    



                                                      
                                                                   
 
                                                    
                                             

                              




                                                  
 
            

                                        

                                       
                                              
                                      

                                  

                                       
                                              
                                      

                                    

                                                                         
                                    
                                                    
                   
                                                                                 
                                      




                                                           


                     

                                                                               
 
                         
                            
                         
 
                                                                 

                         


                                                                        
      
                                                                 

                         
                                         

                                 
                                                 
                                 
            
                        



                                                



                     
                                                                                
 

                                                                
 



                                                                                 

 
                                                                    
 
                                

                           
                    

                         
                                            

                              
                           

                                                           
         
                 
    


                     



                                                                        
                                                                            
                                       



                 
                                         

                                                                     
 
                                                            


                            
                                                          
                                                           
 
                             
                                                       
                                        
 

                                            
                                      
                         

         
                                                                      
                                                
                                    
                                          
                                                        
                                      


                                                
                                          

         



                                                  
                                         



                                          
 
                                            


                                 



                                               
                  


                                       


                                         

                                                                   
                                       
                                                         
                                            
                                        
                                                           
                                             
 



                                                                    
                 


                          
                                       
                                        
                                                
         
             


                                
                          
                     

 
   
                                      
                      

                             
                         




                                                                           








                                                                                
   


                                                           
 
                  
                                                                          
 
                                     
                                                           
                   
                                       
 
                     





                                                                   
                      


                                                                                





                                                                               
   
                                                            
 
                                     
                 


                              
                                                            
                                                 



                       

                             
                                                           
                           
 
                             

                                   
                                                








                                                                        

                                           

                 
 

                           



















                                                                          
                                                                                  



                             
                                            


                                                        

                                            
                                              









                                                                             

                                                          

                                                      

                                            




                                                                         




                                                           
 
                              











                                                                         

                                                      









                                                  

                                        


   












                                                                           

                                                                      


   









                                                                     
                                                                     
 







                                                         


                         



                                                                        


                                                  

                                        
                                                             


                              
                                                                               
 
                             


















                                                             
                 
         
                     
                  
 
 
                                                                               



                                     
                                                            
 
 
                                                                            
                              



                                     
                                                       
 
 





                                                          
                                                                    











                                                                      
                       


                                                                 
                         

         
                              
                                                     
 



                                                   










                                                                   
                                        
 
                                                    








                                                                              
 





                                                                    
                        

                                          
                                   













                                                                               
                                  






                                                      


                                                                         







                                                                    
/*
 *  linux/fs/open.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

#include <linux/string.h>
#include <linux/mm.h>
#include <linux/file.h>
#include <linux/fdtable.h>
#include <linux/fsnotify.h>
#include <linux/module.h>
#include <linux/tty.h>
#include <linux/namei.h>
#include <linux/backing-dev.h>
#include <linux/capability.h>
#include <linux/securebits.h>
#include <linux/security.h>
#include <linux/mount.h>
#include <linux/fcntl.h>
#include <linux/slab.h>
#include <asm/uaccess.h>
#include <linux/fs.h>
#include <linux/personality.h>
#include <linux/pagemap.h>
#include <linux/syscalls.h>
#include <linux/rcupdate.h>
#include <linux/audit.h>
#include <linux/falloc.h>
#include <linux/fs_struct.h>
#include <linux/ima.h>
#include <linux/dnotify.h>
#include <linux/compat.h>

#include "internal.h"

int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
	struct file *filp)
{
	int ret;
	struct iattr newattrs;

	/* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
	if (length < 0)
		return -EINVAL;

	newattrs.ia_size = length;
	newattrs.ia_valid = ATTR_SIZE | time_attrs;
	if (filp) {
		newattrs.ia_file = filp;
		newattrs.ia_valid |= ATTR_FILE;
	}

	/* Remove suid/sgid on truncate too */
	ret = should_remove_suid(dentry);
	if (ret)
		newattrs.ia_valid |= ret | ATTR_FORCE;

	mutex_lock(&dentry->d_inode->i_mutex);
	/* Note any delegations or leases have already been broken: */
	ret = notify_change(dentry, &newattrs, NULL);
	mutex_unlock(&dentry->d_inode->i_mutex);
	return ret;
}

long vfs_truncate(struct path *path, loff_t length)
{
	struct inode *inode;
	long error;

	inode = path->dentry->d_inode;

	/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
	if (S_ISDIR(inode->i_mode))
		return -EISDIR;
	if (!S_ISREG(inode->i_mode))
		return -EINVAL;

	error = mnt_want_write(path->mnt);
	if (error)
		goto out;

	error = inode_permission(inode, MAY_WRITE);
	if (error)
		goto mnt_drop_write_and_out;

	error = -EPERM;
	if (IS_APPEND(inode))
		goto mnt_drop_write_and_out;

	error = get_write_access(inode);
	if (error)
		goto mnt_drop_write_and_out;

	/*
	 * Make sure that there are no leases.  get_write_access() protects
	 * against the truncate racing with a lease-granting setlease().
	 */
	error = break_lease(inode, O_WRONLY);
	if (error)
		goto put_write_and_out;

	error = locks_verify_truncate(inode, NULL, length);
	if (!error)
		error = security_path_truncate(path);
	if (!error)
		error = do_truncate(path->dentry, length, 0, NULL);

put_write_and_out:
	put_write_access(inode);
mnt_drop_write_and_out:
	mnt_drop_write(path->mnt);
out:
	return error;
}
EXPORT_SYMBOL_GPL(vfs_truncate);

static long do_sys_truncate(const char __user *pathname, loff_t length)
{
	unsigned int lookup_flags = LOOKUP_FOLLOW;
	struct path path;
	int error;

	if (length < 0)	/* sorry, but loff_t says... */
		return -EINVAL;

retry:
	error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
	if (!error) {
		error = vfs_truncate(&path, length);
		path_put(&path);
	}
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
	return error;
}

SYSCALL_DEFINE2(truncate, const char __user *, path, long, length)
{
	return do_sys_truncate(path, length);
}

#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, path, compat_off_t, length)
{
	return do_sys_truncate(path, length);
}
#endif

static long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
{
	struct inode *inode;
	struct dentry *dentry;
	struct fd f;
	int error;

	error = -EINVAL;
	if (length < 0)
		goto out;
	error = -EBADF;
	f = fdget(fd);
	if (!f.file)
		goto out;

	/* explicitly opened as large or we are on 64-bit box */
	if (f.file->f_flags & O_LARGEFILE)
		small = 0;

	dentry = f.file->f_path.dentry;
	inode = dentry->d_inode;
	error = -EINVAL;
	if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE))
		goto out_putf;

	error = -EINVAL;
	/* Cannot ftruncate over 2^31 bytes without large file support */
	if (small && length > MAX_NON_LFS)
		goto out_putf;

	error = -EPERM;
	if (IS_APPEND(inode))
		goto out_putf;

	sb_start_write(inode->i_sb);
	error = locks_verify_truncate(inode, f.file, length);
	if (!error)
		error = security_path_truncate(&f.file->f_path);
	if (!error)
		error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file);
	sb_end_write(inode->i_sb);
out_putf:
	fdput(f);
out:
	return error;
}

SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
{
	return do_sys_ftruncate(fd, length, 1);
}

#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length)
{
	return do_sys_ftruncate(fd, length, 1);
}
#endif

/* LFS versions of truncate are only needed on 32 bit machines */
#if BITS_PER_LONG == 32
SYSCALL_DEFINE2(truncate64, const char __user *, path, loff_t, length)
{
	return do_sys_truncate(path, length);
}

SYSCALL_DEFINE2(ftruncate64, unsigned int, fd, loff_t, length)
{
	return do_sys_ftruncate(fd, length, 0);
}
#endif /* BITS_PER_LONG == 32 */


int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
{
	struct inode *inode = file_inode(file);
	long ret;

	if (offset < 0 || len <= 0)
		return -EINVAL;

	/* Return error if mode is not supported */
	if (mode & ~FALLOC_FL_SUPPORTED_MASK)
		return -EOPNOTSUPP;

	/* Punch hole and zero range are mutually exclusive */
	if ((mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_ZERO_RANGE)) ==
	    (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_ZERO_RANGE))
		return -EOPNOTSUPP;

	/* Punch hole must have keep size set */
	if ((mode & FALLOC_FL_PUNCH_HOLE) &&
	    !(mode & FALLOC_FL_KEEP_SIZE))
		return -EOPNOTSUPP;

	/* Collapse range should only be used exclusively. */
	if ((mode & FALLOC_FL_COLLAPSE_RANGE) &&
	    (mode & ~FALLOC_FL_COLLAPSE_RANGE))
		return -EINVAL;

	/* Insert range should only be used exclusively. */
	if ((mode & FALLOC_FL_INSERT_RANGE) &&
	    (mode & ~FALLOC_FL_INSERT_RANGE))
		return -EINVAL;

	if (!(file->f_mode & FMODE_WRITE))
		return -EBADF;

	/*
	 * We can only allow pure fallocate on append only files
	 */
	if ((mode & ~FALLOC_FL_KEEP_SIZE) && IS_APPEND(inode))
		return -EPERM;

	if (IS_IMMUTABLE(inode))
		return -EPERM;

	/*
	 * We cannot allow any fallocate operation on an active swapfile
	 */
	if (IS_SWAPFILE(inode))
		return -ETXTBSY;

	/*
	 * Revalidate the write permissions, in case security policy has
	 * changed since the files were opened.
	 */
	ret = security_file_permission(file, MAY_WRITE);
	if (ret)
		return ret;

	if (S_ISFIFO(inode->i_mode))
		return -ESPIPE;

	/*
	 * Let individual file system decide if it supports preallocation
	 * for directories or not.
	 */
	if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
		return -ENODEV;

	/* Check for wrap through zero too */
	if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0))
		return -EFBIG;

	if (!file->f_op->fallocate)
		return -EOPNOTSUPP;

	sb_start_write(inode->i_sb);
	ret = file->f_op->fallocate(file, mode, offset, len);

	/*
	 * Create inotify and fanotify events.
	 *
	 * To keep the logic simple always create events if fallocate succeeds.
	 * This implies that events are even created if the file size remains
	 * unchanged, e.g. when using flag FALLOC_FL_KEEP_SIZE.
	 */
	if (ret == 0)
		fsnotify_modify(file);

	sb_end_write(inode->i_sb);
	return ret;
}
EXPORT_SYMBOL_GPL(vfs_fallocate);

SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
{
	struct fd f = fdget(fd);
	int error = -EBADF;

	if (f.file) {
		error = vfs_fallocate(f.file, mode, offset, len);
		fdput(f);
	}
	return error;
}

/*
 * access() needs to use the real uid/gid, not the effective uid/gid.
 * We do this by temporarily clearing all FS-related capabilities and
 * switching the fsuid/fsgid around to the real ones.
 */
SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode)
{
	const struct cred *old_cred;
	struct cred *override_cred;
	struct path path;
	struct inode *inode;
	int res;
	unsigned int lookup_flags = LOOKUP_FOLLOW;

	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
		return -EINVAL;

	override_cred = prepare_creds();
	if (!override_cred)
		return -ENOMEM;

	override_cred->fsuid = override_cred->uid;
	override_cred->fsgid = override_cred->gid;

	if (!issecure(SECURE_NO_SETUID_FIXUP)) {
		/* Clear the capabilities if we switch to a non-root user */
		kuid_t root_uid = make_kuid(override_cred->user_ns, 0);
		if (!uid_eq(override_cred->uid, root_uid))
			cap_clear(override_cred->cap_effective);
		else
			override_cred->cap_effective =
				override_cred->cap_permitted;
	}

	old_cred = override_creds(override_cred);
retry:
	res = user_path_at(dfd, filename, lookup_flags, &path);
	if (res)
		goto out;

	inode = path.dentry->d_inode;

	if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) {
		/*
		 * MAY_EXEC on regular files is denied if the fs is mounted
		 * with the "noexec" flag.
		 */
		res = -EACCES;
		if (path.mnt->mnt_flags & MNT_NOEXEC)
			goto out_path_release;
	}

	res = inode_permission(inode, mode | MAY_ACCESS);
	/* SuS v2 requires we report a read only fs too */
	if (res || !(mode & S_IWOTH) || special_file(inode->i_mode))
		goto out_path_release;
	/*
	 * This is a rare case where using __mnt_is_readonly()
	 * is OK without a mnt_want/drop_write() pair.  Since
	 * no actual write to the fs is performed here, we do
	 * not need to telegraph to that to anyone.
	 *
	 * By doing this, we accept that this access is
	 * inherently racy and know that the fs may change
	 * state before we even see this result.
	 */
	if (__mnt_is_readonly(path.mnt))
		res = -EROFS;

out_path_release:
	path_put(&path);
	if (retry_estale(res, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
out:
	revert_creds(old_cred);
	put_cred(override_cred);
	return res;
}

SYSCALL_DEFINE2(access, const char __user *, filename, int, mode)
{
	return sys_faccessat(AT_FDCWD, filename, mode);
}

SYSCALL_DEFINE1(chdir, const char __user *, filename)
{
	struct path path;
	int error;
	unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
retry:
	error = user_path_at(AT_FDCWD, filename, lookup_flags, &path);
	if (error)
		goto out;

	error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
	if (error)
		goto dput_and_out;

	set_fs_pwd(current->fs, &path);

dput_and_out:
	path_put(&path);
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
out:
	return error;
}

SYSCALL_DEFINE1(fchdir, unsigned int, fd)
{
	struct fd f = fdget_raw(fd);
	struct inode *inode;
	int error = -EBADF;

	error = -EBADF;
	if (!f.file)
		goto out;

	inode = file_inode(f.file);

	error = -ENOTDIR;
	if (!S_ISDIR(inode->i_mode))
		goto out_putf;

	error = inode_permission(inode, MAY_EXEC | MAY_CHDIR);
	if (!error)
		set_fs_pwd(current->fs, &f.file->f_path);
out_putf:
	fdput(f);
out:
	return error;
}

SYSCALL_DEFINE1(chroot, const char __user *, filename)
{
	struct path path;
	int error;
	unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
retry:
	error = user_path_at(AT_FDCWD, filename, lookup_flags, &path);
	if (error)
		goto out;

	error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
	if (error)
		goto dput_and_out;

	error = -EPERM;
	if (!ns_capable(current_user_ns(), CAP_SYS_CHROOT))
		goto dput_and_out;
	error = security_path_chroot(&path);
	if (error)
		goto dput_and_out;

	set_fs_root(current->fs, &path);
	error = 0;
dput_and_out:
	path_put(&path);
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
out:
	return error;
}

static int chmod_common(struct path *path, umode_t mode)
{
	struct inode *inode = path->dentry->d_inode;
	struct inode *delegated_inode = NULL;
	struct iattr newattrs;
	int error;

	error = mnt_want_write(path->mnt);
	if (error)
		return error;
retry_deleg:
	mutex_lock(&inode->i_mutex);
	error = security_path_chmod(path, mode);
	if (error)
		goto out_unlock;
	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
	error = notify_change(path->dentry, &newattrs, &delegated_inode);
out_unlock:
	mutex_unlock(&inode->i_mutex);
	if (delegated_inode) {
		error = break_deleg_wait(&delegated_inode);
		if (!error)
			goto retry_deleg;
	}
	mnt_drop_write(path->mnt);
	return error;
}

SYSCALL_DEFINE2(fchmod, unsigned int, fd, umode_t, mode)
{
	struct fd f = fdget(fd);
	int err = -EBADF;

	if (f.file) {
		audit_file(f.file);
		err = chmod_common(&f.file->f_path, mode);
		fdput(f);
	}
	return err;
}

SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode)
{
	struct path path;
	int error;
	unsigned int lookup_flags = LOOKUP_FOLLOW;
retry:
	error = user_path_at(dfd, filename, lookup_flags, &path);
	if (!error) {
		error = chmod_common(&path, mode);
		path_put(&path);
		if (retry_estale(error, lookup_flags)) {
			lookup_flags |= LOOKUP_REVAL;
			goto retry;
		}
	}
	return error;
}

SYSCALL_DEFINE2(chmod, const char __user *, filename, umode_t, mode)
{
	return sys_fchmodat(AT_FDCWD, filename, mode);
}

static int chown_common(struct path *path, uid_t user, gid_t group)
{
	struct inode *inode = path->dentry->d_inode;
	struct inode *delegated_inode = NULL;
	int error;
	struct iattr newattrs;
	kuid_t uid;
	kgid_t gid;

	uid = make_kuid(current_user_ns(), user);
	gid = make_kgid(current_user_ns(), group);

retry_deleg:
	newattrs.ia_valid =  ATTR_CTIME;
	if (user != (uid_t) -1) {
		if (!uid_valid(uid))
			return -EINVAL;
		newattrs.ia_valid |= ATTR_UID;
		newattrs.ia_uid = uid;
	}
	if (group != (gid_t) -1) {
		if (!gid_valid(gid))
			return -EINVAL;
		newattrs.ia_valid |= ATTR_GID;
		newattrs.ia_gid = gid;
	}
	if (!S_ISDIR(inode->i_mode))
		newattrs.ia_valid |=
			ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
	mutex_lock(&inode->i_mutex);
	error = security_path_chown(path, uid, gid);
	if (!error)
		error = notify_change(path->dentry, &newattrs, &delegated_inode);
	mutex_unlock(&inode->i_mutex);
	if (delegated_inode) {
		error = break_deleg_wait(&delegated_inode);
		if (!error)
			goto retry_deleg;
	}
	return error;
}

SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user,
		gid_t, group, int, flag)
{
	struct path path;
	int error = -EINVAL;
	int lookup_flags;

	if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH)) != 0)
		goto out;

	lookup_flags = (flag & AT_SYMLINK_NOFOLLOW) ? 0 : LOOKUP_FOLLOW;
	if (flag & AT_EMPTY_PATH)
		lookup_flags |= LOOKUP_EMPTY;
retry:
	error = user_path_at(dfd, filename, lookup_flags, &path);
	if (error)
		goto out;
	error = mnt_want_write(path.mnt);
	if (error)
		goto out_release;
	error = chown_common(&path, user, group);
	mnt_drop_write(path.mnt);
out_release:
	path_put(&path);
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
out:
	return error;
}

SYSCALL_DEFINE3(chown, const char __user *, filename, uid_t, user, gid_t, group)
{
	return sys_fchownat(AT_FDCWD, filename, user, group, 0);
}

SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group)
{
	return sys_fchownat(AT_FDCWD, filename, user, group,
			    AT_SYMLINK_NOFOLLOW);
}

SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
{
	struct fd f = fdget(fd);
	int error = -EBADF;

	if (!f.file)
		goto out;

	error = mnt_want_write_file(f.file);
	if (error)
		goto out_fput;
	audit_file(f.file);
	error = chown_common(&f.file->f_path, user, group);
	mnt_drop_write_file(f.file);
out_fput:
	fdput(f);
out:
	return error;
}

int open_check_o_direct(struct file *f)
{
	/* NB: we're sure to have correct a_ops only after f_op->open */
	if (f->f_flags & O_DIRECT) {
		if (!f->f_mapping->a_ops || !f->f_mapping->a_ops->direct_IO)
			return -EINVAL;
	}
	return 0;
}

static int do_dentry_open(struct file *f,
			  int (*open)(struct inode *, struct file *),
			  const struct cred *cred)
{
	static const struct file_operations empty_fops = {};
	struct inode *inode;
	int error;

	f->f_mode = OPEN_FMODE(f->f_flags) | FMODE_LSEEK |
				FMODE_PREAD | FMODE_PWRITE;

	path_get(&f->f_path);
	inode = f->f_inode = f->f_path.dentry->d_inode;
	f->f_mapping = inode->i_mapping;

	if (unlikely(f->f_flags & O_PATH)) {
		f->f_mode = FMODE_PATH;
		f->f_op = &empty_fops;
		return 0;
	}

	if (f->f_mode & FMODE_WRITE && !special_file(inode->i_mode)) {
		error = get_write_access(inode);
		if (unlikely(error))
			goto cleanup_file;
		error = __mnt_want_write(f->f_path.mnt);
		if (unlikely(error)) {
			put_write_access(inode);
			goto cleanup_file;
		}
		f->f_mode |= FMODE_WRITER;
	}

	/* POSIX.1-2008/SUSv4 Section XSI 2.9.7 */
	if (S_ISREG(inode->i_mode))
		f->f_mode |= FMODE_ATOMIC_POS;

	f->f_op = fops_get(inode->i_fop);
	if (unlikely(WARN_ON(!f->f_op))) {
		error = -ENODEV;
		goto cleanup_all;
	}

	error = security_file_open(f, cred);
	if (error)
		goto cleanup_all;

	error = break_lease(inode, f->f_flags);
	if (error)
		goto cleanup_all;

	if (!open)
		open = f->f_op->open;
	if (open) {
		error = open(inode, f);
		if (error)
			goto cleanup_all;
	}
	if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
		i_readcount_inc(inode);
	if ((f->f_mode & FMODE_READ) &&
	     likely(f->f_op->read || f->f_op->read_iter))
		f->f_mode |= FMODE_CAN_READ;
	if ((f->f_mode & FMODE_WRITE) &&
	     likely(f->f_op->write || f->f_op->write_iter))
		f->f_mode |= FMODE_CAN_WRITE;

	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);

	file_ra_state_init(&f->f_ra, f->f_mapping->host->i_mapping);

	return 0;

cleanup_all:
	fops_put(f->f_op);
	if (f->f_mode & FMODE_WRITER) {
		put_write_access(inode);
		__mnt_drop_write(f->f_path.mnt);
	}
cleanup_file:
	path_put(&f->f_path);
	f->f_path.mnt = NULL;
	f->f_path.dentry = NULL;
	f->f_inode = NULL;
	return error;
}

/**
 * finish_open - finish opening a file
 * @file: file pointer
 * @dentry: pointer to dentry
 * @open: open callback
 * @opened: state of open
 *
 * This can be used to finish opening a file passed to i_op->atomic_open().
 *
 * If the open callback is set to NULL, then the standard f_op->open()
 * filesystem callback is substituted.
 *
 * NB: the dentry reference is _not_ consumed.  If, for example, the dentry is
 * the return value of d_splice_alias(), then the caller needs to perform dput()
 * on it after finish_open().
 *
 * On successful return @file is a fully instantiated open file.  After this, if
 * an error occurs in ->atomic_open(), it needs to clean up with fput().
 *
 * Returns zero on success or -errno if the open failed.
 */
int finish_open(struct file *file, struct dentry *dentry,
		int (*open)(struct inode *, struct file *),
		int *opened)
{
	int error;
	BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */

	file->f_path.dentry = dentry;
	error = do_dentry_open(file, open, current_cred());
	if (!error)
		*opened |= FILE_OPENED;

	return error;
}
EXPORT_SYMBOL(finish_open);

/**
 * finish_no_open - finish ->atomic_open() without opening the file
 *
 * @file: file pointer
 * @dentry: dentry or NULL (as returned from ->lookup())
 *
 * This can be used to set the result of a successful lookup in ->atomic_open().
 *
 * NB: unlike finish_open() this function does consume the dentry reference and
 * the caller need not dput() it.
 *
 * Returns "1" which must be the return value of ->atomic_open() after having
 * called this function.
 */
int finish_no_open(struct file *file, struct dentry *dentry)
{
	file->f_path.dentry = dentry;
	return 1;
}
EXPORT_SYMBOL(finish_no_open);

struct file *dentry_open(const struct path *path, int flags,
			 const struct cred *cred)
{
	int error;
	struct file *f;

	validate_creds(cred);

	/* We must always pass in a valid mount pointer. */
	BUG_ON(!path->mnt);

	f = get_empty_filp();
	if (!IS_ERR(f)) {
		f->f_flags = flags;
		error = vfs_open(path, f, cred);
		if (!error) {
			/* from now on we need fput() to dispose of f */
			error = open_check_o_direct(f);
			if (error) {
				fput(f);
				f = ERR_PTR(error);
			}
		} else { 
			put_filp(f);
			f = ERR_PTR(error);
		}
	}
	return f;
}
EXPORT_SYMBOL(dentry_open);

/**
 * vfs_open - open the file at the given path
 * @path: path to open
 * @filp: newly allocated file with f_flag initialized
 * @cred: credentials to use
 */
int vfs_open(const struct path *path, struct file *filp,
	     const struct cred *cred)
{
	struct inode *inode = path->dentry->d_inode;

	if (inode->i_op->dentry_open)
		return inode->i_op->dentry_open(path->dentry, filp, cred);
	else {
		filp->f_path = *path;
		return do_dentry_open(filp, NULL, cred);
	}
}
EXPORT_SYMBOL(vfs_open);

static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op)
{
	int lookup_flags = 0;
	int acc_mode;

	if (flags & (O_CREAT | __O_TMPFILE))
		op->mode = (mode & S_IALLUGO) | S_IFREG;
	else
		op->mode = 0;

	/* Must never be set by userspace */
	flags &= ~FMODE_NONOTIFY & ~O_CLOEXEC;

	/*
	 * O_SYNC is implemented as __O_SYNC|O_DSYNC.  As many places only
	 * check for O_DSYNC if the need any syncing at all we enforce it's
	 * always set instead of having to deal with possibly weird behaviour
	 * for malicious applications setting only __O_SYNC.
	 */
	if (flags & __O_SYNC)
		flags |= O_DSYNC;

	if (flags & __O_TMPFILE) {
		if ((flags & O_TMPFILE_MASK) != O_TMPFILE)
			return -EINVAL;
		acc_mode = MAY_OPEN | ACC_MODE(flags);
		if (!(acc_mode & MAY_WRITE))
			return -EINVAL;
	} else if (flags & O_PATH) {
		/*
		 * If we have O_PATH in the open flag. Then we
		 * cannot have anything other than the below set of flags
		 */
		flags &= O_DIRECTORY | O_NOFOLLOW | O_PATH;
		acc_mode = 0;
	} else {
		acc_mode = MAY_OPEN | ACC_MODE(flags);
	}

	op->open_flag = flags;

	/* O_TRUNC implies we need access checks for write permissions */
	if (flags & O_TRUNC)
		acc_mode |= MAY_WRITE;

	/* Allow the LSM permission hook to distinguish append
	   access from general write access. */
	if (flags & O_APPEND)
		acc_mode |= MAY_APPEND;

	op->acc_mode = acc_mode;

	op->intent = flags & O_PATH ? 0 : LOOKUP_OPEN;

	if (flags & O_CREAT) {
		op->intent |= LOOKUP_CREATE;
		if (flags & O_EXCL)
			op->intent |= LOOKUP_EXCL;
	}

	if (flags & O_DIRECTORY)
		lookup_flags |= LOOKUP_DIRECTORY;
	if (!(flags & O_NOFOLLOW))
		lookup_flags |= LOOKUP_FOLLOW;
	op->lookup_flags = lookup_flags;
	return 0;
}

/**
 * file_open_name - open file and return file pointer
 *
 * @name:	struct filename containing path to open
 * @flags:	open flags as per the open(2) second argument
 * @mode:	mode for the new file if O_CREAT is set, else ignored
 *
 * This is the helper to open a file from kernelspace if you really
 * have to.  But in generally you should not do this, so please move
 * along, nothing to see here..
 */
struct file *file_open_name(struct filename *name, int flags, umode_t mode)
{
	struct open_flags op;
	int err = build_open_flags(flags, mode, &op);
	return err ? ERR_PTR(err) : do_filp_open(AT_FDCWD, name, &op);
}

/**
 * filp_open - open file and return file pointer
 *
 * @filename:	path to open
 * @flags:	open flags as per the open(2) second argument
 * @mode:	mode for the new file if O_CREAT is set, else ignored
 *
 * This is the helper to open a file from kernelspace if you really
 * have to.  But in generally you should not do this, so please move
 * along, nothing to see here..
 */
struct file *filp_open(const char *filename, int flags, umode_t mode)
{
	struct filename *name = getname_kernel(filename);
	struct file *file = ERR_CAST(name);
	
	if (!IS_ERR(name)) {
		file = file_open_name(name, flags, mode);
		putname(name);
	}
	return file;
}
EXPORT_SYMBOL(filp_open);

struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt,
			    const char *filename, int flags)
{
	struct open_flags op;
	int err = build_open_flags(flags, 0, &op);
	if (err)
		return ERR_PTR(err);
	if (flags & O_CREAT)
		return ERR_PTR(-EINVAL);
	return do_file_open_root(dentry, mnt, filename, &op);
}
EXPORT_SYMBOL(file_open_root);

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
	struct open_flags op;
	int fd = build_open_flags(flags, mode, &op);
	struct filename *tmp;

	if (fd)
		return fd;

	tmp = getname(filename);
	if (IS_ERR(tmp))
		return PTR_ERR(tmp);

	fd = get_unused_fd_flags(flags);
	if (fd >= 0) {
		struct file *f = do_filp_open(dfd, tmp, &op);
		if (IS_ERR(f)) {
			put_unused_fd(fd);
			fd = PTR_ERR(f);
		} else {
			fsnotify_open(f);
			fd_install(fd, f);
		}
	}
	putname(tmp);
	return fd;
}

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
	if (force_o_largefile())
		flags |= O_LARGEFILE;

	return do_sys_open(AT_FDCWD, filename, flags, mode);
}

SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
		umode_t, mode)
{
	if (force_o_largefile())
		flags |= O_LARGEFILE;

	return do_sys_open(dfd, filename, flags, mode);
}

#ifndef __alpha__

/*
 * For backward compatibility?  Maybe this should be moved
 * into arch/i386 instead?
 */
SYSCALL_DEFINE2(creat, const char __user *, pathname, umode_t, mode)
{
	return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
}

#endif

/*
 * "id" is the POSIX thread ID. We use the
 * files pointer for this..
 */
int filp_close(struct file *filp, fl_owner_t id)
{
	int retval = 0;

	if (!file_count(filp)) {
		printk(KERN_ERR "VFS: Close: file count is 0\n");
		return 0;
	}

	if (filp->f_op->flush)
		retval = filp->f_op->flush(filp, id);

	if (likely(!(filp->f_mode & FMODE_PATH))) {
		dnotify_flush(filp, id);
		locks_remove_posix(filp, id);
	}
	fput(filp);
	return retval;
}

EXPORT_SYMBOL(filp_close);

/*
 * Careful here! We test whether the file pointer is NULL before
 * releasing the fd. This ensures that one clone task can't release
 * an fd while another clone is opening it.
 */
SYSCALL_DEFINE1(close, unsigned int, fd)
{
	int retval = __close_fd(current->files, fd);

	/* can't restart close syscall because file table entry was cleared */
	if (unlikely(retval == -ERESTARTSYS ||
		     retval == -ERESTARTNOINTR ||
		     retval == -ERESTARTNOHAND ||
		     retval == -ERESTART_RESTARTBLOCK))
		retval = -EINTR;

	return retval;
}
EXPORT_SYMBOL(sys_close);

/*
 * This routine simulates a hangup on the tty, to arrange that users
 * are given clean terminals at login time.
 */
SYSCALL_DEFINE0(vhangup)
{
	if (capable(CAP_SYS_TTY_CONFIG)) {
		tty_vhangup_self();
		return 0;
	}
	return -EPERM;
}

/*
 * Called when an inode is about to be open.
 * We use this to disallow opening large files on 32bit systems if
 * the caller didn't specify O_LARGEFILE.  On 64bit systems we force
 * on this flag in sys_open.
 */
int generic_file_open(struct inode * inode, struct file * filp)
{
	if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS)
		return -EOVERFLOW;
	return 0;
}

EXPORT_SYMBOL(generic_file_open);

/*
 * This is used by subsystems that don't want seekable
 * file descriptors. The function is not supposed to ever fail, the only
 * reason it returns an 'int' and not 'void' is so that it can be plugged
 * directly into file_operations structure.
 */
int nonseekable_open(struct inode *inode, struct file *filp)
{
	filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
	return 0;
}

EXPORT_SYMBOL(nonseekable_open);