From: "Diego Elio 'Flameeyes' Pettenò" <flameeyes@gmail.com>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] Add basic export support to HFS+.
Date: Thu, 04 Dec 2008 18:47:06 +0100 [thread overview]
Message-ID: <20081204174706.10397.94789.stgit@localhost> (raw)
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))) {
next reply other threads:[~2008-12-04 17:47 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-04 17:47 Diego Elio 'Flameeyes' Pettenò [this message]
2008-12-09 10:06 ` [PATCH] Add basic export support to HFS+ Christoph Hellwig
2008-12-09 14:16 ` Diego E. 'Flameeyes' Pettenò
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081204174706.10397.94789.stgit@localhost \
--to=flameeyes@gmail.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.