[pnfs] [PATCH] Streamline error code checking for non-pnfs filesystems
seattleplus at gmail.com
seattleplus at gmail.com
Tue Oct 16 23:15:29 EDT 2007
From: Dean Hildebrand <seattleplus at gmail.com>
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 2874ac4..2919adb 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -903,6 +903,33 @@ nfsd4_verify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
}
#if defined(CONFIG_PNFS)
+
+static __be32
+nfsd4_layout_verify(struct super_block *sb, unsigned int layout_type)
+{
+ int status;
+ int type = sb->s_export_op->layout_type();
+
+ /* check to see if pNFS is supported. */
+ status = nfserr_layoutunavailable;
+ if (!sb->s_export_op->layout_type) {
+ printk("pNFS %s: Underlying file system does not support pNFS\n", __FUNCTION__);
+ goto out;
+ }
+
+ /* check to see if requested layout type is supported. */
+ status = nfserr_unknown_layouttype;
+ if (type != layout_type) {
+ printk("pNFS %s: requested layout type %d does not match suppored type %d\n",
+ __FUNCTION__, layout_type, type);
+ goto out;
+ }
+
+ status = nfs_ok;
+out:
+ return status;
+}
+
static __be32
nfsd4_getdevlist( struct svc_rqst *rqstp,
struct nfsd4_compound_state *cstate,
@@ -910,7 +937,7 @@ nfsd4_getdevlist( struct svc_rqst *rqstp,
{
struct super_block *sb;
struct svc_fh *current_fh = &cstate->current_fh;
- int type = 0, status = 0;
+ int status;
status = fh_verify(rqstp, current_fh, 0, MAY_NOP);
if (status) {
@@ -923,27 +950,29 @@ nfsd4_getdevlist( struct svc_rqst *rqstp,
if (!sb)
goto out;
- /* check to see if requested layout type is supported. */
- status = nfserr_unknown_layouttype;
- if (!sb->s_export_op->layout_type ||
- ((type = sb->s_export_op->layout_type()) != gdlp->gd_type)) {
+ /* Ensure underlying file system supports pNFS and,
+ * if so, the requested layout type
+ */
+ status = nfsd4_layout_verify(sb, gdlp->gd_type);
+ if (status)
+ goto out;
- printk("pNFS %s: requested layout type %d does not match suppored type %d\n", __FUNCTION__, gdlp->gd_type, type);
+ /* Do nothing if underlying file system does not support getdevicelist */
+ status = nfs_ok;
+ if (!sb->s_export_op->get_devicelist)
goto out;
- }
/* set the layouttype for encoding the devaddr */
gdlp->gd_ops = sb->s_export_op;
/* device list is allocated by underlying file system, and free'd
* via export_ops callback. */
- if (sb->s_export_op->get_devicelist) {
- status = sb->s_export_op->get_devicelist(sb, (void *)gdlp);
+ status = sb->s_export_op->get_devicelist(sb, (void *)gdlp);
+
+ dprintk("%s: status %d type %d maxcount %d len %d\n",
+ __FUNCTION__, status, gdlp->gd_type, gdlp->gd_maxcount,
+ gdlp->gd_devlist_len);
- dprintk("%s: status %d type %d maxcount %d len %d\n",
- __FUNCTION__, status, gdlp->gd_type, gdlp->gd_maxcount,
- gdlp->gd_devlist_len);
- }
if (gdlp->gd_devlist_len < 0)
status = nfserr_inval;
out:
@@ -958,7 +987,7 @@ nfsd4_layoutget( struct svc_rqst *rqstp,
struct nfsd4_compound_state *cstate,
struct nfsd4_pnfs_layoutget *lgp)
{
- int type = 0, status = 0;
+ int status;
struct super_block *sb;
struct current_session *current_ses = cstate->current_ses;
struct svc_fh *current_fh = &cstate->current_fh;
@@ -974,19 +1003,17 @@ nfsd4_layoutget( struct svc_rqst *rqstp,
if (!sb)
goto out;
- /* check to see if requested layout type is supported. */
- status = nfserr_unknown_layouttype;
- if (!sb->s_export_op->layout_type ||
- ((type = sb->s_export_op->layout_type()) != lgp->lg_seg.layout_type)) {
-
- dprintk("pNFS %s: requested layout type %d does not match suppored type %d\n",
- __FUNCTION__, lgp->lg_seg.layout_type, type);
+ /* Ensure underlying file system supports pNFS and,
+ * if so, the requested layout type
+ */
+ status = nfsd4_layout_verify(sb, lgp->lg_seg.layout_type);
+ if (status)
goto out;
- }
+ /* check to see if pNFS is supported. */
status = nfserr_layoutunavailable;
if (!sb->s_export_op->layout_get) {
- dprintk("pNFS %s: layout_get not implemented for layout type %d\n", __FUNCTION__, type);
+ printk("pNFS %s: Underlying file system does not support layout_get\n", __FUNCTION__);
goto out;
}
@@ -1034,7 +1061,22 @@ nfsd4_layoutcommit(struct svc_rqst *rqstp,
goto out;
}
+ status = nfserr_inval;
ino = current_fh->fh_dentry->d_inode;
+ if (!ino)
+ goto out;
+
+ status = nfserr_inval;
+ sb = ino->i_sb;
+ if (!sb)
+ goto out;
+
+ /* Ensure underlying file system supports pNFS and,
+ * if so, the requested layout type
+ */
+ status = nfsd4_layout_verify(sb, lcp->lc_seg.layout_type);
+ if (status)
+ goto out;
/* This will only extend the file length. Do a quick
* check to see if there is any point in waiting for the update
@@ -1059,7 +1101,6 @@ nfsd4_layoutcommit(struct svc_rqst *rqstp,
dprintk("%s: Modifying file size\n", __FUNCTION__);
ia.ia_valid = ATTR_SIZE;
ia.ia_size = lcp->lc_last_wr + 1;
- sb = current_fh->fh_dentry->d_inode->i_sb;
if (sb->s_export_op->layout_commit) {
status = sb->s_export_op->layout_commit(ino, lcp);
dprintk("%s:layout_commit result %d\n", __FUNCTION__, status);
@@ -1094,7 +1135,7 @@ nfsd4_layoutreturn(struct svc_rqst *rqstp,
struct nfsd4_compound_state *cstate,
struct nfsd4_pnfs_layoutreturn *lrp)
{
- int type = 0, status = 0;
+ int status;
struct super_block *sb;
struct current_session *current_ses = cstate->current_ses;
struct svc_fh *current_fh = &cstate->current_fh;
@@ -1110,14 +1151,13 @@ nfsd4_layoutreturn(struct svc_rqst *rqstp,
if (!sb)
goto out;
- /* check to see if requested layout type is supported. */
- status = nfserr_unknown_layouttype;
- if (!sb->s_export_op->layout_type ||
- ((type = sb->s_export_op->layout_type()) != lrp->lr_seg.layout_type)) {
-
- printk("pNFS %s: requested layout type %d does not match suppored type %d\n", __FUNCTION__, lrp->lr_seg.layout_type, type);
+ /* Ensure underlying file system supports pNFS and,
+ * if so, the requested layout type
+ */
+ status = nfsd4_layout_verify(sb, lrp->lr_seg.layout_type);
+ if (status)
goto out;
- }
+
status = nfserr_inval;
if (lrp->lr_return_type != RETURN_FILE &&
lrp->lr_return_type != RETURN_FSID &&
@@ -1152,7 +1192,7 @@ nfsd4_getdevinfo(struct svc_rqst *rqstp,
{
struct super_block *sb;
struct svc_fh *current_fh = &cstate->current_fh;
- int type = 0, status;
+ int status;
printk("%s: type %d dev_id %d\n",
__FUNCTION__, gdp->gd_type, gdp->gd_dev_id);
@@ -1168,26 +1208,25 @@ nfsd4_getdevinfo(struct svc_rqst *rqstp,
if (!sb)
goto out;
- /* check to see if requested layout type is supported. */
- status = nfserr_unknown_layouttype;
- if (!sb->s_export_op->layout_type ||
- ((type = sb->s_export_op->layout_type()) != gdp->gd_type)) {
+ /* Ensure underlying file system supports pNFS and,
+ * if so, the requested layout type
+ */
+ status = nfsd4_layout_verify(sb, gdp->gd_type);
+ if (status)
+ goto out;
- printk("pNFS %s: requested layout type %d does not match suppored type %d\n", __FUNCTION__, gdp->gd_type, type);
+ /* Do nothing if underlying file system does not support getdeviceinfo */
+ status = nfs_ok;
+ if (!sb->s_export_op->get_deviceinfo)
goto out;
-}
/* set the ops for encoding the devaddr */
gdp->gd_ops = sb->s_export_op;
- if (sb && sb->s_export_op->get_deviceinfo) {
- status = sb->s_export_op->get_deviceinfo(sb, (void *)gdp);
+ status = sb->s_export_op->get_deviceinfo(sb, (void *)gdp);
- dprintk("%s: status %d type %d dev_id %d\n",
- __FUNCTION__, status, gdp->gd_type, gdp->gd_dev_id);
- goto out;
- }
- printk("%s: failed, no support\n",__FUNCTION__);
+ dprintk("%s: status %d type %d dev_id %d\n",
+ __FUNCTION__, status, gdp->gd_type, gdp->gd_dev_id);
out:
return status;
}
--
1.5.2.4
More information about the pNFS
mailing list