Whamcloud - gitweb
send activate event only when connect finished and import state is FULL.
[fs/lustre-release.git] / lustre / obdclass / obd_mount.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * lustre/obdclass/obd_mount.c
37  *
38  * Client/server mount routines
39  *
40  * Author: Nathan Rutman <nathan@clusterfs.com>
41  */
42
43
44 #define DEBUG_SUBSYSTEM S_CLASS
45 #define D_MOUNT D_SUPER|D_CONFIG /*|D_WARNING */
46 #define PRINT_CMD CDEBUG
47 #define PRINT_MASK D_SUPER|D_CONFIG
48
49 #include <obd.h>
50 #include <lvfs.h>
51 #include <lustre_fsfilt.h>
52 #include <obd_class.h>
53 #include <lustre/lustre_user.h>
54 #include <linux/version.h>
55 #include <lustre_log.h>
56 #include <lustre_disk.h>
57 #include <lustre_param.h>
58
59 static int (*client_fill_super)(struct super_block *sb) = NULL;
60 static void (*kill_super_cb)(struct super_block *sb) = NULL;
61
62 /*********** mount lookup *********/
63
64 DECLARE_MUTEX(lustre_mount_info_lock);
65 static CFS_LIST_HEAD(server_mount_info_list);
66
67 static struct lustre_mount_info *server_find_mount(const char *name)
68 {
69         struct list_head *tmp;
70         struct lustre_mount_info *lmi;
71         ENTRY;
72
73         list_for_each(tmp, &server_mount_info_list) {
74                 lmi = list_entry(tmp, struct lustre_mount_info, lmi_list_chain);
75                 if (strcmp(name, lmi->lmi_name) == 0)
76                         RETURN(lmi);
77         }
78         RETURN(NULL);
79 }
80
81 /* we must register an obd for a mount before we call the setup routine.
82    *_setup will call lustre_get_mount to get the mnt struct
83    by obd_name, since we can't pass the pointer to setup. */
84 static int server_register_mount(const char *name, struct super_block *sb,
85                           struct vfsmount *mnt)
86 {
87         struct lustre_mount_info *lmi;
88         char *name_cp;
89         ENTRY;
90
91         LASSERT(mnt);
92         LASSERT(sb);
93
94         OBD_ALLOC(lmi, sizeof(*lmi));
95         if (!lmi)
96                 RETURN(-ENOMEM);
97         OBD_ALLOC(name_cp, strlen(name) + 1);
98         if (!name_cp) {
99                 OBD_FREE(lmi, sizeof(*lmi));
100                 RETURN(-ENOMEM);
101         }
102         strcpy(name_cp, name);
103
104         down(&lustre_mount_info_lock);
105
106         if (server_find_mount(name)) {
107                 up(&lustre_mount_info_lock);
108                 OBD_FREE(lmi, sizeof(*lmi));
109                 OBD_FREE(name_cp, strlen(name) + 1);
110                 CERROR("Already registered %s\n", name);
111                 RETURN(-EEXIST);
112         }
113         lmi->lmi_name = name_cp;
114         lmi->lmi_sb = sb;
115         lmi->lmi_mnt = mnt;
116         list_add(&lmi->lmi_list_chain, &server_mount_info_list);
117
118         up(&lustre_mount_info_lock);
119
120         CDEBUG(D_MOUNT, "reg_mnt %p from %s, vfscount=%d\n",
121                lmi->lmi_mnt, name, atomic_read(&lmi->lmi_mnt->mnt_count));
122
123         RETURN(0);
124 }
125
126 /* when an obd no longer needs a mount */
127 static int server_deregister_mount(const char *name)
128 {
129         struct lustre_mount_info *lmi;
130         ENTRY;
131
132         down(&lustre_mount_info_lock);
133         lmi = server_find_mount(name);
134         if (!lmi) {
135                 up(&lustre_mount_info_lock);
136                 CERROR("%s not registered\n", name);
137                 RETURN(-ENOENT);
138         }
139
140         CDEBUG(D_MOUNT, "dereg_mnt %p from %s, vfscount=%d\n",
141                lmi->lmi_mnt, name, atomic_read(&lmi->lmi_mnt->mnt_count));
142
143         OBD_FREE(lmi->lmi_name, strlen(lmi->lmi_name) + 1);
144         list_del(&lmi->lmi_list_chain);
145         OBD_FREE(lmi, sizeof(*lmi));
146         up(&lustre_mount_info_lock);
147
148         RETURN(0);
149 }
150
151 /* obd's look up a registered mount using their obdname. This is just
152    for initial obd setup to find the mount struct.  It should not be
153    called every time you want to mntget. */
154 struct lustre_mount_info *server_get_mount(const char *name)
155 {
156         struct lustre_mount_info *lmi;
157         struct lustre_sb_info *lsi;
158         ENTRY;
159
160         down(&lustre_mount_info_lock);
161         lmi = server_find_mount(name);
162         up(&lustre_mount_info_lock);
163         if (!lmi) {
164                 CERROR("Can't find mount for %s\n", name);
165                 RETURN(NULL);
166         }
167         lsi = s2lsi(lmi->lmi_sb);
168         mntget(lmi->lmi_mnt);
169         atomic_inc(&lsi->lsi_mounts);
170
171         CDEBUG(D_MOUNT, "get_mnt %p from %s, refs=%d, vfscount=%d\n",
172                lmi->lmi_mnt, name, atomic_read(&lsi->lsi_mounts),
173                atomic_read(&lmi->lmi_mnt->mnt_count));
174
175         RETURN(lmi);
176 }
177
178 /*
179  * Used by mdt to get mount_info from obdname.
180  * There are no blocking when using the mount_info.
181  * Do not use server_get_mount for this purpose.
182  */
183 struct lustre_mount_info *server_get_mount_2(const char *name)
184 {
185         struct lustre_mount_info *lmi;
186         ENTRY;
187
188         down(&lustre_mount_info_lock);
189         lmi = server_find_mount(name);
190         up(&lustre_mount_info_lock);
191         if (!lmi)
192                 CERROR("Can't find mount for %s\n", name);
193
194         RETURN(lmi);
195 }
196
197 static void unlock_mntput(struct vfsmount *mnt)
198 {
199         if (kernel_locked()) {
200                 unlock_kernel();
201                 mntput(mnt);
202                 lock_kernel();
203         } else {
204                 mntput(mnt);
205         }
206 }
207
208 static int lustre_put_lsi(struct super_block *sb);
209
210 /* to be called from obd_cleanup methods */
211 int server_put_mount(const char *name, struct vfsmount *mnt)
212 {
213         struct lustre_mount_info *lmi;
214         struct lustre_sb_info *lsi;
215         int count = atomic_read(&mnt->mnt_count) - 1;
216         ENTRY;
217
218         /* This might be the last one, can't deref after this */
219         unlock_mntput(mnt);
220
221         down(&lustre_mount_info_lock);
222         lmi = server_find_mount(name);
223         up(&lustre_mount_info_lock);
224         if (!lmi) {
225                 CERROR("Can't find mount for %s\n", name);
226                 RETURN(-ENOENT);
227         }
228         lsi = s2lsi(lmi->lmi_sb);
229         LASSERT(lmi->lmi_mnt == mnt);
230
231         CDEBUG(D_MOUNT, "put_mnt %p from %s, refs=%d, vfscount=%d\n",
232                lmi->lmi_mnt, name, atomic_read(&lsi->lsi_mounts), count);
233
234         if (lustre_put_lsi(lmi->lmi_sb)) {
235                 CDEBUG(D_MOUNT, "Last put of mnt %p from %s, vfscount=%d\n",
236                        lmi->lmi_mnt, name, count);
237                 /* last mount is the One True Mount */
238                 if (count > 1)
239                         CERROR("%s: mount busy, vfscount=%d!\n", name, count);
240         }
241
242         /* this obd should never need the mount again */
243         server_deregister_mount(name);
244
245         RETURN(0);
246 }
247
248 /* Corresponding to server_get_mount_2 */
249 int server_put_mount_2(const char *name, struct vfsmount *mnt)
250 {
251         ENTRY;
252         RETURN(0);
253 }
254
255 /******* mount helper utilities *********/
256
257 #if 0
258 static void ldd_print(struct lustre_disk_data *ldd)
259 {
260         PRINT_CMD(PRINT_MASK, "  disk data:\n");
261         PRINT_CMD(PRINT_MASK, "server:  %s\n", ldd->ldd_svname);
262         PRINT_CMD(PRINT_MASK, "uuid:    %s\n", (char *)ldd->ldd_uuid);
263         PRINT_CMD(PRINT_MASK, "fs:      %s\n", ldd->ldd_fsname);
264         PRINT_CMD(PRINT_MASK, "index:   %04x\n", ldd->ldd_svindex);
265         PRINT_CMD(PRINT_MASK, "config:  %d\n", ldd->ldd_config_ver);
266         PRINT_CMD(PRINT_MASK, "flags:   %#x\n", ldd->ldd_flags);
267         PRINT_CMD(PRINT_MASK, "diskfs:  %s\n", MT_STR(ldd));
268         PRINT_CMD(PRINT_MASK, "options: %s\n", ldd->ldd_mount_opts);
269         PRINT_CMD(PRINT_MASK, "params:  %s\n", ldd->ldd_params);
270         PRINT_CMD(PRINT_MASK, "comment: %s\n", ldd->ldd_userdata);
271 }
272 #endif
273
274 static int ldd_parse(struct lvfs_run_ctxt *mount_ctxt,
275                            struct lustre_disk_data *ldd)
276 {
277         struct lvfs_run_ctxt saved;
278         struct file *file;
279         loff_t off = 0;
280         unsigned long len;
281         int rc;
282         ENTRY;
283
284         push_ctxt(&saved, mount_ctxt, NULL);
285
286         file = filp_open(MOUNT_DATA_FILE, O_RDONLY, 0644);
287         if (IS_ERR(file)) {
288                 rc = PTR_ERR(file);
289                 CERROR("cannot open %s: rc = %d\n", MOUNT_DATA_FILE, rc);
290                 GOTO(out, rc);
291         }
292
293         len = i_size_read(file->f_dentry->d_inode);
294         CDEBUG(D_MOUNT, "Have %s, size %lu\n", MOUNT_DATA_FILE, len);
295         if (len != sizeof(*ldd)) {
296                 CERROR("disk data size does not match: see %lu expect "LPSZ"\n",
297                        len, sizeof(*ldd));
298                 GOTO(out_close, rc = -EINVAL);
299         }
300
301         rc = lustre_fread(file, ldd, len, &off);
302         if (rc != len) {
303                 CERROR("error reading %s: read %d of %lu\n",
304                        MOUNT_DATA_FILE, rc, len);
305                 GOTO(out_close, rc = -EINVAL);
306         }
307         rc = 0;
308
309         if (ldd->ldd_magic != LDD_MAGIC) {
310                 /* FIXME add swabbing support */
311                 CERROR("Bad magic in %s: %x!=%x\n", MOUNT_DATA_FILE,
312                        ldd->ldd_magic, LDD_MAGIC);
313                 GOTO(out_close, rc = -EINVAL);
314         }
315
316         if (ldd->ldd_feature_incompat & ~LDD_INCOMPAT_SUPP) {
317                 CERROR("%s: unsupported incompat filesystem feature(s) %x\n",
318                        ldd->ldd_svname,
319                        ldd->ldd_feature_incompat & ~LDD_INCOMPAT_SUPP);
320                 GOTO(out_close, rc = -EINVAL);
321         }
322         if (ldd->ldd_feature_rocompat & ~LDD_ROCOMPAT_SUPP) {
323                 CERROR("%s: unsupported read-only filesystem feature(s) %x\n",
324                        ldd->ldd_svname,
325                        ldd->ldd_feature_rocompat & ~LDD_ROCOMPAT_SUPP);
326                 /* Do something like remount filesystem read-only */
327                 GOTO(out_close, rc = -EINVAL);
328         }
329
330 out_close:
331         filp_close(file, 0);
332 out:
333         pop_ctxt(&saved, mount_ctxt, NULL);
334         RETURN(rc);
335 }
336
337 static int ldd_write(struct lvfs_run_ctxt *mount_ctxt,
338                      struct lustre_disk_data *ldd)
339 {
340         struct lvfs_run_ctxt saved;
341         struct file *file;
342         loff_t off = 0;
343         unsigned long len = sizeof(struct lustre_disk_data);
344         int rc = 0;
345         ENTRY;
346
347         LASSERT(ldd->ldd_magic == LDD_MAGIC);
348
349         ldd->ldd_config_ver++;
350
351         push_ctxt(&saved, mount_ctxt, NULL);
352
353         file = filp_open(MOUNT_DATA_FILE, O_RDWR, 0644);
354         if (IS_ERR(file)) {
355                 rc = PTR_ERR(file);
356                 CERROR("cannot open %s: rc = %d\n", MOUNT_DATA_FILE, rc);
357                 GOTO(out, rc);
358         }
359
360         rc = lustre_fwrite(file, ldd, len, &off);
361         if (rc != len) {
362                 CERROR("error writing %s: read %d of %lu\n",
363                        MOUNT_DATA_FILE, rc, len);
364                 GOTO(out_close, rc = -EINVAL);
365         }
366
367         rc = 0;
368
369 out_close:
370         filp_close(file, 0);
371 out:
372         pop_ctxt(&saved, mount_ctxt, NULL);
373         RETURN(rc);
374 }
375
376
377 /**************** config llog ********************/
378
379 /* Get a config log from the MGS and process it.
380    This func is called for both clients and servers.
381    Continue to process new statements appended to the logs
382    (whenever the config lock is revoked) until lustre_end_log
383    is called. */
384 int lustre_process_log(struct super_block *sb, char *logname,
385                      struct config_llog_instance *cfg)
386 {
387         struct lustre_cfg *lcfg;
388         struct lustre_cfg_bufs bufs;
389         struct lustre_sb_info *lsi = s2lsi(sb);
390         struct obd_device *mgc = lsi->lsi_mgc;
391         int rc;
392         ENTRY;
393
394         LASSERT(mgc);
395         LASSERT(cfg);
396
397         /* mgc_process_config */
398         lustre_cfg_bufs_reset(&bufs, mgc->obd_name);
399         lustre_cfg_bufs_set_string(&bufs, 1, logname);
400         lustre_cfg_bufs_set(&bufs, 2, cfg, sizeof(*cfg));
401         lustre_cfg_bufs_set(&bufs, 3, &sb, sizeof(sb));
402         lcfg = lustre_cfg_new(LCFG_LOG_START, &bufs);
403         rc = obd_process_config(mgc, sizeof(*lcfg), lcfg);
404         lustre_cfg_free(lcfg);
405
406         if (rc == -EINVAL)
407                 LCONSOLE_ERROR_MSG(0x15b, "%s: The configuration from log '%s'"
408                                    "failed from the MGS (%d).  Make sure this "
409                                    "client and the MGS are running compatible "
410                                    "versions of Lustre.\n",
411                                    mgc->obd_name, logname, rc);
412
413         if (rc)
414                 LCONSOLE_ERROR_MSG(0x15c, "%s: The configuration from log '%s' "
415                                    "failed (%d). This may be the result of "
416                                    "communication errors between this node and "
417                                    "the MGS, a bad configuration, or other "
418                                    "errors. See the syslog for more "
419                                    "information.\n", mgc->obd_name, logname,
420                                    rc);
421
422         /* class_obd_list(); */
423         RETURN(rc);
424 }
425
426 /* Stop watching this config log for updates */
427 int lustre_end_log(struct super_block *sb, char *logname,
428                        struct config_llog_instance *cfg)
429 {
430         struct lustre_cfg *lcfg;
431         struct lustre_cfg_bufs bufs;
432         struct lustre_sb_info *lsi = s2lsi(sb);
433         struct obd_device *mgc = lsi->lsi_mgc;
434         int rc;
435         ENTRY;
436
437         if (!mgc)
438                 RETURN(-ENOENT);
439
440         /* mgc_process_config */
441         lustre_cfg_bufs_reset(&bufs, mgc->obd_name);
442         lustre_cfg_bufs_set_string(&bufs, 1, logname);
443         if (cfg)
444                 lustre_cfg_bufs_set(&bufs, 2, cfg, sizeof(*cfg));
445         lcfg = lustre_cfg_new(LCFG_LOG_END, &bufs);
446         rc = obd_process_config(mgc, sizeof(*lcfg), lcfg);
447         lustre_cfg_free(lcfg);
448         RETURN(rc);
449 }
450
451 /**************** obd start *******************/
452
453 int do_lcfg(char *cfgname, lnet_nid_t nid, int cmd,
454             char *s1, char *s2, char *s3, char *s4)
455 {
456         struct lustre_cfg_bufs bufs;
457         struct lustre_cfg    * lcfg = NULL;
458         int rc;
459
460         CDEBUG(D_TRACE, "lcfg %s %#x %s %s %s %s\n", cfgname,
461                cmd, s1, s2, s3, s4);
462
463         lustre_cfg_bufs_reset(&bufs, cfgname);
464         if (s1)
465                 lustre_cfg_bufs_set_string(&bufs, 1, s1);
466         if (s2)
467                 lustre_cfg_bufs_set_string(&bufs, 2, s2);
468         if (s3)
469                 lustre_cfg_bufs_set_string(&bufs, 3, s3);
470         if (s4)
471                 lustre_cfg_bufs_set_string(&bufs, 4, s4);
472
473         lcfg = lustre_cfg_new(cmd, &bufs);
474         lcfg->lcfg_nid = nid;
475         rc = class_process_config(lcfg);
476         lustre_cfg_free(lcfg);
477         return(rc);
478 }
479
480 static int lustre_start_simple(char *obdname, char *type, char *uuid,
481                                char *s1, char *s2)
482 {
483         int rc;
484         CDEBUG(D_MOUNT, "Starting obd %s (typ=%s)\n", obdname, type);
485
486         rc = do_lcfg(obdname, 0, LCFG_ATTACH, type, uuid, 0, 0);
487         if (rc) {
488                 CERROR("%s attach error %d\n", obdname, rc);
489                 return(rc);
490         }
491         rc = do_lcfg(obdname, 0, LCFG_SETUP, s1, s2, 0, 0);
492         if (rc) {
493                 CERROR("%s setup error %d\n", obdname, rc);
494                 do_lcfg(obdname, 0, LCFG_DETACH, 0, 0, 0, 0);
495         }
496         return rc;
497 }
498
499 /* Set up a MGS to serve startup logs */
500 static int server_start_mgs(struct super_block *sb)
501 {
502         struct lustre_sb_info    *lsi = s2lsi(sb);
503         struct vfsmount          *mnt = lsi->lsi_srv_mnt;
504         struct lustre_mount_info *lmi;
505         int    rc = 0;
506         ENTRY;
507         LASSERT(mnt);
508
509         /* It is impossible to have more than 1 MGS per node, since
510            MGC wouldn't know which to connect to */
511         lmi = server_find_mount(LUSTRE_MGS_OBDNAME);
512         if (lmi) {
513                 lsi = s2lsi(lmi->lmi_sb);
514                 LCONSOLE_ERROR_MSG(0x15d, "The MGS service was already started"
515                                    " from server %s\n",
516                                    lsi->lsi_ldd->ldd_svname);
517                 RETURN(-EALREADY);
518         }
519
520         CDEBUG(D_CONFIG, "Start MGS service %s\n", LUSTRE_MGS_OBDNAME);
521
522         rc = server_register_mount(LUSTRE_MGS_OBDNAME, sb, mnt);
523
524         if (!rc) {
525                 rc = lustre_start_simple(LUSTRE_MGS_OBDNAME, LUSTRE_MGS_NAME,
526                                          LUSTRE_MGS_OBDNAME, 0, 0);
527                 /* Do NOT call server_deregister_mount() here. This leads to
528                  * inability cleanup cleanly and free lsi and other stuff when
529                  * mgs calls server_put_mount() in error handling case. -umka */
530         }
531
532         if (rc)
533                 LCONSOLE_ERROR_MSG(0x15e, "Failed to start MGS '%s' (%d). "
534                                    "Is the 'mgs' module loaded?\n",
535                                    LUSTRE_MGS_OBDNAME, rc);
536         RETURN(rc);
537 }
538
539 static int server_stop_mgs(struct super_block *sb)
540 {
541         struct obd_device *obd;
542         int rc;
543         ENTRY;
544
545         CDEBUG(D_MOUNT, "Stop MGS service %s\n", LUSTRE_MGS_OBDNAME);
546
547         /* There better be only one MGS */
548         obd = class_name2obd(LUSTRE_MGS_OBDNAME);
549         if (!obd) {
550                 CDEBUG(D_CONFIG, "mgs %s not running\n", LUSTRE_MGS_OBDNAME);
551                 RETURN(-EALREADY);
552         }
553
554         /* The MGS should always stop when we say so */
555         obd->obd_force = 1;
556         rc = class_manual_cleanup(obd);
557         RETURN(rc);
558 }
559
560 DECLARE_MUTEX(mgc_start_lock);
561
562 /** Set up a mgc obd to process startup logs
563  *
564  * \param sb [in] super block of the mgc obd
565  *
566  * \retval 0 success, otherwise error code
567  */
568 static int lustre_start_mgc(struct super_block *sb)
569 {
570         struct obd_connect_data *data = NULL;
571         struct lustre_sb_info *lsi = s2lsi(sb);
572         struct obd_device *obd;
573         struct obd_export *exp;
574         struct obd_uuid *uuid;
575         class_uuid_t uuidc;
576         lnet_nid_t nid;
577         char *mgcname, *niduuid, *mgssec;
578         char *ptr;
579         int recov_bk;
580         int rc = 0, i = 0, j, len;
581         ENTRY;
582
583         LASSERT(lsi->lsi_lmd);
584
585         /* Find the first non-lo MGS nid for our MGC name */
586         if (lsi->lsi_flags & LSI_SERVER) {
587                 ptr = lsi->lsi_ldd->ldd_params;
588                 /* Use mgsnode= nids */
589                 if ((class_find_param(ptr, PARAM_MGSNODE, &ptr) == 0) &&
590                     (class_parse_nid(ptr, &nid, &ptr) == 0)) {
591                         i++;
592                 } else if (IS_MGS(lsi->lsi_ldd)) {
593                         lnet_process_id_t id;
594                         while ((rc = LNetGetId(i++, &id)) != -ENOENT) {
595                                 if (LNET_NETTYP(LNET_NIDNET(id.nid)) == LOLND)
596                                         continue;
597                                 nid = id.nid;
598                                 i++;
599                                 break;
600                         }
601                 }
602         } else { /* client */
603                 /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */
604                 ptr = lsi->lsi_lmd->lmd_dev;
605                 if (class_parse_nid(ptr, &nid, &ptr) == 0)
606                         i++;
607         }
608         if (i == 0) {
609                 CERROR("No valid MGS nids found.\n");
610                 RETURN(-EINVAL);
611         }
612
613         len = strlen(LUSTRE_MGC_OBDNAME) + strlen(libcfs_nid2str(nid)) + 1;
614         OBD_ALLOC(mgcname, len);
615         OBD_ALLOC(niduuid, len + 2);
616         if (!mgcname || !niduuid)
617                 GOTO(out_free, rc = -ENOMEM);
618         sprintf(mgcname, "%s%s", LUSTRE_MGC_OBDNAME, libcfs_nid2str(nid));
619
620         mgssec = lsi->lsi_lmd->lmd_mgssec ? lsi->lsi_lmd->lmd_mgssec : "";
621
622         mutex_down(&mgc_start_lock);
623
624         obd = class_name2obd(mgcname);
625         if (obd && !obd->obd_stopping) {
626                 rc = obd_set_info_async(obd->obd_self_export,
627                                         strlen(KEY_MGSSEC), KEY_MGSSEC,
628                                         strlen(mgssec), mgssec, NULL);
629                 if (rc)
630                         GOTO(out_free, rc);
631
632                 /* Re-using an existing MGC */
633                 atomic_inc(&obd->u.cli.cl_mgc_refcount);
634
635                 recov_bk = 0;
636                 /* If we are restarting the MGS, don't try to keep the MGC's
637                    old connection, or registration will fail. */
638                 if ((lsi->lsi_flags & LSI_SERVER) && IS_MGS(lsi->lsi_ldd)) {
639                         CDEBUG(D_MOUNT, "New MGS with live MGC\n");
640                         recov_bk = 1;
641                 }
642
643                 /* Try all connections, but only once (again).
644                    We don't want to block another target from starting
645                    (using its local copy of the log), but we do want to connect
646                    if at all possible. */
647                 recov_bk++;
648                 CDEBUG(D_MOUNT, "%s: Set MGC reconnect %d\n", mgcname,recov_bk);
649                 rc = obd_set_info_async(obd->obd_self_export,
650                                         sizeof(KEY_INIT_RECOV_BACKUP),
651                                         KEY_INIT_RECOV_BACKUP,
652                                         sizeof(recov_bk), &recov_bk, NULL);
653                 GOTO(out, rc = 0);
654         }
655
656         CDEBUG(D_MOUNT, "Start MGC '%s'\n", mgcname);
657
658         /* Add the primary nids for the MGS */
659         i = 0;
660         sprintf(niduuid, "%s_%x", mgcname, i);
661         if (lsi->lsi_flags & LSI_SERVER) {
662                 ptr = lsi->lsi_ldd->ldd_params;
663                 if (IS_MGS(lsi->lsi_ldd)) {
664                         /* Use local nids (including LO) */
665                         lnet_process_id_t id;
666                         while ((rc = LNetGetId(i++, &id)) != -ENOENT) {
667                                 rc = do_lcfg(mgcname, id.nid,
668                                              LCFG_ADD_UUID, niduuid, 0,0,0);
669                         }
670                 } else {
671                         /* Use mgsnode= nids */
672                         if (class_find_param(ptr, PARAM_MGSNODE, &ptr) != 0) {
673                                 CERROR("No MGS nids given.\n");
674                                 GOTO(out_free, rc = -EINVAL);
675                         }
676                         while (class_parse_nid(ptr, &nid, &ptr) == 0) {
677                                 rc = do_lcfg(mgcname, nid,
678                                              LCFG_ADD_UUID, niduuid, 0,0,0);
679                                 i++;
680                         }
681                 }
682         } else { /* client */
683                 /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */
684                 ptr = lsi->lsi_lmd->lmd_dev;
685                 while (class_parse_nid(ptr, &nid, &ptr) == 0) {
686                         rc = do_lcfg(mgcname, nid,
687                                      LCFG_ADD_UUID, niduuid, 0,0,0);
688                         i++;
689                         /* Stop at the first failover nid */
690                         if (*ptr == ':')
691                                 break;
692                 }
693         }
694         if (i == 0) {
695                 CERROR("No valid MGS nids found.\n");
696                 GOTO(out_free, rc = -EINVAL);
697         }
698         lsi->lsi_lmd->lmd_mgs_failnodes = 1;
699
700         /* Random uuid for MGC allows easier reconnects */
701         OBD_ALLOC_PTR(uuid);
702         ll_generate_random_uuid(uuidc);
703         class_uuid_unparse(uuidc, uuid);
704
705         /* Start the MGC */
706         rc = lustre_start_simple(mgcname, LUSTRE_MGC_NAME,
707                                  (char *)uuid->uuid, LUSTRE_MGS_OBDNAME,
708                                  niduuid);
709         OBD_FREE_PTR(uuid);
710         if (rc)
711                 GOTO(out_free, rc);
712
713         /* Add any failover MGS nids */
714         i = 1;
715         while ((*ptr == ':' ||
716                 class_find_param(ptr, PARAM_MGSNODE, &ptr) == 0)) {
717                 /* New failover node */
718                 sprintf(niduuid, "%s_%x", mgcname, i);
719                 j = 0;
720                 while (class_parse_nid(ptr, &nid, &ptr) == 0) {
721                         j++;
722                         rc = do_lcfg(mgcname, nid,
723                                      LCFG_ADD_UUID, niduuid, 0,0,0);
724                         if (*ptr == ':')
725                                 break;
726                 }
727                 if (j > 0) {
728                         rc = do_lcfg(mgcname, 0, LCFG_ADD_CONN,
729                                      niduuid, 0, 0, 0);
730                         i++;
731                 } else {
732                         /* at ":/fsname" */
733                         break;
734                 }
735         }
736         lsi->lsi_lmd->lmd_mgs_failnodes = i;
737
738         obd = class_name2obd(mgcname);
739         if (!obd) {
740                 CERROR("Can't find mgcobd %s\n", mgcname);
741                 GOTO(out_free, rc = -ENOTCONN);
742         }
743
744         rc = obd_set_info_async(obd->obd_self_export,
745                                 strlen(KEY_MGSSEC), KEY_MGSSEC,
746                                 strlen(mgssec), mgssec, NULL);
747         if (rc)
748                 GOTO(out_free, rc);
749
750         /* Keep a refcount of servers/clients who started with "mount",
751            so we know when we can get rid of the mgc. */
752         atomic_set(&obd->u.cli.cl_mgc_refcount, 1);
753
754         /* Try all connections, but only once. */
755         recov_bk = 1;
756         rc = obd_set_info_async(obd->obd_self_export,
757                                 sizeof(KEY_INIT_RECOV_BACKUP),
758                                 KEY_INIT_RECOV_BACKUP,
759                                 sizeof(recov_bk), &recov_bk, NULL);
760         if (rc)
761                 /* nonfatal */
762                 CWARN("can't set %s %d\n", KEY_INIT_RECOV_BACKUP, rc);
763         /* We connect to the MGS at setup, and don't disconnect until cleanup */
764         OBD_ALLOC_PTR(data);
765         if (data == NULL)
766                 GOTO(out, rc = -ENOMEM);
767         data->ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_FID |
768                                   OBD_CONNECT_AT;
769         data->ocd_version = LUSTRE_VERSION_CODE;
770         rc = obd_connect(NULL, &exp, obd, &(obd->obd_uuid), data, NULL);
771         OBD_FREE_PTR(data);
772         if (rc) {
773                 CERROR("connect failed %d\n", rc);
774                 GOTO(out, rc);
775         }
776
777         obd->u.cli.cl_mgc_mgsexp = exp;
778
779 out:
780         /* Keep the mgc info in the sb. Note that many lsi's can point
781            to the same mgc.*/
782         lsi->lsi_mgc = obd;
783 out_free:
784         mutex_up(&mgc_start_lock);
785
786         if (mgcname)
787                 OBD_FREE(mgcname, len);
788         if (niduuid)
789                 OBD_FREE(niduuid, len + 2);
790         RETURN(rc);
791 }
792
793 static int lustre_stop_mgc(struct super_block *sb)
794 {
795         struct lustre_sb_info *lsi = s2lsi(sb);
796         struct obd_device *obd;
797         char *niduuid = 0, *ptr = 0;
798         int i, rc = 0, len = 0;
799         ENTRY;
800
801         if (!lsi)
802                 RETURN(-ENOENT);
803         obd = lsi->lsi_mgc;
804         if (!obd)
805                 RETURN(-ENOENT);
806         lsi->lsi_mgc = NULL;
807
808         mutex_down(&mgc_start_lock);
809         LASSERT(atomic_read(&obd->u.cli.cl_mgc_refcount) > 0);
810         if (!atomic_dec_and_test(&obd->u.cli.cl_mgc_refcount)) {
811                 /* This is not fatal, every client that stops
812                    will call in here. */
813                 CDEBUG(D_MOUNT, "mgc still has %d references.\n",
814                        atomic_read(&obd->u.cli.cl_mgc_refcount));
815                 GOTO(out, rc = -EBUSY);
816         }
817
818         /* The MGC has no recoverable data in any case.
819          * force shotdown set in umount_begin */
820         obd->obd_no_recov = 1;
821
822         if (obd->u.cli.cl_mgc_mgsexp) {
823                 /* An error is not fatal, if we are unable to send the
824                    disconnect mgs ping evictor cleans up the export */
825                 rc = obd_disconnect(obd->u.cli.cl_mgc_mgsexp);
826                 if (rc)
827                         CDEBUG(D_MOUNT, "disconnect failed %d\n", rc);
828         }
829
830         /* Save the obdname for cleaning the nid uuids, which are
831            obdname_XX */
832         len = strlen(obd->obd_name) + 6;
833         OBD_ALLOC(niduuid, len);
834         if (niduuid) {
835                 strcpy(niduuid, obd->obd_name);
836                 ptr = niduuid + strlen(niduuid);
837         }
838
839         rc = class_manual_cleanup(obd);
840         if (rc)
841                 GOTO(out, rc);
842
843         /* Clean the nid uuids */
844         if (!niduuid)
845                 GOTO(out, rc = -ENOMEM);
846
847         for (i = 0; i < lsi->lsi_lmd->lmd_mgs_failnodes; i++) {
848                 sprintf(ptr, "_%x", i);
849                 rc = do_lcfg(LUSTRE_MGC_OBDNAME, 0, LCFG_DEL_UUID,
850                              niduuid, 0, 0, 0);
851                 if (rc)
852                         CERROR("del MDC UUID %s failed: rc = %d\n",
853                                niduuid, rc);
854         }
855 out:
856         if (niduuid)
857                 OBD_FREE(niduuid, len);
858
859         /* class_import_put will get rid of the additional connections */
860         mutex_up(&mgc_start_lock);
861         RETURN(rc);
862 }
863
864 /* Since there's only one mgc per node, we have to change it's fs to get
865    access to the right disk. */
866 static int server_mgc_set_fs(struct obd_device *mgc, struct super_block *sb)
867 {
868         struct lustre_sb_info *lsi = s2lsi(sb);
869         int rc;
870         ENTRY;
871
872         CDEBUG(D_MOUNT, "Set mgc disk for %s\n", lsi->lsi_lmd->lmd_dev);
873
874         /* cl_mgc_sem in mgc insures we sleep if the mgc_fs is busy */
875         rc = obd_set_info_async(mgc->obd_self_export,
876                                 sizeof(KEY_SET_FS), KEY_SET_FS,
877                                 sizeof(*sb), sb, NULL);
878         if (rc) {
879                 CERROR("can't set_fs %d\n", rc);
880         }
881
882         RETURN(rc);
883 }
884
885 static int server_mgc_clear_fs(struct obd_device *mgc)
886 {
887         int rc;
888         ENTRY;
889
890         CDEBUG(D_MOUNT, "Unassign mgc disk\n");
891
892         rc = obd_set_info_async(mgc->obd_self_export,
893                                 sizeof(KEY_CLEAR_FS), KEY_CLEAR_FS,
894                                 0, NULL, NULL);
895         RETURN(rc);
896 }
897
898 DECLARE_MUTEX(server_start_lock);
899
900 /* Stop MDS/OSS if nobody is using them */
901 static int server_stop_servers(int lddflags, int lsiflags)
902 {
903         struct obd_device *obd = NULL;
904         struct obd_type *type = NULL;
905         int rc = 0;
906         ENTRY;
907
908         mutex_down(&server_start_lock);
909
910         /* Either an MDT or an OST or neither  */
911         /* if this was an MDT, and there are no more MDT's, clean up the MDS */
912         if ((lddflags & LDD_F_SV_TYPE_MDT) &&
913             (obd = class_name2obd(LUSTRE_MDS_OBDNAME))) {
914                 /*FIXME pre-rename, should eventually be LUSTRE_MDT_NAME*/
915                 type = class_search_type(LUSTRE_MDS_NAME);
916         }
917         /* if this was an OST, and there are no more OST's, clean up the OSS */
918         if ((lddflags & LDD_F_SV_TYPE_OST) &&
919             (obd = class_name2obd(LUSTRE_OSS_OBDNAME))) {
920                 type = class_search_type(LUSTRE_OST_NAME);
921         }
922
923         if (obd && (!type || !type->typ_refcnt)) {
924                 int err;
925                 obd->obd_force = 1;
926                 /* obd_fail doesn't mean much on a server obd */
927                 err = class_manual_cleanup(obd);
928                 if (!rc)
929                         rc = err;
930         }
931
932         mutex_up(&server_start_lock);
933
934         RETURN(rc);
935 }
936
937 int server_mti_print(char *title, struct mgs_target_info *mti)
938 {
939         PRINT_CMD(PRINT_MASK, "mti %s\n", title);
940         PRINT_CMD(PRINT_MASK, "server: %s\n", mti->mti_svname);
941         PRINT_CMD(PRINT_MASK, "fs:     %s\n", mti->mti_fsname);
942         PRINT_CMD(PRINT_MASK, "uuid:   %s\n", mti->mti_uuid);
943         PRINT_CMD(PRINT_MASK, "ver: %d  flags: %#x\n",
944                   mti->mti_config_ver, mti->mti_flags);
945         return(0);
946 }
947
948 static int server_sb2mti(struct super_block *sb, struct mgs_target_info *mti)
949 {
950         struct lustre_sb_info    *lsi = s2lsi(sb);
951         struct lustre_disk_data  *ldd = lsi->lsi_ldd;
952         lnet_process_id_t         id;
953         int i = 0;
954         ENTRY;
955
956         if (!(lsi->lsi_flags & LSI_SERVER))
957                 RETURN(-EINVAL);
958
959         strncpy(mti->mti_fsname, ldd->ldd_fsname,
960                 sizeof(mti->mti_fsname));
961         strncpy(mti->mti_svname, ldd->ldd_svname,
962                 sizeof(mti->mti_svname));
963
964         mti->mti_nid_count = 0;
965         while (LNetGetId(i++, &id) != -ENOENT) {
966                 if (LNET_NETTYP(LNET_NIDNET(id.nid)) == LOLND)
967                         continue;
968                 mti->mti_nids[mti->mti_nid_count] = id.nid;
969                 mti->mti_nid_count++;
970                 if (mti->mti_nid_count >= MTI_NIDS_MAX) {
971                         CWARN("Only using first %d nids for %s\n",
972                               mti->mti_nid_count, mti->mti_svname);
973                         break;
974                 }
975         }
976
977         mti->mti_lustre_ver = LUSTRE_VERSION_CODE;
978         mti->mti_config_ver = 0;
979         mti->mti_flags = ldd->ldd_flags;
980         mti->mti_stripe_index = ldd->ldd_svindex;
981         memcpy(mti->mti_uuid, ldd->ldd_uuid, sizeof(mti->mti_uuid));
982         if (strlen(ldd->ldd_params) > sizeof(mti->mti_params)) {
983                 CERROR("params too big for mti\n");
984                 RETURN(-ENOMEM);
985         }
986         memcpy(mti->mti_params, ldd->ldd_params, sizeof(mti->mti_params));
987         RETURN(0);
988 }
989
990 /* Register an old or new target with the MGS. If needed MGS will construct
991    startup logs and assign index */
992 int server_register_target(struct super_block *sb)
993 {
994         struct lustre_sb_info *lsi = s2lsi(sb);
995         struct obd_device *mgc = lsi->lsi_mgc;
996         struct lustre_disk_data *ldd = lsi->lsi_ldd;
997         struct mgs_target_info *mti = NULL;
998         int rc;
999         ENTRY;
1000
1001         LASSERT(mgc);
1002
1003         if (!(lsi->lsi_flags & LSI_SERVER))
1004                 RETURN(-EINVAL);
1005
1006         OBD_ALLOC_PTR(mti);
1007         if (!mti)
1008                 RETURN(-ENOMEM);
1009         rc = server_sb2mti(sb, mti);
1010         if (rc)
1011                 GOTO(out, rc);
1012
1013         CDEBUG(D_MOUNT, "Registration %s, fs=%s, %s, index=%04x, flags=%#x\n",
1014                mti->mti_svname, mti->mti_fsname,
1015                libcfs_nid2str(mti->mti_nids[0]), mti->mti_stripe_index,
1016                mti->mti_flags);
1017
1018         /* Register the target */
1019         /* FIXME use mgc_process_config instead */
1020         rc = obd_set_info_async(mgc->u.cli.cl_mgc_mgsexp,
1021                                 sizeof(KEY_REGISTER_TARGET), KEY_REGISTER_TARGET,
1022                                 sizeof(*mti), mti, NULL);
1023         if (rc)
1024                 GOTO(out, rc);
1025
1026         /* Always update our flags */
1027         ldd->ldd_flags = mti->mti_flags & ~LDD_F_REWRITE_LDD;
1028
1029         /* If this flag is set, it means the MGS wants us to change our
1030            on-disk data. (So far this means just the index.) */
1031         if (mti->mti_flags & LDD_F_REWRITE_LDD) {
1032                 char *label;
1033                 int err;
1034                 CDEBUG(D_MOUNT, "Changing on-disk index from %#x to %#x "
1035                        "for %s\n", ldd->ldd_svindex, mti->mti_stripe_index,
1036                        mti->mti_svname);
1037                 ldd->ldd_svindex = mti->mti_stripe_index;
1038                 strncpy(ldd->ldd_svname, mti->mti_svname,
1039                         sizeof(ldd->ldd_svname));
1040                 /* or ldd_make_sv_name(ldd); */
1041                 ldd_write(&mgc->obd_lvfs_ctxt, ldd);
1042                 err = fsfilt_set_label(mgc, lsi->lsi_srv_mnt->mnt_sb,
1043                                        mti->mti_svname);
1044                 if (err)
1045                         CERROR("Label set error %d\n", err);
1046                 label = fsfilt_get_label(mgc, lsi->lsi_srv_mnt->mnt_sb);
1047                 if (label)
1048                         CDEBUG(D_MOUNT, "Disk label changed to %s\n", label);
1049
1050                 /* Flush the new ldd to disk */
1051                 fsfilt_sync(mgc, lsi->lsi_srv_mnt->mnt_sb);
1052         }
1053
1054 out:
1055         if (mti)
1056                 OBD_FREE_PTR(mti);
1057         RETURN(rc);
1058 }
1059
1060 /* Start targets */
1061 static int server_start_targets(struct super_block *sb, struct vfsmount *mnt)
1062 {
1063         struct obd_device *obd;
1064         struct lustre_sb_info *lsi = s2lsi(sb);
1065         struct config_llog_instance cfg;
1066         int rc;
1067         ENTRY;
1068
1069         CDEBUG(D_MOUNT, "starting target %s\n", lsi->lsi_ldd->ldd_svname);
1070
1071 #if 0
1072         /* If we're an MDT, make sure the global MDS is running */
1073         if (lsi->lsi_ldd->ldd_flags & LDD_F_SV_TYPE_MDT) {
1074                 /* make sure the MDS is started */
1075                 mutex_down(&server_start_lock);
1076                 obd = class_name2obd(LUSTRE_MDS_OBDNAME);
1077                 if (!obd) {
1078                         rc = lustre_start_simple(LUSTRE_MDS_OBDNAME,
1079                     /* FIXME pre-rename, should eventually be LUSTRE_MDS_NAME */
1080                                                  LUSTRE_MDT_NAME,
1081                                                  LUSTRE_MDS_OBDNAME"_uuid",
1082                                                  0, 0);
1083                         if (rc) {
1084                                 mutex_up(&server_start_lock);
1085                                 CERROR("failed to start MDS: %d\n", rc);
1086                                 RETURN(rc);
1087                         }
1088                 }
1089                 mutex_up(&server_start_lock);
1090         }
1091 #endif
1092
1093         /* If we're an OST, make sure the global OSS is running */
1094         if (lsi->lsi_ldd->ldd_flags & LDD_F_SV_TYPE_OST) {
1095                 /* make sure OSS is started */
1096                 mutex_down(&server_start_lock);
1097                 obd = class_name2obd(LUSTRE_OSS_OBDNAME);
1098                 if (!obd) {
1099                         rc = lustre_start_simple(LUSTRE_OSS_OBDNAME,
1100                                                  LUSTRE_OSS_NAME,
1101                                                  LUSTRE_OSS_OBDNAME"_uuid",
1102                                                  0, 0);
1103                         if (rc) {
1104                                 mutex_up(&server_start_lock);
1105                                 CERROR("failed to start OSS: %d\n", rc);
1106                                 RETURN(rc);
1107                         }
1108                 }
1109                 mutex_up(&server_start_lock);
1110         }
1111
1112         /* Set the mgc fs to our server disk.  This allows the MGC
1113            to read and write configs locally. */
1114         rc = server_mgc_set_fs(lsi->lsi_mgc, sb);
1115         if (rc)
1116                 RETURN(rc);
1117
1118         /* Register with MGS */
1119         rc = server_register_target(sb);
1120         if (rc && (lsi->lsi_ldd->ldd_flags &
1121                    (LDD_F_NEED_INDEX | LDD_F_UPDATE | LDD_F_UPGRADE14))){
1122                 CERROR("Required registration failed for %s: %d\n",
1123                        lsi->lsi_ldd->ldd_svname, rc);
1124                 if (rc == -EIO) {
1125                         LCONSOLE_ERROR_MSG(0x15f, "Communication error with "
1126                                            "the MGS.  Is the MGS running?\n");
1127                 }
1128                 GOTO(out_mgc, rc);
1129         }
1130         if (rc == -EINVAL) {
1131                 LCONSOLE_ERROR_MSG(0x160, "The MGS is refusing to allow this "
1132                                    "server (%s) to start. Please see messages"
1133                                    " on the MGS node.\n",
1134                                    lsi->lsi_ldd->ldd_svname);
1135                 GOTO(out_mgc, rc);
1136         }
1137         /* non-fatal error of registeration with MGS */
1138         if (rc)
1139                 CDEBUG(D_MOUNT, "Cannot register with MGS: %d\n", rc);
1140
1141         /* Let the target look up the mount using the target's name
1142            (we can't pass the sb or mnt through class_process_config.) */
1143         rc = server_register_mount(lsi->lsi_ldd->ldd_svname, sb, mnt);
1144         if (rc)
1145                 GOTO(out_mgc, rc);
1146
1147         /* Start targets using the llog named for the target */
1148         memset(&cfg, 0, sizeof(cfg));
1149         rc = lustre_process_log(sb, lsi->lsi_ldd->ldd_svname, &cfg);
1150         if (rc) {
1151                 CERROR("failed to start server %s: %d\n",
1152                        lsi->lsi_ldd->ldd_svname, rc);
1153                 /* Do NOT call server_deregister_mount() here. This makes it
1154                  * impossible to find mount later in cleanup time and leaves
1155                  * @lsi and othder stuff leaked. -umka */
1156                 GOTO(out_mgc, rc);
1157         }
1158
1159 out_mgc:
1160         /* Release the mgc fs for others to use */
1161         server_mgc_clear_fs(lsi->lsi_mgc);
1162
1163         if (!rc) {
1164                 obd = class_name2obd(lsi->lsi_ldd->ldd_svname);
1165                 if (!obd) {
1166                         CERROR("no server named %s was started\n",
1167                                lsi->lsi_ldd->ldd_svname);
1168                         RETURN(-ENXIO);
1169                 }
1170
1171                 if ((lsi->lsi_lmd->lmd_flags & LMD_FLG_ABORT_RECOV) &&
1172                     (OBP(obd, iocontrol))) {
1173                         obd_iocontrol(OBD_IOC_ABORT_RECOVERY,
1174                                       obd->obd_self_export, 0, NULL, NULL);
1175                 }
1176
1177                 /* log has been fully processed */
1178                 obd_notify(obd, NULL, OBD_NOTIFY_CONFIG, (void *)CONFIG_LOG);
1179         }
1180
1181         RETURN(rc);
1182 }
1183
1184 /***************** lustre superblock **************/
1185
1186 struct lustre_sb_info *lustre_init_lsi(struct super_block *sb)
1187 {
1188         struct lustre_sb_info *lsi;
1189         ENTRY;
1190
1191         OBD_ALLOC_PTR(lsi);
1192         if (!lsi)
1193                 RETURN(NULL);
1194         OBD_ALLOC_PTR(lsi->lsi_lmd);
1195         if (!lsi->lsi_lmd) {
1196                 OBD_FREE_PTR(lsi);
1197                 RETURN(NULL);
1198         }
1199
1200         lsi->lsi_lmd->lmd_exclude_count = 0;
1201         s2lsi_nocast(sb) = lsi;
1202         /* we take 1 extra ref for our setup */
1203         atomic_set(&lsi->lsi_mounts, 1);
1204
1205         /* Default umount style */
1206         lsi->lsi_flags = LSI_UMOUNT_FAILOVER;
1207
1208         RETURN(lsi);
1209 }
1210
1211 static int lustre_free_lsi(struct super_block *sb)
1212 {
1213         struct lustre_sb_info *lsi = s2lsi(sb);
1214         ENTRY;
1215
1216         LASSERT(lsi != NULL);
1217         CDEBUG(D_MOUNT, "Freeing lsi %p\n", lsi);
1218
1219         /* someone didn't call server_put_mount. */
1220         LASSERT(atomic_read(&lsi->lsi_mounts) == 0);
1221
1222         if (lsi->lsi_ldd != NULL)
1223                 OBD_FREE(lsi->lsi_ldd, sizeof(*lsi->lsi_ldd));
1224
1225         if (lsi->lsi_lmd != NULL) {
1226                 if (lsi->lsi_lmd->lmd_dev != NULL)
1227                         OBD_FREE(lsi->lsi_lmd->lmd_dev,
1228                                  strlen(lsi->lsi_lmd->lmd_dev) + 1);
1229                 if (lsi->lsi_lmd->lmd_profile != NULL)
1230                         OBD_FREE(lsi->lsi_lmd->lmd_profile,
1231                                  strlen(lsi->lsi_lmd->lmd_profile) + 1);
1232                 if (lsi->lsi_lmd->lmd_mgssec != NULL)
1233                         OBD_FREE(lsi->lsi_lmd->lmd_mgssec,
1234                                  strlen(lsi->lsi_lmd->lmd_mgssec) + 1);
1235                 if (lsi->lsi_lmd->lmd_opts != NULL)
1236                         OBD_FREE(lsi->lsi_lmd->lmd_opts,
1237                                  strlen(lsi->lsi_lmd->lmd_opts) + 1);
1238                 if (lsi->lsi_lmd->lmd_exclude_count)
1239                         OBD_FREE(lsi->lsi_lmd->lmd_exclude,
1240                                  sizeof(lsi->lsi_lmd->lmd_exclude[0]) *
1241                                  lsi->lsi_lmd->lmd_exclude_count);
1242                 OBD_FREE(lsi->lsi_lmd, sizeof(*lsi->lsi_lmd));
1243         }
1244
1245         LASSERT(lsi->lsi_llsbi == NULL);
1246         OBD_FREE(lsi, sizeof(*lsi));
1247         s2lsi_nocast(sb) = NULL;
1248
1249         RETURN(0);
1250 }
1251
1252 /* The lsi has one reference for every server that is using the disk -
1253    e.g. MDT, MGS, and potentially MGC */
1254 static int lustre_put_lsi(struct super_block *sb)
1255 {
1256         struct lustre_sb_info *lsi = s2lsi(sb);
1257         ENTRY;
1258
1259         LASSERT(lsi != NULL);
1260
1261         CDEBUG(D_MOUNT, "put %p %d\n", sb, atomic_read(&lsi->lsi_mounts));
1262         if (atomic_dec_and_test(&lsi->lsi_mounts)) {
1263                 lustre_free_lsi(sb);
1264                 RETURN(1);
1265         }
1266         RETURN(0);
1267 }
1268
1269 /*************** server mount ******************/
1270
1271 /* Kernel mount using mount options in MOUNT_DATA_FILE */
1272 static struct vfsmount *server_kernel_mount(struct super_block *sb)
1273 {
1274         struct lvfs_run_ctxt mount_ctxt;
1275         struct lustre_sb_info *lsi = s2lsi(sb);
1276         struct lustre_disk_data *ldd;
1277         struct lustre_mount_data *lmd = lsi->lsi_lmd;
1278         struct vfsmount *mnt;
1279         char *options = NULL;
1280         unsigned long page, s_flags;
1281         struct page *__page;
1282         int rc;
1283         ENTRY;
1284
1285         OBD_ALLOC(ldd, sizeof(*ldd));
1286         if (!ldd)
1287                 RETURN(ERR_PTR(-ENOMEM));
1288
1289         /* In the past, we have always used flags = 0.
1290            Note ext3/ldiskfs can't be mounted ro. */
1291         s_flags = sb->s_flags;
1292
1293         /* allocate memory for options */
1294         OBD_PAGE_ALLOC(__page, CFS_ALLOC_STD);
1295         if (!__page)
1296                 GOTO(out_free, rc = -ENOMEM);
1297         page = (unsigned long)cfs_page_address(__page);
1298         options = (char *)page;
1299         memset(options, 0, CFS_PAGE_SIZE);
1300
1301         /* mount-line options must be added for pre-mount because it may
1302          * contain mount options such as journal_dev which are required
1303          * to mount successfuly the underlying filesystem */
1304         if (lmd->lmd_opts && (*(lmd->lmd_opts) != 0))
1305                 strncat(options, lmd->lmd_opts, CFS_PAGE_SIZE - 1);
1306
1307         /* Pre-mount ldiskfs to read the MOUNT_DATA_FILE */
1308         CDEBUG(D_MOUNT, "Pre-mount ldiskfs %s\n", lmd->lmd_dev);
1309         mnt = ll_kern_mount("ldiskfs", s_flags, lmd->lmd_dev, (void *)options);
1310         if (IS_ERR(mnt)) {
1311                 rc = PTR_ERR(mnt);
1312                 CERROR("premount %s:%#lx ldiskfs failed: %d "
1313                         "Is the ldiskfs module available?\n",
1314                         lmd->lmd_dev, s_flags, rc );
1315                 GOTO(out_free, rc);
1316         }
1317
1318         OBD_SET_CTXT_MAGIC(&mount_ctxt);
1319         mount_ctxt.pwdmnt = mnt;
1320         mount_ctxt.pwd = mnt->mnt_root;
1321         mount_ctxt.fs = get_ds();
1322
1323         rc = ldd_parse(&mount_ctxt, ldd);
1324         unlock_mntput(mnt);
1325
1326         if (rc) {
1327                 CERROR("premount parse options failed: rc = %d\n", rc);
1328                 GOTO(out_free, rc);
1329         }
1330
1331         /* Done with our pre-mount, now do the real mount. */
1332
1333         /* Glom up mount options */
1334         memset(options, 0, CFS_PAGE_SIZE);
1335         strncpy(options, ldd->ldd_mount_opts, CFS_PAGE_SIZE - 2);
1336
1337         /* Add in any mount-line options */
1338         if (lmd->lmd_opts && (*(lmd->lmd_opts) != 0)) {
1339                 int len = CFS_PAGE_SIZE - strlen(options) - 2;
1340                 if (*options != 0)
1341                         strcat(options, ",");
1342                 strncat(options, lmd->lmd_opts, len);
1343         }
1344
1345         /* Special permanent mount flags */
1346         if (IS_OST(ldd))
1347             s_flags |= MS_NOATIME | MS_NODIRATIME;
1348
1349         CDEBUG(D_MOUNT, "kern_mount: %s %s %s\n",
1350                MT_STR(ldd), lmd->lmd_dev, options);
1351         mnt = ll_kern_mount(MT_STR(ldd), s_flags, lmd->lmd_dev,
1352                             (void *)options);
1353         if (IS_ERR(mnt)) {
1354                 rc = PTR_ERR(mnt);
1355                 CERROR("ll_kern_mount failed: rc = %d\n", rc);
1356                 GOTO(out_free, rc);
1357         }
1358
1359         if (lmd->lmd_flags & LMD_FLG_ABORT_RECOV)
1360                 simple_truncate(mnt->mnt_sb->s_root, mnt, LAST_RCVD,
1361                                 LR_CLIENT_START);
1362
1363         OBD_PAGE_FREE(__page);
1364         lsi->lsi_ldd = ldd;   /* freed at lsi cleanup */
1365         CDEBUG(D_SUPER, "%s: mnt = %p\n", lmd->lmd_dev, mnt);
1366         RETURN(mnt);
1367
1368 out_free:
1369         if (__page)
1370                 OBD_PAGE_FREE(__page);
1371         OBD_FREE(ldd, sizeof(*ldd));
1372         lsi->lsi_ldd = NULL;
1373         RETURN(ERR_PTR(rc));
1374 }
1375
1376 static void server_wait_finished(struct vfsmount *mnt)
1377 {
1378         wait_queue_head_t   waitq;
1379         struct l_wait_info  lwi;
1380         int                 retries = 330;
1381
1382         init_waitqueue_head(&waitq);
1383
1384         while ((atomic_read(&mnt->mnt_count) > 1) && (retries > 0)) {
1385                 LCONSOLE_WARN("Mount still busy with %d refs, waiting for "
1386                               "%d secs...\n",
1387                               atomic_read(&mnt->mnt_count), retries);
1388
1389                 /* Wait for a bit */
1390                 retries -= 5;
1391                 lwi = LWI_TIMEOUT(5 * HZ, NULL, NULL);
1392                 l_wait_event(waitq, 0, &lwi);
1393         }
1394         if (atomic_read(&mnt->mnt_count) > 1) {
1395                 CERROR("Mount %p is still busy (%d refs), giving up.\n",
1396                        mnt, atomic_read(&mnt->mnt_count));
1397         }
1398 }
1399
1400 static void server_put_super(struct super_block *sb)
1401 {
1402         struct lustre_sb_info *lsi = s2lsi(sb);
1403         struct obd_device     *obd;
1404         struct vfsmount       *mnt = lsi->lsi_srv_mnt;
1405         char *tmpname, *extraname = NULL;
1406         int tmpname_sz;
1407         int lddflags = lsi->lsi_ldd->ldd_flags;
1408         int lsiflags = lsi->lsi_flags;
1409         ENTRY;
1410
1411         LASSERT(lsiflags & LSI_SERVER);
1412
1413         tmpname_sz = strlen(lsi->lsi_ldd->ldd_svname) + 1;
1414         OBD_ALLOC(tmpname, tmpname_sz);
1415         memcpy(tmpname, lsi->lsi_ldd->ldd_svname, tmpname_sz);
1416         CDEBUG(D_MOUNT, "server put_super %s\n", tmpname);
1417
1418         /* Stop the target */
1419         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
1420             (IS_MDT(lsi->lsi_ldd) || IS_OST(lsi->lsi_ldd))) {
1421                 struct lustre_profile *lprof = NULL;
1422
1423                 /* tell the mgc to drop the config log */
1424                 lustre_end_log(sb, lsi->lsi_ldd->ldd_svname, NULL);
1425
1426                 /* COMPAT_146 - profile may get deleted in mgc_cleanup.
1427                    If there are any setup/cleanup errors, save the lov
1428                    name for safety cleanup later. */
1429                 lprof = class_get_profile(lsi->lsi_ldd->ldd_svname);
1430                 if (lprof && lprof->lp_dt) {
1431                         OBD_ALLOC(extraname, strlen(lprof->lp_dt) + 1);
1432                         strcpy(extraname, lprof->lp_dt);
1433                 }
1434
1435                 obd = class_name2obd(lsi->lsi_ldd->ldd_svname);
1436                 if (obd) {
1437                         CDEBUG(D_MOUNT, "stopping %s\n", obd->obd_name);
1438                         if (lsi->lsi_flags & LSI_UMOUNT_FAILOVER)
1439                                 obd->obd_fail = 1;
1440                         /* We can't seem to give an error return code
1441                          * to .put_super, so we better make sure we clean up! */
1442                         obd->obd_force = 1;
1443                         class_manual_cleanup(obd);
1444                 } else {
1445                         CERROR("no obd %s\n", lsi->lsi_ldd->ldd_svname);
1446                         server_deregister_mount(lsi->lsi_ldd->ldd_svname);
1447                 }
1448         }
1449
1450         /* If they wanted the mgs to stop separately from the mdt, they
1451            should have put it on a different device. */
1452         if (IS_MGS(lsi->lsi_ldd)) {
1453                 /* if MDS start with --nomgs, don't stop MGS then */
1454                 if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS))
1455                         server_stop_mgs(sb);
1456         }
1457
1458         /* Clean the mgc and sb */
1459         lustre_common_put_super(sb);
1460
1461         /* Wait for the targets to really clean up - can't exit (and let the
1462            sb get destroyed) while the mount is still in use */
1463         server_wait_finished(mnt);
1464
1465         /* drop the One True Mount */
1466         unlock_mntput(mnt);
1467
1468         /* Stop the servers (MDS, OSS) if no longer needed.  We must wait
1469            until the target is really gone so that our type refcount check
1470            is right. */
1471         server_stop_servers(lddflags, lsiflags);
1472
1473         /* In case of startup or cleanup err, stop related obds */
1474         if (extraname) {
1475                 obd = class_name2obd(extraname);
1476                 if (obd) {
1477                         CWARN("Cleaning orphaned obd %s\n", extraname);
1478                         obd->obd_force = 1;
1479                         class_manual_cleanup(obd);
1480                 }
1481                 OBD_FREE(extraname, strlen(extraname) + 1);
1482         }
1483
1484         LCONSOLE_WARN("server umount %s complete\n", tmpname);
1485         OBD_FREE(tmpname, tmpname_sz);
1486         EXIT;
1487 }
1488
1489 #ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
1490 static void server_umount_begin(struct vfsmount *vfsmnt, int flags)
1491 {
1492         struct super_block *sb = vfsmnt->mnt_sb;
1493 #else
1494 static void server_umount_begin(struct super_block *sb)
1495 {
1496 #endif
1497         struct lustre_sb_info *lsi = s2lsi(sb);
1498         ENTRY;
1499
1500 #ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
1501         if (!(flags & MNT_FORCE)) {
1502                 EXIT;
1503                 return;
1504         }
1505 #endif
1506
1507         CDEBUG(D_MOUNT, "umount -f\n");
1508         /* umount = failover
1509            umount -f = force
1510            no third way to do non-force, non-failover */
1511         lsi->lsi_flags &= ~LSI_UMOUNT_FAILOVER;
1512         lsi->lsi_flags |= LSI_UMOUNT_FORCE;
1513         EXIT;
1514 }
1515
1516 #ifndef HAVE_STATFS_DENTRY_PARAM
1517 static int server_statfs (struct super_block *sb, struct kstatfs *buf)
1518 {
1519 #else
1520 static int server_statfs (struct dentry *dentry, struct kstatfs *buf)
1521 {
1522         struct super_block *sb = dentry->d_sb;
1523 #endif
1524         struct vfsmount *mnt = s2lsi(sb)->lsi_srv_mnt;
1525         ENTRY;
1526
1527         if (mnt && mnt->mnt_sb && mnt->mnt_sb->s_op->statfs) {
1528 #ifdef HAVE_STATFS_DENTRY_PARAM
1529                 int rc = mnt->mnt_sb->s_op->statfs(mnt->mnt_root, buf);
1530 #else
1531                 int rc = mnt->mnt_sb->s_op->statfs(mnt->mnt_sb, buf);
1532 #endif
1533                 if (!rc) {
1534                         buf->f_type = sb->s_magic;
1535                         RETURN(0);
1536                 }
1537         }
1538
1539         /* just return 0 */
1540         buf->f_type = sb->s_magic;
1541         buf->f_bsize = sb->s_blocksize;
1542         buf->f_blocks = 1;
1543         buf->f_bfree = 0;
1544         buf->f_bavail = 0;
1545         buf->f_files = 1;
1546         buf->f_ffree = 0;
1547         buf->f_namelen = NAME_MAX;
1548         RETURN(0);
1549 }
1550
1551 static struct super_operations server_ops =
1552 {
1553         .put_super      = server_put_super,
1554         .umount_begin   = server_umount_begin, /* umount -f */
1555         .statfs         = server_statfs,
1556 };
1557
1558 #define log2(n) ffz(~(n))
1559 #define LUSTRE_SUPER_MAGIC 0x0BD00BD1
1560
1561 static int server_fill_super_common(struct super_block *sb)
1562 {
1563         struct inode *root = 0;
1564         ENTRY;
1565
1566         CDEBUG(D_MOUNT, "Server sb, dev=%d\n", (int)sb->s_dev);
1567
1568         sb->s_blocksize = 4096;
1569         sb->s_blocksize_bits = log2(sb->s_blocksize);
1570         sb->s_magic = LUSTRE_SUPER_MAGIC;
1571         sb->s_maxbytes = 0; //PAGE_CACHE_MAXBYTES;
1572         sb->s_flags |= MS_RDONLY;
1573         sb->s_op = &server_ops;
1574
1575         root = new_inode(sb);
1576         if (!root) {
1577                 CERROR("Can't make root inode\n");
1578                 RETURN(-EIO);
1579         }
1580
1581         /* returns -EIO for every operation */
1582         /* make_bad_inode(root); -- badness - can't umount */
1583         /* apparently we need to be a directory for the mount to finish */
1584         root->i_mode = S_IFDIR;
1585
1586         sb->s_root = d_alloc_root(root);
1587         if (!sb->s_root) {
1588                 CERROR("Can't make root dentry\n");
1589                 iput(root);
1590                 RETURN(-EIO);
1591         }
1592
1593         RETURN(0);
1594 }
1595
1596 static int server_fill_super(struct super_block *sb)
1597 {
1598         struct lustre_sb_info *lsi = s2lsi(sb);
1599         struct vfsmount *mnt;
1600         int rc;
1601         ENTRY;
1602
1603         /* the One True Mount */
1604         mnt = server_kernel_mount(sb);
1605         if (IS_ERR(mnt)) {
1606                 rc = PTR_ERR(mnt);
1607                 CERROR("Unable to mount device %s: %d\n",
1608                        lsi->lsi_lmd->lmd_dev, rc);
1609                 lustre_put_lsi(sb);
1610                 RETURN(rc);
1611         }
1612         lsi->lsi_srv_mnt = mnt;
1613
1614         LASSERT(lsi->lsi_ldd);
1615         CDEBUG(D_MOUNT, "Found service %s for fs '%s' on device %s\n",
1616                lsi->lsi_ldd->ldd_svname, lsi->lsi_ldd->ldd_fsname,
1617                lsi->lsi_lmd->lmd_dev);
1618
1619         if (class_name2obd(lsi->lsi_ldd->ldd_svname)) {
1620                 LCONSOLE_ERROR_MSG(0x161, "The target named %s is already "
1621                                    "running. Double-mount may have compromised"
1622                                    " the disk journal.\n",
1623                                    lsi->lsi_ldd->ldd_svname);
1624                 lustre_put_lsi(sb);
1625                 unlock_mntput(mnt);
1626                 RETURN(-EALREADY);
1627         }
1628
1629         /* Start MGS before MGC */
1630         if (IS_MGS(lsi->lsi_ldd) && !(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS)){
1631                 rc = server_start_mgs(sb);
1632                 if (rc)
1633                         GOTO(out_mnt, rc);
1634         }
1635
1636         rc = lustre_start_mgc(sb);
1637         if (rc)
1638                 GOTO(out_mnt, rc);
1639
1640         /* Set up all obd devices for service */
1641         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
1642                 (IS_OST(lsi->lsi_ldd) || IS_MDT(lsi->lsi_ldd))) {
1643                 rc = server_start_targets(sb, mnt);
1644                 if (rc < 0) {
1645                         CERROR("Unable to start targets: %d\n", rc);
1646                         GOTO(out_mnt, rc);
1647                 }
1648         /* FIXME overmount client here,
1649            or can we just start a client log and client_fill_super on this sb?
1650            We need to make sure server_put_super gets called too - ll_put_super
1651            calls lustre_common_put_super; check there for LSI_SERVER flag,
1652            call s_p_s if so.
1653            Probably should start client from new thread so we can return.
1654            Client will not finish until all servers are connected.
1655            Note - MGS-only server does NOT get a client, since there is no
1656            lustre fs associated - the MGS is for all lustre fs's */
1657         }
1658
1659         rc = server_fill_super_common(sb);
1660         if (rc)
1661                 GOTO(out_mnt, rc);
1662
1663         LCONSOLE_WARN("Server %s on device %s has started\n",
1664                       lsi->lsi_ldd->ldd_svname, lsi->lsi_lmd->lmd_dev);
1665
1666         RETURN(0);
1667 out_mnt:
1668         /* We jump here in case of failure while starting targets or MGS.
1669          * In this case we can't just put @mnt and have to do real cleanup
1670          * with stoping targets, etc. */
1671         server_put_super(sb);
1672         return rc;
1673 }
1674
1675 /* Get the index from the obd name.
1676    rc = server type, or
1677    rc < 0  on error
1678    if endptr isn't NULL it is set to end of name */
1679 int server_name2index(char *svname, __u32 *idx, char **endptr)
1680 {
1681         unsigned long index;
1682         int rc;
1683         char *dash = strrchr(svname, '-');
1684         if (!dash)
1685                 return(-EINVAL);
1686
1687         if (strncmp(dash + 1, "MDT", 3) == 0)
1688                 rc = LDD_F_SV_TYPE_MDT;
1689         else if (strncmp(dash + 1, "OST", 3) == 0)
1690                 rc = LDD_F_SV_TYPE_OST;
1691         else
1692                 return(-EINVAL);
1693         if (strcmp(dash + 4, "all") == 0)
1694                 return rc | LDD_F_SV_ALL;
1695
1696         index = simple_strtoul(dash + 4, endptr, 16);
1697         *idx = index;
1698         return rc;
1699 }
1700
1701 /*************** mount common betweeen server and client ***************/
1702
1703 /* Common umount */
1704 int lustre_common_put_super(struct super_block *sb)
1705 {
1706         int rc;
1707         ENTRY;
1708
1709         CDEBUG(D_MOUNT, "dropping sb %p\n", sb);
1710
1711         /* Drop a ref to the MGC */
1712         rc = lustre_stop_mgc(sb);
1713         if (rc && (rc != -ENOENT)) {
1714                 if (rc != -EBUSY) {
1715                         CERROR("Can't stop MGC: %d\n", rc);
1716                         RETURN(rc);
1717                 }
1718                 /* BUSY just means that there's some other obd that
1719                    needs the mgc.  Let him clean it up. */
1720                 CDEBUG(D_MOUNT, "MGC still in use\n");
1721         }
1722         /* Drop a ref to the mounted disk */
1723         lustre_put_lsi(sb);
1724         lu_types_stop();
1725         RETURN(rc);
1726 }
1727
1728 #if 0
1729 static void lmd_print(struct lustre_mount_data *lmd)
1730 {
1731         int i;
1732
1733         PRINT_CMD(PRINT_MASK, "  mount data:\n");
1734         if (lmd_is_client(lmd))
1735                 PRINT_CMD(PRINT_MASK, "profile: %s\n", lmd->lmd_profile);
1736         PRINT_CMD(PRINT_MASK, "device:  %s\n", lmd->lmd_dev);
1737         PRINT_CMD(PRINT_MASK, "flags:   %x\n", lmd->lmd_flags);
1738         if (lmd->lmd_opts)
1739                 PRINT_CMD(PRINT_MASK, "options: %s\n", lmd->lmd_opts);
1740         for (i = 0; i < lmd->lmd_exclude_count; i++) {
1741                 PRINT_CMD(PRINT_MASK, "exclude %d:  OST%04x\n", i,
1742                           lmd->lmd_exclude[i]);
1743         }
1744 }
1745 #endif
1746
1747 /* Is this server on the exclusion list */
1748 int lustre_check_exclusion(struct super_block *sb, char *svname)
1749 {
1750         struct lustre_sb_info *lsi = s2lsi(sb);
1751         struct lustre_mount_data *lmd = lsi->lsi_lmd;
1752         __u32 index;
1753         int i, rc;
1754         ENTRY;
1755
1756         rc = server_name2index(svname, &index, NULL);
1757         if (rc != LDD_F_SV_TYPE_OST)
1758                 /* Only exclude OSTs */
1759                 RETURN(0);
1760
1761         CDEBUG(D_MOUNT, "Check exclusion %s (%d) in %d of %s\n", svname,
1762                index, lmd->lmd_exclude_count, lmd->lmd_dev);
1763
1764         for(i = 0; i < lmd->lmd_exclude_count; i++) {
1765                 if (index == lmd->lmd_exclude[i]) {
1766                         CWARN("Excluding %s (on exclusion list)\n", svname);
1767                         RETURN(1);
1768                 }
1769         }
1770         RETURN(0);
1771 }
1772
1773 /* mount -v  -o exclude=lustre-OST0001:lustre-OST0002 -t lustre ... */
1774 static int lmd_make_exclusion(struct lustre_mount_data *lmd, char *ptr)
1775 {
1776         char *s1 = ptr, *s2;
1777         __u32 index, *exclude_list;
1778         int rc = 0, devmax;
1779         ENTRY;
1780
1781         /* The shortest an ost name can be is 8 chars: -OST0000.
1782            We don't actually know the fsname at this time, so in fact
1783            a user could specify any fsname. */
1784         devmax = strlen(ptr) / 8 + 1;
1785
1786         /* temp storage until we figure out how many we have */
1787         OBD_ALLOC(exclude_list, sizeof(index) * devmax);
1788         if (!exclude_list)
1789                 RETURN(-ENOMEM);
1790
1791         /* we enter this fn pointing at the '=' */
1792         while (*s1 && *s1 != ' ' && *s1 != ',') {
1793                 s1++;
1794                 rc = server_name2index(s1, &index, &s2);
1795                 if (rc < 0) {
1796                         CERROR("Can't parse server name '%s'\n", s1);
1797                         break;
1798                 }
1799                 if (rc == LDD_F_SV_TYPE_OST)
1800                         exclude_list[lmd->lmd_exclude_count++] = index;
1801                 else
1802                         CDEBUG(D_MOUNT, "ignoring exclude %.7s\n", s1);
1803                 s1 = s2;
1804                 /* now we are pointing at ':' (next exclude)
1805                    or ',' (end of excludes) */
1806                 if (lmd->lmd_exclude_count >= devmax)
1807                         break;
1808         }
1809         if (rc >= 0) /* non-err */
1810                 rc = 0;
1811
1812         if (lmd->lmd_exclude_count) {
1813                 /* permanent, freed in lustre_free_lsi */
1814                 OBD_ALLOC(lmd->lmd_exclude, sizeof(index) *
1815                           lmd->lmd_exclude_count);
1816                 if (lmd->lmd_exclude) {
1817                         memcpy(lmd->lmd_exclude, exclude_list,
1818                                sizeof(index) * lmd->lmd_exclude_count);
1819                 } else {
1820                         rc = -ENOMEM;
1821                         lmd->lmd_exclude_count = 0;
1822                 }
1823         }
1824         OBD_FREE(exclude_list, sizeof(index) * devmax);
1825         RETURN(rc);
1826 }
1827
1828 static int lmd_parse_mgssec(struct lustre_mount_data *lmd, char *ptr)
1829 {
1830         char   *tail;
1831         int     length;
1832
1833         if (lmd->lmd_mgssec != NULL) {
1834                 OBD_FREE(lmd->lmd_mgssec, strlen(lmd->lmd_mgssec) + 1);
1835                 lmd->lmd_mgssec = NULL;
1836         }
1837
1838         tail = strchr(ptr, ',');
1839         if (tail == NULL)
1840                 length = strlen(ptr);
1841         else
1842                 length = tail - ptr;
1843
1844         OBD_ALLOC(lmd->lmd_mgssec, length + 1);
1845         if (lmd->lmd_mgssec == NULL)
1846                 return -ENOMEM;
1847
1848         memcpy(lmd->lmd_mgssec, ptr, length);
1849         lmd->lmd_mgssec[length] = '\0';
1850         return 0;
1851 }
1852
1853 /* mount -v -t lustre uml1:uml2:/lustre-client /mnt/lustre */
1854 static int lmd_parse(char *options, struct lustre_mount_data *lmd)
1855 {
1856         char *s1, *s2, *devname = NULL;
1857         struct lustre_mount_data *raw = (struct lustre_mount_data *)options;
1858         int rc = 0;
1859         ENTRY;
1860
1861         LASSERT(lmd);
1862         if (!options) {
1863                 LCONSOLE_ERROR_MSG(0x162, "Missing mount data: check that "
1864                                    "/sbin/mount.lustre is installed.\n");
1865                 RETURN(-EINVAL);
1866         }
1867
1868         /* Options should be a string - try to detect old lmd data */
1869         if ((raw->lmd_magic & 0xffffff00) == (LMD_MAGIC & 0xffffff00)) {
1870                 LCONSOLE_ERROR_MSG(0x163, "You're using an old version of "
1871                                    "/sbin/mount.lustre.  Please install "
1872                                    "version %s\n", LUSTRE_VERSION_STRING);
1873                 RETURN(-EINVAL);
1874         }
1875         lmd->lmd_magic = LMD_MAGIC;
1876
1877         /* Set default flags here */
1878
1879         s1 = options;
1880         while (*s1) {
1881                 int clear = 0;
1882                 /* Skip whitespace and extra commas */
1883                 while (*s1 == ' ' || *s1 == ',')
1884                         s1++;
1885
1886                 /* Client options are parsed in ll_options: eg. flock,
1887                    user_xattr, acl */
1888
1889                 /* Parse non-ldiskfs options here. Rather than modifying
1890                    ldiskfs, we just zero these out here */
1891                 if (strncmp(s1, "abort_recov", 11) == 0) {
1892                         lmd->lmd_flags |= LMD_FLG_ABORT_RECOV;
1893                         clear++;
1894                 } else if (strncmp(s1, "nosvc", 5) == 0) {
1895                         lmd->lmd_flags |= LMD_FLG_NOSVC;
1896                         clear++;
1897                 } else if (strncmp(s1, "nomgs", 5) == 0) {
1898                         lmd->lmd_flags |= LMD_FLG_NOMGS;
1899                         clear++;
1900                 } else if (strncmp(s1, "mgssec=", 7) == 0) {
1901                         rc = lmd_parse_mgssec(lmd, s1 + 7);
1902                         if (rc)
1903                                 goto invalid;
1904                         clear++;
1905                 /* ost exclusion list */
1906                 } else if (strncmp(s1, "exclude=", 8) == 0) {
1907                         rc = lmd_make_exclusion(lmd, s1 + 7);
1908                         if (rc)
1909                                 goto invalid;
1910                         clear++;
1911                 }
1912                 /* Linux 2.4 doesn't pass the device, so we stuck it at the
1913                    end of the options. */
1914                 else if (strncmp(s1, "device=", 7) == 0) {
1915                         devname = s1 + 7;
1916                         /* terminate options right before device.  device
1917                            must be the last one. */
1918                         *s1 = '\0';
1919                         break;
1920                 }
1921
1922                 /* Find next opt */
1923                 s2 = strchr(s1, ',');
1924                 if (s2 == NULL) {
1925                         if (clear)
1926                                 *s1 = '\0';
1927                         break;
1928                 }
1929                 s2++;
1930                 if (clear)
1931                         memmove(s1, s2, strlen(s2) + 1);
1932                 else
1933                         s1 = s2;
1934         }
1935
1936         if (!devname) {
1937                 LCONSOLE_ERROR_MSG(0x164, "Can't find the device name "
1938                                    "(need mount option 'device=...')\n");
1939                 goto invalid;
1940         }
1941
1942         s1 = strstr(devname, ":/");
1943         if (s1) {
1944                 ++s1;
1945                 lmd->lmd_flags = LMD_FLG_CLIENT;
1946                 /* Remove leading /s from fsname */
1947                 while (*++s1 == '/') ;
1948                 /* Freed in lustre_free_lsi */
1949                 OBD_ALLOC(lmd->lmd_profile, strlen(s1) + 8);
1950                 if (!lmd->lmd_profile)
1951                         RETURN(-ENOMEM);
1952                 sprintf(lmd->lmd_profile, "%s-client", s1);
1953         }
1954
1955         /* Freed in lustre_free_lsi */
1956         OBD_ALLOC(lmd->lmd_dev, strlen(devname) + 1);
1957         if (!lmd->lmd_dev)
1958                 RETURN(-ENOMEM);
1959         strcpy(lmd->lmd_dev, devname);
1960
1961         /* Save mount options */
1962         s1 = options + strlen(options) - 1;
1963         while (s1 >= options && (*s1 == ',' || *s1 == ' '))
1964                 *s1-- = 0;
1965         if (*options != 0) {
1966                 /* Freed in lustre_free_lsi */
1967                 OBD_ALLOC(lmd->lmd_opts, strlen(options) + 1);
1968                 if (!lmd->lmd_opts)
1969                         RETURN(-ENOMEM);
1970                 strcpy(lmd->lmd_opts, options);
1971         }
1972
1973         lmd->lmd_magic = LMD_MAGIC;
1974
1975         RETURN(rc);
1976
1977 invalid:
1978         CERROR("Bad mount options %s\n", options);
1979         RETURN(-EINVAL);
1980 }
1981
1982
1983 /* Common mount */
1984 int lustre_fill_super(struct super_block *sb, void *data, int silent)
1985 {
1986         struct lustre_mount_data *lmd;
1987         struct lustre_sb_info *lsi;
1988         int rc;
1989         ENTRY;
1990
1991         CDEBUG(D_MOUNT|D_VFSTRACE, "VFS Op: sb %p\n", sb);
1992
1993         lsi = lustre_init_lsi(sb);
1994         if (!lsi)
1995                 RETURN(-ENOMEM);
1996         lmd = lsi->lsi_lmd;
1997
1998         /*
1999          * Disable lockdep during mount, because mount locking patterns are
2000          * `special'.
2001          */
2002         lockdep_off();
2003
2004         /* Figure out the lmd from the mount options */
2005         if (lmd_parse((char *)data, lmd)) {
2006                 lustre_put_lsi(sb);
2007                 GOTO(out, rc = -EINVAL);
2008         }
2009
2010         if (lmd_is_client(lmd)) {
2011                 CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
2012                 if (!client_fill_super) {
2013                         LCONSOLE_ERROR_MSG(0x165, "Nothing registered for "
2014                                            "client mount! Is the 'lustre' "
2015                                            "module loaded?\n");
2016                         lustre_put_lsi(sb);
2017                         rc = -ENODEV;
2018                 } else {
2019                         rc = lustre_start_mgc(sb);
2020                         if (rc) {
2021                                 lustre_put_lsi(sb);
2022                                 GOTO(out, rc);
2023                         }
2024                         /* Connect and start */
2025                         /* (should always be ll_fill_super) */
2026                         rc = (*client_fill_super)(sb);
2027                         /* c_f_s will call lustre_common_put_super on failure */
2028                 }
2029         } else {
2030                 CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
2031                 lsi->lsi_flags |= LSI_SERVER;
2032                 rc = server_fill_super(sb);
2033                 /* s_f_s calls lustre_start_mgc after the mount because we need
2034                    the MGS nids which are stored on disk.  Plus, we may
2035                    need to start the MGS first. */
2036                 /* s_f_s will call server_put_super on failure */
2037         }
2038
2039         /* If error happens in fill_super() call, @lsi will be killed there.
2040          * This is why we do not put it here. */
2041         GOTO(out, rc);
2042 out:
2043         if (rc) {
2044                 CERROR("Unable to mount %s (%d)\n",
2045                        s2lsi(sb) ? lmd->lmd_dev : "", rc);
2046         } else {
2047                 CDEBUG(D_SUPER, "Mount %s complete\n",
2048                        lmd->lmd_dev);
2049         }
2050         lockdep_on();
2051         return rc;
2052 }
2053
2054
2055 /* We can't call ll_fill_super by name because it lives in a module that
2056    must be loaded after this one. */
2057 void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb))
2058 {
2059         client_fill_super = cfs;
2060 }
2061
2062 void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb))
2063 {
2064         kill_super_cb = cfs;
2065 }
2066
2067 /***************** FS registration ******************/
2068
2069 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
2070 struct super_block * lustre_get_sb(struct file_system_type *fs_type,
2071                                int flags, const char *devname, void * data)
2072 {
2073         return get_sb_nodev(fs_type, flags, data, lustre_fill_super);
2074 }
2075 #else
2076 int lustre_get_sb(struct file_system_type *fs_type,
2077                                int flags, const char *devname, void * data,
2078                                struct vfsmount *mnt)
2079 {
2080         return get_sb_nodev(fs_type, flags, data, lustre_fill_super, mnt);
2081 }
2082 #endif
2083
2084 void lustre_kill_super(struct super_block *sb)
2085 {
2086         struct lustre_sb_info *lsi = s2lsi(sb);
2087
2088         if (kill_super_cb && lsi && !(lsi->lsi_flags & LSI_SERVER))
2089                 (*kill_super_cb)(sb);
2090
2091         kill_anon_super(sb);
2092 }
2093
2094 struct file_system_type lustre_fs_type = {
2095         .owner        = THIS_MODULE,
2096         .name         = "lustre",
2097         .get_sb       = lustre_get_sb,
2098         .kill_sb      = lustre_kill_super,
2099         .fs_flags     = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV |
2100                         LL_RENAME_DOES_D_MOVE,
2101 };
2102
2103 int lustre_register_fs(void)
2104 {
2105         return register_filesystem(&lustre_fs_type);
2106 }
2107
2108 int lustre_unregister_fs(void)
2109 {
2110         return unregister_filesystem(&lustre_fs_type);
2111 }
2112
2113 EXPORT_SYMBOL(lustre_register_client_fill_super);
2114 EXPORT_SYMBOL(lustre_register_kill_super_cb);
2115 EXPORT_SYMBOL(lustre_common_put_super);
2116 EXPORT_SYMBOL(lustre_process_log);
2117 EXPORT_SYMBOL(lustre_end_log);
2118 EXPORT_SYMBOL(server_get_mount);
2119 EXPORT_SYMBOL(server_get_mount_2);
2120 EXPORT_SYMBOL(server_put_mount);
2121 EXPORT_SYMBOL(server_put_mount_2);
2122 EXPORT_SYMBOL(server_register_target);
2123 EXPORT_SYMBOL(server_name2index);
2124 EXPORT_SYMBOL(server_mti_print);
2125 EXPORT_SYMBOL(do_lcfg);