Whamcloud - gitweb
LU-1842 osp: osp-on-ost device
[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 CFS_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         cfs_mutex_lock(&lustre_mount_info_lock);
109
110         if (server_find_mount(name)) {
111                 cfs_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         cfs_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         cfs_mutex_lock(&lustre_mount_info_lock);
136         lmi = server_find_mount(name);
137         if (!lmi) {
138                 cfs_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         cfs_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         cfs_mutex_lock(&lustre_mount_info_lock);
163         lmi = server_find_mount(name);
164         cfs_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         cfs_mutex_lock(&lustre_mount_info_lock);
191         lmi = server_find_mount(name);
192         cfs_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         cfs_mutex_lock(&lustre_mount_info_lock);
210         lmi = server_find_mount(name);
211         cfs_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 CFS_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         cfs_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         cfs_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         cfs_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         cfs_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 CFS_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         cfs_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                         cfs_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         cfs_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         cfs_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         cfs_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         cfs_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         cfs_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                 } else if (clli->cfg_flags == (CFG_F_MARKER | CFG_F_SKIP)) {
1290                         rc = class_add_uuid(lustre_cfg_string(lcfg, 1),
1291                                         lcfg->lcfg_nid);
1292                         if (rc)
1293                                 CERROR("%s: Fail to add uuid, rc:%d\n",
1294                                        lsi->lsi_svname, rc);
1295                 }
1296                 break;
1297         }
1298         case LCFG_ADD_CONN: {
1299                 if (is_mdc_for_mdt0(lustre_cfg_string(lcfg, 0)))
1300                         rc = lustre_osp_add_conn(lcfg, lsi);
1301                 break;
1302         }
1303         default:
1304                 break;
1305         }
1306 out:
1307         RETURN(rc);
1308 }
1309
1310 static int lustre_disconnect_osp(struct super_block *sb)
1311 {
1312         struct lustre_sb_info           *lsi = s2lsi(sb);
1313         struct obd_device               *osp;
1314         char                            *ospname = NULL;
1315         char                            *logname = NULL;
1316         struct lustre_cfg               *lcfg = NULL;
1317         struct lustre_cfg_bufs          *bufs = NULL;
1318         struct config_llog_instance     *cfg = NULL;
1319         int                              rc;
1320         ENTRY;
1321
1322         LASSERT(IS_OST(lsi) || IS_MDT(lsi));
1323         OBD_ALLOC(logname, MTI_NAME_MAXLEN);
1324         if (logname == NULL)
1325                 RETURN(-ENOMEM);
1326
1327         OBD_ALLOC(ospname, MTI_NAME_MAXLEN);
1328         if (ospname == NULL)
1329                 GOTO(out, rc = -ENOMEM);
1330
1331         rc = server_name2fsname(lsi->lsi_svname, ospname, NULL);
1332         if (rc != 0) {
1333                 CERROR("%s: get fsname error: %d\n",
1334                        lsi->lsi_svname, rc);
1335                 GOTO(out, rc);
1336         }
1337         sprintf(logname, "%s-client", ospname);
1338
1339         OBD_ALLOC_PTR(cfg);
1340         if (cfg == NULL)
1341                 GOTO(out, rc = -ENOMEM);
1342
1343         /* end log first */
1344         cfg->cfg_instance = sb;
1345         rc = lustre_end_log(sb, logname, cfg);
1346         if (rc != 0) {
1347                 CERROR("Can't end config log %s\n", ospname);
1348                 GOTO(out, rc);
1349         }
1350
1351         rc = tgt_name2ospname(lsi->lsi_svname, ospname);
1352         if (rc != 0) {
1353                 CERROR("%s: get osp name error: %d\n",
1354                        lsi->lsi_svname, rc);
1355                 GOTO(out, rc);
1356         }
1357
1358         osp = class_name2obd(ospname);
1359         if (osp == NULL) {
1360                 CERROR("Can't find osp-on-ost %s\n", ospname);
1361                 GOTO(out, rc = -ENOENT);
1362         }
1363
1364         OBD_ALLOC_PTR(bufs);
1365         if (bufs == NULL)
1366                 GOTO(out, rc = -ENOMEM);
1367
1368         lustre_cfg_bufs_reset(bufs, osp->obd_name);
1369         lustre_cfg_bufs_set_string(bufs, 1, NULL);
1370         lcfg = lustre_cfg_new(LCFG_CLEANUP, bufs);
1371         if (!lcfg)
1372                 GOTO(out, rc = -ENOMEM);
1373
1374         /* Disconnect import first. NULL is passed for the '@env', since
1375          * it will not be used for the 'osp-on-ost'. (see osp_shutdown()) */
1376         rc = osp->obd_lu_dev->ld_ops->ldo_process_config(NULL, osp->obd_lu_dev,
1377                                                          lcfg);
1378 out:
1379         if (lcfg)
1380                 lustre_cfg_free(lcfg);
1381         if (bufs)
1382                 OBD_FREE_PTR(bufs);
1383         if (cfg)
1384                 OBD_FREE_PTR(cfg);
1385         if (ospname)
1386                 OBD_FREE(ospname, MTI_NAME_MAXLEN);
1387         if (logname)
1388                 OBD_FREE(logname, MTI_NAME_MAXLEN);
1389         RETURN(rc);
1390 }
1391
1392 /**
1393  * Stop the osp(fsname-MDT0000-osp-OSTxxxx) for an OST target.
1394  **/
1395 static int lustre_stop_osp(struct super_block *sb)
1396 {
1397         struct lustre_sb_info   *lsi = s2lsi(sb);
1398         struct obd_device       *osp = NULL;
1399         char                    *ospname = NULL;
1400         int                      rc = 0;
1401         ENTRY;
1402
1403         LASSERT(IS_OST(lsi) || IS_MDT(lsi));
1404         OBD_ALLOC(ospname, MTI_NAME_MAXLEN);
1405
1406         rc = tgt_name2ospname(lsi->lsi_svname, ospname);
1407         if (rc != 0) {
1408                 CERROR("%s get fsname error: rc %d\n",
1409                        lsi->lsi_svname, rc);
1410                 GOTO(cleanup, rc);
1411         }
1412
1413         osp = class_name2obd(ospname);
1414         if (osp == NULL) {
1415                 CERROR("Can not find osp-on-ost %s\n", ospname);
1416                 GOTO(cleanup, rc = -ENOENT);
1417         }
1418
1419         osp->obd_force = 1;
1420         rc = class_manual_cleanup(osp);
1421
1422 cleanup:
1423         if (ospname != NULL)
1424                 OBD_FREE(ospname, MTI_NAME_MAXLEN);
1425         RETURN(rc);
1426 }
1427
1428 CFS_DEFINE_MUTEX(server_start_lock);
1429
1430 /* Stop MDS/OSS if nobody is using them */
1431 static int server_stop_servers(int lsiflags)
1432 {
1433         struct obd_device *obd = NULL;
1434         struct obd_type *type = NULL;
1435         int rc = 0;
1436         ENTRY;
1437
1438         cfs_mutex_lock(&server_start_lock);
1439
1440         /* Either an MDT or an OST or neither  */
1441         /* if this was an MDT, and there are no more MDT's, clean up the MDS */
1442         if ((lsiflags & LDD_F_SV_TYPE_MDT) &&
1443             (obd = class_name2obd(LUSTRE_MDS_OBDNAME))) {
1444                 /*FIXME pre-rename, should eventually be LUSTRE_MDT_NAME*/
1445                 type = class_search_type(LUSTRE_MDS_NAME);
1446         }
1447         /* if this was an OST, and there are no more OST's, clean up the OSS */
1448         if ((lsiflags & LDD_F_SV_TYPE_OST) &&
1449             (obd = class_name2obd(LUSTRE_OSS_OBDNAME))) {
1450                 type = class_search_type(LUSTRE_OST_NAME);
1451         }
1452
1453         if (obd && (!type || !type->typ_refcnt)) {
1454                 int err;
1455                 obd->obd_force = 1;
1456                 /* obd_fail doesn't mean much on a server obd */
1457                 err = class_manual_cleanup(obd);
1458                 if (!rc)
1459                         rc = err;
1460         }
1461
1462         cfs_mutex_unlock(&server_start_lock);
1463
1464         RETURN(rc);
1465 }
1466
1467 int server_mti_print(char *title, struct mgs_target_info *mti)
1468 {
1469         PRINT_CMD(PRINT_MASK, "mti %s\n", title);
1470         PRINT_CMD(PRINT_MASK, "server: %s\n", mti->mti_svname);
1471         PRINT_CMD(PRINT_MASK, "fs:     %s\n", mti->mti_fsname);
1472         PRINT_CMD(PRINT_MASK, "uuid:   %s\n", mti->mti_uuid);
1473         PRINT_CMD(PRINT_MASK, "ver: %d  flags: %#x\n",
1474                   mti->mti_config_ver, mti->mti_flags);
1475         return(0);
1476 }
1477
1478 /**
1479  * Get service name (svname) from string
1480  * rc < 0 on error
1481  * if endptr isn't NULL it is set to end of fsname *
1482  */
1483 int server_name2svname(char *label, char *svname, char **endptr)
1484 {
1485         int rc;
1486         char *dash;
1487
1488         /* We use server_name2fsname() just for parsing */
1489         rc = server_name2fsname(label, NULL, &dash);
1490         if (rc != 0)
1491                 return rc;
1492
1493         if (*dash != '-')
1494                 return -1;
1495
1496         strncpy(svname, dash + 1, MTI_NAME_MAXLEN);
1497
1498         return 0;
1499 }
1500 EXPORT_SYMBOL(server_name2svname);
1501
1502
1503 /* Get the index from the obd name.
1504    rc = server type, or
1505    rc < 0  on error
1506    if endptr isn't NULL it is set to end of name */
1507 int server_name2index(char *svname, __u32 *idx, char **endptr)
1508 {
1509         unsigned long index;
1510         int rc;
1511         char *dash;
1512
1513         /* We use server_name2fsname() just for parsing */
1514         rc = server_name2fsname(svname, NULL, &dash);
1515         if (rc != 0)
1516                 return rc;
1517
1518         if (*dash != '-')
1519                 return -EINVAL;
1520
1521         dash++;
1522
1523         if (strncmp(dash, "MDT", 3) == 0)
1524                 rc = LDD_F_SV_TYPE_MDT;
1525         else if (strncmp(dash, "OST", 3) == 0)
1526                 rc = LDD_F_SV_TYPE_OST;
1527         else
1528                 return -EINVAL;
1529
1530         dash += 3;
1531
1532         if (strcmp(dash, "all") == 0)
1533                 return rc | LDD_F_SV_ALL;
1534
1535         index = simple_strtoul(dash, endptr, 16);
1536         *idx = index;
1537
1538         return rc;
1539 }
1540 EXPORT_SYMBOL(server_name2index);
1541
1542 /* Generate data for registration */
1543 static int server_lsi2mti(struct lustre_sb_info *lsi,
1544                           struct mgs_target_info *mti)
1545 {
1546         lnet_process_id_t id;
1547         int rc, i = 0;
1548         ENTRY;
1549
1550         if (!IS_SERVER(lsi))
1551                 RETURN(-EINVAL);
1552
1553         strncpy(mti->mti_svname, lsi->lsi_svname, sizeof(mti->mti_svname));
1554
1555         mti->mti_nid_count = 0;
1556         while (LNetGetId(i++, &id) != -ENOENT) {
1557                 if (LNET_NETTYP(LNET_NIDNET(id.nid)) == LOLND)
1558                         continue;
1559
1560                 /* server use --servicenode param, only allow specified
1561                  * nids be registered */
1562                 if ((lsi->lsi_lmd->lmd_flags & LMD_FLG_NO_PRIMNODE) != 0 &&
1563                     class_match_nid(lsi->lsi_lmd->lmd_params,
1564                                     PARAM_FAILNODE, id.nid) < 1)
1565                         continue;
1566
1567                 /* match specified network */
1568                 if (!class_match_net(lsi->lsi_lmd->lmd_params,
1569                                      PARAM_NETWORK, LNET_NIDNET(id.nid)))
1570                         continue;
1571
1572                 mti->mti_nids[mti->mti_nid_count] = id.nid;
1573                 mti->mti_nid_count++;
1574                 if (mti->mti_nid_count >= MTI_NIDS_MAX) {
1575                         CWARN("Only using first %d nids for %s\n",
1576                               mti->mti_nid_count, mti->mti_svname);
1577                         break;
1578                 }
1579         }
1580
1581         mti->mti_lustre_ver = LUSTRE_VERSION_CODE;
1582         mti->mti_config_ver = 0;
1583
1584         rc = server_name2fsname(lsi->lsi_svname, mti->mti_fsname, NULL);
1585         if (rc != 0)
1586                 return rc;
1587
1588         rc = server_name2index(lsi->lsi_svname, &mti->mti_stripe_index, NULL);
1589         if (rc < 0)
1590                 return rc;
1591         /* Orion requires index to be set */
1592         LASSERT(!(rc & LDD_F_NEED_INDEX));
1593         /* keep only LDD flags */
1594         mti->mti_flags = lsi->lsi_flags & LDD_F_MASK;
1595         mti->mti_flags |= LDD_F_UPDATE;
1596         strncpy(mti->mti_params, lsi->lsi_lmd->lmd_params,
1597                 sizeof(mti->mti_params));
1598         return 0;
1599 }
1600
1601 /* Register an old or new target with the MGS. If needed MGS will construct
1602    startup logs and assign index */
1603 static int server_register_target(struct lustre_sb_info *lsi)
1604 {
1605         struct obd_device *mgc = lsi->lsi_mgc;
1606         struct mgs_target_info *mti = NULL;
1607         bool writeconf;
1608         int rc;
1609         ENTRY;
1610
1611         LASSERT(mgc);
1612
1613         if (!IS_SERVER(lsi))
1614                 RETURN(-EINVAL);
1615
1616         OBD_ALLOC_PTR(mti);
1617         if (!mti)
1618                 RETURN(-ENOMEM);
1619
1620         rc = server_lsi2mti(lsi, mti);
1621         if (rc)
1622                 GOTO(out, rc);
1623
1624         CDEBUG(D_MOUNT, "Registration %s, fs=%s, %s, index=%04x, flags=%#x\n",
1625                mti->mti_svname, mti->mti_fsname,
1626                libcfs_nid2str(mti->mti_nids[0]), mti->mti_stripe_index,
1627                mti->mti_flags);
1628
1629         /* if write_conf is true, the registration must succeed */
1630         writeconf = !!(lsi->lsi_flags & (LDD_F_NEED_INDEX | LDD_F_UPDATE));
1631         mti->mti_flags |= LDD_F_OPC_REG;
1632
1633         /* Register the target */
1634         /* FIXME use mgc_process_config instead */
1635         rc = obd_set_info_async(NULL, mgc->u.cli.cl_mgc_mgsexp,
1636                                 sizeof(KEY_REGISTER_TARGET), KEY_REGISTER_TARGET,
1637                                 sizeof(*mti), mti, NULL);
1638         if (rc) {
1639                 if (mti->mti_flags & LDD_F_ERROR) {
1640                         LCONSOLE_ERROR_MSG(0x160,
1641                                 "The MGS is refusing to allow this "
1642                                 "server (%s) to start. Please see messages"
1643                                 " on the MGS node.\n", lsi->lsi_svname);
1644                 } else if (writeconf) {
1645                         LCONSOLE_ERROR_MSG(0x15f,
1646                                 "Communication to the MGS return error %d. "
1647                                 "Is the MGS running?\n", rc);
1648                 } else {
1649                         CERROR("Cannot talk to the MGS: %d, not fatal\n", rc);
1650                         /* reset the error code for non-fatal error. */
1651                         rc = 0;
1652                 }
1653                 GOTO(out, rc);
1654         }
1655
1656 out:
1657         if (mti)
1658                 OBD_FREE_PTR(mti);
1659         RETURN(rc);
1660 }
1661
1662 /**
1663  * Notify the MGS that this target is ready.
1664  * Used by IR - if the MGS receives this message, it will notify clients.
1665  */
1666 static int server_notify_target(struct super_block *sb, struct obd_device *obd)
1667 {
1668         struct lustre_sb_info *lsi = s2lsi(sb);
1669         struct obd_device *mgc = lsi->lsi_mgc;
1670         struct mgs_target_info *mti = NULL;
1671         int rc;
1672         ENTRY;
1673
1674         LASSERT(mgc);
1675
1676         if (!(IS_SERVER(lsi)))
1677                 RETURN(-EINVAL);
1678
1679         OBD_ALLOC_PTR(mti);
1680         if (!mti)
1681                 RETURN(-ENOMEM);
1682         rc = server_lsi2mti(lsi, mti);
1683         if (rc)
1684                 GOTO(out, rc);
1685
1686         mti->mti_instance = obd->u.obt.obt_instance;
1687         mti->mti_flags |= LDD_F_OPC_READY;
1688
1689         /* FIXME use mgc_process_config instead */
1690         rc = obd_set_info_async(NULL, mgc->u.cli.cl_mgc_mgsexp,
1691                                 sizeof(KEY_REGISTER_TARGET),
1692                                 KEY_REGISTER_TARGET,
1693                                 sizeof(*mti), mti, NULL);
1694
1695         /* Imperative recovery: if the mgs informs us to use IR? */
1696         if (!rc && !(mti->mti_flags & LDD_F_ERROR) &&
1697             (mti->mti_flags & LDD_F_IR_CAPABLE))
1698                 lsi->lsi_flags |= LDD_F_IR_CAPABLE;
1699
1700 out:
1701         if (mti)
1702                 OBD_FREE_PTR(mti);
1703         RETURN(rc);
1704
1705 }
1706
1707 /**
1708  * Start the osp(fsname-MDT0000-osp-OSTxxxx) for an OST target,
1709  * which would be used to communicate with MDT0 for quota and FID.
1710  **/
1711 static int lustre_start_osp(struct super_block *sb)
1712 {
1713         struct lustre_sb_info       *lsi = s2lsi(sb);
1714         struct config_llog_instance *cfg = NULL;
1715         struct obd_device           *osp;
1716         char                        *ospname = NULL;
1717         char                        *logname = NULL;
1718         char                        *tgt;
1719         int                          rc;
1720         ENTRY;
1721
1722         LASSERT(IS_OST(lsi) || IS_MDT(lsi));
1723         OBD_ALLOC(ospname, MTI_NAME_MAXLEN);
1724         OBD_ALLOC(logname, MTI_NAME_MAXLEN);
1725         if (ospname == NULL || logname == NULL)
1726                 GOTO(cleanup, rc = -ENOMEM);
1727
1728         rc = server_name2fsname(lsi->lsi_svname, ospname, &tgt);
1729         if (rc != 0) {
1730                 CERROR("%s change fsname error: rc %d\n",
1731                        lsi->lsi_svname, rc);
1732                 GOTO(cleanup, rc);
1733         }
1734         sprintf(logname, "%s-client", ospname);
1735
1736         rc = tgt_name2ospname(lsi->lsi_svname, ospname);
1737         if (rc != 0) {
1738                 CERROR("%s change ospname error: rc %d\n",
1739                        lsi->lsi_svname, rc);
1740                 GOTO(cleanup, rc);
1741         }
1742
1743         osp = class_name2obd(ospname);
1744         if (osp != NULL)
1745                 GOTO(cleanup, rc = 0);
1746
1747         OBD_ALLOC_PTR(cfg);
1748         if (cfg == NULL)
1749                 GOTO(cleanup, rc = -ENOMEM);
1750
1751         cfg->cfg_callback = client_osp_config_process;
1752         cfg->cfg_instance = sb;
1753
1754         rc = lustre_process_log(sb, logname, cfg);
1755
1756 cleanup:
1757         if (ospname != NULL)
1758                 OBD_FREE(ospname, MTI_NAME_MAXLEN);
1759         if (logname != NULL)
1760                 OBD_FREE(logname, MTI_NAME_MAXLEN);
1761         if (cfg != NULL)
1762                 OBD_FREE_PTR(cfg);
1763
1764         RETURN(rc);
1765 }
1766
1767 /** Start server targets: MDTs and OSTs
1768  */
1769 static int server_start_targets(struct super_block *sb, struct vfsmount *mnt)
1770 {
1771         struct obd_device *obd;
1772         struct lustre_sb_info *lsi = s2lsi(sb);
1773         struct config_llog_instance cfg;
1774         struct lu_env env;
1775         struct lu_device *dev;
1776         int rc;
1777         ENTRY;
1778
1779         CDEBUG(D_MOUNT, "starting target %s\n", lsi->lsi_svname);
1780
1781 #if 0
1782         /* If we're an MDT, make sure the global MDS is running */
1783         if (lsi->lsi_ldd->ldd_flags & LDD_F_SV_TYPE_MDT) {
1784                 /* make sure the MDS is started */
1785                 cfs_mutex_lock(&server_start_lock);
1786                 obd = class_name2obd(LUSTRE_MDS_OBDNAME);
1787                 if (!obd) {
1788                         rc = lustre_start_simple(LUSTRE_MDS_OBDNAME,
1789                     /* FIXME pre-rename, should eventually be LUSTRE_MDS_NAME */
1790                                                  LUSTRE_MDT_NAME,
1791                                                  LUSTRE_MDS_OBDNAME"_uuid",
1792                                                  0, 0);
1793                         if (rc) {
1794                                 cfs_mutex_unlock(&server_start_lock);
1795                                 CERROR("failed to start MDS: %d\n", rc);
1796                                 RETURN(rc);
1797                         }
1798                 }
1799                 cfs_mutex_unlock(&server_start_lock);
1800         }
1801 #endif
1802
1803         /* If we're an OST, make sure the global OSS is running */
1804         if (IS_OST(lsi)) {
1805                 /* make sure OSS is started */
1806                 cfs_mutex_lock(&server_start_lock);
1807                 obd = class_name2obd(LUSTRE_OSS_OBDNAME);
1808                 if (!obd) {
1809                         rc = lustre_start_simple(LUSTRE_OSS_OBDNAME,
1810                                                  LUSTRE_OSS_NAME,
1811                                                  LUSTRE_OSS_OBDNAME"_uuid",
1812                                                  0, 0, 0, 0);
1813                         if (rc) {
1814                                 cfs_mutex_unlock(&server_start_lock);
1815                                 CERROR("failed to start OSS: %d\n", rc);
1816                                 RETURN(rc);
1817                         }
1818                 }
1819                 cfs_mutex_unlock(&server_start_lock);
1820         }
1821
1822         /* Set the mgc fs to our server disk.  This allows the MGC to
1823          * read and write configs locally, in case it can't talk to the MGS. */
1824         if (lsi->lsi_srv_mnt) {
1825                 rc = server_mgc_set_fs(lsi->lsi_mgc, sb);
1826                 if (rc)
1827                         RETURN(rc);
1828         }
1829
1830         /* Register with MGS */
1831         rc = server_register_target(lsi);
1832         if (rc)
1833                 GOTO(out_mgc, rc);
1834
1835         /* Let the target look up the mount using the target's name
1836            (we can't pass the sb or mnt through class_process_config.) */
1837         rc = server_register_mount(lsi->lsi_svname, sb, mnt);
1838         if (rc)
1839                 GOTO(out_mgc, rc);
1840
1841         /* Start targets using the llog named for the target */
1842         memset(&cfg, 0, sizeof(cfg));
1843         cfg.cfg_callback = class_config_llog_handler;
1844         rc = lustre_process_log(sb, lsi->lsi_svname, &cfg);
1845         if (rc) {
1846                 CERROR("failed to start server %s: %d\n",
1847                        lsi->lsi_svname, rc);
1848                 /* Do NOT call server_deregister_mount() here. This makes it
1849                  * impossible to find mount later in cleanup time and leaves
1850                  * @lsi and othder stuff leaked. -umka */
1851                 GOTO(out_mgc, rc);
1852         }
1853
1854         obd = class_name2obd(lsi->lsi_svname);
1855         if (!obd) {
1856                 CERROR("no server named %s was started\n", lsi->lsi_svname);
1857                 GOTO(out_mgc, rc = -ENXIO);
1858         }
1859
1860         if (IS_OST(lsi) || IS_MDT(lsi)) {
1861                 rc = lustre_start_osp(sb);
1862                 if (rc) {
1863                         CERROR("%s: failed to start OSP: %d\n",
1864                                lsi->lsi_svname, rc);
1865                         GOTO(out_mgc, rc);
1866                 }
1867         }
1868
1869         server_notify_target(sb, obd);
1870
1871         /* calculate recovery timeout, do it after lustre_process_log */
1872         server_calc_timeout(lsi, obd);
1873
1874         /* log has been fully processed */
1875         obd_notify(obd, NULL, OBD_NOTIFY_CONFIG, (void *)CONFIG_LOG);
1876
1877         /* log has been fully processed, let clients connect */
1878         dev = obd->obd_lu_dev;
1879         if (dev && dev->ld_ops->ldo_prepare) {
1880                 rc = lu_env_init(&env, dev->ld_type->ldt_ctx_tags);
1881                 if (rc == 0) {
1882                         struct lu_context  session_ctx;
1883
1884                         lu_context_init(&session_ctx, LCT_SESSION);
1885                         session_ctx.lc_thread = NULL;
1886                         lu_context_enter(&session_ctx);
1887                         env.le_ses = &session_ctx;
1888
1889                         dev->ld_ops->ldo_prepare(&env, NULL, dev);
1890
1891                         lu_env_fini(&env);
1892                         lu_context_exit(&session_ctx);
1893                         lu_context_fini(&session_ctx);
1894                 }
1895         }
1896
1897         /* abort recovery only on the complete stack:
1898          * many devices can be involved */
1899         if ((lsi->lsi_lmd->lmd_flags & LMD_FLG_ABORT_RECOV) &&
1900             (OBP(obd, iocontrol))) {
1901                 obd_iocontrol(OBD_IOC_ABORT_RECOVERY, obd->obd_self_export, 0,
1902                               NULL, NULL);
1903         }
1904
1905 out_mgc:
1906         /* Release the mgc fs for others to use */
1907         if (lsi->lsi_srv_mnt)
1908                 server_mgc_clear_fs(lsi->lsi_mgc);
1909
1910         RETURN(rc);
1911 }
1912
1913 /***************** lustre superblock **************/
1914
1915 struct lustre_sb_info *lustre_init_lsi(struct super_block *sb)
1916 {
1917         struct lustre_sb_info *lsi;
1918         ENTRY;
1919
1920         OBD_ALLOC_PTR(lsi);
1921         if (!lsi)
1922                 RETURN(NULL);
1923         OBD_ALLOC_PTR(lsi->lsi_lmd);
1924         if (!lsi->lsi_lmd) {
1925                 OBD_FREE_PTR(lsi);
1926                 RETURN(NULL);
1927         }
1928
1929         lsi->lsi_lmd->lmd_exclude_count = 0;
1930         lsi->lsi_lmd->lmd_recovery_time_soft = 0;
1931         lsi->lsi_lmd->lmd_recovery_time_hard = 0;
1932         s2lsi_nocast(sb) = lsi;
1933         /* we take 1 extra ref for our setup */
1934         cfs_atomic_set(&lsi->lsi_mounts, 1);
1935
1936         /* Default umount style */
1937         lsi->lsi_flags = LSI_UMOUNT_FAILOVER;
1938
1939         RETURN(lsi);
1940 }
1941
1942 static int lustre_free_lsi(struct super_block *sb)
1943 {
1944         struct lustre_sb_info *lsi = s2lsi(sb);
1945         ENTRY;
1946
1947         LASSERT(lsi != NULL);
1948         CDEBUG(D_MOUNT, "Freeing lsi %p\n", lsi);
1949
1950         /* someone didn't call server_put_mount. */
1951         LASSERT(cfs_atomic_read(&lsi->lsi_mounts) == 0);
1952
1953         if (lsi->lsi_lmd != NULL) {
1954                 if (lsi->lsi_lmd->lmd_dev != NULL)
1955                         OBD_FREE(lsi->lsi_lmd->lmd_dev,
1956                                  strlen(lsi->lsi_lmd->lmd_dev) + 1);
1957                 if (lsi->lsi_lmd->lmd_profile != NULL)
1958                         OBD_FREE(lsi->lsi_lmd->lmd_profile,
1959                                  strlen(lsi->lsi_lmd->lmd_profile) + 1);
1960                 if (lsi->lsi_lmd->lmd_mgssec != NULL)
1961                         OBD_FREE(lsi->lsi_lmd->lmd_mgssec,
1962                                  strlen(lsi->lsi_lmd->lmd_mgssec) + 1);
1963                 if (lsi->lsi_lmd->lmd_opts != NULL)
1964                         OBD_FREE(lsi->lsi_lmd->lmd_opts,
1965                                  strlen(lsi->lsi_lmd->lmd_opts) + 1);
1966                 if (lsi->lsi_lmd->lmd_exclude_count)
1967                         OBD_FREE(lsi->lsi_lmd->lmd_exclude,
1968                                  sizeof(lsi->lsi_lmd->lmd_exclude[0]) *
1969                                  lsi->lsi_lmd->lmd_exclude_count);
1970                 if (lsi->lsi_lmd->lmd_mgs != NULL)
1971                         OBD_FREE(lsi->lsi_lmd->lmd_mgs,
1972                                  strlen(lsi->lsi_lmd->lmd_mgs) + 1);
1973                 if (lsi->lsi_lmd->lmd_osd_type != NULL)
1974                         OBD_FREE(lsi->lsi_lmd->lmd_osd_type,
1975                                  strlen(lsi->lsi_lmd->lmd_osd_type) + 1);
1976                 if (lsi->lsi_lmd->lmd_params != NULL)
1977                         OBD_FREE(lsi->lsi_lmd->lmd_params, 4096);
1978
1979                 OBD_FREE(lsi->lsi_lmd, sizeof(*lsi->lsi_lmd));
1980         }
1981
1982         LASSERT(lsi->lsi_llsbi == NULL);
1983         OBD_FREE(lsi, sizeof(*lsi));
1984         s2lsi_nocast(sb) = NULL;
1985
1986         RETURN(0);
1987 }
1988
1989 /* The lsi has one reference for every server that is using the disk -
1990    e.g. MDT, MGS, and potentially MGC */
1991 static int lustre_put_lsi(struct super_block *sb)
1992 {
1993         struct lustre_sb_info *lsi = s2lsi(sb);
1994         ENTRY;
1995
1996         LASSERT(lsi != NULL);
1997
1998         CDEBUG(D_MOUNT, "put %p %d\n", sb, cfs_atomic_read(&lsi->lsi_mounts));
1999         if (cfs_atomic_dec_and_test(&lsi->lsi_mounts)) {
2000                 if (IS_SERVER(lsi) && lsi->lsi_osd_exp) {
2001                         obd_disconnect(lsi->lsi_osd_exp);
2002                         /* wait till OSD is gone */
2003                         obd_zombie_barrier();
2004                 }
2005                 lustre_free_lsi(sb);
2006                 RETURN(1);
2007         }
2008         RETURN(0);
2009 }
2010
2011 static int lsi_prepare(struct lustre_sb_info *lsi)
2012 {
2013         __u32 index;
2014         int rc;
2015         ENTRY;
2016
2017         LASSERT(lsi);
2018         LASSERT(lsi->lsi_lmd);
2019
2020         /* The server name is given as a mount line option */
2021         if (lsi->lsi_lmd->lmd_profile == NULL) {
2022                 LCONSOLE_ERROR("Can't determine server name\n");
2023                 RETURN(-EINVAL);
2024         }
2025
2026         if (strlen(lsi->lsi_lmd->lmd_profile) >= sizeof(lsi->lsi_svname))
2027                 RETURN(-ENAMETOOLONG);
2028
2029         strcpy(lsi->lsi_svname, lsi->lsi_lmd->lmd_profile);
2030
2031         /* Determine osd type */
2032         if (lsi->lsi_lmd->lmd_osd_type != NULL) {
2033                 if (strlen(lsi->lsi_lmd->lmd_osd_type) >=
2034                            sizeof(lsi->lsi_osd_type))
2035                         RETURN(-ENAMETOOLONG);
2036
2037                 strcpy(lsi->lsi_osd_type, lsi->lsi_lmd->lmd_osd_type);
2038         } else {
2039                 strcpy(lsi->lsi_osd_type, LUSTRE_OSD_LDISKFS_NAME);
2040         }
2041
2042         /* XXX: a temp. solution for components using fsfilt
2043          *      to be removed in one of the subsequent patches */
2044         if (!strcmp(lsi->lsi_lmd->lmd_osd_type, "osd-ldiskfs")) {
2045                 strcpy(lsi->lsi_fstype, "ldiskfs");
2046         } else {
2047                 strcpy(lsi->lsi_fstype, lsi->lsi_lmd->lmd_osd_type);
2048         }
2049
2050         /* Determine server type */
2051         rc = server_name2index(lsi->lsi_svname, &index, NULL);
2052         if (rc < 0) {
2053                 if (lsi->lsi_lmd->lmd_flags & LMD_FLG_MGS) {
2054                         /* Assume we're a bare MGS */
2055                         rc = 0;
2056                         lsi->lsi_lmd->lmd_flags |= LMD_FLG_NOSVC;
2057                 } else {
2058                         LCONSOLE_ERROR("Can't determine server type of '%s'\n",
2059                                        lsi->lsi_svname);
2060                         RETURN(rc);
2061                 }
2062         }
2063         lsi->lsi_flags |= rc;
2064
2065         /* Add mount line flags that used to be in ldd:
2066          * writeconf, mgs, iam, anything else?
2067          */
2068         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_WRITECONF) ?
2069                 LDD_F_WRITECONF : 0;
2070         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_VIRGIN) ?
2071                 LDD_F_VIRGIN : 0;
2072         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_MGS) ?
2073                 LDD_F_SV_TYPE_MGS : 0;
2074         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_IAM) ?
2075                 LDD_F_IAM_DIR : 0;
2076         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_NO_PRIMNODE) ?
2077                 LDD_F_NO_PRIMNODE : 0;
2078
2079         RETURN(0);
2080 }
2081
2082 /*************** server mount ******************/
2083
2084 /** Start the shutdown of servers at umount.
2085  */
2086 static void server_put_super(struct super_block *sb)
2087 {
2088         struct lustre_sb_info *lsi = s2lsi(sb);
2089         struct obd_device     *obd;
2090         char *tmpname, *extraname = NULL;
2091         int tmpname_sz;
2092         int lsiflags = lsi->lsi_flags;
2093         ENTRY;
2094
2095         LASSERT(IS_SERVER(lsi));
2096
2097         tmpname_sz = strlen(lsi->lsi_svname) + 1;
2098         OBD_ALLOC(tmpname, tmpname_sz);
2099         memcpy(tmpname, lsi->lsi_svname, tmpname_sz);
2100         CDEBUG(D_MOUNT, "server put_super %s\n", tmpname);
2101         if (IS_MDT(lsi) && (lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC))
2102                 snprintf(tmpname, tmpname_sz, "MGS");
2103
2104         /* disconnect the osp-on-ost first to drain off the inflight request */
2105         if (IS_OST(lsi) || IS_MDT(lsi)) {
2106                 if (lustre_disconnect_osp(sb) < 0)
2107                         CERROR("%s: Fail to disconnect osp-on-ost!\n", tmpname);
2108         }
2109
2110         /* Stop the target */
2111         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
2112             (IS_MDT(lsi) || IS_OST(lsi))) {
2113                 struct lustre_profile *lprof = NULL;
2114
2115                 /* tell the mgc to drop the config log */
2116                 lustre_end_log(sb, lsi->lsi_svname, NULL);
2117
2118                 /* COMPAT_146 - profile may get deleted in mgc_cleanup.
2119                    If there are any setup/cleanup errors, save the lov
2120                    name for safety cleanup later. */
2121                 lprof = class_get_profile(lsi->lsi_svname);
2122                 if (lprof && lprof->lp_dt) {
2123                         OBD_ALLOC(extraname, strlen(lprof->lp_dt) + 1);
2124                         strcpy(extraname, lprof->lp_dt);
2125                 }
2126
2127                 obd = class_name2obd(lsi->lsi_svname);
2128                 if (obd) {
2129                         CDEBUG(D_MOUNT, "stopping %s\n", obd->obd_name);
2130                         if (lsi->lsi_flags & LSI_UMOUNT_FAILOVER)
2131                                 obd->obd_fail = 1;
2132                         /* We can't seem to give an error return code
2133                          * to .put_super, so we better make sure we clean up! */
2134                         obd->obd_force = 1;
2135                         class_manual_cleanup(obd);
2136                 } else {
2137                         CERROR("no obd %s\n", lsi->lsi_svname);
2138                         server_deregister_mount(lsi->lsi_svname);
2139                 }
2140         }
2141
2142         /* If they wanted the mgs to stop separately from the mdt, they
2143            should have put it on a different device. */
2144         if (IS_MGS(lsi)) {
2145                 /* if MDS start with --nomgs, don't stop MGS then */
2146                 if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS))
2147                         server_stop_mgs(sb);
2148         }
2149
2150         if (IS_OST(lsi) || IS_MDT(lsi)) {
2151                 if (lustre_stop_osp(sb) < 0)
2152                         CERROR("%s: Fail to stop osp-on-ost!\n", tmpname);
2153         }
2154
2155         /* Clean the mgc and sb */
2156         lustre_common_put_super(sb);
2157
2158         /* wait till all in-progress cleanups are done
2159          * specifically we're interested in ofd cleanup
2160          * as it pins OSS */
2161         obd_zombie_barrier();
2162
2163         /* Stop the servers (MDS, OSS) if no longer needed.  We must wait
2164            until the target is really gone so that our type refcount check
2165            is right. */
2166         server_stop_servers(lsiflags);
2167
2168         /* In case of startup or cleanup err, stop related obds */
2169         if (extraname) {
2170                 obd = class_name2obd(extraname);
2171                 if (obd) {
2172                         CWARN("Cleaning orphaned obd %s\n", extraname);
2173                         obd->obd_force = 1;
2174                         class_manual_cleanup(obd);
2175                 }
2176                 OBD_FREE(extraname, strlen(extraname) + 1);
2177         }
2178
2179         LCONSOLE_WARN("server umount %s complete\n", tmpname);
2180         OBD_FREE(tmpname, tmpname_sz);
2181         EXIT;
2182 }
2183
2184 /** Called only for 'umount -f'
2185  */
2186 #ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
2187 static void server_umount_begin(struct vfsmount *vfsmnt, int flags)
2188 {
2189         struct super_block *sb = vfsmnt->mnt_sb;
2190 #else
2191 static void server_umount_begin(struct super_block *sb)
2192 {
2193 #endif
2194         struct lustre_sb_info *lsi = s2lsi(sb);
2195         ENTRY;
2196
2197 #ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
2198         if (!(flags & MNT_FORCE)) {
2199                 EXIT;
2200                 return;
2201         }
2202 #endif
2203
2204         CDEBUG(D_MOUNT, "umount -f\n");
2205         /* umount = failover
2206            umount -f = force
2207            no third way to do non-force, non-failover */
2208         lsi->lsi_flags &= ~LSI_UMOUNT_FAILOVER;
2209         EXIT;
2210 }
2211
2212 static int server_statfs (struct dentry *dentry, cfs_kstatfs_t *buf)
2213 {
2214         struct super_block *sb = dentry->d_sb;
2215         struct lustre_sb_info *lsi = s2lsi(sb);
2216         struct obd_statfs statfs;
2217         int rc;
2218         ENTRY;
2219
2220         if (lsi->lsi_dt_dev) {
2221                 rc = dt_statfs(NULL, lsi->lsi_dt_dev, &statfs);
2222                 if (rc == 0) {
2223                         statfs_unpack(buf, &statfs);
2224                         buf->f_type = sb->s_magic;
2225                         RETURN(0);
2226                 }
2227         }
2228
2229         /* just return 0 */
2230         buf->f_type = sb->s_magic;
2231         buf->f_bsize = sb->s_blocksize;
2232         buf->f_blocks = 1;
2233         buf->f_bfree = 0;
2234         buf->f_bavail = 0;
2235         buf->f_files = 1;
2236         buf->f_ffree = 0;
2237         buf->f_namelen = NAME_MAX;
2238         RETURN(0);
2239 }
2240
2241 /** The operations we support directly on the superblock:
2242  * mount, umount, and df.
2243  */
2244 static struct super_operations server_ops =
2245 {
2246         .put_super      = server_put_super,
2247         .umount_begin   = server_umount_begin, /* umount -f */
2248         .statfs         = server_statfs,
2249 };
2250
2251 #define log2(n) cfs_ffz(~(n))
2252 #define LUSTRE_SUPER_MAGIC 0x0BD00BD1
2253
2254 static int server_fill_super_common(struct super_block *sb)
2255 {
2256         struct inode *root = 0;
2257         ENTRY;
2258
2259         CDEBUG(D_MOUNT, "Server sb, dev=%d\n", (int)sb->s_dev);
2260
2261         sb->s_blocksize = 4096;
2262         sb->s_blocksize_bits = log2(sb->s_blocksize);
2263         sb->s_magic = LUSTRE_SUPER_MAGIC;
2264         sb->s_maxbytes = 0; /* we don't allow file IO on server mountpoints */
2265         sb->s_flags |= MS_RDONLY;
2266         sb->s_op = &server_ops;
2267
2268         root = new_inode(sb);
2269         if (!root) {
2270                 CERROR("Can't make root inode\n");
2271                 RETURN(-EIO);
2272         }
2273
2274         /* returns -EIO for every operation */
2275         /* make_bad_inode(root); -- badness - can't umount */
2276         /* apparently we need to be a directory for the mount to finish */
2277         root->i_mode = S_IFDIR;
2278
2279         sb->s_root = d_alloc_root(root);
2280         if (!sb->s_root) {
2281                 CERROR("Can't make root dentry\n");
2282                 iput(root);
2283                 RETURN(-EIO);
2284         }
2285
2286         RETURN(0);
2287 }
2288
2289 static int osd_start(struct lustre_sb_info *lsi, unsigned long mflags)
2290 {
2291         struct lustre_mount_data *lmd = lsi->lsi_lmd;
2292         struct obd_device        *obd;
2293         struct dt_device_param    p;
2294         char                      flagstr[16];
2295         int                       rc;
2296         ENTRY;
2297
2298         CDEBUG(D_MOUNT,
2299                "Attempting to start %s, type=%s, lsifl=%x, mountfl=%lx\n",
2300                lsi->lsi_svname, lsi->lsi_osd_type, lsi->lsi_flags, mflags);
2301
2302         sprintf(lsi->lsi_osd_obdname, "%s-osd", lsi->lsi_svname);
2303         strcpy(lsi->lsi_osd_uuid, lsi->lsi_osd_obdname);
2304         strcat(lsi->lsi_osd_uuid, "_UUID");
2305         sprintf(flagstr, "%lu:%lu", mflags, (unsigned long) lmd->lmd_flags);
2306
2307         obd = class_name2obd(lsi->lsi_osd_obdname);
2308         if (obd == NULL) {
2309                 rc = lustre_start_simple(lsi->lsi_osd_obdname,
2310                                 lsi->lsi_osd_type,
2311                                 lsi->lsi_osd_uuid, lmd->lmd_dev,
2312                                 flagstr, lsi->lsi_lmd->lmd_opts,
2313                                 lsi->lsi_svname);
2314                 if (rc)
2315                         GOTO(out, rc);
2316                 obd = class_name2obd(lsi->lsi_osd_obdname);
2317                 LASSERT(obd);
2318         }
2319
2320         rc = obd_connect(NULL, &lsi->lsi_osd_exp, obd, &obd->obd_uuid, NULL, NULL);
2321         if (rc) {
2322                 obd->obd_force = 1;
2323                 class_manual_cleanup(obd);
2324                 lsi->lsi_dt_dev = NULL;
2325         }
2326
2327         /* XXX: to keep support old components relying on lsi_srv_mnt
2328          *      we get this info from OSD just started */
2329         LASSERT(obd->obd_lu_dev);
2330         lsi->lsi_dt_dev = lu2dt_dev(obd->obd_lu_dev);
2331         LASSERT(lsi->lsi_dt_dev);
2332
2333         dt_conf_get(NULL, lsi->lsi_dt_dev, &p);
2334
2335         lsi->lsi_srv_mnt = p.ddp_mnt;
2336
2337 out:
2338         RETURN(rc);
2339 }
2340
2341 /** Fill in the superblock info for a Lustre server.
2342  * Mount the device with the correct options.
2343  * Read the on-disk config file.
2344  * Start the services.
2345  */
2346 static int server_fill_super(struct super_block *sb)
2347 {
2348         struct lustre_sb_info *lsi = s2lsi(sb);
2349         int rc;
2350         ENTRY;
2351
2352         rc = lsi_prepare(lsi);
2353         if (rc)
2354                 RETURN(rc);
2355
2356         /* Start low level OSD */
2357         rc = osd_start(lsi, sb->s_flags);
2358         if (rc) {
2359                 CERROR("Unable to start osd on %s: %d\n",
2360                        lsi->lsi_lmd->lmd_dev, rc);
2361                 lustre_put_lsi(sb);
2362                 RETURN(rc);
2363         }
2364
2365         CDEBUG(D_MOUNT, "Found service %s on device %s\n",
2366                lsi->lsi_svname, lsi->lsi_lmd->lmd_dev);
2367
2368         if (class_name2obd(lsi->lsi_svname)) {
2369                 LCONSOLE_ERROR_MSG(0x161, "The target named %s is already "
2370                                    "running. Double-mount may have compromised"
2371                                    " the disk journal.\n",
2372                                    lsi->lsi_svname);
2373                 lustre_put_lsi(sb);
2374                 RETURN(-EALREADY);
2375         }
2376
2377         /* Start MGS before MGC */
2378         if (IS_MGS(lsi) && !(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS)){
2379                 rc = server_start_mgs(sb);
2380                 if (rc)
2381                         GOTO(out_mnt, rc);
2382         }
2383
2384         /* Start MGC before servers */
2385         rc = lustre_start_mgc(sb);
2386         if (rc)
2387                 GOTO(out_mnt, rc);
2388
2389         /* Set up all obd devices for service */
2390         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
2391                         (IS_OST(lsi) || IS_MDT(lsi))) {
2392                 rc = server_start_targets(sb, lsi->lsi_srv_mnt);
2393                 if (rc < 0) {
2394                         CERROR("Unable to start targets: %d\n", rc);
2395                         GOTO(out_mnt, rc);
2396                 }
2397         /* FIXME overmount client here,
2398            or can we just start a client log and client_fill_super on this sb?
2399            We need to make sure server_put_super gets called too - ll_put_super
2400            calls lustre_common_put_super; check there for LSI_SERVER flag,
2401            call s_p_s if so.
2402            Probably should start client from new thread so we can return.
2403            Client will not finish until all servers are connected.
2404            Note - MGS-only server does NOT get a client, since there is no
2405            lustre fs associated - the MGS is for all lustre fs's */
2406         }
2407
2408         rc = server_fill_super_common(sb);
2409         if (rc)
2410                 GOTO(out_mnt, rc);
2411
2412         RETURN(0);
2413 out_mnt:
2414         /* We jump here in case of failure while starting targets or MGS.
2415          * In this case we can't just put @mnt and have to do real cleanup
2416          * with stoping targets, etc. */
2417         server_put_super(sb);
2418         return rc;
2419 }
2420
2421 /*
2422  * Calculate timeout value for a target.
2423  */
2424 void server_calc_timeout(struct lustre_sb_info *lsi, struct obd_device *obd)
2425 {
2426         struct lustre_mount_data *lmd;
2427         int soft = 0;
2428         int hard = 0;
2429         int factor = 0;
2430         bool has_ir = !!(lsi->lsi_flags & LDD_F_IR_CAPABLE);
2431         int min = OBD_RECOVERY_TIME_MIN;
2432
2433         LASSERT(IS_SERVER(lsi));
2434
2435         lmd = lsi->lsi_lmd;
2436         if (lmd) {
2437                 soft   = lmd->lmd_recovery_time_soft;
2438                 hard   = lmd->lmd_recovery_time_hard;
2439                 has_ir = has_ir && !(lmd->lmd_flags & LMD_FLG_NOIR);
2440                 obd->obd_no_ir = !has_ir;
2441         }
2442
2443         if (soft == 0)
2444                 soft = OBD_RECOVERY_TIME_SOFT;
2445         if (hard == 0)
2446                 hard = OBD_RECOVERY_TIME_HARD;
2447
2448         /* target may have ir_factor configured. */
2449         factor = OBD_IR_FACTOR_DEFAULT;
2450         if (obd->obd_recovery_ir_factor)
2451                 factor = obd->obd_recovery_ir_factor;
2452
2453         if (has_ir) {
2454                 int new_soft = soft;
2455                 int new_hard = hard;
2456
2457                 /* adjust timeout value by imperative recovery */
2458
2459                 new_soft = (soft * factor) / OBD_IR_FACTOR_MAX;
2460                 new_hard = (hard * factor) / OBD_IR_FACTOR_MAX;
2461
2462                 /* make sure the timeout is not too short */
2463                 new_soft = max(min, new_soft);
2464                 new_hard = max(new_soft, new_hard);
2465
2466                 LCONSOLE_INFO("%s: Imperative Recovery enabled, recovery "
2467                               "window shrunk from %d-%d down to %d-%d\n",
2468                               obd->obd_name, soft, hard, new_soft, new_hard);
2469
2470                 soft = new_soft;
2471                 hard = new_hard;
2472         }
2473
2474         /* we're done */
2475         obd->obd_recovery_timeout   = max(obd->obd_recovery_timeout, soft);
2476         obd->obd_recovery_time_hard = hard;
2477         obd->obd_recovery_ir_factor = factor;
2478 }
2479 EXPORT_SYMBOL(server_calc_timeout);
2480
2481 /*************** mount common betweeen server and client ***************/
2482
2483 /* Common umount */
2484 int lustre_common_put_super(struct super_block *sb)
2485 {
2486         int rc;
2487         ENTRY;
2488
2489         CDEBUG(D_MOUNT, "dropping sb %p\n", sb);
2490
2491         /* Drop a ref to the MGC */
2492         rc = lustre_stop_mgc(sb);
2493         if (rc && (rc != -ENOENT)) {
2494                 if (rc != -EBUSY) {
2495                         CERROR("Can't stop MGC: %d\n", rc);
2496                         RETURN(rc);
2497                 }
2498                 /* BUSY just means that there's some other obd that
2499                    needs the mgc.  Let him clean it up. */
2500                 CDEBUG(D_MOUNT, "MGC still in use\n");
2501         }
2502         /* Drop a ref to the mounted disk */
2503         lustre_put_lsi(sb);
2504         lu_types_stop();
2505         RETURN(rc);
2506 }
2507 EXPORT_SYMBOL(lustre_common_put_super);
2508
2509 static void lmd_print(struct lustre_mount_data *lmd)
2510 {
2511         int i;
2512
2513         PRINT_CMD(PRINT_MASK, "  mount data:\n");
2514         if (lmd_is_client(lmd))
2515                 PRINT_CMD(PRINT_MASK, "profile: %s\n", lmd->lmd_profile);
2516         PRINT_CMD(PRINT_MASK, "device:  %s\n", lmd->lmd_dev);
2517         PRINT_CMD(PRINT_MASK, "flags:   %x\n", lmd->lmd_flags);
2518
2519         if (lmd->lmd_opts)
2520                 PRINT_CMD(PRINT_MASK, "options: %s\n", lmd->lmd_opts);
2521
2522         if (lmd->lmd_recovery_time_soft)
2523                 PRINT_CMD(PRINT_MASK, "recovery time soft: %d\n",
2524                           lmd->lmd_recovery_time_soft);
2525
2526         if (lmd->lmd_recovery_time_hard)
2527                 PRINT_CMD(PRINT_MASK, "recovery time hard: %d\n",
2528                           lmd->lmd_recovery_time_hard);
2529
2530         for (i = 0; i < lmd->lmd_exclude_count; i++) {
2531                 PRINT_CMD(PRINT_MASK, "exclude %d:  OST%04x\n", i,
2532                           lmd->lmd_exclude[i]);
2533         }
2534 }
2535
2536 /* Is this server on the exclusion list */
2537 int lustre_check_exclusion(struct super_block *sb, char *svname)
2538 {
2539         struct lustre_sb_info *lsi = s2lsi(sb);
2540         struct lustre_mount_data *lmd = lsi->lsi_lmd;
2541         __u32 index;
2542         int i, rc;
2543         ENTRY;
2544
2545         rc = server_name2index(svname, &index, NULL);
2546         if (rc != LDD_F_SV_TYPE_OST)
2547                 /* Only exclude OSTs */
2548                 RETURN(0);
2549
2550         CDEBUG(D_MOUNT, "Check exclusion %s (%d) in %d of %s\n", svname,
2551                index, lmd->lmd_exclude_count, lmd->lmd_dev);
2552
2553         for(i = 0; i < lmd->lmd_exclude_count; i++) {
2554                 if (index == lmd->lmd_exclude[i]) {
2555                         CWARN("Excluding %s (on exclusion list)\n", svname);
2556                         RETURN(1);
2557                 }
2558         }
2559         RETURN(0);
2560 }
2561
2562 /* mount -v  -o exclude=lustre-OST0001:lustre-OST0002 -t lustre ... */
2563 static int lmd_make_exclusion(struct lustre_mount_data *lmd, char *ptr)
2564 {
2565         char *s1 = ptr, *s2;
2566         __u32 index, *exclude_list;
2567         int rc = 0, devmax;
2568         ENTRY;
2569
2570         /* The shortest an ost name can be is 8 chars: -OST0000.
2571            We don't actually know the fsname at this time, so in fact
2572            a user could specify any fsname. */
2573         devmax = strlen(ptr) / 8 + 1;
2574
2575         /* temp storage until we figure out how many we have */
2576         OBD_ALLOC(exclude_list, sizeof(index) * devmax);
2577         if (!exclude_list)
2578                 RETURN(-ENOMEM);
2579
2580         /* we enter this fn pointing at the '=' */
2581         while (*s1 && *s1 != ' ' && *s1 != ',') {
2582                 s1++;
2583                 rc = server_name2index(s1, &index, &s2);
2584                 if (rc < 0) {
2585                         CERROR("Can't parse server name '%s'\n", s1);
2586                         break;
2587                 }
2588                 if (rc == LDD_F_SV_TYPE_OST)
2589                         exclude_list[lmd->lmd_exclude_count++] = index;
2590                 else
2591                         CDEBUG(D_MOUNT, "ignoring exclude %.7s\n", s1);
2592                 s1 = s2;
2593                 /* now we are pointing at ':' (next exclude)
2594                    or ',' (end of excludes) */
2595                 if (lmd->lmd_exclude_count >= devmax)
2596                         break;
2597         }
2598         if (rc >= 0) /* non-err */
2599                 rc = 0;
2600
2601         if (lmd->lmd_exclude_count) {
2602                 /* permanent, freed in lustre_free_lsi */
2603                 OBD_ALLOC(lmd->lmd_exclude, sizeof(index) *
2604                           lmd->lmd_exclude_count);
2605                 if (lmd->lmd_exclude) {
2606                         memcpy(lmd->lmd_exclude, exclude_list,
2607                                sizeof(index) * lmd->lmd_exclude_count);
2608                 } else {
2609                         rc = -ENOMEM;
2610                         lmd->lmd_exclude_count = 0;
2611                 }
2612         }
2613         OBD_FREE(exclude_list, sizeof(index) * devmax);
2614         RETURN(rc);
2615 }
2616
2617 static int lmd_parse_mgssec(struct lustre_mount_data *lmd, char *ptr)
2618 {
2619         char   *tail;
2620         int     length;
2621
2622         if (lmd->lmd_mgssec != NULL) {
2623                 OBD_FREE(lmd->lmd_mgssec, strlen(lmd->lmd_mgssec) + 1);
2624                 lmd->lmd_mgssec = NULL;
2625         }
2626
2627         tail = strchr(ptr, ',');
2628         if (tail == NULL)
2629                 length = strlen(ptr);
2630         else
2631                 length = tail - ptr;
2632
2633         OBD_ALLOC(lmd->lmd_mgssec, length + 1);
2634         if (lmd->lmd_mgssec == NULL)
2635                 return -ENOMEM;
2636
2637         memcpy(lmd->lmd_mgssec, ptr, length);
2638         lmd->lmd_mgssec[length] = '\0';
2639         return 0;
2640 }
2641
2642 static int lmd_parse_string(char **handle, char *ptr)
2643 {
2644         char   *tail;
2645         int     length;
2646
2647         if ((handle == NULL) || (ptr == NULL))
2648                 return -EINVAL;
2649
2650         if (*handle != NULL) {
2651                 OBD_FREE(*handle, strlen(*handle) + 1);
2652                 *handle = NULL;
2653         }
2654
2655         tail = strchr(ptr, ',');
2656         if (tail == NULL)
2657                 length = strlen(ptr);
2658         else
2659                 length = tail - ptr;
2660
2661         OBD_ALLOC(*handle, length + 1);
2662         if (*handle == NULL)
2663                 return -ENOMEM;
2664
2665         memcpy(*handle, ptr, length);
2666         (*handle)[length] = '\0';
2667
2668         return 0;
2669 }
2670
2671 /* Collect multiple values for mgsnid specifiers */
2672 static int lmd_parse_mgs(struct lustre_mount_data *lmd, char **ptr)
2673 {
2674         lnet_nid_t nid;
2675         char *tail = *ptr;
2676         char *mgsnid;
2677         int   length;
2678         int   oldlen = 0;
2679
2680         /* Find end of nidlist */
2681         while (class_parse_nid_quiet(tail, &nid, &tail) == 0) {}
2682         length = tail - *ptr;
2683         if (length == 0) {
2684                 LCONSOLE_ERROR_MSG(0x159, "Can't parse NID '%s'\n", *ptr);
2685                 return -EINVAL;
2686         }
2687
2688         if (lmd->lmd_mgs != NULL)
2689                 oldlen = strlen(lmd->lmd_mgs) + 1;
2690
2691         OBD_ALLOC(mgsnid, oldlen + length + 1);
2692         if (mgsnid == NULL)
2693                 return -ENOMEM;
2694
2695         if (lmd->lmd_mgs != NULL) {
2696                 /* Multiple mgsnid= are taken to mean failover locations */
2697                 memcpy(mgsnid, lmd->lmd_mgs, oldlen);
2698                 mgsnid[oldlen - 1] = ':';
2699                 OBD_FREE(lmd->lmd_mgs, oldlen);
2700         }
2701         memcpy(mgsnid + oldlen, *ptr, length);
2702         mgsnid[oldlen + length] = '\0';
2703         lmd->lmd_mgs = mgsnid;
2704         *ptr = tail;
2705
2706         return 0;
2707 }
2708
2709 /** Parse mount line options
2710  * e.g. mount -v -t lustre -o abort_recov uml1:uml2:/lustre-client /mnt/lustre
2711  * dev is passed as device=uml1:/lustre by mount.lustre
2712  */
2713 static int lmd_parse(char *options, struct lustre_mount_data *lmd)
2714 {
2715         char *s1, *s2, *devname = NULL;
2716         struct lustre_mount_data *raw = (struct lustre_mount_data *)options;
2717         int rc = 0;
2718         ENTRY;
2719
2720         LASSERT(lmd);
2721         if (!options) {
2722                 LCONSOLE_ERROR_MSG(0x162, "Missing mount data: check that "
2723                                    "/sbin/mount.lustre is installed.\n");
2724                 RETURN(-EINVAL);
2725         }
2726
2727         /* Options should be a string - try to detect old lmd data */
2728         if ((raw->lmd_magic & 0xffffff00) == (LMD_MAGIC & 0xffffff00)) {
2729                 LCONSOLE_ERROR_MSG(0x163, "You're using an old version of "
2730                                    "/sbin/mount.lustre.  Please install "
2731                                    "version %s\n", LUSTRE_VERSION_STRING);
2732                 RETURN(-EINVAL);
2733         }
2734         lmd->lmd_magic = LMD_MAGIC;
2735
2736         OBD_ALLOC(lmd->lmd_params, 4096);
2737         if (lmd->lmd_params == NULL)
2738                 RETURN(-ENOMEM);
2739         lmd->lmd_params[0] = '\0';
2740
2741         /* Set default flags here */
2742
2743         s1 = options;
2744         while (*s1) {
2745                 int clear = 0;
2746                 int time_min = OBD_RECOVERY_TIME_MIN;
2747
2748                 /* Skip whitespace and extra commas */
2749                 while (*s1 == ' ' || *s1 == ',')
2750                         s1++;
2751
2752                 /* Client options are parsed in ll_options: eg. flock,
2753                    user_xattr, acl */
2754
2755                 /* Parse non-ldiskfs options here. Rather than modifying
2756                    ldiskfs, we just zero these out here */
2757                 if (strncmp(s1, "abort_recov", 11) == 0) {
2758                         lmd->lmd_flags |= LMD_FLG_ABORT_RECOV;
2759                         clear++;
2760                 } else if (strncmp(s1, "recovery_time_soft=", 19) == 0) {
2761                         lmd->lmd_recovery_time_soft = max_t(int,
2762                                 simple_strtoul(s1 + 19, NULL, 10), time_min);
2763                         clear++;
2764                 } else if (strncmp(s1, "recovery_time_hard=", 19) == 0) {
2765                         lmd->lmd_recovery_time_hard = max_t(int,
2766                                 simple_strtoul(s1 + 19, NULL, 10), time_min);
2767                         clear++;
2768                 } else if (strncmp(s1, "noir", 4) == 0) {
2769                         lmd->lmd_flags |= LMD_FLG_NOIR; /* test purpose only. */
2770                         clear++;
2771                 } else if (strncmp(s1, "nosvc", 5) == 0) {
2772                         lmd->lmd_flags |= LMD_FLG_NOSVC;
2773                         clear++;
2774                 } else if (strncmp(s1, "nomgs", 5) == 0) {
2775                         lmd->lmd_flags |= LMD_FLG_NOMGS;
2776                         clear++;
2777                 } else if (strncmp(s1, "noscrub", 7) == 0) {
2778                         lmd->lmd_flags |= LMD_FLG_NOSCRUB;
2779                         clear++;
2780                 } else if (strncmp(s1, PARAM_MGSNODE,
2781                                    sizeof(PARAM_MGSNODE) - 1) == 0) {
2782                         s2 = s1 + sizeof(PARAM_MGSNODE) - 1;
2783                         /* Assume the next mount opt is the first
2784                            invalid nid we get to. */
2785                         rc = lmd_parse_mgs(lmd, &s2);
2786                         if (rc)
2787                                 goto invalid;
2788                         clear++;
2789                 } else if (strncmp(s1, "writeconf", 9) == 0) {
2790                         lmd->lmd_flags |= LMD_FLG_WRITECONF;
2791                         clear++;
2792                 } else if (strncmp(s1, "virgin", 6) == 0) {
2793                         lmd->lmd_flags |= LMD_FLG_VIRGIN;
2794                         clear++;
2795                 } else if (strncmp(s1, "noprimnode", 10) == 0) {
2796                         lmd->lmd_flags |= LMD_FLG_NO_PRIMNODE;
2797                         clear++;
2798                 } else if (strncmp(s1, "mgssec=", 7) == 0) {
2799                         rc = lmd_parse_mgssec(lmd, s1 + 7);
2800                         if (rc)
2801                                 goto invalid;
2802                         clear++;
2803                 /* ost exclusion list */
2804                 } else if (strncmp(s1, "exclude=", 8) == 0) {
2805                         rc = lmd_make_exclusion(lmd, s1 + 7);
2806                         if (rc)
2807                                 goto invalid;
2808                         clear++;
2809                 } else if (strncmp(s1, "mgs", 3) == 0) {
2810                         /* We are an MGS */
2811                         lmd->lmd_flags |= LMD_FLG_MGS;
2812                         clear++;
2813                 } else if (strncmp(s1, "svname=", 7) == 0) {
2814                         rc = lmd_parse_string(&lmd->lmd_profile, s1 + 7);
2815                         if (rc)
2816                                 goto invalid;
2817                         clear++;
2818                 } else if (strncmp(s1, "param=", 6) == 0) {
2819                         int length;
2820                         char *tail = strchr(s1 + 6, ',');
2821                         if (tail == NULL)
2822                                 length = strlen(s1);
2823                         else
2824                                 length = tail - s1;
2825                         length -= 6;
2826                         strncat(lmd->lmd_params, s1 + 6, length);
2827                         strcat(lmd->lmd_params, " ");
2828                         clear++;
2829                 } else if (strncmp(s1, "osd=", 4) == 0) {
2830                         rc = lmd_parse_string(&lmd->lmd_osd_type, s1 + 4);
2831                         if (rc)
2832                                 goto invalid;
2833                         clear++;
2834                 }
2835                 /* Linux 2.4 doesn't pass the device, so we stuck it at the
2836                    end of the options. */
2837                 else if (strncmp(s1, "device=", 7) == 0) {
2838                         devname = s1 + 7;
2839                         /* terminate options right before device.  device
2840                            must be the last one. */
2841                         *s1 = '\0';
2842                         break;
2843                 }
2844
2845                 /* Find next opt */
2846                 s2 = strchr(s1, ',');
2847                 if (s2 == NULL) {
2848                         if (clear)
2849                                 *s1 = '\0';
2850                         break;
2851                 }
2852                 s2++;
2853                 if (clear)
2854                         memmove(s1, s2, strlen(s2) + 1);
2855                 else
2856                         s1 = s2;
2857         }
2858
2859         if (!devname) {
2860                 LCONSOLE_ERROR_MSG(0x164, "Can't find the device name "
2861                                    "(need mount option 'device=...')\n");
2862                 goto invalid;
2863         }
2864
2865         s1 = strstr(devname, ":/");
2866         if (s1) {
2867                 ++s1;
2868                 lmd->lmd_flags |= LMD_FLG_CLIENT;
2869                 /* Remove leading /s from fsname */
2870                 while (*++s1 == '/') ;
2871                 /* Freed in lustre_free_lsi */
2872                 OBD_ALLOC(lmd->lmd_profile, strlen(s1) + 8);
2873                 if (!lmd->lmd_profile)
2874                         RETURN(-ENOMEM);
2875                 sprintf(lmd->lmd_profile, "%s-client", s1);
2876         }
2877
2878         /* Freed in lustre_free_lsi */
2879         OBD_ALLOC(lmd->lmd_dev, strlen(devname) + 1);
2880         if (!lmd->lmd_dev)
2881                 RETURN(-ENOMEM);
2882         strcpy(lmd->lmd_dev, devname);
2883
2884         /* Save mount options */
2885         s1 = options + strlen(options) - 1;
2886         while (s1 >= options && (*s1 == ',' || *s1 == ' '))
2887                 *s1-- = 0;
2888         if (*options != 0) {
2889                 /* Freed in lustre_free_lsi */
2890                 OBD_ALLOC(lmd->lmd_opts, strlen(options) + 1);
2891                 if (!lmd->lmd_opts)
2892                         RETURN(-ENOMEM);
2893                 strcpy(lmd->lmd_opts, options);
2894         }
2895
2896         lmd_print(lmd);
2897         lmd->lmd_magic = LMD_MAGIC;
2898
2899         RETURN(rc);
2900
2901 invalid:
2902         CERROR("Bad mount options %s\n", options);
2903         RETURN(-EINVAL);
2904 }
2905
2906 struct lustre_mount_data2 {
2907         void *lmd2_data;
2908         struct vfsmount *lmd2_mnt;
2909 };
2910
2911 /** This is the entry point for the mount call into Lustre.
2912  * This is called when a server or client is mounted,
2913  * and this is where we start setting things up.
2914  * @param data Mount options (e.g. -o flock,abort_recov)
2915  */
2916 int lustre_fill_super(struct super_block *sb, void *data, int silent)
2917 {
2918         struct lustre_mount_data *lmd;
2919         struct lustre_mount_data2 *lmd2 = data;
2920         struct lustre_sb_info *lsi;
2921         int rc;
2922         ENTRY;
2923
2924         CDEBUG(D_MOUNT|D_VFSTRACE, "VFS Op: sb %p\n", sb);
2925
2926         lsi = lustre_init_lsi(sb);
2927         if (!lsi)
2928                 RETURN(-ENOMEM);
2929         lmd = lsi->lsi_lmd;
2930
2931         /*
2932          * Disable lockdep during mount, because mount locking patterns are
2933          * `special'.
2934          */
2935         cfs_lockdep_off();
2936
2937         /*
2938          * LU-639: the obd cleanup of last mount may not finish yet, wait here.
2939          */
2940         obd_zombie_barrier();
2941
2942         /* Figure out the lmd from the mount options */
2943         if (lmd_parse((char *)(lmd2->lmd2_data), lmd)) {
2944                 lustre_put_lsi(sb);
2945                 GOTO(out, rc = -EINVAL);
2946         }
2947
2948         if (lmd_is_client(lmd)) {
2949                 CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
2950                 if (!client_fill_super) {
2951                         LCONSOLE_ERROR_MSG(0x165, "Nothing registered for "
2952                                            "client mount! Is the 'lustre' "
2953                                            "module loaded?\n");
2954                         lustre_put_lsi(sb);
2955                         rc = -ENODEV;
2956                 } else {
2957                         rc = lustre_start_mgc(sb);
2958                         if (rc) {
2959                                 lustre_put_lsi(sb);
2960                                 GOTO(out, rc);
2961                         }
2962                         /* Connect and start */
2963                         /* (should always be ll_fill_super) */
2964                         rc = (*client_fill_super)(sb, lmd2->lmd2_mnt);
2965                         /* c_f_s will call lustre_common_put_super on failure */
2966                 }
2967         } else {
2968                 CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
2969                 rc = server_fill_super(sb);
2970                 /* s_f_s calls lustre_start_mgc after the mount because we need
2971                    the MGS nids which are stored on disk.  Plus, we may
2972                    need to start the MGS first. */
2973                 /* s_f_s will call server_put_super on failure */
2974         }
2975
2976         /* If error happens in fill_super() call, @lsi will be killed there.
2977          * This is why we do not put it here. */
2978         GOTO(out, rc);
2979 out:
2980         if (rc) {
2981                 CERROR("Unable to mount %s (%d)\n",
2982                        s2lsi(sb) ? lmd->lmd_dev : "", rc);
2983         } else {
2984                 CDEBUG(D_SUPER, "Mount %s complete\n",
2985                        lmd->lmd_dev);
2986         }
2987         cfs_lockdep_on();
2988         return rc;
2989 }
2990
2991
2992 /* We can't call ll_fill_super by name because it lives in a module that
2993    must be loaded after this one. */
2994 void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb,
2995                                                   struct vfsmount *mnt))
2996 {
2997         client_fill_super = cfs;
2998 }
2999 EXPORT_SYMBOL(lustre_register_client_fill_super);
3000
3001 void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb))
3002 {
3003         kill_super_cb = cfs;
3004 }
3005 EXPORT_SYMBOL(lustre_register_kill_super_cb);
3006
3007 /***************** FS registration ******************/
3008 #ifdef HAVE_FSTYPE_MOUNT
3009 struct dentry *lustre_mount(struct file_system_type *fs_type, int flags,
3010                                 const char *devname, void *data)
3011 {
3012         struct lustre_mount_data2 lmd2 = { data, NULL };
3013
3014         return mount_nodev(fs_type, flags, &lmd2, lustre_fill_super);
3015 }
3016 #else
3017 int lustre_get_sb(struct file_system_type *fs_type, int flags,
3018                   const char *devname, void * data, struct vfsmount *mnt)
3019 {
3020         struct lustre_mount_data2 lmd2 = { data, mnt };
3021
3022         return get_sb_nodev(fs_type, flags, &lmd2, lustre_fill_super, mnt);
3023 }
3024 #endif
3025
3026 void lustre_kill_super(struct super_block *sb)
3027 {
3028         struct lustre_sb_info *lsi = s2lsi(sb);
3029
3030         if (kill_super_cb && lsi && !IS_SERVER(lsi))
3031                 (*kill_super_cb)(sb);
3032
3033         kill_anon_super(sb);
3034 }
3035
3036 /** Register the "lustre" fs type
3037  */
3038 struct file_system_type lustre_fs_type = {
3039         .owner        = THIS_MODULE,
3040         .name         = "lustre",
3041 #ifdef HAVE_FSTYPE_MOUNT
3042         .mount        = lustre_mount,
3043 #else
3044         .get_sb       = lustre_get_sb,
3045 #endif
3046         .kill_sb      = lustre_kill_super,
3047         .fs_flags     = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV |
3048 #ifdef FS_HAS_FIEMAP
3049                         FS_HAS_FIEMAP |
3050 #endif
3051                         LL_RENAME_DOES_D_MOVE,
3052 };
3053
3054 int lustre_register_fs(void)
3055 {
3056         return register_filesystem(&lustre_fs_type);
3057 }
3058
3059 int lustre_unregister_fs(void)
3060 {
3061         return unregister_filesystem(&lustre_fs_type);
3062 }
3063
3064 EXPORT_SYMBOL(server_mti_print);