cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

linuxvfs.c (26202B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * linux/fs/befs/linuxvfs.c
      4 *
      5 * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com
      6 *
      7 */
      8
      9#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     10
     11#include <linux/module.h>
     12#include <linux/slab.h>
     13#include <linux/fs.h>
     14#include <linux/errno.h>
     15#include <linux/stat.h>
     16#include <linux/nls.h>
     17#include <linux/buffer_head.h>
     18#include <linux/vfs.h>
     19#include <linux/parser.h>
     20#include <linux/namei.h>
     21#include <linux/sched.h>
     22#include <linux/cred.h>
     23#include <linux/exportfs.h>
     24#include <linux/seq_file.h>
     25#include <linux/blkdev.h>
     26
     27#include "befs.h"
     28#include "btree.h"
     29#include "inode.h"
     30#include "datastream.h"
     31#include "super.h"
     32#include "io.h"
     33
     34MODULE_DESCRIPTION("BeOS File System (BeFS) driver");
     35MODULE_AUTHOR("Will Dyson");
     36MODULE_LICENSE("GPL");
     37
     38/* The units the vfs expects inode->i_blocks to be in */
     39#define VFS_BLOCK_SIZE 512
     40
     41static int befs_readdir(struct file *, struct dir_context *);
     42static int befs_get_block(struct inode *, sector_t, struct buffer_head *, int);
     43static int befs_read_folio(struct file *file, struct folio *folio);
     44static sector_t befs_bmap(struct address_space *mapping, sector_t block);
     45static struct dentry *befs_lookup(struct inode *, struct dentry *,
     46				  unsigned int);
     47static struct inode *befs_iget(struct super_block *, unsigned long);
     48static struct inode *befs_alloc_inode(struct super_block *sb);
     49static void befs_free_inode(struct inode *inode);
     50static void befs_destroy_inodecache(void);
     51static int befs_symlink_read_folio(struct file *, struct folio *);
     52static int befs_utf2nls(struct super_block *sb, const char *in, int in_len,
     53			char **out, int *out_len);
     54static int befs_nls2utf(struct super_block *sb, const char *in, int in_len,
     55			char **out, int *out_len);
     56static void befs_put_super(struct super_block *);
     57static int befs_remount(struct super_block *, int *, char *);
     58static int befs_statfs(struct dentry *, struct kstatfs *);
     59static int befs_show_options(struct seq_file *, struct dentry *);
     60static int parse_options(char *, struct befs_mount_options *);
     61static struct dentry *befs_fh_to_dentry(struct super_block *sb,
     62				struct fid *fid, int fh_len, int fh_type);
     63static struct dentry *befs_fh_to_parent(struct super_block *sb,
     64				struct fid *fid, int fh_len, int fh_type);
     65static struct dentry *befs_get_parent(struct dentry *child);
     66
     67static const struct super_operations befs_sops = {
     68	.alloc_inode	= befs_alloc_inode,	/* allocate a new inode */
     69	.free_inode	= befs_free_inode, /* deallocate an inode */
     70	.put_super	= befs_put_super,	/* uninit super */
     71	.statfs		= befs_statfs,	/* statfs */
     72	.remount_fs	= befs_remount,
     73	.show_options	= befs_show_options,
     74};
     75
     76/* slab cache for befs_inode_info objects */
     77static struct kmem_cache *befs_inode_cachep;
     78
     79static const struct file_operations befs_dir_operations = {
     80	.read		= generic_read_dir,
     81	.iterate_shared	= befs_readdir,
     82	.llseek		= generic_file_llseek,
     83};
     84
     85static const struct inode_operations befs_dir_inode_operations = {
     86	.lookup		= befs_lookup,
     87};
     88
     89static const struct address_space_operations befs_aops = {
     90	.read_folio	= befs_read_folio,
     91	.bmap		= befs_bmap,
     92};
     93
     94static const struct address_space_operations befs_symlink_aops = {
     95	.read_folio	= befs_symlink_read_folio,
     96};
     97
     98static const struct export_operations befs_export_operations = {
     99	.fh_to_dentry	= befs_fh_to_dentry,
    100	.fh_to_parent	= befs_fh_to_parent,
    101	.get_parent	= befs_get_parent,
    102};
    103
    104/*
    105 * Called by generic_file_read() to read a folio of data
    106 *
    107 * In turn, simply calls a generic block read function and
    108 * passes it the address of befs_get_block, for mapping file
    109 * positions to disk blocks.
    110 */
    111static int
    112befs_read_folio(struct file *file, struct folio *folio)
    113{
    114	return block_read_full_folio(folio, befs_get_block);
    115}
    116
    117static sector_t
    118befs_bmap(struct address_space *mapping, sector_t block)
    119{
    120	return generic_block_bmap(mapping, block, befs_get_block);
    121}
    122
    123/*
    124 * Generic function to map a file position (block) to a
    125 * disk offset (passed back in bh_result).
    126 *
    127 * Used by many higher level functions.
    128 *
    129 * Calls befs_fblock2brun() in datastream.c to do the real work.
    130 */
    131
    132static int
    133befs_get_block(struct inode *inode, sector_t block,
    134	       struct buffer_head *bh_result, int create)
    135{
    136	struct super_block *sb = inode->i_sb;
    137	befs_data_stream *ds = &BEFS_I(inode)->i_data.ds;
    138	befs_block_run run = BAD_IADDR;
    139	int res;
    140	ulong disk_off;
    141
    142	befs_debug(sb, "---> befs_get_block() for inode %lu, block %ld",
    143		   (unsigned long)inode->i_ino, (long)block);
    144	if (create) {
    145		befs_error(sb, "befs_get_block() was asked to write to "
    146			   "block %ld in inode %lu", (long)block,
    147			   (unsigned long)inode->i_ino);
    148		return -EPERM;
    149	}
    150
    151	res = befs_fblock2brun(sb, ds, block, &run);
    152	if (res != BEFS_OK) {
    153		befs_error(sb,
    154			   "<--- %s for inode %lu, block %ld ERROR",
    155			   __func__, (unsigned long)inode->i_ino,
    156			   (long)block);
    157		return -EFBIG;
    158	}
    159
    160	disk_off = (ulong) iaddr2blockno(sb, &run);
    161
    162	map_bh(bh_result, inode->i_sb, disk_off);
    163
    164	befs_debug(sb, "<--- %s for inode %lu, block %ld, disk address %lu",
    165		  __func__, (unsigned long)inode->i_ino, (long)block,
    166		  (unsigned long)disk_off);
    167
    168	return 0;
    169}
    170
    171static struct dentry *
    172befs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
    173{
    174	struct inode *inode;
    175	struct super_block *sb = dir->i_sb;
    176	const befs_data_stream *ds = &BEFS_I(dir)->i_data.ds;
    177	befs_off_t offset;
    178	int ret;
    179	int utfnamelen;
    180	char *utfname;
    181	const char *name = dentry->d_name.name;
    182
    183	befs_debug(sb, "---> %s name %pd inode %ld", __func__,
    184		   dentry, dir->i_ino);
    185
    186	/* Convert to UTF-8 */
    187	if (BEFS_SB(sb)->nls) {
    188		ret =
    189		    befs_nls2utf(sb, name, strlen(name), &utfname, &utfnamelen);
    190		if (ret < 0) {
    191			befs_debug(sb, "<--- %s ERROR", __func__);
    192			return ERR_PTR(ret);
    193		}
    194		ret = befs_btree_find(sb, ds, utfname, &offset);
    195		kfree(utfname);
    196
    197	} else {
    198		ret = befs_btree_find(sb, ds, name, &offset);
    199	}
    200
    201	if (ret == BEFS_BT_NOT_FOUND) {
    202		befs_debug(sb, "<--- %s %pd not found", __func__, dentry);
    203		inode = NULL;
    204	} else if (ret != BEFS_OK || offset == 0) {
    205		befs_error(sb, "<--- %s Error", __func__);
    206		inode = ERR_PTR(-ENODATA);
    207	} else {
    208		inode = befs_iget(dir->i_sb, (ino_t) offset);
    209	}
    210	befs_debug(sb, "<--- %s", __func__);
    211
    212	return d_splice_alias(inode, dentry);
    213}
    214
    215static int
    216befs_readdir(struct file *file, struct dir_context *ctx)
    217{
    218	struct inode *inode = file_inode(file);
    219	struct super_block *sb = inode->i_sb;
    220	const befs_data_stream *ds = &BEFS_I(inode)->i_data.ds;
    221	befs_off_t value;
    222	int result;
    223	size_t keysize;
    224	char keybuf[BEFS_NAME_LEN + 1];
    225
    226	befs_debug(sb, "---> %s name %pD, inode %ld, ctx->pos %lld",
    227		  __func__, file, inode->i_ino, ctx->pos);
    228
    229	while (1) {
    230		result = befs_btree_read(sb, ds, ctx->pos, BEFS_NAME_LEN + 1,
    231					 keybuf, &keysize, &value);
    232
    233		if (result == BEFS_ERR) {
    234			befs_debug(sb, "<--- %s ERROR", __func__);
    235			befs_error(sb, "IO error reading %pD (inode %lu)",
    236				   file, inode->i_ino);
    237			return -EIO;
    238
    239		} else if (result == BEFS_BT_END) {
    240			befs_debug(sb, "<--- %s END", __func__);
    241			return 0;
    242
    243		} else if (result == BEFS_BT_EMPTY) {
    244			befs_debug(sb, "<--- %s Empty directory", __func__);
    245			return 0;
    246		}
    247
    248		/* Convert to NLS */
    249		if (BEFS_SB(sb)->nls) {
    250			char *nlsname;
    251			int nlsnamelen;
    252
    253			result =
    254			    befs_utf2nls(sb, keybuf, keysize, &nlsname,
    255					 &nlsnamelen);
    256			if (result < 0) {
    257				befs_debug(sb, "<--- %s ERROR", __func__);
    258				return result;
    259			}
    260			if (!dir_emit(ctx, nlsname, nlsnamelen,
    261				      (ino_t) value, DT_UNKNOWN)) {
    262				kfree(nlsname);
    263				return 0;
    264			}
    265			kfree(nlsname);
    266		} else {
    267			if (!dir_emit(ctx, keybuf, keysize,
    268				      (ino_t) value, DT_UNKNOWN))
    269				return 0;
    270		}
    271		ctx->pos++;
    272	}
    273}
    274
    275static struct inode *
    276befs_alloc_inode(struct super_block *sb)
    277{
    278	struct befs_inode_info *bi;
    279
    280	bi = alloc_inode_sb(sb, befs_inode_cachep, GFP_KERNEL);
    281	if (!bi)
    282		return NULL;
    283	return &bi->vfs_inode;
    284}
    285
    286static void befs_free_inode(struct inode *inode)
    287{
    288	kmem_cache_free(befs_inode_cachep, BEFS_I(inode));
    289}
    290
    291static void init_once(void *foo)
    292{
    293	struct befs_inode_info *bi = (struct befs_inode_info *) foo;
    294
    295	inode_init_once(&bi->vfs_inode);
    296}
    297
    298static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
    299{
    300	struct buffer_head *bh;
    301	befs_inode *raw_inode;
    302	struct befs_sb_info *befs_sb = BEFS_SB(sb);
    303	struct befs_inode_info *befs_ino;
    304	struct inode *inode;
    305
    306	befs_debug(sb, "---> %s inode = %lu", __func__, ino);
    307
    308	inode = iget_locked(sb, ino);
    309	if (!inode)
    310		return ERR_PTR(-ENOMEM);
    311	if (!(inode->i_state & I_NEW))
    312		return inode;
    313
    314	befs_ino = BEFS_I(inode);
    315
    316	/* convert from vfs's inode number to befs's inode number */
    317	befs_ino->i_inode_num = blockno2iaddr(sb, inode->i_ino);
    318
    319	befs_debug(sb, "  real inode number [%u, %hu, %hu]",
    320		   befs_ino->i_inode_num.allocation_group,
    321		   befs_ino->i_inode_num.start, befs_ino->i_inode_num.len);
    322
    323	bh = sb_bread(sb, inode->i_ino);
    324	if (!bh) {
    325		befs_error(sb, "unable to read inode block - "
    326			   "inode = %lu", inode->i_ino);
    327		goto unacquire_none;
    328	}
    329
    330	raw_inode = (befs_inode *) bh->b_data;
    331
    332	befs_dump_inode(sb, raw_inode);
    333
    334	if (befs_check_inode(sb, raw_inode, inode->i_ino) != BEFS_OK) {
    335		befs_error(sb, "Bad inode: %lu", inode->i_ino);
    336		goto unacquire_bh;
    337	}
    338
    339	inode->i_mode = (umode_t) fs32_to_cpu(sb, raw_inode->mode);
    340
    341	/*
    342	 * set uid and gid.  But since current BeOS is single user OS, so
    343	 * you can change by "uid" or "gid" options.
    344	 */
    345
    346	inode->i_uid = befs_sb->mount_opts.use_uid ?
    347		befs_sb->mount_opts.uid :
    348		make_kuid(&init_user_ns, fs32_to_cpu(sb, raw_inode->uid));
    349	inode->i_gid = befs_sb->mount_opts.use_gid ?
    350		befs_sb->mount_opts.gid :
    351		make_kgid(&init_user_ns, fs32_to_cpu(sb, raw_inode->gid));
    352
    353	set_nlink(inode, 1);
    354
    355	/*
    356	 * BEFS's time is 64 bits, but current VFS is 32 bits...
    357	 * BEFS don't have access time. Nor inode change time. VFS
    358	 * doesn't have creation time.
    359	 * Also, the lower 16 bits of the last_modified_time and
    360	 * create_time are just a counter to help ensure uniqueness
    361	 * for indexing purposes. (PFD, page 54)
    362	 */
    363
    364	inode->i_mtime.tv_sec =
    365	    fs64_to_cpu(sb, raw_inode->last_modified_time) >> 16;
    366	inode->i_mtime.tv_nsec = 0;   /* lower 16 bits are not a time */
    367	inode->i_ctime = inode->i_mtime;
    368	inode->i_atime = inode->i_mtime;
    369
    370	befs_ino->i_inode_num = fsrun_to_cpu(sb, raw_inode->inode_num);
    371	befs_ino->i_parent = fsrun_to_cpu(sb, raw_inode->parent);
    372	befs_ino->i_attribute = fsrun_to_cpu(sb, raw_inode->attributes);
    373	befs_ino->i_flags = fs32_to_cpu(sb, raw_inode->flags);
    374
    375	if (S_ISLNK(inode->i_mode) && !(befs_ino->i_flags & BEFS_LONG_SYMLINK)){
    376		inode->i_size = 0;
    377		inode->i_blocks = befs_sb->block_size / VFS_BLOCK_SIZE;
    378		strlcpy(befs_ino->i_data.symlink, raw_inode->data.symlink,
    379			BEFS_SYMLINK_LEN);
    380	} else {
    381		int num_blks;
    382
    383		befs_ino->i_data.ds =
    384		    fsds_to_cpu(sb, &raw_inode->data.datastream);
    385
    386		num_blks = befs_count_blocks(sb, &befs_ino->i_data.ds);
    387		inode->i_blocks =
    388		    num_blks * (befs_sb->block_size / VFS_BLOCK_SIZE);
    389		inode->i_size = befs_ino->i_data.ds.size;
    390	}
    391
    392	inode->i_mapping->a_ops = &befs_aops;
    393
    394	if (S_ISREG(inode->i_mode)) {
    395		inode->i_fop = &generic_ro_fops;
    396	} else if (S_ISDIR(inode->i_mode)) {
    397		inode->i_op = &befs_dir_inode_operations;
    398		inode->i_fop = &befs_dir_operations;
    399	} else if (S_ISLNK(inode->i_mode)) {
    400		if (befs_ino->i_flags & BEFS_LONG_SYMLINK) {
    401			inode->i_op = &page_symlink_inode_operations;
    402			inode_nohighmem(inode);
    403			inode->i_mapping->a_ops = &befs_symlink_aops;
    404		} else {
    405			inode->i_link = befs_ino->i_data.symlink;
    406			inode->i_op = &simple_symlink_inode_operations;
    407		}
    408	} else {
    409		befs_error(sb, "Inode %lu is not a regular file, "
    410			   "directory or symlink. THAT IS WRONG! BeFS has no "
    411			   "on disk special files", inode->i_ino);
    412		goto unacquire_bh;
    413	}
    414
    415	brelse(bh);
    416	befs_debug(sb, "<--- %s", __func__);
    417	unlock_new_inode(inode);
    418	return inode;
    419
    420unacquire_bh:
    421	brelse(bh);
    422
    423unacquire_none:
    424	iget_failed(inode);
    425	befs_debug(sb, "<--- %s - Bad inode", __func__);
    426	return ERR_PTR(-EIO);
    427}
    428
    429/* Initialize the inode cache. Called at fs setup.
    430 *
    431 * Taken from NFS implementation by Al Viro.
    432 */
    433static int __init
    434befs_init_inodecache(void)
    435{
    436	befs_inode_cachep = kmem_cache_create_usercopy("befs_inode_cache",
    437				sizeof(struct befs_inode_info), 0,
    438				(SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
    439					SLAB_ACCOUNT),
    440				offsetof(struct befs_inode_info,
    441					i_data.symlink),
    442				sizeof_field(struct befs_inode_info,
    443					i_data.symlink),
    444				init_once);
    445	if (befs_inode_cachep == NULL)
    446		return -ENOMEM;
    447
    448	return 0;
    449}
    450
    451/* Called at fs teardown.
    452 *
    453 * Taken from NFS implementation by Al Viro.
    454 */
    455static void
    456befs_destroy_inodecache(void)
    457{
    458	/*
    459	 * Make sure all delayed rcu free inodes are flushed before we
    460	 * destroy cache.
    461	 */
    462	rcu_barrier();
    463	kmem_cache_destroy(befs_inode_cachep);
    464}
    465
    466/*
    467 * The inode of symbolic link is different to data stream.
    468 * The data stream become link name. Unless the LONG_SYMLINK
    469 * flag is set.
    470 */
    471static int befs_symlink_read_folio(struct file *unused, struct folio *folio)
    472{
    473	struct page *page = &folio->page;
    474	struct inode *inode = page->mapping->host;
    475	struct super_block *sb = inode->i_sb;
    476	struct befs_inode_info *befs_ino = BEFS_I(inode);
    477	befs_data_stream *data = &befs_ino->i_data.ds;
    478	befs_off_t len = data->size;
    479	char *link = page_address(page);
    480
    481	if (len == 0 || len > PAGE_SIZE) {
    482		befs_error(sb, "Long symlink with illegal length");
    483		goto fail;
    484	}
    485	befs_debug(sb, "Follow long symlink");
    486
    487	if (befs_read_lsymlink(sb, data, link, len) != len) {
    488		befs_error(sb, "Failed to read entire long symlink");
    489		goto fail;
    490	}
    491	link[len - 1] = '\0';
    492	SetPageUptodate(page);
    493	unlock_page(page);
    494	return 0;
    495fail:
    496	SetPageError(page);
    497	unlock_page(page);
    498	return -EIO;
    499}
    500
    501/*
    502 * UTF-8 to NLS charset convert routine
    503 *
    504 * Uses uni2char() / char2uni() rather than the nls tables directly
    505 */
    506static int
    507befs_utf2nls(struct super_block *sb, const char *in,
    508	     int in_len, char **out, int *out_len)
    509{
    510	struct nls_table *nls = BEFS_SB(sb)->nls;
    511	int i, o;
    512	unicode_t uni;
    513	int unilen, utflen;
    514	char *result;
    515	/* The utf8->nls conversion won't make the final nls string bigger
    516	 * than the utf one, but if the string is pure ascii they'll have the
    517	 * same width and an extra char is needed to save the additional \0
    518	 */
    519	int maxlen = in_len + 1;
    520
    521	befs_debug(sb, "---> %s", __func__);
    522
    523	if (!nls) {
    524		befs_error(sb, "%s called with no NLS table loaded", __func__);
    525		return -EINVAL;
    526	}
    527
    528	*out = result = kmalloc(maxlen, GFP_NOFS);
    529	if (!*out)
    530		return -ENOMEM;
    531
    532	for (i = o = 0; i < in_len; i += utflen, o += unilen) {
    533
    534		/* convert from UTF-8 to Unicode */
    535		utflen = utf8_to_utf32(&in[i], in_len - i, &uni);
    536		if (utflen < 0)
    537			goto conv_err;
    538
    539		/* convert from Unicode to nls */
    540		if (uni > MAX_WCHAR_T)
    541			goto conv_err;
    542		unilen = nls->uni2char(uni, &result[o], in_len - o);
    543		if (unilen < 0)
    544			goto conv_err;
    545	}
    546	result[o] = '\0';
    547	*out_len = o;
    548
    549	befs_debug(sb, "<--- %s", __func__);
    550
    551	return o;
    552
    553conv_err:
    554	befs_error(sb, "Name using character set %s contains a character that "
    555		   "cannot be converted to unicode.", nls->charset);
    556	befs_debug(sb, "<--- %s", __func__);
    557	kfree(result);
    558	return -EILSEQ;
    559}
    560
    561/**
    562 * befs_nls2utf - Convert NLS string to utf8 encodeing
    563 * @sb: Superblock
    564 * @in: Input string buffer in NLS format
    565 * @in_len: Length of input string in bytes
    566 * @out: The output string in UTF-8 format
    567 * @out_len: Length of the output buffer
    568 *
    569 * Converts input string @in, which is in the format of the loaded NLS map,
    570 * into a utf8 string.
    571 *
    572 * The destination string @out is allocated by this function and the caller is
    573 * responsible for freeing it with kfree()
    574 *
    575 * On return, *@out_len is the length of @out in bytes.
    576 *
    577 * On success, the return value is the number of utf8 characters written to
    578 * the output buffer @out.
    579 *
    580 * On Failure, a negative number coresponding to the error code is returned.
    581 */
    582
    583static int
    584befs_nls2utf(struct super_block *sb, const char *in,
    585	     int in_len, char **out, int *out_len)
    586{
    587	struct nls_table *nls = BEFS_SB(sb)->nls;
    588	int i, o;
    589	wchar_t uni;
    590	int unilen, utflen;
    591	char *result;
    592	/*
    593	 * There are nls characters that will translate to 3-chars-wide UTF-8
    594	 * characters, an additional byte is needed to save the final \0
    595	 * in special cases
    596	 */
    597	int maxlen = (3 * in_len) + 1;
    598
    599	befs_debug(sb, "---> %s\n", __func__);
    600
    601	if (!nls) {
    602		befs_error(sb, "%s called with no NLS table loaded.",
    603			   __func__);
    604		return -EINVAL;
    605	}
    606
    607	*out = result = kmalloc(maxlen, GFP_NOFS);
    608	if (!*out) {
    609		*out_len = 0;
    610		return -ENOMEM;
    611	}
    612
    613	for (i = o = 0; i < in_len; i += unilen, o += utflen) {
    614
    615		/* convert from nls to unicode */
    616		unilen = nls->char2uni(&in[i], in_len - i, &uni);
    617		if (unilen < 0)
    618			goto conv_err;
    619
    620		/* convert from unicode to UTF-8 */
    621		utflen = utf32_to_utf8(uni, &result[o], 3);
    622		if (utflen <= 0)
    623			goto conv_err;
    624	}
    625
    626	result[o] = '\0';
    627	*out_len = o;
    628
    629	befs_debug(sb, "<--- %s", __func__);
    630
    631	return i;
    632
    633conv_err:
    634	befs_error(sb, "Name using character set %s contains a character that "
    635		   "cannot be converted to unicode.", nls->charset);
    636	befs_debug(sb, "<--- %s", __func__);
    637	kfree(result);
    638	return -EILSEQ;
    639}
    640
    641static struct inode *befs_nfs_get_inode(struct super_block *sb, uint64_t ino,
    642					 uint32_t generation)
    643{
    644	/* No need to handle i_generation */
    645	return befs_iget(sb, ino);
    646}
    647
    648/*
    649 * Map a NFS file handle to a corresponding dentry
    650 */
    651static struct dentry *befs_fh_to_dentry(struct super_block *sb,
    652				struct fid *fid, int fh_len, int fh_type)
    653{
    654	return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
    655				    befs_nfs_get_inode);
    656}
    657
    658/*
    659 * Find the parent for a file specified by NFS handle
    660 */
    661static struct dentry *befs_fh_to_parent(struct super_block *sb,
    662				struct fid *fid, int fh_len, int fh_type)
    663{
    664	return generic_fh_to_parent(sb, fid, fh_len, fh_type,
    665				    befs_nfs_get_inode);
    666}
    667
    668static struct dentry *befs_get_parent(struct dentry *child)
    669{
    670	struct inode *parent;
    671	struct befs_inode_info *befs_ino = BEFS_I(d_inode(child));
    672
    673	parent = befs_iget(child->d_sb,
    674			   (unsigned long)befs_ino->i_parent.start);
    675	if (IS_ERR(parent))
    676		return ERR_CAST(parent);
    677
    678	return d_obtain_alias(parent);
    679}
    680
    681enum {
    682	Opt_uid, Opt_gid, Opt_charset, Opt_debug, Opt_err,
    683};
    684
    685static const match_table_t befs_tokens = {
    686	{Opt_uid, "uid=%d"},
    687	{Opt_gid, "gid=%d"},
    688	{Opt_charset, "iocharset=%s"},
    689	{Opt_debug, "debug"},
    690	{Opt_err, NULL}
    691};
    692
    693static int
    694parse_options(char *options, struct befs_mount_options *opts)
    695{
    696	char *p;
    697	substring_t args[MAX_OPT_ARGS];
    698	int option;
    699	kuid_t uid;
    700	kgid_t gid;
    701
    702	/* Initialize options */
    703	opts->uid = GLOBAL_ROOT_UID;
    704	opts->gid = GLOBAL_ROOT_GID;
    705	opts->use_uid = 0;
    706	opts->use_gid = 0;
    707	opts->iocharset = NULL;
    708	opts->debug = 0;
    709
    710	if (!options)
    711		return 1;
    712
    713	while ((p = strsep(&options, ",")) != NULL) {
    714		int token;
    715
    716		if (!*p)
    717			continue;
    718
    719		token = match_token(p, befs_tokens, args);
    720		switch (token) {
    721		case Opt_uid:
    722			if (match_int(&args[0], &option))
    723				return 0;
    724			uid = INVALID_UID;
    725			if (option >= 0)
    726				uid = make_kuid(current_user_ns(), option);
    727			if (!uid_valid(uid)) {
    728				pr_err("Invalid uid %d, "
    729				       "using default\n", option);
    730				break;
    731			}
    732			opts->uid = uid;
    733			opts->use_uid = 1;
    734			break;
    735		case Opt_gid:
    736			if (match_int(&args[0], &option))
    737				return 0;
    738			gid = INVALID_GID;
    739			if (option >= 0)
    740				gid = make_kgid(current_user_ns(), option);
    741			if (!gid_valid(gid)) {
    742				pr_err("Invalid gid %d, "
    743				       "using default\n", option);
    744				break;
    745			}
    746			opts->gid = gid;
    747			opts->use_gid = 1;
    748			break;
    749		case Opt_charset:
    750			kfree(opts->iocharset);
    751			opts->iocharset = match_strdup(&args[0]);
    752			if (!opts->iocharset) {
    753				pr_err("allocation failure for "
    754				       "iocharset string\n");
    755				return 0;
    756			}
    757			break;
    758		case Opt_debug:
    759			opts->debug = 1;
    760			break;
    761		default:
    762			pr_err("Unrecognized mount option \"%s\" "
    763			       "or missing value\n", p);
    764			return 0;
    765		}
    766	}
    767	return 1;
    768}
    769
    770static int befs_show_options(struct seq_file *m, struct dentry *root)
    771{
    772	struct befs_sb_info *befs_sb = BEFS_SB(root->d_sb);
    773	struct befs_mount_options *opts = &befs_sb->mount_opts;
    774
    775	if (!uid_eq(opts->uid, GLOBAL_ROOT_UID))
    776		seq_printf(m, ",uid=%u",
    777			   from_kuid_munged(&init_user_ns, opts->uid));
    778	if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
    779		seq_printf(m, ",gid=%u",
    780			   from_kgid_munged(&init_user_ns, opts->gid));
    781	if (opts->iocharset)
    782		seq_printf(m, ",charset=%s", opts->iocharset);
    783	if (opts->debug)
    784		seq_puts(m, ",debug");
    785	return 0;
    786}
    787
    788/* This function has the responsibiltiy of getting the
    789 * filesystem ready for unmounting.
    790 * Basically, we free everything that we allocated in
    791 * befs_read_inode
    792 */
    793static void
    794befs_put_super(struct super_block *sb)
    795{
    796	kfree(BEFS_SB(sb)->mount_opts.iocharset);
    797	BEFS_SB(sb)->mount_opts.iocharset = NULL;
    798	unload_nls(BEFS_SB(sb)->nls);
    799	kfree(sb->s_fs_info);
    800	sb->s_fs_info = NULL;
    801}
    802
    803/* Allocate private field of the superblock, fill it.
    804 *
    805 * Finish filling the public superblock fields
    806 * Make the root directory
    807 * Load a set of NLS translations if needed.
    808 */
    809static int
    810befs_fill_super(struct super_block *sb, void *data, int silent)
    811{
    812	struct buffer_head *bh;
    813	struct befs_sb_info *befs_sb;
    814	befs_super_block *disk_sb;
    815	struct inode *root;
    816	long ret = -EINVAL;
    817	const unsigned long sb_block = 0;
    818	const off_t x86_sb_off = 512;
    819	int blocksize;
    820
    821	sb->s_fs_info = kzalloc(sizeof(*befs_sb), GFP_KERNEL);
    822	if (sb->s_fs_info == NULL)
    823		goto unacquire_none;
    824
    825	befs_sb = BEFS_SB(sb);
    826
    827	if (!parse_options((char *) data, &befs_sb->mount_opts)) {
    828		if (!silent)
    829			befs_error(sb, "cannot parse mount options");
    830		goto unacquire_priv_sbp;
    831	}
    832
    833	befs_debug(sb, "---> %s", __func__);
    834
    835	if (!sb_rdonly(sb)) {
    836		befs_warning(sb,
    837			     "No write support. Marking filesystem read-only");
    838		sb->s_flags |= SB_RDONLY;
    839	}
    840
    841	/*
    842	 * Set dummy blocksize to read super block.
    843	 * Will be set to real fs blocksize later.
    844	 *
    845	 * Linux 2.4.10 and later refuse to read blocks smaller than
    846	 * the logical block size for the device. But we also need to read at
    847	 * least 1k to get the second 512 bytes of the volume.
    848	 */
    849	blocksize = sb_min_blocksize(sb, 1024);
    850	if (!blocksize) {
    851		if (!silent)
    852			befs_error(sb, "unable to set blocksize");
    853		goto unacquire_priv_sbp;
    854	}
    855
    856	bh = sb_bread(sb, sb_block);
    857	if (!bh) {
    858		if (!silent)
    859			befs_error(sb, "unable to read superblock");
    860		goto unacquire_priv_sbp;
    861	}
    862
    863	/* account for offset of super block on x86 */
    864	disk_sb = (befs_super_block *) bh->b_data;
    865	if ((disk_sb->magic1 == BEFS_SUPER_MAGIC1_LE) ||
    866	    (disk_sb->magic1 == BEFS_SUPER_MAGIC1_BE)) {
    867		befs_debug(sb, "Using PPC superblock location");
    868	} else {
    869		befs_debug(sb, "Using x86 superblock location");
    870		disk_sb =
    871		    (befs_super_block *) ((void *) bh->b_data + x86_sb_off);
    872	}
    873
    874	if ((befs_load_sb(sb, disk_sb) != BEFS_OK) ||
    875	    (befs_check_sb(sb) != BEFS_OK))
    876		goto unacquire_bh;
    877
    878	befs_dump_super_block(sb, disk_sb);
    879
    880	brelse(bh);
    881
    882	if (befs_sb->num_blocks > ~((sector_t)0)) {
    883		if (!silent)
    884			befs_error(sb, "blocks count: %llu is larger than the host can use",
    885					befs_sb->num_blocks);
    886		goto unacquire_priv_sbp;
    887	}
    888
    889	/*
    890	 * set up enough so that it can read an inode
    891	 * Fill in kernel superblock fields from private sb
    892	 */
    893	sb->s_magic = BEFS_SUPER_MAGIC;
    894	/* Set real blocksize of fs */
    895	sb_set_blocksize(sb, (ulong) befs_sb->block_size);
    896	sb->s_op = &befs_sops;
    897	sb->s_export_op = &befs_export_operations;
    898	sb->s_time_min = 0;
    899	sb->s_time_max = 0xffffffffffffll;
    900	root = befs_iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir)));
    901	if (IS_ERR(root)) {
    902		ret = PTR_ERR(root);
    903		goto unacquire_priv_sbp;
    904	}
    905	sb->s_root = d_make_root(root);
    906	if (!sb->s_root) {
    907		if (!silent)
    908			befs_error(sb, "get root inode failed");
    909		goto unacquire_priv_sbp;
    910	}
    911
    912	/* load nls library */
    913	if (befs_sb->mount_opts.iocharset) {
    914		befs_debug(sb, "Loading nls: %s",
    915			   befs_sb->mount_opts.iocharset);
    916		befs_sb->nls = load_nls(befs_sb->mount_opts.iocharset);
    917		if (!befs_sb->nls) {
    918			befs_warning(sb, "Cannot load nls %s"
    919					" loading default nls",
    920					befs_sb->mount_opts.iocharset);
    921			befs_sb->nls = load_nls_default();
    922		}
    923	/* load default nls if none is specified  in mount options */
    924	} else {
    925		befs_debug(sb, "Loading default nls");
    926		befs_sb->nls = load_nls_default();
    927	}
    928
    929	return 0;
    930
    931unacquire_bh:
    932	brelse(bh);
    933
    934unacquire_priv_sbp:
    935	kfree(befs_sb->mount_opts.iocharset);
    936	kfree(sb->s_fs_info);
    937	sb->s_fs_info = NULL;
    938
    939unacquire_none:
    940	return ret;
    941}
    942
    943static int
    944befs_remount(struct super_block *sb, int *flags, char *data)
    945{
    946	sync_filesystem(sb);
    947	if (!(*flags & SB_RDONLY))
    948		return -EINVAL;
    949	return 0;
    950}
    951
    952static int
    953befs_statfs(struct dentry *dentry, struct kstatfs *buf)
    954{
    955	struct super_block *sb = dentry->d_sb;
    956	u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
    957
    958	befs_debug(sb, "---> %s", __func__);
    959
    960	buf->f_type = BEFS_SUPER_MAGIC;
    961	buf->f_bsize = sb->s_blocksize;
    962	buf->f_blocks = BEFS_SB(sb)->num_blocks;
    963	buf->f_bfree = BEFS_SB(sb)->num_blocks - BEFS_SB(sb)->used_blocks;
    964	buf->f_bavail = buf->f_bfree;
    965	buf->f_files = 0;	/* UNKNOWN */
    966	buf->f_ffree = 0;	/* UNKNOWN */
    967	buf->f_fsid = u64_to_fsid(id);
    968	buf->f_namelen = BEFS_NAME_LEN;
    969
    970	befs_debug(sb, "<--- %s", __func__);
    971
    972	return 0;
    973}
    974
    975static struct dentry *
    976befs_mount(struct file_system_type *fs_type, int flags, const char *dev_name,
    977	    void *data)
    978{
    979	return mount_bdev(fs_type, flags, dev_name, data, befs_fill_super);
    980}
    981
    982static struct file_system_type befs_fs_type = {
    983	.owner		= THIS_MODULE,
    984	.name		= "befs",
    985	.mount		= befs_mount,
    986	.kill_sb	= kill_block_super,
    987	.fs_flags	= FS_REQUIRES_DEV,
    988};
    989MODULE_ALIAS_FS("befs");
    990
    991static int __init
    992init_befs_fs(void)
    993{
    994	int err;
    995
    996	pr_info("version: %s\n", BEFS_VERSION);
    997
    998	err = befs_init_inodecache();
    999	if (err)
   1000		goto unacquire_none;
   1001
   1002	err = register_filesystem(&befs_fs_type);
   1003	if (err)
   1004		goto unacquire_inodecache;
   1005
   1006	return 0;
   1007
   1008unacquire_inodecache:
   1009	befs_destroy_inodecache();
   1010
   1011unacquire_none:
   1012	return err;
   1013}
   1014
   1015static void __exit
   1016exit_befs_fs(void)
   1017{
   1018	befs_destroy_inodecache();
   1019
   1020	unregister_filesystem(&befs_fs_type);
   1021}
   1022
   1023/*
   1024 * Macros that typecheck the init and exit functions,
   1025 * ensures that they are called at init and cleanup,
   1026 * and eliminates warnings about unused functions.
   1027 */
   1028module_init(init_befs_fs)
   1029module_exit(exit_befs_fs)