1
2
3
4
5
6
7
8
9
10#include <linux/fs.h>
11#include <linux/cred.h>
12#include <linux/mount.h>
13#include <linux/namei.h>
14#include <linux/xattr.h>
15#include <linux/exportfs.h>
16#include <linux/ratelimit.h>
17#include "overlayfs.h"
18
19static int ovl_encode_maybe_copy_up(struct dentry *dentry)
20{
21 int err;
22
23 if (ovl_dentry_upper(dentry))
24 return 0;
25
26 err = ovl_want_write(dentry);
27 if (!err) {
28 err = ovl_copy_up(dentry);
29 ovl_drop_write(dentry);
30 }
31
32 if (err) {
33 pr_warn_ratelimited("failed to copy up on encode (%pd2, err=%i)\n",
34 dentry, err);
35 }
36
37 return err;
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
77static int ovl_connectable_layer(struct dentry *dentry)
78{
79 struct ovl_entry *oe = OVL_E(dentry);
80
81
82 if (dentry == dentry->d_sb->s_root)
83 return oe->numlower;
84
85
86
87
88
89 if (ovl_dentry_upper(dentry) &&
90 !ovl_test_flag(OVL_INDEX, d_inode(dentry)))
91 return 0;
92
93
94 return oe->lowerstack[0].layer->idx;
95}
96
97
98
99
100
101
102
103
104
105static int ovl_connect_layer(struct dentry *dentry)
106{
107 struct dentry *next, *parent = NULL;
108 int origin_layer;
109 int err = 0;
110
111 if (WARN_ON(dentry == dentry->d_sb->s_root) ||
112 WARN_ON(!ovl_dentry_lower(dentry)))
113 return -EIO;
114
115 origin_layer = OVL_E(dentry)->lowerstack[0].layer->idx;
116 if (ovl_dentry_test_flag(OVL_E_CONNECTED, dentry))
117 return origin_layer;
118
119
120 next = dget(dentry);
121 for (;;) {
122 parent = dget_parent(next);
123 if (WARN_ON(parent == next)) {
124 err = -EIO;
125 break;
126 }
127
128
129
130
131
132 if (ovl_connectable_layer(parent) < origin_layer) {
133 err = ovl_encode_maybe_copy_up(next);
134 break;
135 }
136
137
138 if (ovl_dentry_test_flag(OVL_E_CONNECTED, parent) ||
139 ovl_test_flag(OVL_INDEX, d_inode(parent)))
140 break;
141
142 dput(next);
143 next = parent;
144 }
145
146 dput(parent);
147 dput(next);
148
149 if (!err)
150 ovl_dentry_set_flag(OVL_E_CONNECTED, dentry);
151
152 return err ?: origin_layer;
153}
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183static int ovl_check_encode_origin(struct dentry *dentry)
184{
185 struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
186
187
188 if (!ovl_dentry_lower(dentry))
189 return 0;
190
191
192
193
194
195
196
197 if (ovl_dentry_upper(dentry) &&
198 !ovl_test_flag(OVL_INDEX, d_inode(dentry)))
199 return 0;
200
201
202
203
204
205
206
207 if (d_is_dir(dentry) && ovl_upper_mnt(ofs))
208 return ovl_connect_layer(dentry);
209
210
211 return 1;
212}
213
214static int ovl_dentry_to_fid(struct ovl_fs *ofs, struct dentry *dentry,
215 u32 *fid, int buflen)
216{
217 struct ovl_fh *fh = NULL;
218 int err, enc_lower;
219 int len;
220
221
222
223
224
225 err = enc_lower = ovl_check_encode_origin(dentry);
226 if (enc_lower < 0)
227 goto fail;
228
229
230 fh = ovl_encode_real_fh(ofs, enc_lower ? ovl_dentry_lower(dentry) :
231 ovl_dentry_upper(dentry), !enc_lower);
232 if (IS_ERR(fh))
233 return PTR_ERR(fh);
234
235 len = OVL_FH_LEN(fh);
236 if (len <= buflen)
237 memcpy(fid, fh, len);
238 err = len;
239
240out:
241 kfree(fh);
242 return err;
243
244fail:
245 pr_warn_ratelimited("failed to encode file handle (%pd2, err=%i)\n",
246 dentry, err);
247 goto out;
248}
249
250static int ovl_encode_fh(struct inode *inode, u32 *fid, int *max_len,
251 struct inode *parent)
252{
253 struct ovl_fs *ofs = OVL_FS(inode->i_sb);
254 struct dentry *dentry;
255 int bytes, buflen = *max_len << 2;
256
257
258 if (parent)
259 return FILEID_INVALID;
260
261 dentry = d_find_any_alias(inode);
262 if (WARN_ON(!dentry))
263 return FILEID_INVALID;
264
265 bytes = ovl_dentry_to_fid(ofs, dentry, fid, buflen);
266 dput(dentry);
267 if (bytes <= 0)
268 return FILEID_INVALID;
269
270 *max_len = bytes >> 2;
271 if (bytes > buflen)
272 return FILEID_INVALID;
273
274 return OVL_FILEID_V1;
275}
276
277
278
279
280static struct dentry *ovl_obtain_alias(struct super_block *sb,
281 struct dentry *upper_alias,
282 struct ovl_path *lowerpath,
283 struct dentry *index)
284{
285 struct dentry *lower = lowerpath ? lowerpath->dentry : NULL;
286 struct dentry *upper = upper_alias ?: index;
287 struct dentry *dentry;
288 struct inode *inode;
289 struct ovl_entry *oe;
290 struct ovl_inode_params oip = {
291 .lowerpath = lowerpath,
292 .index = index,
293 .numlower = !!lower
294 };
295
296
297 if (d_is_dir(upper ?: lower))
298 return ERR_PTR(-EIO);
299
300 oip.upperdentry = dget(upper);
301 inode = ovl_get_inode(sb, &oip);
302 if (IS_ERR(inode)) {
303 dput(upper);
304 return ERR_CAST(inode);
305 }
306
307 if (upper)
308 ovl_set_flag(OVL_UPPERDATA, inode);
309
310 dentry = d_find_any_alias(inode);
311 if (dentry)
312 goto out_iput;
313
314 dentry = d_alloc_anon(inode->i_sb);
315 if (unlikely(!dentry))
316 goto nomem;
317 oe = ovl_alloc_entry(lower ? 1 : 0);
318 if (!oe)
319 goto nomem;
320
321 if (lower) {
322 oe->lowerstack->dentry = dget(lower);
323 oe->lowerstack->layer = lowerpath->layer;
324 }
325 dentry->d_fsdata = oe;
326 if (upper_alias)
327 ovl_dentry_set_upper_alias(dentry);
328
329 ovl_dentry_update_reval(dentry, upper,
330 DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE);
331
332 return d_instantiate_anon(dentry, inode);
333
334nomem:
335 dput(dentry);
336 dentry = ERR_PTR(-ENOMEM);
337out_iput:
338 iput(inode);
339 return dentry;
340}
341
342
343static struct dentry *ovl_dentry_real_at(struct dentry *dentry, int idx)
344{
345 struct ovl_entry *oe = dentry->d_fsdata;
346 int i;
347
348 if (!idx)
349 return ovl_dentry_upper(dentry);
350
351 for (i = 0; i < oe->numlower; i++) {
352 if (oe->lowerstack[i].layer->idx == idx)
353 return oe->lowerstack[i].dentry;
354 }
355
356 return NULL;
357}
358
359
360
361
362
363
364
365static struct dentry *ovl_lookup_real_one(struct dentry *connected,
366 struct dentry *real,
367 const struct ovl_layer *layer)
368{
369 struct inode *dir = d_inode(connected);
370 struct dentry *this, *parent = NULL;
371 struct name_snapshot name;
372 int err;
373
374
375
376
377
378
379
380
381 inode_lock_nested(dir, I_MUTEX_PARENT);
382 err = -ECHILD;
383 parent = dget_parent(real);
384 if (ovl_dentry_real_at(connected, layer->idx) != parent)
385 goto fail;
386
387
388
389
390
391
392
393 take_dentry_name_snapshot(&name, real);
394
395
396
397
398
399 this = lookup_one_len(name.name.name, connected, name.name.len);
400 release_dentry_name_snapshot(&name);
401 err = PTR_ERR(this);
402 if (IS_ERR(this)) {
403 goto fail;
404 } else if (!this || !this->d_inode) {
405 dput(this);
406 err = -ENOENT;
407 goto fail;
408 } else if (ovl_dentry_real_at(this, layer->idx) != real) {
409 dput(this);
410 err = -ESTALE;
411 goto fail;
412 }
413
414out:
415 dput(parent);
416 inode_unlock(dir);
417 return this;
418
419fail:
420 pr_warn_ratelimited("failed to lookup one by real (%pd2, layer=%d, connected=%pd2, err=%i)\n",
421 real, layer->idx, connected, err);
422 this = ERR_PTR(err);
423 goto out;
424}
425
426static struct dentry *ovl_lookup_real(struct super_block *sb,
427 struct dentry *real,
428 const struct ovl_layer *layer);
429
430
431
432
433static struct dentry *ovl_lookup_real_inode(struct super_block *sb,
434 struct dentry *real,
435 const struct ovl_layer *layer)
436{
437 struct ovl_fs *ofs = sb->s_fs_info;
438 struct dentry *index = NULL;
439 struct dentry *this = NULL;
440 struct inode *inode;
441
442
443
444
445
446 inode = ovl_lookup_inode(sb, real, !layer->idx);
447 if (IS_ERR(inode))
448 return ERR_CAST(inode);
449 if (inode) {
450 this = d_find_any_alias(inode);
451 iput(inode);
452 }
453
454
455
456
457
458 if (!this && layer->idx && ofs->indexdir && !WARN_ON(!d_is_dir(real))) {
459 index = ovl_lookup_index(ofs, NULL, real, false);
460 if (IS_ERR(index))
461 return index;
462 }
463
464
465 if (index) {
466 struct dentry *upper = ovl_index_upper(ofs, index);
467
468 dput(index);
469 if (IS_ERR_OR_NULL(upper))
470 return upper;
471
472
473
474
475
476
477
478
479 this = ovl_lookup_real(sb, upper, &ofs->layers[0]);
480 dput(upper);
481 }
482
483 if (IS_ERR_OR_NULL(this))
484 return this;
485
486 if (ovl_dentry_real_at(this, layer->idx) != real) {
487 dput(this);
488 this = ERR_PTR(-EIO);
489 }
490
491 return this;
492}
493
494
495
496
497
498static struct dentry *ovl_lookup_real_ancestor(struct super_block *sb,
499 struct dentry *real,
500 const struct ovl_layer *layer)
501{
502 struct dentry *next, *parent = NULL;
503 struct dentry *ancestor = ERR_PTR(-EIO);
504
505 if (real == layer->mnt->mnt_root)
506 return dget(sb->s_root);
507
508
509 next = dget(real);
510 for (;;) {
511 parent = dget_parent(next);
512
513
514
515
516
517 ancestor = ovl_lookup_real_inode(sb, next, layer);
518 if (ancestor)
519 break;
520
521 if (parent == layer->mnt->mnt_root) {
522 ancestor = dget(sb->s_root);
523 break;
524 }
525
526
527
528
529
530
531 if (parent == next) {
532 ancestor = ERR_PTR(-EXDEV);
533 break;
534 }
535
536 dput(next);
537 next = parent;
538 }
539
540 dput(parent);
541 dput(next);
542
543 return ancestor;
544}
545
546
547
548
549
550
551static struct dentry *ovl_lookup_real(struct super_block *sb,
552 struct dentry *real,
553 const struct ovl_layer *layer)
554{
555 struct dentry *connected;
556 int err = 0;
557
558 connected = ovl_lookup_real_ancestor(sb, real, layer);
559 if (IS_ERR(connected))
560 return connected;
561
562 while (!err) {
563 struct dentry *next, *this;
564 struct dentry *parent = NULL;
565 struct dentry *real_connected = ovl_dentry_real_at(connected,
566 layer->idx);
567
568 if (real_connected == real)
569 break;
570
571
572 next = dget(real);
573 for (;;) {
574 parent = dget_parent(next);
575
576 if (parent == real_connected)
577 break;
578
579
580
581
582
583
584
585
586
587 if (parent == layer->mnt->mnt_root) {
588 dput(connected);
589 connected = dget(sb->s_root);
590 break;
591 }
592
593
594
595
596
597
598
599 if (parent == next) {
600 err = -EXDEV;
601 break;
602 }
603
604 dput(next);
605 next = parent;
606 }
607
608 if (!err) {
609 this = ovl_lookup_real_one(connected, next, layer);
610 if (IS_ERR(this))
611 err = PTR_ERR(this);
612
613
614
615
616
617
618
619
620
621
622
623 if (err == -ECHILD) {
624 this = ovl_lookup_real_ancestor(sb, real,
625 layer);
626 err = PTR_ERR_OR_ZERO(this);
627 }
628 if (!err) {
629 dput(connected);
630 connected = this;
631 }
632 }
633
634 dput(parent);
635 dput(next);
636 }
637
638 if (err)
639 goto fail;
640
641 return connected;
642
643fail:
644 pr_warn_ratelimited("failed to lookup by real (%pd2, layer=%d, connected=%pd2, err=%i)\n",
645 real, layer->idx, connected, err);
646 dput(connected);
647 return ERR_PTR(err);
648}
649
650
651
652
653static struct dentry *ovl_get_dentry(struct super_block *sb,
654 struct dentry *upper,
655 struct ovl_path *lowerpath,
656 struct dentry *index)
657{
658 struct ovl_fs *ofs = sb->s_fs_info;
659 const struct ovl_layer *layer = upper ? &ofs->layers[0] : lowerpath->layer;
660 struct dentry *real = upper ?: (index ?: lowerpath->dentry);
661
662
663
664
665
666 if (!d_is_dir(real))
667 return ovl_obtain_alias(sb, upper, lowerpath, index);
668
669
670 if ((real->d_flags & DCACHE_DISCONNECTED) || d_unhashed(real))
671 return ERR_PTR(-ENOENT);
672
673
674
675
676
677 return ovl_lookup_real(sb, real, layer);
678}
679
680static struct dentry *ovl_upper_fh_to_d(struct super_block *sb,
681 struct ovl_fh *fh)
682{
683 struct ovl_fs *ofs = sb->s_fs_info;
684 struct dentry *dentry;
685 struct dentry *upper;
686
687 if (!ovl_upper_mnt(ofs))
688 return ERR_PTR(-EACCES);
689
690 upper = ovl_decode_real_fh(ofs, fh, ovl_upper_mnt(ofs), true);
691 if (IS_ERR_OR_NULL(upper))
692 return upper;
693
694 dentry = ovl_get_dentry(sb, upper, NULL, NULL);
695 dput(upper);
696
697 return dentry;
698}
699
700static struct dentry *ovl_lower_fh_to_d(struct super_block *sb,
701 struct ovl_fh *fh)
702{
703 struct ovl_fs *ofs = sb->s_fs_info;
704 struct ovl_path origin = { };
705 struct ovl_path *stack = &origin;
706 struct dentry *dentry = NULL;
707 struct dentry *index = NULL;
708 struct inode *inode;
709 int err;
710
711
712 err = ovl_check_origin_fh(ofs, fh, false, NULL, &stack);
713 if (err)
714 return ERR_PTR(err);
715
716 if (!d_is_dir(origin.dentry) ||
717 !(origin.dentry->d_flags & DCACHE_DISCONNECTED)) {
718 inode = ovl_lookup_inode(sb, origin.dentry, false);
719 err = PTR_ERR(inode);
720 if (IS_ERR(inode))
721 goto out_err;
722 if (inode) {
723 dentry = d_find_any_alias(inode);
724 iput(inode);
725 if (dentry)
726 goto out;
727 }
728 }
729
730
731 if (ofs->indexdir) {
732 index = ovl_get_index_fh(ofs, fh);
733 err = PTR_ERR(index);
734 if (IS_ERR(index)) {
735 index = NULL;
736 goto out_err;
737 }
738 }
739
740
741 if (index && d_is_dir(index)) {
742 struct dentry *upper = ovl_index_upper(ofs, index);
743
744 err = PTR_ERR(upper);
745 if (IS_ERR_OR_NULL(upper))
746 goto out_err;
747
748 dentry = ovl_get_dentry(sb, upper, NULL, NULL);
749 dput(upper);
750 goto out;
751 }
752
753
754 if (d_is_dir(origin.dentry)) {
755 dput(origin.dentry);
756 origin.dentry = NULL;
757 err = ovl_check_origin_fh(ofs, fh, true, NULL, &stack);
758 if (err)
759 goto out_err;
760 }
761 if (index) {
762 err = ovl_verify_origin(ofs, index, origin.dentry, false);
763 if (err)
764 goto out_err;
765 }
766
767
768 dentry = ovl_get_dentry(sb, NULL, &origin, index);
769
770out:
771 dput(origin.dentry);
772 dput(index);
773 return dentry;
774
775out_err:
776 dentry = ERR_PTR(err);
777 goto out;
778}
779
780static struct ovl_fh *ovl_fid_to_fh(struct fid *fid, int buflen, int fh_type)
781{
782 struct ovl_fh *fh;
783
784
785 if (fh_type == OVL_FILEID_V1)
786 return (struct ovl_fh *)fid;
787
788 if (fh_type != OVL_FILEID_V0)
789 return ERR_PTR(-EINVAL);
790
791 if (buflen <= OVL_FH_WIRE_OFFSET)
792 return ERR_PTR(-EINVAL);
793
794 fh = kzalloc(buflen, GFP_KERNEL);
795 if (!fh)
796 return ERR_PTR(-ENOMEM);
797
798
799 memcpy(&fh->fb, fid, buflen - OVL_FH_WIRE_OFFSET);
800 return fh;
801}
802
803static struct dentry *ovl_fh_to_dentry(struct super_block *sb, struct fid *fid,
804 int fh_len, int fh_type)
805{
806 struct dentry *dentry = NULL;
807 struct ovl_fh *fh = NULL;
808 int len = fh_len << 2;
809 unsigned int flags = 0;
810 int err;
811
812 fh = ovl_fid_to_fh(fid, len, fh_type);
813 err = PTR_ERR(fh);
814 if (IS_ERR(fh))
815 goto out_err;
816
817 err = ovl_check_fh_len(fh, len);
818 if (err)
819 goto out_err;
820
821 flags = fh->fb.flags;
822 dentry = (flags & OVL_FH_FLAG_PATH_UPPER) ?
823 ovl_upper_fh_to_d(sb, fh) :
824 ovl_lower_fh_to_d(sb, fh);
825 err = PTR_ERR(dentry);
826 if (IS_ERR(dentry) && err != -ESTALE)
827 goto out_err;
828
829out:
830
831 if (!IS_ERR_OR_NULL(fh) && fh != (void *)fid)
832 kfree(fh);
833
834 return dentry;
835
836out_err:
837 pr_warn_ratelimited("failed to decode file handle (len=%d, type=%d, flags=%x, err=%i)\n",
838 fh_len, fh_type, flags, err);
839 dentry = ERR_PTR(err);
840 goto out;
841}
842
843static struct dentry *ovl_fh_to_parent(struct super_block *sb, struct fid *fid,
844 int fh_len, int fh_type)
845{
846 pr_warn_ratelimited("connectable file handles not supported; use 'no_subtree_check' exportfs option.\n");
847 return ERR_PTR(-EACCES);
848}
849
850static int ovl_get_name(struct dentry *parent, char *name,
851 struct dentry *child)
852{
853
854
855
856
857 WARN_ON_ONCE(1);
858 return -EIO;
859}
860
861static struct dentry *ovl_get_parent(struct dentry *dentry)
862{
863
864
865
866
867 WARN_ON_ONCE(1);
868 return ERR_PTR(-EIO);
869}
870
871const struct export_operations ovl_export_operations = {
872 .encode_fh = ovl_encode_fh,
873 .fh_to_dentry = ovl_fh_to_dentry,
874 .fh_to_parent = ovl_fh_to_parent,
875 .get_name = ovl_get_name,
876 .get_parent = ovl_get_parent,
877};
878