Linux Audio

Check our new training course

Loading...
v5.4
   1/*
   2 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
   3 * Licensed under the GPL
   4 *
   5 * Ported the filesystem routines to 2.5.
   6 * 2003-02-10 Petr Baudis <pasky@ucw.cz>
   7 */
   8
   9#include <linux/fs.h>
  10#include <linux/magic.h>
  11#include <linux/module.h>
  12#include <linux/mm.h>
  13#include <linux/pagemap.h>
  14#include <linux/statfs.h>
  15#include <linux/slab.h>
  16#include <linux/seq_file.h>
  17#include <linux/mount.h>
  18#include <linux/namei.h>
  19#include "hostfs.h"
  20#include <init.h>
  21#include <kern.h>
  22
  23struct hostfs_inode_info {
  24	int fd;
  25	fmode_t mode;
  26	struct inode vfs_inode;
  27	struct mutex open_mutex;
  28};
  29
  30static inline struct hostfs_inode_info *HOSTFS_I(struct inode *inode)
  31{
  32	return list_entry(inode, struct hostfs_inode_info, vfs_inode);
  33}
  34
  35#define FILE_HOSTFS_I(file) HOSTFS_I(file_inode(file))
  36
 
 
  37/* Changed in hostfs_args before the kernel starts running */
  38static char *root_ino = "";
  39static int append = 0;
  40
  41static const struct inode_operations hostfs_iops;
  42static const struct inode_operations hostfs_dir_iops;
  43static const struct inode_operations hostfs_link_iops;
  44
  45#ifndef MODULE
  46static int __init hostfs_args(char *options, int *add)
  47{
  48	char *ptr;
  49
  50	ptr = strchr(options, ',');
  51	if (ptr != NULL)
  52		*ptr++ = '\0';
  53	if (*options != '\0')
  54		root_ino = options;
  55
  56	options = ptr;
  57	while (options) {
  58		ptr = strchr(options, ',');
  59		if (ptr != NULL)
  60			*ptr++ = '\0';
  61		if (*options != '\0') {
  62			if (!strcmp(options, "append"))
  63				append = 1;
  64			else printf("hostfs_args - unsupported option - %s\n",
  65				    options);
  66		}
  67		options = ptr;
  68	}
  69	return 0;
  70}
  71
  72__uml_setup("hostfs=", hostfs_args,
  73"hostfs=<root dir>,<flags>,...\n"
  74"    This is used to set hostfs parameters.  The root directory argument\n"
  75"    is used to confine all hostfs mounts to within the specified directory\n"
  76"    tree on the host.  If this isn't specified, then a user inside UML can\n"
  77"    mount anything on the host that's accessible to the user that's running\n"
  78"    it.\n"
  79"    The only flag currently supported is 'append', which specifies that all\n"
  80"    files opened by hostfs will be opened in append mode.\n\n"
  81);
  82#endif
  83
  84static char *__dentry_name(struct dentry *dentry, char *name)
  85{
  86	char *p = dentry_path_raw(dentry, name, PATH_MAX);
  87	char *root;
  88	size_t len;
  89
  90	root = dentry->d_sb->s_fs_info;
  91	len = strlen(root);
  92	if (IS_ERR(p)) {
  93		__putname(name);
  94		return NULL;
  95	}
  96
  97	/*
  98	 * This function relies on the fact that dentry_path_raw() will place
  99	 * the path name at the end of the provided buffer.
 100	 */
 101	BUG_ON(p + strlen(p) + 1 != name + PATH_MAX);
 102
 103	strlcpy(name, root, PATH_MAX);
 104	if (len > p - name) {
 105		__putname(name);
 106		return NULL;
 107	}
 108
 109	if (p > name + len)
 110		strcpy(name + len, p);
 111
 112	return name;
 113}
 114
 115static char *dentry_name(struct dentry *dentry)
 116{
 117	char *name = __getname();
 118	if (!name)
 119		return NULL;
 120
 121	return __dentry_name(dentry, name);
 122}
 123
 124static char *inode_name(struct inode *ino)
 125{
 126	struct dentry *dentry;
 127	char *name;
 128
 129	dentry = d_find_alias(ino);
 130	if (!dentry)
 131		return NULL;
 132
 133	name = dentry_name(dentry);
 134
 135	dput(dentry);
 136
 137	return name;
 138}
 139
 140static char *follow_link(char *link)
 141{
 142	int len, n;
 143	char *name, *resolved, *end;
 
 144
 145	name = __getname();
 146	if (!name) {
 147		n = -ENOMEM;
 148		goto out_free;
 149	}
 150
 151	n = hostfs_do_readlink(link, name, PATH_MAX);
 152	if (n < 0)
 153		goto out_free;
 154	else if (n == PATH_MAX) {
 155		n = -E2BIG;
 156		goto out_free;
 157	}
 158
 159	if (*name == '/')
 160		return name;
 161
 162	end = strrchr(link, '/');
 163	if (end == NULL)
 164		return name;
 165
 166	*(end + 1) = '\0';
 167	len = strlen(link) + strlen(name) + 1;
 168
 169	resolved = kmalloc(len, GFP_KERNEL);
 170	if (resolved == NULL) {
 171		n = -ENOMEM;
 172		goto out_free;
 173	}
 174
 175	sprintf(resolved, "%s%s", link, name);
 176	__putname(name);
 177	kfree(link);
 178	return resolved;
 179
 180 out_free:
 181	__putname(name);
 182	return ERR_PTR(n);
 183}
 184
 185static struct inode *hostfs_iget(struct super_block *sb)
 186{
 187	struct inode *inode = new_inode(sb);
 188	if (!inode)
 189		return ERR_PTR(-ENOMEM);
 190	return inode;
 191}
 192
 193static int hostfs_statfs(struct dentry *dentry, struct kstatfs *sf)
 194{
 195	/*
 196	 * do_statfs uses struct statfs64 internally, but the linux kernel
 197	 * struct statfs still has 32-bit versions for most of these fields,
 198	 * so we convert them here
 199	 */
 200	int err;
 201	long long f_blocks;
 202	long long f_bfree;
 203	long long f_bavail;
 204	long long f_files;
 205	long long f_ffree;
 206
 207	err = do_statfs(dentry->d_sb->s_fs_info,
 208			&sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files,
 209			&f_ffree, &sf->f_fsid, sizeof(sf->f_fsid),
 210			&sf->f_namelen);
 211	if (err)
 212		return err;
 213	sf->f_blocks = f_blocks;
 214	sf->f_bfree = f_bfree;
 215	sf->f_bavail = f_bavail;
 216	sf->f_files = f_files;
 217	sf->f_ffree = f_ffree;
 218	sf->f_type = HOSTFS_SUPER_MAGIC;
 219	return 0;
 220}
 221
 222static struct inode *hostfs_alloc_inode(struct super_block *sb)
 223{
 224	struct hostfs_inode_info *hi;
 225
 226	hi = kmalloc(sizeof(*hi), GFP_KERNEL_ACCOUNT);
 227	if (hi == NULL)
 228		return NULL;
 229	hi->fd = -1;
 230	hi->mode = 0;
 231	inode_init_once(&hi->vfs_inode);
 232	mutex_init(&hi->open_mutex);
 233	return &hi->vfs_inode;
 234}
 235
 236static void hostfs_evict_inode(struct inode *inode)
 237{
 238	truncate_inode_pages_final(&inode->i_data);
 239	clear_inode(inode);
 240	if (HOSTFS_I(inode)->fd != -1) {
 241		close_file(&HOSTFS_I(inode)->fd);
 242		HOSTFS_I(inode)->fd = -1;
 243	}
 244}
 245
 246static void hostfs_free_inode(struct inode *inode)
 247{
 248	kfree(HOSTFS_I(inode));
 249}
 250
 251static int hostfs_show_options(struct seq_file *seq, struct dentry *root)
 252{
 253	const char *root_path = root->d_sb->s_fs_info;
 254	size_t offset = strlen(root_ino) + 1;
 255
 256	if (strlen(root_path) > offset)
 257		seq_show_option(seq, root_path + offset, NULL);
 258
 259	if (append)
 260		seq_puts(seq, ",append");
 261
 262	return 0;
 263}
 264
 265static const struct super_operations hostfs_sbops = {
 266	.alloc_inode	= hostfs_alloc_inode,
 267	.free_inode	= hostfs_free_inode,
 268	.evict_inode	= hostfs_evict_inode,
 269	.statfs		= hostfs_statfs,
 270	.show_options	= hostfs_show_options,
 271};
 272
 273static int hostfs_readdir(struct file *file, struct dir_context *ctx)
 274{
 275	void *dir;
 276	char *name;
 277	unsigned long long next, ino;
 278	int error, len;
 279	unsigned int type;
 280
 281	name = dentry_name(file->f_path.dentry);
 282	if (name == NULL)
 283		return -ENOMEM;
 284	dir = open_dir(name, &error);
 285	__putname(name);
 286	if (dir == NULL)
 287		return -error;
 288	next = ctx->pos;
 289	seek_dir(dir, next);
 290	while ((name = read_dir(dir, &next, &ino, &len, &type)) != NULL) {
 291		if (!dir_emit(ctx, name, len, ino, type))
 292			break;
 293		ctx->pos = next;
 294	}
 295	close_dir(dir);
 296	return 0;
 297}
 298
 299static int hostfs_open(struct inode *ino, struct file *file)
 300{
 301	char *name;
 302	fmode_t mode;
 303	int err;
 304	int r, w, fd;
 305
 306	mode = file->f_mode & (FMODE_READ | FMODE_WRITE);
 307	if ((mode & HOSTFS_I(ino)->mode) == mode)
 308		return 0;
 309
 310	mode |= HOSTFS_I(ino)->mode;
 311
 312retry:
 313	r = w = 0;
 314
 315	if (mode & FMODE_READ)
 316		r = 1;
 317	if (mode & FMODE_WRITE)
 318		r = w = 1;
 319
 320	name = dentry_name(file->f_path.dentry);
 321	if (name == NULL)
 322		return -ENOMEM;
 323
 324	fd = open_file(name, r, w, append);
 325	__putname(name);
 326	if (fd < 0)
 327		return fd;
 328
 329	mutex_lock(&HOSTFS_I(ino)->open_mutex);
 330	/* somebody else had handled it first? */
 331	if ((mode & HOSTFS_I(ino)->mode) == mode) {
 332		mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 333		close_file(&fd);
 334		return 0;
 335	}
 336	if ((mode | HOSTFS_I(ino)->mode) != mode) {
 337		mode |= HOSTFS_I(ino)->mode;
 338		mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 339		close_file(&fd);
 340		goto retry;
 341	}
 342	if (HOSTFS_I(ino)->fd == -1) {
 343		HOSTFS_I(ino)->fd = fd;
 344	} else {
 345		err = replace_file(fd, HOSTFS_I(ino)->fd);
 346		close_file(&fd);
 347		if (err < 0) {
 348			mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 349			return err;
 350		}
 351	}
 352	HOSTFS_I(ino)->mode = mode;
 353	mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 354
 355	return 0;
 356}
 357
 358static int hostfs_file_release(struct inode *inode, struct file *file)
 359{
 360	filemap_write_and_wait(inode->i_mapping);
 361
 362	return 0;
 363}
 364
 365static int hostfs_fsync(struct file *file, loff_t start, loff_t end,
 366			int datasync)
 367{
 368	struct inode *inode = file->f_mapping->host;
 369	int ret;
 370
 371	ret = file_write_and_wait_range(file, start, end);
 372	if (ret)
 373		return ret;
 374
 375	inode_lock(inode);
 376	ret = fsync_file(HOSTFS_I(inode)->fd, datasync);
 377	inode_unlock(inode);
 378
 379	return ret;
 380}
 381
 382static const struct file_operations hostfs_file_fops = {
 383	.llseek		= generic_file_llseek,
 384	.splice_read	= generic_file_splice_read,
 385	.read_iter	= generic_file_read_iter,
 386	.write_iter	= generic_file_write_iter,
 387	.mmap		= generic_file_mmap,
 388	.open		= hostfs_open,
 389	.release	= hostfs_file_release,
 390	.fsync		= hostfs_fsync,
 391};
 392
 393static const struct file_operations hostfs_dir_fops = {
 394	.llseek		= generic_file_llseek,
 395	.iterate_shared	= hostfs_readdir,
 396	.read		= generic_read_dir,
 397	.open		= hostfs_open,
 398	.fsync		= hostfs_fsync,
 399};
 400
 401static int hostfs_writepage(struct page *page, struct writeback_control *wbc)
 402{
 403	struct address_space *mapping = page->mapping;
 404	struct inode *inode = mapping->host;
 405	char *buffer;
 406	loff_t base = page_offset(page);
 407	int count = PAGE_SIZE;
 408	int end_index = inode->i_size >> PAGE_SHIFT;
 409	int err;
 410
 411	if (page->index >= end_index)
 412		count = inode->i_size & (PAGE_SIZE-1);
 413
 414	buffer = kmap(page);
 415
 416	err = write_file(HOSTFS_I(inode)->fd, &base, buffer, count);
 417	if (err != count) {
 418		ClearPageUptodate(page);
 419		goto out;
 420	}
 421
 422	if (base > inode->i_size)
 423		inode->i_size = base;
 424
 425	if (PageError(page))
 426		ClearPageError(page);
 427	err = 0;
 428
 429 out:
 430	kunmap(page);
 431
 432	unlock_page(page);
 433	return err;
 434}
 435
 436static int hostfs_readpage(struct file *file, struct page *page)
 437{
 438	char *buffer;
 439	loff_t start = page_offset(page);
 440	int bytes_read, ret = 0;
 441
 442	buffer = kmap(page);
 443	bytes_read = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer,
 444			PAGE_SIZE);
 445	if (bytes_read < 0) {
 446		ClearPageUptodate(page);
 447		SetPageError(page);
 448		ret = bytes_read;
 449		goto out;
 450	}
 451
 452	memset(buffer + bytes_read, 0, PAGE_SIZE - bytes_read);
 453
 454	ClearPageError(page);
 455	SetPageUptodate(page);
 456
 457 out:
 458	flush_dcache_page(page);
 459	kunmap(page);
 460	unlock_page(page);
 461	return ret;
 462}
 463
 464static int hostfs_write_begin(struct file *file, struct address_space *mapping,
 465			      loff_t pos, unsigned len, unsigned flags,
 466			      struct page **pagep, void **fsdata)
 467{
 468	pgoff_t index = pos >> PAGE_SHIFT;
 469
 470	*pagep = grab_cache_page_write_begin(mapping, index, flags);
 471	if (!*pagep)
 472		return -ENOMEM;
 473	return 0;
 474}
 475
 476static int hostfs_write_end(struct file *file, struct address_space *mapping,
 477			    loff_t pos, unsigned len, unsigned copied,
 478			    struct page *page, void *fsdata)
 479{
 480	struct inode *inode = mapping->host;
 481	void *buffer;
 482	unsigned from = pos & (PAGE_SIZE - 1);
 483	int err;
 484
 485	buffer = kmap(page);
 486	err = write_file(FILE_HOSTFS_I(file)->fd, &pos, buffer + from, copied);
 487	kunmap(page);
 488
 489	if (!PageUptodate(page) && err == PAGE_SIZE)
 490		SetPageUptodate(page);
 491
 492	/*
 493	 * If err > 0, write_file has added err to pos, so we are comparing
 494	 * i_size against the last byte written.
 495	 */
 496	if (err > 0 && (pos > inode->i_size))
 497		inode->i_size = pos;
 498	unlock_page(page);
 499	put_page(page);
 500
 501	return err;
 502}
 503
 504static const struct address_space_operations hostfs_aops = {
 505	.writepage 	= hostfs_writepage,
 506	.readpage	= hostfs_readpage,
 507	.set_page_dirty = __set_page_dirty_nobuffers,
 508	.write_begin	= hostfs_write_begin,
 509	.write_end	= hostfs_write_end,
 510};
 511
 512static int read_name(struct inode *ino, char *name)
 513{
 514	dev_t rdev;
 515	struct hostfs_stat st;
 516	int err = stat_file(name, &st, -1);
 517	if (err)
 518		return err;
 519
 520	/* Reencode maj and min with the kernel encoding.*/
 521	rdev = MKDEV(st.maj, st.min);
 522
 523	switch (st.mode & S_IFMT) {
 524	case S_IFLNK:
 525		ino->i_op = &hostfs_link_iops;
 526		break;
 527	case S_IFDIR:
 528		ino->i_op = &hostfs_dir_iops;
 529		ino->i_fop = &hostfs_dir_fops;
 530		break;
 531	case S_IFCHR:
 532	case S_IFBLK:
 533	case S_IFIFO:
 534	case S_IFSOCK:
 535		init_special_inode(ino, st.mode & S_IFMT, rdev);
 536		ino->i_op = &hostfs_iops;
 537		break;
 538	case S_IFREG:
 539		ino->i_op = &hostfs_iops;
 540		ino->i_fop = &hostfs_file_fops;
 541		ino->i_mapping->a_ops = &hostfs_aops;
 542		break;
 543	default:
 544		return -EIO;
 545	}
 546
 547	ino->i_ino = st.ino;
 548	ino->i_mode = st.mode;
 549	set_nlink(ino, st.nlink);
 550	i_uid_write(ino, st.uid);
 551	i_gid_write(ino, st.gid);
 552	ino->i_atime = timespec_to_timespec64(st.atime);
 553	ino->i_mtime = timespec_to_timespec64(st.mtime);
 554	ino->i_ctime = timespec_to_timespec64(st.ctime);
 555	ino->i_size = st.size;
 556	ino->i_blocks = st.blocks;
 557	return 0;
 558}
 559
 560static int hostfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 561			 bool excl)
 562{
 563	struct inode *inode;
 564	char *name;
 565	int error, fd;
 566
 567	inode = hostfs_iget(dir->i_sb);
 568	if (IS_ERR(inode)) {
 569		error = PTR_ERR(inode);
 570		goto out;
 571	}
 572
 573	error = -ENOMEM;
 574	name = dentry_name(dentry);
 575	if (name == NULL)
 576		goto out_put;
 577
 578	fd = file_create(name, mode & 0777);
 579	if (fd < 0)
 580		error = fd;
 581	else
 582		error = read_name(inode, name);
 583
 584	__putname(name);
 585	if (error)
 586		goto out_put;
 587
 588	HOSTFS_I(inode)->fd = fd;
 589	HOSTFS_I(inode)->mode = FMODE_READ | FMODE_WRITE;
 590	d_instantiate(dentry, inode);
 591	return 0;
 592
 593 out_put:
 594	iput(inode);
 595 out:
 596	return error;
 597}
 598
 599static struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry,
 600				    unsigned int flags)
 601{
 602	struct inode *inode;
 603	char *name;
 604	int err;
 605
 606	inode = hostfs_iget(ino->i_sb);
 607	if (IS_ERR(inode))
 608		goto out;
 609
 610	err = -ENOMEM;
 611	name = dentry_name(dentry);
 612	if (name) {
 613		err = read_name(inode, name);
 614		__putname(name);
 615	}
 616	if (err) {
 617		iput(inode);
 618		inode = (err == -ENOENT) ? NULL : ERR_PTR(err);
 619	}
 620 out:
 621	return d_splice_alias(inode, dentry);
 622}
 623
 624static int hostfs_link(struct dentry *to, struct inode *ino,
 625		       struct dentry *from)
 626{
 627	char *from_name, *to_name;
 628	int err;
 629
 630	if ((from_name = dentry_name(from)) == NULL)
 631		return -ENOMEM;
 632	to_name = dentry_name(to);
 633	if (to_name == NULL) {
 634		__putname(from_name);
 635		return -ENOMEM;
 636	}
 637	err = link_file(to_name, from_name);
 638	__putname(from_name);
 639	__putname(to_name);
 640	return err;
 641}
 642
 643static int hostfs_unlink(struct inode *ino, struct dentry *dentry)
 644{
 645	char *file;
 646	int err;
 647
 648	if (append)
 649		return -EPERM;
 650
 651	if ((file = dentry_name(dentry)) == NULL)
 652		return -ENOMEM;
 653
 654	err = unlink_file(file);
 655	__putname(file);
 656	return err;
 657}
 658
 659static int hostfs_symlink(struct inode *ino, struct dentry *dentry,
 660			  const char *to)
 661{
 662	char *file;
 663	int err;
 664
 665	if ((file = dentry_name(dentry)) == NULL)
 666		return -ENOMEM;
 667	err = make_symlink(file, to);
 668	__putname(file);
 669	return err;
 670}
 671
 672static int hostfs_mkdir(struct inode *ino, struct dentry *dentry, umode_t mode)
 
 673{
 674	char *file;
 675	int err;
 676
 677	if ((file = dentry_name(dentry)) == NULL)
 678		return -ENOMEM;
 679	err = do_mkdir(file, mode);
 680	__putname(file);
 681	return err;
 682}
 683
 684static int hostfs_rmdir(struct inode *ino, struct dentry *dentry)
 685{
 686	char *file;
 687	int err;
 688
 689	if ((file = dentry_name(dentry)) == NULL)
 690		return -ENOMEM;
 691	err = hostfs_do_rmdir(file);
 692	__putname(file);
 693	return err;
 694}
 695
 696static int hostfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
 
 697{
 698	struct inode *inode;
 699	char *name;
 700	int err;
 701
 702	inode = hostfs_iget(dir->i_sb);
 703	if (IS_ERR(inode)) {
 704		err = PTR_ERR(inode);
 705		goto out;
 706	}
 707
 708	err = -ENOMEM;
 709	name = dentry_name(dentry);
 710	if (name == NULL)
 711		goto out_put;
 712
 713	init_special_inode(inode, mode, dev);
 714	err = do_mknod(name, mode, MAJOR(dev), MINOR(dev));
 715	if (err)
 716		goto out_free;
 717
 718	err = read_name(inode, name);
 719	__putname(name);
 720	if (err)
 721		goto out_put;
 722
 723	d_instantiate(dentry, inode);
 724	return 0;
 725
 726 out_free:
 727	__putname(name);
 728 out_put:
 729	iput(inode);
 730 out:
 731	return err;
 732}
 733
 734static int hostfs_rename2(struct inode *old_dir, struct dentry *old_dentry,
 
 735			  struct inode *new_dir, struct dentry *new_dentry,
 736			  unsigned int flags)
 737{
 738	char *old_name, *new_name;
 739	int err;
 740
 741	if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
 742		return -EINVAL;
 743
 744	old_name = dentry_name(old_dentry);
 745	if (old_name == NULL)
 746		return -ENOMEM;
 747	new_name = dentry_name(new_dentry);
 748	if (new_name == NULL) {
 749		__putname(old_name);
 750		return -ENOMEM;
 751	}
 752	if (!flags)
 753		err = rename_file(old_name, new_name);
 754	else
 755		err = rename2_file(old_name, new_name, flags);
 756
 757	__putname(old_name);
 758	__putname(new_name);
 759	return err;
 760}
 761
 762static int hostfs_permission(struct inode *ino, int desired)
 
 763{
 764	char *name;
 765	int r = 0, w = 0, x = 0, err;
 766
 767	if (desired & MAY_NOT_BLOCK)
 768		return -ECHILD;
 769
 770	if (desired & MAY_READ) r = 1;
 771	if (desired & MAY_WRITE) w = 1;
 772	if (desired & MAY_EXEC) x = 1;
 773	name = inode_name(ino);
 774	if (name == NULL)
 775		return -ENOMEM;
 776
 777	if (S_ISCHR(ino->i_mode) || S_ISBLK(ino->i_mode) ||
 778	    S_ISFIFO(ino->i_mode) || S_ISSOCK(ino->i_mode))
 779		err = 0;
 780	else
 781		err = access_file(name, r, w, x);
 782	__putname(name);
 783	if (!err)
 784		err = generic_permission(ino, desired);
 785	return err;
 786}
 787
 788static int hostfs_setattr(struct dentry *dentry, struct iattr *attr)
 
 789{
 790	struct inode *inode = d_inode(dentry);
 791	struct hostfs_iattr attrs;
 792	char *name;
 793	int err;
 794
 795	int fd = HOSTFS_I(inode)->fd;
 796
 797	err = setattr_prepare(dentry, attr);
 798	if (err)
 799		return err;
 800
 801	if (append)
 802		attr->ia_valid &= ~ATTR_SIZE;
 803
 804	attrs.ia_valid = 0;
 805	if (attr->ia_valid & ATTR_MODE) {
 806		attrs.ia_valid |= HOSTFS_ATTR_MODE;
 807		attrs.ia_mode = attr->ia_mode;
 808	}
 809	if (attr->ia_valid & ATTR_UID) {
 810		attrs.ia_valid |= HOSTFS_ATTR_UID;
 811		attrs.ia_uid = from_kuid(&init_user_ns, attr->ia_uid);
 812	}
 813	if (attr->ia_valid & ATTR_GID) {
 814		attrs.ia_valid |= HOSTFS_ATTR_GID;
 815		attrs.ia_gid = from_kgid(&init_user_ns, attr->ia_gid);
 816	}
 817	if (attr->ia_valid & ATTR_SIZE) {
 818		attrs.ia_valid |= HOSTFS_ATTR_SIZE;
 819		attrs.ia_size = attr->ia_size;
 820	}
 821	if (attr->ia_valid & ATTR_ATIME) {
 822		attrs.ia_valid |= HOSTFS_ATTR_ATIME;
 823		attrs.ia_atime = timespec64_to_timespec(attr->ia_atime);
 
 824	}
 825	if (attr->ia_valid & ATTR_MTIME) {
 826		attrs.ia_valid |= HOSTFS_ATTR_MTIME;
 827		attrs.ia_mtime = timespec64_to_timespec(attr->ia_mtime);
 
 828	}
 829	if (attr->ia_valid & ATTR_CTIME) {
 830		attrs.ia_valid |= HOSTFS_ATTR_CTIME;
 831		attrs.ia_ctime = timespec64_to_timespec(attr->ia_ctime);
 
 832	}
 833	if (attr->ia_valid & ATTR_ATIME_SET) {
 834		attrs.ia_valid |= HOSTFS_ATTR_ATIME_SET;
 835	}
 836	if (attr->ia_valid & ATTR_MTIME_SET) {
 837		attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET;
 838	}
 839	name = dentry_name(dentry);
 840	if (name == NULL)
 841		return -ENOMEM;
 842	err = set_attr(name, &attrs, fd);
 843	__putname(name);
 844	if (err)
 845		return err;
 846
 847	if ((attr->ia_valid & ATTR_SIZE) &&
 848	    attr->ia_size != i_size_read(inode))
 849		truncate_setsize(inode, attr->ia_size);
 850
 851	setattr_copy(inode, attr);
 852	mark_inode_dirty(inode);
 853	return 0;
 854}
 855
 856static const struct inode_operations hostfs_iops = {
 857	.permission	= hostfs_permission,
 858	.setattr	= hostfs_setattr,
 859};
 860
 861static const struct inode_operations hostfs_dir_iops = {
 862	.create		= hostfs_create,
 863	.lookup		= hostfs_lookup,
 864	.link		= hostfs_link,
 865	.unlink		= hostfs_unlink,
 866	.symlink	= hostfs_symlink,
 867	.mkdir		= hostfs_mkdir,
 868	.rmdir		= hostfs_rmdir,
 869	.mknod		= hostfs_mknod,
 870	.rename		= hostfs_rename2,
 871	.permission	= hostfs_permission,
 872	.setattr	= hostfs_setattr,
 873};
 874
 875static const char *hostfs_get_link(struct dentry *dentry,
 876				   struct inode *inode,
 877				   struct delayed_call *done)
 878{
 879	char *link;
 880	if (!dentry)
 881		return ERR_PTR(-ECHILD);
 882	link = kmalloc(PATH_MAX, GFP_KERNEL);
 883	if (link) {
 884		char *path = dentry_name(dentry);
 885		int err = -ENOMEM;
 886		if (path) {
 887			err = hostfs_do_readlink(path, link, PATH_MAX);
 888			if (err == PATH_MAX)
 889				err = -E2BIG;
 890			__putname(path);
 891		}
 892		if (err < 0) {
 893			kfree(link);
 894			return ERR_PTR(err);
 895		}
 896	} else {
 897		return ERR_PTR(-ENOMEM);
 898	}
 899
 900	set_delayed_call(done, kfree_link, link);
 901	return link;
 902}
 903
 904static const struct inode_operations hostfs_link_iops = {
 905	.get_link	= hostfs_get_link,
 906};
 907
 908static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent)
 909{
 910	struct inode *root_inode;
 911	char *host_root_path, *req_root = d;
 912	int err;
 913
 914	sb->s_blocksize = 1024;
 915	sb->s_blocksize_bits = 10;
 916	sb->s_magic = HOSTFS_SUPER_MAGIC;
 917	sb->s_op = &hostfs_sbops;
 918	sb->s_d_op = &simple_dentry_operations;
 919	sb->s_maxbytes = MAX_LFS_FILESIZE;
 920
 921	/* NULL is printed as <NULL> by sprintf: avoid that. */
 922	if (req_root == NULL)
 923		req_root = "";
 924
 925	err = -ENOMEM;
 926	sb->s_fs_info = host_root_path =
 927		kmalloc(strlen(root_ino) + strlen(req_root) + 2, GFP_KERNEL);
 928	if (host_root_path == NULL)
 929		goto out;
 930
 931	sprintf(host_root_path, "%s/%s", root_ino, req_root);
 932
 933	root_inode = new_inode(sb);
 934	if (!root_inode)
 935		goto out;
 936
 937	err = read_name(root_inode, host_root_path);
 938	if (err)
 939		goto out_put;
 940
 941	if (S_ISLNK(root_inode->i_mode)) {
 942		char *name = follow_link(host_root_path);
 943		if (IS_ERR(name)) {
 944			err = PTR_ERR(name);
 945			goto out_put;
 946		}
 947		err = read_name(root_inode, name);
 948		kfree(name);
 949		if (err)
 950			goto out_put;
 951	}
 952
 953	err = -ENOMEM;
 954	sb->s_root = d_make_root(root_inode);
 955	if (sb->s_root == NULL)
 956		goto out;
 957
 958	return 0;
 959
 960out_put:
 961	iput(root_inode);
 962out:
 963	return err;
 964}
 965
 966static struct dentry *hostfs_read_sb(struct file_system_type *type,
 967			  int flags, const char *dev_name,
 968			  void *data)
 969{
 970	return mount_nodev(type, flags, data, hostfs_fill_sb_common);
 971}
 972
 973static void hostfs_kill_sb(struct super_block *s)
 974{
 975	kill_anon_super(s);
 976	kfree(s->s_fs_info);
 977}
 978
 979static struct file_system_type hostfs_type = {
 980	.owner 		= THIS_MODULE,
 981	.name 		= "hostfs",
 982	.mount	 	= hostfs_read_sb,
 983	.kill_sb	= hostfs_kill_sb,
 984	.fs_flags 	= 0,
 985};
 986MODULE_ALIAS_FS("hostfs");
 987
 988static int __init init_hostfs(void)
 989{
 
 
 
 990	return register_filesystem(&hostfs_type);
 991}
 992
 993static void __exit exit_hostfs(void)
 994{
 995	unregister_filesystem(&hostfs_type);
 
 996}
 997
 998module_init(init_hostfs)
 999module_exit(exit_hostfs)
1000MODULE_LICENSE("GPL");
v5.14.15
   1/*
   2 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
   3 * Licensed under the GPL
   4 *
   5 * Ported the filesystem routines to 2.5.
   6 * 2003-02-10 Petr Baudis <pasky@ucw.cz>
   7 */
   8
   9#include <linux/fs.h>
  10#include <linux/magic.h>
  11#include <linux/module.h>
  12#include <linux/mm.h>
  13#include <linux/pagemap.h>
  14#include <linux/statfs.h>
  15#include <linux/slab.h>
  16#include <linux/seq_file.h>
  17#include <linux/mount.h>
  18#include <linux/namei.h>
  19#include "hostfs.h"
  20#include <init.h>
  21#include <kern.h>
  22
  23struct hostfs_inode_info {
  24	int fd;
  25	fmode_t mode;
  26	struct inode vfs_inode;
  27	struct mutex open_mutex;
  28};
  29
  30static inline struct hostfs_inode_info *HOSTFS_I(struct inode *inode)
  31{
  32	return list_entry(inode, struct hostfs_inode_info, vfs_inode);
  33}
  34
  35#define FILE_HOSTFS_I(file) HOSTFS_I(file_inode(file))
  36
  37static struct kmem_cache *hostfs_inode_cache;
  38
  39/* Changed in hostfs_args before the kernel starts running */
  40static char *root_ino = "";
  41static int append = 0;
  42
  43static const struct inode_operations hostfs_iops;
  44static const struct inode_operations hostfs_dir_iops;
  45static const struct inode_operations hostfs_link_iops;
  46
  47#ifndef MODULE
  48static int __init hostfs_args(char *options, int *add)
  49{
  50	char *ptr;
  51
  52	ptr = strchr(options, ',');
  53	if (ptr != NULL)
  54		*ptr++ = '\0';
  55	if (*options != '\0')
  56		root_ino = options;
  57
  58	options = ptr;
  59	while (options) {
  60		ptr = strchr(options, ',');
  61		if (ptr != NULL)
  62			*ptr++ = '\0';
  63		if (*options != '\0') {
  64			if (!strcmp(options, "append"))
  65				append = 1;
  66			else printf("hostfs_args - unsupported option - %s\n",
  67				    options);
  68		}
  69		options = ptr;
  70	}
  71	return 0;
  72}
  73
  74__uml_setup("hostfs=", hostfs_args,
  75"hostfs=<root dir>,<flags>,...\n"
  76"    This is used to set hostfs parameters.  The root directory argument\n"
  77"    is used to confine all hostfs mounts to within the specified directory\n"
  78"    tree on the host.  If this isn't specified, then a user inside UML can\n"
  79"    mount anything on the host that's accessible to the user that's running\n"
  80"    it.\n"
  81"    The only flag currently supported is 'append', which specifies that all\n"
  82"    files opened by hostfs will be opened in append mode.\n\n"
  83);
  84#endif
  85
  86static char *__dentry_name(struct dentry *dentry, char *name)
  87{
  88	char *p = dentry_path_raw(dentry, name, PATH_MAX);
  89	char *root;
  90	size_t len;
  91
  92	root = dentry->d_sb->s_fs_info;
  93	len = strlen(root);
  94	if (IS_ERR(p)) {
  95		__putname(name);
  96		return NULL;
  97	}
  98
  99	/*
 100	 * This function relies on the fact that dentry_path_raw() will place
 101	 * the path name at the end of the provided buffer.
 102	 */
 103	BUG_ON(p + strlen(p) + 1 != name + PATH_MAX);
 104
 105	strlcpy(name, root, PATH_MAX);
 106	if (len > p - name) {
 107		__putname(name);
 108		return NULL;
 109	}
 110
 111	if (p > name + len)
 112		strcpy(name + len, p);
 113
 114	return name;
 115}
 116
 117static char *dentry_name(struct dentry *dentry)
 118{
 119	char *name = __getname();
 120	if (!name)
 121		return NULL;
 122
 123	return __dentry_name(dentry, name);
 124}
 125
 126static char *inode_name(struct inode *ino)
 127{
 128	struct dentry *dentry;
 129	char *name;
 130
 131	dentry = d_find_alias(ino);
 132	if (!dentry)
 133		return NULL;
 134
 135	name = dentry_name(dentry);
 136
 137	dput(dentry);
 138
 139	return name;
 140}
 141
 142static char *follow_link(char *link)
 143{
 
 144	char *name, *resolved, *end;
 145	int n;
 146
 147	name = kmalloc(PATH_MAX, GFP_KERNEL);
 148	if (!name) {
 149		n = -ENOMEM;
 150		goto out_free;
 151	}
 152
 153	n = hostfs_do_readlink(link, name, PATH_MAX);
 154	if (n < 0)
 155		goto out_free;
 156	else if (n == PATH_MAX) {
 157		n = -E2BIG;
 158		goto out_free;
 159	}
 160
 161	if (*name == '/')
 162		return name;
 163
 164	end = strrchr(link, '/');
 165	if (end == NULL)
 166		return name;
 167
 168	*(end + 1) = '\0';
 
 169
 170	resolved = kasprintf(GFP_KERNEL, "%s%s", link, name);
 171	if (resolved == NULL) {
 172		n = -ENOMEM;
 173		goto out_free;
 174	}
 175
 176	kfree(name);
 
 
 177	return resolved;
 178
 179 out_free:
 180	kfree(name);
 181	return ERR_PTR(n);
 182}
 183
 184static struct inode *hostfs_iget(struct super_block *sb)
 185{
 186	struct inode *inode = new_inode(sb);
 187	if (!inode)
 188		return ERR_PTR(-ENOMEM);
 189	return inode;
 190}
 191
 192static int hostfs_statfs(struct dentry *dentry, struct kstatfs *sf)
 193{
 194	/*
 195	 * do_statfs uses struct statfs64 internally, but the linux kernel
 196	 * struct statfs still has 32-bit versions for most of these fields,
 197	 * so we convert them here
 198	 */
 199	int err;
 200	long long f_blocks;
 201	long long f_bfree;
 202	long long f_bavail;
 203	long long f_files;
 204	long long f_ffree;
 205
 206	err = do_statfs(dentry->d_sb->s_fs_info,
 207			&sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files,
 208			&f_ffree, &sf->f_fsid, sizeof(sf->f_fsid),
 209			&sf->f_namelen);
 210	if (err)
 211		return err;
 212	sf->f_blocks = f_blocks;
 213	sf->f_bfree = f_bfree;
 214	sf->f_bavail = f_bavail;
 215	sf->f_files = f_files;
 216	sf->f_ffree = f_ffree;
 217	sf->f_type = HOSTFS_SUPER_MAGIC;
 218	return 0;
 219}
 220
 221static struct inode *hostfs_alloc_inode(struct super_block *sb)
 222{
 223	struct hostfs_inode_info *hi;
 224
 225	hi = kmem_cache_alloc(hostfs_inode_cache, GFP_KERNEL_ACCOUNT);
 226	if (hi == NULL)
 227		return NULL;
 228	hi->fd = -1;
 229	hi->mode = 0;
 230	inode_init_once(&hi->vfs_inode);
 231	mutex_init(&hi->open_mutex);
 232	return &hi->vfs_inode;
 233}
 234
 235static void hostfs_evict_inode(struct inode *inode)
 236{
 237	truncate_inode_pages_final(&inode->i_data);
 238	clear_inode(inode);
 239	if (HOSTFS_I(inode)->fd != -1) {
 240		close_file(&HOSTFS_I(inode)->fd);
 241		HOSTFS_I(inode)->fd = -1;
 242	}
 243}
 244
 245static void hostfs_free_inode(struct inode *inode)
 246{
 247	kmem_cache_free(hostfs_inode_cache, HOSTFS_I(inode));
 248}
 249
 250static int hostfs_show_options(struct seq_file *seq, struct dentry *root)
 251{
 252	const char *root_path = root->d_sb->s_fs_info;
 253	size_t offset = strlen(root_ino) + 1;
 254
 255	if (strlen(root_path) > offset)
 256		seq_show_option(seq, root_path + offset, NULL);
 257
 258	if (append)
 259		seq_puts(seq, ",append");
 260
 261	return 0;
 262}
 263
 264static const struct super_operations hostfs_sbops = {
 265	.alloc_inode	= hostfs_alloc_inode,
 266	.free_inode	= hostfs_free_inode,
 267	.evict_inode	= hostfs_evict_inode,
 268	.statfs		= hostfs_statfs,
 269	.show_options	= hostfs_show_options,
 270};
 271
 272static int hostfs_readdir(struct file *file, struct dir_context *ctx)
 273{
 274	void *dir;
 275	char *name;
 276	unsigned long long next, ino;
 277	int error, len;
 278	unsigned int type;
 279
 280	name = dentry_name(file->f_path.dentry);
 281	if (name == NULL)
 282		return -ENOMEM;
 283	dir = open_dir(name, &error);
 284	__putname(name);
 285	if (dir == NULL)
 286		return -error;
 287	next = ctx->pos;
 288	seek_dir(dir, next);
 289	while ((name = read_dir(dir, &next, &ino, &len, &type)) != NULL) {
 290		if (!dir_emit(ctx, name, len, ino, type))
 291			break;
 292		ctx->pos = next;
 293	}
 294	close_dir(dir);
 295	return 0;
 296}
 297
 298static int hostfs_open(struct inode *ino, struct file *file)
 299{
 300	char *name;
 301	fmode_t mode;
 302	int err;
 303	int r, w, fd;
 304
 305	mode = file->f_mode & (FMODE_READ | FMODE_WRITE);
 306	if ((mode & HOSTFS_I(ino)->mode) == mode)
 307		return 0;
 308
 309	mode |= HOSTFS_I(ino)->mode;
 310
 311retry:
 312	r = w = 0;
 313
 314	if (mode & FMODE_READ)
 315		r = 1;
 316	if (mode & FMODE_WRITE)
 317		r = w = 1;
 318
 319	name = dentry_name(file_dentry(file));
 320	if (name == NULL)
 321		return -ENOMEM;
 322
 323	fd = open_file(name, r, w, append);
 324	__putname(name);
 325	if (fd < 0)
 326		return fd;
 327
 328	mutex_lock(&HOSTFS_I(ino)->open_mutex);
 329	/* somebody else had handled it first? */
 330	if ((mode & HOSTFS_I(ino)->mode) == mode) {
 331		mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 332		close_file(&fd);
 333		return 0;
 334	}
 335	if ((mode | HOSTFS_I(ino)->mode) != mode) {
 336		mode |= HOSTFS_I(ino)->mode;
 337		mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 338		close_file(&fd);
 339		goto retry;
 340	}
 341	if (HOSTFS_I(ino)->fd == -1) {
 342		HOSTFS_I(ino)->fd = fd;
 343	} else {
 344		err = replace_file(fd, HOSTFS_I(ino)->fd);
 345		close_file(&fd);
 346		if (err < 0) {
 347			mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 348			return err;
 349		}
 350	}
 351	HOSTFS_I(ino)->mode = mode;
 352	mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 353
 354	return 0;
 355}
 356
 357static int hostfs_file_release(struct inode *inode, struct file *file)
 358{
 359	filemap_write_and_wait(inode->i_mapping);
 360
 361	return 0;
 362}
 363
 364static int hostfs_fsync(struct file *file, loff_t start, loff_t end,
 365			int datasync)
 366{
 367	struct inode *inode = file->f_mapping->host;
 368	int ret;
 369
 370	ret = file_write_and_wait_range(file, start, end);
 371	if (ret)
 372		return ret;
 373
 374	inode_lock(inode);
 375	ret = fsync_file(HOSTFS_I(inode)->fd, datasync);
 376	inode_unlock(inode);
 377
 378	return ret;
 379}
 380
 381static const struct file_operations hostfs_file_fops = {
 382	.llseek		= generic_file_llseek,
 383	.splice_read	= generic_file_splice_read,
 384	.read_iter	= generic_file_read_iter,
 385	.write_iter	= generic_file_write_iter,
 386	.mmap		= generic_file_mmap,
 387	.open		= hostfs_open,
 388	.release	= hostfs_file_release,
 389	.fsync		= hostfs_fsync,
 390};
 391
 392static const struct file_operations hostfs_dir_fops = {
 393	.llseek		= generic_file_llseek,
 394	.iterate_shared	= hostfs_readdir,
 395	.read		= generic_read_dir,
 396	.open		= hostfs_open,
 397	.fsync		= hostfs_fsync,
 398};
 399
 400static int hostfs_writepage(struct page *page, struct writeback_control *wbc)
 401{
 402	struct address_space *mapping = page->mapping;
 403	struct inode *inode = mapping->host;
 404	char *buffer;
 405	loff_t base = page_offset(page);
 406	int count = PAGE_SIZE;
 407	int end_index = inode->i_size >> PAGE_SHIFT;
 408	int err;
 409
 410	if (page->index >= end_index)
 411		count = inode->i_size & (PAGE_SIZE-1);
 412
 413	buffer = kmap(page);
 414
 415	err = write_file(HOSTFS_I(inode)->fd, &base, buffer, count);
 416	if (err != count) {
 417		ClearPageUptodate(page);
 418		goto out;
 419	}
 420
 421	if (base > inode->i_size)
 422		inode->i_size = base;
 423
 424	if (PageError(page))
 425		ClearPageError(page);
 426	err = 0;
 427
 428 out:
 429	kunmap(page);
 430
 431	unlock_page(page);
 432	return err;
 433}
 434
 435static int hostfs_readpage(struct file *file, struct page *page)
 436{
 437	char *buffer;
 438	loff_t start = page_offset(page);
 439	int bytes_read, ret = 0;
 440
 441	buffer = kmap(page);
 442	bytes_read = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer,
 443			PAGE_SIZE);
 444	if (bytes_read < 0) {
 445		ClearPageUptodate(page);
 446		SetPageError(page);
 447		ret = bytes_read;
 448		goto out;
 449	}
 450
 451	memset(buffer + bytes_read, 0, PAGE_SIZE - bytes_read);
 452
 453	ClearPageError(page);
 454	SetPageUptodate(page);
 455
 456 out:
 457	flush_dcache_page(page);
 458	kunmap(page);
 459	unlock_page(page);
 460	return ret;
 461}
 462
 463static int hostfs_write_begin(struct file *file, struct address_space *mapping,
 464			      loff_t pos, unsigned len, unsigned flags,
 465			      struct page **pagep, void **fsdata)
 466{
 467	pgoff_t index = pos >> PAGE_SHIFT;
 468
 469	*pagep = grab_cache_page_write_begin(mapping, index, flags);
 470	if (!*pagep)
 471		return -ENOMEM;
 472	return 0;
 473}
 474
 475static int hostfs_write_end(struct file *file, struct address_space *mapping,
 476			    loff_t pos, unsigned len, unsigned copied,
 477			    struct page *page, void *fsdata)
 478{
 479	struct inode *inode = mapping->host;
 480	void *buffer;
 481	unsigned from = pos & (PAGE_SIZE - 1);
 482	int err;
 483
 484	buffer = kmap(page);
 485	err = write_file(FILE_HOSTFS_I(file)->fd, &pos, buffer + from, copied);
 486	kunmap(page);
 487
 488	if (!PageUptodate(page) && err == PAGE_SIZE)
 489		SetPageUptodate(page);
 490
 491	/*
 492	 * If err > 0, write_file has added err to pos, so we are comparing
 493	 * i_size against the last byte written.
 494	 */
 495	if (err > 0 && (pos > inode->i_size))
 496		inode->i_size = pos;
 497	unlock_page(page);
 498	put_page(page);
 499
 500	return err;
 501}
 502
 503static const struct address_space_operations hostfs_aops = {
 504	.writepage 	= hostfs_writepage,
 505	.readpage	= hostfs_readpage,
 506	.set_page_dirty = __set_page_dirty_nobuffers,
 507	.write_begin	= hostfs_write_begin,
 508	.write_end	= hostfs_write_end,
 509};
 510
 511static int read_name(struct inode *ino, char *name)
 512{
 513	dev_t rdev;
 514	struct hostfs_stat st;
 515	int err = stat_file(name, &st, -1);
 516	if (err)
 517		return err;
 518
 519	/* Reencode maj and min with the kernel encoding.*/
 520	rdev = MKDEV(st.maj, st.min);
 521
 522	switch (st.mode & S_IFMT) {
 523	case S_IFLNK:
 524		ino->i_op = &hostfs_link_iops;
 525		break;
 526	case S_IFDIR:
 527		ino->i_op = &hostfs_dir_iops;
 528		ino->i_fop = &hostfs_dir_fops;
 529		break;
 530	case S_IFCHR:
 531	case S_IFBLK:
 532	case S_IFIFO:
 533	case S_IFSOCK:
 534		init_special_inode(ino, st.mode & S_IFMT, rdev);
 535		ino->i_op = &hostfs_iops;
 536		break;
 537	case S_IFREG:
 538		ino->i_op = &hostfs_iops;
 539		ino->i_fop = &hostfs_file_fops;
 540		ino->i_mapping->a_ops = &hostfs_aops;
 541		break;
 542	default:
 543		return -EIO;
 544	}
 545
 546	ino->i_ino = st.ino;
 547	ino->i_mode = st.mode;
 548	set_nlink(ino, st.nlink);
 549	i_uid_write(ino, st.uid);
 550	i_gid_write(ino, st.gid);
 551	ino->i_atime = (struct timespec64){ st.atime.tv_sec, st.atime.tv_nsec };
 552	ino->i_mtime = (struct timespec64){ st.mtime.tv_sec, st.mtime.tv_nsec };
 553	ino->i_ctime = (struct timespec64){ st.ctime.tv_sec, st.ctime.tv_nsec };
 554	ino->i_size = st.size;
 555	ino->i_blocks = st.blocks;
 556	return 0;
 557}
 558
 559static int hostfs_create(struct user_namespace *mnt_userns, struct inode *dir,
 560			 struct dentry *dentry, umode_t mode, bool excl)
 561{
 562	struct inode *inode;
 563	char *name;
 564	int error, fd;
 565
 566	inode = hostfs_iget(dir->i_sb);
 567	if (IS_ERR(inode)) {
 568		error = PTR_ERR(inode);
 569		goto out;
 570	}
 571
 572	error = -ENOMEM;
 573	name = dentry_name(dentry);
 574	if (name == NULL)
 575		goto out_put;
 576
 577	fd = file_create(name, mode & 0777);
 578	if (fd < 0)
 579		error = fd;
 580	else
 581		error = read_name(inode, name);
 582
 583	__putname(name);
 584	if (error)
 585		goto out_put;
 586
 587	HOSTFS_I(inode)->fd = fd;
 588	HOSTFS_I(inode)->mode = FMODE_READ | FMODE_WRITE;
 589	d_instantiate(dentry, inode);
 590	return 0;
 591
 592 out_put:
 593	iput(inode);
 594 out:
 595	return error;
 596}
 597
 598static struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry,
 599				    unsigned int flags)
 600{
 601	struct inode *inode;
 602	char *name;
 603	int err;
 604
 605	inode = hostfs_iget(ino->i_sb);
 606	if (IS_ERR(inode))
 607		goto out;
 608
 609	err = -ENOMEM;
 610	name = dentry_name(dentry);
 611	if (name) {
 612		err = read_name(inode, name);
 613		__putname(name);
 614	}
 615	if (err) {
 616		iput(inode);
 617		inode = (err == -ENOENT) ? NULL : ERR_PTR(err);
 618	}
 619 out:
 620	return d_splice_alias(inode, dentry);
 621}
 622
 623static int hostfs_link(struct dentry *to, struct inode *ino,
 624		       struct dentry *from)
 625{
 626	char *from_name, *to_name;
 627	int err;
 628
 629	if ((from_name = dentry_name(from)) == NULL)
 630		return -ENOMEM;
 631	to_name = dentry_name(to);
 632	if (to_name == NULL) {
 633		__putname(from_name);
 634		return -ENOMEM;
 635	}
 636	err = link_file(to_name, from_name);
 637	__putname(from_name);
 638	__putname(to_name);
 639	return err;
 640}
 641
 642static int hostfs_unlink(struct inode *ino, struct dentry *dentry)
 643{
 644	char *file;
 645	int err;
 646
 647	if (append)
 648		return -EPERM;
 649
 650	if ((file = dentry_name(dentry)) == NULL)
 651		return -ENOMEM;
 652
 653	err = unlink_file(file);
 654	__putname(file);
 655	return err;
 656}
 657
 658static int hostfs_symlink(struct user_namespace *mnt_userns, struct inode *ino,
 659			  struct dentry *dentry, const char *to)
 660{
 661	char *file;
 662	int err;
 663
 664	if ((file = dentry_name(dentry)) == NULL)
 665		return -ENOMEM;
 666	err = make_symlink(file, to);
 667	__putname(file);
 668	return err;
 669}
 670
 671static int hostfs_mkdir(struct user_namespace *mnt_userns, struct inode *ino,
 672			struct dentry *dentry, umode_t mode)
 673{
 674	char *file;
 675	int err;
 676
 677	if ((file = dentry_name(dentry)) == NULL)
 678		return -ENOMEM;
 679	err = do_mkdir(file, mode);
 680	__putname(file);
 681	return err;
 682}
 683
 684static int hostfs_rmdir(struct inode *ino, struct dentry *dentry)
 685{
 686	char *file;
 687	int err;
 688
 689	if ((file = dentry_name(dentry)) == NULL)
 690		return -ENOMEM;
 691	err = hostfs_do_rmdir(file);
 692	__putname(file);
 693	return err;
 694}
 695
 696static int hostfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
 697			struct dentry *dentry, umode_t mode, dev_t dev)
 698{
 699	struct inode *inode;
 700	char *name;
 701	int err;
 702
 703	inode = hostfs_iget(dir->i_sb);
 704	if (IS_ERR(inode)) {
 705		err = PTR_ERR(inode);
 706		goto out;
 707	}
 708
 709	err = -ENOMEM;
 710	name = dentry_name(dentry);
 711	if (name == NULL)
 712		goto out_put;
 713
 
 714	err = do_mknod(name, mode, MAJOR(dev), MINOR(dev));
 715	if (err)
 716		goto out_free;
 717
 718	err = read_name(inode, name);
 719	__putname(name);
 720	if (err)
 721		goto out_put;
 722
 723	d_instantiate(dentry, inode);
 724	return 0;
 725
 726 out_free:
 727	__putname(name);
 728 out_put:
 729	iput(inode);
 730 out:
 731	return err;
 732}
 733
 734static int hostfs_rename2(struct user_namespace *mnt_userns,
 735			  struct inode *old_dir, struct dentry *old_dentry,
 736			  struct inode *new_dir, struct dentry *new_dentry,
 737			  unsigned int flags)
 738{
 739	char *old_name, *new_name;
 740	int err;
 741
 742	if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
 743		return -EINVAL;
 744
 745	old_name = dentry_name(old_dentry);
 746	if (old_name == NULL)
 747		return -ENOMEM;
 748	new_name = dentry_name(new_dentry);
 749	if (new_name == NULL) {
 750		__putname(old_name);
 751		return -ENOMEM;
 752	}
 753	if (!flags)
 754		err = rename_file(old_name, new_name);
 755	else
 756		err = rename2_file(old_name, new_name, flags);
 757
 758	__putname(old_name);
 759	__putname(new_name);
 760	return err;
 761}
 762
 763static int hostfs_permission(struct user_namespace *mnt_userns,
 764			     struct inode *ino, int desired)
 765{
 766	char *name;
 767	int r = 0, w = 0, x = 0, err;
 768
 769	if (desired & MAY_NOT_BLOCK)
 770		return -ECHILD;
 771
 772	if (desired & MAY_READ) r = 1;
 773	if (desired & MAY_WRITE) w = 1;
 774	if (desired & MAY_EXEC) x = 1;
 775	name = inode_name(ino);
 776	if (name == NULL)
 777		return -ENOMEM;
 778
 779	if (S_ISCHR(ino->i_mode) || S_ISBLK(ino->i_mode) ||
 780	    S_ISFIFO(ino->i_mode) || S_ISSOCK(ino->i_mode))
 781		err = 0;
 782	else
 783		err = access_file(name, r, w, x);
 784	__putname(name);
 785	if (!err)
 786		err = generic_permission(&init_user_ns, ino, desired);
 787	return err;
 788}
 789
 790static int hostfs_setattr(struct user_namespace *mnt_userns,
 791			  struct dentry *dentry, struct iattr *attr)
 792{
 793	struct inode *inode = d_inode(dentry);
 794	struct hostfs_iattr attrs;
 795	char *name;
 796	int err;
 797
 798	int fd = HOSTFS_I(inode)->fd;
 799
 800	err = setattr_prepare(&init_user_ns, dentry, attr);
 801	if (err)
 802		return err;
 803
 804	if (append)
 805		attr->ia_valid &= ~ATTR_SIZE;
 806
 807	attrs.ia_valid = 0;
 808	if (attr->ia_valid & ATTR_MODE) {
 809		attrs.ia_valid |= HOSTFS_ATTR_MODE;
 810		attrs.ia_mode = attr->ia_mode;
 811	}
 812	if (attr->ia_valid & ATTR_UID) {
 813		attrs.ia_valid |= HOSTFS_ATTR_UID;
 814		attrs.ia_uid = from_kuid(&init_user_ns, attr->ia_uid);
 815	}
 816	if (attr->ia_valid & ATTR_GID) {
 817		attrs.ia_valid |= HOSTFS_ATTR_GID;
 818		attrs.ia_gid = from_kgid(&init_user_ns, attr->ia_gid);
 819	}
 820	if (attr->ia_valid & ATTR_SIZE) {
 821		attrs.ia_valid |= HOSTFS_ATTR_SIZE;
 822		attrs.ia_size = attr->ia_size;
 823	}
 824	if (attr->ia_valid & ATTR_ATIME) {
 825		attrs.ia_valid |= HOSTFS_ATTR_ATIME;
 826		attrs.ia_atime = (struct hostfs_timespec)
 827			{ attr->ia_atime.tv_sec, attr->ia_atime.tv_nsec };
 828	}
 829	if (attr->ia_valid & ATTR_MTIME) {
 830		attrs.ia_valid |= HOSTFS_ATTR_MTIME;
 831		attrs.ia_mtime = (struct hostfs_timespec)
 832			{ attr->ia_mtime.tv_sec, attr->ia_mtime.tv_nsec };
 833	}
 834	if (attr->ia_valid & ATTR_CTIME) {
 835		attrs.ia_valid |= HOSTFS_ATTR_CTIME;
 836		attrs.ia_ctime = (struct hostfs_timespec)
 837			{ attr->ia_ctime.tv_sec, attr->ia_ctime.tv_nsec };
 838	}
 839	if (attr->ia_valid & ATTR_ATIME_SET) {
 840		attrs.ia_valid |= HOSTFS_ATTR_ATIME_SET;
 841	}
 842	if (attr->ia_valid & ATTR_MTIME_SET) {
 843		attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET;
 844	}
 845	name = dentry_name(dentry);
 846	if (name == NULL)
 847		return -ENOMEM;
 848	err = set_attr(name, &attrs, fd);
 849	__putname(name);
 850	if (err)
 851		return err;
 852
 853	if ((attr->ia_valid & ATTR_SIZE) &&
 854	    attr->ia_size != i_size_read(inode))
 855		truncate_setsize(inode, attr->ia_size);
 856
 857	setattr_copy(&init_user_ns, inode, attr);
 858	mark_inode_dirty(inode);
 859	return 0;
 860}
 861
 862static const struct inode_operations hostfs_iops = {
 863	.permission	= hostfs_permission,
 864	.setattr	= hostfs_setattr,
 865};
 866
 867static const struct inode_operations hostfs_dir_iops = {
 868	.create		= hostfs_create,
 869	.lookup		= hostfs_lookup,
 870	.link		= hostfs_link,
 871	.unlink		= hostfs_unlink,
 872	.symlink	= hostfs_symlink,
 873	.mkdir		= hostfs_mkdir,
 874	.rmdir		= hostfs_rmdir,
 875	.mknod		= hostfs_mknod,
 876	.rename		= hostfs_rename2,
 877	.permission	= hostfs_permission,
 878	.setattr	= hostfs_setattr,
 879};
 880
 881static const char *hostfs_get_link(struct dentry *dentry,
 882				   struct inode *inode,
 883				   struct delayed_call *done)
 884{
 885	char *link;
 886	if (!dentry)
 887		return ERR_PTR(-ECHILD);
 888	link = kmalloc(PATH_MAX, GFP_KERNEL);
 889	if (link) {
 890		char *path = dentry_name(dentry);
 891		int err = -ENOMEM;
 892		if (path) {
 893			err = hostfs_do_readlink(path, link, PATH_MAX);
 894			if (err == PATH_MAX)
 895				err = -E2BIG;
 896			__putname(path);
 897		}
 898		if (err < 0) {
 899			kfree(link);
 900			return ERR_PTR(err);
 901		}
 902	} else {
 903		return ERR_PTR(-ENOMEM);
 904	}
 905
 906	set_delayed_call(done, kfree_link, link);
 907	return link;
 908}
 909
 910static const struct inode_operations hostfs_link_iops = {
 911	.get_link	= hostfs_get_link,
 912};
 913
 914static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent)
 915{
 916	struct inode *root_inode;
 917	char *host_root_path, *req_root = d;
 918	int err;
 919
 920	sb->s_blocksize = 1024;
 921	sb->s_blocksize_bits = 10;
 922	sb->s_magic = HOSTFS_SUPER_MAGIC;
 923	sb->s_op = &hostfs_sbops;
 924	sb->s_d_op = &simple_dentry_operations;
 925	sb->s_maxbytes = MAX_LFS_FILESIZE;
 926
 927	/* NULL is printed as '(null)' by printf(): avoid that. */
 928	if (req_root == NULL)
 929		req_root = "";
 930
 931	err = -ENOMEM;
 932	sb->s_fs_info = host_root_path =
 933		kasprintf(GFP_KERNEL, "%s/%s", root_ino, req_root);
 934	if (host_root_path == NULL)
 935		goto out;
 936
 
 
 937	root_inode = new_inode(sb);
 938	if (!root_inode)
 939		goto out;
 940
 941	err = read_name(root_inode, host_root_path);
 942	if (err)
 943		goto out_put;
 944
 945	if (S_ISLNK(root_inode->i_mode)) {
 946		char *name = follow_link(host_root_path);
 947		if (IS_ERR(name)) {
 948			err = PTR_ERR(name);
 949			goto out_put;
 950		}
 951		err = read_name(root_inode, name);
 952		kfree(name);
 953		if (err)
 954			goto out_put;
 955	}
 956
 957	err = -ENOMEM;
 958	sb->s_root = d_make_root(root_inode);
 959	if (sb->s_root == NULL)
 960		goto out;
 961
 962	return 0;
 963
 964out_put:
 965	iput(root_inode);
 966out:
 967	return err;
 968}
 969
 970static struct dentry *hostfs_read_sb(struct file_system_type *type,
 971			  int flags, const char *dev_name,
 972			  void *data)
 973{
 974	return mount_nodev(type, flags, data, hostfs_fill_sb_common);
 975}
 976
 977static void hostfs_kill_sb(struct super_block *s)
 978{
 979	kill_anon_super(s);
 980	kfree(s->s_fs_info);
 981}
 982
 983static struct file_system_type hostfs_type = {
 984	.owner 		= THIS_MODULE,
 985	.name 		= "hostfs",
 986	.mount	 	= hostfs_read_sb,
 987	.kill_sb	= hostfs_kill_sb,
 988	.fs_flags 	= 0,
 989};
 990MODULE_ALIAS_FS("hostfs");
 991
 992static int __init init_hostfs(void)
 993{
 994	hostfs_inode_cache = KMEM_CACHE(hostfs_inode_info, 0);
 995	if (!hostfs_inode_cache)
 996		return -ENOMEM;
 997	return register_filesystem(&hostfs_type);
 998}
 999
1000static void __exit exit_hostfs(void)
1001{
1002	unregister_filesystem(&hostfs_type);
1003	kmem_cache_destroy(hostfs_inode_cache);
1004}
1005
1006module_init(init_hostfs)
1007module_exit(exit_hostfs)
1008MODULE_LICENSE("GPL");