Whamcloud - gitweb
LU-28 fileset: add fileset mount support
[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, 2015, Intel Corporation.
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 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
48 #include <obd.h>
49 #include <obd_class.h>
50 #include <lustre/lustre_user.h>
51 #include <linux/version.h>
52 #include <lustre_log.h>
53 #include <lustre_disk.h>
54 #include <lustre_param.h>
55
56 static int (*client_fill_super)(struct super_block *sb,
57                                 struct vfsmount *mnt);
58
59 static void (*kill_super_cb)(struct super_block *sb);
60
61 /**************** config llog ********************/
62
63 /** Get a config log from the MGS and process it.
64  * This func is called for both clients and servers.
65  * Continue to process new statements appended to the logs
66  * (whenever the config lock is revoked) until lustre_end_log
67  * is called.
68  * @param sb The superblock is used by the MGC to write to the local copy of
69  *   the config log
70  * @param logname The name of the llog to replicate from the MGS
71  * @param cfg Since the same mgc may be used to follow multiple config logs
72  *   (e.g. ost1, ost2, client), the config_llog_instance keeps the state for
73  *   this log, and is added to the mgc's list of logs to follow.
74  */
75 int lustre_process_log(struct super_block *sb, char *logname,
76                      struct config_llog_instance *cfg)
77 {
78         struct lustre_cfg *lcfg;
79         struct lustre_cfg_bufs *bufs;
80         struct lustre_sb_info *lsi = s2lsi(sb);
81         struct obd_device *mgc = lsi->lsi_mgc;
82         int rc;
83         ENTRY;
84
85         LASSERT(mgc);
86         LASSERT(cfg);
87
88         OBD_ALLOC_PTR(bufs);
89         if (bufs == NULL)
90                 RETURN(-ENOMEM);
91
92         /* mgc_process_config */
93         lustre_cfg_bufs_reset(bufs, mgc->obd_name);
94         lustre_cfg_bufs_set_string(bufs, 1, logname);
95         lustre_cfg_bufs_set(bufs, 2, cfg, sizeof(*cfg));
96         lustre_cfg_bufs_set(bufs, 3, &sb, sizeof(sb));
97         lcfg = lustre_cfg_new(LCFG_LOG_START, bufs);
98         if (lcfg == NULL)
99                 GOTO(out, rc = -ENOMEM);
100         rc = obd_process_config(mgc, sizeof(*lcfg), lcfg);
101         lustre_cfg_free(lcfg);
102 out:
103         OBD_FREE_PTR(bufs);
104
105         if (rc == -EINVAL)
106                 LCONSOLE_ERROR_MSG(0x15b, "%s: The configuration from log '%s'"
107                                    "failed from the MGS (%d).  Make sure this "
108                                    "client and the MGS are running compatible "
109                                    "versions of Lustre.\n",
110                                    mgc->obd_name, logname, rc);
111         else if (rc != 0)
112                 LCONSOLE_ERROR_MSG(0x15c, "%s: The configuration from log '%s' "
113                                    "failed (%d). This may be the result of "
114                                    "communication errors between this node and "
115                                    "the MGS, a bad configuration, or other "
116                                    "errors. See the syslog for more "
117                                    "information.\n", mgc->obd_name, logname,
118                                    rc);
119
120         /* class_obd_list(); */
121         RETURN(rc);
122 }
123 EXPORT_SYMBOL(lustre_process_log);
124
125 /* Stop watching this config log for updates */
126 int lustre_end_log(struct super_block *sb, char *logname,
127                        struct config_llog_instance *cfg)
128 {
129         struct lustre_cfg *lcfg;
130         struct lustre_cfg_bufs bufs;
131         struct lustre_sb_info *lsi = s2lsi(sb);
132         struct obd_device *mgc = lsi->lsi_mgc;
133         int rc;
134         ENTRY;
135
136         if (!mgc)
137                 RETURN(-ENOENT);
138
139         /* mgc_process_config */
140         lustre_cfg_bufs_reset(&bufs, mgc->obd_name);
141         lustre_cfg_bufs_set_string(&bufs, 1, logname);
142         if (cfg)
143                 lustre_cfg_bufs_set(&bufs, 2, cfg, sizeof(*cfg));
144         lcfg = lustre_cfg_new(LCFG_LOG_END, &bufs);
145         if (lcfg == NULL)
146                 RETURN(-ENOMEM);
147         rc = obd_process_config(mgc, sizeof(*lcfg), lcfg);
148         lustre_cfg_free(lcfg);
149         RETURN(rc);
150 }
151 EXPORT_SYMBOL(lustre_end_log);
152
153 /**************** obd start *******************/
154
155 /** lustre_cfg_bufs are a holdover from 1.4; we can still set these up from
156  * lctl (and do for echo cli/srv.
157  */
158 int do_lcfg(char *cfgname, lnet_nid_t nid, int cmd,
159             char *s1, char *s2, char *s3, char *s4)
160 {
161         struct lustre_cfg_bufs bufs;
162         struct lustre_cfg    * lcfg = NULL;
163         int rc;
164
165         CDEBUG(D_TRACE, "lcfg %s %#x %s %s %s %s\n", cfgname,
166                cmd, s1, s2, s3, s4);
167
168         lustre_cfg_bufs_reset(&bufs, cfgname);
169         if (s1)
170                 lustre_cfg_bufs_set_string(&bufs, 1, s1);
171         if (s2)
172                 lustre_cfg_bufs_set_string(&bufs, 2, s2);
173         if (s3)
174                 lustre_cfg_bufs_set_string(&bufs, 3, s3);
175         if (s4)
176                 lustre_cfg_bufs_set_string(&bufs, 4, s4);
177
178         lcfg = lustre_cfg_new(cmd, &bufs);
179         if (lcfg == NULL)
180                 return -ENOMEM;
181         lcfg->lcfg_nid = nid;
182         rc = class_process_config(lcfg);
183         lustre_cfg_free(lcfg);
184         return(rc);
185 }
186
187 /** Call class_attach and class_setup.  These methods in turn call
188  * obd type-specific methods.
189  */
190 int lustre_start_simple(char *obdname, char *type, char *uuid,
191                         char *s1, char *s2, char *s3, char *s4)
192 {
193         int rc;
194         CDEBUG(D_MOUNT, "Starting obd %s (typ=%s)\n", obdname, type);
195
196         rc = do_lcfg(obdname, 0, LCFG_ATTACH, type, uuid, NULL, NULL);
197         if (rc) {
198                 CERROR("%s attach error %d\n", obdname, rc);
199                 return rc;
200         }
201         rc = do_lcfg(obdname, 0, LCFG_SETUP, s1, s2, s3, s4);
202         if (rc) {
203                 CERROR("%s setup error %d\n", obdname, rc);
204                 do_lcfg(obdname, 0, LCFG_DETACH, NULL, NULL, NULL, NULL);
205         }
206         return rc;
207 }
208
209 static DEFINE_MUTEX(mgc_start_lock);
210
211 /** Set up a mgc obd to process startup logs
212  *
213  * \param sb [in] super block of the mgc obd
214  *
215  * \retval 0 success, otherwise error code
216  */
217 int lustre_start_mgc(struct super_block *sb)
218 {
219         struct obd_connect_data *data = NULL;
220         struct lustre_sb_info *lsi = s2lsi(sb);
221         struct obd_device *obd;
222         struct obd_export *exp;
223         struct obd_uuid *uuid;
224         class_uuid_t uuidc;
225         lnet_nid_t nid;
226         char nidstr[LNET_NIDSTR_SIZE];
227         char *mgcname = NULL, *niduuid = NULL, *mgssec = NULL;
228         char *ptr;
229         int rc = 0, i = 0, j;
230         size_t len;
231         ENTRY;
232
233         LASSERT(lsi->lsi_lmd);
234
235         /* Find the first non-lo MGS nid for our MGC name */
236         if (IS_SERVER(lsi)) {
237                 /* mount -o mgsnode=nid */
238                 ptr = lsi->lsi_lmd->lmd_mgs;
239                 if (lsi->lsi_lmd->lmd_mgs &&
240                     (class_parse_nid(lsi->lsi_lmd->lmd_mgs, &nid, &ptr) == 0)) {
241                         i++;
242                 } else if (IS_MGS(lsi)) {
243                         lnet_process_id_t id;
244                         while ((rc = LNetGetId(i++, &id)) != -ENOENT) {
245                                 if (LNET_NETTYP(LNET_NIDNET(id.nid)) == LOLND)
246                                         continue;
247                                 nid = id.nid;
248                                 i++;
249                                 break;
250                         }
251                 }
252         } else { /* client */
253                 /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */
254                 ptr = lsi->lsi_lmd->lmd_dev;
255                 if (class_parse_nid(ptr, &nid, &ptr) == 0)
256                         i++;
257         }
258         if (i == 0) {
259                 CERROR("No valid MGS nids found.\n");
260                 RETURN(-EINVAL);
261         }
262
263         mutex_lock(&mgc_start_lock);
264
265         libcfs_nid2str_r(nid, nidstr, sizeof(nidstr));
266         len = strlen(LUSTRE_MGC_OBDNAME) + strlen(nidstr) + 1;
267         OBD_ALLOC(mgcname, len);
268         OBD_ALLOC(niduuid, len + 2);
269         if (mgcname == NULL || niduuid == NULL)
270                 GOTO(out_free, rc = -ENOMEM);
271         snprintf(mgcname, len, "%s%s", LUSTRE_MGC_OBDNAME, nidstr);
272
273         mgssec = lsi->lsi_lmd->lmd_mgssec ? lsi->lsi_lmd->lmd_mgssec : "";
274
275         OBD_ALLOC_PTR(data);
276         if (data == NULL)
277                 GOTO(out_free, rc = -ENOMEM);
278
279         obd = class_name2obd(mgcname);
280         if (obd && !obd->obd_stopping) {
281                 int recov_bk;
282
283                 rc = obd_set_info_async(NULL, obd->obd_self_export,
284                                         strlen(KEY_MGSSEC), KEY_MGSSEC,
285                                         strlen(mgssec), mgssec, NULL);
286                 if (rc)
287                         GOTO(out_free, rc);
288
289                 /* Re-using an existing MGC */
290                 atomic_inc(&obd->u.cli.cl_mgc_refcount);
291
292                 /* IR compatibility check, only for clients */
293                 if (lmd_is_client(lsi->lsi_lmd)) {
294                         int has_ir;
295                         int vallen = sizeof(*data);
296                         __u32 *flags = &lsi->lsi_lmd->lmd_flags;
297
298                         rc = obd_get_info(NULL, obd->obd_self_export,
299                                           strlen(KEY_CONN_DATA), KEY_CONN_DATA,
300                                           &vallen, data);
301                         LASSERT(rc == 0);
302                         has_ir = OCD_HAS_FLAG(data, IMP_RECOV);
303                         if (has_ir ^ !(*flags & LMD_FLG_NOIR)) {
304                                 /* LMD_FLG_NOIR is for test purpose only */
305                                 LCONSOLE_WARN(
306                                     "Trying to mount a client with IR setting "
307                                     "not compatible with current mgc. "
308                                     "Force to use current mgc setting that is "
309                                     "IR %s.\n",
310                                     has_ir ? "enabled" : "disabled");
311                                 if (has_ir)
312                                         *flags &= ~LMD_FLG_NOIR;
313                                 else
314                                         *flags |= LMD_FLG_NOIR;
315                         }
316                 }
317
318                 recov_bk = 0;
319                 /* If we are restarting the MGS, don't try to keep the MGC's
320                    old connection, or registration will fail. */
321                 if (IS_MGS(lsi)) {
322                         CDEBUG(D_MOUNT, "New MGS with live MGC\n");
323                         recov_bk = 1;
324                 }
325
326                 /* Try all connections, but only once (again).
327                    We don't want to block another target from starting
328                    (using its local copy of the log), but we do want to connect
329                    if at all possible. */
330                 recov_bk++;
331                 CDEBUG(D_MOUNT, "%s: Set MGC reconnect %d\n", mgcname,recov_bk);
332                 rc = obd_set_info_async(NULL, obd->obd_self_export,
333                                         sizeof(KEY_INIT_RECOV_BACKUP),
334                                         KEY_INIT_RECOV_BACKUP,
335                                         sizeof(recov_bk), &recov_bk, NULL);
336                 GOTO(out, rc = 0);
337         }
338
339         CDEBUG(D_MOUNT, "Start MGC '%s'\n", mgcname);
340
341         /* Add the primary nids for the MGS */
342         i = 0;
343         snprintf(niduuid, len + 2, "%s_%x", mgcname, i);
344         if (IS_SERVER(lsi)) {
345                 ptr = lsi->lsi_lmd->lmd_mgs;
346                 CDEBUG(D_MOUNT, "mgs nids %s.\n", ptr);
347                 if (IS_MGS(lsi)) {
348                         /* Use local nids (including LO) */
349                         lnet_process_id_t id;
350                         while ((rc = LNetGetId(i++, &id)) != -ENOENT) {
351                                 rc = do_lcfg(mgcname, id.nid, LCFG_ADD_UUID,
352                                              niduuid, NULL, NULL, NULL);
353                         }
354                 } else {
355                         /* Use mgsnode= nids */
356                         /* mount -o mgsnode=nid */
357                         if (lsi->lsi_lmd->lmd_mgs) {
358                                 ptr = lsi->lsi_lmd->lmd_mgs;
359                         } else if (class_find_param(ptr, PARAM_MGSNODE,
360                                                     &ptr) != 0) {
361                                 CERROR("No MGS nids given.\n");
362                                 GOTO(out_free, rc = -EINVAL);
363                         }
364                         /*
365                          * LU-3829.
366                          * Here we only take the first mgsnid as its primary
367                          * serving mgs node, the rest mgsnid will be taken as
368                          * failover mgs node, otherwise they would be takens
369                          * as multiple nids of a single mgs node.
370                          */
371                         while (class_parse_nid(ptr, &nid, &ptr) == 0) {
372                                 rc = do_lcfg(mgcname, nid, LCFG_ADD_UUID,
373                                              niduuid, NULL, NULL, NULL);
374                                 if (rc == 0) {
375                                         i = 1;
376                                         break;
377                                 }
378                         }
379                 }
380         } else { /* client */
381                 /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */
382                 ptr = lsi->lsi_lmd->lmd_dev;
383                 while (class_parse_nid(ptr, &nid, &ptr) == 0) {
384                         rc = do_lcfg(mgcname, nid, LCFG_ADD_UUID,
385                                      niduuid, NULL, NULL, NULL);
386                         if (rc == 0)
387                                 ++i;
388                         /* Stop at the first failover nid */
389                         if (*ptr == ':')
390                                 break;
391                 }
392         }
393         if (i == 0) {
394                 CERROR("No valid MGS nids found.\n");
395                 GOTO(out_free, rc = -EINVAL);
396         }
397         lsi->lsi_lmd->lmd_mgs_failnodes = 1;
398
399         /* Random uuid for MGC allows easier reconnects */
400         OBD_ALLOC_PTR(uuid);
401         ll_generate_random_uuid(uuidc);
402         class_uuid_unparse(uuidc, uuid);
403
404         /* Start the MGC */
405         rc = lustre_start_simple(mgcname, LUSTRE_MGC_NAME,
406                                  (char *)uuid->uuid, LUSTRE_MGS_OBDNAME,
407                                  niduuid, NULL, NULL);
408         OBD_FREE_PTR(uuid);
409         if (rc)
410                 GOTO(out_free, rc);
411
412         /* Add any failover MGS nids */
413         i = 1;
414         while (ptr && ((*ptr == ':' ||
415                class_find_param(ptr, PARAM_MGSNODE, &ptr) == 0))) {
416                 /* New failover node */
417                 sprintf(niduuid, "%s_%x", mgcname, i);
418                 j = 0;
419                 while (class_parse_nid_quiet(ptr, &nid, &ptr) == 0) {
420                         rc = do_lcfg(mgcname, nid, LCFG_ADD_UUID,
421                                      niduuid, NULL, NULL, NULL);
422                         if (rc == 0)
423                                 ++j;
424                         if (*ptr == ':')
425                                 break;
426                 }
427                 if (j > 0) {
428                         rc = do_lcfg(mgcname, 0, LCFG_ADD_CONN,
429                                      niduuid, NULL, NULL, NULL);
430                         if (rc == 0)
431                                 ++i;
432                 } else {
433                         /* at ":/fsname" */
434                         break;
435                 }
436         }
437         lsi->lsi_lmd->lmd_mgs_failnodes = i;
438
439         obd = class_name2obd(mgcname);
440         if (!obd) {
441                 CERROR("Can't find mgcobd %s\n", mgcname);
442                 GOTO(out_free, rc = -ENOTCONN);
443         }
444
445         rc = obd_set_info_async(NULL, obd->obd_self_export,
446                                 strlen(KEY_MGSSEC), KEY_MGSSEC,
447                                 strlen(mgssec), mgssec, NULL);
448         if (rc)
449                 GOTO(out_free, rc);
450
451         /* Keep a refcount of servers/clients who started with "mount",
452            so we know when we can get rid of the mgc. */
453         atomic_set(&obd->u.cli.cl_mgc_refcount, 1);
454
455         /* We connect to the MGS at setup, and don't disconnect until cleanup */
456         data->ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_AT |
457                                   OBD_CONNECT_FULL20 | OBD_CONNECT_IMP_RECOV |
458                                   OBD_CONNECT_LVB_TYPE | OBD_CONNECT_BULK_MBITS;
459
460 #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
461         data->ocd_connect_flags |= OBD_CONNECT_MNE_SWAB;
462 #endif
463
464         if (lmd_is_client(lsi->lsi_lmd) &&
465             lsi->lsi_lmd->lmd_flags & LMD_FLG_NOIR)
466                 data->ocd_connect_flags &= ~OBD_CONNECT_IMP_RECOV;
467         data->ocd_version = LUSTRE_VERSION_CODE;
468         rc = obd_connect(NULL, &exp, obd, &(obd->obd_uuid), data, NULL);
469         if (rc) {
470                 CERROR("connect failed %d\n", rc);
471                 GOTO(out, rc);
472         }
473
474         obd->u.cli.cl_mgc_mgsexp = exp;
475
476 out:
477         /* Keep the mgc info in the sb. Note that many lsi's can point
478            to the same mgc.*/
479         lsi->lsi_mgc = obd;
480 out_free:
481         mutex_unlock(&mgc_start_lock);
482
483         if (data)
484                 OBD_FREE_PTR(data);
485         if (mgcname)
486                 OBD_FREE(mgcname, len);
487         if (niduuid)
488                 OBD_FREE(niduuid, len + 2);
489         RETURN(rc);
490 }
491
492 static int lustre_stop_mgc(struct super_block *sb)
493 {
494         struct lustre_sb_info *lsi = s2lsi(sb);
495         struct obd_device *obd;
496         char *niduuid = NULL, *ptr = NULL;
497         int i, rc = 0, len = 0;
498         ENTRY;
499
500         if (!lsi)
501                 RETURN(-ENOENT);
502         obd = lsi->lsi_mgc;
503         if (!obd)
504                 RETURN(-ENOENT);
505         lsi->lsi_mgc = NULL;
506
507         mutex_lock(&mgc_start_lock);
508         LASSERT(atomic_read(&obd->u.cli.cl_mgc_refcount) > 0);
509         if (!atomic_dec_and_test(&obd->u.cli.cl_mgc_refcount)) {
510                 /* This is not fatal, every client that stops
511                    will call in here. */
512                 CDEBUG(D_MOUNT, "mgc still has %d references.\n",
513                        atomic_read(&obd->u.cli.cl_mgc_refcount));
514                 GOTO(out, rc = -EBUSY);
515         }
516
517         /* The MGC has no recoverable data in any case.
518          * force shotdown set in umount_begin */
519         obd->obd_no_recov = 1;
520
521         if (obd->u.cli.cl_mgc_mgsexp) {
522                 /* An error is not fatal, if we are unable to send the
523                    disconnect mgs ping evictor cleans up the export */
524                 rc = obd_disconnect(obd->u.cli.cl_mgc_mgsexp);
525                 if (rc)
526                         CDEBUG(D_MOUNT, "disconnect failed %d\n", rc);
527         }
528
529         /* Save the obdname for cleaning the nid uuids, which are
530            obdname_XX */
531         len = strlen(obd->obd_name) + 6;
532         OBD_ALLOC(niduuid, len);
533         if (niduuid) {
534                 strcpy(niduuid, obd->obd_name);
535                 ptr = niduuid + strlen(niduuid);
536         }
537
538         rc = class_manual_cleanup(obd);
539         if (rc)
540                 GOTO(out, rc);
541
542         /* Clean the nid uuids */
543         if (!niduuid)
544                 GOTO(out, rc = -ENOMEM);
545
546         for (i = 0; i < lsi->lsi_lmd->lmd_mgs_failnodes; i++) {
547                 sprintf(ptr, "_%x", i);
548                 rc = do_lcfg(LUSTRE_MGC_OBDNAME, 0, LCFG_DEL_UUID,
549                              niduuid, NULL, NULL, NULL);
550                 if (rc)
551                         CERROR("del MDC UUID %s failed: rc = %d\n",
552                                niduuid, rc);
553         }
554 out:
555         if (niduuid)
556                 OBD_FREE(niduuid, len);
557
558         /* class_import_put will get rid of the additional connections */
559         mutex_unlock(&mgc_start_lock);
560         RETURN(rc);
561 }
562
563 /***************** lustre superblock **************/
564
565 static struct lustre_sb_info *lustre_init_lsi(struct super_block *sb)
566 {
567         struct lustre_sb_info *lsi;
568         ENTRY;
569
570         OBD_ALLOC_PTR(lsi);
571         if (!lsi)
572                 RETURN(NULL);
573         OBD_ALLOC_PTR(lsi->lsi_lmd);
574         if (!lsi->lsi_lmd) {
575                 OBD_FREE_PTR(lsi);
576                 RETURN(NULL);
577         }
578
579         lsi->lsi_lmd->lmd_exclude_count = 0;
580         lsi->lsi_lmd->lmd_recovery_time_soft = 0;
581         lsi->lsi_lmd->lmd_recovery_time_hard = 0;
582         s2lsi_nocast(sb) = lsi;
583         /* we take 1 extra ref for our setup */
584         atomic_set(&lsi->lsi_mounts, 1);
585
586         /* Default umount style */
587         lsi->lsi_flags = LSI_UMOUNT_FAILOVER;
588         INIT_LIST_HEAD(&lsi->lsi_lwp_list);
589         spin_lock_init(&lsi->lsi_lwp_lock);
590
591         RETURN(lsi);
592 }
593
594 static int lustre_free_lsi(struct super_block *sb)
595 {
596         struct lustre_sb_info *lsi = s2lsi(sb);
597         ENTRY;
598
599         LASSERT(lsi != NULL);
600         CDEBUG(D_MOUNT, "Freeing lsi %p\n", lsi);
601
602         /* someone didn't call server_put_mount. */
603         LASSERT(atomic_read(&lsi->lsi_mounts) == 0);
604
605         if (lsi->lsi_lmd != NULL) {
606                 if (lsi->lsi_lmd->lmd_dev != NULL)
607                         OBD_FREE(lsi->lsi_lmd->lmd_dev,
608                                 strlen(lsi->lsi_lmd->lmd_dev) + 1);
609                 if (lsi->lsi_lmd->lmd_profile != NULL)
610                         OBD_FREE(lsi->lsi_lmd->lmd_profile,
611                                 strlen(lsi->lsi_lmd->lmd_profile) + 1);
612                 if (lsi->lsi_lmd->lmd_fileset != NULL)
613                         OBD_FREE(lsi->lsi_lmd->lmd_fileset,
614                                 strlen(lsi->lsi_lmd->lmd_fileset) + 1);
615                 if (lsi->lsi_lmd->lmd_mgssec != NULL)
616                         OBD_FREE(lsi->lsi_lmd->lmd_mgssec,
617                                 strlen(lsi->lsi_lmd->lmd_mgssec) + 1);
618                 if (lsi->lsi_lmd->lmd_opts != NULL)
619                         OBD_FREE(lsi->lsi_lmd->lmd_opts,
620                                 strlen(lsi->lsi_lmd->lmd_opts) + 1);
621                 if (lsi->lsi_lmd->lmd_exclude_count)
622                         OBD_FREE(lsi->lsi_lmd->lmd_exclude,
623                                 sizeof(lsi->lsi_lmd->lmd_exclude[0]) *
624                                 lsi->lsi_lmd->lmd_exclude_count);
625                 if (lsi->lsi_lmd->lmd_mgs != NULL)
626                         OBD_FREE(lsi->lsi_lmd->lmd_mgs,
627                                  strlen(lsi->lsi_lmd->lmd_mgs) + 1);
628                 if (lsi->lsi_lmd->lmd_osd_type != NULL)
629                         OBD_FREE(lsi->lsi_lmd->lmd_osd_type,
630                                  strlen(lsi->lsi_lmd->lmd_osd_type) + 1);
631                 if (lsi->lsi_lmd->lmd_params != NULL)
632                         OBD_FREE(lsi->lsi_lmd->lmd_params, 4096);
633
634                 OBD_FREE_PTR(lsi->lsi_lmd);
635         }
636
637         LASSERT(lsi->lsi_llsbi == NULL);
638         OBD_FREE_PTR(lsi);
639         s2lsi_nocast(sb) = NULL;
640
641         RETURN(0);
642 }
643
644 /* The lsi has one reference for every server that is using the disk -
645    e.g. MDT, MGS, and potentially MGC */
646 int lustre_put_lsi(struct super_block *sb)
647 {
648         struct lustre_sb_info *lsi = s2lsi(sb);
649         ENTRY;
650
651         LASSERT(lsi != NULL);
652
653         CDEBUG(D_MOUNT, "put %p %d\n", sb, atomic_read(&lsi->lsi_mounts));
654         if (atomic_dec_and_test(&lsi->lsi_mounts)) {
655                 if (IS_SERVER(lsi) && lsi->lsi_osd_exp) {
656                         lu_device_put(&lsi->lsi_dt_dev->dd_lu_dev);
657                         lsi->lsi_osd_exp->exp_obd->obd_lvfs_ctxt.dt = NULL;
658                         lsi->lsi_dt_dev = NULL;
659                         obd_disconnect(lsi->lsi_osd_exp);
660                         /* wait till OSD is gone */
661                         obd_zombie_barrier();
662                 }
663                 lustre_free_lsi(sb);
664                 RETURN(1);
665         }
666         RETURN(0);
667 }
668
669 /*** SERVER NAME ***
670  * <FSNAME><SEPARATOR><TYPE><INDEX>
671  * FSNAME is between 1 and 8 characters (inclusive).
672  *      Excluded characters are '/' and ':'
673  * SEPARATOR is either ':' or '-'
674  * TYPE: "OST", "MDT", etc.
675  * INDEX: Hex representation of the index
676  */
677
678 /** Get the fsname ("lustre") from the server name ("lustre-OST003F").
679  * @param [in] svname server name including type and index
680  * @param [out] fsname Buffer to copy filesystem name prefix into.
681  *  Must have at least 'strlen(fsname) + 1' chars.
682  * @param [out] endptr if endptr isn't NULL it is set to end of fsname
683  * rc < 0  on error
684  */
685 int server_name2fsname(const char *svname, char *fsname, const char **endptr)
686 {
687         const char *dash;
688
689         dash = svname + strnlen(svname, 8); /* max fsname length is 8 */
690         for (; dash > svname && *dash != '-' && *dash != ':'; dash--)
691                 ;
692         if (dash == svname)
693                 return -EINVAL;
694
695         if (fsname != NULL) {
696                 strncpy(fsname, svname, dash - svname);
697                 fsname[dash - svname] = '\0';
698         }
699
700         if (endptr != NULL)
701                 *endptr = dash;
702
703         return 0;
704 }
705 EXPORT_SYMBOL(server_name2fsname);
706
707 /**
708  * Get service name (svname) from string
709  * rc < 0 on error
710  * if endptr isn't NULL it is set to end of fsname *
711  */
712 int server_name2svname(const char *label, char *svname, const char **endptr,
713                        size_t svsize)
714 {
715         int rc;
716         const char *dash;
717
718         /* We use server_name2fsname() just for parsing */
719         rc = server_name2fsname(label, NULL, &dash);
720         if (rc != 0)
721                 return rc;
722
723         if (endptr != NULL)
724                 *endptr = dash;
725
726         if (strlcpy(svname, dash + 1, svsize) >= svsize)
727                 return -E2BIG;
728
729         return 0;
730 }
731 EXPORT_SYMBOL(server_name2svname);
732
733 /**
734  * check server name is OST.
735  **/
736 int server_name_is_ost(const char *svname)
737 {
738         const char *dash;
739         int rc;
740
741         /* We use server_name2fsname() just for parsing */
742         rc = server_name2fsname(svname, NULL, &dash);
743         if (rc != 0)
744                 return rc;
745
746         dash++;
747
748         if (strncmp(dash, "OST", 3) == 0)
749                 return 1;
750         return 0;
751 }
752 EXPORT_SYMBOL(server_name_is_ost);
753
754 /**
755  * Get the index from the target name MDTXXXX/OSTXXXX
756  * rc = server type, or rc < 0  on error
757  **/
758 int target_name2index(const char *tgtname, __u32 *idx, const char **endptr)
759 {
760         const char *dash = tgtname;
761         unsigned long index;
762         int rc;
763
764         if (strncmp(dash, "MDT", 3) == 0)
765                 rc = LDD_F_SV_TYPE_MDT;
766         else if (strncmp(dash, "OST", 3) == 0)
767                 rc = LDD_F_SV_TYPE_OST;
768         else
769                 return -EINVAL;
770
771         dash += 3;
772
773         if (strncmp(dash, "all", 3) == 0) {
774                 if (endptr != NULL)
775                         *endptr = dash + 3;
776                 return rc | LDD_F_SV_ALL;
777         }
778
779         index = simple_strtoul(dash, (char **)endptr, 16);
780         if (idx != NULL)
781                 *idx = index;
782         return rc;
783 }
784 EXPORT_SYMBOL(target_name2index);
785
786 /* Get the index from the obd name.
787    rc = server type, or
788    rc < 0  on error
789    if endptr isn't NULL it is set to end of name */
790 int server_name2index(const char *svname, __u32 *idx, const char **endptr)
791 {
792         const char *dash;
793         int rc;
794
795         /* We use server_name2fsname() just for parsing */
796         rc = server_name2fsname(svname, NULL, &dash);
797         if (rc != 0)
798                 return rc;
799
800         dash++;
801         rc = target_name2index(dash, idx, endptr);
802         if (rc < 0)
803                 return rc;
804
805         /* Account for -mdc after index that is possible when specifying mdt */
806         if (endptr != NULL && strncmp(LUSTRE_MDC_NAME, *endptr + 1,
807                                       sizeof(LUSTRE_MDC_NAME)-1) == 0)
808                 *endptr += sizeof(LUSTRE_MDC_NAME);
809
810         return rc;
811 }
812 EXPORT_SYMBOL(server_name2index);
813
814 /*************** mount common betweeen server and client ***************/
815
816 /* Common umount */
817 int lustre_common_put_super(struct super_block *sb)
818 {
819         int rc;
820         ENTRY;
821
822         CDEBUG(D_MOUNT, "dropping sb %p\n", sb);
823
824         /* Drop a ref to the MGC */
825         rc = lustre_stop_mgc(sb);
826         if (rc && (rc != -ENOENT)) {
827                 if (rc != -EBUSY) {
828                         CERROR("Can't stop MGC: %d\n", rc);
829                         RETURN(rc);
830                 }
831                 /* BUSY just means that there's some other obd that
832                    needs the mgc.  Let him clean it up. */
833                 CDEBUG(D_MOUNT, "MGC still in use\n");
834         }
835         /* Drop a ref to the mounted disk */
836         lustre_put_lsi(sb);
837
838         RETURN(rc);
839 }
840 EXPORT_SYMBOL(lustre_common_put_super);
841
842 static void lmd_print(struct lustre_mount_data *lmd)
843 {
844         int i;
845
846         PRINT_CMD(D_MOUNT, "  mount data:\n");
847         if (lmd_is_client(lmd))
848                 PRINT_CMD(D_MOUNT, "profile: %s\n", lmd->lmd_profile);
849         PRINT_CMD(D_MOUNT, "device:  %s\n", lmd->lmd_dev);
850         PRINT_CMD(D_MOUNT, "flags:   %x\n", lmd->lmd_flags);
851
852         if (lmd->lmd_opts)
853                 PRINT_CMD(D_MOUNT, "options: %s\n", lmd->lmd_opts);
854
855         if (lmd->lmd_recovery_time_soft)
856                 PRINT_CMD(D_MOUNT, "recovery time soft: %d\n",
857                           lmd->lmd_recovery_time_soft);
858
859         if (lmd->lmd_recovery_time_hard)
860                 PRINT_CMD(D_MOUNT, "recovery time hard: %d\n",
861                           lmd->lmd_recovery_time_hard);
862
863         for (i = 0; i < lmd->lmd_exclude_count; i++) {
864                 PRINT_CMD(D_MOUNT, "exclude %d:  OST%04x\n", i,
865                           lmd->lmd_exclude[i]);
866         }
867 }
868
869 /* Is this server on the exclusion list */
870 int lustre_check_exclusion(struct super_block *sb, char *svname)
871 {
872         struct lustre_sb_info *lsi = s2lsi(sb);
873         struct lustre_mount_data *lmd = lsi->lsi_lmd;
874         __u32 index;
875         int i, rc;
876         ENTRY;
877
878         rc = server_name2index(svname, &index, NULL);
879         if (rc != LDD_F_SV_TYPE_OST)
880                 /* Only exclude OSTs */
881                 RETURN(0);
882
883         CDEBUG(D_MOUNT, "Check exclusion %s (%d) in %d of %s\n", svname,
884                index, lmd->lmd_exclude_count, lmd->lmd_dev);
885
886         for(i = 0; i < lmd->lmd_exclude_count; i++) {
887                 if (index == lmd->lmd_exclude[i]) {
888                         CWARN("Excluding %s (on exclusion list)\n", svname);
889                         RETURN(1);
890                 }
891         }
892         RETURN(0);
893 }
894
895 /* mount -v  -o exclude=lustre-OST0001:lustre-OST0002 -t lustre ... */
896 static int lmd_make_exclusion(struct lustre_mount_data *lmd, const char *ptr)
897 {
898         const char *s1 = ptr, *s2;
899         __u32 *exclude_list;
900         __u32 index = 0;
901         int rc = 0, devmax;
902         ENTRY;
903
904         /* The shortest an ost name can be is 8 chars: -OST0000.
905            We don't actually know the fsname at this time, so in fact
906            a user could specify any fsname. */
907         devmax = strlen(ptr) / 8 + 1;
908
909         /* temp storage until we figure out how many we have */
910         OBD_ALLOC(exclude_list, sizeof(index) * devmax);
911         if (!exclude_list)
912                 RETURN(-ENOMEM);
913
914         /* we enter this fn pointing at the '=' */
915         while (*s1 && *s1 != ' ' && *s1 != ',') {
916                 s1++;
917                 rc = server_name2index(s1, &index, &s2);
918                 if (rc < 0) {
919                         CERROR("Can't parse server name '%s': rc = %d\n",
920                                s1, rc);
921                         break;
922                 }
923                 if (rc == LDD_F_SV_TYPE_OST)
924                         exclude_list[lmd->lmd_exclude_count++] = index;
925                 else
926                         CDEBUG(D_MOUNT, "ignoring exclude %.*s: type = %#x\n",
927                                (uint)(s2-s1), s1, rc);
928                 s1 = s2;
929                 /* now we are pointing at ':' (next exclude)
930                    or ',' (end of excludes) */
931                 if (lmd->lmd_exclude_count >= devmax)
932                         break;
933         }
934         if (rc >= 0) /* non-err */
935                 rc = 0;
936
937         if (lmd->lmd_exclude_count) {
938                 /* permanent, freed in lustre_free_lsi */
939                 OBD_ALLOC(lmd->lmd_exclude, sizeof(index) *
940                           lmd->lmd_exclude_count);
941                 if (lmd->lmd_exclude) {
942                         memcpy(lmd->lmd_exclude, exclude_list,
943                                sizeof(index) * lmd->lmd_exclude_count);
944                 } else {
945                         rc = -ENOMEM;
946                         lmd->lmd_exclude_count = 0;
947                 }
948         }
949         OBD_FREE(exclude_list, sizeof(index) * devmax);
950         RETURN(rc);
951 }
952
953 static int lmd_parse_mgssec(struct lustre_mount_data *lmd, char *ptr)
954 {
955         char   *tail;
956         int     length;
957
958         if (lmd->lmd_mgssec != NULL) {
959                 OBD_FREE(lmd->lmd_mgssec, strlen(lmd->lmd_mgssec) + 1);
960                 lmd->lmd_mgssec = NULL;
961         }
962
963         tail = strchr(ptr, ',');
964         if (tail == NULL)
965                 length = strlen(ptr);
966         else
967                 length = tail - ptr;
968
969         OBD_ALLOC(lmd->lmd_mgssec, length + 1);
970         if (lmd->lmd_mgssec == NULL)
971                 return -ENOMEM;
972
973         memcpy(lmd->lmd_mgssec, ptr, length);
974         lmd->lmd_mgssec[length] = '\0';
975         return 0;
976 }
977
978 static int lmd_parse_string(char **handle, char *ptr)
979 {
980         char   *tail;
981         int     length;
982
983         if ((handle == NULL) || (ptr == NULL))
984                 return -EINVAL;
985
986         if (*handle != NULL) {
987                 OBD_FREE(*handle, strlen(*handle) + 1);
988                 *handle = NULL;
989         }
990
991         tail = strchr(ptr, ',');
992         if (tail == NULL)
993                 length = strlen(ptr);
994         else
995                 length = tail - ptr;
996
997         OBD_ALLOC(*handle, length + 1);
998         if (*handle == NULL)
999                 return -ENOMEM;
1000
1001         memcpy(*handle, ptr, length);
1002         (*handle)[length] = '\0';
1003
1004         return 0;
1005 }
1006
1007 /* Collect multiple values for mgsnid specifiers */
1008 static int lmd_parse_mgs(struct lustre_mount_data *lmd, char **ptr)
1009 {
1010         lnet_nid_t nid;
1011         char *tail = *ptr;
1012         char *mgsnid;
1013         int   length;
1014         int   oldlen = 0;
1015
1016         /* Find end of nidlist */
1017         while (class_parse_nid_quiet(tail, &nid, &tail) == 0) {}
1018         length = tail - *ptr;
1019         if (length == 0) {
1020                 LCONSOLE_ERROR_MSG(0x159, "Can't parse NID '%s'\n", *ptr);
1021                 return -EINVAL;
1022         }
1023
1024         if (lmd->lmd_mgs != NULL)
1025                 oldlen = strlen(lmd->lmd_mgs) + 1;
1026
1027         OBD_ALLOC(mgsnid, oldlen + length + 1);
1028         if (mgsnid == NULL)
1029                 return -ENOMEM;
1030
1031         if (lmd->lmd_mgs != NULL) {
1032                 /* Multiple mgsnid= are taken to mean failover locations */
1033                 memcpy(mgsnid, lmd->lmd_mgs, oldlen);
1034                 mgsnid[oldlen - 1] = ':';
1035                 OBD_FREE(lmd->lmd_mgs, oldlen);
1036         }
1037         memcpy(mgsnid + oldlen, *ptr, length);
1038         mgsnid[oldlen + length] = '\0';
1039         lmd->lmd_mgs = mgsnid;
1040         *ptr = tail;
1041
1042         return 0;
1043 }
1044
1045 /**
1046  * Find the first comma delimiter from the specified \a buf and make \a *endh
1047  * point to the string starting with the comma. The commas in expression list
1048  * [...] will be skipped.
1049  *
1050  * \param[in] buf       a comma-separated string
1051  * \param[in] endh      a pointer to a pointer that will point to the string
1052  *                      starting with the comma
1053  *
1054  * \retval 0            if comma delimiter is found
1055  * \retval 1            if comma delimiter is not found
1056  */
1057 static int lmd_find_comma(char *buf, char **endh)
1058 {
1059         char *c = buf;
1060         int   skip = 0;
1061
1062         if (buf == NULL)
1063                 return 1;
1064
1065         while (*c != '\0') {
1066                 if (*c == '[')
1067                         skip++;
1068                 else if (*c == ']')
1069                         skip--;
1070
1071                 if (*c == ',' && skip == 0) {
1072                         if (endh != NULL)
1073                                 *endh = c;
1074                         return 0;
1075                 }
1076
1077                 c++;
1078         }
1079
1080         return 1;
1081 }
1082
1083 /**
1084  * Find the first valid string delimited by comma from the specified \a buf
1085  # and parse it to see whether it's a valid nid list. If yes, \a *endh will
1086  * point to the next string starting with the comma.
1087  *
1088  * \param[in] buf       a comma-separated string
1089  * \param[in] endh      a pointer to a pointer that will point to the string
1090  *                      starting with the comma
1091  *
1092  * \retval 0            if the string is a valid nid list
1093  * \retval 1            if the string is not a valid nid list
1094  */
1095 static int lmd_parse_nidlist(char *buf, char **endh)
1096 {
1097         struct list_head nidlist;
1098         char            *endp = buf;
1099         char             tmp;
1100         int              rc = 0;
1101
1102         if (buf == NULL)
1103                 return 1;
1104         while (*buf == ',' || *buf == ':')
1105                 buf++;
1106         if (*buf == ' ' || *buf == '/' || *buf == '\0')
1107                 return 1;
1108
1109         if (lmd_find_comma(buf, &endp) != 0)
1110                 endp = buf + strlen(buf);
1111
1112         tmp = *endp;
1113         *endp = '\0';
1114
1115         INIT_LIST_HEAD(&nidlist);
1116         if (cfs_parse_nidlist(buf, strlen(buf), &nidlist) <= 0)
1117                 rc = 1;
1118         cfs_free_nidlist(&nidlist);
1119
1120         *endp = tmp;
1121         if (rc != 0)
1122                 return rc;
1123         if (endh != NULL)
1124                 *endh = endp;
1125         return 0;
1126 }
1127
1128 /** Parse mount line options
1129  * e.g. mount -v -t lustre -o abort_recov uml1:uml2:/lustre-client /mnt/lustre
1130  * dev is passed as device=uml1:/lustre by mount.lustre
1131  */
1132 static int lmd_parse(char *options, struct lustre_mount_data *lmd)
1133 {
1134         char *s1, *s2, *s3, *devname = NULL;
1135         struct lustre_mount_data *raw = (struct lustre_mount_data *)options;
1136         int rc = 0;
1137         ENTRY;
1138
1139         LASSERT(lmd);
1140         if (!options) {
1141                 LCONSOLE_ERROR_MSG(0x162, "Missing mount data: check that "
1142                                    "/sbin/mount.lustre is installed.\n");
1143                 RETURN(-EINVAL);
1144         }
1145
1146         /* Options should be a string - try to detect old lmd data */
1147         if ((raw->lmd_magic & 0xffffff00) == (LMD_MAGIC & 0xffffff00)) {
1148                 LCONSOLE_ERROR_MSG(0x163, "You're using an old version of "
1149                                    "/sbin/mount.lustre.  Please install "
1150                                    "version %s\n", LUSTRE_VERSION_STRING);
1151                 RETURN(-EINVAL);
1152         }
1153         lmd->lmd_magic = LMD_MAGIC;
1154
1155         OBD_ALLOC(lmd->lmd_params, LMD_PARAMS_MAXLEN);
1156         if (lmd->lmd_params == NULL)
1157                 RETURN(-ENOMEM);
1158         lmd->lmd_params[0] = '\0';
1159
1160         /* Set default flags here */
1161
1162         s1 = options;
1163         while (*s1) {
1164                 int clear = 0;
1165                 int time_min = OBD_RECOVERY_TIME_MIN;
1166
1167                 /* Skip whitespace and extra commas */
1168                 while (*s1 == ' ' || *s1 == ',')
1169                         s1++;
1170                 s3 = s1;
1171
1172                 /* Client options are parsed in ll_options: eg. flock,
1173                    user_xattr, acl */
1174
1175                 /* Parse non-ldiskfs options here. Rather than modifying
1176                    ldiskfs, we just zero these out here */
1177                 if (strncmp(s1, "abort_recov", 11) == 0) {
1178                         lmd->lmd_flags |= LMD_FLG_ABORT_RECOV;
1179                         clear++;
1180                 } else if (strncmp(s1, "recovery_time_soft=", 19) == 0) {
1181                         lmd->lmd_recovery_time_soft = max_t(int,
1182                                 simple_strtoul(s1 + 19, NULL, 10), time_min);
1183                         clear++;
1184                 } else if (strncmp(s1, "recovery_time_hard=", 19) == 0) {
1185                         lmd->lmd_recovery_time_hard = max_t(int,
1186                                 simple_strtoul(s1 + 19, NULL, 10), time_min);
1187                         clear++;
1188                 } else if (strncmp(s1, "noir", 4) == 0) {
1189                         lmd->lmd_flags |= LMD_FLG_NOIR; /* test purpose only. */
1190                         clear++;
1191                 } else if (strncmp(s1, "nosvc", 5) == 0) {
1192                         lmd->lmd_flags |= LMD_FLG_NOSVC;
1193                         clear++;
1194                 } else if (strncmp(s1, "nomgs", 5) == 0) {
1195                         lmd->lmd_flags |= LMD_FLG_NOMGS;
1196                         clear++;
1197                 } else if (strncmp(s1, "noscrub", 7) == 0) {
1198                         lmd->lmd_flags |= LMD_FLG_NOSCRUB;
1199                         clear++;
1200                 } else if (strncmp(s1, "skip_lfsck", 10) == 0) {
1201                         lmd->lmd_flags |= LMD_FLG_SKIP_LFSCK;
1202                         clear++;
1203                 } else if (strncmp(s1, PARAM_MGSNODE,
1204                                    sizeof(PARAM_MGSNODE) - 1) == 0) {
1205                         s2 = s1 + sizeof(PARAM_MGSNODE) - 1;
1206                         /* Assume the next mount opt is the first
1207                            invalid nid we get to. */
1208                         rc = lmd_parse_mgs(lmd, &s2);
1209                         if (rc)
1210                                 goto invalid;
1211                         s3 = s2;
1212                         clear++;
1213                 } else if (strncmp(s1, "writeconf", 9) == 0) {
1214                         lmd->lmd_flags |= LMD_FLG_WRITECONF;
1215                         clear++;
1216                 } else if (strncmp(s1, "update", 6) == 0) {
1217                         lmd->lmd_flags |= LMD_FLG_UPDATE;
1218                         clear++;
1219                 } else if (strncmp(s1, "virgin", 6) == 0) {
1220                         lmd->lmd_flags |= LMD_FLG_VIRGIN;
1221                         clear++;
1222                 } else if (strncmp(s1, "noprimnode", 10) == 0) {
1223                         lmd->lmd_flags |= LMD_FLG_NO_PRIMNODE;
1224                         clear++;
1225                 } else if (strncmp(s1, "mgssec=", 7) == 0) {
1226                         rc = lmd_parse_mgssec(lmd, s1 + 7);
1227                         if (rc)
1228                                 goto invalid;
1229                         clear++;
1230                 /* ost exclusion list */
1231                 } else if (strncmp(s1, "exclude=", 8) == 0) {
1232                         rc = lmd_make_exclusion(lmd, s1 + 7);
1233                         if (rc)
1234                                 goto invalid;
1235                         clear++;
1236                 } else if (strncmp(s1, "mgs", 3) == 0) {
1237                         /* We are an MGS */
1238                         lmd->lmd_flags |= LMD_FLG_MGS;
1239                         clear++;
1240                 } else if (strncmp(s1, "svname=", 7) == 0) {
1241                         rc = lmd_parse_string(&lmd->lmd_profile, s1 + 7);
1242                         if (rc)
1243                                 goto invalid;
1244                         clear++;
1245                 } else if (strncmp(s1, "param=", 6) == 0) {
1246                         size_t length, params_length;
1247                         char  *tail = s1;
1248                         if (lmd_find_comma(s1 + 6, &tail) != 0)
1249                                 length = strlen(s1);
1250                         else {
1251                                 char *param_str = tail + 1;
1252                                 int   supplementary = 1;
1253                                 while (lmd_parse_nidlist(param_str,
1254                                                          &param_str) == 0) {
1255                                         supplementary = 0;
1256                                 }
1257                                 length = param_str - s1 - supplementary;
1258                         }
1259                         length -= 6;
1260                         params_length = strlen(lmd->lmd_params);
1261                         if (params_length + length + 1 >= LMD_PARAMS_MAXLEN)
1262                                 RETURN(-E2BIG);
1263                         strncat(lmd->lmd_params, s1 + 6, length);
1264                         lmd->lmd_params[params_length + length] = '\0';
1265                         strlcat(lmd->lmd_params, " ", LMD_PARAMS_MAXLEN);
1266                         s3 = s1 + 6 + length;
1267                         clear++;
1268                 } else if (strncmp(s1, "osd=", 4) == 0) {
1269                         rc = lmd_parse_string(&lmd->lmd_osd_type, s1 + 4);
1270                         if (rc)
1271                                 goto invalid;
1272                         clear++;
1273                 }
1274                 /* Linux 2.4 doesn't pass the device, so we stuck it at the
1275                    end of the options. */
1276                 else if (strncmp(s1, "device=", 7) == 0) {
1277                         devname = s1 + 7;
1278                         /* terminate options right before device.  device
1279                            must be the last one. */
1280                         *s1 = '\0';
1281                         break;
1282                 }
1283
1284                 /* Find next opt */
1285                 s2 = strchr(s3, ',');
1286                 if (s2 == NULL) {
1287                         if (clear)
1288                                 *s1 = '\0';
1289                         break;
1290                 }
1291                 s2++;
1292                 if (clear)
1293                         memmove(s1, s2, strlen(s2) + 1);
1294                 else
1295                         s1 = s2;
1296         }
1297
1298         if (!devname) {
1299                 LCONSOLE_ERROR_MSG(0x164, "Can't find the device name "
1300                                    "(need mount option 'device=...')\n");
1301                 goto invalid;
1302         }
1303
1304         s1 = strstr(devname, ":/");
1305         if (s1) {
1306                 ++s1;
1307                 lmd->lmd_flags |= LMD_FLG_CLIENT;
1308                 /* Remove leading /s from fsname */
1309                 while (*++s1 == '/')
1310                         ;
1311                 s2 = s1;
1312                 while (*s2 != '/' && *s2 != '\0')
1313                         s2++;
1314                 /* Freed in lustre_free_lsi */
1315                 OBD_ALLOC(lmd->lmd_profile, s2 - s1 + 8);
1316                 if (!lmd->lmd_profile)
1317                         RETURN(-ENOMEM);
1318
1319                 strncat(lmd->lmd_profile, s1, s2 - s1);
1320                 strncat(lmd->lmd_profile, "-client", 7);
1321
1322                 s1 = s2;
1323                 s2 = s1 + strlen(s1) - 1;
1324                 /* Remove padding /s from fileset */
1325                 while (*s2 == '/')
1326                         s2--;
1327                 if (s2 > s1) {
1328                         OBD_ALLOC(lmd->lmd_fileset, s2 - s1 + 2);
1329                         if (lmd->lmd_fileset == NULL) {
1330                                 OBD_FREE(lmd->lmd_profile,
1331                                         strlen(lmd->lmd_profile) + 1);
1332                                 RETURN(-ENOMEM);
1333                         }
1334                         strncat(lmd->lmd_fileset, s1, s2 - s1 + 1);
1335                 }
1336         }
1337
1338         /* Freed in lustre_free_lsi */
1339         OBD_ALLOC(lmd->lmd_dev, strlen(devname) + 1);
1340         if (!lmd->lmd_dev)
1341                 RETURN(-ENOMEM);
1342         strcpy(lmd->lmd_dev, devname);
1343
1344         /* Save mount options */
1345         s1 = options + strlen(options) - 1;
1346         while (s1 >= options && (*s1 == ',' || *s1 == ' '))
1347                 *s1-- = 0;
1348         if (*options != 0) {
1349                 /* Freed in lustre_free_lsi */
1350                 OBD_ALLOC(lmd->lmd_opts, strlen(options) + 1);
1351                 if (!lmd->lmd_opts)
1352                         RETURN(-ENOMEM);
1353                 strcpy(lmd->lmd_opts, options);
1354         }
1355
1356         lmd_print(lmd);
1357         lmd->lmd_magic = LMD_MAGIC;
1358
1359         RETURN(rc);
1360
1361 invalid:
1362         CERROR("Bad mount options %s\n", options);
1363         RETURN(-EINVAL);
1364 }
1365
1366 struct lustre_mount_data2 {
1367         void *lmd2_data;
1368         struct vfsmount *lmd2_mnt;
1369 };
1370
1371 /** This is the entry point for the mount call into Lustre.
1372  * This is called when a server or client is mounted,
1373  * and this is where we start setting things up.
1374  * @param data Mount options (e.g. -o flock,abort_recov)
1375  */
1376 static int lustre_fill_super(struct super_block *sb, void *data, int silent)
1377 {
1378         struct lustre_mount_data *lmd;
1379         struct lustre_mount_data2 *lmd2 = data;
1380         struct lustre_sb_info *lsi;
1381         int rc;
1382         ENTRY;
1383
1384         CDEBUG(D_MOUNT|D_VFSTRACE, "VFS Op: sb %p\n", sb);
1385
1386         lsi = lustre_init_lsi(sb);
1387         if (!lsi)
1388                 RETURN(-ENOMEM);
1389         lmd = lsi->lsi_lmd;
1390
1391         /*
1392          * Disable lockdep during mount, because mount locking patterns are
1393          * `special'.
1394          */
1395         lockdep_off();
1396
1397         /*
1398          * LU-639: the obd cleanup of last mount may not finish yet, wait here.
1399          */
1400         obd_zombie_barrier();
1401
1402         /* Figure out the lmd from the mount options */
1403         if (lmd_parse((char *)(lmd2->lmd2_data), lmd)) {
1404                 lustre_put_lsi(sb);
1405                 GOTO(out, rc = -EINVAL);
1406         }
1407
1408         if (lmd_is_client(lmd)) {
1409                 CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
1410                 if (client_fill_super == NULL)
1411                         request_module("lustre");
1412                 if (client_fill_super == NULL) {
1413                         LCONSOLE_ERROR_MSG(0x165, "Nothing registered for "
1414                                            "client mount! Is the 'lustre' "
1415                                            "module loaded?\n");
1416                         lustre_put_lsi(sb);
1417                         rc = -ENODEV;
1418                 } else {
1419                         rc = lustre_start_mgc(sb);
1420                         if (rc) {
1421                                 lustre_put_lsi(sb);
1422                                 GOTO(out, rc);
1423                         }
1424                         /* Connect and start */
1425                         /* (should always be ll_fill_super) */
1426                         rc = (*client_fill_super)(sb, lmd2->lmd2_mnt);
1427                         /* c_f_s will call lustre_common_put_super on failure */
1428                 }
1429         } else {
1430 #ifdef HAVE_SERVER_SUPPORT
1431                 CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
1432                 rc = server_fill_super(sb);
1433                 /* s_f_s calls lustre_start_mgc after the mount because we need
1434                    the MGS nids which are stored on disk.  Plus, we may
1435                    need to start the MGS first. */
1436                 /* s_f_s will call server_put_super on failure */
1437 #else
1438                 CERROR("This is client-side-only module, "
1439                        "cannot handle server mount.\n");
1440                 rc = -EINVAL;
1441 #endif
1442         }
1443
1444         /* If error happens in fill_super() call, @lsi will be killed there.
1445          * This is why we do not put it here. */
1446         GOTO(out, rc);
1447 out:
1448         if (rc) {
1449                 CERROR("Unable to mount %s (%d)\n",
1450                        s2lsi(sb) ? lmd->lmd_dev : "", rc);
1451         } else {
1452                 CDEBUG(D_SUPER, "Mount %s complete\n",
1453                        lmd->lmd_dev);
1454         }
1455         lockdep_on();
1456         return rc;
1457 }
1458
1459
1460 /* We can't call ll_fill_super by name because it lives in a module that
1461    must be loaded after this one. */
1462 void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb,
1463                                                   struct vfsmount *mnt))
1464 {
1465         client_fill_super = cfs;
1466 }
1467 EXPORT_SYMBOL(lustre_register_client_fill_super);
1468
1469 void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb))
1470 {
1471         kill_super_cb = cfs;
1472 }
1473 EXPORT_SYMBOL(lustre_register_kill_super_cb);
1474
1475 /***************** FS registration ******************/
1476 #ifdef HAVE_FSTYPE_MOUNT
1477 static struct dentry *lustre_mount(struct file_system_type *fs_type, int flags,
1478                                    const char *devname, void *data)
1479 {
1480         struct lustre_mount_data2 lmd2 = { data, NULL };
1481
1482         return mount_nodev(fs_type, flags, &lmd2, lustre_fill_super);
1483 }
1484 #else
1485 static int lustre_get_sb(struct file_system_type *fs_type, int flags,
1486                          const char *devname, void *data, struct vfsmount *mnt)
1487 {
1488         struct lustre_mount_data2 lmd2 = { data, mnt };
1489
1490         return get_sb_nodev(fs_type, flags, &lmd2, lustre_fill_super, mnt);
1491 }
1492 #endif
1493
1494 static void lustre_kill_super(struct super_block *sb)
1495 {
1496         struct lustre_sb_info *lsi = s2lsi(sb);
1497
1498         if (kill_super_cb && lsi && !IS_SERVER(lsi))
1499                 (*kill_super_cb)(sb);
1500
1501         kill_anon_super(sb);
1502 }
1503
1504 /** Register the "lustre" fs type
1505  */
1506 static struct file_system_type lustre_fs_type = {
1507         .owner        = THIS_MODULE,
1508         .name         = "lustre",
1509 #ifdef HAVE_FSTYPE_MOUNT
1510         .mount        = lustre_mount,
1511 #else
1512         .get_sb       = lustre_get_sb,
1513 #endif
1514         .kill_sb      = lustre_kill_super,
1515         .fs_flags     = FS_REQUIRES_DEV | FS_HAS_FIEMAP | FS_RENAME_DOES_D_MOVE,
1516 };
1517 MODULE_ALIAS_FS("lustre");
1518
1519 int lustre_register_fs(void)
1520 {
1521         return register_filesystem(&lustre_fs_type);
1522 }
1523
1524 int lustre_unregister_fs(void)
1525 {
1526         return unregister_filesystem(&lustre_fs_type);
1527 }