patch 29/38: SERVER: allow resfh==fhp in fh_compose()

From: Kendrick M. Smith (kmsmith@umich.edu)
Date: Tue Aug 13 2002 - 18:08:52 EST


Change fh_compose() so that it will do the right thing if fhp==res_fh.
(This is convenient in the NFSv4 LOOKUP operation, which _replaces_
CURRENT_FH with the filehandle obtained by lookup.)

--- old/fs/nfsd/nfsfh.c Fri Aug 9 09:38:11 2002
+++ new/fs/nfsd/nfsfh.c Fri Aug 9 09:33:05 2002
@@ -316,7 +316,8 @@ fh_compose(struct svc_fh *fhp, struct sv
          * Then create a 32byte filehandle using nfs_fhbase_old
          *
          */
-
+ u8 ref_fh_version = 1;
+ u8 ref_fh_fsid_type = 1;
         struct inode * inode = dentry->d_inode;
         struct dentry *parent = dentry->d_parent;
         __u32 *datap;
@@ -326,6 +327,13 @@ fh_compose(struct svc_fh *fhp, struct sv
                 parent->d_name.name, dentry->d_name.name,
                 (inode ? inode->i_ino : 0));

+ if (ref_fh) {
+ ref_fh_version = ref_fh->fh_handle.fh_version;
+ ref_fh_fsid_type = ref_fh->fh_handle.fh_fsid_type;
+ if (ref_fh == fhp)
+ fh_put(ref_fh);
+ }
+
         if (fhp->fh_locked || fhp->fh_dentry) {
                 printk(KERN_ERR "fh_compose: fh %s/%s not initialized!\n",
                         parent->d_name.name, dentry->d_name.name);
@@ -337,8 +345,7 @@ fh_compose(struct svc_fh *fhp, struct sv
         fhp->fh_dentry = dentry; /* our internal copy */
         fhp->fh_export = exp;

- if (ref_fh &&
- ref_fh->fh_handle.fh_version == 0xca) {
+ if (ref_fh_version == 0xca) {
                 /* old style filehandle please */
                 memset(&fhp->fh_handle.fh_base, 0, NFS_FHSIZE);
                 fhp->fh_handle.fh_size = NFS_FHSIZE;
@@ -354,7 +361,7 @@ fh_compose(struct svc_fh *fhp, struct sv
                 fhp->fh_handle.fh_auth_type = 0;
                 datap = fhp->fh_handle.fh_auth+0;
                 if ((exp->ex_flags & NFSEXP_FSID) &&
- (!ref_fh || ref_fh->fh_handle.fh_fsid_type == 1)) {
+ (ref_fh_fsid_type == 1)) {
                         fhp->fh_handle.fh_fsid_type = 1;
                         /* fsid_type 1 == 4 bytes filesystem id */
                         *datap++ = exp->ex_fsid;

-
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/



This archive was generated by hypermail 2b29 : Thu Aug 15 2002 - 22:00:35 EST