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