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