@@ -75,8 +75,11 @@ find_pnfs_driver(u32 id)
void
unset_pnfs_layoutdriver(struct nfs_server *nfss)
{
- if (nfss->pnfs_curr_ld)
+ if (nfss->pnfs_curr_ld) {
+ if (nfss->pnfs_curr_ld->unset_layoutdriver)
+ nfss->pnfs_curr_ld->unset_layoutdriver(nfss);
module_put(nfss->pnfs_curr_ld->owner);
+ }
nfss->pnfs_curr_ld = NULL;
}
@@ -115,6 +118,14 @@ set_pnfs_layoutdriver(struct nfs_server *server, u32 id)
}
server->pnfs_curr_ld = ld_type;
+ if (ld_type->set_layoutdriver &&
+ ld_type->set_layoutdriver(server)) {
+ dprintk("%s: Error initializing mount point for layout driver %u.\n",
+ __func__, id);
+ module_put(ld_type->owner);
+ goto out_no_driver;
+ }
+
dprintk("%s: pNFS module for %u set\n", __func__, id);
return;
@@ -71,6 +71,10 @@ struct pnfs_layoutdriver_type {
const u32 id;
const char *name;
struct module *owner;
+
+ int (*set_layoutdriver) (struct nfs_server *);
+ int (*unset_layoutdriver) (struct nfs_server *);
+
struct pnfs_layout_segment * (*alloc_lseg) (struct pnfs_layout_hdr *layoutid, struct nfs4_layoutget_res *lgr);
void (*free_lseg) (struct pnfs_layout_segment *lseg);