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