Skip to content

Commit

Permalink
fs/affs: make affs exportable
Browse files Browse the repository at this point in the history
Add standard functions making AFFS work with NFS.

Functions based on ext4 implementation.  Tested on loop device.

Link: http://lkml.kernel.org/r/20170109191208.6085-4-fabf@skynet.be
Signed-off-by: Fabian Frederick <fabf@skynet.be>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Fabian Frederick authored and torvalds committed Feb 28, 2017
1 parent d5de9fd commit ed4433d
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 0 deletions.
1 change: 1 addition & 0 deletions fs/affs/affs.h
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ extern void affs_free_bitmap(struct super_block *sb);

/* namei.c */

extern const struct export_operations affs_export_ops;
extern int affs_hash_name(struct super_block *sb, const u8 *name, unsigned int len);
extern struct dentry *affs_lookup(struct inode *dir, struct dentry *dentry, unsigned int);
extern int affs_unlink(struct inode *dir, struct dentry *dentry);
Expand Down
40 changes: 40 additions & 0 deletions fs/affs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*/

#include "affs.h"
#include <linux/exportfs.h>

typedef int (*toupper_t)(int);

Expand Down Expand Up @@ -465,3 +466,42 @@ affs_rename(struct inode *old_dir, struct dentry *old_dentry,
affs_brelse(bh);
return retval;
}

static struct inode *affs_nfs_get_inode(struct super_block *sb, u64 ino,
u32 generation)
{
struct inode *inode;

if (!affs_validblock(sb, ino))
return ERR_PTR(-ESTALE);

inode = affs_iget(sb, ino);
if (IS_ERR(inode))
return ERR_CAST(inode);

if (generation && inode->i_generation != generation) {
iput(inode);
return ERR_PTR(-ESTALE);
}

return inode;
}

static struct dentry *affs_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,
affs_nfs_get_inode);
}

static struct dentry *affs_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,
affs_nfs_get_inode);
}

const struct export_operations affs_export_ops = {
.fh_to_dentry = affs_fh_to_dentry,
.fh_to_parent = affs_fh_to_parent,
};
1 change: 1 addition & 0 deletions fs/affs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,7 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
return -ENOMEM;
}

sb->s_export_op = &affs_export_ops;
pr_debug("s_flags=%lX\n", sb->s_flags);
return 0;
}
Expand Down

0 comments on commit ed4433d

Please sign in to comment.