super.c (93faccbbfa958a9668d3ab4e30f38dd205cee8d8) | super.c (dc3b17cc8bf21307c7e076e7c778d5db756f7871) |
---|---|
1/* 2 * linux/fs/super.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 * 6 * super.c contains code to handle: - mount structures 7 * - super-block tables 8 * - filesystem drivers list --- 455 unchanged lines hidden (view full) --- 464 int (*set)(struct super_block *,void *), 465 int flags, struct user_namespace *user_ns, 466 void *data) 467{ 468 struct super_block *s = NULL; 469 struct super_block *old; 470 int err; 471 | 1/* 2 * linux/fs/super.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 * 6 * super.c contains code to handle: - mount structures 7 * - super-block tables 8 * - filesystem drivers list --- 455 unchanged lines hidden (view full) --- 464 int (*set)(struct super_block *,void *), 465 int flags, struct user_namespace *user_ns, 466 void *data) 467{ 468 struct super_block *s = NULL; 469 struct super_block *old; 470 int err; 471 |
472 if (!(flags & (MS_KERNMOUNT|MS_SUBMOUNT)) && | 472 if (!(flags & MS_KERNMOUNT) && |
473 !(type->fs_flags & FS_USERNS_MOUNT) && 474 !capable(CAP_SYS_ADMIN)) 475 return ERR_PTR(-EPERM); 476retry: 477 spin_lock(&sb_lock); 478 if (test) { 479 hlist_for_each_entry(old, &type->fs_supers, s_instances) { 480 if (!test(old, data)) --- 13 unchanged lines hidden (view full) --- 494 destroy_super(s); 495 s = NULL; 496 } 497 return old; 498 } 499 } 500 if (!s) { 501 spin_unlock(&sb_lock); | 473 !(type->fs_flags & FS_USERNS_MOUNT) && 474 !capable(CAP_SYS_ADMIN)) 475 return ERR_PTR(-EPERM); 476retry: 477 spin_lock(&sb_lock); 478 if (test) { 479 hlist_for_each_entry(old, &type->fs_supers, s_instances) { 480 if (!test(old, data)) --- 13 unchanged lines hidden (view full) --- 494 destroy_super(s); 495 s = NULL; 496 } 497 return old; 498 } 499 } 500 if (!s) { 501 spin_unlock(&sb_lock); |
502 s = alloc_super(type, (flags & ~MS_SUBMOUNT), user_ns); | 502 s = alloc_super(type, flags, user_ns); |
503 if (!s) 504 return ERR_PTR(-ENOMEM); 505 goto retry; 506 } 507 508 err = set(s, data); 509 if (err) { 510 spin_unlock(&sb_lock); --- 24 unchanged lines hidden (view full) --- 535struct super_block *sget(struct file_system_type *type, 536 int (*test)(struct super_block *,void *), 537 int (*set)(struct super_block *,void *), 538 int flags, 539 void *data) 540{ 541 struct user_namespace *user_ns = current_user_ns(); 542 | 503 if (!s) 504 return ERR_PTR(-ENOMEM); 505 goto retry; 506 } 507 508 err = set(s, data); 509 if (err) { 510 spin_unlock(&sb_lock); --- 24 unchanged lines hidden (view full) --- 535struct super_block *sget(struct file_system_type *type, 536 int (*test)(struct super_block *,void *), 537 int (*set)(struct super_block *,void *), 538 int flags, 539 void *data) 540{ 541 struct user_namespace *user_ns = current_user_ns(); 542 |
543 /* We don't yet pass the user namespace of the parent 544 * mount through to here so always use &init_user_ns 545 * until that changes. 546 */ 547 if (flags & MS_SUBMOUNT) 548 user_ns = &init_user_ns; 549 | |
550 /* Ensure the requestor has permissions over the target filesystem */ | 543 /* Ensure the requestor has permissions over the target filesystem */ |
551 if (!(flags & (MS_KERNMOUNT|MS_SUBMOUNT)) && !ns_capable(user_ns, CAP_SYS_ADMIN)) | 544 if (!(flags & MS_KERNMOUNT) && !ns_capable(user_ns, CAP_SYS_ADMIN)) |
552 return ERR_PTR(-EPERM); 553 554 return sget_userns(type, test, set, flags, user_ns, data); 555} 556 557EXPORT_SYMBOL(sget); 558 559void drop_super(struct super_block *sb) --- 489 unchanged lines hidden (view full) --- 1049{ 1050 s->s_bdev = data; 1051 s->s_dev = s->s_bdev->bd_dev; 1052 1053 /* 1054 * We set the bdi here to the queue backing, file systems can 1055 * overwrite this in ->fill_super() 1056 */ | 545 return ERR_PTR(-EPERM); 546 547 return sget_userns(type, test, set, flags, user_ns, data); 548} 549 550EXPORT_SYMBOL(sget); 551 552void drop_super(struct super_block *sb) --- 489 unchanged lines hidden (view full) --- 1042{ 1043 s->s_bdev = data; 1044 s->s_dev = s->s_bdev->bd_dev; 1045 1046 /* 1047 * We set the bdi here to the queue backing, file systems can 1048 * overwrite this in ->fill_super() 1049 */ |
1057 s->s_bdi = &bdev_get_queue(s->s_bdev)->backing_dev_info; | 1050 s->s_bdi = bdev_get_queue(s->s_bdev)->backing_dev_info; |
1058 return 0; 1059} 1060 1061static int test_bdev_super(struct super_block *s, void *data) 1062{ 1063 return (void *)s->s_bdev == data; 1064} 1065 --- 423 unchanged lines hidden --- | 1051 return 0; 1052} 1053 1054static int test_bdev_super(struct super_block *s, void *data) 1055{ 1056 return (void *)s->s_bdev == data; 1057} 1058 --- 423 unchanged lines hidden --- |