Whamcloud - gitweb
fbd047a2460b15de4a1dcd8186fd7e6a1eb05af2
[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         /* intepret <fsname>-MDTXXXXX-mdc as mdt, the better way is to pass
1688          * in the fsname, then determine the server index */
1689         if (!strcmp(LUSTRE_MDC_NAME, dash + 1)) {
1690                 dash--;
1691                 for (; dash > svname && *dash != '-'; dash--);
1692                 if (dash == svname)
1693                         return(-EINVAL);
1694         }
1695
1696         if (strncmp(dash + 1, "MDT", 3) == 0)
1697                 rc = LDD_F_SV_TYPE_MDT;
1698         else if (strncmp(dash + 1, "OST", 3) == 0)
1699                 rc = LDD_F_SV_TYPE_OST;
1700         else
1701                 return(-EINVAL);
1702         if (strcmp(dash + 4, "all") == 0)
1703                 return rc | LDD_F_SV_ALL;
1704
1705         index = simple_strtoul(dash + 4, endptr, 16);
1706         *idx = index;
1707         return rc;
1708 }
1709
1710 /*************** mount common betweeen server and client ***************/
1711
1712 /* Common umount */
1713 int lustre_common_put_super(struct super_block *sb)
1714 {
1715         int rc;
1716         ENTRY;
1717
1718         CDEBUG(D_MOUNT, "dropping sb %p\n", sb);
1719
1720         /* Drop a ref to the MGC */
1721         rc = lustre_stop_mgc(sb);
1722         if (rc && (rc != -ENOENT)) {
1723                 if (rc != -EBUSY) {
1724                         CERROR("Can't stop MGC: %d\n", rc);
1725                         RETURN(rc);
1726                 }
1727                 /* BUSY just means that there's some other obd that
1728                    needs the mgc.  Let him clean it up. */
1729                 CDEBUG(D_MOUNT, "MGC still in use\n");
1730         }
1731         /* Drop a ref to the mounted disk */
1732         lustre_put_lsi(sb);
1733         lu_types_stop();
1734         RETURN(rc);
1735 }
1736
1737 #if 0
1738 static void lmd_print(struct lustre_mount_data *lmd)
1739 {
1740         int i;
1741
1742         PRINT_CMD(PRINT_MASK, "  mount data:\n");
1743         if (lmd_is_client(lmd))
1744                 PRINT_CMD(PRINT_MASK, "profile: %s\n", lmd->lmd_profile);
1745         PRINT_CMD(PRINT_MASK, "device:  %s\n", lmd->lmd_dev);
1746         PRINT_CMD(PRINT_MASK, "flags:   %x\n", lmd->lmd_flags);
1747         if (lmd->lmd_opts)
1748                 PRINT_CMD(PRINT_MASK, "options: %s\n", lmd->lmd_opts);
1749         for (i = 0; i < lmd->lmd_exclude_count; i++) {
1750                 PRINT_CMD(PRINT_MASK, "exclude %d:  OST%04x\n", i,
1751                           lmd->lmd_exclude[i]);
1752         }
1753 }
1754 #endif
1755
1756 /* Is this server on the exclusion list */
1757 int lustre_check_exclusion(struct super_block *sb, char *svname)
1758 {
1759         struct lustre_sb_info *lsi = s2lsi(sb);
1760         struct lustre_mount_data *lmd = lsi->lsi_lmd;
1761         __u32 index;
1762         int i, rc;
1763         ENTRY;
1764
1765         rc = server_name2index(svname, &index, NULL);
1766         if (rc != LDD_F_SV_TYPE_OST)
1767                 /* Only exclude OSTs */
1768                 RETURN(0);
1769
1770         CDEBUG(D_MOUNT, "Check exclusion %s (%d) in %d of %s\n", svname,
1771                index, lmd->lmd_exclude_count, lmd->lmd_dev);
1772
1773         for(i = 0; i < lmd->lmd_exclude_count; i++) {
1774                 if (index == lmd->lmd_exclude[i]) {
1775                         CWARN("Excluding %s (on exclusion list)\n", svname);
1776                         RETURN(1);
1777                 }
1778         }
1779         RETURN(0);
1780 }
1781
1782 /* mount -v  -o exclude=lustre-OST0001:lustre-OST0002 -t lustre ... */
1783 static int lmd_make_exclusion(struct lustre_mount_data *lmd, char *ptr)
1784 {
1785         char *s1 = ptr, *s2;
1786         __u32 index, *exclude_list;
1787         int rc = 0, devmax;
1788         ENTRY;
1789
1790         /* The shortest an ost name can be is 8 chars: -OST0000.
1791            We don't actually know the fsname at this time, so in fact
1792            a user could specify any fsname. */
1793         devmax = strlen(ptr) / 8 + 1;
1794
1795         /* temp storage until we figure out how many we have */
1796         OBD_ALLOC(exclude_list, sizeof(index) * devmax);
1797         if (!exclude_list)
1798                 RETURN(-ENOMEM);
1799
1800         /* we enter this fn pointing at the '=' */
1801         while (*s1 && *s1 != ' ' && *s1 != ',') {
1802                 s1++;
1803                 rc = server_name2index(s1, &index, &s2);
1804                 if (rc < 0) {
1805                         CERROR("Can't parse server name '%s'\n", s1);
1806                         break;
1807                 }
1808                 if (rc == LDD_F_SV_TYPE_OST)
1809                         exclude_list[lmd->lmd_exclude_count++] = index;
1810                 else
1811                         CDEBUG(D_MOUNT, "ignoring exclude %.7s\n", s1);
1812                 s1 = s2;
1813                 /* now we are pointing at ':' (next exclude)
1814                    or ',' (end of excludes) */
1815                 if (lmd->lmd_exclude_count >= devmax)
1816                         break;
1817         }
1818         if (rc >= 0) /* non-err */
1819                 rc = 0;
1820
1821         if (lmd->lmd_exclude_count) {
1822                 /* permanent, freed in lustre_free_lsi */
1823                 OBD_ALLOC(lmd->lmd_exclude, sizeof(index) *
1824                           lmd->lmd_exclude_count);
1825                 if (lmd->lmd_exclude) {
1826                         memcpy(lmd->lmd_exclude, exclude_list,
1827                                sizeof(index) * lmd->lmd_exclude_count);
1828                 } else {
1829                         rc = -ENOMEM;
1830                         lmd->lmd_exclude_count = 0;
1831                 }
1832         }
1833         OBD_FREE(exclude_list, sizeof(index) * devmax);
1834         RETURN(rc);
1835 }
1836
1837 static int lmd_parse_mgssec(struct lustre_mount_data *lmd, char *ptr)
1838 {
1839         char   *tail;
1840         int     length;
1841
1842         if (lmd->lmd_mgssec != NULL) {
1843                 OBD_FREE(lmd->lmd_mgssec, strlen(lmd->lmd_mgssec) + 1);
1844                 lmd->lmd_mgssec = NULL;
1845         }
1846
1847         tail = strchr(ptr, ',');
1848         if (tail == NULL)
1849                 length = strlen(ptr);
1850         else
1851                 length = tail - ptr;
1852
1853         OBD_ALLOC(lmd->lmd_mgssec, length + 1);
1854         if (lmd->lmd_mgssec == NULL)
1855                 return -ENOMEM;
1856
1857         memcpy(lmd->lmd_mgssec, ptr, length);
1858         lmd->lmd_mgssec[length] = '\0';
1859         return 0;
1860 }
1861
1862 /* mount -v -t lustre uml1:uml2:/lustre-client /mnt/lustre */
1863 static int lmd_parse(char *options, struct lustre_mount_data *lmd)
1864 {
1865         char *s1, *s2, *devname = NULL;
1866         struct lustre_mount_data *raw = (struct lustre_mount_data *)options;
1867         int rc = 0;
1868         ENTRY;
1869
1870         LASSERT(lmd);
1871         if (!options) {
1872                 LCONSOLE_ERROR_MSG(0x162, "Missing mount data: check that "
1873                                    "/sbin/mount.lustre is installed.\n");
1874                 RETURN(-EINVAL);
1875         }
1876
1877         /* Options should be a string - try to detect old lmd data */
1878         if ((raw->lmd_magic & 0xffffff00) == (LMD_MAGIC & 0xffffff00)) {
1879                 LCONSOLE_ERROR_MSG(0x163, "You're using an old version of "
1880                                    "/sbin/mount.lustre.  Please install "
1881                                    "version %s\n", LUSTRE_VERSION_STRING);
1882                 RETURN(-EINVAL);
1883         }
1884         lmd->lmd_magic = LMD_MAGIC;
1885
1886         /* Set default flags here */
1887
1888         s1 = options;
1889         while (*s1) {
1890                 int clear = 0;
1891                 /* Skip whitespace and extra commas */
1892                 while (*s1 == ' ' || *s1 == ',')
1893                         s1++;
1894
1895                 /* Client options are parsed in ll_options: eg. flock,
1896                    user_xattr, acl */
1897
1898                 /* Parse non-ldiskfs options here. Rather than modifying
1899                    ldiskfs, we just zero these out here */
1900                 if (strncmp(s1, "abort_recov", 11) == 0) {
1901                         lmd->lmd_flags |= LMD_FLG_ABORT_RECOV;
1902                         clear++;
1903                 } else if (strncmp(s1, "nosvc", 5) == 0) {
1904                         lmd->lmd_flags |= LMD_FLG_NOSVC;
1905                         clear++;
1906                 } else if (strncmp(s1, "nomgs", 5) == 0) {
1907                         lmd->lmd_flags |= LMD_FLG_NOMGS;
1908                         clear++;
1909                 } else if (strncmp(s1, "mgssec=", 7) == 0) {
1910                         rc = lmd_parse_mgssec(lmd, s1 + 7);
1911                         if (rc)
1912                                 goto invalid;
1913                         clear++;
1914                 /* ost exclusion list */
1915                 } else if (strncmp(s1, "exclude=", 8) == 0) {
1916                         rc = lmd_make_exclusion(lmd, s1 + 7);
1917                         if (rc)
1918                                 goto invalid;
1919                         clear++;
1920                 }
1921                 /* Linux 2.4 doesn't pass the device, so we stuck it at the
1922                    end of the options. */
1923                 else if (strncmp(s1, "device=", 7) == 0) {
1924                         devname = s1 + 7;
1925                         /* terminate options right before device.  device
1926                            must be the last one. */
1927                         *s1 = '\0';
1928                         break;
1929                 }
1930
1931                 /* Find next opt */
1932                 s2 = strchr(s1, ',');
1933                 if (s2 == NULL) {
1934                         if (clear)
1935                                 *s1 = '\0';
1936                         break;
1937                 }
1938                 s2++;
1939                 if (clear)
1940                         memmove(s1, s2, strlen(s2) + 1);
1941                 else
1942                         s1 = s2;
1943         }
1944
1945         if (!devname) {
1946                 LCONSOLE_ERROR_MSG(0x164, "Can't find the device name "
1947                                    "(need mount option 'device=...')\n");
1948                 goto invalid;
1949         }
1950
1951         s1 = strstr(devname, ":/");
1952         if (s1) {
1953                 ++s1;
1954                 lmd->lmd_flags = LMD_FLG_CLIENT;
1955                 /* Remove leading /s from fsname */
1956                 while (*++s1 == '/') ;
1957                 /* Freed in lustre_free_lsi */
1958                 OBD_ALLOC(lmd->lmd_profile, strlen(s1) + 8);
1959                 if (!lmd->lmd_profile)
1960                         RETURN(-ENOMEM);
1961                 sprintf(lmd->lmd_profile, "%s-client", s1);
1962         }
1963
1964         /* Freed in lustre_free_lsi */
1965         OBD_ALLOC(lmd->lmd_dev, strlen(devname) + 1);
1966         if (!lmd->lmd_dev)
1967                 RETURN(-ENOMEM);
1968         strcpy(lmd->lmd_dev, devname);
1969
1970         /* Save mount options */
1971         s1 = options + strlen(options) - 1;
1972         while (s1 >= options && (*s1 == ',' || *s1 == ' '))
1973                 *s1-- = 0;
1974         if (*options != 0) {
1975                 /* Freed in lustre_free_lsi */
1976                 OBD_ALLOC(lmd->lmd_opts, strlen(options) + 1);
1977                 if (!lmd->lmd_opts)
1978                         RETURN(-ENOMEM);
1979                 strcpy(lmd->lmd_opts, options);
1980         }
1981
1982         lmd->lmd_magic = LMD_MAGIC;
1983
1984         RETURN(rc);
1985
1986 invalid:
1987         CERROR("Bad mount options %s\n", options);
1988         RETURN(-EINVAL);
1989 }
1990
1991
1992 /* Common mount */
1993 int lustre_fill_super(struct super_block *sb, void *data, int silent)
1994 {
1995         struct lustre_mount_data *lmd;
1996         struct lustre_sb_info *lsi;
1997         int rc;
1998         ENTRY;
1999
2000         CDEBUG(D_MOUNT|D_VFSTRACE, "VFS Op: sb %p\n", sb);
2001
2002         lsi = lustre_init_lsi(sb);
2003         if (!lsi)
2004                 RETURN(-ENOMEM);
2005         lmd = lsi->lsi_lmd;
2006
2007         /*
2008          * Disable lockdep during mount, because mount locking patterns are
2009          * `special'.
2010          */
2011         lockdep_off();
2012
2013         /* Figure out the lmd from the mount options */
2014         if (lmd_parse((char *)data, lmd)) {
2015                 lustre_put_lsi(sb);
2016                 GOTO(out, rc = -EINVAL);
2017         }
2018
2019         if (lmd_is_client(lmd)) {
2020                 CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
2021                 if (!client_fill_super) {
2022                         LCONSOLE_ERROR_MSG(0x165, "Nothing registered for "
2023                                            "client mount! Is the 'lustre' "
2024                                            "module loaded?\n");
2025                         lustre_put_lsi(sb);
2026                         rc = -ENODEV;
2027                 } else {
2028                         rc = lustre_start_mgc(sb);
2029                         if (rc) {
2030                                 lustre_put_lsi(sb);
2031                                 GOTO(out, rc);
2032                         }
2033                         /* Connect and start */
2034                         /* (should always be ll_fill_super) */
2035                         rc = (*client_fill_super)(sb);
2036                         /* c_f_s will call lustre_common_put_super on failure */
2037                 }
2038         } else {
2039                 CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
2040                 lsi->lsi_flags |= LSI_SERVER;
2041                 rc = server_fill_super(sb);
2042                 /* s_f_s calls lustre_start_mgc after the mount because we need
2043                    the MGS nids which are stored on disk.  Plus, we may
2044                    need to start the MGS first. */
2045                 /* s_f_s will call server_put_super on failure */
2046         }
2047
2048         /* If error happens in fill_super() call, @lsi will be killed there.
2049          * This is why we do not put it here. */
2050         GOTO(out, rc);
2051 out:
2052         if (rc) {
2053                 CERROR("Unable to mount %s (%d)\n",
2054                        s2lsi(sb) ? lmd->lmd_dev : "", rc);
2055         } else {
2056                 CDEBUG(D_SUPER, "Mount %s complete\n",
2057                        lmd->lmd_dev);
2058         }
2059         lockdep_on();
2060         return rc;
2061 }
2062
2063
2064 /* We can't call ll_fill_super by name because it lives in a module that
2065    must be loaded after this one. */
2066 void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb))
2067 {
2068         client_fill_super = cfs;
2069 }
2070
2071 void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb))
2072 {
2073         kill_super_cb = cfs;
2074 }
2075
2076 /***************** FS registration ******************/
2077
2078 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
2079 struct super_block * lustre_get_sb(struct file_system_type *fs_type,
2080                                int flags, const char *devname, void * data)
2081 {
2082         return get_sb_nodev(fs_type, flags, data, lustre_fill_super);
2083 }
2084 #else
2085 int lustre_get_sb(struct file_system_type *fs_type,
2086                                int flags, const char *devname, void * data,
2087                                struct vfsmount *mnt)
2088 {
2089         return get_sb_nodev(fs_type, flags, data, lustre_fill_super, mnt);
2090 }
2091 #endif
2092
2093 void lustre_kill_super(struct super_block *sb)
2094 {
2095         struct lustre_sb_info *lsi = s2lsi(sb);
2096
2097         if (kill_super_cb && lsi && !(lsi->lsi_flags & LSI_SERVER))
2098                 (*kill_super_cb)(sb);
2099
2100         kill_anon_super(sb);
2101 }
2102
2103 struct file_system_type lustre_fs_type = {
2104         .owner        = THIS_MODULE,
2105         .name         = "lustre",
2106         .get_sb       = lustre_get_sb,
2107         .kill_sb      = lustre_kill_super,
2108         .fs_flags     = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV |
2109                         LL_RENAME_DOES_D_MOVE,
2110 };
2111
2112 int lustre_register_fs(void)
2113 {
2114         return register_filesystem(&lustre_fs_type);
2115 }
2116
2117 int lustre_unregister_fs(void)
2118 {
2119         return unregister_filesystem(&lustre_fs_type);
2120 }
2121
2122 EXPORT_SYMBOL(lustre_register_client_fill_super);
2123 EXPORT_SYMBOL(lustre_register_kill_super_cb);
2124 EXPORT_SYMBOL(lustre_common_put_super);
2125 EXPORT_SYMBOL(lustre_process_log);
2126 EXPORT_SYMBOL(lustre_end_log);
2127 EXPORT_SYMBOL(server_get_mount);
2128 EXPORT_SYMBOL(server_get_mount_2);
2129 EXPORT_SYMBOL(server_put_mount);
2130 EXPORT_SYMBOL(server_put_mount_2);
2131 EXPORT_SYMBOL(server_register_target);
2132 EXPORT_SYMBOL(server_name2index);
2133 EXPORT_SYMBOL(server_mti_print);
2134 EXPORT_SYMBOL(do_lcfg);