aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/super.c91
-rw-r--r--include/linux/nfs4_mount.h2
2 files changed, 85 insertions, 8 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 757aa3b7e64b..064e69d2fdde 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -1541,8 +1541,90 @@ static int nfs4_validate_mount_data(struct nfs4_mount_data **options,
1541 *ip_addr = c; 1541 *ip_addr = c;
1542 1542
1543 break; 1543 break;
1544 default: 1544 default: {
1545 goto out_bad_version; 1545 unsigned int len;
1546 struct nfs_parsed_mount_data args = {
1547 .rsize = NFS_MAX_FILE_IO_SIZE,
1548 .wsize = NFS_MAX_FILE_IO_SIZE,
1549 .timeo = 600,
1550 .retrans = 2,
1551 .acregmin = 3,
1552 .acregmax = 60,
1553 .acdirmin = 30,
1554 .acdirmax = 60,
1555 .nfs_server.protocol = IPPROTO_TCP,
1556 };
1557
1558 if (nfs_parse_mount_options((char *) *options, &args) == 0)
1559 return -EINVAL;
1560
1561 if (!nfs_verify_server_address((struct sockaddr *)
1562 &args.nfs_server.address))
1563 return -EINVAL;
1564 *addr = args.nfs_server.address;
1565
1566 switch (args.auth_flavor_len) {
1567 case 0:
1568 *authflavour = RPC_AUTH_UNIX;
1569 break;
1570 case 1:
1571 *authflavour = (rpc_authflavor_t) args.auth_flavors[0];
1572 break;
1573 default:
1574 goto out_inval_auth;
1575 }
1576
1577 /*
1578 * Translate to nfs4_mount_data, which nfs4_fill_super
1579 * can deal with.
1580 */
1581 data = kzalloc(sizeof(*data), GFP_KERNEL);
1582 if (data == NULL)
1583 return -ENOMEM;
1584 *options = data;
1585
1586 data->version = 1;
1587 data->flags = args.flags & NFS4_MOUNT_FLAGMASK;
1588 data->rsize = args.rsize;
1589 data->wsize = args.wsize;
1590 data->timeo = args.timeo;
1591 data->retrans = args.retrans;
1592 data->acregmin = args.acregmin;
1593 data->acregmax = args.acregmax;
1594 data->acdirmin = args.acdirmin;
1595 data->acdirmax = args.acdirmax;
1596 data->proto = args.nfs_server.protocol;
1597
1598 /*
1599 * Split "dev_name" into "hostname:mntpath".
1600 */
1601 c = strchr(dev_name, ':');
1602 if (c == NULL)
1603 return -EINVAL;
1604 /* while calculating len, pretend ':' is '\0' */
1605 len = c - dev_name;
1606 if (len > NFS4_MAXNAMLEN)
1607 return -EINVAL;
1608 *hostname = kzalloc(len, GFP_KERNEL);
1609 if (*hostname == NULL)
1610 return -ENOMEM;
1611 strncpy(*hostname, dev_name, len - 1);
1612
1613 c++; /* step over the ':' */
1614 len = strlen(c);
1615 if (len > NFS4_MAXPATHLEN)
1616 return -EINVAL;
1617 *mntpath = kzalloc(len + 1, GFP_KERNEL);
1618 if (*mntpath == NULL)
1619 return -ENOMEM;
1620 strncpy(*mntpath, c, len);
1621
1622 dprintk("MNTPATH: %s\n", *mntpath);
1623
1624 *ip_addr = args.client_address;
1625
1626 break;
1627 }
1546 } 1628 }
1547 1629
1548 return 0; 1630 return 0;
@@ -1559,11 +1641,6 @@ out_inval_auth:
1559out_no_address: 1641out_no_address:
1560 dfprintk(MOUNT, "NFS4: mount program didn't pass remote address\n"); 1642 dfprintk(MOUNT, "NFS4: mount program didn't pass remote address\n");
1561 return -EINVAL; 1643 return -EINVAL;
1562
1563out_bad_version:
1564 dfprintk(MOUNT, "NFS4: bad nfs_mount_data version %d\n",
1565 data->version);
1566 return -EINVAL;
1567} 1644}
1568 1645
1569/* 1646/*
diff --git a/include/linux/nfs4_mount.h b/include/linux/nfs4_mount.h
index 26b4c83f831d..d8d7480e5a47 100644
--- a/include/linux/nfs4_mount.h
+++ b/include/linux/nfs4_mount.h
@@ -65,6 +65,6 @@ struct nfs4_mount_data {
65#define NFS4_MOUNT_NOCTO 0x0010 /* 1 */ 65#define NFS4_MOUNT_NOCTO 0x0010 /* 1 */
66#define NFS4_MOUNT_NOAC 0x0020 /* 1 */ 66#define NFS4_MOUNT_NOAC 0x0020 /* 1 */
67#define NFS4_MOUNT_STRICTLOCK 0x1000 /* 1 */ 67#define NFS4_MOUNT_STRICTLOCK 0x1000 /* 1 */
68#define NFS4_MOUNT_FLAGMASK 0xFFFF 68#define NFS4_MOUNT_FLAGMASK 0x1033
69 69
70#endif 70#endif