NFS: Eliminate client_sys in favour of cl_rpcclient
[pandora-kernel.git] / fs / nfs / super.c
1 /*
2  *  linux/fs/nfs/super.c
3  *
4  *  Copyright (C) 1992  Rick Sladkey
5  *
6  *  nfs superblock handling functions
7  *
8  *  Modularised by Alan Cox <Alan.Cox@linux.org>, while hacking some
9  *  experimental NFS changes. Modularisation taken straight from SYS5 fs.
10  *
11  *  Change to nfs_read_super() to permit NFS mounts to multi-homed hosts.
12  *  J.S.Peatfield@damtp.cam.ac.uk
13  *
14  *  Split from inode.c by David Howells <dhowells@redhat.com>
15  *
16  */
17
18 #include <linux/config.h>
19 #include <linux/module.h>
20 #include <linux/init.h>
21
22 #include <linux/time.h>
23 #include <linux/kernel.h>
24 #include <linux/mm.h>
25 #include <linux/string.h>
26 #include <linux/stat.h>
27 #include <linux/errno.h>
28 #include <linux/unistd.h>
29 #include <linux/sunrpc/clnt.h>
30 #include <linux/sunrpc/stats.h>
31 #include <linux/sunrpc/metrics.h>
32 #include <linux/nfs_fs.h>
33 #include <linux/nfs_mount.h>
34 #include <linux/nfs4_mount.h>
35 #include <linux/lockd/bind.h>
36 #include <linux/smp_lock.h>
37 #include <linux/seq_file.h>
38 #include <linux/mount.h>
39 #include <linux/nfs_idmap.h>
40 #include <linux/vfs.h>
41 #include <linux/inet.h>
42 #include <linux/nfs_xdr.h>
43
44 #include <asm/system.h>
45 #include <asm/uaccess.h>
46
47 #include "nfs4_fs.h"
48 #include "callback.h"
49 #include "delegation.h"
50 #include "iostat.h"
51 #include "internal.h"
52
53 #define NFSDBG_FACILITY         NFSDBG_VFS
54
55 /* Maximum number of readahead requests
56  * FIXME: this should really be a sysctl so that users may tune it to suit
57  *        their needs. People that do NFS over a slow network, might for
58  *        instance want to reduce it to something closer to 1 for improved
59  *        interactive response.
60  */
61 #define NFS_MAX_READAHEAD       (RPC_DEF_SLOT_TABLE - 1)
62
63 static void nfs_umount_begin(struct vfsmount *, int);
64 static int  nfs_statfs(struct dentry *, struct kstatfs *);
65 static int  nfs_show_options(struct seq_file *, struct vfsmount *);
66 static int  nfs_show_stats(struct seq_file *, struct vfsmount *);
67 static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *);
68 static int nfs_clone_nfs_sb(struct file_system_type *fs_type,
69                 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
70 static void nfs_kill_super(struct super_block *);
71
72 static struct file_system_type nfs_fs_type = {
73         .owner          = THIS_MODULE,
74         .name           = "nfs",
75         .get_sb         = nfs_get_sb,
76         .kill_sb        = nfs_kill_super,
77         .fs_flags       = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
78 };
79
80 struct file_system_type clone_nfs_fs_type = {
81         .owner          = THIS_MODULE,
82         .name           = "nfs",
83         .get_sb         = nfs_clone_nfs_sb,
84         .kill_sb        = nfs_kill_super,
85         .fs_flags       = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
86 };
87
88 static struct super_operations nfs_sops = {
89         .alloc_inode    = nfs_alloc_inode,
90         .destroy_inode  = nfs_destroy_inode,
91         .write_inode    = nfs_write_inode,
92         .statfs         = nfs_statfs,
93         .clear_inode    = nfs_clear_inode,
94         .umount_begin   = nfs_umount_begin,
95         .show_options   = nfs_show_options,
96         .show_stats     = nfs_show_stats,
97 };
98
99 #ifdef CONFIG_NFS_V4
100 static int nfs4_get_sb(struct file_system_type *fs_type,
101         int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
102 static int nfs_clone_nfs4_sb(struct file_system_type *fs_type,
103                 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
104 static int nfs_referral_nfs4_sb(struct file_system_type *fs_type,
105                 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
106 static void nfs4_kill_super(struct super_block *sb);
107
108 static struct file_system_type nfs4_fs_type = {
109         .owner          = THIS_MODULE,
110         .name           = "nfs4",
111         .get_sb         = nfs4_get_sb,
112         .kill_sb        = nfs4_kill_super,
113         .fs_flags       = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
114 };
115
116 struct file_system_type clone_nfs4_fs_type = {
117         .owner          = THIS_MODULE,
118         .name           = "nfs4",
119         .get_sb         = nfs_clone_nfs4_sb,
120         .kill_sb        = nfs4_kill_super,
121         .fs_flags       = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
122 };
123
124 struct file_system_type nfs_referral_nfs4_fs_type = {
125         .owner          = THIS_MODULE,
126         .name           = "nfs4",
127         .get_sb         = nfs_referral_nfs4_sb,
128         .kill_sb        = nfs4_kill_super,
129         .fs_flags       = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
130 };
131
132 static struct super_operations nfs4_sops = {
133         .alloc_inode    = nfs_alloc_inode,
134         .destroy_inode  = nfs_destroy_inode,
135         .write_inode    = nfs_write_inode,
136         .statfs         = nfs_statfs,
137         .clear_inode    = nfs4_clear_inode,
138         .umount_begin   = nfs_umount_begin,
139         .show_options   = nfs_show_options,
140         .show_stats     = nfs_show_stats,
141 };
142 #endif
143
144 static struct shrinker *acl_shrinker;
145
146 /*
147  * Register the NFS filesystems
148  */
149 int __init register_nfs_fs(void)
150 {
151         int ret;
152
153         ret = register_filesystem(&nfs_fs_type);
154         if (ret < 0)
155                 goto error_0;
156
157 #ifdef CONFIG_NFS_V4
158         ret = nfs_register_sysctl();
159         if (ret < 0)
160                 goto error_1;
161         ret = register_filesystem(&nfs4_fs_type);
162         if (ret < 0)
163                 goto error_2;
164 #endif
165         acl_shrinker = set_shrinker(DEFAULT_SEEKS, nfs_access_cache_shrinker);
166         return 0;
167
168 #ifdef CONFIG_NFS_V4
169 error_2:
170         nfs_unregister_sysctl();
171 error_1:
172         unregister_filesystem(&nfs_fs_type);
173 #endif
174 error_0:
175         return ret;
176 }
177
178 /*
179  * Unregister the NFS filesystems
180  */
181 void __exit unregister_nfs_fs(void)
182 {
183         if (acl_shrinker != NULL)
184                 remove_shrinker(acl_shrinker);
185 #ifdef CONFIG_NFS_V4
186         unregister_filesystem(&nfs4_fs_type);
187         nfs_unregister_sysctl();
188 #endif
189         unregister_filesystem(&nfs_fs_type);
190 }
191
192 /*
193  * Deliver file system statistics to userspace
194  */
195 static int nfs_statfs(struct dentry *dentry, struct kstatfs *buf)
196 {
197         struct nfs_server *server = NFS_SB(dentry->d_sb);
198         unsigned char blockbits;
199         unsigned long blockres;
200         struct nfs_fh *fh = NFS_FH(dentry->d_inode);
201         struct nfs_fattr fattr;
202         struct nfs_fsstat res = {
203                         .fattr = &fattr,
204         };
205         int error;
206
207         lock_kernel();
208
209         error = server->nfs_client->rpc_ops->statfs(server, fh, &res);
210         buf->f_type = NFS_SUPER_MAGIC;
211         if (error < 0)
212                 goto out_err;
213
214         /*
215          * Current versions of glibc do not correctly handle the
216          * case where f_frsize != f_bsize.  Eventually we want to
217          * report the value of wtmult in this field.
218          */
219         buf->f_frsize = dentry->d_sb->s_blocksize;
220
221         /*
222          * On most *nix systems, f_blocks, f_bfree, and f_bavail
223          * are reported in units of f_frsize.  Linux hasn't had
224          * an f_frsize field in its statfs struct until recently,
225          * thus historically Linux's sys_statfs reports these
226          * fields in units of f_bsize.
227          */
228         buf->f_bsize = dentry->d_sb->s_blocksize;
229         blockbits = dentry->d_sb->s_blocksize_bits;
230         blockres = (1 << blockbits) - 1;
231         buf->f_blocks = (res.tbytes + blockres) >> blockbits;
232         buf->f_bfree = (res.fbytes + blockres) >> blockbits;
233         buf->f_bavail = (res.abytes + blockres) >> blockbits;
234
235         buf->f_files = res.tfiles;
236         buf->f_ffree = res.afiles;
237
238         buf->f_namelen = server->namelen;
239  out:
240         unlock_kernel();
241         return 0;
242
243  out_err:
244         dprintk("%s: statfs error = %d\n", __FUNCTION__, -error);
245         buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1;
246         goto out;
247
248 }
249
250 /*
251  * Map the security flavour number to a name
252  */
253 static const char *nfs_pseudoflavour_to_name(rpc_authflavor_t flavour)
254 {
255         static const struct {
256                 rpc_authflavor_t flavour;
257                 const char *str;
258         } sec_flavours[] = {
259                 { RPC_AUTH_NULL, "null" },
260                 { RPC_AUTH_UNIX, "sys" },
261                 { RPC_AUTH_GSS_KRB5, "krb5" },
262                 { RPC_AUTH_GSS_KRB5I, "krb5i" },
263                 { RPC_AUTH_GSS_KRB5P, "krb5p" },
264                 { RPC_AUTH_GSS_LKEY, "lkey" },
265                 { RPC_AUTH_GSS_LKEYI, "lkeyi" },
266                 { RPC_AUTH_GSS_LKEYP, "lkeyp" },
267                 { RPC_AUTH_GSS_SPKM, "spkm" },
268                 { RPC_AUTH_GSS_SPKMI, "spkmi" },
269                 { RPC_AUTH_GSS_SPKMP, "spkmp" },
270                 { -1, "unknown" }
271         };
272         int i;
273
274         for (i=0; sec_flavours[i].flavour != -1; i++) {
275                 if (sec_flavours[i].flavour == flavour)
276                         break;
277         }
278         return sec_flavours[i].str;
279 }
280
281 /*
282  * Describe the mount options in force on this server representation
283  */
284 static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, int showdefaults)
285 {
286         static const struct proc_nfs_info {
287                 int flag;
288                 const char *str;
289                 const char *nostr;
290         } nfs_info[] = {
291                 { NFS_MOUNT_SOFT, ",soft", ",hard" },
292                 { NFS_MOUNT_INTR, ",intr", "" },
293                 { NFS_MOUNT_NOCTO, ",nocto", "" },
294                 { NFS_MOUNT_NOAC, ",noac", "" },
295                 { NFS_MOUNT_NONLM, ",nolock", "" },
296                 { NFS_MOUNT_NOACL, ",noacl", "" },
297                 { 0, NULL, NULL }
298         };
299         const struct proc_nfs_info *nfs_infop;
300         struct nfs_client *clp = nfss->nfs_client;
301         char buf[12];
302         const char *proto;
303
304         seq_printf(m, ",vers=%d", clp->rpc_ops->version);
305         seq_printf(m, ",rsize=%d", nfss->rsize);
306         seq_printf(m, ",wsize=%d", nfss->wsize);
307         if (nfss->acregmin != 3*HZ || showdefaults)
308                 seq_printf(m, ",acregmin=%d", nfss->acregmin/HZ);
309         if (nfss->acregmax != 60*HZ || showdefaults)
310                 seq_printf(m, ",acregmax=%d", nfss->acregmax/HZ);
311         if (nfss->acdirmin != 30*HZ || showdefaults)
312                 seq_printf(m, ",acdirmin=%d", nfss->acdirmin/HZ);
313         if (nfss->acdirmax != 60*HZ || showdefaults)
314                 seq_printf(m, ",acdirmax=%d", nfss->acdirmax/HZ);
315         for (nfs_infop = nfs_info; nfs_infop->flag; nfs_infop++) {
316                 if (nfss->flags & nfs_infop->flag)
317                         seq_puts(m, nfs_infop->str);
318                 else
319                         seq_puts(m, nfs_infop->nostr);
320         }
321         switch (nfss->client->cl_xprt->prot) {
322                 case IPPROTO_TCP:
323                         proto = "tcp";
324                         break;
325                 case IPPROTO_UDP:
326                         proto = "udp";
327                         break;
328                 default:
329                         snprintf(buf, sizeof(buf), "%u", nfss->client->cl_xprt->prot);
330                         proto = buf;
331         }
332         seq_printf(m, ",proto=%s", proto);
333         seq_printf(m, ",timeo=%lu", 10U * clp->retrans_timeo / HZ);
334         seq_printf(m, ",retrans=%u", clp->retrans_count);
335         seq_printf(m, ",sec=%s", nfs_pseudoflavour_to_name(nfss->client->cl_auth->au_flavor));
336 }
337
338 /*
339  * Describe the mount options on this VFS mountpoint
340  */
341 static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt)
342 {
343         struct nfs_server *nfss = NFS_SB(mnt->mnt_sb);
344
345         nfs_show_mount_options(m, nfss, 0);
346
347         seq_puts(m, ",addr=");
348         seq_escape(m, nfss->hostname, " \t\n\\");
349
350         return 0;
351 }
352
353 /*
354  * Present statistical information for this VFS mountpoint
355  */
356 static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt)
357 {
358         int i, cpu;
359         struct nfs_server *nfss = NFS_SB(mnt->mnt_sb);
360         struct rpc_auth *auth = nfss->client->cl_auth;
361         struct nfs_iostats totals = { };
362
363         seq_printf(m, "statvers=%s", NFS_IOSTAT_VERS);
364
365         /*
366          * Display all mount option settings
367          */
368         seq_printf(m, "\n\topts:\t");
369         seq_puts(m, mnt->mnt_sb->s_flags & MS_RDONLY ? "ro" : "rw");
370         seq_puts(m, mnt->mnt_sb->s_flags & MS_SYNCHRONOUS ? ",sync" : "");
371         seq_puts(m, mnt->mnt_sb->s_flags & MS_NOATIME ? ",noatime" : "");
372         seq_puts(m, mnt->mnt_sb->s_flags & MS_NODIRATIME ? ",nodiratime" : "");
373         nfs_show_mount_options(m, nfss, 1);
374
375         seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
376
377         seq_printf(m, "\n\tcaps:\t");
378         seq_printf(m, "caps=0x%x", nfss->caps);
379         seq_printf(m, ",wtmult=%d", nfss->wtmult);
380         seq_printf(m, ",dtsize=%d", nfss->dtsize);
381         seq_printf(m, ",bsize=%d", nfss->bsize);
382         seq_printf(m, ",namelen=%d", nfss->namelen);
383
384 #ifdef CONFIG_NFS_V4
385         if (nfss->nfs_client->cl_nfsversion == 4) {
386                 seq_printf(m, "\n\tnfsv4:\t");
387                 seq_printf(m, "bm0=0x%x", nfss->attr_bitmask[0]);
388                 seq_printf(m, ",bm1=0x%x", nfss->attr_bitmask[1]);
389                 seq_printf(m, ",acl=0x%x", nfss->acl_bitmask);
390         }
391 #endif
392
393         /*
394          * Display security flavor in effect for this mount
395          */
396         seq_printf(m, "\n\tsec:\tflavor=%d", auth->au_ops->au_flavor);
397         if (auth->au_flavor)
398                 seq_printf(m, ",pseudoflavor=%d", auth->au_flavor);
399
400         /*
401          * Display superblock I/O counters
402          */
403         for_each_possible_cpu(cpu) {
404                 struct nfs_iostats *stats;
405
406                 preempt_disable();
407                 stats = per_cpu_ptr(nfss->io_stats, cpu);
408
409                 for (i = 0; i < __NFSIOS_COUNTSMAX; i++)
410                         totals.events[i] += stats->events[i];
411                 for (i = 0; i < __NFSIOS_BYTESMAX; i++)
412                         totals.bytes[i] += stats->bytes[i];
413
414                 preempt_enable();
415         }
416
417         seq_printf(m, "\n\tevents:\t");
418         for (i = 0; i < __NFSIOS_COUNTSMAX; i++)
419                 seq_printf(m, "%lu ", totals.events[i]);
420         seq_printf(m, "\n\tbytes:\t");
421         for (i = 0; i < __NFSIOS_BYTESMAX; i++)
422                 seq_printf(m, "%Lu ", totals.bytes[i]);
423         seq_printf(m, "\n");
424
425         rpc_print_iostats(m, nfss->client);
426
427         return 0;
428 }
429
430 /*
431  * Begin unmount by attempting to remove all automounted mountpoints we added
432  * in response to traversals
433  */
434 static void nfs_umount_begin(struct vfsmount *vfsmnt, int flags)
435 {
436         struct nfs_server *server;
437         struct rpc_clnt *rpc;
438
439         shrink_submounts(vfsmnt, &nfs_automount_list);
440         if (!(flags & MNT_FORCE))
441                 return;
442         /* -EIO all pending I/O */
443         server = NFS_SB(vfsmnt->mnt_sb);
444         rpc = server->client;
445         if (!IS_ERR(rpc))
446                 rpc_killall_tasks(rpc);
447         rpc = server->client_acl;
448         if (!IS_ERR(rpc))
449                 rpc_killall_tasks(rpc);
450 }
451
452 /*
453  * Obtain the root inode of the file system.
454  */
455 static struct inode *
456 nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh, struct nfs_fsinfo *fsinfo)
457 {
458         struct nfs_server       *server = NFS_SB(sb);
459         int                     error;
460
461         error = server->nfs_client->rpc_ops->getroot(server, rootfh, fsinfo);
462         if (error < 0) {
463                 dprintk("nfs_get_root: getattr error = %d\n", -error);
464                 return ERR_PTR(error);
465         }
466
467         server->fsid = fsinfo->fattr->fsid;
468         return nfs_fhget(sb, rootfh, fsinfo->fattr);
469 }
470
471 /*
472  * Do NFS version-independent mount processing, and sanity checking
473  */
474 static int
475 nfs_sb_init(struct super_block *sb, rpc_authflavor_t authflavor)
476 {
477         struct nfs_server       *server;
478         struct inode            *root_inode;
479         struct nfs_fattr        fattr;
480         struct nfs_fsinfo       fsinfo = {
481                                         .fattr = &fattr,
482                                 };
483         struct nfs_pathconf pathinfo = {
484                         .fattr = &fattr,
485         };
486         int no_root_error = 0;
487         unsigned long max_rpc_payload;
488
489         /* We probably want something more informative here */
490         snprintf(sb->s_id, sizeof(sb->s_id), "%x:%x", MAJOR(sb->s_dev), MINOR(sb->s_dev));
491
492         server = NFS_SB(sb);
493
494         sb->s_magic      = NFS_SUPER_MAGIC;
495
496         server->io_stats = nfs_alloc_iostats();
497         if (server->io_stats == NULL)
498                 return -ENOMEM;
499
500         root_inode = nfs_get_root(sb, &server->fh, &fsinfo);
501         /* Did getting the root inode fail? */
502         if (IS_ERR(root_inode)) {
503                 no_root_error = PTR_ERR(root_inode);
504                 goto out_no_root;
505         }
506         sb->s_root = d_alloc_root(root_inode);
507         if (!sb->s_root) {
508                 no_root_error = -ENOMEM;
509                 goto out_no_root;
510         }
511         sb->s_root->d_op = server->nfs_client->rpc_ops->dentry_ops;
512
513         /* mount time stamp, in seconds */
514         server->mount_time = jiffies;
515
516         /* Get some general file system info */
517         if (server->namelen == 0 &&
518             server->nfs_client->rpc_ops->pathconf(server, &server->fh, &pathinfo) >= 0)
519                 server->namelen = pathinfo.max_namelen;
520         /* Work out a lot of parameters */
521         if (server->rsize == 0)
522                 server->rsize = nfs_block_size(fsinfo.rtpref, NULL);
523         if (server->wsize == 0)
524                 server->wsize = nfs_block_size(fsinfo.wtpref, NULL);
525
526         if (fsinfo.rtmax >= 512 && server->rsize > fsinfo.rtmax)
527                 server->rsize = nfs_block_size(fsinfo.rtmax, NULL);
528         if (fsinfo.wtmax >= 512 && server->wsize > fsinfo.wtmax)
529                 server->wsize = nfs_block_size(fsinfo.wtmax, NULL);
530
531         max_rpc_payload = nfs_block_size(rpc_max_payload(server->client), NULL);
532         if (server->rsize > max_rpc_payload)
533                 server->rsize = max_rpc_payload;
534         if (server->rsize > NFS_MAX_FILE_IO_SIZE)
535                 server->rsize = NFS_MAX_FILE_IO_SIZE;
536         server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
537
538         if (server->wsize > max_rpc_payload)
539                 server->wsize = max_rpc_payload;
540         if (server->wsize > NFS_MAX_FILE_IO_SIZE)
541                 server->wsize = NFS_MAX_FILE_IO_SIZE;
542         server->wpages = (server->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
543
544         if (sb->s_blocksize == 0)
545                 sb->s_blocksize = nfs_block_bits(server->wsize,
546                                                          &sb->s_blocksize_bits);
547         server->wtmult = nfs_block_bits(fsinfo.wtmult, NULL);
548
549         server->dtsize = nfs_block_size(fsinfo.dtpref, NULL);
550         if (server->dtsize > PAGE_CACHE_SIZE)
551                 server->dtsize = PAGE_CACHE_SIZE;
552         if (server->dtsize > server->rsize)
553                 server->dtsize = server->rsize;
554
555         if (server->flags & NFS_MOUNT_NOAC) {
556                 server->acregmin = server->acregmax = 0;
557                 server->acdirmin = server->acdirmax = 0;
558                 sb->s_flags |= MS_SYNCHRONOUS;
559         }
560         server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD;
561
562         nfs_super_set_maxbytes(sb, fsinfo.maxfilesize);
563
564         server->client->cl_intr = (server->flags & NFS_MOUNT_INTR) ? 1 : 0;
565         server->client->cl_softrtry = (server->flags & NFS_MOUNT_SOFT) ? 1 : 0;
566
567         /* We're airborne Set socket buffersize */
568         rpc_setbufsize(server->client, server->wsize + 100, server->rsize + 100);
569         return 0;
570         /* Yargs. It didn't work out. */
571 out_no_root:
572         dprintk("nfs_sb_init: get root inode failed: errno %d\n", -no_root_error);
573         if (!IS_ERR(root_inode))
574                 iput(root_inode);
575         return no_root_error;
576 }
577
578 /*
579  * Create an RPC client handle.
580  */
581 static struct rpc_clnt *
582 nfs_create_client(struct nfs_server *server, const struct nfs_mount_data *data)
583 {
584         struct nfs_client       *clp;
585         struct rpc_clnt         *clnt;
586         int                     proto = (data->flags & NFS_MOUNT_TCP) ? IPPROTO_TCP : IPPROTO_UDP;
587         int                     nfsversion = 2;
588         int                     err;
589
590 #ifdef CONFIG_NFS_V3
591         if (server->flags & NFS_MOUNT_VER3)
592                 nfsversion = 3;
593 #endif
594
595         clp = nfs_get_client(server->hostname, &server->addr, nfsversion);
596         if (!clp) {
597                 dprintk("%s: failed to create NFS4 client.\n", __FUNCTION__);
598                 return ERR_PTR(PTR_ERR(clp));
599         }
600
601         if (clp->cl_cons_state == NFS_CS_INITING) {
602                 /* Check NFS protocol revision and initialize RPC op
603                  * vector and file handle pool. */
604 #ifdef CONFIG_NFS_V3
605                 if (nfsversion == 3) {
606                         clp->rpc_ops = &nfs_v3_clientops;
607                         server->caps |= NFS_CAP_READDIRPLUS;
608                 } else {
609                         clp->rpc_ops = &nfs_v2_clientops;
610                 }
611 #else
612                 clp->rpc_ops = &nfs_v2_clientops;
613 #endif
614
615                 /* create transport and client */
616                 err = nfs_create_rpc_client(clp, proto, data->timeo,
617                                             data->retrans, RPC_AUTH_UNIX);
618                 if (err < 0)
619                         goto client_init_error;
620
621                 nfs_mark_client_ready(clp, 0);
622         }
623
624         /* create an nfs_server-specific client */
625         clnt = rpc_clone_client(clp->cl_rpcclient);
626         if (IS_ERR(clnt)) {
627                 dprintk("%s: couldn't create rpc_client!\n", __FUNCTION__);
628                 nfs_put_client(clp);
629                 return ERR_PTR(PTR_ERR(clnt));
630         }
631
632         if (data->pseudoflavor != clp->cl_rpcclient->cl_auth->au_flavor) {
633                 struct rpc_auth *auth;
634
635                 auth = rpcauth_create(data->pseudoflavor, server->client);
636                 if (IS_ERR(auth)) {
637                         dprintk("%s: couldn't create credcache!\n", __FUNCTION__);
638                         return ERR_PTR(PTR_ERR(auth));
639                 }
640         }
641
642         server->nfs_client = clp;
643         return clnt;
644
645 client_init_error:
646         nfs_mark_client_ready(clp, err);
647         nfs_put_client(clp);
648         return ERR_PTR(err);
649 }
650
651 /*
652  * Clone a server record
653  */
654 static struct nfs_server *nfs_clone_server(struct super_block *sb, struct nfs_clone_mount *data)
655 {
656         struct nfs_server *server = NFS_SB(sb);
657         struct nfs_server *parent = NFS_SB(data->sb);
658         struct inode *root_inode;
659         struct nfs_fsinfo fsinfo;
660         void *err = ERR_PTR(-ENOMEM);
661
662         sb->s_op = data->sb->s_op;
663         sb->s_blocksize = data->sb->s_blocksize;
664         sb->s_blocksize_bits = data->sb->s_blocksize_bits;
665         sb->s_maxbytes = data->sb->s_maxbytes;
666
667         server->client_acl = ERR_PTR(-EINVAL);
668         server->io_stats = nfs_alloc_iostats();
669         if (server->io_stats == NULL)
670                 goto out;
671
672         server->client = rpc_clone_client(parent->client);
673         if (IS_ERR((err = server->client)))
674                 goto out;
675
676         if (!IS_ERR(parent->client_acl)) {
677                 server->client_acl = rpc_clone_client(parent->client_acl);
678                 if (IS_ERR((err = server->client_acl)))
679                         goto out;
680         }
681         root_inode = nfs_fhget(sb, data->fh, data->fattr);
682         if (!root_inode)
683                 goto out;
684         sb->s_root = d_alloc_root(root_inode);
685         if (!sb->s_root)
686                 goto out_put_root;
687         fsinfo.fattr = data->fattr;
688         if (NFS_PROTO(root_inode)->fsinfo(server, data->fh, &fsinfo) == 0)
689                 nfs_super_set_maxbytes(sb, fsinfo.maxfilesize);
690         sb->s_root->d_op = server->nfs_client->rpc_ops->dentry_ops;
691         sb->s_flags |= MS_ACTIVE;
692         return server;
693 out_put_root:
694         iput(root_inode);
695 out:
696         return err;
697 }
698
699 /*
700  * Copy an existing superblock and attach revised data
701  */
702 static int nfs_clone_generic_sb(struct nfs_clone_mount *data,
703                 struct super_block *(*fill_sb)(struct nfs_server *, struct nfs_clone_mount *),
704                 struct nfs_server *(*fill_server)(struct super_block *, struct nfs_clone_mount *),
705                 struct vfsmount *mnt)
706 {
707         struct nfs_server *server;
708         struct nfs_server *parent = NFS_SB(data->sb);
709         struct super_block *sb = ERR_PTR(-EINVAL);
710         char *hostname;
711         int error = -ENOMEM;
712         int len;
713
714         server = kmalloc(sizeof(struct nfs_server), GFP_KERNEL);
715         if (server == NULL)
716                 goto out_err;
717         memcpy(server, parent, sizeof(*server));
718         atomic_inc(&server->nfs_client->cl_count);
719         hostname = (data->hostname != NULL) ? data->hostname : parent->hostname;
720         len = strlen(hostname) + 1;
721         server->hostname = kmalloc(len, GFP_KERNEL);
722         if (server->hostname == NULL)
723                 goto free_server;
724         memcpy(server->hostname, hostname, len);
725         error = rpciod_up();
726         if (error != 0)
727                 goto free_hostname;
728
729         sb = fill_sb(server, data);
730         if (IS_ERR(sb)) {
731                 error = PTR_ERR(sb);
732                 goto kill_rpciod;
733         }
734
735         if (sb->s_root)
736                 goto out_rpciod_down;
737
738         server = fill_server(sb, data);
739         if (IS_ERR(server)) {
740                 error = PTR_ERR(server);
741                 goto out_deactivate;
742         }
743         return simple_set_mnt(mnt, sb);
744 out_deactivate:
745         up_write(&sb->s_umount);
746         deactivate_super(sb);
747         return error;
748 out_rpciod_down:
749         rpciod_down();
750         kfree(server->hostname);
751         nfs_put_client(server->nfs_client);
752         kfree(server);
753         return simple_set_mnt(mnt, sb);
754 kill_rpciod:
755         rpciod_down();
756 free_hostname:
757         kfree(server->hostname);
758 free_server:
759         nfs_put_client(server->nfs_client);
760         kfree(server);
761 out_err:
762         return error;
763 }
764
765 /*
766  * Set up an NFS2/3 superblock
767  *
768  * The way this works is that the mount process passes a structure
769  * in the data argument which contains the server's IP address
770  * and the root file handle obtained from the server's mount
771  * daemon. We stash these away in the private superblock fields.
772  */
773 static int
774 nfs_fill_super(struct super_block *sb, struct nfs_mount_data *data, int silent)
775 {
776         struct nfs_server       *server;
777         rpc_authflavor_t        authflavor;
778
779         server           = NFS_SB(sb);
780         sb->s_blocksize_bits = 0;
781         sb->s_blocksize = 0;
782         if (data->bsize)
783                 sb->s_blocksize = nfs_block_size(data->bsize, &sb->s_blocksize_bits);
784         if (data->rsize)
785                 server->rsize = nfs_block_size(data->rsize, NULL);
786         if (data->wsize)
787                 server->wsize = nfs_block_size(data->wsize, NULL);
788         server->flags    = data->flags & NFS_MOUNT_FLAGMASK;
789
790         server->acregmin = data->acregmin*HZ;
791         server->acregmax = data->acregmax*HZ;
792         server->acdirmin = data->acdirmin*HZ;
793         server->acdirmax = data->acdirmax*HZ;
794
795         /* Start lockd here, before we might error out */
796         if (!(server->flags & NFS_MOUNT_NONLM))
797                 lockd_up();
798
799         server->namelen  = data->namlen;
800         server->hostname = kmalloc(strlen(data->hostname) + 1, GFP_KERNEL);
801         if (!server->hostname)
802                 return -ENOMEM;
803         strcpy(server->hostname, data->hostname);
804
805         /* Fill in pseudoflavor for mount version < 5 */
806         if (!(data->flags & NFS_MOUNT_SECFLAVOUR))
807                 data->pseudoflavor = RPC_AUTH_UNIX;
808         authflavor = data->pseudoflavor;        /* save for sb_init() */
809         /* XXX maybe we want to add a server->pseudoflavor field */
810
811         /* Create RPC client handles */
812         server->client = nfs_create_client(server, data);
813         if (IS_ERR(server->client))
814                 return PTR_ERR(server->client);
815
816         /* RFC 2623, sec 2.3.2 */
817         if (server->flags & NFS_MOUNT_VER3) {
818 #ifdef CONFIG_NFS_V3_ACL
819                 if (!(server->flags & NFS_MOUNT_NOACL)) {
820                         server->client_acl = rpc_bind_new_program(server->client, &nfsacl_program, 3);
821                         /* No errors! Assume that Sun nfsacls are supported */
822                         if (!IS_ERR(server->client_acl))
823                                 server->caps |= NFS_CAP_ACLS;
824                 }
825 #else
826                 server->flags &= ~NFS_MOUNT_NOACL;
827 #endif /* CONFIG_NFS_V3_ACL */
828                 /*
829                  * The VFS shouldn't apply the umask to mode bits. We will
830                  * do so ourselves when necessary.
831                  */
832                 sb->s_flags |= MS_POSIXACL;
833                 if (server->namelen == 0 || server->namelen > NFS3_MAXNAMLEN)
834                         server->namelen = NFS3_MAXNAMLEN;
835                 sb->s_time_gran = 1;
836         } else {
837                 if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN)
838                         server->namelen = NFS2_MAXNAMLEN;
839         }
840
841         sb->s_op = &nfs_sops;
842         return nfs_sb_init(sb, authflavor);
843 }
844
845 static int nfs_set_super(struct super_block *s, void *data)
846 {
847         s->s_fs_info = data;
848         return set_anon_super(s, data);
849 }
850
851 static int nfs_compare_super(struct super_block *sb, void *data)
852 {
853         struct nfs_server *server = data;
854         struct nfs_server *old = NFS_SB(sb);
855
856         if (old->addr.sin_addr.s_addr != server->addr.sin_addr.s_addr)
857                 return 0;
858         if (old->addr.sin_port != server->addr.sin_port)
859                 return 0;
860         return !nfs_compare_fh(&old->fh, &server->fh);
861 }
862
863 static int nfs_get_sb(struct file_system_type *fs_type,
864         int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
865 {
866         int error;
867         struct nfs_server *server = NULL;
868         struct super_block *s;
869         struct nfs_fh *root;
870         struct nfs_mount_data *data = raw_data;
871
872         error = -EINVAL;
873         if (data == NULL) {
874                 dprintk("%s: missing data argument\n", __FUNCTION__);
875                 goto out_err_noserver;
876         }
877         if (data->version <= 0 || data->version > NFS_MOUNT_VERSION) {
878                 dprintk("%s: bad mount version\n", __FUNCTION__);
879                 goto out_err_noserver;
880         }
881         switch (data->version) {
882                 case 1:
883                         data->namlen = 0;
884                 case 2:
885                         data->bsize  = 0;
886                 case 3:
887                         if (data->flags & NFS_MOUNT_VER3) {
888                                 dprintk("%s: mount structure version %d does not support NFSv3\n",
889                                                 __FUNCTION__,
890                                                 data->version);
891                                 goto out_err_noserver;
892                         }
893                         data->root.size = NFS2_FHSIZE;
894                         memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE);
895                 case 4:
896                         if (data->flags & NFS_MOUNT_SECFLAVOUR) {
897                                 dprintk("%s: mount structure version %d does not support strong security\n",
898                                                 __FUNCTION__,
899                                                 data->version);
900                                 goto out_err_noserver;
901                         }
902                 case 5:
903                         memset(data->context, 0, sizeof(data->context));
904         }
905 #ifndef CONFIG_NFS_V3
906         /* If NFSv3 is not compiled in, return -EPROTONOSUPPORT */
907         error = -EPROTONOSUPPORT;
908         if (data->flags & NFS_MOUNT_VER3) {
909                 dprintk("%s: NFSv3 not compiled into kernel\n", __FUNCTION__);
910                 goto out_err_noserver;
911         }
912 #endif /* CONFIG_NFS_V3 */
913
914         error = -ENOMEM;
915         server = kzalloc(sizeof(struct nfs_server), GFP_KERNEL);
916         if (!server)
917                 goto out_err_noserver;
918         /* Zero out the NFS state stuff */
919         init_nfsv4_state(server);
920         server->client = server->client_acl = ERR_PTR(-EINVAL);
921
922         root = &server->fh;
923         if (data->flags & NFS_MOUNT_VER3)
924                 root->size = data->root.size;
925         else
926                 root->size = NFS2_FHSIZE;
927         error = -EINVAL;
928         if (root->size > sizeof(root->data)) {
929                 dprintk("%s: invalid root filehandle\n", __FUNCTION__);
930                 goto out_err;
931         }
932         memcpy(root->data, data->root.data, root->size);
933
934         /* We now require that the mount process passes the remote address */
935         memcpy(&server->addr, &data->addr, sizeof(server->addr));
936         if (server->addr.sin_addr.s_addr == INADDR_ANY) {
937                 dprintk("%s: mount program didn't pass remote address!\n",
938                                 __FUNCTION__);
939                 goto out_err;
940         }
941
942         /* Fire up rpciod if not yet running */
943         error = rpciod_up();
944         if (error < 0) {
945                 dprintk("%s: couldn't start rpciod! Error = %d\n",
946                                 __FUNCTION__, error);
947                 goto out_err;
948         }
949
950         s = sget(fs_type, nfs_compare_super, nfs_set_super, server);
951         if (IS_ERR(s)) {
952                 error = PTR_ERR(s);
953                 goto out_err_rpciod;
954         }
955
956         if (s->s_root)
957                 goto out_rpciod_down;
958
959         s->s_flags = flags;
960
961         error = nfs_fill_super(s, data, flags & MS_SILENT ? 1 : 0);
962         if (error) {
963                 up_write(&s->s_umount);
964                 deactivate_super(s);
965                 return error;
966         }
967         s->s_flags |= MS_ACTIVE;
968         return simple_set_mnt(mnt, s);
969
970 out_rpciod_down:
971         rpciod_down();
972         kfree(server);
973         return simple_set_mnt(mnt, s);
974
975 out_err_rpciod:
976         rpciod_down();
977 out_err:
978         kfree(server);
979 out_err_noserver:
980         return error;
981 }
982
983 static void nfs_kill_super(struct super_block *s)
984 {
985         struct nfs_server *server = NFS_SB(s);
986
987         kill_anon_super(s);
988
989         if (!IS_ERR(server->client))
990                 rpc_shutdown_client(server->client);
991         if (!IS_ERR(server->client_acl))
992                 rpc_shutdown_client(server->client_acl);
993
994         if (!(server->flags & NFS_MOUNT_NONLM))
995                 lockd_down();   /* release rpc.lockd */
996
997         rpciod_down();          /* release rpciod */
998
999         nfs_free_iostats(server->io_stats);
1000         kfree(server->hostname);
1001         nfs_put_client(server->nfs_client);
1002         kfree(server);
1003         nfs_release_automount_timer();
1004 }
1005
1006 static struct super_block *nfs_clone_sb(struct nfs_server *server, struct nfs_clone_mount *data)
1007 {
1008         struct super_block *sb;
1009
1010         server->fsid = data->fattr->fsid;
1011         nfs_copy_fh(&server->fh, data->fh);
1012         sb = sget(&nfs_fs_type, nfs_compare_super, nfs_set_super, server);
1013         if (!IS_ERR(sb) && sb->s_root == NULL && !(server->flags & NFS_MOUNT_NONLM))
1014                 lockd_up();
1015         return sb;
1016 }
1017
1018 static int nfs_clone_nfs_sb(struct file_system_type *fs_type,
1019                 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
1020 {
1021         struct nfs_clone_mount *data = raw_data;
1022         return nfs_clone_generic_sb(data, nfs_clone_sb, nfs_clone_server, mnt);
1023 }
1024
1025 #ifdef CONFIG_NFS_V4
1026 static struct rpc_clnt *nfs4_create_client(struct nfs_server *server,
1027         int timeo, int retrans, int proto, rpc_authflavor_t flavor)
1028 {
1029         struct nfs_client *clp;
1030         struct rpc_clnt *clnt = NULL;
1031         int err = -EIO;
1032
1033         clp = nfs_get_client(server->hostname, &server->addr, 4);
1034         if (!clp) {
1035                 dprintk("%s: failed to create NFS4 client.\n", __FUNCTION__);
1036                 return ERR_PTR(err);
1037         }
1038
1039         /* Now create transport and client */
1040         if (clp->cl_cons_state == NFS_CS_INITING) {
1041                 clp->rpc_ops = &nfs_v4_clientops;
1042
1043                 err = nfs_create_rpc_client(clp, proto, timeo, retrans, flavor);
1044                 if (err < 0)
1045                         goto client_init_error;
1046
1047                 memcpy(clp->cl_ipaddr, server->ip_addr, sizeof(clp->cl_ipaddr));
1048                 err = nfs_idmap_new(clp);
1049                 if (err < 0) {
1050                         dprintk("%s: failed to create idmapper.\n",
1051                                 __FUNCTION__);
1052                         goto client_init_error;
1053                 }
1054                 __set_bit(NFS_CS_IDMAP, &clp->cl_res_state);
1055                 nfs_mark_client_ready(clp, 0);
1056         }
1057
1058         clnt = rpc_clone_client(clp->cl_rpcclient);
1059
1060         if (IS_ERR(clnt)) {
1061                 dprintk("%s: cannot create RPC client. Error = %d\n",
1062                                 __FUNCTION__, err);
1063                 return clnt;
1064         }
1065
1066         if (clnt->cl_auth->au_flavor != flavor) {
1067                 struct rpc_auth *auth;
1068
1069                 auth = rpcauth_create(flavor, clnt);
1070                 if (IS_ERR(auth)) {
1071                         dprintk("%s: couldn't create credcache!\n", __FUNCTION__);
1072                         return (struct rpc_clnt *)auth;
1073                 }
1074         }
1075
1076         server->nfs_client = clp;
1077         down_write(&clp->cl_sem);
1078         list_add_tail(&server->nfs4_siblings, &clp->cl_superblocks);
1079         up_write(&clp->cl_sem);
1080         return clnt;
1081
1082 client_init_error:
1083         nfs_mark_client_ready(clp, err);
1084         nfs_put_client(clp);
1085         return ERR_PTR(err);
1086 }
1087
1088 /*
1089  * Set up an NFS4 superblock
1090  */
1091 static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data, int silent)
1092 {
1093         struct nfs_server *server;
1094         rpc_authflavor_t authflavour;
1095         int err = -EIO;
1096
1097         sb->s_blocksize_bits = 0;
1098         sb->s_blocksize = 0;
1099         server = NFS_SB(sb);
1100         if (data->rsize != 0)
1101                 server->rsize = nfs_block_size(data->rsize, NULL);
1102         if (data->wsize != 0)
1103                 server->wsize = nfs_block_size(data->wsize, NULL);
1104         server->flags = data->flags & NFS_MOUNT_FLAGMASK;
1105         server->caps = NFS_CAP_ATOMIC_OPEN;
1106
1107         server->acregmin = data->acregmin*HZ;
1108         server->acregmax = data->acregmax*HZ;
1109         server->acdirmin = data->acdirmin*HZ;
1110         server->acdirmax = data->acdirmax*HZ;
1111
1112         /* Now create transport and client */
1113         authflavour = RPC_AUTH_UNIX;
1114         if (data->auth_flavourlen != 0) {
1115                 if (data->auth_flavourlen != 1) {
1116                         dprintk("%s: Invalid number of RPC auth flavours %d.\n",
1117                                         __FUNCTION__, data->auth_flavourlen);
1118                         err = -EINVAL;
1119                         goto out_fail;
1120                 }
1121                 if (copy_from_user(&authflavour, data->auth_flavours, sizeof(authflavour))) {
1122                         err = -EFAULT;
1123                         goto out_fail;
1124                 }
1125         }
1126
1127         server->client = nfs4_create_client(server, data->timeo, data->retrans,
1128                                             data->proto, authflavour);
1129         if (IS_ERR(server->client)) {
1130                 err = PTR_ERR(server->client);
1131                         dprintk("%s: cannot create RPC client. Error = %d\n",
1132                                         __FUNCTION__, err);
1133                         goto out_fail;
1134         }
1135
1136         sb->s_time_gran = 1;
1137
1138         sb->s_op = &nfs4_sops;
1139         err = nfs_sb_init(sb, authflavour);
1140
1141  out_fail:
1142         return err;
1143 }
1144
1145 static int nfs4_compare_super(struct super_block *sb, void *data)
1146 {
1147         struct nfs_server *server = data;
1148         struct nfs_server *old = NFS_SB(sb);
1149
1150         if (strcmp(server->hostname, old->hostname) != 0)
1151                 return 0;
1152         if (strcmp(server->mnt_path, old->mnt_path) != 0)
1153                 return 0;
1154         return 1;
1155 }
1156
1157 static void *
1158 nfs_copy_user_string(char *dst, struct nfs_string *src, int maxlen)
1159 {
1160         void *p = NULL;
1161
1162         if (!src->len)
1163                 return ERR_PTR(-EINVAL);
1164         if (src->len < maxlen)
1165                 maxlen = src->len;
1166         if (dst == NULL) {
1167                 p = dst = kmalloc(maxlen + 1, GFP_KERNEL);
1168                 if (p == NULL)
1169                         return ERR_PTR(-ENOMEM);
1170         }
1171         if (copy_from_user(dst, src->data, maxlen)) {
1172                 kfree(p);
1173                 return ERR_PTR(-EFAULT);
1174         }
1175         dst[maxlen] = '\0';
1176         return dst;
1177 }
1178
1179 static int nfs4_get_sb(struct file_system_type *fs_type,
1180         int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
1181 {
1182         int error;
1183         struct nfs_server *server;
1184         struct super_block *s;
1185         struct nfs4_mount_data *data = raw_data;
1186         void *p;
1187
1188         if (data == NULL) {
1189                 dprintk("%s: missing data argument\n", __FUNCTION__);
1190                 return -EINVAL;
1191         }
1192         if (data->version <= 0 || data->version > NFS4_MOUNT_VERSION) {
1193                 dprintk("%s: bad mount version\n", __FUNCTION__);
1194                 return -EINVAL;
1195         }
1196
1197         server = kzalloc(sizeof(struct nfs_server), GFP_KERNEL);
1198         if (!server)
1199                 return -ENOMEM;
1200         /* Zero out the NFS state stuff */
1201         init_nfsv4_state(server);
1202         server->client = server->client_acl = ERR_PTR(-EINVAL);
1203
1204         p = nfs_copy_user_string(NULL, &data->hostname, 256);
1205         if (IS_ERR(p))
1206                 goto out_err;
1207         server->hostname = p;
1208
1209         p = nfs_copy_user_string(NULL, &data->mnt_path, 1024);
1210         if (IS_ERR(p))
1211                 goto out_err;
1212         server->mnt_path = p;
1213
1214         p = nfs_copy_user_string(server->ip_addr, &data->client_addr,
1215                         sizeof(server->ip_addr) - 1);
1216         if (IS_ERR(p))
1217                 goto out_err;
1218
1219         /* We now require that the mount process passes the remote address */
1220         if (data->host_addrlen != sizeof(server->addr)) {
1221                 error = -EINVAL;
1222                 goto out_free;
1223         }
1224         if (copy_from_user(&server->addr, data->host_addr, sizeof(server->addr))) {
1225                 error = -EFAULT;
1226                 goto out_free;
1227         }
1228         if (server->addr.sin_family != AF_INET ||
1229             server->addr.sin_addr.s_addr == INADDR_ANY) {
1230                 dprintk("%s: mount program didn't pass remote IP address!\n",
1231                                 __FUNCTION__);
1232                 error = -EINVAL;
1233                 goto out_free;
1234         }
1235
1236         s = sget(fs_type, nfs4_compare_super, nfs_set_super, server);
1237         if (IS_ERR(s)) {
1238                 error = PTR_ERR(s);
1239                 goto out_free;
1240         }
1241
1242         if (s->s_root) {
1243                 kfree(server->mnt_path);
1244                 kfree(server->hostname);
1245                 kfree(server);
1246                 return simple_set_mnt(mnt, s);
1247         }
1248
1249         s->s_flags = flags;
1250
1251         error = nfs4_fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1252         if (error) {
1253                 up_write(&s->s_umount);
1254                 deactivate_super(s);
1255                 return error;
1256         }
1257         s->s_flags |= MS_ACTIVE;
1258         return simple_set_mnt(mnt, s);
1259 out_err:
1260         error = PTR_ERR(p);
1261 out_free:
1262         kfree(server->mnt_path);
1263         kfree(server->hostname);
1264         kfree(server);
1265         return error;
1266 }
1267
1268 static void nfs4_kill_super(struct super_block *sb)
1269 {
1270         struct nfs_server *server = NFS_SB(sb);
1271
1272         nfs_return_all_delegations(sb);
1273         kill_anon_super(sb);
1274
1275         nfs4_renewd_prepare_shutdown(server);
1276
1277         if (server->client != NULL && !IS_ERR(server->client))
1278                 rpc_shutdown_client(server->client);
1279
1280         destroy_nfsv4_state(server);
1281
1282         nfs_free_iostats(server->io_stats);
1283         kfree(server->hostname);
1284         kfree(server);
1285         nfs_release_automount_timer();
1286 }
1287
1288 /*
1289  * Constructs the SERVER-side path
1290  */
1291 static inline char *nfs4_dup_path(const struct dentry *dentry)
1292 {
1293         char *page = (char *) __get_free_page(GFP_USER);
1294         char *path;
1295
1296         path = nfs4_path(dentry, page, PAGE_SIZE);
1297         if (!IS_ERR(path)) {
1298                 int len = PAGE_SIZE + page - path;
1299                 char *tmp = path;
1300
1301                 path = kmalloc(len, GFP_KERNEL);
1302                 if (path)
1303                         memcpy(path, tmp, len);
1304                 else
1305                         path = ERR_PTR(-ENOMEM);
1306         }
1307         free_page((unsigned long)page);
1308         return path;
1309 }
1310
1311 static struct super_block *nfs4_clone_sb(struct nfs_server *server, struct nfs_clone_mount *data)
1312 {
1313         const struct dentry *dentry = data->dentry;
1314         struct nfs_client *clp = server->nfs_client;
1315         struct super_block *sb;
1316
1317         server->fsid = data->fattr->fsid;
1318         nfs_copy_fh(&server->fh, data->fh);
1319         server->mnt_path = nfs4_dup_path(dentry);
1320         if (IS_ERR(server->mnt_path)) {
1321                 sb = (struct super_block *)server->mnt_path;
1322                 goto err;
1323         }
1324         sb = sget(&nfs4_fs_type, nfs4_compare_super, nfs_set_super, server);
1325         if (IS_ERR(sb) || sb->s_root)
1326                 goto free_path;
1327         nfs4_server_capabilities(server, &server->fh);
1328
1329         down_write(&clp->cl_sem);
1330         list_add_tail(&server->nfs4_siblings, &clp->cl_superblocks);
1331         up_write(&clp->cl_sem);
1332         return sb;
1333 free_path:
1334         kfree(server->mnt_path);
1335 err:
1336         server->mnt_path = NULL;
1337         return sb;
1338 }
1339
1340 static int nfs_clone_nfs4_sb(struct file_system_type *fs_type,
1341                 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
1342 {
1343         struct nfs_clone_mount *data = raw_data;
1344         return nfs_clone_generic_sb(data, nfs4_clone_sb, nfs_clone_server, mnt);
1345 }
1346
1347 static struct super_block *nfs4_referral_sb(struct nfs_server *server, struct nfs_clone_mount *data)
1348 {
1349         struct super_block *sb = ERR_PTR(-ENOMEM);
1350         int len;
1351
1352         len = strlen(data->mnt_path) + 1;
1353         server->mnt_path = kmalloc(len, GFP_KERNEL);
1354         if (server->mnt_path == NULL)
1355                 goto err;
1356         memcpy(server->mnt_path, data->mnt_path, len);
1357         memcpy(&server->addr, data->addr, sizeof(struct sockaddr_in));
1358
1359         sb = sget(&nfs4_fs_type, nfs4_compare_super, nfs_set_super, server);
1360         if (IS_ERR(sb) || sb->s_root)
1361                 goto free_path;
1362         return sb;
1363 free_path:
1364         kfree(server->mnt_path);
1365 err:
1366         server->mnt_path = NULL;
1367         return sb;
1368 }
1369
1370 static struct nfs_server *nfs4_referral_server(struct super_block *sb, struct nfs_clone_mount *data)
1371 {
1372         struct nfs_server *server = NFS_SB(sb);
1373         int proto, timeo, retrans;
1374         void *err;
1375
1376         proto = IPPROTO_TCP;
1377         /* Since we are following a referral and there may be alternatives,
1378            set the timeouts and retries to low values */
1379         timeo = 2;
1380         retrans = 1;
1381
1382         nfs_put_client(server->nfs_client);
1383         server->nfs_client = NULL;
1384         server->client = nfs4_create_client(server, timeo, retrans, proto,
1385                                             data->authflavor);
1386         if (IS_ERR((err = server->client)))
1387                 goto out_err;
1388
1389         sb->s_time_gran = 1;
1390         sb->s_op = &nfs4_sops;
1391         err = ERR_PTR(nfs_sb_init(sb, data->authflavor));
1392         if (!IS_ERR(err))
1393                 return server;
1394 out_err:
1395         return (struct nfs_server *)err;
1396 }
1397
1398 static int nfs_referral_nfs4_sb(struct file_system_type *fs_type,
1399                 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
1400 {
1401         struct nfs_clone_mount *data = raw_data;
1402         return nfs_clone_generic_sb(data, nfs4_referral_sb, nfs4_referral_server, mnt);
1403 }
1404
1405 #endif