Messages in this thread Patch in this message | | | From | Diego Elio 'Flameeyes' Pettenò <> | Subject | [PATCH] Add basic export support to HFS+. | Date | Thu, 04 Dec 2008 18:47:06 +0100 |
| |
From: Diego E. 'Flameeyes' Pettenò <flameeyes@gmail.com>
The functions' skeleton is taken from ext2/super.c and seems to work fine for R/W access to HFS+ non-journaled case-sensitive filesystems.
It's probably slow and has a lot of space for improvement but it's still better than having no hope to export HFS+ filesystems.
Signed-off-by: Diego E. 'Flameeyes' Pettenò <flameeyes@gmail.com> ---
fs/hfsplus/super.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index eb74531..45b48cc 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -11,6 +11,7 @@ #include <linux/init.h> #include <linux/pagemap.h> #include <linux/fs.h> +#include <linux/exportfs.h> #include <linux/slab.h> #include <linux/vfs.h> #include <linux/nls.h> @@ -281,6 +282,53 @@ static const struct super_operations hfsplus_sops = { .show_options = hfsplus_show_options, }; +static struct inode *hfsplus_export_get_inode(struct super_block *sb, + u64 ino, u32 generation) +{ + struct inode *inode; + + if (ino < HFSPLUS_FIRSTUSER_CNID && ino != HFSPLUS_ROOT_CNID) + return ERR_PTR(-ESTALE); + + /* iget isn't really right if the inode is currently unallocated!! + */ + inode = hfsplus_iget(sb, ino); + if (IS_ERR(inode)) + return ERR_CAST(inode); + if (generation && inode->i_generation != generation) { + /* we didn't find the right inode.. */ + iput(inode); + return ERR_PTR(-ESTALE); + } + return inode; +} + +static struct dentry *hfsplus_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, + hfsplus_export_get_inode); +} + +static struct dentry *hfsplus_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, + hfsplus_export_get_inode); +} + +/* Yes, most of these are left as NULL!! + * A NULL value implies the default, which (hopefully) works with + * hfs+-like file systems, but can be improved upon. + * Currently only fh_to_dentry is required. + */ +static const struct export_operations hfsplus_export_ops = { + .fh_to_dentry = hfsplus_fh_to_dentry, + .fh_to_parent = hfsplus_fh_to_parent, +}; + static int hfsplus_fill_super(struct super_block *sb, void *data, int silent) { struct hfsplus_vh *vhdr; @@ -345,6 +393,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent) /* Set up operations so we can load metadata */ sb->s_op = &hfsplus_sops; + sb->s_export_op = &hfsplus_export_ops; sb->s_maxbytes = MAX_LFS_FILESIZE; if (!(vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_UNMNT))) { -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |