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 err = vfs_fileattr_get(realpath->dentry, fa);
614 if (err == -ENOIOCTLCMD)
615 err = -ENOTTY;
616 return err;
617}
618
619int ovl_fileattr_get(struct dentry *dentry, struct fileattr *fa)
620{
621 struct inode *inode = d_inode(dentry);
622 struct path realpath;
623 const struct cred *old_cred;
624 int err;
625
626 ovl_path_real(dentry, &realpath);
627
628 old_cred = ovl_override_creds(inode->i_sb);
629 err = ovl_real_fileattr_get(&realpath, fa);
630 ovl_fileattr_prot_flags(inode, fa);
631 revert_creds(old_cred);
632
633 return err;
634}
635
636static const struct inode_operations ovl_file_inode_operations = {
637 .setattr = ovl_setattr,
638 .permission = ovl_permission,
639 .getattr = ovl_getattr,
640 .listxattr = ovl_listxattr,
641 .get_acl = ovl_get_acl,
642 .update_time = ovl_update_time,
643 .fiemap = ovl_fiemap,
644 .fileattr_get = ovl_fileattr_get,
645 .fileattr_set = ovl_fileattr_set,
646};
647
648static const struct inode_operations ovl_symlink_inode_operations = {
649 .setattr = ovl_setattr,
650 .get_link = ovl_get_link,
651 .getattr = ovl_getattr,
652 .listxattr = ovl_listxattr,
653 .update_time = ovl_update_time,
654};
655
656static const struct inode_operations ovl_special_inode_operations = {
657 .setattr = ovl_setattr,
658 .permission = ovl_permission,
659 .getattr = ovl_getattr,
660 .listxattr = ovl_listxattr,
661 .get_acl = ovl_get_acl,
662 .update_time = ovl_update_time,
663};
664
665static const struct address_space_operations ovl_aops = {
666
667 .direct_IO = noop_direct_IO,
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
704
705
706#define OVL_MAX_NESTING FILESYSTEM_MAX_STACK_DEPTH
707
708static inline void ovl_lockdep_annotate_inode_mutex_key(struct inode *inode)
709{
710#ifdef CONFIG_LOCKDEP
711 static struct lock_class_key ovl_i_mutex_key[OVL_MAX_NESTING];
712 static struct lock_class_key ovl_i_mutex_dir_key[OVL_MAX_NESTING];
713 static struct lock_class_key ovl_i_lock_key[OVL_MAX_NESTING];
714
715 int depth = inode->i_sb->s_stack_depth - 1;
716
717 if (WARN_ON_ONCE(depth < 0 || depth >= OVL_MAX_NESTING))
718 depth = 0;
719
720 if (S_ISDIR(inode->i_mode))
721 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_dir_key[depth]);
722 else
723 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_key[depth]);
724
725 lockdep_set_class(&OVL_I(inode)->lock, &ovl_i_lock_key[depth]);
726#endif
727}
728
729static void ovl_next_ino(struct inode *inode)
730{
731 struct ovl_fs *ofs = inode->i_sb->s_fs_info;
732
733 inode->i_ino = atomic_long_inc_return(&ofs->last_ino);
734 if (unlikely(!inode->i_ino))
735 inode->i_ino = atomic_long_inc_return(&ofs->last_ino);
736}
737
738static void ovl_map_ino(struct inode *inode, unsigned long ino, int fsid)
739{
740 int xinobits = ovl_xino_bits(inode->i_sb);
741 unsigned int xinoshift = 64 - xinobits;
742
743
744
745
746
747
748
749
750 inode->i_ino = ino;
751 if (ovl_same_fs(inode->i_sb)) {
752 return;
753 } else if (xinobits && likely(!(ino >> xinoshift))) {
754 inode->i_ino |= (unsigned long)fsid << (xinoshift + 1);
755 return;
756 }
757
758
759
760
761
762
763
764
765
766
767 if (S_ISDIR(inode->i_mode)) {
768 ovl_next_ino(inode);
769 if (xinobits) {
770 inode->i_ino &= ~0UL >> xinobits;
771 inode->i_ino |= 1UL << xinoshift;
772 }
773 }
774}
775
776void ovl_inode_init(struct inode *inode, struct ovl_inode_params *oip,
777 unsigned long ino, int fsid)
778{
779 struct inode *realinode;
780
781 if (oip->upperdentry)
782 OVL_I(inode)->__upperdentry = oip->upperdentry;
783 if (oip->lowerpath && oip->lowerpath->dentry)
784 OVL_I(inode)->lower = igrab(d_inode(oip->lowerpath->dentry));
785 if (oip->lowerdata)
786 OVL_I(inode)->lowerdata = igrab(d_inode(oip->lowerdata));
787
788 realinode = ovl_inode_real(inode);
789 ovl_copyattr(realinode, inode);
790 ovl_copyflags(realinode, inode);
791 ovl_map_ino(inode, ino, fsid);
792}
793
794static void ovl_fill_inode(struct inode *inode, umode_t mode, dev_t rdev)
795{
796 inode->i_mode = mode;
797 inode->i_flags |= S_NOCMTIME;
798#ifdef CONFIG_FS_POSIX_ACL
799 inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE;
800#endif
801
802 ovl_lockdep_annotate_inode_mutex_key(inode);
803
804 switch (mode & S_IFMT) {
805 case S_IFREG:
806 inode->i_op = &ovl_file_inode_operations;
807 inode->i_fop = &ovl_file_operations;
808 inode->i_mapping->a_ops = &ovl_aops;
809 break;
810
811 case S_IFDIR:
812 inode->i_op = &ovl_dir_inode_operations;
813 inode->i_fop = &ovl_dir_operations;
814 break;
815
816 case S_IFLNK:
817 inode->i_op = &ovl_symlink_inode_operations;
818 break;
819
820 default:
821 inode->i_op = &ovl_special_inode_operations;
822 init_special_inode(inode, mode, rdev);
823 break;
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
849
850
851#define OVL_NLINK_ADD_UPPER (1 << 0)
852
853
854
855
856
857
858
859
860static int ovl_set_nlink_common(struct dentry *dentry,
861 struct dentry *realdentry, const char *format)
862{
863 struct inode *inode = d_inode(dentry);
864 struct inode *realinode = d_inode(realdentry);
865 char buf[13];
866 int len;
867
868 len = snprintf(buf, sizeof(buf), format,
869 (int) (inode->i_nlink - realinode->i_nlink));
870
871 if (WARN_ON(len >= sizeof(buf)))
872 return -EIO;
873
874 return ovl_do_setxattr(OVL_FS(inode->i_sb), ovl_dentry_upper(dentry),
875 OVL_XATTR_NLINK, buf, len);
876}
877
878int ovl_set_nlink_upper(struct dentry *dentry)
879{
880 return ovl_set_nlink_common(dentry, ovl_dentry_upper(dentry), "U%+i");
881}
882
883int ovl_set_nlink_lower(struct dentry *dentry)
884{
885 return ovl_set_nlink_common(dentry, ovl_dentry_lower(dentry), "L%+i");
886}
887
888unsigned int ovl_get_nlink(struct ovl_fs *ofs, struct dentry *lowerdentry,
889 struct dentry *upperdentry,
890 unsigned int fallback)
891{
892 int nlink_diff;
893 int nlink;
894 char buf[13];
895 int err;
896
897 if (!lowerdentry || !upperdentry || d_inode(lowerdentry)->i_nlink == 1)
898 return fallback;
899
900 err = ovl_do_getxattr(ofs, upperdentry, OVL_XATTR_NLINK,
901 &buf, sizeof(buf) - 1);
902 if (err < 0)
903 goto fail;
904
905 buf[err] = '\0';
906 if ((buf[0] != 'L' && buf[0] != 'U') ||
907 (buf[1] != '+' && buf[1] != '-'))
908 goto fail;
909
910 err = kstrtoint(buf + 1, 10, &nlink_diff);
911 if (err < 0)
912 goto fail;
913
914 nlink = d_inode(buf[0] == 'L' ? lowerdentry : upperdentry)->i_nlink;
915 nlink += nlink_diff;
916
917 if (nlink <= 0)
918 goto fail;
919
920 return nlink;
921
922fail:
923 pr_warn_ratelimited("failed to get index nlink (%pd2, err=%i)\n",
924 upperdentry, err);
925 return fallback;
926}
927
928struct inode *ovl_new_inode(struct super_block *sb, umode_t mode, dev_t rdev)
929{
930 struct inode *inode;
931
932 inode = new_inode(sb);
933 if (inode)
934 ovl_fill_inode(inode, mode, rdev);
935
936 return inode;
937}
938
939static int ovl_inode_test(struct inode *inode, void *data)
940{
941 return inode->i_private == data;
942}
943
944static int ovl_inode_set(struct inode *inode, void *data)
945{
946 inode->i_private = data;
947 return 0;
948}
949
950static bool ovl_verify_inode(struct inode *inode, struct dentry *lowerdentry,
951 struct dentry *upperdentry, bool strict)
952{
953
954
955
956
957
958
959 if (S_ISDIR(inode->i_mode) && strict) {
960
961 if (!lowerdentry && ovl_inode_lower(inode))
962 return false;
963
964
965 if (!upperdentry && ovl_inode_upper(inode))
966 return false;
967 }
968
969
970
971
972
973
974
975 if (lowerdentry && ovl_inode_lower(inode) != d_inode(lowerdentry))
976 return false;
977
978
979
980
981
982 if (upperdentry && ovl_inode_upper(inode) != d_inode(upperdentry))
983 return false;
984
985 return true;
986}
987
988struct inode *ovl_lookup_inode(struct super_block *sb, struct dentry *real,
989 bool is_upper)
990{
991 struct inode *inode, *key = d_inode(real);
992
993 inode = ilookup5(sb, (unsigned long) key, ovl_inode_test, key);
994 if (!inode)
995 return NULL;
996
997 if (!ovl_verify_inode(inode, is_upper ? NULL : real,
998 is_upper ? real : NULL, false)) {
999 iput(inode);
1000 return ERR_PTR(-ESTALE);
1001 }
1002
1003 return inode;
1004}
1005
1006bool ovl_lookup_trap_inode(struct super_block *sb, struct dentry *dir)
1007{
1008 struct inode *key = d_inode(dir);
1009 struct inode *trap;
1010 bool res;
1011
1012 trap = ilookup5(sb, (unsigned long) key, ovl_inode_test, key);
1013 if (!trap)
1014 return false;
1015
1016 res = IS_DEADDIR(trap) && !ovl_inode_upper(trap) &&
1017 !ovl_inode_lower(trap);
1018
1019 iput(trap);
1020 return res;
1021}
1022
1023
1024
1025
1026
1027
1028struct inode *ovl_get_trap_inode(struct super_block *sb, struct dentry *dir)
1029{
1030 struct inode *key = d_inode(dir);
1031 struct inode *trap;
1032
1033 if (!d_is_dir(dir))
1034 return ERR_PTR(-ENOTDIR);
1035
1036 trap = iget5_locked(sb, (unsigned long) key, ovl_inode_test,
1037 ovl_inode_set, key);
1038 if (!trap)
1039 return ERR_PTR(-ENOMEM);
1040
1041 if (!(trap->i_state & I_NEW)) {
1042
1043 iput(trap);
1044 return ERR_PTR(-ELOOP);
1045 }
1046
1047 trap->i_mode = S_IFDIR;
1048 trap->i_flags = S_DEAD;
1049 unlock_new_inode(trap);
1050
1051 return trap;
1052}
1053
1054
1055
1056
1057static bool ovl_hash_bylower(struct super_block *sb, struct dentry *upper,
1058 struct dentry *lower, bool index)
1059{
1060 struct ovl_fs *ofs = sb->s_fs_info;
1061
1062
1063 if (!lower)
1064 return false;
1065
1066
1067 if (index)
1068 return true;
1069
1070
1071 if (!ovl_upper_mnt(ofs))
1072 return true;
1073
1074
1075 if ((upper || !ovl_indexdir(sb)) &&
1076 !d_is_dir(lower) && d_inode(lower)->i_nlink > 1)
1077 return false;
1078
1079
1080 if (sb->s_export_op && upper)
1081 return false;
1082
1083
1084 return true;
1085}
1086
1087static struct inode *ovl_iget5(struct super_block *sb, struct inode *newinode,
1088 struct inode *key)
1089{
1090 return newinode ? inode_insert5(newinode, (unsigned long) key,
1091 ovl_inode_test, ovl_inode_set, key) :
1092 iget5_locked(sb, (unsigned long) key,
1093 ovl_inode_test, ovl_inode_set, key);
1094}
1095
1096struct inode *ovl_get_inode(struct super_block *sb,
1097 struct ovl_inode_params *oip)
1098{
1099 struct ovl_fs *ofs = OVL_FS(sb);
1100 struct dentry *upperdentry = oip->upperdentry;
1101 struct ovl_path *lowerpath = oip->lowerpath;
1102 struct inode *realinode = upperdentry ? d_inode(upperdentry) : NULL;
1103 struct inode *inode;
1104 struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL;
1105 bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry,
1106 oip->index);
1107 int fsid = bylower ? lowerpath->layer->fsid : 0;
1108 bool is_dir;
1109 unsigned long ino = 0;
1110 int err = oip->newinode ? -EEXIST : -ENOMEM;
1111
1112 if (!realinode)
1113 realinode = d_inode(lowerdentry);
1114
1115
1116
1117
1118
1119 is_dir = S_ISDIR(realinode->i_mode);
1120 if (upperdentry || bylower) {
1121 struct inode *key = d_inode(bylower ? lowerdentry :
1122 upperdentry);
1123 unsigned int nlink = is_dir ? 1 : realinode->i_nlink;
1124
1125 inode = ovl_iget5(sb, oip->newinode, key);
1126 if (!inode)
1127 goto out_err;
1128 if (!(inode->i_state & I_NEW)) {
1129
1130
1131
1132
1133 if (!ovl_verify_inode(inode, lowerdentry, upperdentry,
1134 true)) {
1135 iput(inode);
1136 err = -ESTALE;
1137 goto out_err;
1138 }
1139
1140 dput(upperdentry);
1141 kfree(oip->redirect);
1142 goto out;
1143 }
1144
1145
1146 if (!is_dir)
1147 nlink = ovl_get_nlink(ofs, lowerdentry, upperdentry,
1148 nlink);
1149 set_nlink(inode, nlink);
1150 ino = key->i_ino;
1151 } else {
1152
1153 inode = new_inode(sb);
1154 if (!inode) {
1155 err = -ENOMEM;
1156 goto out_err;
1157 }
1158 ino = realinode->i_ino;
1159 fsid = lowerpath->layer->fsid;
1160 }
1161 ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev);
1162 ovl_inode_init(inode, oip, ino, fsid);
1163
1164 if (upperdentry && ovl_is_impuredir(sb, upperdentry))
1165 ovl_set_flag(OVL_IMPURE, inode);
1166
1167 if (oip->index)
1168 ovl_set_flag(OVL_INDEX, inode);
1169
1170 OVL_I(inode)->redirect = oip->redirect;
1171
1172 if (bylower)
1173 ovl_set_flag(OVL_CONST_INO, inode);
1174
1175
1176 if (is_dir) {
1177 if (((upperdentry && lowerdentry) || oip->numlower > 1) ||
1178 ovl_check_origin_xattr(ofs, upperdentry ?: lowerdentry)) {
1179 ovl_set_flag(OVL_WHITEOUTS, inode);
1180 }
1181 }
1182
1183
1184 if (upperdentry)
1185 ovl_check_protattr(inode, upperdentry);
1186
1187 if (inode->i_state & I_NEW)
1188 unlock_new_inode(inode);
1189out:
1190 return inode;
1191
1192out_err:
1193 pr_warn_ratelimited("failed to get inode (%i)\n", err);
1194 inode = ERR_PTR(err);
1195 goto out;
1196}
1197