[PATCH 15/18] gfs2: new export ops

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxx>

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__ */
-
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux