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