diff options
-rw-r--r-- | fs/nfs/client.c | 2 | ||||
-rw-r--r-- | fs/nfs/super.c | 20 | ||||
-rw-r--r-- | include/linux/nfs_fs_sb.h | 2 |
3 files changed, 24 insertions, 0 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 143149db3440..92aed2e08bd5 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -752,6 +752,8 @@ static int nfs_init_server(struct nfs_server *server, | |||
752 | data->timeo, data->retrans); | 752 | data->timeo, data->retrans); |
753 | if (data->flags & NFS_MOUNT_NORESVPORT) | 753 | if (data->flags & NFS_MOUNT_NORESVPORT) |
754 | set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); | 754 | set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); |
755 | if (server->options & NFS_OPTION_MIGRATION) | ||
756 | set_bit(NFS_CS_MIGRATION, &cl_init.init_flags); | ||
755 | 757 | ||
756 | /* Allocate or find a client reference we can use */ | 758 | /* Allocate or find a client reference we can use */ |
757 | clp = nfs_get_client(&cl_init, &timeparms, NULL, RPC_AUTH_UNIX); | 759 | clp = nfs_get_client(&cl_init, &timeparms, NULL, RPC_AUTH_UNIX); |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index b8eda700584b..056138d45c11 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -88,6 +88,7 @@ enum { | |||
88 | Opt_sharecache, Opt_nosharecache, | 88 | Opt_sharecache, Opt_nosharecache, |
89 | Opt_resvport, Opt_noresvport, | 89 | Opt_resvport, Opt_noresvport, |
90 | Opt_fscache, Opt_nofscache, | 90 | Opt_fscache, Opt_nofscache, |
91 | Opt_migration, Opt_nomigration, | ||
91 | 92 | ||
92 | /* Mount options that take integer arguments */ | 93 | /* Mount options that take integer arguments */ |
93 | Opt_port, | 94 | Opt_port, |
@@ -147,6 +148,8 @@ static const match_table_t nfs_mount_option_tokens = { | |||
147 | { Opt_noresvport, "noresvport" }, | 148 | { Opt_noresvport, "noresvport" }, |
148 | { Opt_fscache, "fsc" }, | 149 | { Opt_fscache, "fsc" }, |
149 | { Opt_nofscache, "nofsc" }, | 150 | { Opt_nofscache, "nofsc" }, |
151 | { Opt_migration, "migration" }, | ||
152 | { Opt_nomigration, "nomigration" }, | ||
150 | 153 | ||
151 | { Opt_port, "port=%s" }, | 154 | { Opt_port, "port=%s" }, |
152 | { Opt_rsize, "rsize=%s" }, | 155 | { Opt_rsize, "rsize=%s" }, |
@@ -676,6 +679,9 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, | |||
676 | if (nfss->options & NFS_OPTION_FSCACHE) | 679 | if (nfss->options & NFS_OPTION_FSCACHE) |
677 | seq_printf(m, ",fsc"); | 680 | seq_printf(m, ",fsc"); |
678 | 681 | ||
682 | if (nfss->options & NFS_OPTION_MIGRATION) | ||
683 | seq_printf(m, ",migration"); | ||
684 | |||
679 | if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG) { | 685 | if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG) { |
680 | if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONE) | 686 | if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONE) |
681 | seq_printf(m, ",lookupcache=none"); | 687 | seq_printf(m, ",lookupcache=none"); |
@@ -1243,6 +1249,12 @@ static int nfs_parse_mount_options(char *raw, | |||
1243 | kfree(mnt->fscache_uniq); | 1249 | kfree(mnt->fscache_uniq); |
1244 | mnt->fscache_uniq = NULL; | 1250 | mnt->fscache_uniq = NULL; |
1245 | break; | 1251 | break; |
1252 | case Opt_migration: | ||
1253 | mnt->options |= NFS_OPTION_MIGRATION; | ||
1254 | break; | ||
1255 | case Opt_nomigration: | ||
1256 | mnt->options &= NFS_OPTION_MIGRATION; | ||
1257 | break; | ||
1246 | 1258 | ||
1247 | /* | 1259 | /* |
1248 | * options that take numeric values | 1260 | * options that take numeric values |
@@ -1535,6 +1547,10 @@ static int nfs_parse_mount_options(char *raw, | |||
1535 | if (mnt->minorversion && mnt->version != 4) | 1547 | if (mnt->minorversion && mnt->version != 4) |
1536 | goto out_minorversion_mismatch; | 1548 | goto out_minorversion_mismatch; |
1537 | 1549 | ||
1550 | if (mnt->options & NFS_OPTION_MIGRATION && | ||
1551 | mnt->version != 4 && mnt->minorversion != 0) | ||
1552 | goto out_migration_misuse; | ||
1553 | |||
1538 | /* | 1554 | /* |
1539 | * verify that any proto=/mountproto= options match the address | 1555 | * verify that any proto=/mountproto= options match the address |
1540 | * familiies in the addr=/mountaddr= options. | 1556 | * familiies in the addr=/mountaddr= options. |
@@ -1572,6 +1588,10 @@ out_minorversion_mismatch: | |||
1572 | printk(KERN_INFO "NFS: mount option vers=%u does not support " | 1588 | printk(KERN_INFO "NFS: mount option vers=%u does not support " |
1573 | "minorversion=%u\n", mnt->version, mnt->minorversion); | 1589 | "minorversion=%u\n", mnt->version, mnt->minorversion); |
1574 | return 0; | 1590 | return 0; |
1591 | out_migration_misuse: | ||
1592 | printk(KERN_INFO | ||
1593 | "NFS: 'migration' not supported for this NFS version\n"); | ||
1594 | return 0; | ||
1575 | out_nomem: | 1595 | out_nomem: |
1576 | printk(KERN_INFO "NFS: not enough memory to parse option\n"); | 1596 | printk(KERN_INFO "NFS: not enough memory to parse option\n"); |
1577 | return 0; | 1597 | return 0; |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 310c63c8ab2c..2e22fc7e47cf 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -39,6 +39,7 @@ struct nfs_client { | |||
39 | unsigned long cl_flags; /* behavior switches */ | 39 | unsigned long cl_flags; /* behavior switches */ |
40 | #define NFS_CS_NORESVPORT 0 /* - use ephemeral src port */ | 40 | #define NFS_CS_NORESVPORT 0 /* - use ephemeral src port */ |
41 | #define NFS_CS_DISCRTRY 1 /* - disconnect on RPC retry */ | 41 | #define NFS_CS_DISCRTRY 1 /* - disconnect on RPC retry */ |
42 | #define NFS_CS_MIGRATION 2 /* - transparent state migr */ | ||
42 | struct sockaddr_storage cl_addr; /* server identifier */ | 43 | struct sockaddr_storage cl_addr; /* server identifier */ |
43 | size_t cl_addrlen; | 44 | size_t cl_addrlen; |
44 | char * cl_hostname; /* hostname of server */ | 45 | char * cl_hostname; /* hostname of server */ |
@@ -125,6 +126,7 @@ struct nfs_server { | |||
125 | unsigned int namelen; | 126 | unsigned int namelen; |
126 | unsigned int options; /* extra options enabled by mount */ | 127 | unsigned int options; /* extra options enabled by mount */ |
127 | #define NFS_OPTION_FSCACHE 0x00000001 /* - local caching enabled */ | 128 | #define NFS_OPTION_FSCACHE 0x00000001 /* - local caching enabled */ |
129 | #define NFS_OPTION_MIGRATION 0x00000002 /* - NFSv4 migration enabled */ | ||
128 | 130 | ||
129 | struct nfs_fsid fsid; | 131 | struct nfs_fsid fsid; |
130 | __u64 maxfilesize; /* maximum file size */ | 132 | __u64 maxfilesize; /* maximum file size */ |