Whamcloud - gitweb
*** empty log message ***
[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 %u\n",
297                        len, (int)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 /* Wait here forever until the mount refcount is 0 before completing umount,
1377  * else we risk dereferencing a null pointer.
1378  * LNET may take e.g. 165s before killing zombies.
1379  */
1380 static void server_wait_finished(struct vfsmount *mnt)
1381 {
1382        cfs_waitq_t             waitq;
1383        int                     rc, waited = 0;
1384        cfs_sigset_t            blocked;
1385
1386        cfs_waitq_init(&waitq);
1387
1388        while (cfs_atomic_read(&mnt->mnt_count) > 1) {
1389                if (waited && (waited % 30 == 0))
1390                        LCONSOLE_WARN("Mount still busy with %d refs after "
1391                                       "%d secs.\n",
1392                                       atomic_read(&mnt->mnt_count),
1393                                       waited);
1394                /* Cannot use l_event_wait() for an interruptible sleep. */
1395                waited += 3;
1396                blocked = l_w_e_set_sigs(sigmask(SIGKILL));
1397                cfs_waitq_wait_event_interruptible_timeout(
1398                        waitq,
1399                        (cfs_atomic_read(&mnt->mnt_count) == 1),
1400                        cfs_time_seconds(3),
1401                        rc);
1402                cfs_block_sigs(blocked);
1403                if (rc < 0) {
1404                        LCONSOLE_EMERG("Danger: interrupted umount %s with "
1405                                       "%d refs!\n",
1406                                       mnt->mnt_devname,
1407                                       atomic_read(&mnt->mnt_count));
1408                        break;
1409                }
1410
1411        }
1412 }
1413
1414 static void server_put_super(struct super_block *sb)
1415 {
1416         struct lustre_sb_info *lsi = s2lsi(sb);
1417         struct obd_device     *obd;
1418         struct vfsmount       *mnt = lsi->lsi_srv_mnt;
1419         char *tmpname, *extraname = NULL;
1420         int tmpname_sz;
1421         int lddflags = lsi->lsi_ldd->ldd_flags;
1422         int lsiflags = lsi->lsi_flags;
1423         ENTRY;
1424
1425         LASSERT(lsiflags & LSI_SERVER);
1426
1427         tmpname_sz = strlen(lsi->lsi_ldd->ldd_svname) + 1;
1428         OBD_ALLOC(tmpname, tmpname_sz);
1429         memcpy(tmpname, lsi->lsi_ldd->ldd_svname, tmpname_sz);
1430         CDEBUG(D_MOUNT, "server put_super %s\n", tmpname);
1431         if (IS_MDT(lsi->lsi_ldd) && (lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC))
1432                 snprintf(tmpname, tmpname_sz, "MGS");
1433
1434         /* Stop the target */
1435         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
1436             (IS_MDT(lsi->lsi_ldd) || IS_OST(lsi->lsi_ldd))) {
1437                 struct lustre_profile *lprof = NULL;
1438
1439                 /* tell the mgc to drop the config log */
1440                 lustre_end_log(sb, lsi->lsi_ldd->ldd_svname, NULL);
1441
1442                 /* COMPAT_146 - profile may get deleted in mgc_cleanup.
1443                    If there are any setup/cleanup errors, save the lov
1444                    name for safety cleanup later. */
1445                 lprof = class_get_profile(lsi->lsi_ldd->ldd_svname);
1446                 if (lprof && lprof->lp_dt) {
1447                         OBD_ALLOC(extraname, strlen(lprof->lp_dt) + 1);
1448                         strcpy(extraname, lprof->lp_dt);
1449                 }
1450
1451                 obd = class_name2obd(lsi->lsi_ldd->ldd_svname);
1452                 if (obd) {
1453                         CDEBUG(D_MOUNT, "stopping %s\n", obd->obd_name);
1454                         if (lsi->lsi_flags & LSI_UMOUNT_FAILOVER)
1455                                 obd->obd_fail = 1;
1456                         /* We can't seem to give an error return code
1457                          * to .put_super, so we better make sure we clean up! */
1458                         obd->obd_force = 1;
1459                         class_manual_cleanup(obd);
1460                 } else {
1461                         CERROR("no obd %s\n", lsi->lsi_ldd->ldd_svname);
1462                         server_deregister_mount(lsi->lsi_ldd->ldd_svname);
1463                 }
1464         }
1465
1466         /* If they wanted the mgs to stop separately from the mdt, they
1467            should have put it on a different device. */
1468         if (IS_MGS(lsi->lsi_ldd)) {
1469                 /* if MDS start with --nomgs, don't stop MGS then */
1470                 if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS))
1471                         server_stop_mgs(sb);
1472         }
1473
1474         /* Clean the mgc and sb */
1475         lustre_common_put_super(sb);
1476
1477         /* Wait for the targets to really clean up - can't exit (and let the
1478            sb get destroyed) while the mount is still in use */
1479         server_wait_finished(mnt);
1480
1481         /* drop the One True Mount */
1482         unlock_mntput(mnt);
1483
1484         /* Stop the servers (MDS, OSS) if no longer needed.  We must wait
1485            until the target is really gone so that our type refcount check
1486            is right. */
1487         server_stop_servers(lddflags, lsiflags);
1488
1489         /* In case of startup or cleanup err, stop related obds */
1490         if (extraname) {
1491                 obd = class_name2obd(extraname);
1492                 if (obd) {
1493                         CWARN("Cleaning orphaned obd %s\n", extraname);
1494                         obd->obd_force = 1;
1495                         class_manual_cleanup(obd);
1496                 }
1497                 OBD_FREE(extraname, strlen(extraname) + 1);
1498         }
1499
1500         LCONSOLE_WARN("server umount %s complete\n", tmpname);
1501         OBD_FREE(tmpname, tmpname_sz);
1502         EXIT;
1503 }
1504
1505 #ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
1506 static void server_umount_begin(struct vfsmount *vfsmnt, int flags)
1507 {
1508         struct super_block *sb = vfsmnt->mnt_sb;
1509 #else
1510 static void server_umount_begin(struct super_block *sb)
1511 {
1512 #endif
1513         struct lustre_sb_info *lsi = s2lsi(sb);
1514         ENTRY;
1515
1516 #ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
1517         if (!(flags & MNT_FORCE)) {
1518                 EXIT;
1519                 return;
1520         }
1521 #endif
1522
1523         CDEBUG(D_MOUNT, "umount -f\n");
1524         /* umount = failover
1525            umount -f = force
1526            no third way to do non-force, non-failover */
1527         lsi->lsi_flags &= ~LSI_UMOUNT_FAILOVER;
1528         lsi->lsi_flags |= LSI_UMOUNT_FORCE;
1529         EXIT;
1530 }
1531
1532 #ifndef HAVE_STATFS_DENTRY_PARAM
1533 static int server_statfs (struct super_block *sb, struct kstatfs *buf)
1534 {
1535 #else
1536 static int server_statfs (struct dentry *dentry, struct kstatfs *buf)
1537 {
1538         struct super_block *sb = dentry->d_sb;
1539 #endif
1540         struct vfsmount *mnt = s2lsi(sb)->lsi_srv_mnt;
1541         ENTRY;
1542
1543         if (mnt && mnt->mnt_sb && mnt->mnt_sb->s_op->statfs) {
1544 #ifdef HAVE_STATFS_DENTRY_PARAM
1545                 int rc = mnt->mnt_sb->s_op->statfs(mnt->mnt_root, buf);
1546 #else
1547                 int rc = mnt->mnt_sb->s_op->statfs(mnt->mnt_sb, buf);
1548 #endif
1549                 if (!rc) {
1550                         buf->f_type = sb->s_magic;
1551                         RETURN(0);
1552                 }
1553         }
1554
1555         /* just return 0 */
1556         buf->f_type = sb->s_magic;
1557         buf->f_bsize = sb->s_blocksize;
1558         buf->f_blocks = 1;
1559         buf->f_bfree = 0;
1560         buf->f_bavail = 0;
1561         buf->f_files = 1;
1562         buf->f_ffree = 0;
1563         buf->f_namelen = NAME_MAX;
1564         RETURN(0);
1565 }
1566
1567 static struct super_operations server_ops =
1568 {
1569         .put_super      = server_put_super,
1570         .umount_begin   = server_umount_begin, /* umount -f */
1571         .statfs         = server_statfs,
1572 };
1573
1574 #define log2(n) ffz(~(n))
1575 #define LUSTRE_SUPER_MAGIC 0x0BD00BD1
1576
1577 static int server_fill_super_common(struct super_block *sb)
1578 {
1579         struct inode *root = 0;
1580         ENTRY;
1581
1582         CDEBUG(D_MOUNT, "Server sb, dev=%d\n", (int)sb->s_dev);
1583
1584         sb->s_blocksize = 4096;
1585         sb->s_blocksize_bits = log2(sb->s_blocksize);
1586         sb->s_magic = LUSTRE_SUPER_MAGIC;
1587         sb->s_maxbytes = 0; //PAGE_CACHE_MAXBYTES;
1588         sb->s_flags |= MS_RDONLY;
1589         sb->s_op = &server_ops;
1590
1591         root = new_inode(sb);
1592         if (!root) {
1593                 CERROR("Can't make root inode\n");
1594                 RETURN(-EIO);
1595         }
1596
1597         /* returns -EIO for every operation */
1598         /* make_bad_inode(root); -- badness - can't umount */
1599         /* apparently we need to be a directory for the mount to finish */
1600         root->i_mode = S_IFDIR;
1601
1602         sb->s_root = d_alloc_root(root);
1603         if (!sb->s_root) {
1604                 CERROR("Can't make root dentry\n");
1605                 iput(root);
1606                 RETURN(-EIO);
1607         }
1608
1609         RETURN(0);
1610 }
1611
1612 static int server_fill_super(struct super_block *sb)
1613 {
1614         struct lustre_sb_info *lsi = s2lsi(sb);
1615         struct vfsmount *mnt;
1616         int rc;
1617         ENTRY;
1618
1619         /* the One True Mount */
1620         mnt = server_kernel_mount(sb);
1621         if (IS_ERR(mnt)) {
1622                 rc = PTR_ERR(mnt);
1623                 CERROR("Unable to mount device %s: %d\n",
1624                        lsi->lsi_lmd->lmd_dev, rc);
1625                 lustre_put_lsi(sb);
1626                 RETURN(rc);
1627         }
1628         lsi->lsi_srv_mnt = mnt;
1629
1630         LASSERT(lsi->lsi_ldd);
1631         CDEBUG(D_MOUNT, "Found service %s for fs '%s' on device %s\n",
1632                lsi->lsi_ldd->ldd_svname, lsi->lsi_ldd->ldd_fsname,
1633                lsi->lsi_lmd->lmd_dev);
1634
1635         if (class_name2obd(lsi->lsi_ldd->ldd_svname)) {
1636                 LCONSOLE_ERROR_MSG(0x161, "The target named %s is already "
1637                                    "running. Double-mount may have compromised"
1638                                    " the disk journal.\n",
1639                                    lsi->lsi_ldd->ldd_svname);
1640                 lustre_put_lsi(sb);
1641                 unlock_mntput(mnt);
1642                 RETURN(-EALREADY);
1643         }
1644
1645         /* Start MGS before MGC */
1646         if (IS_MGS(lsi->lsi_ldd) && !(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS)){
1647                 rc = server_start_mgs(sb);
1648                 if (rc)
1649                         GOTO(out_mnt, rc);
1650         }
1651
1652         rc = lustre_start_mgc(sb);
1653         if (rc)
1654                 GOTO(out_mnt, rc);
1655
1656         /* Set up all obd devices for service */
1657         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
1658                 (IS_OST(lsi->lsi_ldd) || IS_MDT(lsi->lsi_ldd))) {
1659                 rc = server_start_targets(sb, mnt);
1660                 if (rc < 0) {
1661                         CERROR("Unable to start targets: %d\n", rc);
1662                         GOTO(out_mnt, rc);
1663                 }
1664         /* FIXME overmount client here,
1665            or can we just start a client log and client_fill_super on this sb?
1666            We need to make sure server_put_super gets called too - ll_put_super
1667            calls lustre_common_put_super; check there for LSI_SERVER flag,
1668            call s_p_s if so.
1669            Probably should start client from new thread so we can return.
1670            Client will not finish until all servers are connected.
1671            Note - MGS-only server does NOT get a client, since there is no
1672            lustre fs associated - the MGS is for all lustre fs's */
1673         }
1674
1675         rc = server_fill_super_common(sb);
1676         if (rc)
1677                 GOTO(out_mnt, rc);
1678
1679         LCONSOLE_WARN("Server %s on device %s has started\n",
1680                       ((lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
1681                        (IS_MDT(lsi->lsi_ldd))) ? "MGS" : lsi->lsi_ldd->ldd_svname,
1682                       lsi->lsi_lmd->lmd_dev);
1683
1684         RETURN(0);
1685 out_mnt:
1686         /* We jump here in case of failure while starting targets or MGS.
1687          * In this case we can't just put @mnt and have to do real cleanup
1688          * with stoping targets, etc. */
1689         server_put_super(sb);
1690         return rc;
1691 }
1692
1693 /* Get the index from the obd name.
1694    rc = server type, or
1695    rc < 0  on error
1696    if endptr isn't NULL it is set to end of name */
1697 int server_name2index(char *svname, __u32 *idx, char **endptr)
1698 {
1699         unsigned long index;
1700         int rc;
1701         char *dash = strrchr(svname, '-');
1702         if (!dash)
1703                 return(-EINVAL);
1704
1705         /* intepret <fsname>-MDTXXXXX-mdc as mdt, the better way is to pass
1706          * in the fsname, then determine the server index */
1707         if (!strcmp(LUSTRE_MDC_NAME, dash + 1)) {
1708                 dash--;
1709                 for (; dash > svname && *dash != '-'; dash--);
1710                 if (dash == svname)
1711                         return(-EINVAL);
1712         }
1713
1714         if (strncmp(dash + 1, "MDT", 3) == 0)
1715                 rc = LDD_F_SV_TYPE_MDT;
1716         else if (strncmp(dash + 1, "OST", 3) == 0)
1717                 rc = LDD_F_SV_TYPE_OST;
1718         else
1719                 return(-EINVAL);
1720         if (strcmp(dash + 4, "all") == 0)
1721                 return rc | LDD_F_SV_ALL;
1722
1723         index = simple_strtoul(dash + 4, endptr, 16);
1724         *idx = index;
1725         return rc;
1726 }
1727
1728 /*************** mount common betweeen server and client ***************/
1729
1730 /* Common umount */
1731 int lustre_common_put_super(struct super_block *sb)
1732 {
1733         int rc;
1734         ENTRY;
1735
1736         CDEBUG(D_MOUNT, "dropping sb %p\n", sb);
1737
1738         /* Drop a ref to the MGC */
1739         rc = lustre_stop_mgc(sb);
1740         if (rc && (rc != -ENOENT)) {
1741                 if (rc != -EBUSY) {
1742                         CERROR("Can't stop MGC: %d\n", rc);
1743                         RETURN(rc);
1744                 }
1745                 /* BUSY just means that there's some other obd that
1746                    needs the mgc.  Let him clean it up. */
1747                 CDEBUG(D_MOUNT, "MGC still in use\n");
1748         }
1749         /* Drop a ref to the mounted disk */
1750         lustre_put_lsi(sb);
1751         lu_types_stop();
1752         RETURN(rc);
1753 }
1754
1755 #if 0
1756 static void lmd_print(struct lustre_mount_data *lmd)
1757 {
1758         int i;
1759
1760         PRINT_CMD(PRINT_MASK, "  mount data:\n");
1761         if (lmd_is_client(lmd))
1762                 PRINT_CMD(PRINT_MASK, "profile: %s\n", lmd->lmd_profile);
1763         PRINT_CMD(PRINT_MASK, "device:  %s\n", lmd->lmd_dev);
1764         PRINT_CMD(PRINT_MASK, "flags:   %x\n", lmd->lmd_flags);
1765         if (lmd->lmd_opts)
1766                 PRINT_CMD(PRINT_MASK, "options: %s\n", lmd->lmd_opts);
1767         for (i = 0; i < lmd->lmd_exclude_count; i++) {
1768                 PRINT_CMD(PRINT_MASK, "exclude %d:  OST%04x\n", i,
1769                           lmd->lmd_exclude[i]);
1770         }
1771 }
1772 #endif
1773
1774 /* Is this server on the exclusion list */
1775 int lustre_check_exclusion(struct super_block *sb, char *svname)
1776 {
1777         struct lustre_sb_info *lsi = s2lsi(sb);
1778         struct lustre_mount_data *lmd = lsi->lsi_lmd;
1779         __u32 index;
1780         int i, rc;
1781         ENTRY;
1782
1783         rc = server_name2index(svname, &index, NULL);
1784         if (rc != LDD_F_SV_TYPE_OST)
1785                 /* Only exclude OSTs */
1786                 RETURN(0);
1787
1788         CDEBUG(D_MOUNT, "Check exclusion %s (%d) in %d of %s\n", svname,
1789                index, lmd->lmd_exclude_count, lmd->lmd_dev);
1790
1791         for(i = 0; i < lmd->lmd_exclude_count; i++) {
1792                 if (index == lmd->lmd_exclude[i]) {
1793                         CWARN("Excluding %s (on exclusion list)\n", svname);
1794                         RETURN(1);
1795                 }
1796         }
1797         RETURN(0);
1798 }
1799
1800 /* mount -v  -o exclude=lustre-OST0001:lustre-OST0002 -t lustre ... */
1801 static int lmd_make_exclusion(struct lustre_mount_data *lmd, char *ptr)
1802 {
1803         char *s1 = ptr, *s2;
1804         __u32 index, *exclude_list;
1805         int rc = 0, devmax;
1806         ENTRY;
1807
1808         /* The shortest an ost name can be is 8 chars: -OST0000.
1809            We don't actually know the fsname at this time, so in fact
1810            a user could specify any fsname. */
1811         devmax = strlen(ptr) / 8 + 1;
1812
1813         /* temp storage until we figure out how many we have */
1814         OBD_ALLOC(exclude_list, sizeof(index) * devmax);
1815         if (!exclude_list)
1816                 RETURN(-ENOMEM);
1817
1818         /* we enter this fn pointing at the '=' */
1819         while (*s1 && *s1 != ' ' && *s1 != ',') {
1820                 s1++;
1821                 rc = server_name2index(s1, &index, &s2);
1822                 if (rc < 0) {
1823                         CERROR("Can't parse server name '%s'\n", s1);
1824                         break;
1825                 }
1826                 if (rc == LDD_F_SV_TYPE_OST)
1827                         exclude_list[lmd->lmd_exclude_count++] = index;
1828                 else
1829                         CDEBUG(D_MOUNT, "ignoring exclude %.7s\n", s1);
1830                 s1 = s2;
1831                 /* now we are pointing at ':' (next exclude)
1832                    or ',' (end of excludes) */
1833                 if (lmd->lmd_exclude_count >= devmax)
1834                         break;
1835         }
1836         if (rc >= 0) /* non-err */
1837                 rc = 0;
1838
1839         if (lmd->lmd_exclude_count) {
1840                 /* permanent, freed in lustre_free_lsi */
1841                 OBD_ALLOC(lmd->lmd_exclude, sizeof(index) *
1842                           lmd->lmd_exclude_count);
1843                 if (lmd->lmd_exclude) {
1844                         memcpy(lmd->lmd_exclude, exclude_list,
1845                                sizeof(index) * lmd->lmd_exclude_count);
1846                 } else {
1847                         rc = -ENOMEM;
1848                         lmd->lmd_exclude_count = 0;
1849                 }
1850         }
1851         OBD_FREE(exclude_list, sizeof(index) * devmax);
1852         RETURN(rc);
1853 }
1854
1855 static int lmd_parse_mgssec(struct lustre_mount_data *lmd, char *ptr)
1856 {
1857         char   *tail;
1858         int     length;
1859
1860         if (lmd->lmd_mgssec != NULL) {
1861                 OBD_FREE(lmd->lmd_mgssec, strlen(lmd->lmd_mgssec) + 1);
1862                 lmd->lmd_mgssec = NULL;
1863         }
1864
1865         tail = strchr(ptr, ',');
1866         if (tail == NULL)
1867                 length = strlen(ptr);
1868         else
1869                 length = tail - ptr;
1870
1871         OBD_ALLOC(lmd->lmd_mgssec, length + 1);
1872         if (lmd->lmd_mgssec == NULL)
1873                 return -ENOMEM;
1874
1875         memcpy(lmd->lmd_mgssec, ptr, length);
1876         lmd->lmd_mgssec[length] = '\0';
1877         return 0;
1878 }
1879
1880 /* mount -v -t lustre uml1:uml2:/lustre-client /mnt/lustre */
1881 static int lmd_parse(char *options, struct lustre_mount_data *lmd)
1882 {
1883         char *s1, *s2, *devname = NULL;
1884         struct lustre_mount_data *raw = (struct lustre_mount_data *)options;
1885         int rc = 0;
1886         ENTRY;
1887
1888         LASSERT(lmd);
1889         if (!options) {
1890                 LCONSOLE_ERROR_MSG(0x162, "Missing mount data: check that "
1891                                    "/sbin/mount.lustre is installed.\n");
1892                 RETURN(-EINVAL);
1893         }
1894
1895         /* Options should be a string - try to detect old lmd data */
1896         if ((raw->lmd_magic & 0xffffff00) == (LMD_MAGIC & 0xffffff00)) {
1897                 LCONSOLE_ERROR_MSG(0x163, "You're using an old version of "
1898                                    "/sbin/mount.lustre.  Please install "
1899                                    "version %s\n", LUSTRE_VERSION_STRING);
1900                 RETURN(-EINVAL);
1901         }
1902         lmd->lmd_magic = LMD_MAGIC;
1903
1904         /* Set default flags here */
1905
1906         s1 = options;
1907         while (*s1) {
1908                 int clear = 0;
1909                 /* Skip whitespace and extra commas */
1910                 while (*s1 == ' ' || *s1 == ',')
1911                         s1++;
1912
1913                 /* Client options are parsed in ll_options: eg. flock,
1914                    user_xattr, acl */
1915
1916                 /* Parse non-ldiskfs options here. Rather than modifying
1917                    ldiskfs, we just zero these out here */
1918                 if (strncmp(s1, "abort_recov", 11) == 0) {
1919                         lmd->lmd_flags |= LMD_FLG_ABORT_RECOV;
1920                         clear++;
1921                 } else if (strncmp(s1, "nosvc", 5) == 0) {
1922                         lmd->lmd_flags |= LMD_FLG_NOSVC;
1923                         clear++;
1924                 } else if (strncmp(s1, "nomgs", 5) == 0) {
1925                         lmd->lmd_flags |= LMD_FLG_NOMGS;
1926                         clear++;
1927                 } else if (strncmp(s1, "mgssec=", 7) == 0) {
1928                         rc = lmd_parse_mgssec(lmd, s1 + 7);
1929                         if (rc)
1930                                 goto invalid;
1931                         clear++;
1932                 /* ost exclusion list */
1933                 } else if (strncmp(s1, "exclude=", 8) == 0) {
1934                         rc = lmd_make_exclusion(lmd, s1 + 7);
1935                         if (rc)
1936                                 goto invalid;
1937                         clear++;
1938                 }
1939                 /* Linux 2.4 doesn't pass the device, so we stuck it at the
1940                    end of the options. */
1941                 else if (strncmp(s1, "device=", 7) == 0) {
1942                         devname = s1 + 7;
1943                         /* terminate options right before device.  device
1944                            must be the last one. */
1945                         *s1 = '\0';
1946                         break;
1947                 }
1948
1949                 /* Find next opt */
1950                 s2 = strchr(s1, ',');
1951                 if (s2 == NULL) {
1952                         if (clear)
1953                                 *s1 = '\0';
1954                         break;
1955                 }
1956                 s2++;
1957                 if (clear)
1958                         memmove(s1, s2, strlen(s2) + 1);
1959                 else
1960                         s1 = s2;
1961         }
1962
1963         if (!devname) {
1964                 LCONSOLE_ERROR_MSG(0x164, "Can't find the device name "
1965                                    "(need mount option 'device=...')\n");
1966                 goto invalid;
1967         }
1968
1969         s1 = strstr(devname, ":/");
1970         if (s1) {
1971                 ++s1;
1972                 lmd->lmd_flags = LMD_FLG_CLIENT;
1973                 /* Remove leading /s from fsname */
1974                 while (*++s1 == '/') ;
1975                 /* Freed in lustre_free_lsi */
1976                 OBD_ALLOC(lmd->lmd_profile, strlen(s1) + 8);
1977                 if (!lmd->lmd_profile)
1978                         RETURN(-ENOMEM);
1979                 sprintf(lmd->lmd_profile, "%s-client", s1);
1980         }
1981
1982         /* Freed in lustre_free_lsi */
1983         OBD_ALLOC(lmd->lmd_dev, strlen(devname) + 1);
1984         if (!lmd->lmd_dev)
1985                 RETURN(-ENOMEM);
1986         strcpy(lmd->lmd_dev, devname);
1987
1988         /* Save mount options */
1989         s1 = options + strlen(options) - 1;
1990         while (s1 >= options && (*s1 == ',' || *s1 == ' '))
1991                 *s1-- = 0;
1992         if (*options != 0) {
1993                 /* Freed in lustre_free_lsi */
1994                 OBD_ALLOC(lmd->lmd_opts, strlen(options) + 1);
1995                 if (!lmd->lmd_opts)
1996                         RETURN(-ENOMEM);
1997                 strcpy(lmd->lmd_opts, options);
1998         }
1999
2000         lmd->lmd_magic = LMD_MAGIC;
2001
2002         RETURN(rc);
2003
2004 invalid:
2005         CERROR("Bad mount options %s\n", options);
2006         RETURN(-EINVAL);
2007 }
2008
2009
2010 /* Common mount */
2011 int lustre_fill_super(struct super_block *sb, void *data, int silent)
2012 {
2013         struct lustre_mount_data *lmd;
2014         struct lustre_sb_info *lsi;
2015         int rc;
2016         ENTRY;
2017
2018         CDEBUG(D_MOUNT|D_VFSTRACE, "VFS Op: sb %p\n", sb);
2019
2020         lsi = lustre_init_lsi(sb);
2021         if (!lsi)
2022                 RETURN(-ENOMEM);
2023         lmd = lsi->lsi_lmd;
2024
2025         /*
2026          * Disable lockdep during mount, because mount locking patterns are
2027          * `special'.
2028          */
2029         lockdep_off();
2030
2031         /* Figure out the lmd from the mount options */
2032         if (lmd_parse((char *)data, lmd)) {
2033                 lustre_put_lsi(sb);
2034                 GOTO(out, rc = -EINVAL);
2035         }
2036
2037         if (lmd_is_client(lmd)) {
2038                 CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
2039                 if (!client_fill_super) {
2040                         LCONSOLE_ERROR_MSG(0x165, "Nothing registered for "
2041                                            "client mount! Is the 'lustre' "
2042                                            "module loaded?\n");
2043                         lustre_put_lsi(sb);
2044                         rc = -ENODEV;
2045                 } else {
2046                         rc = lustre_start_mgc(sb);
2047                         if (rc) {
2048                                 lustre_put_lsi(sb);
2049                                 GOTO(out, rc);
2050                         }
2051                         /* Connect and start */
2052                         /* (should always be ll_fill_super) */
2053                         rc = (*client_fill_super)(sb);
2054                         /* c_f_s will call lustre_common_put_super on failure */
2055                 }
2056         } else {
2057                 CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
2058                 lsi->lsi_flags |= LSI_SERVER;
2059                 rc = server_fill_super(sb);
2060                 /* s_f_s calls lustre_start_mgc after the mount because we need
2061                    the MGS nids which are stored on disk.  Plus, we may
2062                    need to start the MGS first. */
2063                 /* s_f_s will call server_put_super on failure */
2064         }
2065
2066         /* If error happens in fill_super() call, @lsi will be killed there.
2067          * This is why we do not put it here. */
2068         GOTO(out, rc);
2069 out:
2070         if (rc) {
2071                 CERROR("Unable to mount %s (%d)\n",
2072                        s2lsi(sb) ? lmd->lmd_dev : "", rc);
2073         } else {
2074                 CDEBUG(D_SUPER, "Mount %s complete\n",
2075                        lmd->lmd_dev);
2076         }
2077         lockdep_on();
2078         return rc;
2079 }
2080
2081
2082 /* We can't call ll_fill_super by name because it lives in a module that
2083    must be loaded after this one. */
2084 void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb))
2085 {
2086         client_fill_super = cfs;
2087 }
2088
2089 void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb))
2090 {
2091         kill_super_cb = cfs;
2092 }
2093
2094 /***************** FS registration ******************/
2095
2096 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
2097 struct super_block * lustre_get_sb(struct file_system_type *fs_type,
2098                                int flags, const char *devname, void * data)
2099 {
2100         return get_sb_nodev(fs_type, flags, data, lustre_fill_super);
2101 }
2102 #else
2103 int lustre_get_sb(struct file_system_type *fs_type,
2104                                int flags, const char *devname, void * data,
2105                                struct vfsmount *mnt)
2106 {
2107         return get_sb_nodev(fs_type, flags, data, lustre_fill_super, mnt);
2108 }
2109 #endif
2110
2111 void lustre_kill_super(struct super_block *sb)
2112 {
2113         struct lustre_sb_info *lsi = s2lsi(sb);
2114
2115         if (kill_super_cb && lsi && !(lsi->lsi_flags & LSI_SERVER))
2116                 (*kill_super_cb)(sb);
2117
2118         kill_anon_super(sb);
2119 }
2120
2121 struct file_system_type lustre_fs_type = {
2122         .owner        = THIS_MODULE,
2123         .name         = "lustre",
2124         .get_sb       = lustre_get_sb,
2125         .kill_sb      = lustre_kill_super,
2126         .fs_flags     = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV |
2127 #ifdef HAVE_LINUX_FIEMAP_H
2128                         FS_HAS_FIEMAP |
2129 #endif
2130                         LL_RENAME_DOES_D_MOVE,
2131 };
2132
2133 int lustre_register_fs(void)
2134 {
2135         return register_filesystem(&lustre_fs_type);
2136 }
2137
2138 int lustre_unregister_fs(void)
2139 {
2140         return unregister_filesystem(&lustre_fs_type);
2141 }
2142
2143 EXPORT_SYMBOL(lustre_register_client_fill_super);
2144 EXPORT_SYMBOL(lustre_register_kill_super_cb);
2145 EXPORT_SYMBOL(lustre_common_put_super);
2146 EXPORT_SYMBOL(lustre_process_log);
2147 EXPORT_SYMBOL(lustre_end_log);
2148 EXPORT_SYMBOL(server_get_mount);
2149 EXPORT_SYMBOL(server_get_mount_2);
2150 EXPORT_SYMBOL(server_put_mount);
2151 EXPORT_SYMBOL(server_put_mount_2);
2152 EXPORT_SYMBOL(server_register_target);
2153 EXPORT_SYMBOL(server_name2index);
2154 EXPORT_SYMBOL(server_mti_print);
2155 EXPORT_SYMBOL(do_lcfg);