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
175
176
177
178
179
180
181
182
183
184int generic_permission(struct inode *inode, int mask,
185 int (*check_acl)(struct inode *inode, int mask))
186{
187 umode_t mode = inode->i_mode;
188
189 mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
190
191 if (current_fsuid() == inode->i_uid)
192 mode >>= 6;
193 else {
194 if (IS_POSIXACL(inode) && (mode & S_IRWXG) && check_acl) {
195 int error = check_acl(inode, mask);
196 if (error == -EACCES)
197 goto check_capabilities;
198 else if (error != -EAGAIN)
199 return error;
200 }
201
202 if (in_group_p(inode->i_gid))
203 mode >>= 3;
204 }
205
206
207
208
209 if ((mask & ~mode) == 0)
210 return 0;
211
212 check_capabilities:
213
214
215
216
217 if (!(mask & MAY_EXEC) || execute_ok(inode))
218 if (capable(CAP_DAC_OVERRIDE))
219 return 0;
220
221
222
223
224 if (mask == MAY_READ || (S_ISDIR(inode->i_mode) && !(mask & MAY_WRITE)))
225 if (capable(CAP_DAC_READ_SEARCH))
226 return 0;
227
228 return -EACCES;
229}
230
231
232
233
234
235
236
237
238
239
240
241int inode_permission(struct inode *inode, int mask)
242{
243 int retval;
244
245 if (mask & MAY_WRITE) {
246 umode_t mode = inode->i_mode;
247
248
249
250
251 if (IS_RDONLY(inode) &&
252 (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)))
253 return -EROFS;
254
255
256
257
258 if (IS_IMMUTABLE(inode))
259 return -EACCES;
260 }
261
262 if (inode->i_op->permission)
263 retval = inode->i_op->permission(inode, mask);
264 else
265 retval = generic_permission(inode, mask, NULL);
266
267 if (retval)
268 return retval;
269
270 retval = devcgroup_inode_permission(inode, mask);
271 if (retval)
272 return retval;
273
274 return security_inode_permission(inode,
275 mask & (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND));
276}
277
278
279
280
281
282
283
284
285
286
287
288
289
290int file_permission(struct file *file, int mask)
291{
292 return inode_permission(file->f_path.dentry->d_inode, mask);
293}
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313int get_write_access(struct inode * inode)
314{
315 spin_lock(&inode->i_lock);
316 if (atomic_read(&inode->i_writecount) < 0) {
317 spin_unlock(&inode->i_lock);
318 return -ETXTBSY;
319 }
320 atomic_inc(&inode->i_writecount);
321 spin_unlock(&inode->i_lock);
322
323 return 0;
324}
325
326int deny_write_access(struct file * file)
327{
328 struct inode *inode = file->f_path.dentry->d_inode;
329
330 spin_lock(&inode->i_lock);
331 if (atomic_read(&inode->i_writecount) > 0) {
332 spin_unlock(&inode->i_lock);
333 return -ETXTBSY;
334 }
335 atomic_dec(&inode->i_writecount);
336 spin_unlock(&inode->i_lock);
337
338 return 0;
339}
340
341
342
343
344
345
346
347void path_get(struct path *path)
348{
349 mntget(path->mnt);
350 dget(path->dentry);
351}
352EXPORT_SYMBOL(path_get);
353
354
355
356
357
358
359
360void path_put(struct path *path)
361{
362 dput(path->dentry);
363 mntput(path->mnt);
364}
365EXPORT_SYMBOL(path_put);
366
367
368
369
370
371void release_open_intent(struct nameidata *nd)
372{
373 if (nd->intent.open.file->f_path.dentry == NULL)
374 put_filp(nd->intent.open.file);
375 else
376 fput(nd->intent.open.file);
377}
378
379static inline struct dentry *
380do_revalidate(struct dentry *dentry, struct nameidata *nd)
381{
382 int status = dentry->d_op->d_revalidate(dentry, nd);
383 if (unlikely(status <= 0)) {
384
385
386
387
388
389
390 if (!status) {
391 if (!d_invalidate(dentry)) {
392 dput(dentry);
393 dentry = NULL;
394 }
395 } else {
396 dput(dentry);
397 dentry = ERR_PTR(status);
398 }
399 }
400 return dentry;
401}
402
403
404
405
406
407static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, struct nameidata *nd)
408{
409 struct dentry * dentry = __d_lookup(parent, name);
410
411
412
413
414 if (!dentry)
415 dentry = d_lookup(parent, name);
416
417 if (dentry && dentry->d_op && dentry->d_op->d_revalidate)
418 dentry = do_revalidate(dentry, nd);
419
420 return dentry;
421}
422
423
424
425
426
427
428
429
430
431
432
433static int exec_permission_lite(struct inode *inode)
434{
435 umode_t mode = inode->i_mode;
436
437 if (inode->i_op->permission)
438 return -EAGAIN;
439
440 if (current_fsuid() == inode->i_uid)
441 mode >>= 6;
442 else if (in_group_p(inode->i_gid))
443 mode >>= 3;
444
445 if (mode & MAY_EXEC)
446 goto ok;
447
448 if ((inode->i_mode & S_IXUGO) && capable(CAP_DAC_OVERRIDE))
449 goto ok;
450
451 if (S_ISDIR(inode->i_mode) && capable(CAP_DAC_OVERRIDE))
452 goto ok;
453
454 if (S_ISDIR(inode->i_mode) && capable(CAP_DAC_READ_SEARCH))
455 goto ok;
456
457 return -EACCES;
458ok:
459 return security_inode_permission(inode, MAY_EXEC);
460}
461
462
463
464
465
466
467
468
469
470static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, struct nameidata *nd)
471{
472 struct dentry * result;
473 struct inode *dir = parent->d_inode;
474
475 mutex_lock(&dir->i_mutex);
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490 result = d_lookup(parent, name);
491 if (!result) {
492 struct dentry *dentry;
493
494
495 result = ERR_PTR(-ENOENT);
496 if (IS_DEADDIR(dir))
497 goto out_unlock;
498
499 dentry = d_alloc(parent, name);
500 result = ERR_PTR(-ENOMEM);
501 if (dentry) {
502 result = dir->i_op->lookup(dir, dentry, nd);
503 if (result)
504 dput(dentry);
505 else
506 result = dentry;
507 }
508out_unlock:
509 mutex_unlock(&dir->i_mutex);
510 return result;
511 }
512
513
514
515
516
517 mutex_unlock(&dir->i_mutex);
518 if (result->d_op && result->d_op->d_revalidate) {
519 result = do_revalidate(result, nd);
520 if (!result)
521 result = ERR_PTR(-ENOENT);
522 }
523 return result;
524}
525
526
527
528
529
530
531
532
533static __always_inline int link_path_walk(const char *name, struct nameidata *nd)
534{
535 struct path save = nd->path;
536 int result;
537
538
539 path_get(&save);
540
541 result = __link_path_walk(name, nd);
542 if (result == -ESTALE) {
543
544 nd->path = save;
545 path_get(&nd->path);
546 nd->flags |= LOOKUP_REVAL;
547 result = __link_path_walk(name, nd);
548 }
549
550 path_put(&save);
551
552 return result;
553}
554
555static __always_inline void set_root(struct nameidata *nd)
556{
557 if (!nd->root.mnt) {
558 struct fs_struct *fs = current->fs;
559 read_lock(&fs->lock);
560 nd->root = fs->root;
561 path_get(&nd->root);
562 read_unlock(&fs->lock);
563 }
564}
565
566static __always_inline int __vfs_follow_link(struct nameidata *nd, const char *link)
567{
568 int res = 0;
569 char *name;
570 if (IS_ERR(link))
571 goto fail;
572
573 if (*link == '/') {
574 set_root(nd);
575 path_put(&nd->path);
576 nd->path = nd->root;
577 path_get(&nd->root);
578 }
579
580 res = link_path_walk(link, nd);
581 if (nd->depth || res || nd->last_type!=LAST_NORM)
582 return res;
583
584
585
586
587
588 name = __getname();
589 if (unlikely(!name)) {
590 path_put(&nd->path);
591 return -ENOMEM;
592 }
593 strcpy(name, nd->last.name);
594 nd->last.name = name;
595 return 0;
596fail:
597 path_put(&nd->path);
598 return PTR_ERR(link);
599}
600
601static void path_put_conditional(struct path *path, struct nameidata *nd)
602{
603 dput(path->dentry);
604 if (path->mnt != nd->path.mnt)
605 mntput(path->mnt);
606}
607
608static inline void path_to_nameidata(struct path *path, struct nameidata *nd)
609{
610 dput(nd->path.dentry);
611 if (nd->path.mnt != path->mnt)
612 mntput(nd->path.mnt);
613 nd->path.mnt = path->mnt;
614 nd->path.dentry = path->dentry;
615}
616
617static __always_inline int __do_follow_link(struct path *path, struct nameidata *nd)
618{
619 int error;
620 void *cookie;
621 struct dentry *dentry = path->dentry;
622
623 touch_atime(path->mnt, dentry);
624 nd_set_link(nd, NULL);
625
626 if (path->mnt != nd->path.mnt) {
627 path_to_nameidata(path, nd);
628 dget(dentry);
629 }
630 mntget(path->mnt);
631 cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
632 error = PTR_ERR(cookie);
633 if (!IS_ERR(cookie)) {
634 char *s = nd_get_link(nd);
635 error = 0;
636 if (s)
637 error = __vfs_follow_link(nd, s);
638 if (dentry->d_inode->i_op->put_link)
639 dentry->d_inode->i_op->put_link(dentry, nd, cookie);
640 }
641 path_put(path);
642
643 return error;
644}
645
646
647
648
649
650
651
652
653static inline int do_follow_link(struct path *path, struct nameidata *nd)
654{
655 int err = -ELOOP;
656 if (current->link_count >= MAX_NESTED_LINKS)
657 goto loop;
658 if (current->total_link_count >= 40)
659 goto loop;
660 BUG_ON(nd->depth >= MAX_NESTED_LINKS);
661 cond_resched();
662 err = security_inode_follow_link(path->dentry, nd);
663 if (err)
664 goto loop;
665 current->link_count++;
666 current->total_link_count++;
667 nd->depth++;
668 err = __do_follow_link(path, nd);
669 current->link_count--;
670 nd->depth--;
671 return err;
672loop:
673 path_put_conditional(path, nd);
674 path_put(&nd->path);
675 return err;
676}
677
678int follow_up(struct path *path)
679{
680 struct vfsmount *parent;
681 struct dentry *mountpoint;
682 spin_lock(&vfsmount_lock);
683 parent = path->mnt->mnt_parent;
684 if (parent == path->mnt) {
685 spin_unlock(&vfsmount_lock);
686 return 0;
687 }
688 mntget(parent);
689 mountpoint = dget(path->mnt->mnt_mountpoint);
690 spin_unlock(&vfsmount_lock);
691 dput(path->dentry);
692 path->dentry = mountpoint;
693 mntput(path->mnt);
694 path->mnt = parent;
695 return 1;
696}
697
698
699
700
701static int __follow_mount(struct path *path)
702{
703 int res = 0;
704 while (d_mountpoint(path->dentry)) {
705 struct vfsmount *mounted = lookup_mnt(path);
706 if (!mounted)
707 break;
708 dput(path->dentry);
709 if (res)
710 mntput(path->mnt);
711 path->mnt = mounted;
712 path->dentry = dget(mounted->mnt_root);
713 res = 1;
714 }
715 return res;
716}
717
718static void follow_mount(struct path *path)
719{
720 while (d_mountpoint(path->dentry)) {
721 struct vfsmount *mounted = lookup_mnt(path);
722 if (!mounted)
723 break;
724 dput(path->dentry);
725 mntput(path->mnt);
726 path->mnt = mounted;
727 path->dentry = dget(mounted->mnt_root);
728 }
729}
730
731
732
733
734int follow_down(struct path *path)
735{
736 struct vfsmount *mounted;
737
738 mounted = lookup_mnt(path);
739 if (mounted) {
740 dput(path->dentry);
741 mntput(path->mnt);
742 path->mnt = mounted;
743 path->dentry = dget(mounted->mnt_root);
744 return 1;
745 }
746 return 0;
747}
748
749static __always_inline void follow_dotdot(struct nameidata *nd)
750{
751 set_root(nd);
752
753 while(1) {
754 struct vfsmount *parent;
755 struct dentry *old = nd->path.dentry;
756
757 if (nd->path.dentry == nd->root.dentry &&
758 nd->path.mnt == nd->root.mnt) {
759 break;
760 }
761 spin_lock(&dcache_lock);
762 if (nd->path.dentry != nd->path.mnt->mnt_root) {
763 nd->path.dentry = dget(nd->path.dentry->d_parent);
764 spin_unlock(&dcache_lock);
765 dput(old);
766 break;
767 }
768 spin_unlock(&dcache_lock);
769 spin_lock(&vfsmount_lock);
770 parent = nd->path.mnt->mnt_parent;
771 if (parent == nd->path.mnt) {
772 spin_unlock(&vfsmount_lock);
773 break;
774 }
775 mntget(parent);
776 nd->path.dentry = dget(nd->path.mnt->mnt_mountpoint);
777 spin_unlock(&vfsmount_lock);
778 dput(old);
779 mntput(nd->path.mnt);
780 nd->path.mnt = parent;
781 }
782 follow_mount(&nd->path);
783}
784
785
786
787
788
789
790static int do_lookup(struct nameidata *nd, struct qstr *name,
791 struct path *path)
792{
793 struct vfsmount *mnt = nd->path.mnt;
794 struct dentry *dentry = __d_lookup(nd->path.dentry, name);
795
796 if (!dentry)
797 goto need_lookup;
798 if (dentry->d_op && dentry->d_op->d_revalidate)
799 goto need_revalidate;
800done:
801 path->mnt = mnt;
802 path->dentry = dentry;
803 __follow_mount(path);
804 return 0;
805
806need_lookup:
807 dentry = real_lookup(nd->path.dentry, name, nd);
808 if (IS_ERR(dentry))
809 goto fail;
810 goto done;
811
812need_revalidate:
813 dentry = do_revalidate(dentry, nd);
814 if (!dentry)
815 goto need_lookup;
816 if (IS_ERR(dentry))
817 goto fail;
818 goto done;
819
820fail:
821 return PTR_ERR(dentry);
822}
823
824
825
826
827
828
829
830
831
832static int __link_path_walk(const char *name, struct nameidata *nd)
833{
834 struct path next;
835 struct inode *inode;
836 int err;
837 unsigned int lookup_flags = nd->flags;
838
839 while (*name=='/')
840 name++;
841 if (!*name)
842 goto return_reval;
843
844 inode = nd->path.dentry->d_inode;
845 if (nd->depth)
846 lookup_flags = LOOKUP_FOLLOW | (nd->flags & LOOKUP_CONTINUE);
847
848
849 for(;;) {
850 unsigned long hash;
851 struct qstr this;
852 unsigned int c;
853
854 nd->flags |= LOOKUP_CONTINUE;
855 err = exec_permission_lite(inode);
856 if (err == -EAGAIN)
857 err = inode_permission(nd->path.dentry->d_inode,
858 MAY_EXEC);
859 if (!err)
860 err = ima_path_check(&nd->path, MAY_EXEC,
861 IMA_COUNT_UPDATE);
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,
1537 acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC),
1538 IMA_COUNT_UPDATE);
1539 if (error)
1540 return error;
1541
1542
1543
1544 if (IS_APPEND(inode)) {
1545 error = -EPERM;
1546 if ((flag & FMODE_WRITE) && !(flag & O_APPEND))
1547 goto err_out;
1548 if (flag & O_TRUNC)
1549 goto err_out;
1550 }
1551
1552
1553 if (flag & O_NOATIME)
1554 if (!is_owner_or_cap(inode)) {
1555 error = -EPERM;
1556 goto err_out;
1557 }
1558
1559
1560
1561
1562 error = break_lease(inode, flag);
1563 if (error)
1564 goto err_out;
1565
1566 if (flag & O_TRUNC) {
1567 error = get_write_access(inode);
1568 if (error)
1569 goto err_out;
1570
1571
1572
1573
1574 error = locks_verify_locked(inode);
1575 if (!error)
1576 error = security_path_truncate(path, 0,
1577 ATTR_MTIME|ATTR_CTIME|ATTR_OPEN);
1578 if (!error) {
1579 vfs_dq_init(inode);
1580
1581 error = do_truncate(dentry, 0,
1582 ATTR_MTIME|ATTR_CTIME|ATTR_OPEN,
1583 NULL);
1584 }
1585 put_write_access(inode);
1586 if (error)
1587 goto err_out;
1588 } else
1589 if (flag & FMODE_WRITE)
1590 vfs_dq_init(inode);
1591
1592 return 0;
1593err_out:
1594 ima_counts_put(path, acc_mode ?
1595 acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC) :
1596 ACC_MODE(flag) & (MAY_READ | MAY_WRITE));
1597 return error;
1598}
1599
1600
1601
1602
1603
1604
1605static int __open_namei_create(struct nameidata *nd, struct path *path,
1606 int flag, int mode)
1607{
1608 int error;
1609 struct dentry *dir = nd->path.dentry;
1610
1611 if (!IS_POSIXACL(dir->d_inode))
1612 mode &= ~current_umask();
1613 error = security_path_mknod(&nd->path, path->dentry, mode, 0);
1614 if (error)
1615 goto out_unlock;
1616 error = vfs_create(dir->d_inode, path->dentry, mode, nd);
1617out_unlock:
1618 mutex_unlock(&dir->d_inode->i_mutex);
1619 dput(nd->path.dentry);
1620 nd->path.dentry = path->dentry;
1621 if (error)
1622 return error;
1623
1624 return may_open(&nd->path, 0, flag & ~O_TRUNC);
1625}
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644static inline int open_to_namei_flags(int flag)
1645{
1646 if ((flag+1) & O_ACCMODE)
1647 flag++;
1648 return flag;
1649}
1650
1651static int open_will_write_to_fs(int flag, struct inode *inode)
1652{
1653
1654
1655
1656
1657 if (special_file(inode->i_mode))
1658 return 0;
1659 return (flag & O_TRUNC);
1660}
1661
1662
1663
1664
1665
1666
1667struct file *do_filp_open(int dfd, const char *pathname,
1668 int open_flag, int mode, int acc_mode)
1669{
1670 struct file *filp;
1671 struct nameidata nd;
1672 int error;
1673 struct path path;
1674 struct dentry *dir;
1675 int count = 0;
1676 int will_write;
1677 int flag = open_to_namei_flags(open_flag);
1678
1679 if (!acc_mode)
1680 acc_mode = MAY_OPEN | ACC_MODE(flag);
1681
1682
1683 if (flag & O_TRUNC)
1684 acc_mode |= MAY_WRITE;
1685
1686
1687
1688 if (flag & O_APPEND)
1689 acc_mode |= MAY_APPEND;
1690
1691
1692
1693
1694 if (!(flag & O_CREAT)) {
1695 error = path_lookup_open(dfd, pathname, lookup_flags(flag),
1696 &nd, flag);
1697 if (error)
1698 return ERR_PTR(error);
1699 goto ok;
1700 }
1701
1702
1703
1704
1705 error = path_init(dfd, pathname, LOOKUP_PARENT, &nd);
1706 if (error)
1707 return ERR_PTR(error);
1708 error = path_walk(pathname, &nd);
1709 if (error) {
1710 if (nd.root.mnt)
1711 path_put(&nd.root);
1712 return ERR_PTR(error);
1713 }
1714 if (unlikely(!audit_dummy_context()))
1715 audit_inode(pathname, nd.path.dentry);
1716
1717
1718
1719
1720
1721
1722 error = -EISDIR;
1723 if (nd.last_type != LAST_NORM || nd.last.name[nd.last.len])
1724 goto exit_parent;
1725
1726 error = -ENFILE;
1727 filp = get_empty_filp();
1728 if (filp == NULL)
1729 goto exit_parent;
1730 nd.intent.open.file = filp;
1731 nd.intent.open.flags = flag;
1732 nd.intent.open.create_mode = mode;
1733 dir = nd.path.dentry;
1734 nd.flags &= ~LOOKUP_PARENT;
1735 nd.flags |= LOOKUP_CREATE | LOOKUP_OPEN;
1736 if (flag & O_EXCL)
1737 nd.flags |= LOOKUP_EXCL;
1738 mutex_lock(&dir->d_inode->i_mutex);
1739 path.dentry = lookup_hash(&nd);
1740 path.mnt = nd.path.mnt;
1741
1742do_last:
1743 error = PTR_ERR(path.dentry);
1744 if (IS_ERR(path.dentry)) {
1745 mutex_unlock(&dir->d_inode->i_mutex);
1746 goto exit;
1747 }
1748
1749 if (IS_ERR(nd.intent.open.file)) {
1750 error = PTR_ERR(nd.intent.open.file);
1751 goto exit_mutex_unlock;
1752 }
1753
1754
1755 if (!path.dentry->d_inode) {
1756
1757
1758
1759
1760
1761
1762
1763 error = mnt_want_write(nd.path.mnt);
1764 if (error)
1765 goto exit_mutex_unlock;
1766 error = __open_namei_create(&nd, &path, flag, mode);
1767 if (error) {
1768 mnt_drop_write(nd.path.mnt);
1769 goto exit;
1770 }
1771 filp = nameidata_to_filp(&nd, open_flag);
1772 if (IS_ERR(filp))
1773 ima_counts_put(&nd.path,
1774 acc_mode & (MAY_READ | MAY_WRITE |
1775 MAY_EXEC));
1776 mnt_drop_write(nd.path.mnt);
1777 if (nd.root.mnt)
1778 path_put(&nd.root);
1779 return filp;
1780 }
1781
1782
1783
1784
1785 mutex_unlock(&dir->d_inode->i_mutex);
1786 audit_inode(pathname, path.dentry);
1787
1788 error = -EEXIST;
1789 if (flag & O_EXCL)
1790 goto exit_dput;
1791
1792 if (__follow_mount(&path)) {
1793 error = -ELOOP;
1794 if (flag & O_NOFOLLOW)
1795 goto exit_dput;
1796 }
1797
1798 error = -ENOENT;
1799 if (!path.dentry->d_inode)
1800 goto exit_dput;
1801 if (path.dentry->d_inode->i_op->follow_link)
1802 goto do_link;
1803
1804 path_to_nameidata(&path, &nd);
1805 error = -EISDIR;
1806 if (path.dentry->d_inode && S_ISDIR(path.dentry->d_inode->i_mode))
1807 goto exit;
1808ok:
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819 will_write = open_will_write_to_fs(flag, nd.path.dentry->d_inode);
1820 if (will_write) {
1821 error = mnt_want_write(nd.path.mnt);
1822 if (error)
1823 goto exit;
1824 }
1825 error = may_open(&nd.path, acc_mode, flag);
1826 if (error) {
1827 if (will_write)
1828 mnt_drop_write(nd.path.mnt);
1829 goto exit;
1830 }
1831 filp = nameidata_to_filp(&nd, open_flag);
1832 if (IS_ERR(filp))
1833 ima_counts_put(&nd.path,
1834 acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC));
1835
1836
1837
1838
1839
1840 if (will_write)
1841 mnt_drop_write(nd.path.mnt);
1842 if (nd.root.mnt)
1843 path_put(&nd.root);
1844 return filp;
1845
1846exit_mutex_unlock:
1847 mutex_unlock(&dir->d_inode->i_mutex);
1848exit_dput:
1849 path_put_conditional(&path, &nd);
1850exit:
1851 if (!IS_ERR(nd.intent.open.file))
1852 release_open_intent(&nd);
1853exit_parent:
1854 if (nd.root.mnt)
1855 path_put(&nd.root);
1856 path_put(&nd.path);
1857 return ERR_PTR(error);
1858
1859do_link:
1860 error = -ELOOP;
1861 if (flag & O_NOFOLLOW)
1862 goto exit_dput;
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873 nd.flags |= LOOKUP_PARENT;
1874 error = security_inode_follow_link(path.dentry, &nd);
1875 if (error)
1876 goto exit_dput;
1877 error = __do_follow_link(&path, &nd);
1878 if (error) {
1879
1880
1881
1882
1883 release_open_intent(&nd);
1884 if (nd.root.mnt)
1885 path_put(&nd.root);
1886 return ERR_PTR(error);
1887 }
1888 nd.flags &= ~LOOKUP_PARENT;
1889 if (nd.last_type == LAST_BIND)
1890 goto ok;
1891 error = -EISDIR;
1892 if (nd.last_type != LAST_NORM)
1893 goto exit;
1894 if (nd.last.name[nd.last.len]) {
1895 __putname(nd.last.name);
1896 goto exit;
1897 }
1898 error = -ELOOP;
1899 if (count++==32) {
1900 __putname(nd.last.name);
1901 goto exit;
1902 }
1903 dir = nd.path.dentry;
1904 mutex_lock(&dir->d_inode->i_mutex);
1905 path.dentry = lookup_hash(&nd);
1906 path.mnt = nd.path.mnt;
1907 __putname(nd.last.name);
1908 goto do_last;
1909}
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922struct file *filp_open(const char *filename, int flags, int mode)
1923{
1924 return do_filp_open(AT_FDCWD, filename, flags, mode, 0);
1925}
1926EXPORT_SYMBOL(filp_open);
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938struct dentry *lookup_create(struct nameidata *nd, int is_dir)
1939{
1940 struct dentry *dentry = ERR_PTR(-EEXIST);
1941
1942 mutex_lock_nested(&nd->path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
1943
1944
1945
1946
1947 if (nd->last_type != LAST_NORM)
1948 goto fail;
1949 nd->flags &= ~LOOKUP_PARENT;
1950 nd->flags |= LOOKUP_CREATE | LOOKUP_EXCL;
1951 nd->intent.open.flags = O_EXCL;
1952
1953
1954
1955
1956 dentry = lookup_hash(nd);
1957 if (IS_ERR(dentry))
1958 goto fail;
1959
1960 if (dentry->d_inode)
1961 goto eexist;
1962
1963
1964
1965
1966
1967
1968 if (unlikely(!is_dir && nd->last.name[nd->last.len])) {
1969 dput(dentry);
1970 dentry = ERR_PTR(-ENOENT);
1971 }
1972 return dentry;
1973eexist:
1974 dput(dentry);
1975 dentry = ERR_PTR(-EEXIST);
1976fail:
1977 return dentry;
1978}
1979EXPORT_SYMBOL_GPL(lookup_create);
1980
1981int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
1982{
1983 int error = may_create(dir, dentry);
1984
1985 if (error)
1986 return error;
1987
1988 if ((S_ISCHR(mode) || S_ISBLK(mode)) && !capable(CAP_MKNOD))
1989 return -EPERM;
1990
1991 if (!dir->i_op->mknod)
1992 return -EPERM;
1993
1994 error = devcgroup_inode_mknod(mode, dev);
1995 if (error)
1996 return error;
1997
1998 error = security_inode_mknod(dir, dentry, mode, dev);
1999 if (error)
2000 return error;
2001
2002 vfs_dq_init(dir);
2003 error = dir->i_op->mknod(dir, dentry, mode, dev);
2004 if (!error)
2005 fsnotify_create(dir, dentry);
2006 return error;
2007}
2008
2009static int may_mknod(mode_t mode)
2010{
2011 switch (mode & S_IFMT) {
2012 case S_IFREG:
2013 case S_IFCHR:
2014 case S_IFBLK:
2015 case S_IFIFO:
2016 case S_IFSOCK:
2017 case 0:
2018 return 0;
2019 case S_IFDIR:
2020 return -EPERM;
2021 default:
2022 return -EINVAL;
2023 }
2024}
2025
2026SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, int, mode,
2027 unsigned, dev)
2028{
2029 int error;
2030 char *tmp;
2031 struct dentry *dentry;
2032 struct nameidata nd;
2033
2034 if (S_ISDIR(mode))
2035 return -EPERM;
2036
2037 error = user_path_parent(dfd, filename, &nd, &tmp);
2038 if (error)
2039 return error;
2040
2041 dentry = lookup_create(&nd, 0);
2042 if (IS_ERR(dentry)) {
2043 error = PTR_ERR(dentry);
2044 goto out_unlock;
2045 }
2046 if (!IS_POSIXACL(nd.path.dentry->d_inode))
2047 mode &= ~current_umask();
2048 error = may_mknod(mode);
2049 if (error)
2050 goto out_dput;
2051 error = mnt_want_write(nd.path.mnt);
2052 if (error)
2053 goto out_dput;
2054 error = security_path_mknod(&nd.path, dentry, mode, dev);
2055 if (error)
2056 goto out_drop_write;
2057 switch (mode & S_IFMT) {
2058 case 0: case S_IFREG:
2059 error = vfs_create(nd.path.dentry->d_inode,dentry,mode,&nd);
2060 break;
2061 case S_IFCHR: case S_IFBLK:
2062 error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,
2063 new_decode_dev(dev));
2064 break;
2065 case S_IFIFO: case S_IFSOCK:
2066 error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,0);
2067 break;
2068 }
2069out_drop_write:
2070 mnt_drop_write(nd.path.mnt);
2071out_dput:
2072 dput(dentry);
2073out_unlock:
2074 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2075 path_put(&nd.path);
2076 putname(tmp);
2077
2078 return error;
2079}
2080
2081SYSCALL_DEFINE3(mknod, const char __user *, filename, int, mode, unsigned, dev)
2082{
2083 return sys_mknodat(AT_FDCWD, filename, mode, dev);
2084}
2085
2086int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
2087{
2088 int error = may_create(dir, dentry);
2089
2090 if (error)
2091 return error;
2092
2093 if (!dir->i_op->mkdir)
2094 return -EPERM;
2095
2096 mode &= (S_IRWXUGO|S_ISVTX);
2097 error = security_inode_mkdir(dir, dentry, mode);
2098 if (error)
2099 return error;
2100
2101 vfs_dq_init(dir);
2102 error = dir->i_op->mkdir(dir, dentry, mode);
2103 if (!error)
2104 fsnotify_mkdir(dir, dentry);
2105 return error;
2106}
2107
2108SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, int, mode)
2109{
2110 int error = 0;
2111 char * tmp;
2112 struct dentry *dentry;
2113 struct nameidata nd;
2114
2115 error = user_path_parent(dfd, pathname, &nd, &tmp);
2116 if (error)
2117 goto out_err;
2118
2119 dentry = lookup_create(&nd, 1);
2120 error = PTR_ERR(dentry);
2121 if (IS_ERR(dentry))
2122 goto out_unlock;
2123
2124 if (!IS_POSIXACL(nd.path.dentry->d_inode))
2125 mode &= ~current_umask();
2126 error = mnt_want_write(nd.path.mnt);
2127 if (error)
2128 goto out_dput;
2129 error = security_path_mkdir(&nd.path, dentry, mode);
2130 if (error)
2131 goto out_drop_write;
2132 error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode);
2133out_drop_write:
2134 mnt_drop_write(nd.path.mnt);
2135out_dput:
2136 dput(dentry);
2137out_unlock:
2138 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2139 path_put(&nd.path);
2140 putname(tmp);
2141out_err:
2142 return error;
2143}
2144
2145SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)
2146{
2147 return sys_mkdirat(AT_FDCWD, pathname, mode);
2148}
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165void dentry_unhash(struct dentry *dentry)
2166{
2167 dget(dentry);
2168 shrink_dcache_parent(dentry);
2169 spin_lock(&dcache_lock);
2170 spin_lock(&dentry->d_lock);
2171 if (atomic_read(&dentry->d_count) == 2)
2172 __d_drop(dentry);
2173 spin_unlock(&dentry->d_lock);
2174 spin_unlock(&dcache_lock);
2175}
2176
2177int vfs_rmdir(struct inode *dir, struct dentry *dentry)
2178{
2179 int error = may_delete(dir, dentry, 1);
2180
2181 if (error)
2182 return error;
2183
2184 if (!dir->i_op->rmdir)
2185 return -EPERM;
2186
2187 vfs_dq_init(dir);
2188
2189 mutex_lock(&dentry->d_inode->i_mutex);
2190 dentry_unhash(dentry);
2191 if (d_mountpoint(dentry))
2192 error = -EBUSY;
2193 else {
2194 error = security_inode_rmdir(dir, dentry);
2195 if (!error) {
2196 error = dir->i_op->rmdir(dir, dentry);
2197 if (!error)
2198 dentry->d_inode->i_flags |= S_DEAD;
2199 }
2200 }
2201 mutex_unlock(&dentry->d_inode->i_mutex);
2202 if (!error) {
2203 d_delete(dentry);
2204 }
2205 dput(dentry);
2206
2207 return error;
2208}
2209
2210static long do_rmdir(int dfd, const char __user *pathname)
2211{
2212 int error = 0;
2213 char * name;
2214 struct dentry *dentry;
2215 struct nameidata nd;
2216
2217 error = user_path_parent(dfd, pathname, &nd, &name);
2218 if (error)
2219 return error;
2220
2221 switch(nd.last_type) {
2222 case LAST_DOTDOT:
2223 error = -ENOTEMPTY;
2224 goto exit1;
2225 case LAST_DOT:
2226 error = -EINVAL;
2227 goto exit1;
2228 case LAST_ROOT:
2229 error = -EBUSY;
2230 goto exit1;
2231 }
2232
2233 nd.flags &= ~LOOKUP_PARENT;
2234
2235 mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
2236 dentry = lookup_hash(&nd);
2237 error = PTR_ERR(dentry);
2238 if (IS_ERR(dentry))
2239 goto exit2;
2240 error = mnt_want_write(nd.path.mnt);
2241 if (error)
2242 goto exit3;
2243 error = security_path_rmdir(&nd.path, dentry);
2244 if (error)
2245 goto exit4;
2246 error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
2247exit4:
2248 mnt_drop_write(nd.path.mnt);
2249exit3:
2250 dput(dentry);
2251exit2:
2252 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2253exit1:
2254 path_put(&nd.path);
2255 putname(name);
2256 return error;
2257}
2258
2259SYSCALL_DEFINE1(rmdir, const char __user *, pathname)
2260{
2261 return do_rmdir(AT_FDCWD, pathname);
2262}
2263
2264int vfs_unlink(struct inode *dir, struct dentry *dentry)
2265{
2266 int error = may_delete(dir, dentry, 0);
2267
2268 if (error)
2269 return error;
2270
2271 if (!dir->i_op->unlink)
2272 return -EPERM;
2273
2274 vfs_dq_init(dir);
2275
2276 mutex_lock(&dentry->d_inode->i_mutex);
2277 if (d_mountpoint(dentry))
2278 error = -EBUSY;
2279 else {
2280 error = security_inode_unlink(dir, dentry);
2281 if (!error)
2282 error = dir->i_op->unlink(dir, dentry);
2283 }
2284 mutex_unlock(&dentry->d_inode->i_mutex);
2285
2286
2287 if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) {
2288 fsnotify_link_count(dentry->d_inode);
2289 d_delete(dentry);
2290 }
2291
2292 return error;
2293}
2294
2295
2296
2297
2298
2299
2300
2301static long do_unlinkat(int dfd, const char __user *pathname)
2302{
2303 int error;
2304 char *name;
2305 struct dentry *dentry;
2306 struct nameidata nd;
2307 struct inode *inode = NULL;
2308
2309 error = user_path_parent(dfd, pathname, &nd, &name);
2310 if (error)
2311 return error;
2312
2313 error = -EISDIR;
2314 if (nd.last_type != LAST_NORM)
2315 goto exit1;
2316
2317 nd.flags &= ~LOOKUP_PARENT;
2318
2319 mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
2320 dentry = lookup_hash(&nd);
2321 error = PTR_ERR(dentry);
2322 if (!IS_ERR(dentry)) {
2323
2324 if (nd.last.name[nd.last.len])
2325 goto slashes;
2326 inode = dentry->d_inode;
2327 if (inode)
2328 atomic_inc(&inode->i_count);
2329 error = mnt_want_write(nd.path.mnt);
2330 if (error)
2331 goto exit2;
2332 error = security_path_unlink(&nd.path, dentry);
2333 if (error)
2334 goto exit3;
2335 error = vfs_unlink(nd.path.dentry->d_inode, dentry);
2336exit3:
2337 mnt_drop_write(nd.path.mnt);
2338 exit2:
2339 dput(dentry);
2340 }
2341 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2342 if (inode)
2343 iput(inode);
2344exit1:
2345 path_put(&nd.path);
2346 putname(name);
2347 return error;
2348
2349slashes:
2350 error = !dentry->d_inode ? -ENOENT :
2351 S_ISDIR(dentry->d_inode->i_mode) ? -EISDIR : -ENOTDIR;
2352 goto exit2;
2353}
2354
2355SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag)
2356{
2357 if ((flag & ~AT_REMOVEDIR) != 0)
2358 return -EINVAL;
2359
2360 if (flag & AT_REMOVEDIR)
2361 return do_rmdir(dfd, pathname);
2362
2363 return do_unlinkat(dfd, pathname);
2364}
2365
2366SYSCALL_DEFINE1(unlink, const char __user *, pathname)
2367{
2368 return do_unlinkat(AT_FDCWD, pathname);
2369}
2370
2371int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
2372{
2373 int error = may_create(dir, dentry);
2374
2375 if (error)
2376 return error;
2377
2378 if (!dir->i_op->symlink)
2379 return -EPERM;
2380
2381 error = security_inode_symlink(dir, dentry, oldname);
2382 if (error)
2383 return error;
2384
2385 vfs_dq_init(dir);
2386 error = dir->i_op->symlink(dir, dentry, oldname);
2387 if (!error)
2388 fsnotify_create(dir, dentry);
2389 return error;
2390}
2391
2392SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
2393 int, newdfd, const char __user *, newname)
2394{
2395 int error;
2396 char *from;
2397 char *to;
2398 struct dentry *dentry;
2399 struct nameidata nd;
2400
2401 from = getname(oldname);
2402 if (IS_ERR(from))
2403 return PTR_ERR(from);
2404
2405 error = user_path_parent(newdfd, newname, &nd, &to);
2406 if (error)
2407 goto out_putname;
2408
2409 dentry = lookup_create(&nd, 0);
2410 error = PTR_ERR(dentry);
2411 if (IS_ERR(dentry))
2412 goto out_unlock;
2413
2414 error = mnt_want_write(nd.path.mnt);
2415 if (error)
2416 goto out_dput;
2417 error = security_path_symlink(&nd.path, dentry, from);
2418 if (error)
2419 goto out_drop_write;
2420 error = vfs_symlink(nd.path.dentry->d_inode, dentry, from);
2421out_drop_write:
2422 mnt_drop_write(nd.path.mnt);
2423out_dput:
2424 dput(dentry);
2425out_unlock:
2426 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2427 path_put(&nd.path);
2428 putname(to);
2429out_putname:
2430 putname(from);
2431 return error;
2432}
2433
2434SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname)
2435{
2436 return sys_symlinkat(oldname, AT_FDCWD, newname);
2437}
2438
2439int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2440{
2441 struct inode *inode = old_dentry->d_inode;
2442 int error;
2443
2444 if (!inode)
2445 return -ENOENT;
2446
2447 error = may_create(dir, new_dentry);
2448 if (error)
2449 return error;
2450
2451 if (dir->i_sb != inode->i_sb)
2452 return -EXDEV;
2453
2454
2455
2456
2457 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
2458 return -EPERM;
2459 if (!dir->i_op->link)
2460 return -EPERM;
2461 if (S_ISDIR(inode->i_mode))
2462 return -EPERM;
2463
2464 error = security_inode_link(old_dentry, dir, new_dentry);
2465 if (error)
2466 return error;
2467
2468 mutex_lock(&inode->i_mutex);
2469 vfs_dq_init(dir);
2470 error = dir->i_op->link(old_dentry, dir, new_dentry);
2471 mutex_unlock(&inode->i_mutex);
2472 if (!error)
2473 fsnotify_link(dir, inode, new_dentry);
2474 return error;
2475}
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
2487 int, newdfd, const char __user *, newname, int, flags)
2488{
2489 struct dentry *new_dentry;
2490 struct nameidata nd;
2491 struct path old_path;
2492 int error;
2493 char *to;
2494
2495 if ((flags & ~AT_SYMLINK_FOLLOW) != 0)
2496 return -EINVAL;
2497
2498 error = user_path_at(olddfd, oldname,
2499 flags & AT_SYMLINK_FOLLOW ? LOOKUP_FOLLOW : 0,
2500 &old_path);
2501 if (error)
2502 return error;
2503
2504 error = user_path_parent(newdfd, newname, &nd, &to);
2505 if (error)
2506 goto out;
2507 error = -EXDEV;
2508 if (old_path.mnt != nd.path.mnt)
2509 goto out_release;
2510 new_dentry = lookup_create(&nd, 0);
2511 error = PTR_ERR(new_dentry);
2512 if (IS_ERR(new_dentry))
2513 goto out_unlock;
2514 error = mnt_want_write(nd.path.mnt);
2515 if (error)
2516 goto out_dput;
2517 error = security_path_link(old_path.dentry, &nd.path, new_dentry);
2518 if (error)
2519 goto out_drop_write;
2520 error = vfs_link(old_path.dentry, nd.path.dentry->d_inode, new_dentry);
2521out_drop_write:
2522 mnt_drop_write(nd.path.mnt);
2523out_dput:
2524 dput(new_dentry);
2525out_unlock:
2526 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
2527out_release:
2528 path_put(&nd.path);
2529 putname(to);
2530out:
2531 path_put(&old_path);
2532
2533 return error;
2534}
2535
2536SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname)
2537{
2538 return sys_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
2539}
2540
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
2573static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
2574 struct inode *new_dir, struct dentry *new_dentry)
2575{
2576 int error = 0;
2577 struct inode *target;
2578
2579
2580
2581
2582
2583 if (new_dir != old_dir) {
2584 error = inode_permission(old_dentry->d_inode, MAY_WRITE);
2585 if (error)
2586 return error;
2587 }
2588
2589 error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry);
2590 if (error)
2591 return error;
2592
2593 target = new_dentry->d_inode;
2594 if (target) {
2595 mutex_lock(&target->i_mutex);
2596 dentry_unhash(new_dentry);
2597 }
2598 if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry))
2599 error = -EBUSY;
2600 else
2601 error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
2602 if (target) {
2603 if (!error)
2604 target->i_flags |= S_DEAD;
2605 mutex_unlock(&target->i_mutex);
2606 if (d_unhashed(new_dentry))
2607 d_rehash(new_dentry);
2608 dput(new_dentry);
2609 }
2610 if (!error)
2611 if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE))
2612 d_move(old_dentry,new_dentry);
2613 return error;
2614}
2615
2616static int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
2617 struct inode *new_dir, struct dentry *new_dentry)
2618{
2619 struct inode *target;
2620 int error;
2621
2622 error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry);
2623 if (error)
2624 return error;
2625
2626 dget(new_dentry);
2627 target = new_dentry->d_inode;
2628 if (target)
2629 mutex_lock(&target->i_mutex);
2630 if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry))
2631 error = -EBUSY;
2632 else
2633 error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
2634 if (!error) {
2635 if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE))
2636 d_move(old_dentry, new_dentry);
2637 }
2638 if (target)
2639 mutex_unlock(&target->i_mutex);
2640 dput(new_dentry);
2641 return error;
2642}
2643
2644int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
2645 struct inode *new_dir, struct dentry *new_dentry)
2646{
2647 int error;
2648 int is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
2649 const char *old_name;
2650
2651 if (old_dentry->d_inode == new_dentry->d_inode)
2652 return 0;
2653
2654 error = may_delete(old_dir, old_dentry, is_dir);
2655 if (error)
2656 return error;
2657
2658 if (!new_dentry->d_inode)
2659 error = may_create(new_dir, new_dentry);
2660 else
2661 error = may_delete(new_dir, new_dentry, is_dir);
2662 if (error)
2663 return error;
2664
2665 if (!old_dir->i_op->rename)
2666 return -EPERM;
2667
2668 vfs_dq_init(old_dir);
2669 vfs_dq_init(new_dir);
2670
2671 old_name = fsnotify_oldname_init(old_dentry->d_name.name);
2672
2673 if (is_dir)
2674 error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
2675 else
2676 error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
2677 if (!error) {
2678 const char *new_name = old_dentry->d_name.name;
2679 fsnotify_move(old_dir, new_dir, old_name, new_name, is_dir,
2680 new_dentry->d_inode, old_dentry);
2681 }
2682 fsnotify_oldname_free(old_name);
2683
2684 return error;
2685}
2686
2687SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
2688 int, newdfd, const char __user *, newname)
2689{
2690 struct dentry *old_dir, *new_dir;
2691 struct dentry *old_dentry, *new_dentry;
2692 struct dentry *trap;
2693 struct nameidata oldnd, newnd;
2694 char *from;
2695 char *to;
2696 int error;
2697
2698 error = user_path_parent(olddfd, oldname, &oldnd, &from);
2699 if (error)
2700 goto exit;
2701
2702 error = user_path_parent(newdfd, newname, &newnd, &to);
2703 if (error)
2704 goto exit1;
2705
2706 error = -EXDEV;
2707 if (oldnd.path.mnt != newnd.path.mnt)
2708 goto exit2;
2709
2710 old_dir = oldnd.path.dentry;
2711 error = -EBUSY;
2712 if (oldnd.last_type != LAST_NORM)
2713 goto exit2;
2714
2715 new_dir = newnd.path.dentry;
2716 if (newnd.last_type != LAST_NORM)
2717 goto exit2;
2718
2719 oldnd.flags &= ~LOOKUP_PARENT;
2720 newnd.flags &= ~LOOKUP_PARENT;
2721 newnd.flags |= LOOKUP_RENAME_TARGET;
2722
2723 trap = lock_rename(new_dir, old_dir);
2724
2725 old_dentry = lookup_hash(&oldnd);
2726 error = PTR_ERR(old_dentry);
2727 if (IS_ERR(old_dentry))
2728 goto exit3;
2729
2730 error = -ENOENT;
2731 if (!old_dentry->d_inode)
2732 goto exit4;
2733
2734 if (!S_ISDIR(old_dentry->d_inode->i_mode)) {
2735 error = -ENOTDIR;
2736 if (oldnd.last.name[oldnd.last.len])
2737 goto exit4;
2738 if (newnd.last.name[newnd.last.len])
2739 goto exit4;
2740 }
2741
2742 error = -EINVAL;
2743 if (old_dentry == trap)
2744 goto exit4;
2745 new_dentry = lookup_hash(&newnd);
2746 error = PTR_ERR(new_dentry);
2747 if (IS_ERR(new_dentry))
2748 goto exit4;
2749
2750 error = -ENOTEMPTY;
2751 if (new_dentry == trap)
2752 goto exit5;
2753
2754 error = mnt_want_write(oldnd.path.mnt);
2755 if (error)
2756 goto exit5;
2757 error = security_path_rename(&oldnd.path, old_dentry,
2758 &newnd.path, new_dentry);
2759 if (error)
2760 goto exit6;
2761 error = vfs_rename(old_dir->d_inode, old_dentry,
2762 new_dir->d_inode, new_dentry);
2763exit6:
2764 mnt_drop_write(oldnd.path.mnt);
2765exit5:
2766 dput(new_dentry);
2767exit4:
2768 dput(old_dentry);
2769exit3:
2770 unlock_rename(new_dir, old_dir);
2771exit2:
2772 path_put(&newnd.path);
2773 putname(to);
2774exit1:
2775 path_put(&oldnd.path);
2776 putname(from);
2777exit:
2778 return error;
2779}
2780
2781SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newname)
2782{
2783 return sys_renameat(AT_FDCWD, oldname, AT_FDCWD, newname);
2784}
2785
2786int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen, const char *link)
2787{
2788 int len;
2789
2790 len = PTR_ERR(link);
2791 if (IS_ERR(link))
2792 goto out;
2793
2794 len = strlen(link);
2795 if (len > (unsigned) buflen)
2796 len = buflen;
2797 if (copy_to_user(buffer, link, len))
2798 len = -EFAULT;
2799out:
2800 return len;
2801}
2802
2803
2804
2805
2806
2807
2808int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen)
2809{
2810 struct nameidata nd;
2811 void *cookie;
2812 int res;
2813
2814 nd.depth = 0;
2815 cookie = dentry->d_inode->i_op->follow_link(dentry, &nd);
2816 if (IS_ERR(cookie))
2817 return PTR_ERR(cookie);
2818
2819 res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd));
2820 if (dentry->d_inode->i_op->put_link)
2821 dentry->d_inode->i_op->put_link(dentry, &nd, cookie);
2822 return res;
2823}
2824
2825int vfs_follow_link(struct nameidata *nd, const char *link)
2826{
2827 return __vfs_follow_link(nd, link);
2828}
2829
2830
2831static char *page_getlink(struct dentry * dentry, struct page **ppage)
2832{
2833 char *kaddr;
2834 struct page *page;
2835 struct address_space *mapping = dentry->d_inode->i_mapping;
2836 page = read_mapping_page(mapping, 0, NULL);
2837 if (IS_ERR(page))
2838 return (char*)page;
2839 *ppage = page;
2840 kaddr = kmap(page);
2841 nd_terminate_link(kaddr, dentry->d_inode->i_size, PAGE_SIZE - 1);
2842 return kaddr;
2843}
2844
2845int page_readlink(struct dentry *dentry, char __user *buffer, int buflen)
2846{
2847 struct page *page = NULL;
2848 char *s = page_getlink(dentry, &page);
2849 int res = vfs_readlink(dentry,buffer,buflen,s);
2850 if (page) {
2851 kunmap(page);
2852 page_cache_release(page);
2853 }
2854 return res;
2855}
2856
2857void *page_follow_link_light(struct dentry *dentry, struct nameidata *nd)
2858{
2859 struct page *page = NULL;
2860 nd_set_link(nd, page_getlink(dentry, &page));
2861 return page;
2862}
2863
2864void page_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
2865{
2866 struct page *page = cookie;
2867
2868 if (page) {
2869 kunmap(page);
2870 page_cache_release(page);
2871 }
2872}
2873
2874
2875
2876
2877int __page_symlink(struct inode *inode, const char *symname, int len, int nofs)
2878{
2879 struct address_space *mapping = inode->i_mapping;
2880 struct page *page;
2881 void *fsdata;
2882 int err;
2883 char *kaddr;
2884 unsigned int flags = AOP_FLAG_UNINTERRUPTIBLE;
2885 if (nofs)
2886 flags |= AOP_FLAG_NOFS;
2887
2888retry:
2889 err = pagecache_write_begin(NULL, mapping, 0, len-1,
2890 flags, &page, &fsdata);
2891 if (err)
2892 goto fail;
2893
2894 kaddr = kmap_atomic(page, KM_USER0);
2895 memcpy(kaddr, symname, len-1);
2896 kunmap_atomic(kaddr, KM_USER0);
2897
2898 err = pagecache_write_end(NULL, mapping, 0, len-1, len-1,
2899 page, fsdata);
2900 if (err < 0)
2901 goto fail;
2902 if (err < len-1)
2903 goto retry;
2904
2905 mark_inode_dirty(inode);
2906 return 0;
2907fail:
2908 return err;
2909}
2910
2911int page_symlink(struct inode *inode, const char *symname, int len)
2912{
2913 return __page_symlink(inode, symname, len,
2914 !(mapping_gfp_mask(inode->i_mapping) & __GFP_FS));
2915}
2916
2917const struct inode_operations page_symlink_inode_operations = {
2918 .readlink = generic_readlink,
2919 .follow_link = page_follow_link_light,
2920 .put_link = page_put_link,
2921};
2922
2923EXPORT_SYMBOL(user_path_at);
2924EXPORT_SYMBOL(follow_down);
2925EXPORT_SYMBOL(follow_up);
2926EXPORT_SYMBOL(get_write_access);
2927EXPORT_SYMBOL(getname);
2928EXPORT_SYMBOL(lock_rename);
2929EXPORT_SYMBOL(lookup_one_len);
2930EXPORT_SYMBOL(page_follow_link_light);
2931EXPORT_SYMBOL(page_put_link);
2932EXPORT_SYMBOL(page_readlink);
2933EXPORT_SYMBOL(__page_symlink);
2934EXPORT_SYMBOL(page_symlink);
2935EXPORT_SYMBOL(page_symlink_inode_operations);
2936EXPORT_SYMBOL(path_lookup);
2937EXPORT_SYMBOL(kern_path);
2938EXPORT_SYMBOL(vfs_path_lookup);
2939EXPORT_SYMBOL(inode_permission);
2940EXPORT_SYMBOL(file_permission);
2941EXPORT_SYMBOL(unlock_rename);
2942EXPORT_SYMBOL(vfs_create);
2943EXPORT_SYMBOL(vfs_follow_link);
2944EXPORT_SYMBOL(vfs_link);
2945EXPORT_SYMBOL(vfs_mkdir);
2946EXPORT_SYMBOL(vfs_mknod);
2947EXPORT_SYMBOL(generic_permission);
2948EXPORT_SYMBOL(vfs_readlink);
2949EXPORT_SYMBOL(vfs_rename);
2950EXPORT_SYMBOL(vfs_rmdir);
2951EXPORT_SYMBOL(vfs_symlink);
2952EXPORT_SYMBOL(vfs_unlink);
2953EXPORT_SYMBOL(dentry_unhash);
2954EXPORT_SYMBOL(generic_readlink);
2955