1
2
3
4
5
6
7#include <linux/fs.h>
8#include <linux/slab.h>
9#include <linux/cred.h>
10#include <linux/xattr.h>
11#include <linux/posix_acl.h>
12#include <linux/ratelimit.h>
13#include <linux/fiemap.h>
14#include <linux/fileattr.h>
15#include <linux/security.h>
16#include <linux/namei.h>
17#include "overlayfs.h"
18
19
20int ovl_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
21 struct iattr *attr)
22{
23 int err;
24 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
25 bool full_copy_up = false;
26 struct dentry *upperdentry;
27 const struct cred *old_cred;
28
29 err = setattr_prepare(&init_user_ns, dentry, attr);
30 if (err)
31 return err;
32
33 err = ovl_want_write(dentry);
34 if (err)
35 goto out;
36
37 if (attr->ia_valid & ATTR_SIZE) {
38
39 full_copy_up = true;
40 }
41
42 if (!full_copy_up)
43 err = ovl_copy_up(dentry);
44 else
45 err = ovl_copy_up_with_data(dentry);
46 if (!err) {
47 struct inode *winode = NULL;
48
49 upperdentry = ovl_dentry_upper(dentry);
50
51 if (attr->ia_valid & ATTR_SIZE) {
52 winode = d_inode(upperdentry);
53 err = get_write_access(winode);
54 if (err)
55 goto out_drop_write;
56 }
57
58 if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
59 attr->ia_valid &= ~ATTR_MODE;
60
61
62
63
64
65
66 attr->ia_valid &= ~ATTR_FILE;
67
68
69
70
71
72
73
74
75
76
77 attr->ia_valid &= ~ATTR_OPEN;
78
79 inode_lock(upperdentry->d_inode);
80 old_cred = ovl_override_creds(dentry->d_sb);
81 err = ovl_do_notify_change(ofs, upperdentry, attr);
82 revert_creds(old_cred);
83 if (!err)
84 ovl_copyattr(dentry->d_inode);
85 inode_unlock(upperdentry->d_inode);
86
87 if (winode)
88 put_write_access(winode);
89 }
90out_drop_write:
91 ovl_drop_write(dentry);
92out:
93 return err;
94}
95
96static void ovl_map_dev_ino(struct dentry *dentry, struct kstat *stat, int fsid)
97{
98 bool samefs = ovl_same_fs(dentry->d_sb);
99 unsigned int xinobits = ovl_xino_bits(dentry->d_sb);
100 unsigned int xinoshift = 64 - xinobits;
101
102 if (samefs) {
103
104
105
106
107
108 stat->dev = dentry->d_sb->s_dev;
109 return;
110 } else if (xinobits) {
111
112
113
114
115
116
117
118
119
120 if (likely(!(stat->ino >> xinoshift))) {
121 stat->ino |= ((u64)fsid) << (xinoshift + 1);
122 stat->dev = dentry->d_sb->s_dev;
123 return;
124 } else if (ovl_xino_warn(dentry->d_sb)) {
125 pr_warn_ratelimited("inode number too big (%pd2, ino=%llu, xinobits=%d)\n",
126 dentry, stat->ino, xinobits);
127 }
128 }
129
130
131 if (S_ISDIR(dentry->d_inode->i_mode)) {
132
133
134
135
136
137
138
139
140
141 stat->dev = dentry->d_sb->s_dev;
142 stat->ino = dentry->d_inode->i_ino;
143 } else {
144
145
146
147
148
149
150 stat->dev = OVL_FS(dentry->d_sb)->fs[fsid].pseudo_dev;
151 }
152}
153
154int ovl_getattr(struct user_namespace *mnt_userns, const struct path *path,
155 struct kstat *stat, u32 request_mask, unsigned int flags)
156{
157 struct dentry *dentry = path->dentry;
158 enum ovl_path_type type;
159 struct path realpath;
160 const struct cred *old_cred;
161 struct inode *inode = d_inode(dentry);
162 bool is_dir = S_ISDIR(inode->i_mode);
163 int fsid = 0;
164 int err;
165 bool metacopy_blocks = false;
166
167 metacopy_blocks = ovl_is_metacopy_dentry(dentry);
168
169 type = ovl_path_real(dentry, &realpath);
170 old_cred = ovl_override_creds(dentry->d_sb);
171 err = vfs_getattr(&realpath, stat, request_mask, flags);
172 if (err)
173 goto out;
174
175
176 generic_fill_statx_attr(inode, stat);
177
178
179
180
181
182
183
184
185
186
187 if (!is_dir || ovl_same_dev(dentry->d_sb)) {
188 if (!OVL_TYPE_UPPER(type)) {
189 fsid = ovl_layer_lower(dentry)->fsid;
190 } else if (OVL_TYPE_ORIGIN(type)) {
191 struct kstat lowerstat;
192 u32 lowermask = STATX_INO | STATX_BLOCKS |
193 (!is_dir ? STATX_NLINK : 0);
194
195 ovl_path_lower(dentry, &realpath);
196 err = vfs_getattr(&realpath, &lowerstat,
197 lowermask, flags);
198 if (err)
199 goto out;
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216 if (ovl_test_flag(OVL_INDEX, d_inode(dentry)) ||
217 (!ovl_verify_lower(dentry->d_sb) &&
218 (is_dir || lowerstat.nlink == 1))) {
219 fsid = ovl_layer_lower(dentry)->fsid;
220 stat->ino = lowerstat.ino;
221 }
222
223
224
225
226
227
228
229
230 if (metacopy_blocks &&
231 realpath.dentry == ovl_dentry_lowerdata(dentry)) {
232 stat->blocks = lowerstat.blocks;
233 metacopy_blocks = false;
234 }
235 }
236
237 if (metacopy_blocks) {
238
239
240
241
242 struct kstat lowerdatastat;
243 u32 lowermask = STATX_BLOCKS;
244
245 ovl_path_lowerdata(dentry, &realpath);
246 err = vfs_getattr(&realpath, &lowerdatastat,
247 lowermask, flags);
248 if (err)
249 goto out;
250 stat->blocks = lowerdatastat.blocks;
251 }
252 }
253
254 ovl_map_dev_ino(dentry, stat, fsid);
255
256
257
258
259
260
261 if (is_dir && OVL_TYPE_MERGE(type))
262 stat->nlink = 1;
263
264
265
266
267
268
269
270 if (!is_dir && ovl_test_flag(OVL_INDEX, d_inode(dentry)))
271 stat->nlink = dentry->d_inode->i_nlink;
272
273out:
274 revert_creds(old_cred);
275
276 return err;
277}
278
279int ovl_permission(struct user_namespace *mnt_userns,
280 struct inode *inode, int mask)
281{
282 struct inode *upperinode = ovl_inode_upper(inode);
283 struct inode *realinode;
284 struct path realpath;
285 const struct cred *old_cred;
286 int err;
287
288
289 ovl_i_path_real(inode, &realpath);
290 if (!realpath.dentry) {
291 WARN_ON(!(mask & MAY_NOT_BLOCK));
292 return -ECHILD;
293 }
294
295
296
297
298
299 err = generic_permission(&init_user_ns, inode, mask);
300 if (err)
301 return err;
302
303 realinode = d_inode(realpath.dentry);
304 old_cred = ovl_override_creds(inode->i_sb);
305 if (!upperinode &&
306 !special_file(realinode->i_mode) && mask & MAY_WRITE) {
307 mask &= ~(MAY_WRITE | MAY_APPEND);
308
309 mask |= MAY_READ;
310 }
311 err = inode_permission(mnt_user_ns(realpath.mnt), realinode, mask);
312 revert_creds(old_cred);
313
314 return err;
315}
316
317static const char *ovl_get_link(struct dentry *dentry,
318 struct inode *inode,
319 struct delayed_call *done)
320{
321 const struct cred *old_cred;
322 const char *p;
323
324 if (!dentry)
325 return ERR_PTR(-ECHILD);
326
327 old_cred = ovl_override_creds(dentry->d_sb);
328 p = vfs_get_link(ovl_dentry_real(dentry), done);
329 revert_creds(old_cred);
330 return p;
331}
332
333bool ovl_is_private_xattr(struct super_block *sb, const char *name)
334{
335 struct ovl_fs *ofs = sb->s_fs_info;
336
337 if (ofs->config.userxattr)
338 return strncmp(name, OVL_XATTR_USER_PREFIX,
339 sizeof(OVL_XATTR_USER_PREFIX) - 1) == 0;
340 else
341 return strncmp(name, OVL_XATTR_TRUSTED_PREFIX,
342 sizeof(OVL_XATTR_TRUSTED_PREFIX) - 1) == 0;
343}
344
345int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name,
346 const void *value, size_t size, int flags)
347{
348 int err;
349 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
350 struct dentry *upperdentry = ovl_i_dentry_upper(inode);
351 struct dentry *realdentry = upperdentry ?: ovl_dentry_lower(dentry);
352 struct path realpath;
353 const struct cred *old_cred;
354
355 err = ovl_want_write(dentry);
356 if (err)
357 goto out;
358
359 if (!value && !upperdentry) {
360 ovl_path_lower(dentry, &realpath);
361 old_cred = ovl_override_creds(dentry->d_sb);
362 err = vfs_getxattr(mnt_user_ns(realpath.mnt), realdentry, name, NULL, 0);
363 revert_creds(old_cred);
364 if (err < 0)
365 goto out_drop_write;
366 }
367
368 if (!upperdentry) {
369 err = ovl_copy_up(dentry);
370 if (err)
371 goto out_drop_write;
372
373 realdentry = ovl_dentry_upper(dentry);
374 }
375
376 old_cred = ovl_override_creds(dentry->d_sb);
377 if (value) {
378 err = ovl_do_setxattr(ofs, realdentry, name, value, size,
379 flags);
380 } else {
381 WARN_ON(flags != XATTR_REPLACE);
382 err = ovl_do_removexattr(ofs, realdentry, name);
383 }
384 revert_creds(old_cred);
385
386
387 ovl_copyattr(inode);
388
389out_drop_write:
390 ovl_drop_write(dentry);
391out:
392 return err;
393}
394
395int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
396 void *value, size_t size)
397{
398 ssize_t res;
399 const struct cred *old_cred;
400 struct path realpath;
401
402 ovl_i_path_real(inode, &realpath);
403 old_cred = ovl_override_creds(dentry->d_sb);
404 res = vfs_getxattr(mnt_user_ns(realpath.mnt), realpath.dentry, name, value, size);
405 revert_creds(old_cred);
406 return res;
407}
408
409static bool ovl_can_list(struct super_block *sb, const char *s)
410{
411
412 if (ovl_is_private_xattr(sb, s))
413 return false;
414
415
416 if (strncmp(s, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) != 0)
417 return true;
418
419
420 return ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN);
421}
422
423ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
424{
425 struct dentry *realdentry = ovl_dentry_real(dentry);
426 ssize_t res;
427 size_t len;
428 char *s;
429 const struct cred *old_cred;
430
431 old_cred = ovl_override_creds(dentry->d_sb);
432 res = vfs_listxattr(realdentry, list, size);
433 revert_creds(old_cred);
434 if (res <= 0 || size == 0)
435 return res;
436
437
438 for (s = list, len = res; len;) {
439 size_t slen = strnlen(s, len) + 1;
440
441
442 if (WARN_ON(slen > len))
443 return -EIO;
444
445 len -= slen;
446 if (!ovl_can_list(dentry->d_sb, s)) {
447 res -= slen;
448 memmove(s, s + slen, len);
449 } else {
450 s += slen;
451 }
452 }
453
454 return res;
455}
456
457struct posix_acl *ovl_get_acl(struct inode *inode, int type, bool rcu)
458{
459 struct inode *realinode = ovl_inode_real(inode);
460 const struct cred *old_cred;
461 struct posix_acl *acl;
462
463 if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !IS_POSIXACL(realinode))
464 return NULL;
465
466 if (rcu)
467 return get_cached_acl_rcu(realinode, type);
468
469 old_cred = ovl_override_creds(inode->i_sb);
470 acl = get_acl(realinode, type);
471 revert_creds(old_cred);
472
473 return acl;
474}
475
476int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags)
477{
478 if (flags & S_ATIME) {
479 struct ovl_fs *ofs = inode->i_sb->s_fs_info;
480 struct path upperpath = {
481 .mnt = ovl_upper_mnt(ofs),
482 .dentry = ovl_upperdentry_dereference(OVL_I(inode)),
483 };
484
485 if (upperpath.dentry) {
486 touch_atime(&upperpath);
487 inode->i_atime = d_inode(upperpath.dentry)->i_atime;
488 }
489 }
490 return 0;
491}
492
493static int ovl_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
494 u64 start, u64 len)
495{
496 int err;
497 struct inode *realinode = ovl_inode_realdata(inode);
498 const struct cred *old_cred;
499
500 if (!realinode->i_op->fiemap)
501 return -EOPNOTSUPP;
502
503 old_cred = ovl_override_creds(inode->i_sb);
504 err = realinode->i_op->fiemap(realinode, fieinfo, start, len);
505 revert_creds(old_cred);
506
507 return err;
508}
509
510
511
512
513
514
515static int ovl_security_fileattr(struct path *realpath, struct fileattr *fa,
516 bool set)
517{
518 struct file *file;
519 unsigned int cmd;
520 int err;
521
522 file = dentry_open(realpath, O_RDONLY, current_cred());
523 if (IS_ERR(file))
524 return PTR_ERR(file);
525
526 if (set)
527 cmd = fa->fsx_valid ? FS_IOC_FSSETXATTR : FS_IOC_SETFLAGS;
528 else
529 cmd = fa->fsx_valid ? FS_IOC_FSGETXATTR : FS_IOC_GETFLAGS;
530
531 err = security_file_ioctl(file, cmd, 0);
532 fput(file);
533
534 return err;
535}
536
537int ovl_real_fileattr_set(struct path *realpath, struct fileattr *fa)
538{
539 int err;
540
541 err = ovl_security_fileattr(realpath, fa, true);
542 if (err)
543 return err;
544
545 return vfs_fileattr_set(mnt_user_ns(realpath->mnt), realpath->dentry, fa);
546}
547
548int ovl_fileattr_set(struct user_namespace *mnt_userns,
549 struct dentry *dentry, struct fileattr *fa)
550{
551 struct inode *inode = d_inode(dentry);
552 struct path upperpath;
553 const struct cred *old_cred;
554 unsigned int flags;
555 int err;
556
557 err = ovl_want_write(dentry);
558 if (err)
559 goto out;
560
561 err = ovl_copy_up(dentry);
562 if (!err) {
563 ovl_path_real(dentry, &upperpath);
564
565 old_cred = ovl_override_creds(inode->i_sb);
566
567
568
569
570
571
572
573 err = ovl_set_protattr(inode, upperpath.dentry, fa);
574 if (!err)
575 err = ovl_real_fileattr_set(&upperpath, fa);
576 revert_creds(old_cred);
577
578
579
580
581
582 flags = ovl_inode_real(inode)->i_flags & OVL_COPY_I_FLAGS_MASK;
583
584 BUILD_BUG_ON(OVL_PROT_I_FLAGS_MASK & ~OVL_COPY_I_FLAGS_MASK);
585 flags |= inode->i_flags & OVL_PROT_I_FLAGS_MASK;
586 inode_set_flags(inode, flags, OVL_COPY_I_FLAGS_MASK);
587
588
589 ovl_copyattr(inode);
590 }
591 ovl_drop_write(dentry);
592out:
593 return err;
594}
595
596
597static void ovl_fileattr_prot_flags(struct inode *inode, struct fileattr *fa)
598{
599 BUILD_BUG_ON(OVL_PROT_FS_FLAGS_MASK & ~FS_COMMON_FL);
600 BUILD_BUG_ON(OVL_PROT_FSX_FLAGS_MASK & ~FS_XFLAG_COMMON);
601
602 if (inode->i_flags & S_APPEND) {
603 fa->flags |= FS_APPEND_FL;
604 fa->fsx_xflags |= FS_XFLAG_APPEND;
605 }
606 if (inode->i_flags & S_IMMUTABLE) {
607 fa->flags |= FS_IMMUTABLE_FL;
608 fa->fsx_xflags |= FS_XFLAG_IMMUTABLE;
609 }
610}
611
612int ovl_real_fileattr_get(struct path *realpath, struct fileattr *fa)
613{
614 int err;
615
616 err = ovl_security_fileattr(realpath, fa, false);
617 if (err)
618 return err;
619
620 err = vfs_fileattr_get(realpath->dentry, fa);
621 if (err == -ENOIOCTLCMD)
622 err = -ENOTTY;
623 return err;
624}
625
626int ovl_fileattr_get(struct dentry *dentry, struct fileattr *fa)
627{
628 struct inode *inode = d_inode(dentry);
629 struct path realpath;
630 const struct cred *old_cred;
631 int err;
632
633 ovl_path_real(dentry, &realpath);
634
635 old_cred = ovl_override_creds(inode->i_sb);
636 err = ovl_real_fileattr_get(&realpath, fa);
637 ovl_fileattr_prot_flags(inode, fa);
638 revert_creds(old_cred);
639
640 return err;
641}
642
643static const struct inode_operations ovl_file_inode_operations = {
644 .setattr = ovl_setattr,
645 .permission = ovl_permission,
646 .getattr = ovl_getattr,
647 .listxattr = ovl_listxattr,
648 .get_acl = ovl_get_acl,
649 .update_time = ovl_update_time,
650 .fiemap = ovl_fiemap,
651 .fileattr_get = ovl_fileattr_get,
652 .fileattr_set = ovl_fileattr_set,
653};
654
655static const struct inode_operations ovl_symlink_inode_operations = {
656 .setattr = ovl_setattr,
657 .get_link = ovl_get_link,
658 .getattr = ovl_getattr,
659 .listxattr = ovl_listxattr,
660 .update_time = ovl_update_time,
661};
662
663static const struct inode_operations ovl_special_inode_operations = {
664 .setattr = ovl_setattr,
665 .permission = ovl_permission,
666 .getattr = ovl_getattr,
667 .listxattr = ovl_listxattr,
668 .get_acl = ovl_get_acl,
669 .update_time = ovl_update_time,
670};
671
672static const struct address_space_operations ovl_aops = {
673
674 .direct_IO = noop_direct_IO,
675};
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713#define OVL_MAX_NESTING FILESYSTEM_MAX_STACK_DEPTH
714
715static inline void ovl_lockdep_annotate_inode_mutex_key(struct inode *inode)
716{
717#ifdef CONFIG_LOCKDEP
718 static struct lock_class_key ovl_i_mutex_key[OVL_MAX_NESTING];
719 static struct lock_class_key ovl_i_mutex_dir_key[OVL_MAX_NESTING];
720 static struct lock_class_key ovl_i_lock_key[OVL_MAX_NESTING];
721
722 int depth = inode->i_sb->s_stack_depth - 1;
723
724 if (WARN_ON_ONCE(depth < 0 || depth >= OVL_MAX_NESTING))
725 depth = 0;
726
727 if (S_ISDIR(inode->i_mode))
728 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_dir_key[depth]);
729 else
730 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_key[depth]);
731
732 lockdep_set_class(&OVL_I(inode)->lock, &ovl_i_lock_key[depth]);
733#endif
734}
735
736static void ovl_next_ino(struct inode *inode)
737{
738 struct ovl_fs *ofs = inode->i_sb->s_fs_info;
739
740 inode->i_ino = atomic_long_inc_return(&ofs->last_ino);
741 if (unlikely(!inode->i_ino))
742 inode->i_ino = atomic_long_inc_return(&ofs->last_ino);
743}
744
745static void ovl_map_ino(struct inode *inode, unsigned long ino, int fsid)
746{
747 int xinobits = ovl_xino_bits(inode->i_sb);
748 unsigned int xinoshift = 64 - xinobits;
749
750
751
752
753
754
755
756
757 inode->i_ino = ino;
758 if (ovl_same_fs(inode->i_sb)) {
759 return;
760 } else if (xinobits && likely(!(ino >> xinoshift))) {
761 inode->i_ino |= (unsigned long)fsid << (xinoshift + 1);
762 return;
763 }
764
765
766
767
768
769
770
771
772
773
774 if (S_ISDIR(inode->i_mode)) {
775 ovl_next_ino(inode);
776 if (xinobits) {
777 inode->i_ino &= ~0UL >> xinobits;
778 inode->i_ino |= 1UL << xinoshift;
779 }
780 }
781}
782
783void ovl_inode_init(struct inode *inode, struct ovl_inode_params *oip,
784 unsigned long ino, int fsid)
785{
786 struct inode *realinode;
787 struct ovl_inode *oi = OVL_I(inode);
788
789 if (oip->upperdentry)
790 oi->__upperdentry = oip->upperdentry;
791 if (oip->lowerpath && oip->lowerpath->dentry) {
792 oi->lowerpath.dentry = dget(oip->lowerpath->dentry);
793 oi->lowerpath.layer = oip->lowerpath->layer;
794 }
795 if (oip->lowerdata)
796 oi->lowerdata = igrab(d_inode(oip->lowerdata));
797
798 realinode = ovl_inode_real(inode);
799 ovl_copyattr(inode);
800 ovl_copyflags(realinode, inode);
801 ovl_map_ino(inode, ino, fsid);
802}
803
804static void ovl_fill_inode(struct inode *inode, umode_t mode, dev_t rdev)
805{
806 inode->i_mode = mode;
807 inode->i_flags |= S_NOCMTIME;
808#ifdef CONFIG_FS_POSIX_ACL
809 inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE;
810#endif
811
812 ovl_lockdep_annotate_inode_mutex_key(inode);
813
814 switch (mode & S_IFMT) {
815 case S_IFREG:
816 inode->i_op = &ovl_file_inode_operations;
817 inode->i_fop = &ovl_file_operations;
818 inode->i_mapping->a_ops = &ovl_aops;
819 break;
820
821 case S_IFDIR:
822 inode->i_op = &ovl_dir_inode_operations;
823 inode->i_fop = &ovl_dir_operations;
824 break;
825
826 case S_IFLNK:
827 inode->i_op = &ovl_symlink_inode_operations;
828 break;
829
830 default:
831 inode->i_op = &ovl_special_inode_operations;
832 init_special_inode(inode, mode, rdev);
833 break;
834 }
835}
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861#define OVL_NLINK_ADD_UPPER (1 << 0)
862
863
864
865
866
867
868
869
870static int ovl_set_nlink_common(struct dentry *dentry,
871 struct dentry *realdentry, const char *format)
872{
873 struct inode *inode = d_inode(dentry);
874 struct inode *realinode = d_inode(realdentry);
875 char buf[13];
876 int len;
877
878 len = snprintf(buf, sizeof(buf), format,
879 (int) (inode->i_nlink - realinode->i_nlink));
880
881 if (WARN_ON(len >= sizeof(buf)))
882 return -EIO;
883
884 return ovl_setxattr(OVL_FS(inode->i_sb), ovl_dentry_upper(dentry),
885 OVL_XATTR_NLINK, buf, len);
886}
887
888int ovl_set_nlink_upper(struct dentry *dentry)
889{
890 return ovl_set_nlink_common(dentry, ovl_dentry_upper(dentry), "U%+i");
891}
892
893int ovl_set_nlink_lower(struct dentry *dentry)
894{
895 return ovl_set_nlink_common(dentry, ovl_dentry_lower(dentry), "L%+i");
896}
897
898unsigned int ovl_get_nlink(struct ovl_fs *ofs, struct dentry *lowerdentry,
899 struct dentry *upperdentry,
900 unsigned int fallback)
901{
902 int nlink_diff;
903 int nlink;
904 char buf[13];
905 int err;
906
907 if (!lowerdentry || !upperdentry || d_inode(lowerdentry)->i_nlink == 1)
908 return fallback;
909
910 err = ovl_getxattr_upper(ofs, upperdentry, OVL_XATTR_NLINK,
911 &buf, sizeof(buf) - 1);
912 if (err < 0)
913 goto fail;
914
915 buf[err] = '\0';
916 if ((buf[0] != 'L' && buf[0] != 'U') ||
917 (buf[1] != '+' && buf[1] != '-'))
918 goto fail;
919
920 err = kstrtoint(buf + 1, 10, &nlink_diff);
921 if (err < 0)
922 goto fail;
923
924 nlink = d_inode(buf[0] == 'L' ? lowerdentry : upperdentry)->i_nlink;
925 nlink += nlink_diff;
926
927 if (nlink <= 0)
928 goto fail;
929
930 return nlink;
931
932fail:
933 pr_warn_ratelimited("failed to get index nlink (%pd2, err=%i)\n",
934 upperdentry, err);
935 return fallback;
936}
937
938struct inode *ovl_new_inode(struct super_block *sb, umode_t mode, dev_t rdev)
939{
940 struct inode *inode;
941
942 inode = new_inode(sb);
943 if (inode)
944 ovl_fill_inode(inode, mode, rdev);
945
946 return inode;
947}
948
949static int ovl_inode_test(struct inode *inode, void *data)
950{
951 return inode->i_private == data;
952}
953
954static int ovl_inode_set(struct inode *inode, void *data)
955{
956 inode->i_private = data;
957 return 0;
958}
959
960static bool ovl_verify_inode(struct inode *inode, struct dentry *lowerdentry,
961 struct dentry *upperdentry, bool strict)
962{
963
964
965
966
967
968
969 if (S_ISDIR(inode->i_mode) && strict) {
970
971 if (!lowerdentry && ovl_inode_lower(inode))
972 return false;
973
974
975 if (!upperdentry && ovl_inode_upper(inode))
976 return false;
977 }
978
979
980
981
982
983
984
985 if (lowerdentry && ovl_inode_lower(inode) != d_inode(lowerdentry))
986 return false;
987
988
989
990
991
992 if (upperdentry && ovl_inode_upper(inode) != d_inode(upperdentry))
993 return false;
994
995 return true;
996}
997
998struct inode *ovl_lookup_inode(struct super_block *sb, struct dentry *real,
999 bool is_upper)
1000{
1001 struct inode *inode, *key = d_inode(real);
1002
1003 inode = ilookup5(sb, (unsigned long) key, ovl_inode_test, key);
1004 if (!inode)
1005 return NULL;
1006
1007 if (!ovl_verify_inode(inode, is_upper ? NULL : real,
1008 is_upper ? real : NULL, false)) {
1009 iput(inode);
1010 return ERR_PTR(-ESTALE);
1011 }
1012
1013 return inode;
1014}
1015
1016bool ovl_lookup_trap_inode(struct super_block *sb, struct dentry *dir)
1017{
1018 struct inode *key = d_inode(dir);
1019 struct inode *trap;
1020 bool res;
1021
1022 trap = ilookup5(sb, (unsigned long) key, ovl_inode_test, key);
1023 if (!trap)
1024 return false;
1025
1026 res = IS_DEADDIR(trap) && !ovl_inode_upper(trap) &&
1027 !ovl_inode_lower(trap);
1028
1029 iput(trap);
1030 return res;
1031}
1032
1033
1034
1035
1036
1037
1038struct inode *ovl_get_trap_inode(struct super_block *sb, struct dentry *dir)
1039{
1040 struct inode *key = d_inode(dir);
1041 struct inode *trap;
1042
1043 if (!d_is_dir(dir))
1044 return ERR_PTR(-ENOTDIR);
1045
1046 trap = iget5_locked(sb, (unsigned long) key, ovl_inode_test,
1047 ovl_inode_set, key);
1048 if (!trap)
1049 return ERR_PTR(-ENOMEM);
1050
1051 if (!(trap->i_state & I_NEW)) {
1052
1053 iput(trap);
1054 return ERR_PTR(-ELOOP);
1055 }
1056
1057 trap->i_mode = S_IFDIR;
1058 trap->i_flags = S_DEAD;
1059 unlock_new_inode(trap);
1060
1061 return trap;
1062}
1063
1064
1065
1066
1067static bool ovl_hash_bylower(struct super_block *sb, struct dentry *upper,
1068 struct dentry *lower, bool index)
1069{
1070 struct ovl_fs *ofs = sb->s_fs_info;
1071
1072
1073 if (!lower)
1074 return false;
1075
1076
1077 if (index)
1078 return true;
1079
1080
1081 if (!ovl_upper_mnt(ofs))
1082 return true;
1083
1084
1085 if ((upper || !ovl_indexdir(sb)) &&
1086 !d_is_dir(lower) && d_inode(lower)->i_nlink > 1)
1087 return false;
1088
1089
1090 if (sb->s_export_op && upper)
1091 return false;
1092
1093
1094 return true;
1095}
1096
1097static struct inode *ovl_iget5(struct super_block *sb, struct inode *newinode,
1098 struct inode *key)
1099{
1100 return newinode ? inode_insert5(newinode, (unsigned long) key,
1101 ovl_inode_test, ovl_inode_set, key) :
1102 iget5_locked(sb, (unsigned long) key,
1103 ovl_inode_test, ovl_inode_set, key);
1104}
1105
1106struct inode *ovl_get_inode(struct super_block *sb,
1107 struct ovl_inode_params *oip)
1108{
1109 struct ovl_fs *ofs = OVL_FS(sb);
1110 struct dentry *upperdentry = oip->upperdentry;
1111 struct ovl_path *lowerpath = oip->lowerpath;
1112 struct inode *realinode = upperdentry ? d_inode(upperdentry) : NULL;
1113 struct inode *inode;
1114 struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL;
1115 struct path realpath = {
1116 .dentry = upperdentry ?: lowerdentry,
1117 .mnt = upperdentry ? ovl_upper_mnt(ofs) : lowerpath->layer->mnt,
1118 };
1119 bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry,
1120 oip->index);
1121 int fsid = bylower ? lowerpath->layer->fsid : 0;
1122 bool is_dir;
1123 unsigned long ino = 0;
1124 int err = oip->newinode ? -EEXIST : -ENOMEM;
1125
1126 if (!realinode)
1127 realinode = d_inode(lowerdentry);
1128
1129
1130
1131
1132
1133 is_dir = S_ISDIR(realinode->i_mode);
1134 if (upperdentry || bylower) {
1135 struct inode *key = d_inode(bylower ? lowerdentry :
1136 upperdentry);
1137 unsigned int nlink = is_dir ? 1 : realinode->i_nlink;
1138
1139 inode = ovl_iget5(sb, oip->newinode, key);
1140 if (!inode)
1141 goto out_err;
1142 if (!(inode->i_state & I_NEW)) {
1143
1144
1145
1146
1147 if (!ovl_verify_inode(inode, lowerdentry, upperdentry,
1148 true)) {
1149 iput(inode);
1150 err = -ESTALE;
1151 goto out_err;
1152 }
1153
1154 dput(upperdentry);
1155 kfree(oip->redirect);
1156 goto out;
1157 }
1158
1159
1160 if (!is_dir)
1161 nlink = ovl_get_nlink(ofs, lowerdentry, upperdentry,
1162 nlink);
1163 set_nlink(inode, nlink);
1164 ino = key->i_ino;
1165 } else {
1166
1167 inode = new_inode(sb);
1168 if (!inode) {
1169 err = -ENOMEM;
1170 goto out_err;
1171 }
1172 ino = realinode->i_ino;
1173 fsid = lowerpath->layer->fsid;
1174 }
1175 ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev);
1176 ovl_inode_init(inode, oip, ino, fsid);
1177
1178 if (upperdentry && ovl_is_impuredir(sb, upperdentry))
1179 ovl_set_flag(OVL_IMPURE, inode);
1180
1181 if (oip->index)
1182 ovl_set_flag(OVL_INDEX, inode);
1183
1184 OVL_I(inode)->redirect = oip->redirect;
1185
1186 if (bylower)
1187 ovl_set_flag(OVL_CONST_INO, inode);
1188
1189
1190 if (is_dir) {
1191 if (((upperdentry && lowerdentry) || oip->numlower > 1) ||
1192 ovl_path_check_origin_xattr(ofs, &realpath)) {
1193 ovl_set_flag(OVL_WHITEOUTS, inode);
1194 }
1195 }
1196
1197
1198 if (upperdentry)
1199 ovl_check_protattr(inode, upperdentry);
1200
1201 if (inode->i_state & I_NEW)
1202 unlock_new_inode(inode);
1203out:
1204 return inode;
1205
1206out_err:
1207 pr_warn_ratelimited("failed to get inode (%i)\n", err);
1208 inode = ERR_PTR(err);
1209 goto out;
1210}
1211