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