Message ID | 1380220872-13597-1-git-send-email-bhalevy@primarydata.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
The actual XDR encoding doesn't have business being under fs/exportfs and should be in the NFSD code itself. -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 09/29/2013 05:16 AM, Christoph Hellwig wrote: > The actual XDR encoding doesn't have business being under fs/exportfs > and should be in the NFSD code itself. > This is so FSs will not depend on NFSD. Though the actual implementtation could be done via a vector that gets set at NFSD load. Though I would like to keep it here, because I have a patchset which implements pNFS without NFSD at all. It enables a set of IOCTLs or syscalls and uses the same exact FS interface introduced here but sends the info to a user mode server. Though again it can be just its own library without regard to exportfs at all. linked in by any user code that needs it. Cheers Boaz > -- > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2013-09-29 15:16, Christoph Hellwig wrote: > The actual XDR encoding doesn't have business being under fs/exportfs > and should be in the NFSD code itself. Hmm, I thought of it as in the family of fh encoding and decoding... But I'm not married to this idea. Benny > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Sep 30, 2013 at 06:15:17PM -0700, Boaz Harrosh wrote: > Though I would like to keep it here, because I have a patchset > which implements pNFS without NFSD at all. It enables a set > of IOCTLs or syscalls and uses the same exact FS interface > introduced here but sends the info to a user mode server. If you want your userlevel fs use ganesha. The kernel is a self-contained project and not a random library. -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2013-09-29 15:16, Christoph Hellwig wrote: > The actual XDR encoding doesn't have business being under fs/exportfs > and should be in the NFSD code itself. But then it will create a module dependency we want to avoid. Benny > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Oct 02, 2013 at 05:27:15PM +0300, Benny Halevy wrote: > On 2013-09-29 15:16, Christoph Hellwig wrote: > > The actual XDR encoding doesn't have business being under fs/exportfs > > and should be in the NFSD code itself. > > But then it will create a module dependency we want to avoid. Not for the current patchset where the only consumer is nfsd.ko, and not for any method scheme that isn't braindead. -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/exportfs/nfs4filelayoutxdr.c b/fs/exportfs/nfs4filelayoutxdr.c index 4801bfe..f63c311 100644 --- a/fs/exportfs/nfs4filelayoutxdr.c +++ b/fs/exportfs/nfs4filelayoutxdr.c @@ -31,6 +31,8 @@ */ #include <linux/exp_xdr.h> #include <linux/module.h> +#include <linux/nfs4.h> +#include <linux/nfsd/nfsfh.h> #include <linux/nfsd/nfs4layoutxdr.h> /* We do our-own dprintk so filesystems are not dependent on sunrpc */ @@ -131,3 +133,86 @@ static int fl_devinfo_xdr_words(const struct pnfs_filelayout_device *fdev) return error; } EXPORT_SYMBOL(filelayout_encode_devinfo); + +/* Encodes the loc_body structure from draft 13 + * on the response stream. + * Use linux error codes (not nfs) since these values are being + * returned to the file system. + */ +enum nfsstat4 +filelayout_encode_layout(struct exp_xdr_stream *xdr, + const struct pnfs_filelayout_layout *flp) +{ + u32 len = 0, nfl_util, fhlen, i; + u32 *layoutlen_p; + enum nfsstat4 nfserr; + __be32 *p; + + dprintk("%s: device_id %llx:%llx fsi %u, numfh %u\n", + __func__, + flp->device_id.pnfs_fsid, + flp->device_id.pnfs_devid, + flp->lg_first_stripe_index, + flp->lg_fh_length); + + /* Ensure file system added at least one file handle */ + if (flp->lg_fh_length <= 0) { + dprintk("%s: File Layout has no file handles!!\n", __func__); + nfserr = NFS4ERR_LAYOUTUNAVAILABLE; + goto out; + } + + /* Ensure room for len, devid, util, first_stripe_index, + * pattern_offset, number of filehandles */ + p = layoutlen_p = exp_xdr_reserve_qwords(xdr, 1+2+2+1+1+2+1); + if (!p) { + nfserr = NFS4ERR_TOOSMALL; + goto out; + } + + /* save spot for opaque file layout length, fill-in later*/ + p++; + + /* encode device id */ + p = exp_xdr_encode_u64(p, flp->device_id.sbid); + p = exp_xdr_encode_u64(p, flp->device_id.devid); + + /* set and encode flags */ + nfl_util = flp->lg_stripe_unit; + if (flp->lg_commit_through_mds) + nfl_util |= NFL4_UFLG_COMMIT_THRU_MDS; + if (flp->lg_stripe_type == STRIPE_DENSE) + nfl_util |= NFL4_UFLG_DENSE; + p = exp_xdr_encode_u32(p, nfl_util); + + /* encode first stripe index */ + p = exp_xdr_encode_u32(p, flp->lg_first_stripe_index); + + /* encode striping pattern start */ + p = exp_xdr_encode_u64(p, flp->lg_pattern_offset); + + /* encode number of file handles */ + p = exp_xdr_encode_u32(p, flp->lg_fh_length); + + /* encode file handles */ + for (i = 0; i < flp->lg_fh_length; i++) { + fhlen = flp->lg_fh_list[i].fh_size; + p = exp_xdr_reserve_space(xdr, 4 + fhlen); + if (!p) { + nfserr = NFS4ERR_TOOSMALL; + goto out; + } + p = exp_xdr_encode_opaque(p, &flp->lg_fh_list[i].fh_base, fhlen); + } + + /* Set number of bytes encoded = total_bytes_encoded - length var */ + len = (char *)p - (char *)layoutlen_p; + exp_xdr_encode_u32(layoutlen_p, len - 4); + + nfserr = NFS4_OK; +out: + dprintk("%s: End err %u xdrlen %d\n", + __func__, nfserr, len); + return nfserr; +} +EXPORT_SYMBOL(filelayout_encode_layout); diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index 017f1753..8e8b6a7 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -218,7 +218,7 @@ extern struct dentry *generic_fh_to_parent(struct super_block *sb, extern int filelayout_encode_devinfo(struct exp_xdr_stream *xdr, const struct pnfs_filelayout_device *fdev); -extern int filelayout_encode_layout(struct exp_xdr_stream *xdr, - const struct pnfs_filelayout_layout *flp); +extern enum nfsstat4 filelayout_encode_layout(struct exp_xdr_stream *xdr, + const struct pnfs_filelayout_layout *flp); #endif /* defined(CONFIG_EXPORTFS_FILE_LAYOUT) */ #endif /* LINUX_EXPORTFS_H */ diff --git a/include/linux/nfsd/nfs4layoutxdr.h b/include/linux/nfsd/nfs4layoutxdr.h index 752055f..dc7831a 100644 --- a/include/linux/nfsd/nfs4layoutxdr.h +++ b/include/linux/nfsd/nfs4layoutxdr.h @@ -35,6 +35,7 @@ #define NFSD_NFS4LAYOUTXDR_H #include <linux/sunrpc/xdr.h> +#include <linux/nfsd/nfsd4_pnfs.h> /* the nfsd4_pnfs_devlist dev_addr for the file layout type */ struct pnfs_filelayout_devaddr { @@ -55,4 +56,21 @@ struct pnfs_filelayout_device { struct pnfs_filelayout_multipath *fl_device_list; }; +struct pnfs_filelayout_layout { + u32 lg_layout_type; /* response */ + u32 lg_stripe_type; /* response */ + u32 lg_commit_through_mds; /* response */ + u64 lg_stripe_unit; /* response */ + u64 lg_pattern_offset; /* response */ + u32 lg_first_stripe_index; /* response */ + struct nfsd4_pnfs_deviceid device_id; /* response */ + u32 lg_fh_length; /* response */ + struct knfsd_fh *lg_fh_list; /* response */ +}; + +enum stripetype4 { + STRIPE_SPARSE = 1, + STRIPE_DENSE = 2 +}; + #endif /* NFSD_NFS4LAYOUTXDR_H */