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