Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
   1// SPDX-License-Identifier: GPL-2.0-only
   2
   3#include <linux/fs.h>
   4#include <linux/module.h>
   5#include <linux/namei.h>
   6#include <linux/fs_context.h>
   7#include <linux/fs_parser.h>
   8#include <linux/posix_acl_xattr.h>
   9#include <linux/seq_file.h>
  10#include <linux/xattr.h>
  11#include "overlayfs.h"
  12#include "params.h"
  13
  14static bool ovl_redirect_dir_def = IS_ENABLED(CONFIG_OVERLAY_FS_REDIRECT_DIR);
  15module_param_named(redirect_dir, ovl_redirect_dir_def, bool, 0644);
  16MODULE_PARM_DESC(redirect_dir,
  17		 "Default to on or off for the redirect_dir feature");
  18
  19static bool ovl_redirect_always_follow =
  20	IS_ENABLED(CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW);
  21module_param_named(redirect_always_follow, ovl_redirect_always_follow,
  22		   bool, 0644);
  23MODULE_PARM_DESC(redirect_always_follow,
  24		 "Follow redirects even if redirect_dir feature is turned off");
  25
  26static bool ovl_xino_auto_def = IS_ENABLED(CONFIG_OVERLAY_FS_XINO_AUTO);
  27module_param_named(xino_auto, ovl_xino_auto_def, bool, 0644);
  28MODULE_PARM_DESC(xino_auto,
  29		 "Auto enable xino feature");
  30
  31static bool ovl_index_def = IS_ENABLED(CONFIG_OVERLAY_FS_INDEX);
  32module_param_named(index, ovl_index_def, bool, 0644);
  33MODULE_PARM_DESC(index,
  34		 "Default to on or off for the inodes index feature");
  35
  36static bool ovl_nfs_export_def = IS_ENABLED(CONFIG_OVERLAY_FS_NFS_EXPORT);
  37module_param_named(nfs_export, ovl_nfs_export_def, bool, 0644);
  38MODULE_PARM_DESC(nfs_export,
  39		 "Default to on or off for the NFS export feature");
  40
  41static bool ovl_metacopy_def = IS_ENABLED(CONFIG_OVERLAY_FS_METACOPY);
  42module_param_named(metacopy, ovl_metacopy_def, bool, 0644);
  43MODULE_PARM_DESC(metacopy,
  44		 "Default to on or off for the metadata only copy up feature");
  45
  46enum ovl_opt {
  47	Opt_lowerdir,
  48	Opt_lowerdir_add,
  49	Opt_datadir_add,
  50	Opt_upperdir,
  51	Opt_workdir,
  52	Opt_default_permissions,
  53	Opt_redirect_dir,
  54	Opt_index,
  55	Opt_uuid,
  56	Opt_nfs_export,
  57	Opt_userxattr,
  58	Opt_xino,
  59	Opt_metacopy,
  60	Opt_verity,
  61	Opt_volatile,
  62};
  63
  64static const struct constant_table ovl_parameter_bool[] = {
  65	{ "on",		true  },
  66	{ "off",	false },
  67	{}
  68};
  69
  70static const struct constant_table ovl_parameter_uuid[] = {
  71	{ "off",	OVL_UUID_OFF  },
  72	{ "null",	OVL_UUID_NULL },
  73	{ "auto",	OVL_UUID_AUTO },
  74	{ "on",		OVL_UUID_ON   },
  75	{}
  76};
  77
  78static const char *ovl_uuid_mode(struct ovl_config *config)
  79{
  80	return ovl_parameter_uuid[config->uuid].name;
  81}
  82
  83static int ovl_uuid_def(void)
  84{
  85	return OVL_UUID_AUTO;
  86}
  87
  88static const struct constant_table ovl_parameter_xino[] = {
  89	{ "off",	OVL_XINO_OFF  },
  90	{ "auto",	OVL_XINO_AUTO },
  91	{ "on",		OVL_XINO_ON   },
  92	{}
  93};
  94
  95const char *ovl_xino_mode(struct ovl_config *config)
  96{
  97	return ovl_parameter_xino[config->xino].name;
  98}
  99
 100static int ovl_xino_def(void)
 101{
 102	return ovl_xino_auto_def ? OVL_XINO_AUTO : OVL_XINO_OFF;
 103}
 104
 105const struct constant_table ovl_parameter_redirect_dir[] = {
 106	{ "off",	OVL_REDIRECT_OFF      },
 107	{ "follow",	OVL_REDIRECT_FOLLOW   },
 108	{ "nofollow",	OVL_REDIRECT_NOFOLLOW },
 109	{ "on",		OVL_REDIRECT_ON       },
 110	{}
 111};
 112
 113static const char *ovl_redirect_mode(struct ovl_config *config)
 114{
 115	return ovl_parameter_redirect_dir[config->redirect_mode].name;
 116}
 117
 118static int ovl_redirect_mode_def(void)
 119{
 120	return ovl_redirect_dir_def	  ? OVL_REDIRECT_ON :
 121	       ovl_redirect_always_follow ? OVL_REDIRECT_FOLLOW :
 122					    OVL_REDIRECT_NOFOLLOW;
 123}
 124
 125static const struct constant_table ovl_parameter_verity[] = {
 126	{ "off",	OVL_VERITY_OFF     },
 127	{ "on",		OVL_VERITY_ON      },
 128	{ "require",	OVL_VERITY_REQUIRE },
 129	{}
 130};
 131
 132static const char *ovl_verity_mode(struct ovl_config *config)
 133{
 134	return ovl_parameter_verity[config->verity_mode].name;
 135}
 136
 137static int ovl_verity_mode_def(void)
 138{
 139	return OVL_VERITY_OFF;
 140}
 141
 142#define fsparam_string_empty(NAME, OPT) \
 143	__fsparam(fs_param_is_string, NAME, OPT, fs_param_can_be_empty, NULL)
 144
 145
 146const struct fs_parameter_spec ovl_parameter_spec[] = {
 147	fsparam_string_empty("lowerdir",    Opt_lowerdir),
 148	fsparam_string("lowerdir+",         Opt_lowerdir_add),
 149	fsparam_string("datadir+",          Opt_datadir_add),
 150	fsparam_string("upperdir",          Opt_upperdir),
 151	fsparam_string("workdir",           Opt_workdir),
 152	fsparam_flag("default_permissions", Opt_default_permissions),
 153	fsparam_enum("redirect_dir",        Opt_redirect_dir, ovl_parameter_redirect_dir),
 154	fsparam_enum("index",               Opt_index, ovl_parameter_bool),
 155	fsparam_enum("uuid",                Opt_uuid, ovl_parameter_uuid),
 156	fsparam_enum("nfs_export",          Opt_nfs_export, ovl_parameter_bool),
 157	fsparam_flag("userxattr",           Opt_userxattr),
 158	fsparam_enum("xino",                Opt_xino, ovl_parameter_xino),
 159	fsparam_enum("metacopy",            Opt_metacopy, ovl_parameter_bool),
 160	fsparam_enum("verity",              Opt_verity, ovl_parameter_verity),
 161	fsparam_flag("volatile",            Opt_volatile),
 162	{}
 163};
 164
 165static char *ovl_next_opt(char **s)
 166{
 167	char *sbegin = *s;
 168	char *p;
 169
 170	if (sbegin == NULL)
 171		return NULL;
 172
 173	for (p = sbegin; *p; p++) {
 174		if (*p == '\\') {
 175			p++;
 176			if (!*p)
 177				break;
 178		} else if (*p == ',') {
 179			*p = '\0';
 180			*s = p + 1;
 181			return sbegin;
 182		}
 183	}
 184	*s = NULL;
 185	return sbegin;
 186}
 187
 188static int ovl_parse_monolithic(struct fs_context *fc, void *data)
 189{
 190	return vfs_parse_monolithic_sep(fc, data, ovl_next_opt);
 191}
 192
 193static ssize_t ovl_parse_param_split_lowerdirs(char *str)
 194{
 195	ssize_t nr_layers = 1, nr_colons = 0;
 196	char *s, *d;
 197
 198	for (s = d = str;; s++, d++) {
 199		if (*s == '\\') {
 200			/* keep esc chars in split lowerdir */
 201			*d++ = *s++;
 202		} else if (*s == ':') {
 203			bool next_colon = (*(s + 1) == ':');
 204
 205			nr_colons++;
 206			if (nr_colons == 2 && next_colon) {
 207				pr_err("only single ':' or double '::' sequences of unescaped colons in lowerdir mount option allowed.\n");
 208				return -EINVAL;
 209			}
 210			/* count layers, not colons */
 211			if (!next_colon)
 212				nr_layers++;
 213
 214			*d = '\0';
 215			continue;
 216		}
 217
 218		*d = *s;
 219		if (!*s) {
 220			/* trailing colons */
 221			if (nr_colons) {
 222				pr_err("unescaped trailing colons in lowerdir mount option.\n");
 223				return -EINVAL;
 224			}
 225			break;
 226		}
 227		nr_colons = 0;
 228	}
 229
 230	return nr_layers;
 231}
 232
 233static int ovl_mount_dir_noesc(const char *name, struct path *path)
 234{
 235	int err = -EINVAL;
 236
 237	if (!*name) {
 238		pr_err("empty lowerdir\n");
 239		goto out;
 240	}
 241	err = kern_path(name, LOOKUP_FOLLOW, path);
 242	if (err) {
 243		pr_err("failed to resolve '%s': %i\n", name, err);
 244		goto out;
 245	}
 246	return 0;
 247
 248out:
 249	return err;
 250}
 251
 252static void ovl_unescape(char *s)
 253{
 254	char *d = s;
 255
 256	for (;; s++, d++) {
 257		if (*s == '\\')
 258			s++;
 259		*d = *s;
 260		if (!*s)
 261			break;
 262	}
 263}
 264
 265static int ovl_mount_dir(const char *name, struct path *path)
 266{
 267	int err = -ENOMEM;
 268	char *tmp = kstrdup(name, GFP_KERNEL);
 269
 270	if (tmp) {
 271		ovl_unescape(tmp);
 272		err = ovl_mount_dir_noesc(tmp, path);
 273		kfree(tmp);
 274	}
 275	return err;
 276}
 277
 278static int ovl_mount_dir_check(struct fs_context *fc, const struct path *path,
 279			       enum ovl_opt layer, const char *name, bool upper)
 280{
 281	struct ovl_fs_context *ctx = fc->fs_private;
 282
 283	if (!d_is_dir(path->dentry))
 284		return invalfc(fc, "%s is not a directory", name);
 285
 286	/*
 287	 * Root dentries of case-insensitive capable filesystems might
 288	 * not have the dentry operations set, but still be incompatible
 289	 * with overlayfs.  Check explicitly to prevent post-mount
 290	 * failures.
 291	 */
 292	if (sb_has_encoding(path->mnt->mnt_sb))
 293		return invalfc(fc, "case-insensitive capable filesystem on %s not supported", name);
 294
 295	if (ovl_dentry_weird(path->dentry))
 296		return invalfc(fc, "filesystem on %s not supported", name);
 297
 298	/*
 299	 * Check whether upper path is read-only here to report failures
 300	 * early. Don't forget to recheck when the superblock is created
 301	 * as the mount attributes could change.
 302	 */
 303	if (upper) {
 304		if (path->dentry->d_flags & DCACHE_OP_REAL)
 305			return invalfc(fc, "filesystem on %s not supported as upperdir", name);
 306		if (__mnt_is_readonly(path->mnt))
 307			return invalfc(fc, "filesystem on %s is read-only", name);
 308	} else {
 309		if (ctx->lowerdir_all && layer != Opt_lowerdir)
 310			return invalfc(fc, "lowerdir+ and datadir+ cannot follow lowerdir");
 311		if (ctx->nr_data && layer == Opt_lowerdir_add)
 312			return invalfc(fc, "regular lower layers cannot follow data layers");
 313		if (ctx->nr == OVL_MAX_STACK)
 314			return invalfc(fc, "too many lower directories, limit is %d",
 315				       OVL_MAX_STACK);
 316	}
 317	return 0;
 318}
 319
 320static int ovl_ctx_realloc_lower(struct fs_context *fc)
 321{
 322	struct ovl_fs_context *ctx = fc->fs_private;
 323	struct ovl_fs_context_layer *l;
 324	size_t nr;
 325
 326	if (ctx->nr < ctx->capacity)
 327		return 0;
 328
 329	nr = min_t(size_t, max(4096 / sizeof(*l), ctx->capacity * 2),
 330		   OVL_MAX_STACK);
 331	l = krealloc_array(ctx->lower, nr, sizeof(*l), GFP_KERNEL_ACCOUNT);
 332	if (!l)
 333		return -ENOMEM;
 334
 335	ctx->lower = l;
 336	ctx->capacity = nr;
 337	return 0;
 338}
 339
 340static void ovl_add_layer(struct fs_context *fc, enum ovl_opt layer,
 341			 struct path *path, char **pname)
 342{
 343	struct ovl_fs *ofs = fc->s_fs_info;
 344	struct ovl_config *config = &ofs->config;
 345	struct ovl_fs_context *ctx = fc->fs_private;
 346	struct ovl_fs_context_layer *l;
 347
 348	switch (layer) {
 349	case Opt_workdir:
 350		swap(config->workdir, *pname);
 351		swap(ctx->work, *path);
 352		break;
 353	case Opt_upperdir:
 354		swap(config->upperdir, *pname);
 355		swap(ctx->upper, *path);
 356		break;
 357	case Opt_datadir_add:
 358		ctx->nr_data++;
 359		fallthrough;
 360	case Opt_lowerdir_add:
 361		WARN_ON(ctx->nr >= ctx->capacity);
 362		l = &ctx->lower[ctx->nr++];
 363		memset(l, 0, sizeof(*l));
 364		swap(l->name, *pname);
 365		swap(l->path, *path);
 366		break;
 367	default:
 368		WARN_ON(1);
 369	}
 370}
 371
 372static int ovl_parse_layer(struct fs_context *fc, struct fs_parameter *param,
 373			   enum ovl_opt layer)
 374{
 375	char *name = kstrdup(param->string, GFP_KERNEL);
 376	bool upper = (layer == Opt_upperdir || layer == Opt_workdir);
 377	struct path path;
 378	int err;
 379
 380	if (!name)
 381		return -ENOMEM;
 382
 383	if (upper)
 384		err = ovl_mount_dir(name, &path);
 385	else
 386		err = ovl_mount_dir_noesc(name, &path);
 387	if (err)
 388		goto out_free;
 389
 390	err = ovl_mount_dir_check(fc, &path, layer, name, upper);
 391	if (err)
 392		goto out_put;
 393
 394	if (!upper) {
 395		err = ovl_ctx_realloc_lower(fc);
 396		if (err)
 397			goto out_put;
 398	}
 399
 400	/* Store the user provided path string in ctx to show in mountinfo */
 401	ovl_add_layer(fc, layer, &path, &name);
 402
 403out_put:
 404	path_put(&path);
 405out_free:
 406	kfree(name);
 407	return err;
 408}
 409
 410static void ovl_reset_lowerdirs(struct ovl_fs_context *ctx)
 411{
 412	struct ovl_fs_context_layer *l = ctx->lower;
 413
 414	// Reset old user provided lowerdir string
 415	kfree(ctx->lowerdir_all);
 416	ctx->lowerdir_all = NULL;
 417
 418	for (size_t nr = 0; nr < ctx->nr; nr++, l++) {
 419		path_put(&l->path);
 420		kfree(l->name);
 421		l->name = NULL;
 422	}
 423	ctx->nr = 0;
 424	ctx->nr_data = 0;
 425}
 426
 427/*
 428 * Parse lowerdir= mount option:
 429 *
 430 * e.g.: lowerdir=/lower1:/lower2:/lower3::/data1::/data2
 431 *     Set "/lower1", "/lower2", and "/lower3" as lower layers and
 432 *     "/data1" and "/data2" as data lower layers. Any existing lower
 433 *     layers are replaced.
 434 */
 435static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
 436{
 437	int err;
 438	struct ovl_fs_context *ctx = fc->fs_private;
 439	struct ovl_fs_context_layer *l;
 440	char *dup = NULL, *iter;
 441	ssize_t nr_lower, nr;
 442	bool data_layer = false;
 443
 444	/*
 445	 * Ensure we're backwards compatible with mount(2)
 446	 * by allowing relative paths.
 447	 */
 448
 449	/* drop all existing lower layers */
 450	ovl_reset_lowerdirs(ctx);
 451
 452	if (!*name)
 453		return 0;
 454
 455	if (*name == ':') {
 456		pr_err("cannot append lower layer");
 457		return -EINVAL;
 458	}
 459
 460	// Store user provided lowerdir string to show in mount options
 461	ctx->lowerdir_all = kstrdup(name, GFP_KERNEL);
 462	if (!ctx->lowerdir_all)
 463		return -ENOMEM;
 464
 465	dup = kstrdup(name, GFP_KERNEL);
 466	if (!dup)
 467		return -ENOMEM;
 468
 469	err = -EINVAL;
 470	nr_lower = ovl_parse_param_split_lowerdirs(dup);
 471	if (nr_lower < 0)
 472		goto out_err;
 473
 474	if (nr_lower > OVL_MAX_STACK) {
 475		pr_err("too many lower directories, limit is %d\n", OVL_MAX_STACK);
 476		goto out_err;
 477	}
 478
 479	if (nr_lower > ctx->capacity) {
 480		err = -ENOMEM;
 481		l = krealloc_array(ctx->lower, nr_lower, sizeof(*ctx->lower),
 482				   GFP_KERNEL_ACCOUNT);
 483		if (!l)
 484			goto out_err;
 485
 486		ctx->lower = l;
 487		ctx->capacity = nr_lower;
 488	}
 489
 490	iter = dup;
 491	l = ctx->lower;
 492	for (nr = 0; nr < nr_lower; nr++, l++) {
 493		ctx->nr++;
 494		memset(l, 0, sizeof(*l));
 495
 496		err = ovl_mount_dir(iter, &l->path);
 497		if (err)
 498			goto out_put;
 499
 500		err = ovl_mount_dir_check(fc, &l->path, Opt_lowerdir, iter, false);
 501		if (err)
 502			goto out_put;
 503
 504		err = -ENOMEM;
 505		l->name = kstrdup(iter, GFP_KERNEL_ACCOUNT);
 506		if (!l->name)
 507			goto out_put;
 508
 509		if (data_layer)
 510			ctx->nr_data++;
 511
 512		/* Calling strchr() again would overrun. */
 513		if (ctx->nr == nr_lower)
 514			break;
 515
 516		err = -EINVAL;
 517		iter = strchr(iter, '\0') + 1;
 518		if (*iter) {
 519			/*
 520			 * This is a regular layer so we require that
 521			 * there are no data layers.
 522			 */
 523			if (ctx->nr_data > 0) {
 524				pr_err("regular lower layers cannot follow data lower layers");
 525				goto out_put;
 526			}
 527
 528			data_layer = false;
 529			continue;
 530		}
 531
 532		/* This is a data lower layer. */
 533		data_layer = true;
 534		iter++;
 535	}
 536	kfree(dup);
 537	return 0;
 538
 539out_put:
 540	ovl_reset_lowerdirs(ctx);
 541
 542out_err:
 543	kfree(dup);
 544
 545	/* Intentionally don't realloc to a smaller size. */
 546	return err;
 547}
 548
 549static int ovl_parse_param(struct fs_context *fc, struct fs_parameter *param)
 550{
 551	int err = 0;
 552	struct fs_parse_result result;
 553	struct ovl_fs *ofs = fc->s_fs_info;
 554	struct ovl_config *config = &ofs->config;
 555	struct ovl_fs_context *ctx = fc->fs_private;
 556	int opt;
 557
 558	if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) {
 559		/*
 560		 * On remount overlayfs has always ignored all mount
 561		 * options no matter if malformed or not so for
 562		 * backwards compatibility we do the same here.
 563		 */
 564		if (fc->oldapi)
 565			return 0;
 566
 567		/*
 568		 * Give us the freedom to allow changing mount options
 569		 * with the new mount api in the future. So instead of
 570		 * silently ignoring everything we report a proper
 571		 * error. This is only visible for users of the new
 572		 * mount api.
 573		 */
 574		return invalfc(fc, "No changes allowed in reconfigure");
 575	}
 576
 577	opt = fs_parse(fc, ovl_parameter_spec, param, &result);
 578	if (opt < 0)
 579		return opt;
 580
 581	switch (opt) {
 582	case Opt_lowerdir:
 583		err = ovl_parse_param_lowerdir(param->string, fc);
 584		break;
 585	case Opt_lowerdir_add:
 586	case Opt_datadir_add:
 587	case Opt_upperdir:
 588	case Opt_workdir:
 589		err = ovl_parse_layer(fc, param, opt);
 590		break;
 591	case Opt_default_permissions:
 592		config->default_permissions = true;
 593		break;
 594	case Opt_redirect_dir:
 595		config->redirect_mode = result.uint_32;
 596		if (config->redirect_mode == OVL_REDIRECT_OFF) {
 597			config->redirect_mode = ovl_redirect_always_follow ?
 598						OVL_REDIRECT_FOLLOW :
 599						OVL_REDIRECT_NOFOLLOW;
 600		}
 601		ctx->set.redirect = true;
 602		break;
 603	case Opt_index:
 604		config->index = result.uint_32;
 605		ctx->set.index = true;
 606		break;
 607	case Opt_uuid:
 608		config->uuid = result.uint_32;
 609		break;
 610	case Opt_nfs_export:
 611		config->nfs_export = result.uint_32;
 612		ctx->set.nfs_export = true;
 613		break;
 614	case Opt_xino:
 615		config->xino = result.uint_32;
 616		break;
 617	case Opt_metacopy:
 618		config->metacopy = result.uint_32;
 619		ctx->set.metacopy = true;
 620		break;
 621	case Opt_verity:
 622		config->verity_mode = result.uint_32;
 623		break;
 624	case Opt_volatile:
 625		config->ovl_volatile = true;
 626		break;
 627	case Opt_userxattr:
 628		config->userxattr = true;
 629		break;
 630	default:
 631		pr_err("unrecognized mount option \"%s\" or missing value\n",
 632		       param->key);
 633		return -EINVAL;
 634	}
 635
 636	return err;
 637}
 638
 639static int ovl_get_tree(struct fs_context *fc)
 640{
 641	return get_tree_nodev(fc, ovl_fill_super);
 642}
 643
 644static inline void ovl_fs_context_free(struct ovl_fs_context *ctx)
 645{
 646	ovl_reset_lowerdirs(ctx);
 647	path_put(&ctx->upper);
 648	path_put(&ctx->work);
 649	kfree(ctx->lower);
 650	kfree(ctx);
 651}
 652
 653static void ovl_free(struct fs_context *fc)
 654{
 655	struct ovl_fs *ofs = fc->s_fs_info;
 656	struct ovl_fs_context *ctx = fc->fs_private;
 657
 658	/*
 659	 * ofs is stored in the fs_context when it is initialized.
 660	 * ofs is transferred to the superblock on a successful mount,
 661	 * but if an error occurs before the transfer we have to free
 662	 * it here.
 663	 */
 664	if (ofs)
 665		ovl_free_fs(ofs);
 666
 667	if (ctx)
 668		ovl_fs_context_free(ctx);
 669}
 670
 671static int ovl_reconfigure(struct fs_context *fc)
 672{
 673	struct super_block *sb = fc->root->d_sb;
 674	struct ovl_fs *ofs = OVL_FS(sb);
 675	struct super_block *upper_sb;
 676	int ret = 0;
 677
 678	if (!(fc->sb_flags & SB_RDONLY) && ovl_force_readonly(ofs))
 679		return -EROFS;
 680
 681	if (fc->sb_flags & SB_RDONLY && !sb_rdonly(sb)) {
 682		upper_sb = ovl_upper_mnt(ofs)->mnt_sb;
 683		if (ovl_should_sync(ofs)) {
 684			down_read(&upper_sb->s_umount);
 685			ret = sync_filesystem(upper_sb);
 686			up_read(&upper_sb->s_umount);
 687		}
 688	}
 689
 690	return ret;
 691}
 692
 693static const struct fs_context_operations ovl_context_ops = {
 694	.parse_monolithic = ovl_parse_monolithic,
 695	.parse_param = ovl_parse_param,
 696	.get_tree    = ovl_get_tree,
 697	.reconfigure = ovl_reconfigure,
 698	.free        = ovl_free,
 699};
 700
 701/*
 702 * This is called during fsopen() and will record the user namespace of
 703 * the caller in fc->user_ns since we've raised FS_USERNS_MOUNT. We'll
 704 * need it when we actually create the superblock to verify that the
 705 * process creating the superblock is in the same user namespace as
 706 * process that called fsopen().
 707 */
 708int ovl_init_fs_context(struct fs_context *fc)
 709{
 710	struct ovl_fs_context *ctx;
 711	struct ovl_fs *ofs;
 712
 713	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL_ACCOUNT);
 714	if (!ctx)
 715		return -ENOMEM;
 716
 717	/*
 718	 * By default we allocate for three lower layers. It's likely
 719	 * that it'll cover most users.
 720	 */
 721	ctx->lower = kmalloc_array(3, sizeof(*ctx->lower), GFP_KERNEL_ACCOUNT);
 722	if (!ctx->lower)
 723		goto out_err;
 724	ctx->capacity = 3;
 725
 726	ofs = kzalloc(sizeof(struct ovl_fs), GFP_KERNEL);
 727	if (!ofs)
 728		goto out_err;
 729
 730	ofs->config.redirect_mode	= ovl_redirect_mode_def();
 731	ofs->config.index		= ovl_index_def;
 732	ofs->config.uuid		= ovl_uuid_def();
 733	ofs->config.nfs_export		= ovl_nfs_export_def;
 734	ofs->config.xino		= ovl_xino_def();
 735	ofs->config.metacopy		= ovl_metacopy_def;
 736
 737	fc->s_fs_info		= ofs;
 738	fc->fs_private		= ctx;
 739	fc->ops			= &ovl_context_ops;
 740	return 0;
 741
 742out_err:
 743	ovl_fs_context_free(ctx);
 744	return -ENOMEM;
 745
 746}
 747
 748void ovl_free_fs(struct ovl_fs *ofs)
 749{
 750	struct vfsmount **mounts;
 751	unsigned i;
 752
 753	iput(ofs->workbasedir_trap);
 754	iput(ofs->workdir_trap);
 755	dput(ofs->whiteout);
 756	dput(ofs->workdir);
 757	if (ofs->workdir_locked)
 758		ovl_inuse_unlock(ofs->workbasedir);
 759	dput(ofs->workbasedir);
 760	if (ofs->upperdir_locked)
 761		ovl_inuse_unlock(ovl_upper_mnt(ofs)->mnt_root);
 762
 763	/* Reuse ofs->config.lowerdirs as a vfsmount array before freeing it */
 764	mounts = (struct vfsmount **) ofs->config.lowerdirs;
 765	for (i = 0; i < ofs->numlayer; i++) {
 766		iput(ofs->layers[i].trap);
 767		kfree(ofs->config.lowerdirs[i]);
 768		mounts[i] = ofs->layers[i].mnt;
 769	}
 770	kern_unmount_array(mounts, ofs->numlayer);
 771	kfree(ofs->layers);
 772	for (i = 0; i < ofs->numfs; i++)
 773		free_anon_bdev(ofs->fs[i].pseudo_dev);
 774	kfree(ofs->fs);
 775
 776	kfree(ofs->config.lowerdirs);
 777	kfree(ofs->config.upperdir);
 778	kfree(ofs->config.workdir);
 779	if (ofs->creator_cred)
 780		put_cred(ofs->creator_cred);
 781	kfree(ofs);
 782}
 783
 784int ovl_fs_params_verify(const struct ovl_fs_context *ctx,
 785			 struct ovl_config *config)
 786{
 787	struct ovl_opt_set set = ctx->set;
 788
 789	if (ctx->nr_data > 0 && !config->metacopy) {
 790		pr_err("lower data-only dirs require metacopy support.\n");
 791		return -EINVAL;
 792	}
 793
 794	/* Workdir/index are useless in non-upper mount */
 795	if (!config->upperdir) {
 796		if (config->workdir) {
 797			pr_info("option \"workdir=%s\" is useless in a non-upper mount, ignore\n",
 798				config->workdir);
 799			kfree(config->workdir);
 800			config->workdir = NULL;
 801		}
 802		if (config->index && set.index) {
 803			pr_info("option \"index=on\" is useless in a non-upper mount, ignore\n");
 804			set.index = false;
 805		}
 806		config->index = false;
 807	}
 808
 809	if (!config->upperdir && config->ovl_volatile) {
 810		pr_info("option \"volatile\" is meaningless in a non-upper mount, ignoring it.\n");
 811		config->ovl_volatile = false;
 812	}
 813
 814	if (!config->upperdir && config->uuid == OVL_UUID_ON) {
 815		pr_info("option \"uuid=on\" requires an upper fs, falling back to uuid=null.\n");
 816		config->uuid = OVL_UUID_NULL;
 817	}
 818
 819	/* Resolve verity -> metacopy dependency */
 820	if (config->verity_mode && !config->metacopy) {
 821		/* Don't allow explicit specified conflicting combinations */
 822		if (set.metacopy) {
 823			pr_err("conflicting options: metacopy=off,verity=%s\n",
 824			       ovl_verity_mode(config));
 825			return -EINVAL;
 826		}
 827		/* Otherwise automatically enable metacopy. */
 828		config->metacopy = true;
 829	}
 830
 831	/*
 832	 * This is to make the logic below simpler.  It doesn't make any other
 833	 * difference, since redirect_dir=on is only used for upper.
 834	 */
 835	if (!config->upperdir && config->redirect_mode == OVL_REDIRECT_FOLLOW)
 836		config->redirect_mode = OVL_REDIRECT_ON;
 837
 838	/* Resolve verity -> metacopy -> redirect_dir dependency */
 839	if (config->metacopy && config->redirect_mode != OVL_REDIRECT_ON) {
 840		if (set.metacopy && set.redirect) {
 841			pr_err("conflicting options: metacopy=on,redirect_dir=%s\n",
 842			       ovl_redirect_mode(config));
 843			return -EINVAL;
 844		}
 845		if (config->verity_mode && set.redirect) {
 846			pr_err("conflicting options: verity=%s,redirect_dir=%s\n",
 847			       ovl_verity_mode(config), ovl_redirect_mode(config));
 848			return -EINVAL;
 849		}
 850		if (set.redirect) {
 851			/*
 852			 * There was an explicit redirect_dir=... that resulted
 853			 * in this conflict.
 854			 */
 855			pr_info("disabling metacopy due to redirect_dir=%s\n",
 856				ovl_redirect_mode(config));
 857			config->metacopy = false;
 858		} else {
 859			/* Automatically enable redirect otherwise. */
 860			config->redirect_mode = OVL_REDIRECT_ON;
 861		}
 862	}
 863
 864	/* Resolve nfs_export -> index dependency */
 865	if (config->nfs_export && !config->index) {
 866		if (!config->upperdir &&
 867		    config->redirect_mode != OVL_REDIRECT_NOFOLLOW) {
 868			pr_info("NFS export requires \"redirect_dir=nofollow\" on non-upper mount, falling back to nfs_export=off.\n");
 869			config->nfs_export = false;
 870		} else if (set.nfs_export && set.index) {
 871			pr_err("conflicting options: nfs_export=on,index=off\n");
 872			return -EINVAL;
 873		} else if (set.index) {
 874			/*
 875			 * There was an explicit index=off that resulted
 876			 * in this conflict.
 877			 */
 878			pr_info("disabling nfs_export due to index=off\n");
 879			config->nfs_export = false;
 880		} else {
 881			/* Automatically enable index otherwise. */
 882			config->index = true;
 883		}
 884	}
 885
 886	/* Resolve nfs_export -> !metacopy && !verity dependency */
 887	if (config->nfs_export && config->metacopy) {
 888		if (set.nfs_export && set.metacopy) {
 889			pr_err("conflicting options: nfs_export=on,metacopy=on\n");
 890			return -EINVAL;
 891		}
 892		if (set.metacopy) {
 893			/*
 894			 * There was an explicit metacopy=on that resulted
 895			 * in this conflict.
 896			 */
 897			pr_info("disabling nfs_export due to metacopy=on\n");
 898			config->nfs_export = false;
 899		} else if (config->verity_mode) {
 900			/*
 901			 * There was an explicit verity=.. that resulted
 902			 * in this conflict.
 903			 */
 904			pr_info("disabling nfs_export due to verity=%s\n",
 905				ovl_verity_mode(config));
 906			config->nfs_export = false;
 907		} else {
 908			/*
 909			 * There was an explicit nfs_export=on that resulted
 910			 * in this conflict.
 911			 */
 912			pr_info("disabling metacopy due to nfs_export=on\n");
 913			config->metacopy = false;
 914		}
 915	}
 916
 917
 918	/* Resolve userxattr -> !redirect && !metacopy && !verity dependency */
 919	if (config->userxattr) {
 920		if (set.redirect &&
 921		    config->redirect_mode != OVL_REDIRECT_NOFOLLOW) {
 922			pr_err("conflicting options: userxattr,redirect_dir=%s\n",
 923			       ovl_redirect_mode(config));
 924			return -EINVAL;
 925		}
 926		if (config->metacopy && set.metacopy) {
 927			pr_err("conflicting options: userxattr,metacopy=on\n");
 928			return -EINVAL;
 929		}
 930		if (config->verity_mode) {
 931			pr_err("conflicting options: userxattr,verity=%s\n",
 932			       ovl_verity_mode(config));
 933			return -EINVAL;
 934		}
 935		/*
 936		 * Silently disable default setting of redirect and metacopy.
 937		 * This shall be the default in the future as well: these
 938		 * options must be explicitly enabled if used together with
 939		 * userxattr.
 940		 */
 941		config->redirect_mode = OVL_REDIRECT_NOFOLLOW;
 942		config->metacopy = false;
 943	}
 944
 945	return 0;
 946}
 947
 948/**
 949 * ovl_show_options
 950 * @m: the seq_file handle
 951 * @dentry: The dentry to query
 952 *
 953 * Prints the mount options for a given superblock.
 954 * Returns zero; does not fail.
 955 */
 956int ovl_show_options(struct seq_file *m, struct dentry *dentry)
 957{
 958	struct super_block *sb = dentry->d_sb;
 959	struct ovl_fs *ofs = OVL_FS(sb);
 960	size_t nr, nr_merged_lower, nr_lower = 0;
 961	char **lowerdirs = ofs->config.lowerdirs;
 962
 963	/*
 964	 * lowerdirs[0] holds the colon separated list that user provided
 965	 * with lowerdir mount option.
 966	 * lowerdirs[1..numlayer] hold the lowerdir paths that were added
 967	 * using the lowerdir+ and datadir+ mount options.
 968	 * For now, we do not allow mixing the legacy lowerdir mount option
 969	 * with the new lowerdir+ and datadir+ mount options.
 970	 */
 971	if (lowerdirs[0]) {
 972		seq_show_option(m, "lowerdir", lowerdirs[0]);
 973	} else {
 974		nr_lower = ofs->numlayer;
 975		nr_merged_lower = nr_lower - ofs->numdatalayer;
 976	}
 977	for (nr = 1; nr < nr_lower; nr++) {
 978		if (nr < nr_merged_lower)
 979			seq_show_option(m, "lowerdir+", lowerdirs[nr]);
 980		else
 981			seq_show_option(m, "datadir+", lowerdirs[nr]);
 982	}
 983	if (ofs->config.upperdir) {
 984		seq_show_option(m, "upperdir", ofs->config.upperdir);
 985		seq_show_option(m, "workdir", ofs->config.workdir);
 986	}
 987	if (ofs->config.default_permissions)
 988		seq_puts(m, ",default_permissions");
 989	if (ofs->config.redirect_mode != ovl_redirect_mode_def())
 990		seq_printf(m, ",redirect_dir=%s",
 991			   ovl_redirect_mode(&ofs->config));
 992	if (ofs->config.index != ovl_index_def)
 993		seq_printf(m, ",index=%s", ofs->config.index ? "on" : "off");
 994	if (ofs->config.uuid != ovl_uuid_def())
 995		seq_printf(m, ",uuid=%s", ovl_uuid_mode(&ofs->config));
 996	if (ofs->config.nfs_export != ovl_nfs_export_def)
 997		seq_printf(m, ",nfs_export=%s", ofs->config.nfs_export ?
 998						"on" : "off");
 999	if (ofs->config.xino != ovl_xino_def() && !ovl_same_fs(ofs))
1000		seq_printf(m, ",xino=%s", ovl_xino_mode(&ofs->config));
1001	if (ofs->config.metacopy != ovl_metacopy_def)
1002		seq_printf(m, ",metacopy=%s",
1003			   ofs->config.metacopy ? "on" : "off");
1004	if (ofs->config.ovl_volatile)
1005		seq_puts(m, ",volatile");
1006	if (ofs->config.userxattr)
1007		seq_puts(m, ",userxattr");
1008	if (ofs->config.verity_mode != ovl_verity_mode_def())
1009		seq_printf(m, ",verity=%s",
1010			   ovl_verity_mode(&ofs->config));
1011	return 0;
1012}