linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 15/18] gfs2: new export ops
@ 2007-03-17  1:12 Christoph Hellwig
  0 siblings, 0 replies; only message in thread
From: Christoph Hellwig @ 2007-03-17  1:12 UTC (permalink / raw)
  To: nfs, linux-fsdevel

Convert gfs2 to the new ops.  It's a nice little cleanup that allows
to get rid of an data structure aswell.

Btw, it looks like the old code could scribble over random stack
memory for the parent case where gfs2_get_dentry access the imode
field in the gfs2_fh_obj structure but only gets a smaller 
gfs2_inum_host passed.


Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: linux-2.6/fs/gfs2/ops_export.c
===================================================================
--- linux-2.6.orig/fs/gfs2/ops_export.c	2007-03-13 18:18:17.000000000 +0100
+++ linux-2.6/fs/gfs2/ops_export.c	2007-03-13 18:19:09.000000000 +0100
@@ -27,42 +27,6 @@
 #include "rgrp.h"
 #include "util.h"
 
-static struct dentry *gfs2_decode_fh(struct super_block *sb,
-				     __u32 *p,
-				     int fh_len,
-				     int fh_type,
-				     int (*acceptable)(void *context,
-						       struct dentry *dentry),
-				     void *context)
-{
-	__be32 *fh = (__force __be32 *)p;
-	struct gfs2_fh_obj fh_obj;
-	struct gfs2_inum_host *this, parent;
-
-	this 		= &fh_obj.this;
-	fh_obj.imode 	= DT_UNKNOWN;
-	memset(&parent, 0, sizeof(struct gfs2_inum));
-
-	switch (fh_len) {
-	case GFS2_LARGE_FH_SIZE:
-		parent.no_formal_ino = ((u64)be32_to_cpu(fh[4])) << 32;
-		parent.no_formal_ino |= be32_to_cpu(fh[5]);
-		parent.no_addr = ((u64)be32_to_cpu(fh[6])) << 32;
-		parent.no_addr |= be32_to_cpu(fh[7]);
-		fh_obj.imode = be32_to_cpu(fh[8]);
-	case GFS2_SMALL_FH_SIZE:
-		this->no_formal_ino = ((u64)be32_to_cpu(fh[0])) << 32;
-		this->no_formal_ino |= be32_to_cpu(fh[1]);
-		this->no_addr = ((u64)be32_to_cpu(fh[2])) << 32;
-		this->no_addr |= be32_to_cpu(fh[3]);
-		break;
-	default:
-		return NULL;
-	}
-
-	return gfs2_export_ops.find_exported_dentry(sb, &fh_obj, &parent,
-						    acceptable, context);
-}
 
 static int gfs2_encode_fh(struct dentry *dentry, __u32 *p, int *len,
 			  int connectable)
@@ -190,11 +154,10 @@ static struct dentry *gfs2_get_parent(st
 	return dentry;
 }
 
-static struct dentry *gfs2_get_dentry(struct super_block *sb, void *inum_obj)
+static struct dentry *gfs2_get_dentry(struct super_block *sb,
+		struct gfs2_inum_host *inum, u32 imode)
 {
 	struct gfs2_sbd *sdp = sb->s_fs_info;
-	struct gfs2_fh_obj *fh_obj = (struct gfs2_fh_obj *)inum_obj;
-	struct gfs2_inum_host *inum = &fh_obj->this;
 	struct gfs2_holder i_gh, ri_gh, rgd_gh;
 	struct gfs2_rgrpd *rgd;
 	struct inode *inode;
@@ -237,7 +200,7 @@ static struct dentry *gfs2_get_dentry(st
 	gfs2_glock_dq_uninit(&rgd_gh);
 	gfs2_glock_dq_uninit(&ri_gh);
 
-	inode = gfs2_inode_lookup(sb, inum, fh_obj->imode);
+	inode = gfs2_inode_lookup(sb, inum, imode);
 	if (!inode)
 		goto fail;
 	if (IS_ERR(inode)) {
@@ -280,11 +243,46 @@ fail:
 	return ERR_PTR(error);
 }
 
+static struct dentry *gfs2_fh_to_dentry(struct super_block *sb, struct fid *fid,
+		int fh_len, int fh_type)
+{
+	struct gfs2_inum_host this;
+	__be32 *fh = (__force __be32 *)fid->raw;
+
+	if (fh_type != GFS2_LARGE_FH_SIZE && fh_type != GFS2_SMALL_FH_SIZE)
+		return NULL;
+
+	this.no_formal_ino = ((u64)be32_to_cpu(fh[0])) << 32;
+	this.no_formal_ino |= be32_to_cpu(fh[1]);
+	this.no_addr = ((u64)be32_to_cpu(fh[2])) << 32;
+	this.no_addr |= be32_to_cpu(fh[3]);
+
+	return gfs2_get_dentry(sb, &this,
+		fh_type == GFS2_LARGE_FH_SIZE ? be32_to_cpu(fh[8]) : 0);
+}
+
+static struct dentry *gfs2_fh_to_parent(struct super_block *sb, struct fid *fid,
+		int fh_len, int fh_type)
+{
+	struct gfs2_inum_host parent;
+	__be32 *fh = (__force __be32 *)fid->raw;
+
+	if (fh_type != GFS2_LARGE_FH_SIZE)
+		return NULL;
+
+	parent.no_formal_ino = ((u64)be32_to_cpu(fh[4])) << 32;
+	parent.no_formal_ino |= be32_to_cpu(fh[5]);
+	parent.no_addr = ((u64)be32_to_cpu(fh[6])) << 32;
+	parent.no_addr |= be32_to_cpu(fh[7]);
+
+	return gfs2_get_dentry(sb, &parent, 0);
+}
+
 struct export_operations gfs2_export_ops = {
-	.decode_fh = gfs2_decode_fh,
 	.encode_fh = gfs2_encode_fh,
+	.fh_to_dentry = gfs2_fh_to_dentry,
+	.fh_to_parent = gfs2_fh_to_parent,
 	.get_name = gfs2_get_name,
 	.get_parent = gfs2_get_parent,
-	.get_dentry = gfs2_get_dentry,
 };
 
Index: linux-2.6/fs/gfs2/ops_export.h
===================================================================
--- linux-2.6.orig/fs/gfs2/ops_export.h	2007-03-13 18:18:17.000000000 +0100
+++ linux-2.6/fs/gfs2/ops_export.h	2007-03-13 18:18:26.000000000 +0100
@@ -16,9 +16,5 @@
 #define GFS2_LARGE_FH_SIZE 10
 
 extern struct export_operations gfs2_export_ops;
-struct gfs2_fh_obj {
-	struct gfs2_inum_host this;
-	__u32            imode;
-};
 
 #endif /* __OPS_EXPORT_DOT_H__ */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-03-17  1:12 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-17  1:12 [PATCH 15/18] gfs2: new export ops Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).