Commit fc26901b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'befs-v4.10-rc1' of git://github.com/luisbg/linux-befs

Pull befs updates from Luis de Bethencourt:
 "A series of small fixes and adding NFS export support"

* tag 'befs-v4.10-rc1' of git://github.com/luisbg/linux-befs:
  befs: add NFS export support
  befs: remove trailing whitespaces
  befs: remove signatures from comments
  befs: fix style issues in header files
  befs: fix style issues in linuxvfs.c
  befs: fix typos in linuxvfs.c
  befs: fix style issues in io.c
  befs: fix style issues in inode.c
  befs: fix style issues in debug.c
parents 01302aac ac632f5b
...@@ -129,6 +129,7 @@ static inline befs_inode_addr ...@@ -129,6 +129,7 @@ static inline befs_inode_addr
blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno) blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno)
{ {
befs_inode_addr iaddr; befs_inode_addr iaddr;
iaddr.allocation_group = blockno >> BEFS_SB(sb)->ag_shift; iaddr.allocation_group = blockno >> BEFS_SB(sb)->ag_shift;
iaddr.start = iaddr.start =
blockno - (iaddr.allocation_group << BEFS_SB(sb)->ag_shift); blockno - (iaddr.allocation_group << BEFS_SB(sb)->ag_shift);
...@@ -140,7 +141,7 @@ blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno) ...@@ -140,7 +141,7 @@ blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno)
static inline unsigned int static inline unsigned int
befs_iaddrs_per_block(struct super_block *sb) befs_iaddrs_per_block(struct super_block *sb)
{ {
return BEFS_SB(sb)->block_size / sizeof (befs_disk_inode_addr); return BEFS_SB(sb)->block_size / sizeof(befs_disk_inode_addr);
} }
#include "endian.h" #include "endian.h"
......
...@@ -55,12 +55,12 @@ enum super_flags { ...@@ -55,12 +55,12 @@ enum super_flags {
}; };
#define BEFS_BYTEORDER_NATIVE 0x42494745 #define BEFS_BYTEORDER_NATIVE 0x42494745
#define BEFS_BYTEORDER_NATIVE_LE (__force fs32)cpu_to_le32(BEFS_BYTEORDER_NATIVE) #define BEFS_BYTEORDER_NATIVE_LE ((__force fs32)cpu_to_le32(BEFS_BYTEORDER_NATIVE))
#define BEFS_BYTEORDER_NATIVE_BE (__force fs32)cpu_to_be32(BEFS_BYTEORDER_NATIVE) #define BEFS_BYTEORDER_NATIVE_BE ((__force fs32)cpu_to_be32(BEFS_BYTEORDER_NATIVE))
#define BEFS_SUPER_MAGIC BEFS_SUPER_MAGIC1 #define BEFS_SUPER_MAGIC BEFS_SUPER_MAGIC1
#define BEFS_SUPER_MAGIC1_LE (__force fs32)cpu_to_le32(BEFS_SUPER_MAGIC1) #define BEFS_SUPER_MAGIC1_LE ((__force fs32)cpu_to_le32(BEFS_SUPER_MAGIC1))
#define BEFS_SUPER_MAGIC1_BE (__force fs32)cpu_to_be32(BEFS_SUPER_MAGIC1) #define BEFS_SUPER_MAGIC1_BE ((__force fs32)cpu_to_be32(BEFS_SUPER_MAGIC1))
/* /*
* Flags of inode * Flags of inode
...@@ -79,7 +79,7 @@ enum inode_flags { ...@@ -79,7 +79,7 @@ enum inode_flags {
BEFS_INODE_WAS_WRITTEN = 0x00020000, BEFS_INODE_WAS_WRITTEN = 0x00020000,
BEFS_NO_TRANSACTION = 0x00040000, BEFS_NO_TRANSACTION = 0x00040000,
}; };
/* /*
* On-Disk datastructures of BeFS * On-Disk datastructures of BeFS
*/ */
...@@ -139,7 +139,7 @@ typedef struct { ...@@ -139,7 +139,7 @@ typedef struct {
} PACKED befs_super_block; } PACKED befs_super_block;
/* /*
* Note: the indirect and dbl_indir block_runs may * Note: the indirect and dbl_indir block_runs may
* be longer than one block! * be longer than one block!
*/ */
......
...@@ -12,8 +12,8 @@ ...@@ -12,8 +12,8 @@
* *
* Dominic Giampaolo, author of "Practical File System * Dominic Giampaolo, author of "Practical File System
* Design with the Be File System", for such a helpful book. * Design with the Be File System", for such a helpful book.
* *
* Marcus J. Ranum, author of the b+tree package in * Marcus J. Ranum, author of the b+tree package in
* comp.sources.misc volume 10. This code is not copied from that * comp.sources.misc volume 10. This code is not copied from that
* work, but it is partially based on it. * work, but it is partially based on it.
* *
...@@ -38,38 +38,38 @@ ...@@ -38,38 +38,38 @@
*/ */
/* Befs B+tree structure: /* Befs B+tree structure:
* *
* The first thing in the tree is the tree superblock. It tells you * The first thing in the tree is the tree superblock. It tells you
* all kinds of useful things about the tree, like where the rootnode * all kinds of useful things about the tree, like where the rootnode
* is located, and the size of the nodes (always 1024 with current version * is located, and the size of the nodes (always 1024 with current version
* of BeOS). * of BeOS).
* *
* The rest of the tree consists of a series of nodes. Nodes contain a header * The rest of the tree consists of a series of nodes. Nodes contain a header
* (struct befs_btree_nodehead), the packed key data, an array of shorts * (struct befs_btree_nodehead), the packed key data, an array of shorts
* containing the ending offsets for each of the keys, and an array of * containing the ending offsets for each of the keys, and an array of
* befs_off_t values. In interior nodes, the keys are the ending keys for * befs_off_t values. In interior nodes, the keys are the ending keys for
* the childnode they point to, and the values are offsets into the * the childnode they point to, and the values are offsets into the
* datastream containing the tree. * datastream containing the tree.
*/ */
/* Note: /* Note:
* *
* The book states 2 confusing things about befs b+trees. First, * The book states 2 confusing things about befs b+trees. First,
* it states that the overflow field of node headers is used by internal nodes * it states that the overflow field of node headers is used by internal nodes
* to point to another node that "effectively continues this one". Here is what * to point to another node that "effectively continues this one". Here is what
* I believe that means. Each key in internal nodes points to another node that * I believe that means. Each key in internal nodes points to another node that
* contains key values less than itself. Inspection reveals that the last key * contains key values less than itself. Inspection reveals that the last key
* in the internal node is not the last key in the index. Keys that are * in the internal node is not the last key in the index. Keys that are
* greater than the last key in the internal node go into the overflow node. * greater than the last key in the internal node go into the overflow node.
* I imagine there is a performance reason for this. * I imagine there is a performance reason for this.
* *
* Second, it states that the header of a btree node is sufficient to * Second, it states that the header of a btree node is sufficient to
* distinguish internal nodes from leaf nodes. Without saying exactly how. * distinguish internal nodes from leaf nodes. Without saying exactly how.
* After figuring out the first, it becomes obvious that internal nodes have * After figuring out the first, it becomes obvious that internal nodes have
* overflow nodes and leafnodes do not. * overflow nodes and leafnodes do not.
*/ */
/* /*
* Currently, this code is only good for directory B+trees. * Currently, this code is only good for directory B+trees.
* In order to be used for other BFS indexes, it needs to be extended to handle * In order to be used for other BFS indexes, it needs to be extended to handle
* duplicate keys and non-string keytypes (int32, int64, float, double). * duplicate keys and non-string keytypes (int32, int64, float, double).
...@@ -237,8 +237,8 @@ befs_bt_read_node(struct super_block *sb, const befs_data_stream *ds, ...@@ -237,8 +237,8 @@ befs_bt_read_node(struct super_block *sb, const befs_data_stream *ds,
* with @key (usually the disk block number of an inode). * with @key (usually the disk block number of an inode).
* *
* On failure, returns BEFS_ERR or BEFS_BT_NOT_FOUND. * On failure, returns BEFS_ERR or BEFS_BT_NOT_FOUND.
* *
* Algorithm: * Algorithm:
* Read the superblock and rootnode of the b+tree. * Read the superblock and rootnode of the b+tree.
* Drill down through the interior nodes using befs_find_key(). * Drill down through the interior nodes using befs_find_key().
* Once at the correct leaf node, use befs_find_key() again to get the * Once at the correct leaf node, use befs_find_key() again to get the
...@@ -402,12 +402,12 @@ befs_find_key(struct super_block *sb, struct befs_btree_node *node, ...@@ -402,12 +402,12 @@ befs_find_key(struct super_block *sb, struct befs_btree_node *node,
* *
* Here's how it works: Key_no is the index of the key/value pair to * Here's how it works: Key_no is the index of the key/value pair to
* return in keybuf/value. * return in keybuf/value.
* Bufsize is the size of keybuf (BEFS_NAME_LEN+1 is a good size). Keysize is * Bufsize is the size of keybuf (BEFS_NAME_LEN+1 is a good size). Keysize is
* the number of characters in the key (just a convenience). * the number of characters in the key (just a convenience).
* *
* Algorithm: * Algorithm:
* Get the first leafnode of the tree. See if the requested key is in that * Get the first leafnode of the tree. See if the requested key is in that
* node. If not, follow the node->right link to the next leafnode. Repeat * node. If not, follow the node->right link to the next leafnode. Repeat
* until the (key_no)th key is found or the tree is out of keys. * until the (key_no)th key is found or the tree is out of keys.
*/ */
int int
...@@ -536,7 +536,7 @@ befs_btree_read(struct super_block *sb, const befs_data_stream *ds, ...@@ -536,7 +536,7 @@ befs_btree_read(struct super_block *sb, const befs_data_stream *ds,
* @node_off: Pointer to offset of current node within datastream. Modified * @node_off: Pointer to offset of current node within datastream. Modified
* by the function. * by the function.
* *
* Helper function for btree traverse. Moves the current position to the * Helper function for btree traverse. Moves the current position to the
* start of the first leaf node. * start of the first leaf node.
* *
* Also checks for an empty tree. If there are no keys, returns BEFS_BT_EMPTY. * Also checks for an empty tree. If there are no keys, returns BEFS_BT_EMPTY.
...@@ -592,10 +592,10 @@ befs_btree_seekleaf(struct super_block *sb, const befs_data_stream *ds, ...@@ -592,10 +592,10 @@ befs_btree_seekleaf(struct super_block *sb, const befs_data_stream *ds,
} }
/** /**
* befs_leafnode - Determine if the btree node is a leaf node or an * befs_leafnode - Determine if the btree node is a leaf node or an
* interior node * interior node
* @node: Pointer to node structure to test * @node: Pointer to node structure to test
* *
* Return 1 if leaf, 0 if interior * Return 1 if leaf, 0 if interior
*/ */
static int static int
...@@ -656,7 +656,7 @@ befs_bt_valarray(struct befs_btree_node *node) ...@@ -656,7 +656,7 @@ befs_bt_valarray(struct befs_btree_node *node)
* @node: Pointer to the node structure to find the keydata array within * @node: Pointer to the node structure to find the keydata array within
* *
* Returns a pointer to the start of the keydata array * Returns a pointer to the start of the keydata array
* of the node pointed to by the node header * of the node pointed to by the node header
*/ */
static char * static char *
befs_bt_keydata(struct befs_btree_node *node) befs_bt_keydata(struct befs_btree_node *node)
...@@ -702,7 +702,7 @@ befs_bt_get_key(struct super_block *sb, struct befs_btree_node *node, ...@@ -702,7 +702,7 @@ befs_bt_get_key(struct super_block *sb, struct befs_btree_node *node,
/** /**
* befs_compare_strings - compare two strings * befs_compare_strings - compare two strings
* @key1: pointer to the first key to be compared * @key1: pointer to the first key to be compared
* @keylen1: length in bytes of key1 * @keylen1: length in bytes of key1
* @key2: pointer to the second key to be compared * @key2: pointer to the second key to be compared
* @keylen2: length in bytes of key2 * @keylen2: length in bytes of key2
......
/* /*
* btree.h * btree.h
* *
*/ */
int befs_btree_find(struct super_block *sb, const befs_data_stream *ds, int befs_btree_find(struct super_block *sb, const befs_data_stream *ds,
const char *key, befs_off_t * value); const char *key, befs_off_t *value);
int befs_btree_read(struct super_block *sb, const befs_data_stream *ds, int befs_btree_read(struct super_block *sb, const befs_data_stream *ds,
loff_t key_no, size_t bufsize, char *keybuf, loff_t key_no, size_t bufsize, char *keybuf,
size_t * keysize, befs_off_t * value); size_t *keysize, befs_off_t *value);
...@@ -84,13 +84,11 @@ befs_read_datastream(struct super_block *sb, const befs_data_stream *ds, ...@@ -84,13 +84,11 @@ befs_read_datastream(struct super_block *sb, const befs_data_stream *ds,
* *
* Takes a file position and gives back a brun who's starting block * Takes a file position and gives back a brun who's starting block
* is block number fblock of the file. * is block number fblock of the file.
* *
* Returns BEFS_OK or BEFS_ERR. * Returns BEFS_OK or BEFS_ERR.
* *
* Calls specialized functions for each of the three possible * Calls specialized functions for each of the three possible
* datastream regions. * datastream regions.
*
* 2001-11-15 Will Dyson
*/ */
int int
befs_fblock2brun(struct super_block *sb, const befs_data_stream *data, befs_fblock2brun(struct super_block *sb, const befs_data_stream *data,
...@@ -120,7 +118,7 @@ befs_fblock2brun(struct super_block *sb, const befs_data_stream *data, ...@@ -120,7 +118,7 @@ befs_fblock2brun(struct super_block *sb, const befs_data_stream *data,
/** /**
* befs_read_lsmylink - read long symlink from datastream. * befs_read_lsmylink - read long symlink from datastream.
* @sb: Filesystem superblock * @sb: Filesystem superblock
* @ds: Datastream to read from * @ds: Datastream to read from
* @buff: Buffer in which to place long symlink data * @buff: Buffer in which to place long symlink data
* @len: Length of the long symlink in bytes * @len: Length of the long symlink in bytes
......
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
struct buffer_head *befs_read_datastream(struct super_block *sb, struct buffer_head *befs_read_datastream(struct super_block *sb,
const befs_data_stream *ds, const befs_data_stream *ds,
befs_off_t pos, uint * off); befs_off_t pos, uint *off);
int befs_fblock2brun(struct super_block *sb, const befs_data_stream *data, int befs_fblock2brun(struct super_block *sb, const befs_data_stream *data,
befs_blocknr_t fblock, befs_block_run * run); befs_blocknr_t fblock, befs_block_run *run);
size_t befs_read_lsymlink(struct super_block *sb, const befs_data_stream *data, size_t befs_read_lsymlink(struct super_block *sb, const befs_data_stream *data,
void *buff, befs_off_t len); void *buff, befs_off_t len);
...@@ -17,4 +17,3 @@ befs_blocknr_t befs_count_blocks(struct super_block *sb, ...@@ -17,4 +17,3 @@ befs_blocknr_t befs_count_blocks(struct super_block *sb,
const befs_data_stream *ds); const befs_data_stream *ds);
extern const befs_inode_addr BAD_IADDR; extern const befs_inode_addr BAD_IADDR;
/* /*
* linux/fs/befs/debug.c * linux/fs/befs/debug.c
* *
* Copyright (C) 2001 Will Dyson (will_dyson at pobox.com) * Copyright (C) 2001 Will Dyson (will_dyson at pobox.com)
* *
* With help from the ntfs-tng driver by Anton Altparmakov * With help from the ntfs-tng driver by Anton Altparmakov
...@@ -57,6 +57,7 @@ befs_debug(const struct super_block *sb, const char *fmt, ...) ...@@ -57,6 +57,7 @@ befs_debug(const struct super_block *sb, const char *fmt, ...)
struct va_format vaf; struct va_format vaf;
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
vaf.fmt = fmt; vaf.fmt = fmt;
vaf.va = &args; vaf.va = &args;
...@@ -67,7 +68,7 @@ befs_debug(const struct super_block *sb, const char *fmt, ...) ...@@ -67,7 +68,7 @@ befs_debug(const struct super_block *sb, const char *fmt, ...)
} }
void void
befs_dump_inode(const struct super_block *sb, befs_inode * inode) befs_dump_inode(const struct super_block *sb, befs_inode *inode)
{ {
#ifdef CONFIG_BEFS_DEBUG #ifdef CONFIG_BEFS_DEBUG
...@@ -151,7 +152,7 @@ befs_dump_inode(const struct super_block *sb, befs_inode * inode) ...@@ -151,7 +152,7 @@ befs_dump_inode(const struct super_block *sb, befs_inode * inode)
*/ */
void void
befs_dump_super_block(const struct super_block *sb, befs_super_block * sup) befs_dump_super_block(const struct super_block *sb, befs_super_block *sup)
{ {
#ifdef CONFIG_BEFS_DEBUG #ifdef CONFIG_BEFS_DEBUG
...@@ -202,7 +203,7 @@ befs_dump_super_block(const struct super_block *sb, befs_super_block * sup) ...@@ -202,7 +203,7 @@ befs_dump_super_block(const struct super_block *sb, befs_super_block * sup)
#if 0 #if 0
/* unused */ /* unused */
void void
befs_dump_small_data(const struct super_block *sb, befs_small_data * sd) befs_dump_small_data(const struct super_block *sb, befs_small_data *sd)
{ {
} }
...@@ -221,7 +222,8 @@ befs_dump_run(const struct super_block *sb, befs_disk_block_run run) ...@@ -221,7 +222,8 @@ befs_dump_run(const struct super_block *sb, befs_disk_block_run run)
#endif /* 0 */ #endif /* 0 */
void void
befs_dump_index_entry(const struct super_block *sb, befs_disk_btree_super * super) befs_dump_index_entry(const struct super_block *sb,
befs_disk_btree_super *super)
{ {
#ifdef CONFIG_BEFS_DEBUG #ifdef CONFIG_BEFS_DEBUG
...@@ -242,7 +244,7 @@ befs_dump_index_entry(const struct super_block *sb, befs_disk_btree_super * supe ...@@ -242,7 +244,7 @@ befs_dump_index_entry(const struct super_block *sb, befs_disk_btree_super * supe
} }
void void
befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead * node) befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead *node)
{ {
#ifdef CONFIG_BEFS_DEBUG #ifdef CONFIG_BEFS_DEBUG
......
/* /*
* inode.c * inode.c
* *
* Copyright (C) 2001 Will Dyson <will_dyson@pobox.com> * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com>
*/ */
...@@ -10,12 +10,12 @@ ...@@ -10,12 +10,12 @@
#include "inode.h" #include "inode.h"
/* /*
Validates the correctness of the befs inode * Validates the correctness of the befs inode
Returns BEFS_OK if the inode should be used, otherwise * Returns BEFS_OK if the inode should be used, otherwise
returns BEFS_BAD_INODE * returns BEFS_BAD_INODE
*/ */
int int
befs_check_inode(struct super_block *sb, befs_inode * raw_inode, befs_check_inode(struct super_block *sb, befs_inode *raw_inode,
befs_blocknr_t inode) befs_blocknr_t inode)
{ {
u32 magic1 = fs32_to_cpu(sb, raw_inode->magic1); u32 magic1 = fs32_to_cpu(sb, raw_inode->magic1);
......
/* /*
* inode.h * inode.h
* *
*/ */
int befs_check_inode(struct super_block *sb, befs_inode * raw_inode, int befs_check_inode(struct super_block *sb, befs_inode *raw_inode,
befs_blocknr_t inode); befs_blocknr_t inode);
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright (C) 2001 Will Dyson <will_dyson@pobox.com * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com
* *
* Based on portions of file.c and inode.c * Based on portions of file.c and inode.c
* by Makoto Kato (m_kato@ga2.so-net.ne.jp) * by Makoto Kato (m_kato@ga2.so-net.ne.jp)
* *
* Many thanks to Dominic Giampaolo, author of Practical File System * Many thanks to Dominic Giampaolo, author of Practical File System
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
/* /*
* Converts befs notion of disk addr to a disk offset and uses * Converts befs notion of disk addr to a disk offset and uses
* linux kernel function sb_bread() to get the buffer containing * linux kernel function sb_bread() to get the buffer containing
* the offset. -Will Dyson * the offset.
*
*/ */
struct buffer_head * struct buffer_head *
...@@ -55,7 +54,7 @@ befs_bread_iaddr(struct super_block *sb, befs_inode_addr iaddr) ...@@ -55,7 +54,7 @@ befs_bread_iaddr(struct super_block *sb, befs_inode_addr iaddr)
befs_debug(sb, "<--- %s", __func__); befs_debug(sb, "<--- %s", __func__);
return bh; return bh;
error: error:
befs_debug(sb, "<--- %s ERROR", __func__); befs_debug(sb, "<--- %s ERROR", __func__);
return NULL; return NULL;
} }
...@@ -4,4 +4,3 @@ ...@@ -4,4 +4,3 @@
struct buffer_head *befs_bread_iaddr(struct super_block *sb, struct buffer_head *befs_bread_iaddr(struct super_block *sb,
befs_inode_addr iaddr); befs_inode_addr iaddr);
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/parser.h> #include <linux/parser.h>
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/exportfs.h>
#include "befs.h" #include "befs.h"
#include "btree.h" #include "btree.h"
...@@ -37,7 +38,8 @@ static int befs_readdir(struct file *, struct dir_context *); ...@@ -37,7 +38,8 @@ static int befs_readdir(struct file *, struct dir_context *);
static int befs_get_block(struct inode *, sector_t, struct buffer_head *, int); static int befs_get_block(struct inode *, sector_t, struct buffer_head *, int);
static int befs_readpage(struct file *file, struct page *page); static int befs_readpage(struct file *file, struct page *page);
static sector_t befs_bmap(struct address_space *mapping, sector_t block); static sector_t befs_bmap(struct address_space *mapping, sector_t block);
static struct dentry *befs_lookup(struct inode *, struct dentry *, unsigned int); static struct dentry *befs_lookup(struct inode *, struct dentry *,
unsigned int);
static struct inode *befs_iget(struct super_block *, unsigned long); static struct inode *befs_iget(struct super_block *, unsigned long);
static struct inode *befs_alloc_inode(struct super_block *sb); static struct inode *befs_alloc_inode(struct super_block *sb);
static void befs_destroy_inode(struct inode *inode); static void befs_destroy_inode(struct inode *inode);
...@@ -51,6 +53,10 @@ static void befs_put_super(struct super_block *); ...@@ -51,6 +53,10 @@ static void befs_put_super(struct super_block *);
static int befs_remount(struct super_block *, int *, char *); static int befs_remount(struct super_block *, int *, char *);
static int befs_statfs(struct dentry *, struct kstatfs *); static int befs_statfs(struct dentry *, struct kstatfs *);
static int parse_options(char *, struct befs_mount_options *); static int parse_options(char *, struct befs_mount_options *);
static struct dentry *befs_fh_to_dentry(struct super_block *sb,
struct fid *fid, int fh_len, int fh_type);
static struct dentry *befs_fh_to_parent(struct super_block *sb,
struct fid *fid, int fh_len, int fh_type);
static const struct super_operations befs_sops = { static const struct super_operations befs_sops = {
.alloc_inode = befs_alloc_inode, /* allocate a new inode */ .alloc_inode = befs_alloc_inode, /* allocate a new inode */
...@@ -83,9 +89,14 @@ static const struct address_space_operations befs_symlink_aops = { ...@@ -83,9 +89,14 @@ static const struct address_space_operations befs_symlink_aops = {
.readpage = befs_symlink_readpage, .readpage = befs_symlink_readpage,
}; };
/* static const struct export_operations befs_export_operations = {
.fh_to_dentry = befs_fh_to_dentry,
.fh_to_parent = befs_fh_to_parent,
};
/*
* Called by generic_file_read() to read a page of data * Called by generic_file_read() to read a page of data
* *
* In turn, simply calls a generic block read function and * In turn, simply calls a generic block read function and
* passes it the address of befs_get_block, for mapping file * passes it the address of befs_get_block, for mapping file
* positions to disk blocks. * positions to disk blocks.
...@@ -102,15 +113,13 @@ befs_bmap(struct address_space *mapping, sector_t block) ...@@ -102,15 +113,13 @@ befs_bmap(struct address_space *mapping, sector_t block)
return generic_block_bmap(mapping, block, befs_get_block); return generic_block_bmap(mapping, block, befs_get_block);
} }
/* /*
* Generic function to map a file position (block) to a * Generic function to map a file position (block) to a
* disk offset (passed back in bh_result). * disk offset (passed back in bh_result).
* *
* Used by many higher level functions. * Used by many higher level functions.
* *
* Calls befs_fblock2brun() in datastream.c to do the real work. * Calls befs_fblock2brun() in datastream.c to do the real work.
*
* -WD 10-26-01
*/ */
static int static int
...@@ -269,15 +278,15 @@ befs_alloc_inode(struct super_block *sb) ...@@ -269,15 +278,15 @@ befs_alloc_inode(struct super_block *sb)
struct befs_inode_info *bi; struct befs_inode_info *bi;
bi = kmem_cache_alloc(befs_inode_cachep, GFP_KERNEL); bi = kmem_cache_alloc(befs_inode_cachep, GFP_KERNEL);
if (!bi) if (!bi)
return NULL; return NULL;
return &bi->vfs_inode; return &bi->vfs_inode;
} }
static void befs_i_callback(struct rcu_head *head) static void befs_i_callback(struct rcu_head *head)
{ {
struct inode *inode = container_of(head, struct inode, i_rcu); struct inode *inode = container_of(head, struct inode, i_rcu);
kmem_cache_free(befs_inode_cachep, BEFS_I(inode)); kmem_cache_free(befs_inode_cachep, BEFS_I(inode));
} }
static void befs_destroy_inode(struct inode *inode) static void befs_destroy_inode(struct inode *inode)
...@@ -287,7 +296,7 @@ static void befs_destroy_inode(struct inode *inode) ...@@ -287,7 +296,7 @@ static void befs_destroy_inode(struct inode *inode)
static void init_once(void *foo) static void init_once(void *foo)
{ {
struct befs_inode_info *bi = (struct befs_inode_info *) foo; struct befs_inode_info *bi = (struct befs_inode_info *) foo;
inode_init_once(&bi->vfs_inode); inode_init_once(&bi->vfs_inode);
} }
...@@ -338,7 +347,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino) ...@@ -338,7 +347,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
/* /*
* set uid and gid. But since current BeOS is single user OS, so * set uid and gid. But since current BeOS is single user OS, so
* you can change by "uid" or "gid" options. * you can change by "uid" or "gid" options.
*/ */
inode->i_uid = befs_sb->mount_opts.use_uid ? inode->i_uid = befs_sb->mount_opts.use_uid ?
befs_sb->mount_opts.uid : befs_sb->mount_opts.uid :
...@@ -353,14 +362,14 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino) ...@@ -353,14 +362,14 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
* BEFS's time is 64 bits, but current VFS is 32 bits... * BEFS's time is 64 bits, but current VFS is 32 bits...
* BEFS don't have access time. Nor inode change time. VFS * BEFS don't have access time. Nor inode change time. VFS
* doesn't have creation time. * doesn't have creation time.
* Also, the lower 16 bits of the last_modified_time and * Also, the lower 16 bits of the last_modified_time and
* create_time are just a counter to help ensure uniqueness * create_time are just a counter to help ensure uniqueness
* for indexing purposes. (PFD, page 54) * for indexing purposes. (PFD, page 54)
*/ */
inode->i_mtime.tv_sec = inode->i_mtime.tv_sec =
fs64_to_cpu(sb, raw_inode->last_modified_time) >> 16; fs64_to_cpu(sb, raw_inode->last_modified_time) >> 16;
inode->i_mtime.tv_nsec = 0; /* lower 16 bits are not a time */ inode->i_mtime.tv_nsec = 0; /* lower 16 bits are not a time */
inode->i_ctime = inode->i_mtime; inode->i_ctime = inode->i_mtime;
inode->i_atime = inode->i_mtime; inode->i_atime = inode->i_mtime;
...@@ -414,10 +423,10 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino) ...@@ -414,10 +423,10 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
unlock_new_inode(inode); unlock_new_inode(inode);
return inode; return inode;
unacquire_bh: unacquire_bh:
brelse(bh); brelse(bh);
unacquire_none: unacquire_none:
iget_failed(inode); iget_failed(inode);
befs_debug(sb, "<--- %s - Bad inode", __func__); befs_debug(sb, "<--- %s - Bad inode", __func__);
return ERR_PTR(-EIO); return ERR_PTR(-EIO);
...@@ -442,7 +451,7 @@ befs_init_inodecache(void) ...@@ -442,7 +451,7 @@ befs_init_inodecache(void)
} }
/* Called at fs teardown. /* Called at fs teardown.
* *
* Taken from NFS implementation by Al Viro. * Taken from NFS implementation by Al Viro.
*/ */
static void static void
...@@ -491,13 +500,10 @@ static int befs_symlink_readpage(struct file *unused, struct page *page) ...@@ -491,13 +500,10 @@ static int befs_symlink_readpage(struct file *unused, struct page *page)
} }
/* /*
* UTF-8 to NLS charset convert routine * UTF-8 to NLS charset convert routine
*
* *
* Changed 8/10/01 by Will Dyson. Now use uni2char() / char2uni() rather than * Uses uni2char() / char2uni() rather than the nls tables directly
* the nls tables directly
*/ */
static int static int
befs_utf2nls(struct super_block *sb, const char *in, befs_utf2nls(struct super_block *sb, const char *in,
int in_len, char **out, int *out_len) int in_len, char **out, int *out_len)
...@@ -521,9 +527,8 @@ befs_utf2nls(struct super_block *sb, const char *in, ...@@ -521,9 +527,8 @@ befs_utf2nls(struct super_block *sb, const char *in,
} }
*out = result = kmalloc(maxlen, GFP_NOFS); *out = result = kmalloc(maxlen, GFP_NOFS);
if (!*out) { if (!*out)
return -ENOMEM; return -ENOMEM;
}
for (i = o = 0; i < in_len; i += utflen, o += unilen) { for (i = o = 0; i < in_len; i += utflen, o += unilen) {
...@@ -546,7 +551,7 @@ befs_utf2nls(struct super_block *sb, const char *in, ...@@ -546,7 +551,7 @@ befs_utf2nls(struct super_block *sb, const char *in,
return o; return o;
conv_err: conv_err:
befs_error(sb, "Name using character set %s contains a character that " befs_error(sb, "Name using character set %s contains a character that "
"cannot be converted to unicode.", nls->charset); "cannot be converted to unicode.", nls->charset);
befs_debug(sb, "<--- %s", __func__); befs_debug(sb, "<--- %s", __func__);
...@@ -561,18 +566,18 @@ befs_utf2nls(struct super_block *sb, const char *in, ...@@ -561,18 +566,18 @@ befs_utf2nls(struct super_block *sb, const char *in,
* @in_len: Length of input string in bytes * @in_len: Length of input string in bytes
* @out: The output string in UTF-8 format * @out: The output string in UTF-8 format
* @out_len: Length of the output buffer * @out_len: Length of the output buffer
* *
* Converts input string @in, which is in the format of the loaded NLS map, * Converts input string @in, which is in the format of the loaded NLS map,
* into a utf8 string. * into a utf8 string.
* *
* The destination string @out is allocated by this function and the caller is * The destination string @out is allocated by this function and the caller is
* responsible for freeing it with kfree() * responsible for freeing it with kfree()
* *
* On return, *@out_len is the length of @out in bytes. * On return, *@out_len is the length of @out in bytes.
* *
* On success, the return value is the number of utf8 characters written to * On success, the return value is the number of utf8 characters written to
* the output buffer @out. * the output buffer @out.
* *
* On Failure, a negative number coresponding to the error code is returned. * On Failure, a negative number coresponding to the error code is returned.
*/ */
...@@ -585,9 +590,11 @@ befs_nls2utf(struct super_block *sb, const char *in, ...@@ -585,9 +590,11 @@ befs_nls2utf(struct super_block *sb, const char *in,
wchar_t uni; wchar_t uni;
int unilen, utflen; int unilen, utflen;
char *result; char *result;
/* There're nls characters that will translate to 3-chars-wide UTF-8 /*
* characters, a additional byte is needed to save the final \0 * There are nls characters that will translate to 3-chars-wide UTF-8
* in special cases */ * characters, an additional byte is needed to save the final \0
* in special cases
*/
int maxlen = (3 * in_len) + 1; int maxlen = (3 * in_len) + 1;
befs_debug(sb, "---> %s\n", __func__); befs_debug(sb, "---> %s\n", __func__);
...@@ -624,14 +631,41 @@ befs_nls2utf(struct super_block *sb, const char *in, ...@@ -624,14 +631,41 @@ befs_nls2utf(struct super_block *sb, const char *in,
return i; return i;
conv_err: conv_err:
befs_error(sb, "Name using charecter set %s contains a charecter that " befs_error(sb, "Name using character set %s contains a character that "
"cannot be converted to unicode.", nls->charset); "cannot be converted to unicode.", nls->charset);
befs_debug(sb, "<--- %s", __func__); befs_debug(sb, "<--- %s", __func__);
kfree(result); kfree(result);
return -EILSEQ; return -EILSEQ;
} }
static struct inode *befs_nfs_get_inode(struct super_block *sb, uint64_t ino,
uint32_t generation)
{
/* No need to handle i_generation */
return befs_iget(sb, ino);
}
/*
* Map a NFS file handle to a corresponding dentry
*/
static struct dentry *befs_fh_to_dentry(struct super_block *sb,
struct fid *fid, int fh_len, int fh_type)
{
return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
befs_nfs_get_inode);
}
/*
* Find the parent for a file specified by NFS handle
*/
static struct dentry *befs_fh_to_parent(struct super_block *sb,
struct fid *fid, int fh_len, int fh_type)
{
return generic_fh_to_parent(sb, fid, fh_len, fh_type,
befs_nfs_get_inode);
}
enum { enum {
Opt_uid, Opt_gid, Opt_charset, Opt_debug, Opt_err, Opt_uid, Opt_gid, Opt_charset, Opt_debug, Opt_err,
}; };
...@@ -666,6 +700,7 @@ parse_options(char *options, struct befs_mount_options *opts) ...@@ -666,6 +700,7 @@ parse_options(char *options, struct befs_mount_options *opts)
while ((p = strsep(&options, ",")) != NULL) { while ((p = strsep(&options, ",")) != NULL) {
int token; int token;
if (!*p) if (!*p)
continue; continue;
...@@ -721,7 +756,7 @@ parse_options(char *options, struct befs_mount_options *opts) ...@@ -721,7 +756,7 @@ parse_options(char *options, struct befs_mount_options *opts)
} }
/* This function has the responsibiltiy of getting the /* This function has the responsibiltiy of getting the
* filesystem ready for unmounting. * filesystem ready for unmounting.
* Basically, we free everything that we allocated in * Basically, we free everything that we allocated in
* befs_read_inode * befs_read_inode
*/ */
...@@ -782,8 +817,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -782,8 +817,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
* Linux 2.4.10 and later refuse to read blocks smaller than * Linux 2.4.10 and later refuse to read blocks smaller than
* the logical block size for the device. But we also need to read at * the logical block size for the device. But we also need to read at
* least 1k to get the second 512 bytes of the volume. * least 1k to get the second 512 bytes of the volume.
* -WD 10-26-01 */
*/
blocksize = sb_min_blocksize(sb, 1024); blocksize = sb_min_blocksize(sb, 1024);
if (!blocksize) { if (!blocksize) {
if (!silent) if (!silent)
...@@ -791,7 +825,8 @@ befs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -791,7 +825,8 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
goto unacquire_priv_sbp; goto unacquire_priv_sbp;
} }
if (!(bh = sb_bread(sb, sb_block))) { bh = sb_bread(sb, sb_block);
if (!bh) {
if (!silent) if (!silent)
befs_error(sb, "unable to read superblock"); befs_error(sb, "unable to read superblock");
goto unacquire_priv_sbp; goto unacquire_priv_sbp;
...@@ -816,7 +851,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -816,7 +851,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
brelse(bh); brelse(bh);
if( befs_sb->num_blocks > ~((sector_t)0) ) { if (befs_sb->num_blocks > ~((sector_t)0)) {
if (!silent) if (!silent)
befs_error(sb, "blocks count: %llu is larger than the host can use", befs_error(sb, "blocks count: %llu is larger than the host can use",
befs_sb->num_blocks); befs_sb->num_blocks);
...@@ -831,6 +866,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -831,6 +866,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
/* Set real blocksize of fs */ /* Set real blocksize of fs */
sb_set_blocksize(sb, (ulong) befs_sb->block_size); sb_set_blocksize(sb, (ulong) befs_sb->block_size);
sb->s_op = &befs_sops; sb->s_op = &befs_sops;
sb->s_export_op = &befs_export_operations;
root = befs_iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir))); root = befs_iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir)));
if (IS_ERR(root)) { if (IS_ERR(root)) {
ret = PTR_ERR(root); ret = PTR_ERR(root);
...@@ -861,16 +897,16 @@ befs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -861,16 +897,16 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
} }
return 0; return 0;
/*****************/
unacquire_bh: unacquire_bh:
brelse(bh); brelse(bh);
unacquire_priv_sbp: unacquire_priv_sbp:
kfree(befs_sb->mount_opts.iocharset); kfree(befs_sb->mount_opts.iocharset);
kfree(sb->s_fs_info); kfree(sb->s_fs_info);
sb->s_fs_info = NULL; sb->s_fs_info = NULL;
unacquire_none: unacquire_none:
return ret; return ret;
} }
...@@ -919,7 +955,7 @@ static struct file_system_type befs_fs_type = { ...@@ -919,7 +955,7 @@ static struct file_system_type befs_fs_type = {
.name = "befs", .name = "befs",
.mount = befs_mount, .mount = befs_mount,
.kill_sb = kill_block_super, .kill_sb = kill_block_super,
.fs_flags = FS_REQUIRES_DEV, .fs_flags = FS_REQUIRES_DEV,
}; };
MODULE_ALIAS_FS("befs"); MODULE_ALIAS_FS("befs");
...@@ -956,9 +992,9 @@ exit_befs_fs(void) ...@@ -956,9 +992,9 @@ exit_befs_fs(void)
} }
/* /*
Macros that typecheck the init and exit functions, * Macros that typecheck the init and exit functions,
ensures that they are called at init and cleanup, * ensures that they are called at init and cleanup,
and eliminates warnings about unused functions. * and eliminates warnings about unused functions.
*/ */
module_init(init_befs_fs) module_init(init_befs_fs)
module_exit(exit_befs_fs) module_exit(exit_befs_fs)
...@@ -2,7 +2,5 @@ ...@@ -2,7 +2,5 @@
* super.h * super.h
*/ */
int befs_load_sb(struct super_block *sb, befs_super_block * disk_sb); int befs_load_sb(struct super_block *sb, befs_super_block *disk_sb);
int befs_check_sb(struct super_block *sb); int befs_check_sb(struct super_block *sb);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment