Whamcloud - gitweb
LU-1346 libcfs: replace libcfs wrappers with kernel API
[fs/lustre-release.git] / lustre / obdclass / obd_mount.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2011, 2012, Whamcloud, Inc.
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 #ifdef HAVE_KERNEL_LOCKED
59 #include <linux/smp_lock.h>
60 #endif
61
62 static int (*client_fill_super)(struct super_block *sb,
63                                 struct vfsmount *mnt) = NULL;
64 static void (*kill_super_cb)(struct super_block *sb) = NULL;
65
66 /*********** mount lookup *********/
67
68 DEFINE_MUTEX(lustre_mount_info_lock);
69 static CFS_LIST_HEAD(server_mount_info_list);
70
71 static struct lustre_mount_info *server_find_mount(const char *name)
72 {
73         cfs_list_t *tmp;
74         struct lustre_mount_info *lmi;
75         ENTRY;
76
77         cfs_list_for_each(tmp, &server_mount_info_list) {
78                 lmi = cfs_list_entry(tmp, struct lustre_mount_info,
79                                      lmi_list_chain);
80                 if (strcmp(name, lmi->lmi_name) == 0)
81                         RETURN(lmi);
82         }
83         RETURN(NULL);
84 }
85
86 /* we must register an obd for a mount before we call the setup routine.
87    *_setup will call lustre_get_mount to get the mnt struct
88    by obd_name, since we can't pass the pointer to setup. */
89 static int server_register_mount(const char *name, struct super_block *sb,
90                           struct vfsmount *mnt)
91 {
92         struct lustre_mount_info *lmi;
93         char *name_cp;
94         ENTRY;
95
96         LASSERT(sb);
97
98         OBD_ALLOC(lmi, sizeof(*lmi));
99         if (!lmi)
100                 RETURN(-ENOMEM);
101         OBD_ALLOC(name_cp, strlen(name) + 1);
102         if (!name_cp) {
103                 OBD_FREE(lmi, sizeof(*lmi));
104                 RETURN(-ENOMEM);
105         }
106         strcpy(name_cp, name);
107
108         mutex_lock(&lustre_mount_info_lock);
109
110         if (server_find_mount(name)) {
111                 mutex_unlock(&lustre_mount_info_lock);
112                 OBD_FREE(lmi, sizeof(*lmi));
113                 OBD_FREE(name_cp, strlen(name) + 1);
114                 CERROR("Already registered %s\n", name);
115                 RETURN(-EEXIST);
116         }
117         lmi->lmi_name = name_cp;
118         lmi->lmi_sb = sb;
119         lmi->lmi_mnt = mnt;
120         cfs_list_add(&lmi->lmi_list_chain, &server_mount_info_list);
121
122         mutex_unlock(&lustre_mount_info_lock);
123
124         CDEBUG(D_MOUNT, "reg_mnt %p from %s\n", lmi->lmi_mnt, name);
125
126         RETURN(0);
127 }
128
129 /* when an obd no longer needs a mount */
130 static int server_deregister_mount(const char *name)
131 {
132         struct lustre_mount_info *lmi;
133         ENTRY;
134
135         mutex_lock(&lustre_mount_info_lock);
136         lmi = server_find_mount(name);
137         if (!lmi) {
138                 mutex_unlock(&lustre_mount_info_lock);
139                 CERROR("%s not registered\n", name);
140                 RETURN(-ENOENT);
141         }
142
143         CDEBUG(D_MOUNT, "dereg_mnt %p from %s\n", lmi->lmi_mnt, name);
144
145         OBD_FREE(lmi->lmi_name, strlen(lmi->lmi_name) + 1);
146         cfs_list_del(&lmi->lmi_list_chain);
147         OBD_FREE(lmi, sizeof(*lmi));
148         mutex_unlock(&lustre_mount_info_lock);
149
150         RETURN(0);
151 }
152
153 /* obd's look up a registered mount using their obdname. This is just
154    for initial obd setup to find the mount struct.  It should not be
155    called every time you want to mntget. */
156 struct lustre_mount_info *server_get_mount(const char *name)
157 {
158         struct lustre_mount_info *lmi;
159         struct lustre_sb_info *lsi;
160         ENTRY;
161
162         mutex_lock(&lustre_mount_info_lock);
163         lmi = server_find_mount(name);
164         mutex_unlock(&lustre_mount_info_lock);
165         if (!lmi) {
166                 CERROR("Can't find mount for %s\n", name);
167                 RETURN(NULL);
168         }
169         lsi = s2lsi(lmi->lmi_sb);
170
171         cfs_atomic_inc(&lsi->lsi_mounts);
172
173         CDEBUG(D_MOUNT, "get_mnt %p from %s, refs=%d\n", lmi->lmi_mnt,
174                name, cfs_atomic_read(&lsi->lsi_mounts));
175
176         RETURN(lmi);
177 }
178 EXPORT_SYMBOL(server_get_mount);
179
180 /*
181  * Used by mdt to get mount_info from obdname.
182  * There are no blocking when using the mount_info.
183  * Do not use server_get_mount for this purpose.
184  */
185 struct lustre_mount_info *server_get_mount_2(const char *name)
186 {
187         struct lustre_mount_info *lmi;
188         ENTRY;
189
190         mutex_lock(&lustre_mount_info_lock);
191         lmi = server_find_mount(name);
192         mutex_unlock(&lustre_mount_info_lock);
193         if (!lmi)
194                 CERROR("Can't find mount for %s\n", name);
195
196         RETURN(lmi);
197 }
198 EXPORT_SYMBOL(server_get_mount_2);
199
200 static int lustre_put_lsi(struct super_block *sb);
201
202 /* to be called from obd_cleanup methods */
203 int server_put_mount(const char *name, struct vfsmount *mnt)
204 {
205         struct lustre_mount_info *lmi;
206         struct lustre_sb_info *lsi;
207         ENTRY;
208
209         mutex_lock(&lustre_mount_info_lock);
210         lmi = server_find_mount(name);
211         mutex_unlock(&lustre_mount_info_lock);
212         if (!lmi) {
213                 CERROR("Can't find mount for %s\n", name);
214                 RETURN(-ENOENT);
215         }
216         lsi = s2lsi(lmi->lmi_sb);
217
218         CDEBUG(D_MOUNT, "put_mnt %p from %s, refs=%d\n",
219                lmi->lmi_mnt, name, cfs_atomic_read(&lsi->lsi_mounts));
220
221         if (lustre_put_lsi(lmi->lmi_sb))
222                 CDEBUG(D_MOUNT, "Last put of mnt %p from %s\n",
223                        lmi->lmi_mnt, name);
224
225         /* this obd should never need the mount again */
226         server_deregister_mount(name);
227
228         RETURN(0);
229 }
230 EXPORT_SYMBOL(server_put_mount);
231
232 /* Corresponding to server_get_mount_2 */
233 int server_put_mount_2(const char *name, struct vfsmount *mnt)
234 {
235         ENTRY;
236         RETURN(0);
237 }
238 EXPORT_SYMBOL(server_put_mount_2);
239
240 /**************** config llog ********************/
241
242 /** Get a config log from the MGS and process it.
243  * This func is called for both clients and servers.
244  * Continue to process new statements appended to the logs
245  * (whenever the config lock is revoked) until lustre_end_log
246  * is called.
247  * @param sb The superblock is used by the MGC to write to the local copy of
248  *   the config log
249  * @param logname The name of the llog to replicate from the MGS
250  * @param cfg Since the same mgc may be used to follow multiple config logs
251  *   (e.g. ost1, ost2, client), the config_llog_instance keeps the state for
252  *   this log, and is added to the mgc's list of logs to follow.
253  */
254 int lustre_process_log(struct super_block *sb, char *logname,
255                      struct config_llog_instance *cfg)
256 {
257         struct lustre_cfg *lcfg;
258         struct lustre_cfg_bufs *bufs;
259         struct lustre_sb_info *lsi = s2lsi(sb);
260         struct obd_device *mgc = lsi->lsi_mgc;
261         int rc;
262         ENTRY;
263
264         LASSERT(mgc);
265         LASSERT(cfg);
266
267         OBD_ALLOC_PTR(bufs);
268         if (bufs == NULL)
269                 RETURN(-ENOMEM);
270
271         /* mgc_process_config */
272         lustre_cfg_bufs_reset(bufs, mgc->obd_name);
273         lustre_cfg_bufs_set_string(bufs, 1, logname);
274         lustre_cfg_bufs_set(bufs, 2, cfg, sizeof(*cfg));
275         lustre_cfg_bufs_set(bufs, 3, &sb, sizeof(sb));
276         lcfg = lustre_cfg_new(LCFG_LOG_START, bufs);
277         rc = obd_process_config(mgc, sizeof(*lcfg), lcfg);
278         lustre_cfg_free(lcfg);
279
280         OBD_FREE_PTR(bufs);
281
282         if (rc == -EINVAL)
283                 LCONSOLE_ERROR_MSG(0x15b, "%s: The configuration from log '%s'"
284                                    "failed from the MGS (%d).  Make sure this "
285                                    "client and the MGS are running compatible "
286                                    "versions of Lustre.\n",
287                                    mgc->obd_name, logname, rc);
288
289         if (rc)
290                 LCONSOLE_ERROR_MSG(0x15c, "%s: The configuration from log '%s' "
291                                    "failed (%d). This may be the result of "
292                                    "communication errors between this node and "
293                                    "the MGS, a bad configuration, or other "
294                                    "errors. See the syslog for more "
295                                    "information.\n", mgc->obd_name, logname,
296                                    rc);
297
298         /* class_obd_list(); */
299         RETURN(rc);
300 }
301 EXPORT_SYMBOL(lustre_process_log);
302
303 /* Stop watching this config log for updates */
304 int lustre_end_log(struct super_block *sb, char *logname,
305                        struct config_llog_instance *cfg)
306 {
307         struct lustre_cfg *lcfg;
308         struct lustre_cfg_bufs bufs;
309         struct lustre_sb_info *lsi = s2lsi(sb);
310         struct obd_device *mgc = lsi->lsi_mgc;
311         int rc;
312         ENTRY;
313
314         if (!mgc)
315                 RETURN(-ENOENT);
316
317         /* mgc_process_config */
318         lustre_cfg_bufs_reset(&bufs, mgc->obd_name);
319         lustre_cfg_bufs_set_string(&bufs, 1, logname);
320         if (cfg)
321                 lustre_cfg_bufs_set(&bufs, 2, cfg, sizeof(*cfg));
322         lcfg = lustre_cfg_new(LCFG_LOG_END, &bufs);
323         rc = obd_process_config(mgc, sizeof(*lcfg), lcfg);
324         lustre_cfg_free(lcfg);
325         RETURN(rc);
326 }
327 EXPORT_SYMBOL(lustre_end_log);
328
329 /**************** obd start *******************/
330
331 /** lustre_cfg_bufs are a holdover from 1.4; we can still set these up from
332  * lctl (and do for echo cli/srv.
333  */
334 int do_lcfg(char *cfgname, lnet_nid_t nid, int cmd,
335             char *s1, char *s2, char *s3, char *s4)
336 {
337         struct lustre_cfg_bufs bufs;
338         struct lustre_cfg    * lcfg = NULL;
339         int rc;
340
341         CDEBUG(D_TRACE, "lcfg %s %#x %s %s %s %s\n", cfgname,
342                cmd, s1, s2, s3, s4);
343
344         lustre_cfg_bufs_reset(&bufs, cfgname);
345         if (s1)
346                 lustre_cfg_bufs_set_string(&bufs, 1, s1);
347         if (s2)
348                 lustre_cfg_bufs_set_string(&bufs, 2, s2);
349         if (s3)
350                 lustre_cfg_bufs_set_string(&bufs, 3, s3);
351         if (s4)
352                 lustre_cfg_bufs_set_string(&bufs, 4, s4);
353
354         lcfg = lustre_cfg_new(cmd, &bufs);
355         lcfg->lcfg_nid = nid;
356         rc = class_process_config(lcfg);
357         lustre_cfg_free(lcfg);
358         return(rc);
359 }
360 EXPORT_SYMBOL(do_lcfg);
361
362 /** Call class_attach and class_setup.  These methods in turn call
363  * obd type-specific methods.
364  */
365 static int lustre_start_simple(char *obdname, char *type, char *uuid,
366                                char *s1, char *s2, char *s3, char *s4)
367 {
368         int rc;
369         CDEBUG(D_MOUNT, "Starting obd %s (typ=%s)\n", obdname, type);
370
371         rc = do_lcfg(obdname, 0, LCFG_ATTACH, type, uuid, 0, 0);
372         if (rc) {
373                 CERROR("%s attach error %d\n", obdname, rc);
374                 return(rc);
375         }
376         rc = do_lcfg(obdname, 0, LCFG_SETUP, s1, s2, s3, s4);
377         if (rc) {
378                 CERROR("%s setup error %d\n", obdname, rc);
379                 do_lcfg(obdname, 0, LCFG_DETACH, 0, 0, 0, 0);
380         }
381         return rc;
382 }
383
384 /* Set up a MGS to serve startup logs */
385 static int server_start_mgs(struct super_block *sb)
386 {
387         struct lustre_sb_info    *lsi = s2lsi(sb);
388         struct vfsmount          *mnt = lsi->lsi_srv_mnt;
389         struct lustre_mount_info *lmi;
390         int    rc = 0;
391         ENTRY;
392
393         /* It is impossible to have more than 1 MGS per node, since
394            MGC wouldn't know which to connect to */
395         lmi = server_find_mount(LUSTRE_MGS_OBDNAME);
396         if (lmi) {
397                 lsi = s2lsi(lmi->lmi_sb);
398                 LCONSOLE_ERROR_MSG(0x15d, "The MGS service was already started"
399                                    " from server\n");
400                 RETURN(-EALREADY);
401         }
402
403         CDEBUG(D_CONFIG, "Start MGS service %s\n", LUSTRE_MGS_OBDNAME);
404
405         rc = server_register_mount(LUSTRE_MGS_OBDNAME, sb, mnt);
406
407         if (!rc) {
408                 rc = lustre_start_simple(LUSTRE_MGS_OBDNAME, LUSTRE_MGS_NAME,
409                                          LUSTRE_MGS_OBDNAME, 0, 0,
410                                          lsi->lsi_osd_obdname, 0);
411                 /* Do NOT call server_deregister_mount() here. This leads to
412                  * inability cleanup cleanly and free lsi and other stuff when
413                  * mgs calls server_put_mount() in error handling case. -umka */
414         }
415
416         if (rc)
417                 LCONSOLE_ERROR_MSG(0x15e, "Failed to start MGS '%s' (%d). "
418                                    "Is the 'mgs' module loaded?\n",
419                                    LUSTRE_MGS_OBDNAME, rc);
420         RETURN(rc);
421 }
422
423 static int server_stop_mgs(struct super_block *sb)
424 {
425         struct obd_device *obd;
426         int rc;
427         ENTRY;
428
429         CDEBUG(D_MOUNT, "Stop MGS service %s\n", LUSTRE_MGS_OBDNAME);
430
431         /* There better be only one MGS */
432         obd = class_name2obd(LUSTRE_MGS_OBDNAME);
433         if (!obd) {
434                 CDEBUG(D_CONFIG, "mgs %s not running\n", LUSTRE_MGS_OBDNAME);
435                 RETURN(-EALREADY);
436         }
437
438         /* The MGS should always stop when we say so */
439         obd->obd_force = 1;
440         rc = class_manual_cleanup(obd);
441         RETURN(rc);
442 }
443
444 DEFINE_MUTEX(mgc_start_lock);
445
446 /** Set up a mgc obd to process startup logs
447  *
448  * \param sb [in] super block of the mgc obd
449  *
450  * \retval 0 success, otherwise error code
451  */
452 static int lustre_start_mgc(struct super_block *sb)
453 {
454         struct obd_connect_data *data = NULL;
455         struct lustre_sb_info *lsi = s2lsi(sb);
456         struct obd_device *obd;
457         struct obd_export *exp;
458         struct obd_uuid *uuid;
459         class_uuid_t uuidc;
460         lnet_nid_t nid;
461         char *mgcname = NULL, *niduuid = NULL, *mgssec = NULL;
462         char *ptr;
463         int recov_bk;
464         int rc = 0, i = 0, j, len;
465         ENTRY;
466
467         LASSERT(lsi->lsi_lmd);
468
469         /* Find the first non-lo MGS nid for our MGC name */
470         if (IS_SERVER(lsi)) {
471                 /* mount -o mgsnode=nid */
472                 ptr = lsi->lsi_lmd->lmd_mgs;
473                 if (lsi->lsi_lmd->lmd_mgs &&
474                     (class_parse_nid(lsi->lsi_lmd->lmd_mgs, &nid, &ptr) == 0)) {
475                         i++;
476                 } else if (IS_MGS(lsi)) {
477                         lnet_process_id_t id;
478                         while ((rc = LNetGetId(i++, &id)) != -ENOENT) {
479                                 if (LNET_NETTYP(LNET_NIDNET(id.nid)) == LOLND)
480                                         continue;
481                                 nid = id.nid;
482                                 i++;
483                                 break;
484                         }
485                 }
486         } else { /* client */
487                 /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */
488                 ptr = lsi->lsi_lmd->lmd_dev;
489                 if (class_parse_nid(ptr, &nid, &ptr) == 0)
490                         i++;
491         }
492         if (i == 0) {
493                 CERROR("No valid MGS nids found.\n");
494                 RETURN(-EINVAL);
495         }
496
497         mutex_lock(&mgc_start_lock);
498
499         len = strlen(LUSTRE_MGC_OBDNAME) + strlen(libcfs_nid2str(nid)) + 1;
500         OBD_ALLOC(mgcname, len);
501         OBD_ALLOC(niduuid, len + 2);
502         if (!mgcname || !niduuid)
503                 GOTO(out_free, rc = -ENOMEM);
504         sprintf(mgcname, "%s%s", LUSTRE_MGC_OBDNAME, libcfs_nid2str(nid));
505
506         mgssec = lsi->lsi_lmd->lmd_mgssec ? lsi->lsi_lmd->lmd_mgssec : "";
507
508         OBD_ALLOC_PTR(data);
509         if (data == NULL)
510                 GOTO(out_free, rc = -ENOMEM);
511
512         obd = class_name2obd(mgcname);
513         if (obd && !obd->obd_stopping) {
514                 rc = obd_set_info_async(NULL, obd->obd_self_export,
515                                         strlen(KEY_MGSSEC), KEY_MGSSEC,
516                                         strlen(mgssec), mgssec, NULL);
517                 if (rc)
518                         GOTO(out_free, rc);
519
520                 /* Re-using an existing MGC */
521                 cfs_atomic_inc(&obd->u.cli.cl_mgc_refcount);
522
523                 /* IR compatibility check, only for clients */
524                 if (lmd_is_client(lsi->lsi_lmd)) {
525                         int has_ir;
526                         int vallen = sizeof(*data);
527                         __u32 *flags = &lsi->lsi_lmd->lmd_flags;
528
529                         rc = obd_get_info(NULL, obd->obd_self_export,
530                                           strlen(KEY_CONN_DATA), KEY_CONN_DATA,
531                                           &vallen, data, NULL);
532                         LASSERT(rc == 0);
533                         has_ir = OCD_HAS_FLAG(data, IMP_RECOV);
534                         if (has_ir ^ !(*flags & LMD_FLG_NOIR)) {
535                                 /* LMD_FLG_NOIR is for test purpose only */
536                                 LCONSOLE_WARN(
537                                     "Trying to mount a client with IR setting "
538                                     "not compatible with current mgc. "
539                                     "Force to use current mgc setting that is "
540                                     "IR %s.\n",
541                                     has_ir ? "enabled" : "disabled");
542                                 if (has_ir)
543                                         *flags &= ~LMD_FLG_NOIR;
544                                 else
545                                         *flags |= LMD_FLG_NOIR;
546                         }
547                 }
548
549                 recov_bk = 0;
550                 /* If we are restarting the MGS, don't try to keep the MGC's
551                    old connection, or registration will fail. */
552                 if (IS_MGS(lsi)) {
553                         CDEBUG(D_MOUNT, "New MGS with live MGC\n");
554                         recov_bk = 1;
555                 }
556
557                 /* Try all connections, but only once (again).
558                    We don't want to block another target from starting
559                    (using its local copy of the log), but we do want to connect
560                    if at all possible. */
561                 recov_bk++;
562                 CDEBUG(D_MOUNT, "%s: Set MGC reconnect %d\n", mgcname,recov_bk);
563                 rc = obd_set_info_async(NULL, obd->obd_self_export,
564                                         sizeof(KEY_INIT_RECOV_BACKUP),
565                                         KEY_INIT_RECOV_BACKUP,
566                                         sizeof(recov_bk), &recov_bk, NULL);
567                 GOTO(out, rc = 0);
568         }
569
570         CDEBUG(D_MOUNT, "Start MGC '%s'\n", mgcname);
571
572         /* Add the primary nids for the MGS */
573         i = 0;
574         sprintf(niduuid, "%s_%x", mgcname, i);
575         if (IS_SERVER(lsi)) {
576                 ptr = lsi->lsi_lmd->lmd_mgs;
577                 if (IS_MGS(lsi)) {
578                         /* Use local nids (including LO) */
579                         lnet_process_id_t id;
580                         while ((rc = LNetGetId(i++, &id)) != -ENOENT) {
581                                 rc = do_lcfg(mgcname, id.nid,
582                                              LCFG_ADD_UUID, niduuid, 0,0,0);
583                         }
584                 } else {
585                         /* Use mgsnode= nids */
586                         /* mount -o mgsnode=nid */
587                         if (lsi->lsi_lmd->lmd_mgs) {
588                                 ptr = lsi->lsi_lmd->lmd_mgs;
589                         } else if (class_find_param(ptr, PARAM_MGSNODE,
590                                                     &ptr) != 0) {
591                                 CERROR("No MGS nids given.\n");
592                                 GOTO(out_free, rc = -EINVAL);
593                         }
594                         while (class_parse_nid(ptr, &nid, &ptr) == 0) {
595                                 rc = do_lcfg(mgcname, nid,
596                                              LCFG_ADD_UUID, niduuid, 0,0,0);
597                                 i++;
598                         }
599                 }
600         } else { /* client */
601                 /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */
602                 ptr = lsi->lsi_lmd->lmd_dev;
603                 while (class_parse_nid(ptr, &nid, &ptr) == 0) {
604                         rc = do_lcfg(mgcname, nid,
605                                      LCFG_ADD_UUID, niduuid, 0,0,0);
606                         i++;
607                         /* Stop at the first failover nid */
608                         if (*ptr == ':')
609                                 break;
610                 }
611         }
612         if (i == 0) {
613                 CERROR("No valid MGS nids found.\n");
614                 GOTO(out_free, rc = -EINVAL);
615         }
616         lsi->lsi_lmd->lmd_mgs_failnodes = 1;
617
618         /* Random uuid for MGC allows easier reconnects */
619         OBD_ALLOC_PTR(uuid);
620         ll_generate_random_uuid(uuidc);
621         class_uuid_unparse(uuidc, uuid);
622
623         /* Start the MGC */
624         rc = lustre_start_simple(mgcname, LUSTRE_MGC_NAME,
625                                  (char *)uuid->uuid, LUSTRE_MGS_OBDNAME,
626                                  niduuid, 0, 0);
627         OBD_FREE_PTR(uuid);
628         if (rc)
629                 GOTO(out_free, rc);
630
631         /* Add any failover MGS nids */
632         i = 1;
633         while (ptr && ((*ptr == ':' ||
634                class_find_param(ptr, PARAM_MGSNODE, &ptr) == 0))) {
635                 /* New failover node */
636                 sprintf(niduuid, "%s_%x", mgcname, i);
637                 j = 0;
638                 while (class_parse_nid_quiet(ptr, &nid, &ptr) == 0) {
639                         j++;
640                         rc = do_lcfg(mgcname, nid,
641                                      LCFG_ADD_UUID, niduuid, 0,0,0);
642                         if (*ptr == ':')
643                                 break;
644                 }
645                 if (j > 0) {
646                         rc = do_lcfg(mgcname, 0, LCFG_ADD_CONN,
647                                      niduuid, 0, 0, 0);
648                         i++;
649                 } else {
650                         /* at ":/fsname" */
651                         break;
652                 }
653         }
654         lsi->lsi_lmd->lmd_mgs_failnodes = i;
655
656         obd = class_name2obd(mgcname);
657         if (!obd) {
658                 CERROR("Can't find mgcobd %s\n", mgcname);
659                 GOTO(out_free, rc = -ENOTCONN);
660         }
661
662         rc = obd_set_info_async(NULL, obd->obd_self_export,
663                                 strlen(KEY_MGSSEC), KEY_MGSSEC,
664                                 strlen(mgssec), mgssec, NULL);
665         if (rc)
666                 GOTO(out_free, rc);
667
668         /* Keep a refcount of servers/clients who started with "mount",
669            so we know when we can get rid of the mgc. */
670         cfs_atomic_set(&obd->u.cli.cl_mgc_refcount, 1);
671
672         /* Try all connections, but only once. */
673         recov_bk = 1;
674         rc = obd_set_info_async(NULL, obd->obd_self_export,
675                                 sizeof(KEY_INIT_RECOV_BACKUP),
676                                 KEY_INIT_RECOV_BACKUP,
677                                 sizeof(recov_bk), &recov_bk, NULL);
678         if (rc)
679                 /* nonfatal */
680                 CWARN("can't set %s %d\n", KEY_INIT_RECOV_BACKUP, rc);
681
682         /* We connect to the MGS at setup, and don't disconnect until cleanup */
683         data->ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_AT |
684                                   OBD_CONNECT_FULL20 | OBD_CONNECT_IMP_RECOV;
685
686 #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 2, 50, 0)
687         data->ocd_connect_flags |= OBD_CONNECT_MNE_SWAB;
688 #else
689 #warning "LU-1644: Remove old OBD_CONNECT_MNE_SWAB fixup and imp_need_mne_swab"
690 #endif
691
692         if (lmd_is_client(lsi->lsi_lmd) &&
693             lsi->lsi_lmd->lmd_flags & LMD_FLG_NOIR)
694                 data->ocd_connect_flags &= ~OBD_CONNECT_IMP_RECOV;
695         data->ocd_version = LUSTRE_VERSION_CODE;
696         rc = obd_connect(NULL, &exp, obd, &(obd->obd_uuid), data, NULL);
697         if (rc) {
698                 CERROR("connect failed %d\n", rc);
699                 GOTO(out, rc);
700         }
701
702         obd->u.cli.cl_mgc_mgsexp = exp;
703
704 out:
705         /* Keep the mgc info in the sb. Note that many lsi's can point
706            to the same mgc.*/
707         lsi->lsi_mgc = obd;
708 out_free:
709         mutex_unlock(&mgc_start_lock);
710
711         if (data)
712                 OBD_FREE_PTR(data);
713         if (mgcname)
714                 OBD_FREE(mgcname, len);
715         if (niduuid)
716                 OBD_FREE(niduuid, len + 2);
717         RETURN(rc);
718 }
719
720 static int lustre_stop_mgc(struct super_block *sb)
721 {
722         struct lustre_sb_info *lsi = s2lsi(sb);
723         struct obd_device *obd;
724         char *niduuid = 0, *ptr = 0;
725         int i, rc = 0, len = 0;
726         ENTRY;
727
728         if (!lsi)
729                 RETURN(-ENOENT);
730         obd = lsi->lsi_mgc;
731         if (!obd)
732                 RETURN(-ENOENT);
733         lsi->lsi_mgc = NULL;
734
735         mutex_lock(&mgc_start_lock);
736         LASSERT(cfs_atomic_read(&obd->u.cli.cl_mgc_refcount) > 0);
737         if (!cfs_atomic_dec_and_test(&obd->u.cli.cl_mgc_refcount)) {
738                 /* This is not fatal, every client that stops
739                    will call in here. */
740                 CDEBUG(D_MOUNT, "mgc still has %d references.\n",
741                        cfs_atomic_read(&obd->u.cli.cl_mgc_refcount));
742                 GOTO(out, rc = -EBUSY);
743         }
744
745         /* The MGC has no recoverable data in any case.
746          * force shotdown set in umount_begin */
747         obd->obd_no_recov = 1;
748
749         if (obd->u.cli.cl_mgc_mgsexp) {
750                 /* An error is not fatal, if we are unable to send the
751                    disconnect mgs ping evictor cleans up the export */
752                 rc = obd_disconnect(obd->u.cli.cl_mgc_mgsexp);
753                 if (rc)
754                         CDEBUG(D_MOUNT, "disconnect failed %d\n", rc);
755         }
756
757         /* Save the obdname for cleaning the nid uuids, which are
758            obdname_XX */
759         len = strlen(obd->obd_name) + 6;
760         OBD_ALLOC(niduuid, len);
761         if (niduuid) {
762                 strcpy(niduuid, obd->obd_name);
763                 ptr = niduuid + strlen(niduuid);
764         }
765
766         rc = class_manual_cleanup(obd);
767         if (rc)
768                 GOTO(out, rc);
769
770         /* Clean the nid uuids */
771         if (!niduuid)
772                 GOTO(out, rc = -ENOMEM);
773
774         for (i = 0; i < lsi->lsi_lmd->lmd_mgs_failnodes; i++) {
775                 sprintf(ptr, "_%x", i);
776                 rc = do_lcfg(LUSTRE_MGC_OBDNAME, 0, LCFG_DEL_UUID,
777                              niduuid, 0, 0, 0);
778                 if (rc)
779                         CERROR("del MDC UUID %s failed: rc = %d\n",
780                                niduuid, rc);
781         }
782 out:
783         if (niduuid)
784                 OBD_FREE(niduuid, len);
785
786         /* class_import_put will get rid of the additional connections */
787         mutex_unlock(&mgc_start_lock);
788         RETURN(rc);
789 }
790
791 /* Since there's only one mgc per node, we have to change it's fs to get
792    access to the right disk. */
793 static int server_mgc_set_fs(struct obd_device *mgc, struct super_block *sb)
794 {
795         struct lustre_sb_info *lsi = s2lsi(sb);
796         int rc;
797         ENTRY;
798
799         CDEBUG(D_MOUNT, "Set mgc disk for %s\n", lsi->lsi_lmd->lmd_dev);
800
801         /* cl_mgc_sem in mgc insures we sleep if the mgc_fs is busy */
802         rc = obd_set_info_async(NULL, mgc->obd_self_export,
803                                 sizeof(KEY_SET_FS), KEY_SET_FS,
804                                 sizeof(*sb), sb, NULL);
805         if (rc) {
806                 CERROR("can't set_fs %d\n", rc);
807         }
808
809         RETURN(rc);
810 }
811
812 static int server_mgc_clear_fs(struct obd_device *mgc)
813 {
814         int rc;
815         ENTRY;
816
817         CDEBUG(D_MOUNT, "Unassign mgc disk\n");
818
819         rc = obd_set_info_async(NULL, mgc->obd_self_export,
820                                 sizeof(KEY_CLEAR_FS), KEY_CLEAR_FS,
821                                 0, NULL, NULL);
822         RETURN(rc);
823 }
824
825 /** Get the fsname ("lustre") from the server name ("lustre-OST003F").
826  * @param [in] svname server name including type and index
827  * @param [out] fsname Buffer to copy filesystem name prefix into.
828  *  Must have at least 'strlen(fsname) + 1' chars.
829  * @param [out] endptr if endptr isn't NULL it is set to end of fsname
830  * rc < 0  on error
831  */
832 int server_name2fsname(char *svname, char *fsname, char **endptr)
833 {
834         char *dash = strrchr(svname, '-');
835         if (!dash) {
836                 dash = strrchr(svname, ':');
837                 if (!dash)
838                         return -EINVAL;
839         }
840
841         /* interpret <fsname>-MDTXXXXX-mdc as mdt, the better way is to pass
842          * in the fsname, then determine the server index */
843         if (!strcmp(LUSTRE_MDC_NAME, dash + 1)) {
844                 dash--;
845                 for (; dash > svname && *dash != '-' && *dash != ':'; dash--)
846                         ;
847                 if (dash == svname)
848                         return -EINVAL;
849         }
850
851         if (fsname != NULL) {
852                 strncpy(fsname, svname, dash - svname);
853                 fsname[dash - svname] = '\0';
854         }
855
856         if (endptr != NULL)
857                 *endptr = dash;
858
859         return 0;
860 }
861 EXPORT_SYMBOL(server_name2fsname);
862
863 static int is_mdc_device(char *devname)
864 {
865         char *ptr;
866         ptr = strrchr(devname, '-');
867         if (ptr != NULL && strcmp(ptr, "-mdc") == 0)
868                 return 1;
869         return 0;
870 }
871
872 static int inline tgt_is_mdt0(char *tgtname)
873 {
874         __u32 idx;
875         int   type;
876
877         type = server_name2index(tgtname, &idx, NULL);
878         if (type != LDD_F_SV_TYPE_MDT)
879                 return 0;
880
881         return (idx == 0) ? 1 :0;
882 }
883
884 static int inline is_mdc_for_mdt0(char *devname)
885 {
886         char   *ptr;
887
888         if (!is_mdc_device(devname))
889                 return 0;
890
891         ptr = strrchr(devname, '-');
892         if (ptr == NULL)
893                 return 0;
894
895         *ptr = 0;
896         if (tgt_is_mdt0(devname)) {
897                 *ptr = '-';
898                 return 1;
899         }
900         *ptr = '-';
901         return 0;
902 }
903
904 /**
905  * Convert OST/MDT name(fsname-OSTxxxx) to an osp name
906  * (fsname-MDT0000-osp-OSTxxxx), which will be used to
907  * communicate with MDT0 for this target.
908  **/
909 int tgt_name2ospname(char *svname, char *ospname)
910 {
911         char *fsname;
912         char *tgt;
913         int   rc;
914         ENTRY;
915
916         OBD_ALLOC(fsname, MTI_NAME_MAXLEN);
917         if (fsname == NULL)
918                 RETURN(-ENOMEM);
919
920         rc = server_name2fsname(svname, fsname, &tgt);
921         if (rc != 0) {
922                 CERROR("%s change fsname error: rc %d\n", svname, rc);
923                 GOTO(cleanup, rc);
924         }
925
926         if (*tgt != '-' && *tgt != ':') {
927                 CERROR("%s wrong svname name!\n", svname);
928                 GOTO(cleanup, rc = -EINVAL);
929         }
930
931         tgt++;
932         if (strncmp(tgt, "OST", 3) != 0 && strncmp(tgt, "MDT", 3) != 0) {
933                 CERROR("%s is not an OST or MDT target!\n", svname);
934                 GOTO(cleanup, rc = -EINVAL);
935         }
936         sprintf(ospname, "%s-MDT0000-%s-%s", fsname, LUSTRE_OSP_NAME, tgt);
937 cleanup:
938         if (fsname != NULL)
939                 OBD_FREE(fsname, MTI_NAME_MAXLEN);
940         RETURN(rc);
941 }
942 EXPORT_SYMBOL(tgt_name2ospname);
943
944 static CFS_LIST_HEAD(osp_register_list);
945 DEFINE_MUTEX(osp_register_list_lock);
946
947 int lustre_register_osp_item(char *ospname, struct obd_export **exp,
948                              register_osp_cb cb_func, void *cb_data)
949 {
950         struct obd_device        *osp;
951         struct osp_register_item *ori;
952         ENTRY;
953
954         LASSERTF(strlen(ospname) < MTI_NAME_MAXLEN, "ospname is too long %s\n",
955                  ospname);
956         LASSERT(exp != NULL && *exp == NULL);
957
958         OBD_ALLOC_PTR(ori);
959         if (ori == NULL)
960                 RETURN(-ENOMEM);
961
962         mutex_lock(&osp_register_list_lock);
963
964         osp = class_name2obd(ospname);
965         if (osp != NULL && osp->obd_set_up == 1) {
966                 struct obd_uuid *uuid;
967
968                 OBD_ALLOC_PTR(uuid);
969                 if (uuid == NULL) {
970                         mutex_unlock(&osp_register_list_lock);
971                         RETURN(-ENOMEM);
972                 }
973                 memcpy(uuid->uuid, ospname, strlen(ospname));
974                 *exp = cfs_hash_lookup(osp->obd_uuid_hash, uuid);
975                 OBD_FREE_PTR(uuid);
976         }
977
978         memcpy(ori->ori_name, ospname, strlen(ospname));
979         ori->ori_exp = exp;
980         ori->ori_cb_func = cb_func;
981         ori->ori_cb_data = cb_data;
982         CFS_INIT_LIST_HEAD(&ori->ori_list);
983         cfs_list_add(&ori->ori_list, &osp_register_list);
984
985         if (*exp != NULL && cb_func != NULL)
986                 cb_func(cb_data);
987
988         mutex_unlock(&osp_register_list_lock);
989         RETURN(0);
990 }
991 EXPORT_SYMBOL(lustre_register_osp_item);
992
993 void lustre_deregister_osp_item(struct obd_export **exp)
994 {
995         struct osp_register_item *ori, *tmp;
996
997         mutex_lock(&osp_register_list_lock);
998         cfs_list_for_each_entry_safe(ori, tmp, &osp_register_list, ori_list) {
999                 if (exp == ori->ori_exp) {
1000                         if (*exp)
1001                                 class_export_put(*exp);
1002                         cfs_list_del(&ori->ori_list);
1003                         OBD_FREE_PTR(ori);
1004                         break;
1005                 }
1006         }
1007         mutex_unlock(&osp_register_list_lock);
1008 }
1009 EXPORT_SYMBOL(lustre_deregister_osp_item);
1010
1011 static void lustre_notify_osp_list(struct obd_export *exp)
1012 {
1013         struct osp_register_item *ori, *tmp;
1014         LASSERT(exp != NULL);
1015
1016         mutex_lock(&osp_register_list_lock);
1017         cfs_list_for_each_entry_safe(ori, tmp, &osp_register_list, ori_list) {
1018                 if (strcmp(exp->exp_obd->obd_name, ori->ori_name))
1019                         continue;
1020                 if (*ori->ori_exp != NULL)
1021                         continue;
1022                 *ori->ori_exp = class_export_get(exp);
1023                 if (ori->ori_cb_func != NULL)
1024                         ori->ori_cb_func(ori->ori_cb_data);
1025         }
1026         mutex_unlock(&osp_register_list_lock);
1027 }
1028
1029 static int lustre_osp_connect(struct obd_device *osp)
1030 {
1031         struct lu_env            env;
1032         struct lu_context        session_ctx;
1033         struct obd_export       *exp;
1034         struct obd_uuid         *uuid = NULL;
1035         struct obd_connect_data *data = NULL;
1036         int                      rc;
1037         ENTRY;
1038
1039         /* log has been fully processed, let clients connect */
1040         rc = lu_env_init(&env, osp->obd_lu_dev->ld_type->ldt_ctx_tags);
1041         if (rc != 0)
1042                 RETURN(rc);
1043
1044         lu_context_init(&session_ctx, LCT_SESSION);
1045         session_ctx.lc_thread = NULL;
1046         lu_context_enter(&session_ctx);
1047         env.le_ses = &session_ctx;
1048
1049         OBD_ALLOC_PTR(data);
1050         if (data == NULL)
1051                 GOTO(out, rc = -ENOMEM);
1052
1053         data->ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_INDEX;
1054         data->ocd_version = LUSTRE_VERSION_CODE;
1055         data->ocd_ibits_known = MDS_INODELOCK_UPDATE;
1056         data->ocd_connect_flags |= OBD_CONNECT_ACL | OBD_CONNECT_IBITS |
1057                                    OBD_CONNECT_MDS_MDS | OBD_CONNECT_FID |
1058                                    OBD_CONNECT_AT | OBD_CONNECT_FULL20 |
1059                                    OBD_CONNECT_LIGHTWEIGHT;
1060         OBD_ALLOC_PTR(uuid);
1061         if (uuid == NULL)
1062                 GOTO(out, rc = -ENOMEM);
1063
1064         if (strlen(osp->obd_name) > sizeof(uuid->uuid)) {
1065                 CERROR("%s: Too long osp name %s, max_size is %d\n",
1066                        osp->obd_name, osp->obd_name, (int)sizeof(uuid->uuid));
1067                 GOTO(out, rc = -EINVAL);
1068         }
1069         /* Use osp name as the uuid, so we find the export by
1070          * osp name later */
1071         memcpy(uuid->uuid, osp->obd_name, strlen(osp->obd_name));
1072         rc = obd_connect(&env, &exp, osp, uuid, data, NULL);
1073         if (rc != 0)
1074                 CERROR("%s: connect failed: rc = %d\n", osp->obd_name, rc);
1075         else
1076                 lustre_notify_osp_list(exp);
1077
1078 out:
1079         if (data != NULL)
1080                 OBD_FREE_PTR(data);
1081         if (uuid != NULL)
1082                 OBD_FREE_PTR(uuid);
1083
1084         lu_env_fini(&env);
1085         lu_context_exit(&session_ctx);
1086         lu_context_fini(&session_ctx);
1087
1088         RETURN(rc);
1089 }
1090
1091 /**
1092  * osp-on-ost is used by slaves (Non-MDT0 targets) to manage the connection
1093  * to MDT0.
1094  *
1095  * The OSTs will communicate with MDT0 by the connection established by the
1096  * osp-on-ost to get quota and fid sequence.
1097  *
1098  **/
1099 static int lustre_osp_setup(struct lustre_cfg *lcfg, struct lustre_sb_info *lsi)
1100 {
1101         struct obd_connect_data *data = NULL;
1102         struct obd_device       *obd;
1103         char                    *ospname = NULL;
1104         char                    *ospuuid = NULL;
1105         int                      rc;
1106         ENTRY;
1107
1108         rc = class_add_uuid(lustre_cfg_string(lcfg, 1),
1109                             lcfg->lcfg_nid);
1110         if (rc) {
1111                 CERROR("%s: Can't add uuid: rc =%d\n", lsi->lsi_svname, rc);
1112                 GOTO(out, rc);
1113         }
1114
1115         OBD_ALLOC(ospname, MTI_NAME_MAXLEN);
1116         if (ospname == NULL)
1117                 GOTO(out, rc = -ENOMEM);
1118
1119         rc = tgt_name2ospname(lsi->lsi_svname, ospname);
1120         if (rc != 0) {
1121                 CERROR("%s change ospname error: rc %d\n",
1122                        lsi->lsi_svname, rc);
1123                 GOTO(out, rc);
1124         }
1125
1126         OBD_ALLOC(ospuuid, MTI_NAME_MAXLEN);
1127         if (ospuuid == NULL)
1128                 GOTO(out, rc = -ENOMEM);
1129
1130         sprintf(ospuuid, "%s_UUID", ospname);
1131         rc = lustre_start_simple(ospname, LUSTRE_OSP_NAME,
1132                                  ospuuid, lustre_cfg_string(lcfg, 1),
1133                                  0, 0, 0);
1134         if (rc) {
1135                 CERROR("%s: setup up failed: rc %d\n", ospname, rc);
1136                 GOTO(out, rc);
1137         }
1138
1139         obd = class_name2obd(ospname);
1140         LASSERT(obd != NULL);
1141
1142         rc = lustre_osp_connect(obd);
1143         if (rc != 0)
1144                 CERROR("%s: connect failed: rc = %d\n", ospname, rc);
1145 out:
1146         if (data != NULL)
1147                 OBD_FREE_PTR(data);
1148         if (ospname != NULL)
1149                 OBD_FREE(ospname, MTI_NAME_MAXLEN);
1150         if (ospuuid != NULL)
1151                 OBD_FREE(ospuuid, MTI_NAME_MAXLEN);
1152
1153         RETURN(rc);
1154 }
1155
1156 static int lustre_osp_add_conn(struct lustre_cfg *cfg,
1157                                struct lustre_sb_info *lsi)
1158 {
1159         struct lustre_cfg_bufs *bufs = NULL;
1160         struct lustre_cfg      *lcfg = NULL;
1161         char                   *ospname = NULL;
1162         struct obd_device      *osp;
1163         int                     rc;
1164         ENTRY;
1165
1166         OBD_ALLOC(ospname, MTI_NAME_MAXLEN);
1167         if (ospname == NULL)
1168                 GOTO(out, rc = -ENOMEM);
1169
1170         rc = tgt_name2ospname(lsi->lsi_svname, ospname);
1171         if (rc != 0) {
1172                 CERROR("%s change ospname error: rc %d\n",
1173                        lsi->lsi_svname, rc);
1174                 GOTO(out, rc);
1175         }
1176
1177         OBD_ALLOC_PTR(bufs);
1178         if (bufs == NULL)
1179                 RETURN(-ENOMEM);
1180
1181         lustre_cfg_bufs_reset(bufs, ospname);
1182         lustre_cfg_bufs_set_string(bufs, 1,
1183                                    lustre_cfg_string(cfg, 1));
1184
1185         lcfg = lustre_cfg_new(LCFG_ADD_CONN, bufs);
1186
1187         osp = class_name2obd(ospname);
1188         if (osp == NULL) {
1189                 CERROR("Can not find %s\n", ospname);
1190                 GOTO(out, rc = -EINVAL);
1191         }
1192
1193         rc = class_add_conn(osp, lcfg);
1194         if (rc)
1195                 CERROR("%s: can't add conn: rc = %d\n", ospname, rc);
1196
1197 out:
1198         if (bufs != NULL)
1199                 OBD_FREE_PTR(bufs);
1200         if (lcfg != NULL)
1201                 lustre_cfg_free(lcfg);
1202         if (ospname != NULL)
1203                 OBD_FREE(ospname, MTI_NAME_MAXLEN);
1204
1205         RETURN(rc);
1206 }
1207
1208 /**
1209  * Retrieve MDT nids from the client log, then start the osp-on-ost device.
1210  * there are only two scenarios which would include mdt nid.
1211  * 1.
1212  * marker   5 (flags=0x01, v2.1.54.0) lustre-MDT0000  'add mdc' xxx-
1213  * add_uuid  nid=192.168.122.162@tcp(0x20000c0a87aa2)  0:  1:192.168.122.162@tcp
1214  * attach    0:lustre-MDT0000-mdc  1:mdc  2:lustre-clilmv_UUID
1215  * setup     0:lustre-MDT0000-mdc  1:lustre-MDT0000_UUID  2:192.168.122.162@tcp
1216  * add_uuid  nid=192.168.172.1@tcp(0x20000c0a8ac01)  0:  1:192.168.172.1@tcp
1217  * add_conn  0:lustre-MDT0000-mdc  1:192.168.172.1@tcp
1218  * modify_mdc_tgts add 0:lustre-clilmv  1:lustre-MDT0000_UUID xxxx
1219  * marker   5 (flags=0x02, v2.1.54.0) lustre-MDT0000  'add mdc' xxxx-
1220  * 2.
1221  * marker   7 (flags=0x01, v2.1.54.0) lustre-MDT0000  'add failnid' xxxx-
1222  * add_uuid  nid=192.168.122.2@tcp(0x20000c0a87a02)  0:  1:192.168.122.2@tcp
1223  * add_conn  0:lustre-MDT0000-mdc  1:192.168.122.2@tcp
1224  * marker   7 (flags=0x02, v2.1.54.0) lustre-MDT0000  'add failnid' xxxx-
1225 **/
1226 static int client_osp_config_process(const struct lu_env *env,
1227                                      struct llog_handle *handle,
1228                                      struct llog_rec_hdr *rec, void *data)
1229 {
1230         struct config_llog_instance *clli = data;
1231         int                          cfg_len = rec->lrh_len;
1232         char                        *cfg_buf = (char *) (rec + 1);
1233         struct lustre_cfg           *lcfg = NULL;
1234         struct lustre_sb_info       *lsi;
1235         int                          rc = 0, swab = 0;
1236         ENTRY;
1237
1238         if (rec->lrh_type != OBD_CFG_REC) {
1239                 CERROR("Unknown llog record type %#x encountered\n",
1240                        rec->lrh_type);
1241                 RETURN(-EINVAL);
1242         }
1243
1244         LASSERT(clli->cfg_sb != NULL);
1245         lsi = s2lsi(clli->cfg_sb);
1246
1247         lcfg = (struct lustre_cfg *)cfg_buf;
1248         if (lcfg->lcfg_version == __swab32(LUSTRE_CFG_VERSION)) {
1249                 lustre_swab_lustre_cfg(lcfg);
1250                 swab = 1;
1251         }
1252
1253         rc = lustre_cfg_sanity_check(cfg_buf, cfg_len);
1254         if (rc)
1255                 GOTO(out, rc);
1256
1257         switch (lcfg->lcfg_command) {
1258         case LCFG_MARKER: {
1259                 struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1);
1260
1261                 lustre_swab_cfg_marker(marker, swab,
1262                                        LUSTRE_CFG_BUFLEN(lcfg, 1));
1263                 if (marker->cm_flags & CM_SKIP ||
1264                     marker->cm_flags & CM_EXCLUDE)
1265                         GOTO(out, rc = 0);
1266
1267                 if (!tgt_is_mdt0(marker->cm_tgtname))
1268                         GOTO(out, rc = 0);
1269
1270                 if(!strncmp(marker->cm_comment, "add mdc", 7) ||
1271                    !strncmp(marker->cm_comment, "add failnid", 11)) {
1272                         if (marker->cm_flags & CM_START) {
1273                                 clli->cfg_flags = CFG_F_MARKER;
1274                                 /* This hack is to differentiate the
1275                                  * ADD_UUID is come from "add mdc" record
1276                                  * or from "add failnid" record. */
1277                                 if (!strncmp(marker->cm_comment,
1278                                              "add failnid", 11))
1279                                         clli->cfg_flags |= CFG_F_SKIP;
1280                         } else if (marker->cm_flags & CM_END) {
1281                                 clli->cfg_flags = 0;
1282                         }
1283                 }
1284                 break;
1285         }
1286         case LCFG_ADD_UUID: {
1287                 if (clli->cfg_flags == CFG_F_MARKER) {
1288                         rc = lustre_osp_setup(lcfg, lsi);
1289                         /* XXX: process only the first nid as
1290                          * we don't need another instance of osp */
1291                         clli->cfg_flags |= CFG_F_SKIP;
1292                 } else if (clli->cfg_flags == (CFG_F_MARKER | CFG_F_SKIP)) {
1293                         rc = class_add_uuid(lustre_cfg_string(lcfg, 1),
1294                                         lcfg->lcfg_nid);
1295                         if (rc)
1296                                 CERROR("%s: Fail to add uuid, rc:%d\n",
1297                                        lsi->lsi_svname, rc);
1298                 }
1299                 break;
1300         }
1301         case LCFG_ADD_CONN: {
1302                 if (is_mdc_for_mdt0(lustre_cfg_string(lcfg, 0)))
1303                         rc = lustre_osp_add_conn(lcfg, lsi);
1304                 break;
1305         }
1306         default:
1307                 break;
1308         }
1309 out:
1310         RETURN(rc);
1311 }
1312
1313 static int lustre_disconnect_osp(struct super_block *sb)
1314 {
1315         struct lustre_sb_info           *lsi = s2lsi(sb);
1316         struct obd_device               *osp;
1317         char                            *ospname = NULL;
1318         char                            *logname = NULL;
1319         struct lustre_cfg               *lcfg = NULL;
1320         struct lustre_cfg_bufs          *bufs = NULL;
1321         struct config_llog_instance     *cfg = NULL;
1322         int                              rc;
1323         ENTRY;
1324
1325         LASSERT(IS_OST(lsi) || IS_MDT(lsi));
1326         OBD_ALLOC(logname, MTI_NAME_MAXLEN);
1327         if (logname == NULL)
1328                 RETURN(-ENOMEM);
1329
1330         OBD_ALLOC(ospname, MTI_NAME_MAXLEN);
1331         if (ospname == NULL)
1332                 GOTO(out, rc = -ENOMEM);
1333
1334         rc = server_name2fsname(lsi->lsi_svname, ospname, NULL);
1335         if (rc != 0) {
1336                 CERROR("%s: get fsname error: %d\n",
1337                        lsi->lsi_svname, rc);
1338                 GOTO(out, rc);
1339         }
1340         sprintf(logname, "%s-client", ospname);
1341
1342         OBD_ALLOC_PTR(cfg);
1343         if (cfg == NULL)
1344                 GOTO(out, rc = -ENOMEM);
1345
1346         /* end log first */
1347         cfg->cfg_instance = sb;
1348         rc = lustre_end_log(sb, logname, cfg);
1349         if (rc != 0) {
1350                 CERROR("Can't end config log %s\n", ospname);
1351                 GOTO(out, rc);
1352         }
1353
1354         rc = tgt_name2ospname(lsi->lsi_svname, ospname);
1355         if (rc != 0) {
1356                 CERROR("%s: get osp name error: %d\n",
1357                        lsi->lsi_svname, rc);
1358                 GOTO(out, rc);
1359         }
1360
1361         osp = class_name2obd(ospname);
1362         if (osp == NULL) {
1363                 CERROR("Can't find osp-on-ost %s\n", ospname);
1364                 GOTO(out, rc = -ENOENT);
1365         }
1366
1367         OBD_ALLOC_PTR(bufs);
1368         if (bufs == NULL)
1369                 GOTO(out, rc = -ENOMEM);
1370
1371         lustre_cfg_bufs_reset(bufs, osp->obd_name);
1372         lustre_cfg_bufs_set_string(bufs, 1, NULL);
1373         lcfg = lustre_cfg_new(LCFG_CLEANUP, bufs);
1374         if (!lcfg)
1375                 GOTO(out, rc = -ENOMEM);
1376
1377         /* Disconnect import first. NULL is passed for the '@env', since
1378          * it will not be used for the 'osp-on-ost'. (see osp_shutdown()) */
1379         rc = osp->obd_lu_dev->ld_ops->ldo_process_config(NULL, osp->obd_lu_dev,
1380                                                          lcfg);
1381 out:
1382         if (lcfg)
1383                 lustre_cfg_free(lcfg);
1384         if (bufs)
1385                 OBD_FREE_PTR(bufs);
1386         if (cfg)
1387                 OBD_FREE_PTR(cfg);
1388         if (ospname)
1389                 OBD_FREE(ospname, MTI_NAME_MAXLEN);
1390         if (logname)
1391                 OBD_FREE(logname, MTI_NAME_MAXLEN);
1392         RETURN(rc);
1393 }
1394
1395 /**
1396  * Stop the osp(fsname-MDT0000-osp-OSTxxxx) for an OST target.
1397  **/
1398 static int lustre_stop_osp(struct super_block *sb)
1399 {
1400         struct lustre_sb_info   *lsi = s2lsi(sb);
1401         struct obd_device       *osp = NULL;
1402         char                    *ospname = NULL;
1403         int                      rc = 0;
1404         ENTRY;
1405
1406         LASSERT(IS_OST(lsi) || IS_MDT(lsi));
1407         OBD_ALLOC(ospname, MTI_NAME_MAXLEN);
1408
1409         rc = tgt_name2ospname(lsi->lsi_svname, ospname);
1410         if (rc != 0) {
1411                 CERROR("%s get fsname error: rc %d\n",
1412                        lsi->lsi_svname, rc);
1413                 GOTO(cleanup, rc);
1414         }
1415
1416         osp = class_name2obd(ospname);
1417         if (osp == NULL) {
1418                 CERROR("Can not find osp-on-ost %s\n", ospname);
1419                 GOTO(cleanup, rc = -ENOENT);
1420         }
1421
1422         osp->obd_force = 1;
1423         rc = class_manual_cleanup(osp);
1424
1425 cleanup:
1426         if (ospname != NULL)
1427                 OBD_FREE(ospname, MTI_NAME_MAXLEN);
1428         RETURN(rc);
1429 }
1430
1431 DEFINE_MUTEX(server_start_lock);
1432
1433 /* Stop MDS/OSS if nobody is using them */
1434 static int server_stop_servers(int lsiflags)
1435 {
1436         struct obd_device *obd = NULL;
1437         struct obd_type *type = NULL;
1438         int rc = 0;
1439         ENTRY;
1440
1441         mutex_lock(&server_start_lock);
1442
1443         /* Either an MDT or an OST or neither  */
1444         /* if this was an MDT, and there are no more MDT's, clean up the MDS */
1445         if ((lsiflags & LDD_F_SV_TYPE_MDT) &&
1446             (obd = class_name2obd(LUSTRE_MDS_OBDNAME))) {
1447                 /*FIXME pre-rename, should eventually be LUSTRE_MDT_NAME*/
1448                 type = class_search_type(LUSTRE_MDS_NAME);
1449         }
1450         /* if this was an OST, and there are no more OST's, clean up the OSS */
1451         if ((lsiflags & LDD_F_SV_TYPE_OST) &&
1452             (obd = class_name2obd(LUSTRE_OSS_OBDNAME))) {
1453                 type = class_search_type(LUSTRE_OST_NAME);
1454         }
1455
1456         if (obd && (!type || !type->typ_refcnt)) {
1457                 int err;
1458                 obd->obd_force = 1;
1459                 /* obd_fail doesn't mean much on a server obd */
1460                 err = class_manual_cleanup(obd);
1461                 if (!rc)
1462                         rc = err;
1463         }
1464
1465         mutex_unlock(&server_start_lock);
1466
1467         RETURN(rc);
1468 }
1469
1470 int server_mti_print(char *title, struct mgs_target_info *mti)
1471 {
1472         PRINT_CMD(PRINT_MASK, "mti %s\n", title);
1473         PRINT_CMD(PRINT_MASK, "server: %s\n", mti->mti_svname);
1474         PRINT_CMD(PRINT_MASK, "fs:     %s\n", mti->mti_fsname);
1475         PRINT_CMD(PRINT_MASK, "uuid:   %s\n", mti->mti_uuid);
1476         PRINT_CMD(PRINT_MASK, "ver: %d  flags: %#x\n",
1477                   mti->mti_config_ver, mti->mti_flags);
1478         return(0);
1479 }
1480
1481 /**
1482  * Get service name (svname) from string
1483  * rc < 0 on error
1484  * if endptr isn't NULL it is set to end of fsname *
1485  */
1486 int server_name2svname(char *label, char *svname, char **endptr)
1487 {
1488         int rc;
1489         char *dash;
1490
1491         /* We use server_name2fsname() just for parsing */
1492         rc = server_name2fsname(label, NULL, &dash);
1493         if (rc != 0)
1494                 return rc;
1495
1496         if (*dash != '-')
1497                 return -1;
1498
1499         strncpy(svname, dash + 1, MTI_NAME_MAXLEN);
1500
1501         return 0;
1502 }
1503 EXPORT_SYMBOL(server_name2svname);
1504
1505
1506 /* Get the index from the obd name.
1507    rc = server type, or
1508    rc < 0  on error
1509    if endptr isn't NULL it is set to end of name */
1510 int server_name2index(char *svname, __u32 *idx, char **endptr)
1511 {
1512         unsigned long index;
1513         int rc;
1514         char *dash;
1515
1516         /* We use server_name2fsname() just for parsing */
1517         rc = server_name2fsname(svname, NULL, &dash);
1518         if (rc != 0)
1519                 return rc;
1520
1521         if (*dash != '-')
1522                 return -EINVAL;
1523
1524         dash++;
1525
1526         if (strncmp(dash, "MDT", 3) == 0)
1527                 rc = LDD_F_SV_TYPE_MDT;
1528         else if (strncmp(dash, "OST", 3) == 0)
1529                 rc = LDD_F_SV_TYPE_OST;
1530         else
1531                 return -EINVAL;
1532
1533         dash += 3;
1534
1535         if (strcmp(dash, "all") == 0)
1536                 return rc | LDD_F_SV_ALL;
1537
1538         index = simple_strtoul(dash, endptr, 16);
1539         *idx = index;
1540
1541         return rc;
1542 }
1543 EXPORT_SYMBOL(server_name2index);
1544
1545 /* Generate data for registration */
1546 static int server_lsi2mti(struct lustre_sb_info *lsi,
1547                           struct mgs_target_info *mti)
1548 {
1549         lnet_process_id_t id;
1550         int rc, i = 0;
1551         ENTRY;
1552
1553         if (!IS_SERVER(lsi))
1554                 RETURN(-EINVAL);
1555
1556         strncpy(mti->mti_svname, lsi->lsi_svname, sizeof(mti->mti_svname));
1557
1558         mti->mti_nid_count = 0;
1559         while (LNetGetId(i++, &id) != -ENOENT) {
1560                 if (LNET_NETTYP(LNET_NIDNET(id.nid)) == LOLND)
1561                         continue;
1562
1563                 /* server use --servicenode param, only allow specified
1564                  * nids be registered */
1565                 if ((lsi->lsi_lmd->lmd_flags & LMD_FLG_NO_PRIMNODE) != 0 &&
1566                     class_match_nid(lsi->lsi_lmd->lmd_params,
1567                                     PARAM_FAILNODE, id.nid) < 1)
1568                         continue;
1569
1570                 /* match specified network */
1571                 if (!class_match_net(lsi->lsi_lmd->lmd_params,
1572                                      PARAM_NETWORK, LNET_NIDNET(id.nid)))
1573                         continue;
1574
1575                 mti->mti_nids[mti->mti_nid_count] = id.nid;
1576                 mti->mti_nid_count++;
1577                 if (mti->mti_nid_count >= MTI_NIDS_MAX) {
1578                         CWARN("Only using first %d nids for %s\n",
1579                               mti->mti_nid_count, mti->mti_svname);
1580                         break;
1581                 }
1582         }
1583
1584         mti->mti_lustre_ver = LUSTRE_VERSION_CODE;
1585         mti->mti_config_ver = 0;
1586
1587         rc = server_name2fsname(lsi->lsi_svname, mti->mti_fsname, NULL);
1588         if (rc != 0)
1589                 return rc;
1590
1591         rc = server_name2index(lsi->lsi_svname, &mti->mti_stripe_index, NULL);
1592         if (rc < 0)
1593                 return rc;
1594         /* Orion requires index to be set */
1595         LASSERT(!(rc & LDD_F_NEED_INDEX));
1596         /* keep only LDD flags */
1597         mti->mti_flags = lsi->lsi_flags & LDD_F_MASK;
1598         if (mti->mti_flags & (LDD_F_WRITECONF | LDD_F_VIRGIN))
1599                 mti->mti_flags |= LDD_F_UPDATE;
1600         strncpy(mti->mti_params, lsi->lsi_lmd->lmd_params,
1601                 sizeof(mti->mti_params));
1602         return 0;
1603 }
1604
1605 /* Register an old or new target with the MGS. If needed MGS will construct
1606    startup logs and assign index */
1607 static int server_register_target(struct lustre_sb_info *lsi)
1608 {
1609         struct obd_device *mgc = lsi->lsi_mgc;
1610         struct mgs_target_info *mti = NULL;
1611         bool writeconf;
1612         int rc;
1613         ENTRY;
1614
1615         LASSERT(mgc);
1616
1617         if (!IS_SERVER(lsi))
1618                 RETURN(-EINVAL);
1619
1620         OBD_ALLOC_PTR(mti);
1621         if (!mti)
1622                 RETURN(-ENOMEM);
1623
1624         rc = server_lsi2mti(lsi, mti);
1625         if (rc)
1626                 GOTO(out, rc);
1627
1628         CDEBUG(D_MOUNT, "Registration %s, fs=%s, %s, index=%04x, flags=%#x\n",
1629                mti->mti_svname, mti->mti_fsname,
1630                libcfs_nid2str(mti->mti_nids[0]), mti->mti_stripe_index,
1631                mti->mti_flags);
1632
1633         /* if write_conf is true, the registration must succeed */
1634         writeconf = !!(lsi->lsi_flags & (LDD_F_NEED_INDEX | LDD_F_UPDATE));
1635         mti->mti_flags |= LDD_F_OPC_REG;
1636
1637         /* Register the target */
1638         /* FIXME use mgc_process_config instead */
1639         rc = obd_set_info_async(NULL, mgc->u.cli.cl_mgc_mgsexp,
1640                                 sizeof(KEY_REGISTER_TARGET), KEY_REGISTER_TARGET,
1641                                 sizeof(*mti), mti, NULL);
1642         if (rc) {
1643                 if (mti->mti_flags & LDD_F_ERROR) {
1644                         LCONSOLE_ERROR_MSG(0x160,
1645                                 "The MGS is refusing to allow this "
1646                                 "server (%s) to start. Please see messages"
1647                                 " on the MGS node.\n", lsi->lsi_svname);
1648                 } else if (writeconf) {
1649                         LCONSOLE_ERROR_MSG(0x15f,
1650                                 "Communication to the MGS return error %d. "
1651                                 "Is the MGS running?\n", rc);
1652                 } else {
1653                         CERROR("Cannot talk to the MGS: %d, not fatal\n", rc);
1654                         /* reset the error code for non-fatal error. */
1655                         rc = 0;
1656                 }
1657                 GOTO(out, rc);
1658         }
1659
1660 out:
1661         if (mti)
1662                 OBD_FREE_PTR(mti);
1663         RETURN(rc);
1664 }
1665
1666 /**
1667  * Notify the MGS that this target is ready.
1668  * Used by IR - if the MGS receives this message, it will notify clients.
1669  */
1670 static int server_notify_target(struct super_block *sb, struct obd_device *obd)
1671 {
1672         struct lustre_sb_info *lsi = s2lsi(sb);
1673         struct obd_device *mgc = lsi->lsi_mgc;
1674         struct mgs_target_info *mti = NULL;
1675         int rc;
1676         ENTRY;
1677
1678         LASSERT(mgc);
1679
1680         if (!(IS_SERVER(lsi)))
1681                 RETURN(-EINVAL);
1682
1683         OBD_ALLOC_PTR(mti);
1684         if (!mti)
1685                 RETURN(-ENOMEM);
1686         rc = server_lsi2mti(lsi, mti);
1687         if (rc)
1688                 GOTO(out, rc);
1689
1690         mti->mti_instance = obd->u.obt.obt_instance;
1691         mti->mti_flags |= LDD_F_OPC_READY;
1692
1693         /* FIXME use mgc_process_config instead */
1694         rc = obd_set_info_async(NULL, mgc->u.cli.cl_mgc_mgsexp,
1695                                 sizeof(KEY_REGISTER_TARGET),
1696                                 KEY_REGISTER_TARGET,
1697                                 sizeof(*mti), mti, NULL);
1698
1699         /* Imperative recovery: if the mgs informs us to use IR? */
1700         if (!rc && !(mti->mti_flags & LDD_F_ERROR) &&
1701             (mti->mti_flags & LDD_F_IR_CAPABLE))
1702                 lsi->lsi_flags |= LDD_F_IR_CAPABLE;
1703
1704 out:
1705         if (mti)
1706                 OBD_FREE_PTR(mti);
1707         RETURN(rc);
1708
1709 }
1710
1711 /**
1712  * Start the osp(fsname-MDT0000-osp-OSTxxxx) for an OST target,
1713  * which would be used to communicate with MDT0 for quota and FID.
1714  **/
1715 static int lustre_start_osp(struct super_block *sb)
1716 {
1717         struct lustre_sb_info       *lsi = s2lsi(sb);
1718         struct config_llog_instance *cfg = NULL;
1719         struct obd_device           *osp;
1720         char                        *ospname = NULL;
1721         char                        *logname = NULL;
1722         char                        *tgt;
1723         int                          rc;
1724         ENTRY;
1725
1726         LASSERT(IS_OST(lsi) || IS_MDT(lsi));
1727         OBD_ALLOC(ospname, MTI_NAME_MAXLEN);
1728         OBD_ALLOC(logname, MTI_NAME_MAXLEN);
1729         if (ospname == NULL || logname == NULL)
1730                 GOTO(cleanup, rc = -ENOMEM);
1731
1732         rc = server_name2fsname(lsi->lsi_svname, ospname, &tgt);
1733         if (rc != 0) {
1734                 CERROR("%s change fsname error: rc %d\n",
1735                        lsi->lsi_svname, rc);
1736                 GOTO(cleanup, rc);
1737         }
1738         sprintf(logname, "%s-client", ospname);
1739
1740         rc = tgt_name2ospname(lsi->lsi_svname, ospname);
1741         if (rc != 0) {
1742                 CERROR("%s change ospname error: rc %d\n",
1743                        lsi->lsi_svname, rc);
1744                 GOTO(cleanup, rc);
1745         }
1746
1747         osp = class_name2obd(ospname);
1748         if (osp != NULL)
1749                 GOTO(cleanup, rc = 0);
1750
1751         OBD_ALLOC_PTR(cfg);
1752         if (cfg == NULL)
1753                 GOTO(cleanup, rc = -ENOMEM);
1754
1755         cfg->cfg_callback = client_osp_config_process;
1756         cfg->cfg_instance = sb;
1757
1758         rc = lustre_process_log(sb, logname, cfg);
1759
1760 cleanup:
1761         if (ospname != NULL)
1762                 OBD_FREE(ospname, MTI_NAME_MAXLEN);
1763         if (logname != NULL)
1764                 OBD_FREE(logname, MTI_NAME_MAXLEN);
1765         if (cfg != NULL)
1766                 OBD_FREE_PTR(cfg);
1767
1768         RETURN(rc);
1769 }
1770
1771 /** Start server targets: MDTs and OSTs
1772  */
1773 static int server_start_targets(struct super_block *sb, struct vfsmount *mnt)
1774 {
1775         struct obd_device *obd;
1776         struct lustre_sb_info *lsi = s2lsi(sb);
1777         struct config_llog_instance cfg;
1778         struct lu_env env;
1779         struct lu_device *dev;
1780         int rc;
1781         ENTRY;
1782
1783         CDEBUG(D_MOUNT, "starting target %s\n", lsi->lsi_svname);
1784
1785 #if 0
1786         /* If we're an MDT, make sure the global MDS is running */
1787         if (lsi->lsi_ldd->ldd_flags & LDD_F_SV_TYPE_MDT) {
1788                 /* make sure the MDS is started */
1789                 mutex_lock(&server_start_lock);
1790                 obd = class_name2obd(LUSTRE_MDS_OBDNAME);
1791                 if (!obd) {
1792                         rc = lustre_start_simple(LUSTRE_MDS_OBDNAME,
1793                     /* FIXME pre-rename, should eventually be LUSTRE_MDS_NAME */
1794                                                  LUSTRE_MDT_NAME,
1795                                                  LUSTRE_MDS_OBDNAME"_uuid",
1796                                                  0, 0);
1797                         if (rc) {
1798                                 mutex_unlock(&server_start_lock);
1799                                 CERROR("failed to start MDS: %d\n", rc);
1800                                 RETURN(rc);
1801                         }
1802                 }
1803                 mutex_unlock(&server_start_lock);
1804         }
1805 #endif
1806
1807         /* If we're an OST, make sure the global OSS is running */
1808         if (IS_OST(lsi)) {
1809                 /* make sure OSS is started */
1810                 mutex_lock(&server_start_lock);
1811                 obd = class_name2obd(LUSTRE_OSS_OBDNAME);
1812                 if (!obd) {
1813                         rc = lustre_start_simple(LUSTRE_OSS_OBDNAME,
1814                                                  LUSTRE_OSS_NAME,
1815                                                  LUSTRE_OSS_OBDNAME"_uuid",
1816                                                  0, 0, 0, 0);
1817                         if (rc) {
1818                                 mutex_unlock(&server_start_lock);
1819                                 CERROR("failed to start OSS: %d\n", rc);
1820                                 RETURN(rc);
1821                         }
1822                 }
1823                 mutex_unlock(&server_start_lock);
1824         }
1825
1826         /* Set the mgc fs to our server disk.  This allows the MGC to
1827          * read and write configs locally, in case it can't talk to the MGS. */
1828         if (lsi->lsi_srv_mnt) {
1829                 rc = server_mgc_set_fs(lsi->lsi_mgc, sb);
1830                 if (rc)
1831                         RETURN(rc);
1832         }
1833
1834         /* Register with MGS */
1835         rc = server_register_target(lsi);
1836         if (rc)
1837                 GOTO(out_mgc, rc);
1838
1839         /* Let the target look up the mount using the target's name
1840            (we can't pass the sb or mnt through class_process_config.) */
1841         rc = server_register_mount(lsi->lsi_svname, sb, mnt);
1842         if (rc)
1843                 GOTO(out_mgc, rc);
1844
1845         /* Start targets using the llog named for the target */
1846         memset(&cfg, 0, sizeof(cfg));
1847         cfg.cfg_callback = class_config_llog_handler;
1848         rc = lustre_process_log(sb, lsi->lsi_svname, &cfg);
1849         if (rc) {
1850                 CERROR("failed to start server %s: %d\n",
1851                        lsi->lsi_svname, rc);
1852                 /* Do NOT call server_deregister_mount() here. This makes it
1853                  * impossible to find mount later in cleanup time and leaves
1854                  * @lsi and othder stuff leaked. -umka */
1855                 GOTO(out_mgc, rc);
1856         }
1857
1858         obd = class_name2obd(lsi->lsi_svname);
1859         if (!obd) {
1860                 CERROR("no server named %s was started\n", lsi->lsi_svname);
1861                 GOTO(out_mgc, rc = -ENXIO);
1862         }
1863
1864         if (IS_OST(lsi) || IS_MDT(lsi)) {
1865                 rc = lustre_start_osp(sb);
1866                 if (rc) {
1867                         CERROR("%s: failed to start OSP: %d\n",
1868                                lsi->lsi_svname, rc);
1869                         GOTO(out_mgc, rc);
1870                 }
1871         }
1872
1873         server_notify_target(sb, obd);
1874
1875         /* calculate recovery timeout, do it after lustre_process_log */
1876         server_calc_timeout(lsi, obd);
1877
1878         /* log has been fully processed */
1879         obd_notify(obd, NULL, OBD_NOTIFY_CONFIG, (void *)CONFIG_LOG);
1880
1881         /* log has been fully processed, let clients connect */
1882         dev = obd->obd_lu_dev;
1883         if (dev && dev->ld_ops->ldo_prepare) {
1884                 rc = lu_env_init(&env, dev->ld_type->ldt_ctx_tags);
1885                 if (rc == 0) {
1886                         struct lu_context  session_ctx;
1887
1888                         lu_context_init(&session_ctx, LCT_SESSION);
1889                         session_ctx.lc_thread = NULL;
1890                         lu_context_enter(&session_ctx);
1891                         env.le_ses = &session_ctx;
1892
1893                         dev->ld_ops->ldo_prepare(&env, NULL, dev);
1894
1895                         lu_env_fini(&env);
1896                         lu_context_exit(&session_ctx);
1897                         lu_context_fini(&session_ctx);
1898                 }
1899         }
1900
1901         /* abort recovery only on the complete stack:
1902          * many devices can be involved */
1903         if ((lsi->lsi_lmd->lmd_flags & LMD_FLG_ABORT_RECOV) &&
1904             (OBP(obd, iocontrol))) {
1905                 obd_iocontrol(OBD_IOC_ABORT_RECOVERY, obd->obd_self_export, 0,
1906                               NULL, NULL);
1907         }
1908
1909 out_mgc:
1910         /* Release the mgc fs for others to use */
1911         if (lsi->lsi_srv_mnt)
1912                 server_mgc_clear_fs(lsi->lsi_mgc);
1913
1914         RETURN(rc);
1915 }
1916
1917 /***************** lustre superblock **************/
1918
1919 struct lustre_sb_info *lustre_init_lsi(struct super_block *sb)
1920 {
1921         struct lustre_sb_info *lsi;
1922         ENTRY;
1923
1924         OBD_ALLOC_PTR(lsi);
1925         if (!lsi)
1926                 RETURN(NULL);
1927         OBD_ALLOC_PTR(lsi->lsi_lmd);
1928         if (!lsi->lsi_lmd) {
1929                 OBD_FREE_PTR(lsi);
1930                 RETURN(NULL);
1931         }
1932
1933         lsi->lsi_lmd->lmd_exclude_count = 0;
1934         lsi->lsi_lmd->lmd_recovery_time_soft = 0;
1935         lsi->lsi_lmd->lmd_recovery_time_hard = 0;
1936         s2lsi_nocast(sb) = lsi;
1937         /* we take 1 extra ref for our setup */
1938         cfs_atomic_set(&lsi->lsi_mounts, 1);
1939
1940         /* Default umount style */
1941         lsi->lsi_flags = LSI_UMOUNT_FAILOVER;
1942
1943         RETURN(lsi);
1944 }
1945
1946 static int lustre_free_lsi(struct super_block *sb)
1947 {
1948         struct lustre_sb_info *lsi = s2lsi(sb);
1949         ENTRY;
1950
1951         LASSERT(lsi != NULL);
1952         CDEBUG(D_MOUNT, "Freeing lsi %p\n", lsi);
1953
1954         /* someone didn't call server_put_mount. */
1955         LASSERT(cfs_atomic_read(&lsi->lsi_mounts) == 0);
1956
1957         if (lsi->lsi_lmd != NULL) {
1958                 if (lsi->lsi_lmd->lmd_dev != NULL)
1959                         OBD_FREE(lsi->lsi_lmd->lmd_dev,
1960                                  strlen(lsi->lsi_lmd->lmd_dev) + 1);
1961                 if (lsi->lsi_lmd->lmd_profile != NULL)
1962                         OBD_FREE(lsi->lsi_lmd->lmd_profile,
1963                                  strlen(lsi->lsi_lmd->lmd_profile) + 1);
1964                 if (lsi->lsi_lmd->lmd_mgssec != NULL)
1965                         OBD_FREE(lsi->lsi_lmd->lmd_mgssec,
1966                                  strlen(lsi->lsi_lmd->lmd_mgssec) + 1);
1967                 if (lsi->lsi_lmd->lmd_opts != NULL)
1968                         OBD_FREE(lsi->lsi_lmd->lmd_opts,
1969                                  strlen(lsi->lsi_lmd->lmd_opts) + 1);
1970                 if (lsi->lsi_lmd->lmd_exclude_count)
1971                         OBD_FREE(lsi->lsi_lmd->lmd_exclude,
1972                                  sizeof(lsi->lsi_lmd->lmd_exclude[0]) *
1973                                  lsi->lsi_lmd->lmd_exclude_count);
1974                 if (lsi->lsi_lmd->lmd_mgs != NULL)
1975                         OBD_FREE(lsi->lsi_lmd->lmd_mgs,
1976                                  strlen(lsi->lsi_lmd->lmd_mgs) + 1);
1977                 if (lsi->lsi_lmd->lmd_osd_type != NULL)
1978                         OBD_FREE(lsi->lsi_lmd->lmd_osd_type,
1979                                  strlen(lsi->lsi_lmd->lmd_osd_type) + 1);
1980                 if (lsi->lsi_lmd->lmd_params != NULL)
1981                         OBD_FREE(lsi->lsi_lmd->lmd_params, 4096);
1982
1983                 OBD_FREE(lsi->lsi_lmd, sizeof(*lsi->lsi_lmd));
1984         }
1985
1986         LASSERT(lsi->lsi_llsbi == NULL);
1987         OBD_FREE(lsi, sizeof(*lsi));
1988         s2lsi_nocast(sb) = NULL;
1989
1990         RETURN(0);
1991 }
1992
1993 /* The lsi has one reference for every server that is using the disk -
1994    e.g. MDT, MGS, and potentially MGC */
1995 static int lustre_put_lsi(struct super_block *sb)
1996 {
1997         struct lustre_sb_info *lsi = s2lsi(sb);
1998         ENTRY;
1999
2000         LASSERT(lsi != NULL);
2001
2002         CDEBUG(D_MOUNT, "put %p %d\n", sb, cfs_atomic_read(&lsi->lsi_mounts));
2003         if (cfs_atomic_dec_and_test(&lsi->lsi_mounts)) {
2004                 if (IS_SERVER(lsi) && lsi->lsi_osd_exp) {
2005                         obd_disconnect(lsi->lsi_osd_exp);
2006                         /* wait till OSD is gone */
2007                         obd_zombie_barrier();
2008                 }
2009                 lustre_free_lsi(sb);
2010                 RETURN(1);
2011         }
2012         RETURN(0);
2013 }
2014
2015 static int lsi_prepare(struct lustre_sb_info *lsi)
2016 {
2017         __u32 index;
2018         int rc;
2019         ENTRY;
2020
2021         LASSERT(lsi);
2022         LASSERT(lsi->lsi_lmd);
2023
2024         /* The server name is given as a mount line option */
2025         if (lsi->lsi_lmd->lmd_profile == NULL) {
2026                 LCONSOLE_ERROR("Can't determine server name\n");
2027                 RETURN(-EINVAL);
2028         }
2029
2030         if (strlen(lsi->lsi_lmd->lmd_profile) >= sizeof(lsi->lsi_svname))
2031                 RETURN(-ENAMETOOLONG);
2032
2033         strcpy(lsi->lsi_svname, lsi->lsi_lmd->lmd_profile);
2034
2035         /* Determine osd type */
2036         if (lsi->lsi_lmd->lmd_osd_type != NULL) {
2037                 if (strlen(lsi->lsi_lmd->lmd_osd_type) >=
2038                            sizeof(lsi->lsi_osd_type))
2039                         RETURN(-ENAMETOOLONG);
2040
2041                 strcpy(lsi->lsi_osd_type, lsi->lsi_lmd->lmd_osd_type);
2042         } else {
2043                 strcpy(lsi->lsi_osd_type, LUSTRE_OSD_LDISKFS_NAME);
2044         }
2045
2046         /* XXX: a temp. solution for components using fsfilt
2047          *      to be removed in one of the subsequent patches */
2048         if (!strcmp(lsi->lsi_lmd->lmd_osd_type, "osd-ldiskfs")) {
2049                 strcpy(lsi->lsi_fstype, "ldiskfs");
2050         } else {
2051                 strcpy(lsi->lsi_fstype, lsi->lsi_lmd->lmd_osd_type);
2052         }
2053
2054         /* Determine server type */
2055         rc = server_name2index(lsi->lsi_svname, &index, NULL);
2056         if (rc < 0) {
2057                 if (lsi->lsi_lmd->lmd_flags & LMD_FLG_MGS) {
2058                         /* Assume we're a bare MGS */
2059                         rc = 0;
2060                         lsi->lsi_lmd->lmd_flags |= LMD_FLG_NOSVC;
2061                 } else {
2062                         LCONSOLE_ERROR("Can't determine server type of '%s'\n",
2063                                        lsi->lsi_svname);
2064                         RETURN(rc);
2065                 }
2066         }
2067         lsi->lsi_flags |= rc;
2068
2069         /* Add mount line flags that used to be in ldd:
2070          * writeconf, mgs, anything else?
2071          */
2072         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_WRITECONF) ?
2073                 LDD_F_WRITECONF : 0;
2074         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_VIRGIN) ?
2075                 LDD_F_VIRGIN : 0;
2076         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_MGS) ?
2077                 LDD_F_SV_TYPE_MGS : 0;
2078         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_NO_PRIMNODE) ?
2079                 LDD_F_NO_PRIMNODE : 0;
2080
2081         RETURN(0);
2082 }
2083
2084 /*************** server mount ******************/
2085
2086 /** Start the shutdown of servers at umount.
2087  */
2088 static void server_put_super(struct super_block *sb)
2089 {
2090         struct lustre_sb_info *lsi = s2lsi(sb);
2091         struct obd_device     *obd;
2092         char *tmpname, *extraname = NULL;
2093         int tmpname_sz;
2094         int lsiflags = lsi->lsi_flags;
2095         ENTRY;
2096
2097         LASSERT(IS_SERVER(lsi));
2098
2099         tmpname_sz = strlen(lsi->lsi_svname) + 1;
2100         OBD_ALLOC(tmpname, tmpname_sz);
2101         memcpy(tmpname, lsi->lsi_svname, tmpname_sz);
2102         CDEBUG(D_MOUNT, "server put_super %s\n", tmpname);
2103         if (IS_MDT(lsi) && (lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC))
2104                 snprintf(tmpname, tmpname_sz, "MGS");
2105
2106         /* disconnect the osp-on-ost first to drain off the inflight request */
2107         if (IS_OST(lsi) || IS_MDT(lsi)) {
2108                 int     rc;
2109
2110                 rc = lustre_disconnect_osp(sb);
2111                 if (rc && rc != ETIMEDOUT)
2112                         CERROR("%s: failed to disconnect osp-on-ost (rc=%d)!\n",
2113                                tmpname, rc);
2114         }
2115
2116         /* Stop the target */
2117         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
2118             (IS_MDT(lsi) || IS_OST(lsi))) {
2119                 struct lustre_profile *lprof = NULL;
2120
2121                 /* tell the mgc to drop the config log */
2122                 lustre_end_log(sb, lsi->lsi_svname, NULL);
2123
2124                 /* COMPAT_146 - profile may get deleted in mgc_cleanup.
2125                    If there are any setup/cleanup errors, save the lov
2126                    name for safety cleanup later. */
2127                 lprof = class_get_profile(lsi->lsi_svname);
2128                 if (lprof && lprof->lp_dt) {
2129                         OBD_ALLOC(extraname, strlen(lprof->lp_dt) + 1);
2130                         strcpy(extraname, lprof->lp_dt);
2131                 }
2132
2133                 obd = class_name2obd(lsi->lsi_svname);
2134                 if (obd) {
2135                         CDEBUG(D_MOUNT, "stopping %s\n", obd->obd_name);
2136                         if (lsi->lsi_flags & LSI_UMOUNT_FAILOVER)
2137                                 obd->obd_fail = 1;
2138                         /* We can't seem to give an error return code
2139                          * to .put_super, so we better make sure we clean up! */
2140                         obd->obd_force = 1;
2141                         class_manual_cleanup(obd);
2142                 } else {
2143                         CERROR("no obd %s\n", lsi->lsi_svname);
2144                         server_deregister_mount(lsi->lsi_svname);
2145                 }
2146         }
2147
2148         /* If they wanted the mgs to stop separately from the mdt, they
2149            should have put it on a different device. */
2150         if (IS_MGS(lsi)) {
2151                 /* if MDS start with --nomgs, don't stop MGS then */
2152                 if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS))
2153                         server_stop_mgs(sb);
2154         }
2155
2156         if (IS_OST(lsi) || IS_MDT(lsi)) {
2157                 if (lustre_stop_osp(sb) < 0)
2158                         CERROR("%s: Fail to stop osp-on-ost!\n", tmpname);
2159         }
2160
2161         /* Clean the mgc and sb */
2162         lustre_common_put_super(sb);
2163
2164         /* wait till all in-progress cleanups are done
2165          * specifically we're interested in ofd cleanup
2166          * as it pins OSS */
2167         obd_zombie_barrier();
2168
2169         /* Stop the servers (MDS, OSS) if no longer needed.  We must wait
2170            until the target is really gone so that our type refcount check
2171            is right. */
2172         server_stop_servers(lsiflags);
2173
2174         /* In case of startup or cleanup err, stop related obds */
2175         if (extraname) {
2176                 obd = class_name2obd(extraname);
2177                 if (obd) {
2178                         CWARN("Cleaning orphaned obd %s\n", extraname);
2179                         obd->obd_force = 1;
2180                         class_manual_cleanup(obd);
2181                 }
2182                 OBD_FREE(extraname, strlen(extraname) + 1);
2183         }
2184
2185         LCONSOLE_WARN("server umount %s complete\n", tmpname);
2186         OBD_FREE(tmpname, tmpname_sz);
2187         EXIT;
2188 }
2189
2190 /** Called only for 'umount -f'
2191  */
2192 #ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
2193 static void server_umount_begin(struct vfsmount *vfsmnt, int flags)
2194 {
2195         struct super_block *sb = vfsmnt->mnt_sb;
2196 #else
2197 static void server_umount_begin(struct super_block *sb)
2198 {
2199 #endif
2200         struct lustre_sb_info *lsi = s2lsi(sb);
2201         ENTRY;
2202
2203 #ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
2204         if (!(flags & MNT_FORCE)) {
2205                 EXIT;
2206                 return;
2207         }
2208 #endif
2209
2210         CDEBUG(D_MOUNT, "umount -f\n");
2211         /* umount = failover
2212            umount -f = force
2213            no third way to do non-force, non-failover */
2214         lsi->lsi_flags &= ~LSI_UMOUNT_FAILOVER;
2215         EXIT;
2216 }
2217
2218 static int server_statfs (struct dentry *dentry, cfs_kstatfs_t *buf)
2219 {
2220         struct super_block *sb = dentry->d_sb;
2221         struct lustre_sb_info *lsi = s2lsi(sb);
2222         struct obd_statfs statfs;
2223         int rc;
2224         ENTRY;
2225
2226         if (lsi->lsi_dt_dev) {
2227                 rc = dt_statfs(NULL, lsi->lsi_dt_dev, &statfs);
2228                 if (rc == 0) {
2229                         statfs_unpack(buf, &statfs);
2230                         buf->f_type = sb->s_magic;
2231                         RETURN(0);
2232                 }
2233         }
2234
2235         /* just return 0 */
2236         buf->f_type = sb->s_magic;
2237         buf->f_bsize = sb->s_blocksize;
2238         buf->f_blocks = 1;
2239         buf->f_bfree = 0;
2240         buf->f_bavail = 0;
2241         buf->f_files = 1;
2242         buf->f_ffree = 0;
2243         buf->f_namelen = NAME_MAX;
2244         RETURN(0);
2245 }
2246
2247 /** The operations we support directly on the superblock:
2248  * mount, umount, and df.
2249  */
2250 static struct super_operations server_ops =
2251 {
2252         .put_super      = server_put_super,
2253         .umount_begin   = server_umount_begin, /* umount -f */
2254         .statfs         = server_statfs,
2255 };
2256
2257 #define log2(n) ffz(~(n))
2258 #define LUSTRE_SUPER_MAGIC 0x0BD00BD1
2259
2260 static int server_fill_super_common(struct super_block *sb)
2261 {
2262         struct inode *root = 0;
2263         ENTRY;
2264
2265         CDEBUG(D_MOUNT, "Server sb, dev=%d\n", (int)sb->s_dev);
2266
2267         sb->s_blocksize = 4096;
2268         sb->s_blocksize_bits = log2(sb->s_blocksize);
2269         sb->s_magic = LUSTRE_SUPER_MAGIC;
2270         sb->s_maxbytes = 0; /* we don't allow file IO on server mountpoints */
2271         sb->s_flags |= MS_RDONLY;
2272         sb->s_op = &server_ops;
2273
2274         root = new_inode(sb);
2275         if (!root) {
2276                 CERROR("Can't make root inode\n");
2277                 RETURN(-EIO);
2278         }
2279
2280         /* returns -EIO for every operation */
2281         /* make_bad_inode(root); -- badness - can't umount */
2282         /* apparently we need to be a directory for the mount to finish */
2283         root->i_mode = S_IFDIR;
2284
2285         sb->s_root = d_alloc_root(root);
2286         if (!sb->s_root) {
2287                 CERROR("Can't make root dentry\n");
2288                 iput(root);
2289                 RETURN(-EIO);
2290         }
2291
2292         RETURN(0);
2293 }
2294
2295 static int osd_start(struct lustre_sb_info *lsi, unsigned long mflags)
2296 {
2297         struct lustre_mount_data *lmd = lsi->lsi_lmd;
2298         struct obd_device        *obd;
2299         struct dt_device_param    p;
2300         char                      flagstr[16];
2301         int                       rc;
2302         ENTRY;
2303
2304         CDEBUG(D_MOUNT,
2305                "Attempting to start %s, type=%s, lsifl=%x, mountfl=%lx\n",
2306                lsi->lsi_svname, lsi->lsi_osd_type, lsi->lsi_flags, mflags);
2307
2308         sprintf(lsi->lsi_osd_obdname, "%s-osd", lsi->lsi_svname);
2309         strcpy(lsi->lsi_osd_uuid, lsi->lsi_osd_obdname);
2310         strcat(lsi->lsi_osd_uuid, "_UUID");
2311         sprintf(flagstr, "%lu:%lu", mflags, (unsigned long) lmd->lmd_flags);
2312
2313         obd = class_name2obd(lsi->lsi_osd_obdname);
2314         if (obd == NULL) {
2315                 rc = lustre_start_simple(lsi->lsi_osd_obdname,
2316                                 lsi->lsi_osd_type,
2317                                 lsi->lsi_osd_uuid, lmd->lmd_dev,
2318                                 flagstr, lsi->lsi_lmd->lmd_opts,
2319                                 lsi->lsi_svname);
2320                 if (rc)
2321                         GOTO(out, rc);
2322                 obd = class_name2obd(lsi->lsi_osd_obdname);
2323                 LASSERT(obd);
2324         }
2325
2326         rc = obd_connect(NULL, &lsi->lsi_osd_exp, obd, &obd->obd_uuid, NULL, NULL);
2327         if (rc) {
2328                 obd->obd_force = 1;
2329                 class_manual_cleanup(obd);
2330                 lsi->lsi_dt_dev = NULL;
2331         }
2332
2333         /* XXX: to keep support old components relying on lsi_srv_mnt
2334          *      we get this info from OSD just started */
2335         LASSERT(obd->obd_lu_dev);
2336         lsi->lsi_dt_dev = lu2dt_dev(obd->obd_lu_dev);
2337         LASSERT(lsi->lsi_dt_dev);
2338
2339         dt_conf_get(NULL, lsi->lsi_dt_dev, &p);
2340
2341         lsi->lsi_srv_mnt = p.ddp_mnt;
2342
2343 out:
2344         RETURN(rc);
2345 }
2346
2347 /** Fill in the superblock info for a Lustre server.
2348  * Mount the device with the correct options.
2349  * Read the on-disk config file.
2350  * Start the services.
2351  */
2352 static int server_fill_super(struct super_block *sb)
2353 {
2354         struct lustre_sb_info *lsi = s2lsi(sb);
2355         int rc;
2356         ENTRY;
2357
2358         rc = lsi_prepare(lsi);
2359         if (rc)
2360                 RETURN(rc);
2361
2362         /* Start low level OSD */
2363         rc = osd_start(lsi, sb->s_flags);
2364         if (rc) {
2365                 CERROR("Unable to start osd on %s: %d\n",
2366                        lsi->lsi_lmd->lmd_dev, rc);
2367                 lustre_put_lsi(sb);
2368                 RETURN(rc);
2369         }
2370
2371         CDEBUG(D_MOUNT, "Found service %s on device %s\n",
2372                lsi->lsi_svname, lsi->lsi_lmd->lmd_dev);
2373
2374         if (class_name2obd(lsi->lsi_svname)) {
2375                 LCONSOLE_ERROR_MSG(0x161, "The target named %s is already "
2376                                    "running. Double-mount may have compromised"
2377                                    " the disk journal.\n",
2378                                    lsi->lsi_svname);
2379                 lustre_put_lsi(sb);
2380                 RETURN(-EALREADY);
2381         }
2382
2383         /* Start MGS before MGC */
2384         if (IS_MGS(lsi) && !(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS)){
2385                 rc = server_start_mgs(sb);
2386                 if (rc)
2387                         GOTO(out_mnt, rc);
2388         }
2389
2390         /* Start MGC before servers */
2391         rc = lustre_start_mgc(sb);
2392         if (rc)
2393                 GOTO(out_mnt, rc);
2394
2395         /* Set up all obd devices for service */
2396         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
2397                         (IS_OST(lsi) || IS_MDT(lsi))) {
2398                 rc = server_start_targets(sb, lsi->lsi_srv_mnt);
2399                 if (rc < 0) {
2400                         CERROR("Unable to start targets: %d\n", rc);
2401                         GOTO(out_mnt, rc);
2402                 }
2403         /* FIXME overmount client here,
2404            or can we just start a client log and client_fill_super on this sb?
2405            We need to make sure server_put_super gets called too - ll_put_super
2406            calls lustre_common_put_super; check there for LSI_SERVER flag,
2407            call s_p_s if so.
2408            Probably should start client from new thread so we can return.
2409            Client will not finish until all servers are connected.
2410            Note - MGS-only server does NOT get a client, since there is no
2411            lustre fs associated - the MGS is for all lustre fs's */
2412         }
2413
2414         rc = server_fill_super_common(sb);
2415         if (rc)
2416                 GOTO(out_mnt, rc);
2417
2418         RETURN(0);
2419 out_mnt:
2420         /* We jump here in case of failure while starting targets or MGS.
2421          * In this case we can't just put @mnt and have to do real cleanup
2422          * with stoping targets, etc. */
2423         server_put_super(sb);
2424         return rc;
2425 }
2426
2427 /*
2428  * Calculate timeout value for a target.
2429  */
2430 void server_calc_timeout(struct lustre_sb_info *lsi, struct obd_device *obd)
2431 {
2432         struct lustre_mount_data *lmd;
2433         int soft = 0;
2434         int hard = 0;
2435         int factor = 0;
2436         bool has_ir = !!(lsi->lsi_flags & LDD_F_IR_CAPABLE);
2437         int min = OBD_RECOVERY_TIME_MIN;
2438
2439         LASSERT(IS_SERVER(lsi));
2440
2441         lmd = lsi->lsi_lmd;
2442         if (lmd) {
2443                 soft   = lmd->lmd_recovery_time_soft;
2444                 hard   = lmd->lmd_recovery_time_hard;
2445                 has_ir = has_ir && !(lmd->lmd_flags & LMD_FLG_NOIR);
2446                 obd->obd_no_ir = !has_ir;
2447         }
2448
2449         if (soft == 0)
2450                 soft = OBD_RECOVERY_TIME_SOFT;
2451         if (hard == 0)
2452                 hard = OBD_RECOVERY_TIME_HARD;
2453
2454         /* target may have ir_factor configured. */
2455         factor = OBD_IR_FACTOR_DEFAULT;
2456         if (obd->obd_recovery_ir_factor)
2457                 factor = obd->obd_recovery_ir_factor;
2458
2459         if (has_ir) {
2460                 int new_soft = soft;
2461                 int new_hard = hard;
2462
2463                 /* adjust timeout value by imperative recovery */
2464
2465                 new_soft = (soft * factor) / OBD_IR_FACTOR_MAX;
2466                 new_hard = (hard * factor) / OBD_IR_FACTOR_MAX;
2467
2468                 /* make sure the timeout is not too short */
2469                 new_soft = max(min, new_soft);
2470                 new_hard = max(new_soft, new_hard);
2471
2472                 LCONSOLE_INFO("%s: Imperative Recovery enabled, recovery "
2473                               "window shrunk from %d-%d down to %d-%d\n",
2474                               obd->obd_name, soft, hard, new_soft, new_hard);
2475
2476                 soft = new_soft;
2477                 hard = new_hard;
2478         }
2479
2480         /* we're done */
2481         obd->obd_recovery_timeout   = max(obd->obd_recovery_timeout, soft);
2482         obd->obd_recovery_time_hard = hard;
2483         obd->obd_recovery_ir_factor = factor;
2484 }
2485 EXPORT_SYMBOL(server_calc_timeout);
2486
2487 /*************** mount common betweeen server and client ***************/
2488
2489 /* Common umount */
2490 int lustre_common_put_super(struct super_block *sb)
2491 {
2492         int rc;
2493         ENTRY;
2494
2495         CDEBUG(D_MOUNT, "dropping sb %p\n", sb);
2496
2497         /* Drop a ref to the MGC */
2498         rc = lustre_stop_mgc(sb);
2499         if (rc && (rc != -ENOENT)) {
2500                 if (rc != -EBUSY) {
2501                         CERROR("Can't stop MGC: %d\n", rc);
2502                         RETURN(rc);
2503                 }
2504                 /* BUSY just means that there's some other obd that
2505                    needs the mgc.  Let him clean it up. */
2506                 CDEBUG(D_MOUNT, "MGC still in use\n");
2507         }
2508         /* Drop a ref to the mounted disk */
2509         lustre_put_lsi(sb);
2510         lu_types_stop();
2511         RETURN(rc);
2512 }
2513 EXPORT_SYMBOL(lustre_common_put_super);
2514
2515 static void lmd_print(struct lustre_mount_data *lmd)
2516 {
2517         int i;
2518
2519         PRINT_CMD(PRINT_MASK, "  mount data:\n");
2520         if (lmd_is_client(lmd))
2521                 PRINT_CMD(PRINT_MASK, "profile: %s\n", lmd->lmd_profile);
2522         PRINT_CMD(PRINT_MASK, "device:  %s\n", lmd->lmd_dev);
2523         PRINT_CMD(PRINT_MASK, "flags:   %x\n", lmd->lmd_flags);
2524
2525         if (lmd->lmd_opts)
2526                 PRINT_CMD(PRINT_MASK, "options: %s\n", lmd->lmd_opts);
2527
2528         if (lmd->lmd_recovery_time_soft)
2529                 PRINT_CMD(PRINT_MASK, "recovery time soft: %d\n",
2530                           lmd->lmd_recovery_time_soft);
2531
2532         if (lmd->lmd_recovery_time_hard)
2533                 PRINT_CMD(PRINT_MASK, "recovery time hard: %d\n",
2534                           lmd->lmd_recovery_time_hard);
2535
2536         for (i = 0; i < lmd->lmd_exclude_count; i++) {
2537                 PRINT_CMD(PRINT_MASK, "exclude %d:  OST%04x\n", i,
2538                           lmd->lmd_exclude[i]);
2539         }
2540 }
2541
2542 /* Is this server on the exclusion list */
2543 int lustre_check_exclusion(struct super_block *sb, char *svname)
2544 {
2545         struct lustre_sb_info *lsi = s2lsi(sb);
2546         struct lustre_mount_data *lmd = lsi->lsi_lmd;
2547         __u32 index;
2548         int i, rc;
2549         ENTRY;
2550
2551         rc = server_name2index(svname, &index, NULL);
2552         if (rc != LDD_F_SV_TYPE_OST)
2553                 /* Only exclude OSTs */
2554                 RETURN(0);
2555
2556         CDEBUG(D_MOUNT, "Check exclusion %s (%d) in %d of %s\n", svname,
2557                index, lmd->lmd_exclude_count, lmd->lmd_dev);
2558
2559         for(i = 0; i < lmd->lmd_exclude_count; i++) {
2560                 if (index == lmd->lmd_exclude[i]) {
2561                         CWARN("Excluding %s (on exclusion list)\n", svname);
2562                         RETURN(1);
2563                 }
2564         }
2565         RETURN(0);
2566 }
2567
2568 /* mount -v  -o exclude=lustre-OST0001:lustre-OST0002 -t lustre ... */
2569 static int lmd_make_exclusion(struct lustre_mount_data *lmd, char *ptr)
2570 {
2571         char *s1 = ptr, *s2;
2572         __u32 index, *exclude_list;
2573         int rc = 0, devmax;
2574         ENTRY;
2575
2576         /* The shortest an ost name can be is 8 chars: -OST0000.
2577            We don't actually know the fsname at this time, so in fact
2578            a user could specify any fsname. */
2579         devmax = strlen(ptr) / 8 + 1;
2580
2581         /* temp storage until we figure out how many we have */
2582         OBD_ALLOC(exclude_list, sizeof(index) * devmax);
2583         if (!exclude_list)
2584                 RETURN(-ENOMEM);
2585
2586         /* we enter this fn pointing at the '=' */
2587         while (*s1 && *s1 != ' ' && *s1 != ',') {
2588                 s1++;
2589                 rc = server_name2index(s1, &index, &s2);
2590                 if (rc < 0) {
2591                         CERROR("Can't parse server name '%s'\n", s1);
2592                         break;
2593                 }
2594                 if (rc == LDD_F_SV_TYPE_OST)
2595                         exclude_list[lmd->lmd_exclude_count++] = index;
2596                 else
2597                         CDEBUG(D_MOUNT, "ignoring exclude %.7s\n", s1);
2598                 s1 = s2;
2599                 /* now we are pointing at ':' (next exclude)
2600                    or ',' (end of excludes) */
2601                 if (lmd->lmd_exclude_count >= devmax)
2602                         break;
2603         }
2604         if (rc >= 0) /* non-err */
2605                 rc = 0;
2606
2607         if (lmd->lmd_exclude_count) {
2608                 /* permanent, freed in lustre_free_lsi */
2609                 OBD_ALLOC(lmd->lmd_exclude, sizeof(index) *
2610                           lmd->lmd_exclude_count);
2611                 if (lmd->lmd_exclude) {
2612                         memcpy(lmd->lmd_exclude, exclude_list,
2613                                sizeof(index) * lmd->lmd_exclude_count);
2614                 } else {
2615                         rc = -ENOMEM;
2616                         lmd->lmd_exclude_count = 0;
2617                 }
2618         }
2619         OBD_FREE(exclude_list, sizeof(index) * devmax);
2620         RETURN(rc);
2621 }
2622
2623 static int lmd_parse_mgssec(struct lustre_mount_data *lmd, char *ptr)
2624 {
2625         char   *tail;
2626         int     length;
2627
2628         if (lmd->lmd_mgssec != NULL) {
2629                 OBD_FREE(lmd->lmd_mgssec, strlen(lmd->lmd_mgssec) + 1);
2630                 lmd->lmd_mgssec = NULL;
2631         }
2632
2633         tail = strchr(ptr, ',');
2634         if (tail == NULL)
2635                 length = strlen(ptr);
2636         else
2637                 length = tail - ptr;
2638
2639         OBD_ALLOC(lmd->lmd_mgssec, length + 1);
2640         if (lmd->lmd_mgssec == NULL)
2641                 return -ENOMEM;
2642
2643         memcpy(lmd->lmd_mgssec, ptr, length);
2644         lmd->lmd_mgssec[length] = '\0';
2645         return 0;
2646 }
2647
2648 static int lmd_parse_string(char **handle, char *ptr)
2649 {
2650         char   *tail;
2651         int     length;
2652
2653         if ((handle == NULL) || (ptr == NULL))
2654                 return -EINVAL;
2655
2656         if (*handle != NULL) {
2657                 OBD_FREE(*handle, strlen(*handle) + 1);
2658                 *handle = NULL;
2659         }
2660
2661         tail = strchr(ptr, ',');
2662         if (tail == NULL)
2663                 length = strlen(ptr);
2664         else
2665                 length = tail - ptr;
2666
2667         OBD_ALLOC(*handle, length + 1);
2668         if (*handle == NULL)
2669                 return -ENOMEM;
2670
2671         memcpy(*handle, ptr, length);
2672         (*handle)[length] = '\0';
2673
2674         return 0;
2675 }
2676
2677 /* Collect multiple values for mgsnid specifiers */
2678 static int lmd_parse_mgs(struct lustre_mount_data *lmd, char **ptr)
2679 {
2680         lnet_nid_t nid;
2681         char *tail = *ptr;
2682         char *mgsnid;
2683         int   length;
2684         int   oldlen = 0;
2685
2686         /* Find end of nidlist */
2687         while (class_parse_nid_quiet(tail, &nid, &tail) == 0) {}
2688         length = tail - *ptr;
2689         if (length == 0) {
2690                 LCONSOLE_ERROR_MSG(0x159, "Can't parse NID '%s'\n", *ptr);
2691                 return -EINVAL;
2692         }
2693
2694         if (lmd->lmd_mgs != NULL)
2695                 oldlen = strlen(lmd->lmd_mgs) + 1;
2696
2697         OBD_ALLOC(mgsnid, oldlen + length + 1);
2698         if (mgsnid == NULL)
2699                 return -ENOMEM;
2700
2701         if (lmd->lmd_mgs != NULL) {
2702                 /* Multiple mgsnid= are taken to mean failover locations */
2703                 memcpy(mgsnid, lmd->lmd_mgs, oldlen);
2704                 mgsnid[oldlen - 1] = ':';
2705                 OBD_FREE(lmd->lmd_mgs, oldlen);
2706         }
2707         memcpy(mgsnid + oldlen, *ptr, length);
2708         mgsnid[oldlen + length] = '\0';
2709         lmd->lmd_mgs = mgsnid;
2710         *ptr = tail;
2711
2712         return 0;
2713 }
2714
2715 /** Parse mount line options
2716  * e.g. mount -v -t lustre -o abort_recov uml1:uml2:/lustre-client /mnt/lustre
2717  * dev is passed as device=uml1:/lustre by mount.lustre
2718  */
2719 static int lmd_parse(char *options, struct lustre_mount_data *lmd)
2720 {
2721         char *s1, *s2, *devname = NULL;
2722         struct lustre_mount_data *raw = (struct lustre_mount_data *)options;
2723         int rc = 0;
2724         ENTRY;
2725
2726         LASSERT(lmd);
2727         if (!options) {
2728                 LCONSOLE_ERROR_MSG(0x162, "Missing mount data: check that "
2729                                    "/sbin/mount.lustre is installed.\n");
2730                 RETURN(-EINVAL);
2731         }
2732
2733         /* Options should be a string - try to detect old lmd data */
2734         if ((raw->lmd_magic & 0xffffff00) == (LMD_MAGIC & 0xffffff00)) {
2735                 LCONSOLE_ERROR_MSG(0x163, "You're using an old version of "
2736                                    "/sbin/mount.lustre.  Please install "
2737                                    "version %s\n", LUSTRE_VERSION_STRING);
2738                 RETURN(-EINVAL);
2739         }
2740         lmd->lmd_magic = LMD_MAGIC;
2741
2742         OBD_ALLOC(lmd->lmd_params, 4096);
2743         if (lmd->lmd_params == NULL)
2744                 RETURN(-ENOMEM);
2745         lmd->lmd_params[0] = '\0';
2746
2747         /* Set default flags here */
2748
2749         s1 = options;
2750         while (*s1) {
2751                 int clear = 0;
2752                 int time_min = OBD_RECOVERY_TIME_MIN;
2753
2754                 /* Skip whitespace and extra commas */
2755                 while (*s1 == ' ' || *s1 == ',')
2756                         s1++;
2757
2758                 /* Client options are parsed in ll_options: eg. flock,
2759                    user_xattr, acl */
2760
2761                 /* Parse non-ldiskfs options here. Rather than modifying
2762                    ldiskfs, we just zero these out here */
2763                 if (strncmp(s1, "abort_recov", 11) == 0) {
2764                         lmd->lmd_flags |= LMD_FLG_ABORT_RECOV;
2765                         clear++;
2766                 } else if (strncmp(s1, "recovery_time_soft=", 19) == 0) {
2767                         lmd->lmd_recovery_time_soft = max_t(int,
2768                                 simple_strtoul(s1 + 19, NULL, 10), time_min);
2769                         clear++;
2770                 } else if (strncmp(s1, "recovery_time_hard=", 19) == 0) {
2771                         lmd->lmd_recovery_time_hard = max_t(int,
2772                                 simple_strtoul(s1 + 19, NULL, 10), time_min);
2773                         clear++;
2774                 } else if (strncmp(s1, "noir", 4) == 0) {
2775                         lmd->lmd_flags |= LMD_FLG_NOIR; /* test purpose only. */
2776                         clear++;
2777                 } else if (strncmp(s1, "nosvc", 5) == 0) {
2778                         lmd->lmd_flags |= LMD_FLG_NOSVC;
2779                         clear++;
2780                 } else if (strncmp(s1, "nomgs", 5) == 0) {
2781                         lmd->lmd_flags |= LMD_FLG_NOMGS;
2782                         clear++;
2783                 } else if (strncmp(s1, "noscrub", 7) == 0) {
2784                         lmd->lmd_flags |= LMD_FLG_NOSCRUB;
2785                         clear++;
2786                 } else if (strncmp(s1, PARAM_MGSNODE,
2787                                    sizeof(PARAM_MGSNODE) - 1) == 0) {
2788                         s2 = s1 + sizeof(PARAM_MGSNODE) - 1;
2789                         /* Assume the next mount opt is the first
2790                            invalid nid we get to. */
2791                         rc = lmd_parse_mgs(lmd, &s2);
2792                         if (rc)
2793                                 goto invalid;
2794                         clear++;
2795                 } else if (strncmp(s1, "writeconf", 9) == 0) {
2796                         lmd->lmd_flags |= LMD_FLG_WRITECONF;
2797                         clear++;
2798                 } else if (strncmp(s1, "virgin", 6) == 0) {
2799                         lmd->lmd_flags |= LMD_FLG_VIRGIN;
2800                         clear++;
2801                 } else if (strncmp(s1, "noprimnode", 10) == 0) {
2802                         lmd->lmd_flags |= LMD_FLG_NO_PRIMNODE;
2803                         clear++;
2804                 } else if (strncmp(s1, "mgssec=", 7) == 0) {
2805                         rc = lmd_parse_mgssec(lmd, s1 + 7);
2806                         if (rc)
2807                                 goto invalid;
2808                         clear++;
2809                 /* ost exclusion list */
2810                 } else if (strncmp(s1, "exclude=", 8) == 0) {
2811                         rc = lmd_make_exclusion(lmd, s1 + 7);
2812                         if (rc)
2813                                 goto invalid;
2814                         clear++;
2815                 } else if (strncmp(s1, "mgs", 3) == 0) {
2816                         /* We are an MGS */
2817                         lmd->lmd_flags |= LMD_FLG_MGS;
2818                         clear++;
2819                 } else if (strncmp(s1, "svname=", 7) == 0) {
2820                         rc = lmd_parse_string(&lmd->lmd_profile, s1 + 7);
2821                         if (rc)
2822                                 goto invalid;
2823                         clear++;
2824                 } else if (strncmp(s1, "param=", 6) == 0) {
2825                         int length;
2826                         char *tail = strchr(s1 + 6, ',');
2827                         if (tail == NULL)
2828                                 length = strlen(s1);
2829                         else
2830                                 length = tail - s1;
2831                         length -= 6;
2832                         strncat(lmd->lmd_params, s1 + 6, length);
2833                         strcat(lmd->lmd_params, " ");
2834                         clear++;
2835                 } else if (strncmp(s1, "osd=", 4) == 0) {
2836                         rc = lmd_parse_string(&lmd->lmd_osd_type, s1 + 4);
2837                         if (rc)
2838                                 goto invalid;
2839                         clear++;
2840                 }
2841                 /* Linux 2.4 doesn't pass the device, so we stuck it at the
2842                    end of the options. */
2843                 else if (strncmp(s1, "device=", 7) == 0) {
2844                         devname = s1 + 7;
2845                         /* terminate options right before device.  device
2846                            must be the last one. */
2847                         *s1 = '\0';
2848                         break;
2849                 }
2850
2851                 /* Find next opt */
2852                 s2 = strchr(s1, ',');
2853                 if (s2 == NULL) {
2854                         if (clear)
2855                                 *s1 = '\0';
2856                         break;
2857                 }
2858                 s2++;
2859                 if (clear)
2860                         memmove(s1, s2, strlen(s2) + 1);
2861                 else
2862                         s1 = s2;
2863         }
2864
2865         if (!devname) {
2866                 LCONSOLE_ERROR_MSG(0x164, "Can't find the device name "
2867                                    "(need mount option 'device=...')\n");
2868                 goto invalid;
2869         }
2870
2871         s1 = strstr(devname, ":/");
2872         if (s1) {
2873                 ++s1;
2874                 lmd->lmd_flags |= LMD_FLG_CLIENT;
2875                 /* Remove leading /s from fsname */
2876                 while (*++s1 == '/') ;
2877                 /* Freed in lustre_free_lsi */
2878                 OBD_ALLOC(lmd->lmd_profile, strlen(s1) + 8);
2879                 if (!lmd->lmd_profile)
2880                         RETURN(-ENOMEM);
2881                 sprintf(lmd->lmd_profile, "%s-client", s1);
2882         }
2883
2884         /* Freed in lustre_free_lsi */
2885         OBD_ALLOC(lmd->lmd_dev, strlen(devname) + 1);
2886         if (!lmd->lmd_dev)
2887                 RETURN(-ENOMEM);
2888         strcpy(lmd->lmd_dev, devname);
2889
2890         /* Save mount options */
2891         s1 = options + strlen(options) - 1;
2892         while (s1 >= options && (*s1 == ',' || *s1 == ' '))
2893                 *s1-- = 0;
2894         if (*options != 0) {
2895                 /* Freed in lustre_free_lsi */
2896                 OBD_ALLOC(lmd->lmd_opts, strlen(options) + 1);
2897                 if (!lmd->lmd_opts)
2898                         RETURN(-ENOMEM);
2899                 strcpy(lmd->lmd_opts, options);
2900         }
2901
2902         lmd_print(lmd);
2903         lmd->lmd_magic = LMD_MAGIC;
2904
2905         RETURN(rc);
2906
2907 invalid:
2908         CERROR("Bad mount options %s\n", options);
2909         RETURN(-EINVAL);
2910 }
2911
2912 struct lustre_mount_data2 {
2913         void *lmd2_data;
2914         struct vfsmount *lmd2_mnt;
2915 };
2916
2917 /** This is the entry point for the mount call into Lustre.
2918  * This is called when a server or client is mounted,
2919  * and this is where we start setting things up.
2920  * @param data Mount options (e.g. -o flock,abort_recov)
2921  */
2922 int lustre_fill_super(struct super_block *sb, void *data, int silent)
2923 {
2924         struct lustre_mount_data *lmd;
2925         struct lustre_mount_data2 *lmd2 = data;
2926         struct lustre_sb_info *lsi;
2927         int rc;
2928         ENTRY;
2929
2930         CDEBUG(D_MOUNT|D_VFSTRACE, "VFS Op: sb %p\n", sb);
2931
2932         lsi = lustre_init_lsi(sb);
2933         if (!lsi)
2934                 RETURN(-ENOMEM);
2935         lmd = lsi->lsi_lmd;
2936
2937         /*
2938          * Disable lockdep during mount, because mount locking patterns are
2939          * `special'.
2940          */
2941         lockdep_off();
2942
2943         /*
2944          * LU-639: the obd cleanup of last mount may not finish yet, wait here.
2945          */
2946         obd_zombie_barrier();
2947
2948         /* Figure out the lmd from the mount options */
2949         if (lmd_parse((char *)(lmd2->lmd2_data), lmd)) {
2950                 lustre_put_lsi(sb);
2951                 GOTO(out, rc = -EINVAL);
2952         }
2953
2954         if (lmd_is_client(lmd)) {
2955                 CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
2956                 if (!client_fill_super) {
2957                         LCONSOLE_ERROR_MSG(0x165, "Nothing registered for "
2958                                            "client mount! Is the 'lustre' "
2959                                            "module loaded?\n");
2960                         lustre_put_lsi(sb);
2961                         rc = -ENODEV;
2962                 } else {
2963                         rc = lustre_start_mgc(sb);
2964                         if (rc) {
2965                                 lustre_put_lsi(sb);
2966                                 GOTO(out, rc);
2967                         }
2968                         /* Connect and start */
2969                         /* (should always be ll_fill_super) */
2970                         rc = (*client_fill_super)(sb, lmd2->lmd2_mnt);
2971                         /* c_f_s will call lustre_common_put_super on failure */
2972                 }
2973         } else {
2974                 CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
2975                 rc = server_fill_super(sb);
2976                 /* s_f_s calls lustre_start_mgc after the mount because we need
2977                    the MGS nids which are stored on disk.  Plus, we may
2978                    need to start the MGS first. */
2979                 /* s_f_s will call server_put_super on failure */
2980         }
2981
2982         /* If error happens in fill_super() call, @lsi will be killed there.
2983          * This is why we do not put it here. */
2984         GOTO(out, rc);
2985 out:
2986         if (rc) {
2987                 CERROR("Unable to mount %s (%d)\n",
2988                        s2lsi(sb) ? lmd->lmd_dev : "", rc);
2989         } else {
2990                 CDEBUG(D_SUPER, "Mount %s complete\n",
2991                        lmd->lmd_dev);
2992         }
2993         lockdep_on();
2994         return rc;
2995 }
2996
2997
2998 /* We can't call ll_fill_super by name because it lives in a module that
2999    must be loaded after this one. */
3000 void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb,
3001                                                   struct vfsmount *mnt))
3002 {
3003         client_fill_super = cfs;
3004 }
3005 EXPORT_SYMBOL(lustre_register_client_fill_super);
3006
3007 void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb))
3008 {
3009         kill_super_cb = cfs;
3010 }
3011 EXPORT_SYMBOL(lustre_register_kill_super_cb);
3012
3013 /***************** FS registration ******************/
3014 #ifdef HAVE_FSTYPE_MOUNT
3015 struct dentry *lustre_mount(struct file_system_type *fs_type, int flags,
3016                                 const char *devname, void *data)
3017 {
3018         struct lustre_mount_data2 lmd2 = { data, NULL };
3019
3020         return mount_nodev(fs_type, flags, &lmd2, lustre_fill_super);
3021 }
3022 #else
3023 int lustre_get_sb(struct file_system_type *fs_type, int flags,
3024                   const char *devname, void * data, struct vfsmount *mnt)
3025 {
3026         struct lustre_mount_data2 lmd2 = { data, mnt };
3027
3028         return get_sb_nodev(fs_type, flags, &lmd2, lustre_fill_super, mnt);
3029 }
3030 #endif
3031
3032 void lustre_kill_super(struct super_block *sb)
3033 {
3034         struct lustre_sb_info *lsi = s2lsi(sb);
3035
3036         if (kill_super_cb && lsi && !IS_SERVER(lsi))
3037                 (*kill_super_cb)(sb);
3038
3039         kill_anon_super(sb);
3040 }
3041
3042 /** Register the "lustre" fs type
3043  */
3044 struct file_system_type lustre_fs_type = {
3045         .owner        = THIS_MODULE,
3046         .name         = "lustre",
3047 #ifdef HAVE_FSTYPE_MOUNT
3048         .mount        = lustre_mount,
3049 #else
3050         .get_sb       = lustre_get_sb,
3051 #endif
3052         .kill_sb      = lustre_kill_super,
3053         .fs_flags     = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV |
3054                         FS_HAS_FIEMAP | FS_RENAME_DOES_D_MOVE,
3055 };
3056
3057 int lustre_register_fs(void)
3058 {
3059         return register_filesystem(&lustre_fs_type);
3060 }
3061
3062 int lustre_unregister_fs(void)
3063 {
3064         return unregister_filesystem(&lustre_fs_type);
3065 }
3066
3067 EXPORT_SYMBOL(server_mti_print);