1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/init.h>
18#include <linux/module.h>
19#include <linux/slab.h>
20#include <linux/fs.h>
21#include <linux/namei.h>
22#include <linux/pagemap.h>
23#include <linux/fsnotify.h>
24#include <linux/personality.h>
25#include <linux/security.h>
26#include <linux/ima.h>
27#include <linux/syscalls.h>
28#include <linux/mount.h>
29#include <linux/audit.h>
30#include <linux/capability.h>
31#include <linux/file.h>
32#include <linux/fcntl.h>
33#include <linux/device_cgroup.h>
34#include <linux/fs_struct.h>
35#include <asm/uaccess.h>
36
37#include "internal.h"
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
117static int do_getname(const char __user *filename, char *page)
118{
119 int retval;
120 unsigned long len = PATH_MAX;
121
122 if (!segment_eq(get_fs(), KERNEL_DS)) {
123 if ((unsigned long) filename >= TASK_SIZE)
124 return -EFAULT;
125 if (TASK_SIZE - (unsigned long) filename < PATH_MAX)
126 len = TASK_SIZE - (unsigned long) filename;
127 }
128
129 retval = strncpy_from_user(page, filename, len);
130 if (retval > 0) {
131 if (retval < len)
132 return 0;
133 return -ENAMETOOLONG;
134 } else if (!retval)
135 retval = -ENOENT;
136 return retval;
137}
138
139char * getname(const char __user * filename)
140{
141 char *tmp, *result;
142
143 result = ERR_PTR(-ENOMEM);
144 tmp = __getname();
145 if (tmp) {
146 int retval = do_getname(filename, tmp);
147
148 result = tmp;
149 if (retval < 0) {
150 __putname(tmp);
151 result = ERR_PTR(retval);
152 }
153 }
154 audit_getname(result);
155 return result;
156}
157
158#ifdef CONFIG_AUDITSYSCALL
159void putname(const char *name)
160{
161 if (unlikely(!audit_dummy_context()))
162 audit_putname(name);
163 else
164 __putname(name);
165}
166EXPORT_SYMBOL(putname);
167#endif
168
169
170
171
172static int acl_permission_check(struct inode *inode, int mask,
173 int (*check_acl)(struct inode *inode, int mask))
174{
175 umode_t mode = inode->i_mode;
176
177 mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
178
179 if (current_fsuid() == inode->i_uid)
180 mode >>= 6;
181 else {
182 if (IS_POSIXACL(inode) && (mode & S_IRWXG) && check_acl) {
183 int error = check_acl(inode, mask);
184 if (error != -EAGAIN)
185 return error;
186 }
187
188 if (in_group_p(inode->i_gid))
189 mode >>= 3;
190 }
191
192
193
194
195 if ((mask & ~mode) == 0)
196 return 0;
197 return -EACCES;
198}
199
200
201
202
203
204
205
206
207
208
209
210
211int generic_permission(struct inode *inode, int mask,
212 int (*check_acl)(struct inode *inode, int mask))
213{
214 int ret;
215
216
217
218
219 ret = acl_permission_check(inode, mask, check_acl);
220 if (ret != -EACCES)
221 return ret;
222
223
224
225
226
227 if (!(mask & MAY_EXEC) || execute_ok(inode))
228 if (capable(CAP_DAC_OVERRIDE))
229 return 0;
230
231
232
233
234 mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
235 if (mask == MAY_READ || (S_ISDIR(inode->i_mode) && !(mask & MAY_WRITE)))
236 if (capable(CAP_DAC_READ_SEARCH))
237 return 0;
238
239 return -EACCES;
240}
241
242
243
244
245
246
247
248
249
250
251
252int inode_permission(struct inode *inode, int mask)
253{
254 int retval;
255
256 if (mask & MAY_WRITE) {
257 umode_t mode = inode->i_mode;
258
259
260
261
262 if (IS_RDONLY(inode) &&
263 (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)))
264 return -EROFS;
265
266
267
268
269 if (IS_IMMUTABLE(inode))
270 return -EACCES;
271 }
272
273 if (inode->i_op->permission)
274 retval = inode->i_op->permission(inode, mask);
275 else
276 retval = generic_permission(inode, mask, inode->i_op->check_acl);
277
278 if (retval)
279 return retval;
280
281 retval = devcgroup_inode_permission(inode, mask);
282 if (retval)
283 return retval;
284
285 return security_inode_permission(inode,
286 mask & (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND));
287}
288
289
290
291
292
293
294
295
296
297
298
299
300
301int file_permission(struct file *file, int mask)
302{
303 return inode_permission(file->f_path.dentry->d_inode, mask);
304}
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324int get_write_access(struct inode * inode)
325{
326 spin_lock(&inode->i_lock);
327 if (atomic_read(&inode->i_writecount) < 0) {
328 spin_unlock(&inode->i_lock);
329 return -ETXTBSY;
330 }
331 atomic_inc(&inode->i_writecount);
332 spin_unlock(&inode->i_lock);
333
334 return 0;
335}
336
337int deny_write_access(struct file * file)
338{
339 struct inode *inode = file->f_path.dentry->d_inode;
340
341 spin_lock(&inode->i_lock);
342 if (atomic_read(&inode->i_writecount) > 0) {
343 spin_unlock(&inode->i_lock);
344 return -ETXTBSY;
345 }
346 atomic_dec(&inode->i_writecount);
347 spin_unlock(&inode->i_lock);
348
349 return 0;
350}
351
352
353
354
355
356
357
358void path_get(struct path *path)
359{
360 mntget(path->mnt);
361 dget(path->dentry);
362}
363EXPORT_SYMBOL(path_get);
364
365
366
367
368
369
370
371void path_put(struct path *path)
372{
373 dput(path->dentry);
374 mntput(path->mnt);
375}
376EXPORT_SYMBOL(path_put);
377
378
379
380
381
382void release_open_intent(struct nameidata *nd)
383{
384 if (nd->intent.open.file->f_path.dentry == NULL)
385 put_filp(nd->intent.open.file);
386 else
387 fput(nd->intent.open.file);
388}
389
390static inline struct dentry *
391do_revalidate(struct dentry *dentry, struct nameidata *nd)
392{
393 int status = dentry->d_op->d_revalidate(dentry, nd);
394 if (unlikely(status <= 0)) {
395
396
397
398
399
400
401 if (!status) {
402 if (!d_invalidate(dentry)) {
403 dput(dentry);
404 dentry = NULL;
405 }
406 } else {
407 dput(dentry);
408 dentry = ERR_PTR(status);
409 }
410 }
411 return dentry;
412}
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429static int
430force_reval_path(struct path *path, struct nameidata *nd)
431{
432 int status;
433 struct dentry *dentry = path->dentry;
434
435
436
437
438
439
440 if (!(dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT))
441 return 0;
442
443 status = dentry->d_op->d_revalidate(dentry, nd);
444 if (status > 0)
445 return 0;
446
447 if (!status) {
448 d_invalidate(dentry);
449 status = -ESTALE;
450 }
451 return status;
452}
453
454
455
456
457
458
459
460
461
462
463static int exec_permission(struct inode *inode)
464{
465 int ret;
466
467 if (inode->i_op->permission) {
468 ret = inode->i_op->permission(inode, MAY_EXEC);
469 if (!ret)
470 goto ok;
471 return ret;
472 }
473 ret = acl_permission_check(inode, MAY_EXEC, inode->i_op->check_acl);
474 if (!ret)
475 goto ok;
476
477 if (capable(CAP_DAC_OVERRIDE) || capable(CAP_DAC_READ_SEARCH))
478 goto ok;
479
480 return ret;
481ok:
482 return security_inode_permission(inode, MAY_EXEC);
483}
484
485static __always_inline void set_root(struct nameidata *nd)
486{
487 if (!nd->root.mnt) {
488 struct fs_struct *fs = current->fs;
489 read_lock(&fs->lock);
490 nd->root = fs->root;
491 path_get(&nd->root);
492 read_unlock(&fs->lock);
493 }
494}
495
496static int link_path_walk(const char *, struct nameidata *);
497
498static __always_inline int __vfs_follow_link(struct nameidata *nd, const char *link)
499{
500 if (IS_ERR(link))
501 goto fail;
502
503 if (*link == '/') {
504 set_root(nd);
505 path_put(&nd->path);
506 nd->path = nd->root;
507 path_get(&nd->root);
508 }
509
510 return link_path_walk(link, nd);
511fail:
512 path_put(&nd->path);
513 return PTR_ERR(link);
514}
515
516static void path_put_conditional(struct path *path, struct nameidata *nd)
517{
518 dput(path->dentry);
519 if (path->mnt != nd->path.mnt)
520 mntput(path->mnt);
521}
522
523static inline void path_to_nameidata(struct path *path, struct nameidata *nd)
524{
525 dput(nd->path.dentry);
526 if (nd->path.mnt != path->mnt)
527 mntput(nd->path.mnt);
528 nd->path.mnt = path->mnt;
529 nd->path.dentry = path->dentry;
530}
531
532static __always_inline int
533__do_follow_link(struct path *path, struct nameidata *nd, void **p)
534{
535 int error;
536 struct dentry *dentry = path->dentry;
537
538 touch_atime(path->mnt, dentry);
539 nd_set_link(nd, NULL);
540
541 if (path->mnt != nd->path.mnt) {
542 path_to_nameidata(path, nd);
543 dget(dentry);
544 }
545 mntget(path->mnt);
546 nd->last_type = LAST_BIND;
547 *p = dentry->d_inode->i_op->follow_link(dentry, nd);
548 error = PTR_ERR(*p);
549 if (!IS_ERR(*p)) {
550 char *s = nd_get_link(nd);
551 error = 0;
552 if (s)
553 error = __vfs_follow_link(nd, s);
554 else if (nd->last_type == LAST_BIND) {
555 error = force_reval_path(&nd->path, nd);
556 if (error)
557 path_put(&nd->path);
558 }
559 }
560 return error;
561}
562
563
564
565
566
567
568
569
570static inline int do_follow_link(struct path *path, struct nameidata *nd)
571{
572 void *cookie;
573 int err = -ELOOP;
574 if (current->link_count >= MAX_NESTED_LINKS)
575 goto loop;
576 if (current->total_link_count >= 40)
577 goto loop;
578 BUG_ON(nd->depth >= MAX_NESTED_LINKS);
579 cond_resched();
580 err = security_inode_follow_link(path->dentry, nd);
581 if (err)
582 goto loop;
583 current->link_count++;
584 current->total_link_count++;
585 nd->depth++;
586 err = __do_follow_link(path, nd, &cookie);
587 if (!IS_ERR(cookie) && path->dentry->d_inode->i_op->put_link)
588 path->dentry->d_inode->i_op->put_link(path->dentry, nd, cookie);
589 path_put(path);
590 current->link_count--;
591 nd->depth--;
592 return err;
593loop:
594 path_put_conditional(path, nd);
595 path_put(&nd->path);
596 return err;
597}
598
599int follow_up(struct path *path)
600{
601 struct vfsmount *parent;
602 struct dentry *mountpoint;
603 spin_lock(&vfsmount_lock);
604 parent = path->mnt->mnt_parent;
605 if (parent == path->mnt) {
606 spin_unlock(&vfsmount_lock);
607 return 0;
608 }
609 mntget(parent);
610 mountpoint = dget(path->mnt->mnt_mountpoint);
611 spin_unlock(&vfsmount_lock);
612 dput(path->dentry);
613 path->dentry = mountpoint;
614 mntput(path->mnt);
615 path->mnt = parent;
616 return 1;
617}
618
619
620
621
622static int __follow_mount(struct path *path)
623{
624 int res = 0;
625 while (d_mountpoint(path->dentry)) {
626 struct vfsmount *mounted = lookup_mnt(path);
627 if (!mounted)
628 break;
629 dput(path->dentry);
630 if (res)
631 mntput(path->mnt);
632 path->mnt = mounted;
633 path->dentry = dget(mounted->mnt_root);
634 res = 1;
635 }
636 return res;
637}
638
639static void follow_mount(struct path *path)
640{
641 while (d_mountpoint(path->dentry)) {
642 struct vfsmount *mounted = lookup_mnt(path);
643 if (!mounted)
644 break;
645 dput(path->dentry);
646 mntput(path->mnt);
647 path->mnt = mounted;
648 path->dentry = dget(mounted->mnt_root);
649 }
650}
651
652
653
654
655int follow_down(struct path *path)
656{
657 struct vfsmount *mounted;
658
659 mounted = lookup_mnt(path);
660 if (mounted) {
661 dput(path->dentry);
662 mntput(path->mnt);
663 path->mnt = mounted;
664 path->dentry = dget(mounted->mnt_root);
665 return 1;
666 }
667 return 0;
668}
669
670static __always_inline void follow_dotdot(struct nameidata *nd)
671{
672 set_root(nd);
673
674 while(1) {
675 struct dentry *old = nd->path.dentry;
676
677 if (nd->path.dentry == nd->root.dentry &&
678 nd->path.mnt == nd->root.mnt) {
679 break;
680 }
681 if (nd->path.dentry != nd->path.mnt->mnt_root) {
682
683 nd->path.dentry = dget_parent(nd->path.dentry);
684 dput(old);
685 break;
686 }
687 if (!follow_up(&nd->path))
688 break;
689 }
690 follow_mount(&nd->path);
691}
692
693
694
695
696
697
698static int do_lookup(struct nameidata *nd, struct qstr *name,
699 struct path *path)
700{
701 struct vfsmount *mnt = nd->path.mnt;
702 struct dentry *dentry, *parent;
703 struct inode *dir;
704
705
706
707
708 if (nd->path.dentry->d_op && nd->path.dentry->d_op->d_hash) {
709 int err = nd->path.dentry->d_op->d_hash(nd->path.dentry, name);
710 if (err < 0)
711 return err;
712 }
713
714 dentry = __d_lookup(nd->path.dentry, name);
715 if (!dentry)
716 goto need_lookup;
717 if (dentry->d_op && dentry->d_op->d_revalidate)
718 goto need_revalidate;
719done:
720 path->mnt = mnt;
721 path->dentry = dentry;
722 __follow_mount(path);
723 return 0;
724
725need_lookup:
726 parent = nd->path.dentry;
727 dir = parent->d_inode;
728
729 mutex_lock(&dir->i_mutex);
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744 dentry = d_lookup(parent, name);
745 if (!dentry) {
746 struct dentry *new;
747
748
749 dentry = ERR_PTR(-ENOENT);
750 if (IS_DEADDIR(dir))
751 goto out_unlock;
752
753 new = d_alloc(parent, name);
754 dentry = ERR_PTR(-ENOMEM);
755 if (new) {
756 dentry = dir->i_op->lookup(dir, new, nd);
757 if (dentry)
758 dput(new);
759 else
760 dentry = new;
761 }
762out_unlock:
763 mutex_unlock(&dir->i_mutex);
764 if (IS_ERR(dentry))
765 goto fail;
766 goto done;
767 }
768
769
770
771
772
773 mutex_unlock(&dir->i_mutex);
774 if (dentry->d_op && dentry->d_op->d_revalidate) {
775 dentry = do_revalidate(dentry, nd);
776 if (!dentry)
777 dentry = ERR_PTR(-ENOENT);
778 }
779 if (IS_ERR(dentry))
780 goto fail;
781 goto done;
782
783need_revalidate:
784 dentry = do_revalidate(dentry, nd);
785 if (!dentry)
786 goto need_lookup;
787 if (IS_ERR(dentry))
788 goto fail;
789 goto done;
790
791fail:
792 return PTR_ERR(dentry);
793}
794
795
796
797
798
799
800static inline int follow_on_final(struct inode *inode, unsigned lookup_flags)
801{
802 return inode && unlikely(inode->i_op->follow_link) &&
803 ((lookup_flags & LOOKUP_FOLLOW) || S_ISDIR(inode->i_mode));
804}
805
806
807
808
809
810
811
812
813
814static int link_path_walk(const char *name, struct nameidata *nd)
815{
816 struct path next;
817 struct inode *inode;
818 int err;
819 unsigned int lookup_flags = nd->flags;
820
821 while (*name=='/')
822 name++;
823 if (!*name)
824 goto return_reval;
825
826 inode = nd->path.dentry->d_inode;
827 if (nd->depth)
828 lookup_flags = LOOKUP_FOLLOW | (nd->flags & LOOKUP_CONTINUE);
829
830
831 for(;;) {
832 unsigned long hash;
833 struct qstr this;
834 unsigned int c;
835
836 nd->flags |= LOOKUP_CONTINUE;
837 err = exec_permission(inode);
838 if (err)
839 break;
840
841 this.name = name;
842 c = *(const unsigned char *)name;
843
844 hash = init_name_hash();
845 do {
846 name++;
847 hash = partial_name_hash(c, hash);
848 c = *(const unsigned char *)name;
849 } while (c && (c != '/'));
850 this.len = name - (const char *) this.name;
851 this.hash = end_name_hash(hash);
852
853
854 if (!c)
855 goto last_component;
856 while (*++name == '/');
857 if (!*name)
858 goto last_with_slashes;
859
860
861
862
863
864
865 if (this.name[0] == '.') switch (this.len) {
866 default:
867 break;
868 case 2:
869 if (this.name[1] != '.')
870 break;
871 follow_dotdot(nd);
872 inode = nd->path.dentry->d_inode;
873
874 case 1:
875 continue;
876 }
877
878 err = do_lookup(nd, &this, &next);
879 if (err)
880 break;
881
882 err = -ENOENT;
883 inode = next.dentry->d_inode;
884 if (!inode)
885 goto out_dput;
886
887 if (inode->i_op->follow_link) {
888 err = do_follow_link(&next, nd);
889 if (err)
890 goto return_err;
891 err = -ENOENT;
892 inode = nd->path.dentry->d_inode;
893 if (!inode)
894 break;
895 } else
896 path_to_nameidata(&next, nd);
897 err = -ENOTDIR;
898 if (!inode->i_op->lookup)
899 break;
900 continue;
901
902
903last_with_slashes:
904 lookup_flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
905last_component:
906
907 nd->flags &= lookup_flags | ~LOOKUP_CONTINUE;
908 if (lookup_flags & LOOKUP_PARENT)
909 goto lookup_parent;
910 if (this.name[0] == '.') switch (this.len) {
911 default:
912 break;
913 case 2:
914 if (this.name[1] != '.')
915 break;
916 follow_dotdot(nd);
917 inode = nd->path.dentry->d_inode;
918
919 case 1:
920 goto return_reval;
921 }
922 err = do_lookup(nd, &this, &next);
923 if (err)
924 break;
925 inode = next.dentry->d_inode;
926 if (follow_on_final(inode, lookup_flags)) {
927 err = do_follow_link(&next, nd);
928 if (err)
929 goto return_err;
930 inode = nd->path.dentry->d_inode;
931 } else
932 path_to_nameidata(&next, nd);
933 err = -ENOENT;
934 if (!inode)
935 break;
936 if (lookup_flags & LOOKUP_DIRECTORY) {
937 err = -ENOTDIR;
938 if (!inode->i_op->lookup)
939 break;
940 }
941 goto return_base;
942lookup_parent:
943 nd->last = this;
944 nd->last_type = LAST_NORM;
945 if (this.name[0] != '.')
946 goto return_base;
947 if (this.len == 1)
948 nd->last_type = LAST_DOT;
949 else if (this.len == 2 && this.name[1] == '.')
950 nd->last_type = LAST_DOTDOT;
951 else
952 goto return_base;
953return_reval:
954
955
956
957
958 if (nd->path.dentry && nd->path.dentry->d_sb &&
959 (nd->path.dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT)) {
960 err = -ESTALE;
961
962 if (!nd->path.dentry->d_op->d_revalidate(
963 nd->path.dentry, nd))
964 break;
965 }
966return_base:
967 return 0;
968out_dput:
969 path_put_conditional(&next, nd);
970 break;
971 }
972 path_put(&nd->path);
973return_err:
974 return err;
975}
976
977static int path_walk(const char *name, struct nameidata *nd)
978{
979 struct path save = nd->path;
980 int result;
981
982 current->total_link_count = 0;
983
984
985 path_get(&save);
986
987 result = link_path_walk(name, nd);
988 if (result == -ESTALE) {
989
990 current->total_link_count = 0;
991 nd->path = save;
992 path_get(&nd->path);
993 nd->flags |= LOOKUP_REVAL;
994 result = link_path_walk(name, nd);
995 }
996
997 path_put(&save);
998
999 return result;
1000}
1001
1002static int path_init(int dfd, const char *name, unsigned int flags, struct nameidata *nd)
1003{
1004 int retval = 0;
1005 int fput_needed;
1006 struct file *file;
1007
1008 nd->last_type = LAST_ROOT;
1009 nd->flags = flags;
1010 nd->depth = 0;
1011 nd->root.mnt = NULL;
1012
1013 if (*name=='/') {
1014 set_root(nd);
1015 nd->path = nd->root;
1016 path_get(&nd->root);
1017 } else if (dfd == AT_FDCWD) {
1018 struct fs_struct *fs = current->fs;
1019 read_lock(&fs->lock);
1020 nd->path = fs->pwd;
1021 path_get(&fs->pwd);
1022 read_unlock(&fs->lock);
1023 } else {
1024 struct dentry *dentry;
1025
1026 file = fget_light(dfd, &fput_needed);
1027 retval = -EBADF;
1028 if (!file)
1029 goto out_fail;
1030
1031 dentry = file->f_path.dentry;
1032
1033 retval = -ENOTDIR;
1034 if (!S_ISDIR(dentry->d_inode->i_mode))
1035 goto fput_fail;
1036
1037 retval = file_permission(file, MAY_EXEC);
1038 if (retval)
1039 goto fput_fail;
1040
1041 nd->path = file->f_path;
1042 path_get(&file->f_path);
1043
1044 fput_light(file, fput_needed);
1045 }
1046 return 0;
1047
1048fput_fail:
1049 fput_light(file, fput_needed);
1050out_fail:
1051 return retval;
1052}
1053
1054
1055static int do_path_lookup(int dfd, const char *name,
1056 unsigned int flags, struct nameidata *nd)
1057{
1058 int retval = path_init(dfd, name, flags, nd);
1059 if (!retval)
1060 retval = path_walk(name, nd);
1061 if (unlikely(!retval && !audit_dummy_context() && nd->path.dentry &&
1062 nd->path.dentry->d_inode))
1063 audit_inode(name, nd->path.dentry);
1064 if (nd->root.mnt) {
1065 path_put(&nd->root);
1066 nd->root.mnt = NULL;
1067 }
1068 return retval;
1069}
1070
1071int path_lookup(const char *name, unsigned int flags,
1072 struct nameidata *nd)
1073{
1074 return do_path_lookup(AT_FDCWD, name, flags, nd);
1075}
1076
1077int kern_path(const char *name, unsigned int flags, struct path *path)
1078{
1079 struct nameidata nd;
1080 int res = do_path_lookup(AT_FDCWD, name, flags, &nd);
1081 if (!res)
1082 *path = nd.path;
1083 return res;
1084}
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094int vfs_path_lookup(struct dentry *dentry, struct vfsmount *mnt,
1095 const char *name, unsigned int flags,
1096 struct nameidata *nd)
1097{
1098 int retval;
1099
1100
1101 nd->last_type = LAST_ROOT;
1102 nd->flags = flags;
1103 nd->depth = 0;
1104
1105 nd->path.dentry = dentry;
1106 nd->path.mnt = mnt;
1107 path_get(&nd->path);
1108 nd->root = nd->path;
1109 path_get(&nd->root);
1110
1111 retval = path_walk(name, nd);
1112 if (unlikely(!retval && !audit_dummy_context() && nd->path.dentry &&
1113 nd->path.dentry->d_inode))
1114 audit_inode(name, nd->path.dentry);
1115
1116 path_put(&nd->root);
1117 nd->root.mnt = NULL;
1118
1119 return retval;
1120}
1121
1122static struct dentry *__lookup_hash(struct qstr *name,
1123 struct dentry *base, struct nameidata *nd)
1124{
1125 struct dentry *dentry;
1126 struct inode *inode;
1127 int err;
1128
1129 inode = base->d_inode;
1130
1131
1132
1133
1134
1135 if (base->d_op && base->d_op->d_hash) {
1136 err = base->d_op->d_hash(base, name);
1137 dentry = ERR_PTR(err);
1138 if (err < 0)
1139 goto out;
1140 }
1141
1142 dentry = __d_lookup(base, name);
1143
1144
1145
1146
1147 if (!dentry)
1148 dentry = d_lookup(base, name);
1149
1150 if (dentry && dentry->d_op && dentry->d_op->d_revalidate)
1151 dentry = do_revalidate(dentry, nd);
1152
1153 if (!dentry) {
1154 struct dentry *new;
1155
1156
1157 dentry = ERR_PTR(-ENOENT);
1158 if (IS_DEADDIR(inode))
1159 goto out;
1160
1161 new = d_alloc(base, name);
1162 dentry = ERR_PTR(-ENOMEM);
1163 if (!new)
1164 goto out;
1165 dentry = inode->i_op->lookup(inode, new, nd);
1166 if (!dentry)
1167 dentry = new;
1168 else
1169 dput(new);
1170 }
1171out:
1172 return dentry;
1173}
1174
1175
1176
1177
1178
1179
1180static struct dentry *lookup_hash(struct nameidata *nd)
1181{
1182 int err;
1183
1184 err = exec_permission(nd->path.dentry->d_inode);
1185 if (err)
1186 return ERR_PTR(err);
1187 return __lookup_hash(&nd->last, nd->path.dentry, nd);
1188}
1189
1190static int __lookup_one_len(const char *name, struct qstr *this,
1191 struct dentry *base, int len)
1192{
1193 unsigned long hash;
1194 unsigned int c;
1195
1196 this->name = name;
1197 this->len = len;
1198 if (!len)
1199 return -EACCES;
1200
1201 hash = init_name_hash();
1202 while (len--) {
1203 c = *(const unsigned char *)name++;
1204 if (c == '/' || c == '\0')
1205 return -EACCES;
1206 hash = partial_name_hash(c, hash);
1207 }
1208 this->hash = end_name_hash(hash);
1209 return 0;
1210}
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
1224{
1225 int err;
1226 struct qstr this;
1227
1228 WARN_ON_ONCE(!mutex_is_locked(&base->d_inode->i_mutex));
1229
1230 err = __lookup_one_len(name, &this, base, len);
1231 if (err)
1232 return ERR_PTR(err);
1233
1234 err = exec_permission(base->d_inode);
1235 if (err)
1236 return ERR_PTR(err);
1237 return __lookup_hash(&this, base, NULL);
1238}
1239
1240int user_path_at(int dfd, const char __user *name, unsigned flags,
1241 struct path *path)
1242{
1243 struct nameidata nd;
1244 char *tmp = getname(name);
1245 int err = PTR_ERR(tmp);
1246 if (!IS_ERR(tmp)) {
1247
1248 BUG_ON(flags & LOOKUP_PARENT);
1249
1250 err = do_path_lookup(dfd, tmp, flags, &nd);
1251 putname(tmp);
1252 if (!err)
1253 *path = nd.path;
1254 }
1255 return err;
1256}
1257
1258static int user_path_parent(int dfd, const char __user *path,
1259 struct nameidata *nd, char **name)
1260{
1261 char *s = getname(path);
1262 int error;
1263
1264 if (IS_ERR(s))
1265 return PTR_ERR(s);
1266
1267 error = do_path_lookup(dfd, s, LOOKUP_PARENT, nd);
1268 if (error)
1269 putname(s);
1270 else
1271 *name = s;
1272
1273 return error;
1274}
1275
1276
1277
1278
1279
1280static inline int check_sticky(struct inode *dir, struct inode *inode)
1281{
1282 uid_t fsuid = current_fsuid();
1283
1284 if (!(dir->i_mode & S_ISVTX))
1285 return 0;
1286 if (inode->i_uid == fsuid)
1287 return 0;
1288 if (dir->i_uid == fsuid)
1289 return 0;
1290 return !capable(CAP_FOWNER);
1291}
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312static int may_delete(struct inode *dir,struct dentry *victim,int isdir)
1313{
1314 int error;
1315
1316 if (!victim->d_inode)
1317 return -ENOENT;
1318
1319 BUG_ON(victim->d_parent->d_inode != dir);
1320 audit_inode_child(victim, dir);
1321
1322 error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
1323 if (error)
1324 return error;
1325 if (IS_APPEND(dir))
1326 return -EPERM;
1327 if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)||
1328 IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode))
1329 return -EPERM;
1330 if (isdir) {
1331 if (!S_ISDIR(victim->d_inode->i_mode))
1332 return -ENOTDIR;
1333 if (IS_ROOT(victim))
1334 return -EBUSY;
1335 } else if (S_ISDIR(victim->d_inode->i_mode))
1336 return -EISDIR;
1337 if (IS_DEADDIR(dir))
1338 return -ENOENT;
1339 if (victim->d_flags & DCACHE_NFSFS_RENAMED)
1340 return -EBUSY;
1341 return 0;
1342}
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352static inline int may_create(struct inode *dir, struct dentry *child)
1353{
1354 if (child->d_inode)
1355 return -EEXIST;
1356 if (IS_DEADDIR(dir))
1357 return -ENOENT;
1358 return inode_permission(dir, MAY_WRITE | MAY_EXEC);
1359}
1360
1361
1362
1363
1364struct dentry *lock_rename(struct dentry *p1, struct dentry *p2)
1365{
1366 struct dentry *p;
1367
1368 if (p1 == p2) {
1369 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);
1370 return NULL;
1371 }
1372
1373 mutex_lock(&p1->d_inode->i_sb->s_vfs_rename_mutex);
1374
1375 p = d_ancestor(p2, p1);
1376 if (p) {
1377 mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT);
1378 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD);
1379 return p;
1380 }
1381
1382 p = d_ancestor(p1, p2);
1383 if (p) {
1384 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);
1385 mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD);
1386 return p;
1387 }
1388
1389 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);
1390 mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD);
1391 return NULL;
1392}
1393
1394void unlock_rename(struct dentry *p1, struct dentry *p2)
1395{
1396 mutex_unlock(&p1->d_inode->i_mutex);
1397 if (p1 != p2) {
1398 mutex_unlock(&p2->d_inode->i_mutex);
1399 mutex_unlock(&p1->d_inode->i_sb->s_vfs_rename_mutex);
1400 }
1401}
1402
1403int vfs_create(struct inode *dir, struct dentry *dentry, int mode,
1404 struct nameidata *nd)
1405{
1406 int error = may_create(dir, dentry);
1407
1408 if (error)
1409 return error;
1410
1411 if (!dir->i_op->create)
1412 return -EACCES;
1413 mode &= S_IALLUGO;
1414 mode |= S_IFREG;
1415 error = security_inode_create(dir, dentry, mode);
1416 if (error)
1417 return error;
1418 error = dir->i_op->create(dir, dentry, mode, nd);
1419 if (!error)
1420 fsnotify_create(dir, dentry);
1421 return error;
1422}
1423
1424int may_open(struct path *path, int acc_mode, int flag)
1425{
1426 struct dentry *dentry = path->dentry;
1427 struct inode *inode = dentry->d_inode;
1428 int error;
1429
1430 if (!inode)
1431 return -ENOENT;
1432
1433 switch (inode->i_mode & S_IFMT) {
1434 case S_IFLNK:
1435 return -ELOOP;
1436 case S_IFDIR:
1437 if (acc_mode & MAY_WRITE)
1438 return -EISDIR;
1439 break;
1440 case S_IFBLK:
1441 case S_IFCHR:
1442 if (path->mnt->mnt_flags & MNT_NODEV)
1443 return -EACCES;
1444
1445 case S_IFIFO:
1446 case S_IFSOCK:
1447 flag &= ~O_TRUNC;
1448 break;
1449 }
1450
1451 error = inode_permission(inode, acc_mode);
1452 if (error)
1453 return error;
1454
1455
1456
1457
1458 if (IS_APPEND(inode)) {
1459 if ((flag & O_ACCMODE) != O_RDONLY && !(flag & O_APPEND))
1460 return -EPERM;
1461 if (flag & O_TRUNC)
1462 return -EPERM;
1463 }
1464
1465
1466 if (flag & O_NOATIME && !is_owner_or_cap(inode))
1467 return -EPERM;
1468
1469
1470
1471
1472 return break_lease(inode, flag);
1473}
1474
1475static int handle_truncate(struct path *path)
1476{
1477 struct inode *inode = path->dentry->d_inode;
1478 int error = get_write_access(inode);
1479 if (error)
1480 return error;
1481
1482
1483
1484 error = locks_verify_locked(inode);
1485 if (!error)
1486 error = security_path_truncate(path, 0,
1487 ATTR_MTIME|ATTR_CTIME|ATTR_OPEN);
1488 if (!error) {
1489 error = do_truncate(path->dentry, 0,
1490 ATTR_MTIME|ATTR_CTIME|ATTR_OPEN,
1491 NULL);
1492 }
1493 put_write_access(inode);
1494 return error;
1495}
1496
1497
1498
1499
1500
1501
1502static int __open_namei_create(struct nameidata *nd, struct path *path,
1503 int open_flag, int mode)
1504{
1505 int error;
1506 struct dentry *dir = nd->path.dentry;
1507
1508 if (!IS_POSIXACL(dir->d_inode))
1509 mode &= ~current_umask();
1510 error = security_path_mknod(&nd->path, path->dentry, mode, 0);
1511 if (error)
1512 goto out_unlock;
1513 error = vfs_create(dir->d_inode, path->dentry, mode, nd);
1514out_unlock:
1515 mutex_unlock(&dir->d_inode->i_mutex);
1516 dput(nd->path.dentry);
1517 nd->path.dentry = path->dentry;
1518 if (error)
1519 return error;
1520
1521 return may_open(&nd->path, 0, open_flag & ~O_TRUNC);
1522}
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541static inline int open_to_namei_flags(int flag)
1542{
1543 if ((flag+1) & O_ACCMODE)
1544 flag++;
1545 return flag;
1546}
1547
1548static int open_will_truncate(int flag, struct inode *inode)
1549{
1550
1551
1552
1553
1554 if (special_file(inode->i_mode))
1555 return 0;
1556 return (flag & O_TRUNC);
1557}
1558
1559static struct file *finish_open(struct nameidata *nd,
1560 int open_flag, int acc_mode)
1561{
1562 struct file *filp;
1563 int will_truncate;
1564 int error;
1565
1566 will_truncate = open_will_truncate(open_flag, nd->path.dentry->d_inode);
1567 if (will_truncate) {
1568 error = mnt_want_write(nd->path.mnt);
1569 if (error)
1570 goto exit;
1571 }
1572 error = may_open(&nd->path, acc_mode, open_flag);
1573 if (error) {
1574 if (will_truncate)
1575 mnt_drop_write(nd->path.mnt);
1576 goto exit;
1577 }
1578 filp = nameidata_to_filp(nd);
1579 if (!IS_ERR(filp)) {
1580 error = ima_file_check(filp, acc_mode);
1581 if (error) {
1582 fput(filp);
1583 filp = ERR_PTR(error);
1584 }
1585 }
1586 if (!IS_ERR(filp)) {
1587 if (will_truncate) {
1588 error = handle_truncate(&nd->path);
1589 if (error) {
1590 fput(filp);
1591 filp = ERR_PTR(error);
1592 }
1593 }
1594 }
1595
1596
1597
1598
1599
1600 if (will_truncate)
1601 mnt_drop_write(nd->path.mnt);
1602 return filp;
1603
1604exit:
1605 if (!IS_ERR(nd->intent.open.file))
1606 release_open_intent(nd);
1607 path_put(&nd->path);
1608 return ERR_PTR(error);
1609}
1610
1611static struct file *do_last(struct nameidata *nd, struct path *path,
1612 int open_flag, int acc_mode,
1613 int mode, const char *pathname)
1614{
1615 struct dentry *dir = nd->path.dentry;
1616 struct file *filp;
1617 int error = -EISDIR;
1618
1619 switch (nd->last_type) {
1620 case LAST_DOTDOT:
1621 follow_dotdot(nd);
1622 dir = nd->path.dentry;
1623 case LAST_DOT:
1624 if (nd->path.mnt->mnt_sb->s_type->fs_flags & FS_REVAL_DOT) {
1625 if (!dir->d_op->d_revalidate(dir, nd)) {
1626 error = -ESTALE;
1627 goto exit;
1628 }
1629 }
1630
1631 case LAST_ROOT:
1632 if (open_flag & O_CREAT)
1633 goto exit;
1634
1635 case LAST_BIND:
1636 audit_inode(pathname, dir);
1637 goto ok;
1638 }
1639
1640
1641 if (nd->last.name[nd->last.len]) {
1642 if (open_flag & O_CREAT)
1643 goto exit;
1644 nd->flags |= LOOKUP_DIRECTORY | LOOKUP_FOLLOW;
1645 }
1646
1647
1648 if (!(open_flag & O_CREAT)) {
1649 error = do_lookup(nd, &nd->last, path);
1650 if (error)
1651 goto exit;
1652 error = -ENOENT;
1653 if (!path->dentry->d_inode)
1654 goto exit_dput;
1655 if (path->dentry->d_inode->i_op->follow_link)
1656 return NULL;
1657 error = -ENOTDIR;
1658 if (nd->flags & LOOKUP_DIRECTORY) {
1659 if (!path->dentry->d_inode->i_op->lookup)
1660 goto exit_dput;
1661 }
1662 path_to_nameidata(path, nd);
1663 audit_inode(pathname, nd->path.dentry);
1664 goto ok;
1665 }
1666
1667
1668 mutex_lock(&dir->d_inode->i_mutex);
1669
1670 path->dentry = lookup_hash(nd);
1671 path->mnt = nd->path.mnt;
1672
1673 error = PTR_ERR(path->dentry);
1674 if (IS_ERR(path->dentry)) {
1675 mutex_unlock(&dir->d_inode->i_mutex);
1676 goto exit;
1677 }
1678
1679 if (IS_ERR(nd->intent.open.file)) {
1680 error = PTR_ERR(nd->intent.open.file);
1681 goto exit_mutex_unlock;
1682 }
1683
1684
1685 if (!path->dentry->d_inode) {
1686
1687
1688
1689
1690
1691
1692
1693 error = mnt_want_write(nd->path.mnt);
1694 if (error)
1695 goto exit_mutex_unlock;
1696 error = __open_namei_create(nd, path, open_flag, mode);
1697 if (error) {
1698 mnt_drop_write(nd->path.mnt);
1699 goto exit;
1700 }
1701 filp = nameidata_to_filp(nd);
1702 mnt_drop_write(nd->path.mnt);
1703 if (!IS_ERR(filp)) {
1704 error = ima_file_check(filp, acc_mode);
1705 if (error) {
1706 fput(filp);
1707 filp = ERR_PTR(error);
1708 }
1709 }
1710 return filp;
1711 }
1712
1713
1714
1715
1716 mutex_unlock(&dir->d_inode->i_mutex);
1717 audit_inode(pathname, path->dentry);
1718
1719 error = -EEXIST;
1720 if (open_flag & O_EXCL)
1721 goto exit_dput;
1722
1723 if (__follow_mount(path)) {
1724 error = -ELOOP;
1725 if (open_flag & O_NOFOLLOW)
1726 goto exit_dput;
1727 }
1728
1729 error = -ENOENT;
1730 if (!path->dentry->d_inode)
1731 goto exit_dput;
1732
1733 if (path->dentry->d_inode->i_op->follow_link)
1734 return NULL;
1735
1736 path_to_nameidata(path, nd);
1737 error = -EISDIR;
1738 if (S_ISDIR(path->dentry->d_inode->i_mode))
1739 goto exit;
1740ok:
1741 filp = finish_open(nd, open_flag, acc_mode);
1742 return filp;
1743
1744exit_mutex_unlock:
1745 mutex_unlock(&dir->d_inode->i_mutex);
1746exit_dput:
1747 path_put_conditional(path, nd);
1748exit:
1749 if (!IS_ERR(nd->intent.open.file))
1750 release_open_intent(nd);
1751 path_put(&nd->path);
1752 return ERR_PTR(error);
1753}
1754
1755
1756
1757
1758
1759
1760struct file *do_filp_open(int dfd, const char *pathname,
1761 int open_flag, int mode, int acc_mode)
1762{
1763 struct file *filp;
1764 struct nameidata nd;
1765 int error;
1766 struct path path;
1767 int count = 0;
1768 int flag = open_to_namei_flags(open_flag);
1769 int force_reval = 0;
1770
1771 if (!(open_flag & O_CREAT))
1772 mode = 0;
1773
1774
1775
1776
1777
1778
1779
1780 if (open_flag & __O_SYNC)
1781 open_flag |= O_DSYNC;
1782
1783 if (!acc_mode)
1784 acc_mode = MAY_OPEN | ACC_MODE(open_flag);
1785
1786
1787 if (open_flag & O_TRUNC)
1788 acc_mode |= MAY_WRITE;
1789
1790
1791
1792 if (open_flag & O_APPEND)
1793 acc_mode |= MAY_APPEND;
1794
1795
1796reval:
1797 error = path_init(dfd, pathname, LOOKUP_PARENT, &nd);
1798 if (error)
1799 return ERR_PTR(error);
1800 if (force_reval)
1801 nd.flags |= LOOKUP_REVAL;
1802
1803 current->total_link_count = 0;
1804 error = link_path_walk(pathname, &nd);
1805 if (error) {
1806 filp = ERR_PTR(error);
1807 goto out;
1808 }
1809 if (unlikely(!audit_dummy_context()) && (open_flag & O_CREAT))
1810 audit_inode(pathname, nd.path.dentry);
1811
1812
1813
1814
1815
1816 error = -ENFILE;
1817 filp = get_empty_filp();
1818 if (filp == NULL)
1819 goto exit_parent;
1820 nd.intent.open.file = filp;
1821 filp->f_flags = open_flag;
1822 nd.intent.open.flags = flag;
1823 nd.intent.open.create_mode = mode;
1824 nd.flags &= ~LOOKUP_PARENT;
1825 nd.flags |= LOOKUP_OPEN;
1826 if (open_flag & O_CREAT) {
1827 nd.flags |= LOOKUP_CREATE;
1828 if (open_flag & O_EXCL)
1829 nd.flags |= LOOKUP_EXCL;
1830 }
1831 if (open_flag & O_DIRECTORY)
1832 nd.flags |= LOOKUP_DIRECTORY;
1833 if (!(open_flag & O_NOFOLLOW))
1834 nd.flags |= LOOKUP_FOLLOW;
1835 filp = do_last(&nd, &path, open_flag, acc_mode, mode, pathname);
1836 while (unlikely(!filp)) {
1837 struct path holder;
1838 struct inode *inode = path.dentry->d_inode;
1839 void *cookie;
1840 error = -ELOOP;
1841
1842 if (!(nd.flags & LOOKUP_FOLLOW) && !S_ISDIR(inode->i_mode))
1843 goto exit_dput;
1844 if (count++ == 32)
1845 goto exit_dput;
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857 nd.flags |= LOOKUP_PARENT;
1858 error = security_inode_follow_link(path.dentry, &nd);
1859 if (error)
1860 goto exit_dput;
1861 error = __do_follow_link(&path, &nd, &cookie);
1862 if (unlikely(error)) {
1863
1864 if (!IS_ERR(cookie) && inode->i_op->put_link)
1865 inode->i_op->put_link(path.dentry, &nd, cookie);
1866 path_put(&path);
1867 release_open_intent(&nd);
1868 filp = ERR_PTR(error);
1869 goto out;
1870 }
1871 holder = path;
1872 nd.flags &= ~LOOKUP_PARENT;
1873 filp = do_last(&nd, &path, open_flag, acc_mode, mode, pathname);
1874 if (inode->i_op->put_link)
1875 inode->i_op->put_link(holder.dentry, &nd, cookie);
1876 path_put(&holder);
1877 }
1878out:
1879 if (nd.root.mnt)
1880 path_put(&nd.root);
1881 if (filp == ERR_PTR(-ESTALE) && !force_reval) {
1882 force_reval = 1;
1883 goto reval;
1884 }
1885 return filp;
1886
1887exit_dput:
1888 path_put_conditional(&path, &nd);
1889 if (!IS_ERR(nd.intent.open.file))
1890 release_open_intent(&nd);
1891exit_parent:
1892 path_put(&nd.path);
1893 filp = ERR_PTR(error);
1894 goto out;
1895}
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908struct file *filp_open(const char *filename, int flags, int mode)
1909{
1910 return do_filp_open(AT_FDCWD, filename, flags, mode, 0);
1911}
1912EXPORT_SYMBOL(filp_open);
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924struct dentry *lookup_create(struct nameidata *nd, int is_dir)
1925{
1926 struct dentry *dentry = ERR_PTR(-EEXIST);
1927
1928 mutex_lock_nested(&nd->path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
1929
1930
1931
1932
1933 if (nd->last_type != LAST_NORM)
1934 goto fail;
1935 nd->flags &= ~LOOKUP_PARENT;
1936 nd->flags |= LOOKUP_CREATE | LOOKUP_EXCL;
1937 nd->intent.open.flags = O_EXCL;
1938
1939
1940
1941
1942 dentry = lookup_hash(nd);
1943 if (IS_ERR(dentry))
1944 goto fail;
1945
1946 if (dentry->d_inode)
1947 goto eexist;
1948
1949
1950
1951
1952
1953
1954 if (unlikely(!is_dir && nd->last.name[nd->last.len])) {
1955 dput(dentry);
1956 dentry = ERR_PTR(-ENOENT);
1957 }
1958 return dentry;
1959eexist:
1960 dput(dentry);
1961 dentry = ERR_PTR(-EEXIST);
1962fail:
1963 return dentry;
1964}
1965EXPORT_SYMBOL_GPL(lookup_create);
1966
1967int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
1968{
1969 int error = may_create(dir, dentry);
1970
1971 if (error)
1972 return error;
1973
1974 if ((S_ISCHR(mode) || S_ISBLK(mode)) && !capable(CAP_MKNOD))
1975 return -EPERM;
1976
1977 if (!dir->i_op->mknod)
1978 return -EPERM;
1979
1980 error = devcgroup_inode_mknod(mode, dev);
1981 if (error)
1982 return error;
1983
1984 error = security_inode_mknod(dir, dentry, mode, dev);
1985 if (error)
1986 return error;
1987
1988 error = dir->i_op->mknod(dir, dentry, mode, dev);
1989 if (!error)
1990 fsnotify_create(dir, dentry);
1991 return error;
1992}
1993
1994static int may_mknod(mode_t mode)
1995{
1996 switch (mode & S_IFMT) {
1997 case S_IFREG:
1998 case S_IFCHR:
1999 case S_IFBLK:
2000 case S_IFIFO:
2001 case S_IFSOCK:
2002 case 0:
2003 return 0;
2004 case S_IFDIR:
2005 return -EPERM;
2006 default:
2007 return -EINVAL;
2008 }
2009}
2010
2011SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, int, mode,
2012 unsigned, dev)
2013{
2014 int error;
2015 char *tmp;
2016 struct dentry *dentry;
2017 struct nameidata nd;
2018
2019 if (S_ISDIR(mode))
2020 return -EPERM;
2021
2022 error = user_path_parent(dfd, filename, &nd, &tmp);
2023 if (error)
2024 return error;
2025
2026 dentry = lookup_create(&nd, 0);
2027 if (IS_ERR(dentry)) {
2028 error = PTR_ERR(dentry);
2029 goto out_unlock;
2030 }
2031 if (!IS_POSIXACL(nd.path.dentry->d_inode))
2032 mode &= ~current_umask();
2033 error = may_mknod(mode);
2034 if (error)
2035 goto out_dput;
2036 error = mnt_want_write(nd.path.mnt);
2037 if (error)
2038 goto out_dput;
2039 error = security_path_mknod(&nd.path, dentry, mode, dev);
2040 if (error)
2041 goto out_drop_write;
2042 switch (mode & S_IFMT) {
2043 case 0: case S_IFREG:
2044 error = vfs_create(nd.path.dentry->d_inode,dentry,mode,&nd);
2045 break;
2046 case S_IFCHR: case S_IFBLK:
2047 error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,
2048 new_decode_dev(dev));
2049 break;
2050 case S_IFIFO: case S_IFSOCK:
2051 error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,0);
2052 break;
2053 }
2054out_drop_write:
2055 mnt_drop_write(nd.path.mnt);
2056out_dput:
2057 dput(dentry);
2058out_unlock:
2059 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2060 path_put(&nd.path);
2061 putname(tmp);
2062
2063 return error;
2064}
2065
2066SYSCALL_DEFINE3(mknod, const char __user *, filename, int, mode, unsigned, dev)
2067{
2068 return sys_mknodat(AT_FDCWD, filename, mode, dev);
2069}
2070
2071int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
2072{
2073 int error = may_create(dir, dentry);
2074
2075 if (error)
2076 return error;
2077
2078 if (!dir->i_op->mkdir)
2079 return -EPERM;
2080
2081 mode &= (S_IRWXUGO|S_ISVTX);
2082 error = security_inode_mkdir(dir, dentry, mode);
2083 if (error)
2084 return error;
2085
2086 error = dir->i_op->mkdir(dir, dentry, mode);
2087 if (!error)
2088 fsnotify_mkdir(dir, dentry);
2089 return error;
2090}
2091
2092SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, int, mode)
2093{
2094 int error = 0;
2095 char * tmp;
2096 struct dentry *dentry;
2097 struct nameidata nd;
2098
2099 error = user_path_parent(dfd, pathname, &nd, &tmp);
2100 if (error)
2101 goto out_err;
2102
2103 dentry = lookup_create(&nd, 1);
2104 error = PTR_ERR(dentry);
2105 if (IS_ERR(dentry))
2106 goto out_unlock;
2107
2108 if (!IS_POSIXACL(nd.path.dentry->d_inode))
2109 mode &= ~current_umask();
2110 error = mnt_want_write(nd.path.mnt);
2111 if (error)
2112 goto out_dput;
2113 error = security_path_mkdir(&nd.path, dentry, mode);
2114 if (error)
2115 goto out_drop_write;
2116 error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode);
2117out_drop_write:
2118 mnt_drop_write(nd.path.mnt);
2119out_dput:
2120 dput(dentry);
2121out_unlock:
2122 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2123 path_put(&nd.path);
2124 putname(tmp);
2125out_err:
2126 return error;
2127}
2128
2129SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)
2130{
2131 return sys_mkdirat(AT_FDCWD, pathname, mode);
2132}
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149void dentry_unhash(struct dentry *dentry)
2150{
2151 dget(dentry);
2152 shrink_dcache_parent(dentry);
2153 spin_lock(&dcache_lock);
2154 spin_lock(&dentry->d_lock);
2155 if (atomic_read(&dentry->d_count) == 2)
2156 __d_drop(dentry);
2157 spin_unlock(&dentry->d_lock);
2158 spin_unlock(&dcache_lock);
2159}
2160
2161int vfs_rmdir(struct inode *dir, struct dentry *dentry)
2162{
2163 int error = may_delete(dir, dentry, 1);
2164
2165 if (error)
2166 return error;
2167
2168 if (!dir->i_op->rmdir)
2169 return -EPERM;
2170
2171 mutex_lock(&dentry->d_inode->i_mutex);
2172 dentry_unhash(dentry);
2173 if (d_mountpoint(dentry))
2174 error = -EBUSY;
2175 else {
2176 error = security_inode_rmdir(dir, dentry);
2177 if (!error) {
2178 error = dir->i_op->rmdir(dir, dentry);
2179 if (!error) {
2180 dentry->d_inode->i_flags |= S_DEAD;
2181 dont_mount(dentry);
2182 }
2183 }
2184 }
2185 mutex_unlock(&dentry->d_inode->i_mutex);
2186 if (!error) {
2187 d_delete(dentry);
2188 }
2189 dput(dentry);
2190
2191 return error;
2192}
2193
2194static long do_rmdir(int dfd, const char __user *pathname)
2195{
2196 int error = 0;
2197 char * name;
2198 struct dentry *dentry;
2199 struct nameidata nd;
2200
2201 error = user_path_parent(dfd, pathname, &nd, &name);
2202 if (error)
2203 return error;
2204
2205 switch(nd.last_type) {
2206 case LAST_DOTDOT:
2207 error = -ENOTEMPTY;
2208 goto exit1;
2209 case LAST_DOT:
2210 error = -EINVAL;
2211 goto exit1;
2212 case LAST_ROOT:
2213 error = -EBUSY;
2214 goto exit1;
2215 }
2216
2217 nd.flags &= ~LOOKUP_PARENT;
2218
2219 mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
2220 dentry = lookup_hash(&nd);
2221 error = PTR_ERR(dentry);
2222 if (IS_ERR(dentry))
2223 goto exit2;
2224 error = mnt_want_write(nd.path.mnt);
2225 if (error)
2226 goto exit3;
2227 error = security_path_rmdir(&nd.path, dentry);
2228 if (error)
2229 goto exit4;
2230 error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
2231exit4:
2232 mnt_drop_write(nd.path.mnt);
2233exit3:
2234 dput(dentry);
2235exit2:
2236 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2237exit1:
2238 path_put(&nd.path);
2239 putname(name);
2240 return error;
2241}
2242
2243SYSCALL_DEFINE1(rmdir, const char __user *, pathname)
2244{
2245 return do_rmdir(AT_FDCWD, pathname);
2246}
2247
2248int vfs_unlink(struct inode *dir, struct dentry *dentry)
2249{
2250 int error = may_delete(dir, dentry, 0);
2251
2252 if (error)
2253 return error;
2254
2255 if (!dir->i_op->unlink)
2256 return -EPERM;
2257
2258 mutex_lock(&dentry->d_inode->i_mutex);
2259 if (d_mountpoint(dentry))
2260 error = -EBUSY;
2261 else {
2262 error = security_inode_unlink(dir, dentry);
2263 if (!error) {
2264 error = dir->i_op->unlink(dir, dentry);
2265 if (!error)
2266 dont_mount(dentry);
2267 }
2268 }
2269 mutex_unlock(&dentry->d_inode->i_mutex);
2270
2271
2272 if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) {
2273 fsnotify_link_count(dentry->d_inode);
2274 d_delete(dentry);
2275 }
2276
2277 return error;
2278}
2279
2280
2281
2282
2283
2284
2285
2286static long do_unlinkat(int dfd, const char __user *pathname)
2287{
2288 int error;
2289 char *name;
2290 struct dentry *dentry;
2291 struct nameidata nd;
2292 struct inode *inode = NULL;
2293
2294 error = user_path_parent(dfd, pathname, &nd, &name);
2295 if (error)
2296 return error;
2297
2298 error = -EISDIR;
2299 if (nd.last_type != LAST_NORM)
2300 goto exit1;
2301
2302 nd.flags &= ~LOOKUP_PARENT;
2303
2304 mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
2305 dentry = lookup_hash(&nd);
2306 error = PTR_ERR(dentry);
2307 if (!IS_ERR(dentry)) {
2308
2309 if (nd.last.name[nd.last.len])
2310 goto slashes;
2311 inode = dentry->d_inode;
2312 if (inode)
2313 atomic_inc(&inode->i_count);
2314 error = mnt_want_write(nd.path.mnt);
2315 if (error)
2316 goto exit2;
2317 error = security_path_unlink(&nd.path, dentry);
2318 if (error)
2319 goto exit3;
2320 error = vfs_unlink(nd.path.dentry->d_inode, dentry);
2321exit3:
2322 mnt_drop_write(nd.path.mnt);
2323 exit2:
2324 dput(dentry);
2325 }
2326 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2327 if (inode)
2328 iput(inode);
2329exit1:
2330 path_put(&nd.path);
2331 putname(name);
2332 return error;
2333
2334slashes:
2335 error = !dentry->d_inode ? -ENOENT :
2336 S_ISDIR(dentry->d_inode->i_mode) ? -EISDIR : -ENOTDIR;
2337 goto exit2;
2338}
2339
2340SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag)
2341{
2342 if ((flag & ~AT_REMOVEDIR) != 0)
2343 return -EINVAL;
2344
2345 if (flag & AT_REMOVEDIR)
2346 return do_rmdir(dfd, pathname);
2347
2348 return do_unlinkat(dfd, pathname);
2349}
2350
2351SYSCALL_DEFINE1(unlink, const char __user *, pathname)
2352{
2353 return do_unlinkat(AT_FDCWD, pathname);
2354}
2355
2356int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
2357{
2358 int error = may_create(dir, dentry);
2359
2360 if (error)
2361 return error;
2362
2363 if (!dir->i_op->symlink)
2364 return -EPERM;
2365
2366 error = security_inode_symlink(dir, dentry, oldname);
2367 if (error)
2368 return error;
2369
2370 error = dir->i_op->symlink(dir, dentry, oldname);
2371 if (!error)
2372 fsnotify_create(dir, dentry);
2373 return error;
2374}
2375
2376SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
2377 int, newdfd, const char __user *, newname)
2378{
2379 int error;
2380 char *from;
2381 char *to;
2382 struct dentry *dentry;
2383 struct nameidata nd;
2384
2385 from = getname(oldname);
2386 if (IS_ERR(from))
2387 return PTR_ERR(from);
2388
2389 error = user_path_parent(newdfd, newname, &nd, &to);
2390 if (error)
2391 goto out_putname;
2392
2393 dentry = lookup_create(&nd, 0);
2394 error = PTR_ERR(dentry);
2395 if (IS_ERR(dentry))
2396 goto out_unlock;
2397
2398 error = mnt_want_write(nd.path.mnt);
2399 if (error)
2400 goto out_dput;
2401 error = security_path_symlink(&nd.path, dentry, from);
2402 if (error)
2403 goto out_drop_write;
2404 error = vfs_symlink(nd.path.dentry->d_inode, dentry, from);
2405out_drop_write:
2406 mnt_drop_write(nd.path.mnt);
2407out_dput:
2408 dput(dentry);
2409out_unlock:
2410 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2411 path_put(&nd.path);
2412 putname(to);
2413out_putname:
2414 putname(from);
2415 return error;
2416}
2417
2418SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname)
2419{
2420 return sys_symlinkat(oldname, AT_FDCWD, newname);
2421}
2422
2423int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2424{
2425 struct inode *inode = old_dentry->d_inode;
2426 int error;
2427
2428 if (!inode)
2429 return -ENOENT;
2430
2431 error = may_create(dir, new_dentry);
2432 if (error)
2433 return error;
2434
2435 if (dir->i_sb != inode->i_sb)
2436 return -EXDEV;
2437
2438
2439
2440
2441 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
2442 return -EPERM;
2443 if (!dir->i_op->link)
2444 return -EPERM;
2445 if (S_ISDIR(inode->i_mode))
2446 return -EPERM;
2447
2448 error = security_inode_link(old_dentry, dir, new_dentry);
2449 if (error)
2450 return error;
2451
2452 mutex_lock(&inode->i_mutex);
2453 error = dir->i_op->link(old_dentry, dir, new_dentry);
2454 mutex_unlock(&inode->i_mutex);
2455 if (!error)
2456 fsnotify_link(dir, inode, new_dentry);
2457 return error;
2458}
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
2470 int, newdfd, const char __user *, newname, int, flags)
2471{
2472 struct dentry *new_dentry;
2473 struct nameidata nd;
2474 struct path old_path;
2475 int error;
2476 char *to;
2477
2478 if ((flags & ~AT_SYMLINK_FOLLOW) != 0)
2479 return -EINVAL;
2480
2481 error = user_path_at(olddfd, oldname,
2482 flags & AT_SYMLINK_FOLLOW ? LOOKUP_FOLLOW : 0,
2483 &old_path);
2484 if (error)
2485 return error;
2486
2487 error = user_path_parent(newdfd, newname, &nd, &to);
2488 if (error)
2489 goto out;
2490 error = -EXDEV;
2491 if (old_path.mnt != nd.path.mnt)
2492 goto out_release;
2493 new_dentry = lookup_create(&nd, 0);
2494 error = PTR_ERR(new_dentry);
2495 if (IS_ERR(new_dentry))
2496 goto out_unlock;
2497 error = mnt_want_write(nd.path.mnt);
2498 if (error)
2499 goto out_dput;
2500 error = security_path_link(old_path.dentry, &nd.path, new_dentry);
2501 if (error)
2502 goto out_drop_write;
2503 error = vfs_link(old_path.dentry, nd.path.dentry->d_inode, new_dentry);
2504out_drop_write:
2505 mnt_drop_write(nd.path.mnt);
2506out_dput:
2507 dput(new_dentry);
2508out_unlock:
2509 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2510out_release:
2511 path_put(&nd.path);
2512 putname(to);
2513out:
2514 path_put(&old_path);
2515
2516 return error;
2517}
2518
2519SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname)
2520{
2521 return sys_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
2522}
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
2557 struct inode *new_dir, struct dentry *new_dentry)
2558{
2559 int error = 0;
2560 struct inode *target;
2561
2562
2563
2564
2565
2566 if (new_dir != old_dir) {
2567 error = inode_permission(old_dentry->d_inode, MAY_WRITE);
2568 if (error)
2569 return error;
2570 }
2571
2572 error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry);
2573 if (error)
2574 return error;
2575
2576 target = new_dentry->d_inode;
2577 if (target)
2578 mutex_lock(&target->i_mutex);
2579 if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry))
2580 error = -EBUSY;
2581 else {
2582 if (target)
2583 dentry_unhash(new_dentry);
2584 error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
2585 }
2586 if (target) {
2587 if (!error) {
2588 target->i_flags |= S_DEAD;
2589 dont_mount(new_dentry);
2590 }
2591 mutex_unlock(&target->i_mutex);
2592 if (d_unhashed(new_dentry))
2593 d_rehash(new_dentry);
2594 dput(new_dentry);
2595 }
2596 if (!error)
2597 if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE))
2598 d_move(old_dentry,new_dentry);
2599 return error;
2600}
2601
2602static int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
2603 struct inode *new_dir, struct dentry *new_dentry)
2604{
2605 struct inode *target;
2606 int error;
2607
2608 error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry);
2609 if (error)
2610 return error;
2611
2612 dget(new_dentry);
2613 target = new_dentry->d_inode;
2614 if (target)
2615 mutex_lock(&target->i_mutex);
2616 if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry))
2617 error = -EBUSY;
2618 else
2619 error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
2620 if (!error) {
2621 if (target)
2622 dont_mount(new_dentry);
2623 if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE))
2624 d_move(old_dentry, new_dentry);
2625 }
2626 if (target)
2627 mutex_unlock(&target->i_mutex);
2628 dput(new_dentry);
2629 return error;
2630}
2631
2632int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
2633 struct inode *new_dir, struct dentry *new_dentry)
2634{
2635 int error;
2636 int is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
2637 const char *old_name;
2638
2639 if (old_dentry->d_inode == new_dentry->d_inode)
2640 return 0;
2641
2642 error = may_delete(old_dir, old_dentry, is_dir);
2643 if (error)
2644 return error;
2645
2646 if (!new_dentry->d_inode)
2647 error = may_create(new_dir, new_dentry);
2648 else
2649 error = may_delete(new_dir, new_dentry, is_dir);
2650 if (error)
2651 return error;
2652
2653 if (!old_dir->i_op->rename)
2654 return -EPERM;
2655
2656 old_name = fsnotify_oldname_init(old_dentry->d_name.name);
2657
2658 if (is_dir)
2659 error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
2660 else
2661 error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
2662 if (!error)
2663 fsnotify_move(old_dir, new_dir, old_name, is_dir,
2664 new_dentry->d_inode, old_dentry);
2665 fsnotify_oldname_free(old_name);
2666
2667 return error;
2668}
2669
2670SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
2671 int, newdfd, const char __user *, newname)
2672{
2673 struct dentry *old_dir, *new_dir;
2674 struct dentry *old_dentry, *new_dentry;
2675 struct dentry *trap;
2676 struct nameidata oldnd, newnd;
2677 char *from;
2678 char *to;
2679 int error;
2680
2681 error = user_path_parent(olddfd, oldname, &oldnd, &from);
2682 if (error)
2683 goto exit;
2684
2685 error = user_path_parent(newdfd, newname, &newnd, &to);
2686 if (error)
2687 goto exit1;
2688
2689 error = -EXDEV;
2690 if (oldnd.path.mnt != newnd.path.mnt)
2691 goto exit2;
2692
2693 old_dir = oldnd.path.dentry;
2694 error = -EBUSY;
2695 if (oldnd.last_type != LAST_NORM)
2696 goto exit2;
2697
2698 new_dir = newnd.path.dentry;
2699 if (newnd.last_type != LAST_NORM)
2700 goto exit2;
2701
2702 oldnd.flags &= ~LOOKUP_PARENT;
2703 newnd.flags &= ~LOOKUP_PARENT;
2704 newnd.flags |= LOOKUP_RENAME_TARGET;
2705
2706 trap = lock_rename(new_dir, old_dir);
2707
2708 old_dentry = lookup_hash(&oldnd);
2709 error = PTR_ERR(old_dentry);
2710 if (IS_ERR(old_dentry))
2711 goto exit3;
2712
2713 error = -ENOENT;
2714 if (!old_dentry->d_inode)
2715 goto exit4;
2716
2717 if (!S_ISDIR(old_dentry->d_inode->i_mode)) {
2718 error = -ENOTDIR;
2719 if (oldnd.last.name[oldnd.last.len])
2720 goto exit4;
2721 if (newnd.last.name[newnd.last.len])
2722 goto exit4;
2723 }
2724
2725 error = -EINVAL;
2726 if (old_dentry == trap)
2727 goto exit4;
2728 new_dentry = lookup_hash(&newnd);
2729 error = PTR_ERR(new_dentry);
2730 if (IS_ERR(new_dentry))
2731 goto exit4;
2732
2733 error = -ENOTEMPTY;
2734 if (new_dentry == trap)
2735 goto exit5;
2736
2737 error = mnt_want_write(oldnd.path.mnt);
2738 if (error)
2739 goto exit5;
2740 error = security_path_rename(&oldnd.path, old_dentry,
2741 &newnd.path, new_dentry);
2742 if (error)
2743 goto exit6;
2744 error = vfs_rename(old_dir->d_inode, old_dentry,
2745 new_dir->d_inode, new_dentry);
2746exit6:
2747 mnt_drop_write(oldnd.path.mnt);
2748exit5:
2749 dput(new_dentry);
2750exit4:
2751 dput(old_dentry);
2752exit3:
2753 unlock_rename(new_dir, old_dir);
2754exit2:
2755 path_put(&newnd.path);
2756 putname(to);
2757exit1:
2758 path_put(&oldnd.path);
2759 putname(from);
2760exit:
2761 return error;
2762}
2763
2764SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newname)
2765{
2766 return sys_renameat(AT_FDCWD, oldname, AT_FDCWD, newname);
2767}
2768
2769int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen, const char *link)
2770{
2771 int len;
2772
2773 len = PTR_ERR(link);
2774 if (IS_ERR(link))
2775 goto out;
2776
2777 len = strlen(link);
2778 if (len > (unsigned) buflen)
2779 len = buflen;
2780 if (copy_to_user(buffer, link, len))
2781 len = -EFAULT;
2782out:
2783 return len;
2784}
2785
2786
2787
2788
2789
2790
2791int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen)
2792{
2793 struct nameidata nd;
2794 void *cookie;
2795 int res;
2796
2797 nd.depth = 0;
2798 cookie = dentry->d_inode->i_op->follow_link(dentry, &nd);
2799 if (IS_ERR(cookie))
2800 return PTR_ERR(cookie);
2801
2802 res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd));
2803 if (dentry->d_inode->i_op->put_link)
2804 dentry->d_inode->i_op->put_link(dentry, &nd, cookie);
2805 return res;
2806}
2807
2808int vfs_follow_link(struct nameidata *nd, const char *link)
2809{
2810 return __vfs_follow_link(nd, link);
2811}
2812
2813
2814static char *page_getlink(struct dentry * dentry, struct page **ppage)
2815{
2816 char *kaddr;
2817 struct page *page;
2818 struct address_space *mapping = dentry->d_inode->i_mapping;
2819 page = read_mapping_page(mapping, 0, NULL);
2820 if (IS_ERR(page))
2821 return (char*)page;
2822 *ppage = page;
2823 kaddr = kmap(page);
2824 nd_terminate_link(kaddr, dentry->d_inode->i_size, PAGE_SIZE - 1);
2825 return kaddr;
2826}
2827
2828int page_readlink(struct dentry *dentry, char __user *buffer, int buflen)
2829{
2830 struct page *page = NULL;
2831 char *s = page_getlink(dentry, &page);
2832 int res = vfs_readlink(dentry,buffer,buflen,s);
2833 if (page) {
2834 kunmap(page);
2835 page_cache_release(page);
2836 }
2837 return res;
2838}
2839
2840void *page_follow_link_light(struct dentry *dentry, struct nameidata *nd)
2841{
2842 struct page *page = NULL;
2843 nd_set_link(nd, page_getlink(dentry, &page));
2844 return page;
2845}
2846
2847void page_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
2848{
2849 struct page *page = cookie;
2850
2851 if (page) {
2852 kunmap(page);
2853 page_cache_release(page);
2854 }
2855}
2856
2857
2858
2859
2860int __page_symlink(struct inode *inode, const char *symname, int len, int nofs)
2861{
2862 struct address_space *mapping = inode->i_mapping;
2863 struct page *page;
2864 void *fsdata;
2865 int err;
2866 char *kaddr;
2867 unsigned int flags = AOP_FLAG_UNINTERRUPTIBLE;
2868 if (nofs)
2869 flags |= AOP_FLAG_NOFS;
2870
2871retry:
2872 err = pagecache_write_begin(NULL, mapping, 0, len-1,
2873 flags, &page, &fsdata);
2874 if (err)
2875 goto fail;
2876
2877 kaddr = kmap_atomic(page, KM_USER0);
2878 memcpy(kaddr, symname, len-1);
2879 kunmap_atomic(kaddr, KM_USER0);
2880
2881 err = pagecache_write_end(NULL, mapping, 0, len-1, len-1,
2882 page, fsdata);
2883 if (err < 0)
2884 goto fail;
2885 if (err < len-1)
2886 goto retry;
2887
2888 mark_inode_dirty(inode);
2889 return 0;
2890fail:
2891 return err;
2892}
2893
2894int page_symlink(struct inode *inode, const char *symname, int len)
2895{
2896 return __page_symlink(inode, symname, len,
2897 !(mapping_gfp_mask(inode->i_mapping) & __GFP_FS));
2898}
2899
2900const struct inode_operations page_symlink_inode_operations = {
2901 .readlink = generic_readlink,
2902 .follow_link = page_follow_link_light,
2903 .put_link = page_put_link,
2904};
2905
2906EXPORT_SYMBOL(user_path_at);
2907EXPORT_SYMBOL(follow_down);
2908EXPORT_SYMBOL(follow_up);
2909EXPORT_SYMBOL(get_write_access);
2910EXPORT_SYMBOL(getname);
2911EXPORT_SYMBOL(lock_rename);
2912EXPORT_SYMBOL(lookup_one_len);
2913EXPORT_SYMBOL(page_follow_link_light);
2914EXPORT_SYMBOL(page_put_link);
2915EXPORT_SYMBOL(page_readlink);
2916EXPORT_SYMBOL(__page_symlink);
2917EXPORT_SYMBOL(page_symlink);
2918EXPORT_SYMBOL(page_symlink_inode_operations);
2919EXPORT_SYMBOL(path_lookup);
2920EXPORT_SYMBOL(kern_path);
2921EXPORT_SYMBOL(vfs_path_lookup);
2922EXPORT_SYMBOL(inode_permission);
2923EXPORT_SYMBOL(file_permission);
2924EXPORT_SYMBOL(unlock_rename);
2925EXPORT_SYMBOL(vfs_create);
2926EXPORT_SYMBOL(vfs_follow_link);
2927EXPORT_SYMBOL(vfs_link);
2928EXPORT_SYMBOL(vfs_mkdir);
2929EXPORT_SYMBOL(vfs_mknod);
2930EXPORT_SYMBOL(generic_permission);
2931EXPORT_SYMBOL(vfs_readlink);
2932EXPORT_SYMBOL(vfs_rename);
2933EXPORT_SYMBOL(vfs_rmdir);
2934EXPORT_SYMBOL(vfs_symlink);
2935EXPORT_SYMBOL(vfs_unlink);
2936EXPORT_SYMBOL(dentry_unhash);
2937EXPORT_SYMBOL(generic_readlink);
2938