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 ---