[pnfs] [PATCH 07/12] pnfsd-lexp: get_device_info
Benny Halevy
bhalevy at panasas.com
Mon Jun 16 14:25:35 EDT 2008
Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
fs/nfsd/pnfsd_lexp.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 63 insertions(+), 0 deletions(-)
diff --git a/fs/nfsd/pnfsd_lexp.c b/fs/nfsd/pnfsd_lexp.c
index ae023b1..5dc48dc 100644
--- a/fs/nfsd/pnfsd_lexp.c
+++ b/fs/nfsd/pnfsd_lexp.c
@@ -61,4 +61,67 @@ pnfsd_lexp_get_device_iter(struct super_block *sb,
return 0;
}
+static int
+pnfsd_lexp_get_device_info(struct super_block *sb,
+ struct pnfs_devinfo_arg *arg)
+{
+ int err;
+ struct pnfs_filelayout_device fdev;
+ struct pnfs_filelayout_multipath fl_devices[1];
+ u32 fl_stripe_indices[1] = { 0 };
+ struct pnfs_filelayout_devaddr daddr;
+ /* %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x.%03u.%03u */
+ char daddr_buf[8*4 + 2*3 + 10];
+
+ dprintk("--> %s: sb=%p\n", __func__, sb);
+
+ BUG_ON(arg->type != LAYOUT_NFSV4_FILES);
+
+ memset(&fdev, '\0', sizeof(fdev));
+
+ if (arg->devid.pnfs_devid != 1) {
+ printk(KERN_ERR "%s: WARNING: didn't receive a deviceid of 1 "
+ "(got: 0x%llx)\n", __func__, arg->devid.pnfs_devid);
+ err = -EINVAL;
+ goto out;
+ }
+
+ /* FIXME: no notifications yet */
+ arg->notify_types = 0;
+
+ /* count the number of comma-delimited DS IPs */
+ fdev.fl_device_length = 1;
+ fdev.fl_device_list = fl_devices;
+
+ fdev.fl_stripeindices_length = fdev.fl_device_length;
+ fdev.fl_stripeindices_list = fl_stripe_indices;
+
+ daddr.r_addr.data = daddr_buf;
+ daddr.r_addr.len = sizeof(daddr_buf);
+ err = __svc_print_netaddr(&pnfsd_lexp_addr, &daddr.r_addr);
+ if (err < 0)
+ goto out;
+ daddr.r_addr.len = err;
+ switch (pnfsd_lexp_addr.sa_family) {
+ case AF_INET:
+ daddr.r_netid.data = "tcp";
+ daddr.r_netid.len = 3;
+ break;
+ case AF_INET6:
+ daddr.r_netid.data = "tcp6";
+ daddr.r_netid.len = 4;
+ break;
+ default:
+ BUG();
+ }
+ fdev.fl_device_list[0].fl_multipath_length = 1;
+ fdev.fl_device_list[0].fl_multipath_list = &daddr;
+
+ /* have nfsd encode the device info */
+ err = arg->func(&arg->xdr, &fdev);
+out:
+ dprintk("<-- %s: return %d\n", __func__, err);
+ return err;
+}
+
#endif /* CONFIG_PNFSD_LOCAL_EXPORT */
--
1.5.3.3
More information about the pNFS
mailing list