Skip to contentSkip to conversation

kNFSd - Tidy up new filehandle type.

PATCH New NeilBrown 1 participant 1 message Mar 5, 2004 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): 20040305163625.1829.patches@notabene

NeilBrown

author
#1 lore raw

PATCH 1/1 kNFSd - Tidy up new filehandle type.

Hi Andrew,
I would really like this patch to go into 2.6.4. I think it is ready - it
is fairly simple and tested. But if it is too late, so be it.

A change was made to nfsd filehandles about 6 months ago when the 32bit dev_t stuff went in which I wasn't consulted on and I don't like. It basically wastes 32bits of the filehandle when the filesystem is on a device with a new/large device number. Not only don't I like it, but it broken handling for 'fsid=' for such filesystems.

This patch fixes it in an upwards-compatable way (so people already serving files from such a filesystem with a 2.6.3 kernel should not notice any issues). NeilBrown

======================================
nfsd uses several different mechanisms for identifying the filesystem from the filehandle.

This patch:
Marks type 2 as deprecated - it wastes space, and space if the filehandle
is not unlimited
Adds type 3 which handles new, large device number in 32bits of space Tidies up the code for determining which type to use in a newly created filehandle - the addition type 2 broke this code.

----------- Diffstat output ------------

 ./fs/nfsd/export.c           |   13 ++----
 ./fs/nfsd/nfsfh.c            |   80 +++++++++++++++++++++++++------------------
 ./include/linux/nfsd/nfsfh.h |   21 ++++++++++-
 3 files changed, 71 insertions(+), 43 deletions(-)
fs/nfsd/export.c renamed from fs/nfsd/export.c~current~ +4 -9
diff ./fs/nfsd/export.c~current~ ./fs/nfsd/export.c
@@ -56,11 +56,6 @@ static int		exp_verify_string(char *cp, 
 #define	EXPKEY_HASHMASK		(EXPKEY_HASHMAX -1)
 static struct cache_head *expkey_table[EXPKEY_HASHMAX];
 
-static inline int key_len(int type)
-{
-	return type == 0 ? 8 : type == 1 ? 4 : 12;
-}
-
 static inline int svc_expkey_hash(struct svc_expkey *item)
 {
 	int hash = item->ek_fsidtype;
@@ -547,8 +542,8 @@ exp_get_key(svc_client *clp, dev_t dev, 
 		mk_fsid_v0(fsidv, dev, ino);
 		return exp_find_key(clp, 0, fsidv, NULL);
 	}
-	mk_fsid_v2(fsidv, dev, ino);
-	return exp_find_key(clp, 2, fsidv, NULL);
+	mk_fsid_v3(fsidv, dev, ino);
+	return exp_find_key(clp, 3, fsidv, NULL);
 }
 
 /*
@@ -684,8 +679,8 @@ static int exp_hash(struct auth_domain *
 		mk_fsid_v0(fsid, dev, inode->i_ino);
 		return exp_set_key(clp, 0, fsid, exp);
 	}
-	mk_fsid_v2(fsid, dev, inode->i_ino);
-	return exp_set_key(clp, 2, fsid, exp);
+	mk_fsid_v3(fsid, dev, inode->i_ino);
+	return exp_set_key(clp, 3, fsid, exp);
 }
 
 static void exp_unhash(struct svc_export *exp)
fs/nfsd/nfsfh.c renamed from fs/nfsd/nfsfh.c~current~ +47 -33

122 lines not on this page · raw message

include/linux/nfsd/nfsfh.h renamed from include/linux/nfsd/nfsfh.h~current~ +20 -1
diff ./include/linux/nfsd/nfsfh.h~current~ ./include/linux/nfsd/nfsfh.h
@@ -66,8 +66,9 @@ struct nfs_fhbase_old {
  *     0  - 4 byte device id (ms-2-bytes major, ls-2-bytes minor), 4byte inode number
  *        NOTE: we cannot use the kdev_t device id value, because kdev_t.h
  *              says we mustn't.  We must break it up and reassemble.
- *  Possible future encodings:
  *     1  - 4 byte user specified identifier
+ *     2  - 4 byte major, 4 byte minor, 4 byte inode number - DEPRECATED
+ *     3  - 4 byte device id, encoded for user-space, 4 byte inode number
  *
  * The fileid_type identified how the file within the filesystem is encoded.
  * This is (will be) passed to, and set by, the underlying filesystem if it supports
@@ -114,6 +115,7 @@ struct knfsd_fh {
 #define	fh_auth_type		fh_base.fh_new.fb_auth_type
 #define	fh_fileid_type		fh_base.fh_new.fb_fileid_type
 #define	fh_auth			fh_base.fh_new.fb_auth
+#define	fh_fsid			fh_base.fh_new.fb_auth
 
 #ifdef __KERNEL__
 
@@ -183,6 +185,23 @@ static inline void mk_fsid_v2(u32 *fsidv
 	fsidv[2] = ino_t_to_u32(ino);
 }
 
+static inline void mk_fsid_v3(u32 *fsidv, dev_t dev, ino_t ino)
+{
+	fsidv[0] = new_encode_dev(dev);
+	fsidv[1] = ino_t_to_u32(ino);
+}
+
+static inline int key_len(int type)
+{
+	switch(type) {
+	case 0: return 8;
+	case 1: return 4;
+	case 2: return 12;
+	case 3: return 8;
+	default: return 0;
+	}
+}
+
 /*
  * Shorthand for dprintk()'s
  */

-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials Free Linux tutorial presented by Daniel Robbins, President and CEO of GenToo technologies. Learn everything from fundamentals to system administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs