Whamcloud - gitweb
LU-12222 lnet: Introduce constant for the lolnd NID
[fs/lustre-release.git] / lustre / obdclass / obd_mount_server.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.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2013, 2017, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  * Lustre is a trademark of Sun Microsystems, Inc.
31  *
32  * lustre/obdclass/obd_mount_server.c
33  *
34  * Server mount routines
35  *
36  * Author: Nathan Rutman <nathan@clusterfs.com>
37  */
38
39
40 #define DEBUG_SUBSYSTEM S_CLASS
41 #define D_MOUNT (D_SUPER | D_CONFIG /* | D_WARNING */)
42 #define PRINT_CMD CDEBUG
43 #define PRINT_MASK (D_SUPER | D_CONFIG)
44
45 #include <linux/types.h>
46 #ifdef HAVE_LINUX_SELINUX_IS_ENABLED
47 #include <linux/selinux.h>
48 #endif
49 #include <linux/statfs.h>
50 #include <linux/version.h>
51 #ifdef HAVE_KERNEL_LOCKED
52 #include <linux/smp_lock.h>
53 #endif
54
55 #include <llog_swab.h>
56 #include <lustre_disk.h>
57 #include <uapi/linux/lustre/lustre_ioctl.h>
58 #include <lustre_log.h>
59 #include <uapi/linux/lustre/lustre_param.h>
60 #include <obd.h>
61 #include <obd_class.h>
62
63 /*********** mount lookup *********/
64
65 static DEFINE_MUTEX(lustre_mount_info_lock);
66 static LIST_HEAD(server_mount_info_list);
67
68 static struct lustre_mount_info *server_find_mount(const char *name)
69 {
70         struct list_head *tmp;
71         struct lustre_mount_info *lmi;
72         ENTRY;
73
74         list_for_each(tmp, &server_mount_info_list) {
75                 lmi = list_entry(tmp, struct lustre_mount_info,
76                                  lmi_list_chain);
77                 if (strcmp(name, lmi->lmi_name) == 0)
78                         RETURN(lmi);
79         }
80         RETURN(NULL);
81 }
82
83 /* we must register an obd for a mount before we call the setup routine.
84  *_setup will call lustre_get_mount to get the mnt struct
85  by obd_name, since we can't pass the pointer to setup. */
86 static int server_register_mount(const char *name, struct super_block *sb)
87 {
88         struct lustre_mount_info *lmi;
89         char *name_cp;
90         ENTRY;
91
92         LASSERT(sb);
93
94         OBD_ALLOC(lmi, sizeof(*lmi));
95         if (!lmi)
96                 RETURN(-ENOMEM);
97         OBD_ALLOC(name_cp, strlen(name) + 1);
98         if (!name_cp) {
99                 OBD_FREE(lmi, sizeof(*lmi));
100                 RETURN(-ENOMEM);
101         }
102         strcpy(name_cp, name);
103
104         mutex_lock(&lustre_mount_info_lock);
105
106         if (server_find_mount(name)) {
107                 mutex_unlock(&lustre_mount_info_lock);
108                 OBD_FREE(lmi, sizeof(*lmi));
109                 OBD_FREE(name_cp, strlen(name) + 1);
110                 CERROR("Already registered %s\n", name);
111                 RETURN(-EEXIST);
112         }
113         lmi->lmi_name = name_cp;
114         lmi->lmi_sb = sb;
115         list_add(&lmi->lmi_list_chain, &server_mount_info_list);
116
117         mutex_unlock(&lustre_mount_info_lock);
118
119         CDEBUG(D_MOUNT, "register mount %p from %s\n", sb, name);
120
121         RETURN(0);
122 }
123
124 /* when an obd no longer needs a mount */
125 static int server_deregister_mount(const char *name)
126 {
127         struct lustre_mount_info *lmi;
128         ENTRY;
129
130         mutex_lock(&lustre_mount_info_lock);
131         lmi = server_find_mount(name);
132         if (!lmi) {
133                 mutex_unlock(&lustre_mount_info_lock);
134                 CERROR("%s not registered\n", name);
135                 RETURN(-ENOENT);
136         }
137
138         CDEBUG(D_MOUNT, "deregister mount %p from %s\n", lmi->lmi_sb, name);
139
140         OBD_FREE(lmi->lmi_name, strlen(lmi->lmi_name) + 1);
141         list_del(&lmi->lmi_list_chain);
142         OBD_FREE(lmi, sizeof(*lmi));
143         mutex_unlock(&lustre_mount_info_lock);
144
145         RETURN(0);
146 }
147
148 /* obd's look up a registered mount using their obdname. This is just
149    for initial obd setup to find the mount struct.  It should not be
150    called every time you want to mntget. */
151 struct lustre_mount_info *server_get_mount(const char *name)
152 {
153         struct lustre_mount_info *lmi;
154         struct lustre_sb_info *lsi;
155         ENTRY;
156
157         mutex_lock(&lustre_mount_info_lock);
158         lmi = server_find_mount(name);
159         mutex_unlock(&lustre_mount_info_lock);
160         if (!lmi) {
161                 CERROR("Can't find mount for %s\n", name);
162                 RETURN(NULL);
163         }
164         lsi = s2lsi(lmi->lmi_sb);
165
166         atomic_inc(&lsi->lsi_mounts);
167
168         CDEBUG(D_MOUNT, "get mount %p from %s, refs=%d\n", lmi->lmi_sb,
169                name, atomic_read(&lsi->lsi_mounts));
170
171         RETURN(lmi);
172 }
173 EXPORT_SYMBOL(server_get_mount);
174
175 /**
176  * server_put_mount: to be called from obd_cleanup methods
177  * @name:       obd name
178  * @dereg_mnt:  0 or 1 depending on whether the mount is to be deregistered or
179  * not
180  *
181  * The caller decides whether server_deregister_mount() needs to be called or
182  * not. Calling of server_deregister_mount() does not depend on refcounting on
183  * lsi because we could have say the mgs and mds on the same node and we
184  * unmount the mds, then the ref on the lsi would still be non-zero but we
185  * would still want to deregister the mds mount.
186  */
187 int server_put_mount(const char *name, bool dereg_mnt)
188 {
189         struct lustre_mount_info *lmi;
190         struct lustre_sb_info *lsi;
191         ENTRY;
192
193         mutex_lock(&lustre_mount_info_lock);
194         lmi = server_find_mount(name);
195         mutex_unlock(&lustre_mount_info_lock);
196         if (!lmi) {
197                 CERROR("Can't find mount for %s\n", name);
198                 RETURN(-ENOENT);
199         }
200         lsi = s2lsi(lmi->lmi_sb);
201
202         CDEBUG(D_MOUNT, "put mount %p from %s, refs=%d\n",
203                lmi->lmi_sb, name, atomic_read(&lsi->lsi_mounts));
204
205         if (lustre_put_lsi(lmi->lmi_sb))
206                 CDEBUG(D_MOUNT, "Last put of mount %p from %s\n",
207                        lmi->lmi_sb, name);
208
209         if (dereg_mnt)
210                 /* this obd should never need the mount again */
211                 server_deregister_mount(name);
212
213         RETURN(0);
214 }
215 EXPORT_SYMBOL(server_put_mount);
216
217 /* Set up a MGS to serve startup logs */
218 static int server_start_mgs(struct super_block *sb)
219 {
220         struct lustre_sb_info    *lsi = s2lsi(sb);
221         struct lustre_mount_info *lmi;
222         int    rc = 0;
223         ENTRY;
224
225         /* It is impossible to have more than 1 MGS per node, since
226            MGC wouldn't know which to connect to */
227         lmi = server_find_mount(LUSTRE_MGS_OBDNAME);
228         if (lmi) {
229                 lsi = s2lsi(lmi->lmi_sb);
230                 LCONSOLE_ERROR_MSG(0x15d, "The MGS service was already started"
231                                    " from server\n");
232                 RETURN(-EALREADY);
233         }
234
235         CDEBUG(D_CONFIG, "Start MGS service %s\n", LUSTRE_MGS_OBDNAME);
236
237         rc = server_register_mount(LUSTRE_MGS_OBDNAME, sb);
238
239         if (!rc) {
240                 rc = lustre_start_simple(LUSTRE_MGS_OBDNAME, LUSTRE_MGS_NAME,
241                                          LUSTRE_MGS_OBDNAME, NULL, NULL,
242                                          lsi->lsi_osd_obdname, NULL);
243                 /* server_deregister_mount() is not called previously, for lsi
244                  * and other stuff can't be freed cleanly when mgs calls
245                  * server_put_mount() in error handling case (see b=17758),
246                  * this problem is caused by a bug in mgs_init0, which forgot
247                  * calling server_put_mount in error case. */
248
249                 if (rc)
250                         server_deregister_mount(LUSTRE_MGS_OBDNAME);
251         }
252
253         if (rc)
254                 LCONSOLE_ERROR_MSG(0x15e, "Failed to start MGS '%s' (%d). "
255                                    "Is the 'mgs' module loaded?\n",
256                                    LUSTRE_MGS_OBDNAME, rc);
257         RETURN(rc);
258 }
259
260 static int server_stop_mgs(struct super_block *sb)
261 {
262         struct obd_device *obd;
263         int rc;
264         struct lustre_mount_info *lmi;
265         ENTRY;
266
267         /* Do not stop MGS if this device is not the running MGT */
268         lmi = server_find_mount(LUSTRE_MGS_OBDNAME);
269         if (lmi != NULL && lmi->lmi_sb != sb)
270                 RETURN(0);
271
272         CDEBUG(D_MOUNT, "Stop MGS service %s\n", LUSTRE_MGS_OBDNAME);
273
274         /* There better be only one MGS */
275         obd = class_name2obd(LUSTRE_MGS_OBDNAME);
276         if (!obd) {
277                 CDEBUG(D_CONFIG, "mgs %s not running\n", LUSTRE_MGS_OBDNAME);
278                 RETURN(-EALREADY);
279         }
280
281         /* The MGS should always stop when we say so */
282         obd->obd_force = 1;
283         rc = class_manual_cleanup(obd);
284         RETURN(rc);
285 }
286
287 /* Since there's only one mgc per node, we have to change it's fs to get
288    access to the right disk. */
289 static int server_mgc_set_fs(const struct lu_env *env,
290                              struct obd_device *mgc, struct super_block *sb)
291 {
292         struct lustre_sb_info *lsi = s2lsi(sb);
293         int rc;
294         ENTRY;
295
296         CDEBUG(D_MOUNT, "Set mgc disk for %s\n", lsi->lsi_lmd->lmd_dev);
297
298         /* cl_mgc_sem in mgc insures we sleep if the mgc_fs is busy */
299         rc = obd_set_info_async(env, mgc->obd_self_export,
300                                 sizeof(KEY_SET_FS), KEY_SET_FS,
301                                 sizeof(*sb), sb, NULL);
302         if (rc != 0)
303                 CERROR("can't set_fs %d\n", rc);
304
305         RETURN(rc);
306 }
307
308 static int server_mgc_clear_fs(const struct lu_env *env,
309                                struct obd_device *mgc)
310 {
311         int rc;
312         ENTRY;
313
314         CDEBUG(D_MOUNT, "Unassign mgc disk\n");
315
316         rc = obd_set_info_async(env, mgc->obd_self_export,
317                                 sizeof(KEY_CLEAR_FS), KEY_CLEAR_FS,
318                                 0, NULL, NULL);
319         RETURN(rc);
320 }
321
322 static inline bool is_mdc_device(const char *devname)
323 {
324         char *ptr;
325
326         ptr = strrchr(devname, '-');
327         return ptr != NULL && strcmp(ptr, "-mdc") == 0;
328 }
329
330 static inline bool tgt_is_mdt(const char *tgtname, __u32 *idx)
331 {
332         int type;
333
334         type = server_name2index(tgtname, idx, NULL);
335
336         return type == LDD_F_SV_TYPE_MDT;
337 }
338
339 /**
340  * Convert OST/MDT name(fsname-{MDT,OST}xxxx) to a lwp name with the @idx:yyyy
341  * (fsname-MDTyyyy-lwp-{MDT,OST}xxxx)
342  **/
343 int tgt_name2lwp_name(const char *tgt_name, char *lwp_name, int len, __u32 idx)
344 {
345         char            *fsname;
346         const char      *tgt;
347         int             rc;
348         ENTRY;
349
350         OBD_ALLOC(fsname, MTI_NAME_MAXLEN);
351         if (fsname == NULL)
352                 RETURN(-ENOMEM);
353
354         rc = server_name2fsname(tgt_name, fsname, &tgt);
355         if (rc != 0) {
356                 CERROR("%s: failed to get fsname from tgt_name: rc = %d\n",
357                        tgt_name, rc);
358                 GOTO(cleanup, rc);
359         }
360
361         if (*tgt != '-' && *tgt != ':') {
362                 CERROR("%s: invalid tgt_name name!\n", tgt_name);
363                 GOTO(cleanup, rc = -EINVAL);
364         }
365
366         tgt++;
367         if (strncmp(tgt, "OST", 3) != 0 && strncmp(tgt, "MDT", 3) != 0) {
368                 CERROR("%s is not an OST or MDT target!\n", tgt_name);
369                 GOTO(cleanup, rc = -EINVAL);
370         }
371         snprintf(lwp_name, len, "%s-MDT%04x-%s-%s",
372                  fsname, idx, LUSTRE_LWP_NAME, tgt);
373
374         GOTO(cleanup, rc = 0);
375
376 cleanup:
377         if (fsname != NULL)
378                 OBD_FREE(fsname, MTI_NAME_MAXLEN);
379
380         return rc;
381 }
382 EXPORT_SYMBOL(tgt_name2lwp_name);
383
384 static LIST_HEAD(lwp_register_list);
385 static DEFINE_SPINLOCK(lwp_register_list_lock);
386
387 static void lustre_put_lwp_item(struct lwp_register_item *lri)
388 {
389         if (atomic_dec_and_test(&lri->lri_ref)) {
390                 LASSERT(list_empty(&lri->lri_list));
391
392                 if (*lri->lri_exp != NULL)
393                         class_export_put(*lri->lri_exp);
394                 OBD_FREE_PTR(lri);
395         }
396 }
397
398 int lustre_register_lwp_item(const char *lwpname, struct obd_export **exp,
399                              register_lwp_cb cb_func, void *cb_data)
400 {
401         struct obd_device        *lwp;
402         struct lwp_register_item *lri;
403         bool cb = false;
404         ENTRY;
405
406         LASSERTF(strlen(lwpname) < MTI_NAME_MAXLEN, "lwpname is too long %s\n",
407                  lwpname);
408         LASSERT(exp != NULL && *exp == NULL);
409
410         OBD_ALLOC_PTR(lri);
411         if (lri == NULL)
412                 RETURN(-ENOMEM);
413
414         lwp = class_name2obd(lwpname);
415         if (lwp != NULL && lwp->obd_set_up == 1) {
416                 struct obd_uuid *uuid;
417
418                 OBD_ALLOC_PTR(uuid);
419                 if (uuid == NULL) {
420                         OBD_FREE_PTR(lri);
421                         RETURN(-ENOMEM);
422                 }
423                 memcpy(uuid->uuid, lwpname, strlen(lwpname));
424                 *exp = cfs_hash_lookup(lwp->obd_uuid_hash, uuid);
425                 OBD_FREE_PTR(uuid);
426         }
427
428         memcpy(lri->lri_name, lwpname, strlen(lwpname));
429         lri->lri_exp = exp;
430         lri->lri_cb_func = cb_func;
431         lri->lri_cb_data = cb_data;
432         INIT_LIST_HEAD(&lri->lri_list);
433         /*
434          * Initialize the lri_ref at 2, one will be released before
435          * current function returned via lustre_put_lwp_item(), the
436          * other will be released in lustre_deregister_lwp_item().
437          */
438         atomic_set(&lri->lri_ref, 2);
439
440         spin_lock(&lwp_register_list_lock);
441         list_add(&lri->lri_list, &lwp_register_list);
442         if (*exp != NULL)
443                 cb = true;
444         spin_unlock(&lwp_register_list_lock);
445
446         if (cb && cb_func != NULL)
447                 cb_func(cb_data);
448         lustre_put_lwp_item(lri);
449
450         RETURN(0);
451 }
452 EXPORT_SYMBOL(lustre_register_lwp_item);
453
454 void lustre_deregister_lwp_item(struct obd_export **exp)
455 {
456         struct lwp_register_item *lri;
457         bool removed = false;
458         int repeat = 0;
459
460         spin_lock(&lwp_register_list_lock);
461         list_for_each_entry(lri, &lwp_register_list, lri_list) {
462                 if (exp == lri->lri_exp) {
463                         list_del_init(&lri->lri_list);
464                         removed = true;
465                         break;
466                 }
467         }
468         spin_unlock(&lwp_register_list_lock);
469
470         if (!removed)
471                 return;
472
473         /* See lustre_notify_lwp_list(), in some extreme race conditions,
474          * the notify callback could be still on the fly, we need to wait
475          * for the callback done before moving on to free the data used
476          * by callback. */
477         while (atomic_read(&lri->lri_ref) > 1) {
478                 CDEBUG(D_MOUNT, "lri reference count %u, repeat: %d\n",
479                        atomic_read(&lri->lri_ref), repeat);
480                 repeat++;
481                 set_current_state(TASK_INTERRUPTIBLE);
482                 schedule_timeout(cfs_time_seconds(1));
483         }
484         lustre_put_lwp_item(lri);
485 }
486 EXPORT_SYMBOL(lustre_deregister_lwp_item);
487
488 struct obd_export *lustre_find_lwp_by_index(const char *dev, __u32 idx)
489 {
490         struct lustre_mount_info *lmi;
491         struct lustre_sb_info    *lsi;
492         struct obd_device        *lwp;
493         struct obd_export        *exp = NULL;
494         char                      fsname[16];
495         char                      lwp_name[24];
496         int                       rc;
497
498         lmi = server_get_mount(dev);
499         if (lmi == NULL)
500                 return NULL;
501
502         lsi = s2lsi(lmi->lmi_sb);
503         rc = server_name2fsname(lsi->lsi_svname, fsname, NULL);
504         if (rc != 0) {
505                 CERROR("%s: failed to get fsname: rc = %d\n",
506                        lsi->lsi_svname, rc);
507                 goto err_lmi;
508         }
509
510         snprintf(lwp_name, sizeof(lwp_name), "%s-MDT%04x", fsname, idx);
511         mutex_lock(&lsi->lsi_lwp_mutex);
512         list_for_each_entry(lwp, &lsi->lsi_lwp_list, obd_lwp_list) {
513                 char *ptr = strstr(lwp->obd_name, lwp_name);
514
515                 if (ptr != NULL && lwp->obd_lwp_export != NULL) {
516                         exp = class_export_get(lwp->obd_lwp_export);
517                         break;
518                 }
519         }
520         mutex_unlock(&lsi->lsi_lwp_mutex);
521
522 err_lmi:
523         server_put_mount(dev, false);
524
525         return exp;
526 }
527 EXPORT_SYMBOL(lustre_find_lwp_by_index);
528
529 void lustre_notify_lwp_list(struct obd_export *exp)
530 {
531         struct lwp_register_item *lri;
532         LASSERT(exp != NULL);
533
534 again:
535         spin_lock(&lwp_register_list_lock);
536         list_for_each_entry(lri, &lwp_register_list, lri_list) {
537                 if (strcmp(exp->exp_obd->obd_name, lri->lri_name))
538                         continue;
539                 if (*lri->lri_exp != NULL)
540                         continue;
541                 *lri->lri_exp = class_export_get(exp);
542                 if (lri->lri_cb_func == NULL)
543                         continue;
544                 atomic_inc(&lri->lri_ref);
545                 spin_unlock(&lwp_register_list_lock);
546
547                 lri->lri_cb_func(lri->lri_cb_data);
548                 lustre_put_lwp_item(lri);
549
550                 /* Others may have changed the list after we unlock, we have
551                  * to rescan the list from the beginning. Usually, the list
552                  * 'lwp_register_list' is very short, and there is 'guard'
553                  * lri::lri_exp that will prevent the callback to be done
554                  * repeatedly. So rescanning the list has no problem. */
555                 goto again;
556         }
557         spin_unlock(&lwp_register_list_lock);
558 }
559 EXPORT_SYMBOL(lustre_notify_lwp_list);
560
561 static int lustre_lwp_connect(struct obd_device *lwp, bool is_mdt)
562 {
563         struct lu_env            env;
564         struct lu_context        session_ctx;
565         struct obd_export       *exp;
566         struct obd_uuid         *uuid = NULL;
567         struct obd_connect_data *data = NULL;
568         int                      rc;
569         ENTRY;
570
571         /* log has been fully processed, let clients connect */
572         rc = lu_env_init(&env, lwp->obd_lu_dev->ld_type->ldt_ctx_tags);
573         if (rc != 0)
574                 RETURN(rc);
575
576         lu_context_init(&session_ctx, LCT_SERVER_SESSION);
577         session_ctx.lc_thread = NULL;
578         lu_context_enter(&session_ctx);
579         env.le_ses = &session_ctx;
580
581         OBD_ALLOC_PTR(data);
582         if (data == NULL)
583                 GOTO(out, rc = -ENOMEM);
584
585         data->ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_INDEX;
586         data->ocd_version = LUSTRE_VERSION_CODE;
587         data->ocd_connect_flags |= OBD_CONNECT_FID | OBD_CONNECT_AT |
588                 OBD_CONNECT_LRU_RESIZE | OBD_CONNECT_FULL20 |
589                 OBD_CONNECT_LVB_TYPE | OBD_CONNECT_LIGHTWEIGHT |
590                 OBD_CONNECT_LFSCK | OBD_CONNECT_BULK_MBITS;
591
592         if (is_mdt)
593                 data->ocd_connect_flags |= OBD_CONNECT_MDS_MDS;
594
595         OBD_ALLOC_PTR(uuid);
596         if (uuid == NULL)
597                 GOTO(out, rc = -ENOMEM);
598
599         if (strlen(lwp->obd_name) > sizeof(uuid->uuid)) {
600                 CERROR("%s: Too long lwp name %s, max_size is %d\n",
601                        lwp->obd_name, lwp->obd_name, (int)sizeof(uuid->uuid));
602                 GOTO(out, rc = -EINVAL);
603         }
604
605         /* Use lwp name as the uuid, so we find the export by lwp name later */
606         memcpy(uuid->uuid, lwp->obd_name, strlen(lwp->obd_name));
607         rc = obd_connect(&env, &exp, lwp, uuid, data, NULL);
608         if (rc != 0) {
609                 CERROR("%s: connect failed: rc = %d\n", lwp->obd_name, rc);
610         } else {
611                 if (unlikely(lwp->obd_lwp_export != NULL))
612                         class_export_put(lwp->obd_lwp_export);
613                 lwp->obd_lwp_export = class_export_get(exp);
614         }
615
616         GOTO(out, rc);
617
618 out:
619         if (data != NULL)
620                 OBD_FREE_PTR(data);
621         if (uuid != NULL)
622                 OBD_FREE_PTR(uuid);
623
624         lu_env_fini(&env);
625         lu_context_exit(&session_ctx);
626         lu_context_fini(&session_ctx);
627
628         return rc;
629 }
630
631 /**
632  * lwp is used by slaves (Non-MDT0 targets) to manage the connection to MDT0,
633  * or from the OSTx to MDTy.
634  **/
635 static int lustre_lwp_setup(struct lustre_cfg *lcfg, struct lustre_sb_info *lsi,
636                             __u32 idx)
637 {
638         struct obd_device       *obd;
639         char                    *lwpname = NULL;
640         char                    *lwpuuid = NULL;
641         int                      rc;
642         ENTRY;
643
644         rc = class_add_uuid(lustre_cfg_string(lcfg, 1),
645                             lcfg->lcfg_nid);
646         if (rc != 0) {
647                 CERROR("%s: Can't add uuid: rc =%d\n", lsi->lsi_svname, rc);
648                 RETURN(rc);
649         }
650
651         OBD_ALLOC(lwpname, MTI_NAME_MAXLEN);
652         if (lwpname == NULL)
653                 GOTO(out, rc = -ENOMEM);
654
655         rc = tgt_name2lwp_name(lsi->lsi_svname, lwpname, MTI_NAME_MAXLEN, idx);
656         if (rc != 0) {
657                 CERROR("%s: failed to generate lwp name: rc = %d\n",
658                        lsi->lsi_svname, rc);
659                 GOTO(out, rc);
660         }
661
662         OBD_ALLOC(lwpuuid, MTI_NAME_MAXLEN);
663         if (lwpuuid == NULL)
664                 GOTO(out, rc = -ENOMEM);
665
666         sprintf(lwpuuid, "%s_UUID", lwpname);
667         rc = lustre_start_simple(lwpname, LUSTRE_LWP_NAME,
668                                  lwpuuid, lustre_cfg_string(lcfg, 1),
669                                  NULL, NULL, NULL);
670         if (rc) {
671                 CERROR("%s: setup up failed: rc %d\n", lwpname, rc);
672                 GOTO(out, rc);
673         }
674
675         obd = class_name2obd(lwpname);
676         LASSERT(obd != NULL);
677
678         rc = lustre_lwp_connect(obd, strstr(lsi->lsi_svname, "-MDT") != NULL);
679         if (rc == 0) {
680                 obd->u.cli.cl_max_mds_easize = MAX_MD_SIZE;
681                 mutex_lock(&lsi->lsi_lwp_mutex);
682                 list_add_tail(&obd->obd_lwp_list, &lsi->lsi_lwp_list);
683                 mutex_unlock(&lsi->lsi_lwp_mutex);
684         } else {
685                 CERROR("%s: connect failed: rc = %d\n", lwpname, rc);
686         }
687
688         GOTO(out, rc);
689
690 out:
691         if (lwpname != NULL)
692                 OBD_FREE(lwpname, MTI_NAME_MAXLEN);
693         if (lwpuuid != NULL)
694                 OBD_FREE(lwpuuid, MTI_NAME_MAXLEN);
695
696         return rc;
697 }
698
699 /* the caller is responsible for memory free */
700 static struct obd_device *lustre_find_lwp(struct lustre_sb_info *lsi,
701                                           char **lwpname, __u32 idx)
702 {
703         struct obd_device       *lwp;
704         int                      rc = 0;
705         ENTRY;
706
707         LASSERT(lwpname != NULL);
708         LASSERT(IS_OST(lsi) || IS_MDT(lsi));
709
710         OBD_ALLOC(*lwpname, MTI_NAME_MAXLEN);
711         if (*lwpname == NULL)
712                 RETURN(ERR_PTR(-ENOMEM));
713
714         rc = tgt_name2lwp_name(lsi->lsi_svname, *lwpname, MTI_NAME_MAXLEN, idx);
715         if (rc != 0) {
716                 CERROR("%s: failed to generate lwp name: rc = %d\n",
717                        lsi->lsi_svname, rc);
718                 GOTO(out, rc = -EINVAL);
719         }
720
721         lwp = class_name2obd(*lwpname);
722
723 out:
724         if (rc != 0) {
725                 if (*lwpname != NULL) {
726                         OBD_FREE(*lwpname, MTI_NAME_MAXLEN);
727                         *lwpname = NULL;
728                 }
729                 lwp = ERR_PTR(rc);
730         }
731
732         RETURN(lwp != NULL ? lwp : ERR_PTR(-ENOENT));
733 }
734
735 static int lustre_lwp_add_conn(struct lustre_cfg *cfg,
736                                struct lustre_sb_info *lsi, __u32 idx)
737 {
738         struct lustre_cfg_bufs *bufs = NULL;
739         struct lustre_cfg      *lcfg = NULL;
740         char                   *lwpname = NULL;
741         struct obd_device      *lwp;
742         int                     rc;
743         ENTRY;
744
745         lwp = lustre_find_lwp(lsi, &lwpname, idx);
746         if (IS_ERR(lwp)) {
747                 CERROR("%s: can't find lwp device.\n", lsi->lsi_svname);
748                 GOTO(out, rc = PTR_ERR(lwp));
749         }
750         LASSERT(lwpname != NULL);
751
752         OBD_ALLOC_PTR(bufs);
753         if (bufs == NULL)
754                 GOTO(out, rc = -ENOMEM);
755
756         lustre_cfg_bufs_reset(bufs, lwpname);
757         lustre_cfg_bufs_set_string(bufs, 1,
758                                    lustre_cfg_string(cfg, 1));
759
760         OBD_ALLOC(lcfg, lustre_cfg_len(bufs->lcfg_bufcount, bufs->lcfg_buflen));
761         if (!lcfg)
762                 GOTO(out_cfg, rc = -ENOMEM);
763         lustre_cfg_init(lcfg, LCFG_ADD_CONN, bufs);
764
765         rc = class_add_conn(lwp, lcfg);
766         if (rc)
767                 CERROR("%s: can't add conn: rc = %d\n", lwpname, rc);
768
769         if (lcfg)
770                 OBD_FREE(lcfg, lustre_cfg_len(lcfg->lcfg_bufcount,
771                                               lcfg->lcfg_buflens));
772 out_cfg:
773         if (bufs != NULL)
774                 OBD_FREE_PTR(bufs);
775 out:
776         if (lwpname != NULL)
777                 OBD_FREE(lwpname, MTI_NAME_MAXLEN);
778         RETURN(rc);
779 }
780
781 /**
782  * Retrieve MDT nids from the client log, then start the lwp device.
783  * there are only two scenarios which would include mdt nid.
784  * 1.
785  * marker   5 (flags=0x01, v2.1.54.0) lustre-MDTyyyy  'add mdc' xxx-
786  * add_uuid  nid=192.168.122.162@tcp(0x20000c0a87aa2)  0:  1:192.168.122.162@tcp
787  * attach    0:lustre-MDTyyyy-mdc  1:mdc  2:lustre-clilmv_UUID
788  * setup     0:lustre-MDTyyyy-mdc  1:lustre-MDTyyyy_UUID  2:192.168.122.162@tcp
789  * add_uuid  nid=192.168.172.1@tcp(0x20000c0a8ac01)  0:  1:192.168.172.1@tcp
790  * add_conn  0:lustre-MDTyyyy-mdc  1:192.168.172.1@tcp
791  * modify_mdc_tgts add 0:lustre-clilmv  1:lustre-MDTyyyy_UUID xxxx
792  * marker   5 (flags=0x02, v2.1.54.0) lustre-MDTyyyy  'add mdc' xxxx-
793  * 2.
794  * marker   7 (flags=0x01, v2.1.54.0) lustre-MDTyyyy  'add failnid' xxxx-
795  * add_uuid  nid=192.168.122.2@tcp(0x20000c0a87a02)  0:  1:192.168.122.2@tcp
796  * add_conn  0:lustre-MDTyyyy-mdc  1:192.168.122.2@tcp
797  * marker   7 (flags=0x02, v2.1.54.0) lustre-MDTyyyy  'add failnid' xxxx-
798  **/
799 static int client_lwp_config_process(const struct lu_env *env,
800                                      struct llog_handle *handle,
801                                      struct llog_rec_hdr *rec, void *data)
802 {
803         struct config_llog_instance *cfg = data;
804         int                          cfg_len = rec->lrh_len;
805         char                        *cfg_buf = (char *) (rec + 1);
806         struct lustre_cfg           *lcfg = NULL;
807         struct lustre_sb_info       *lsi;
808         int                          rc = 0, swab = 0;
809         ENTRY;
810
811         if (rec->lrh_type != OBD_CFG_REC) {
812                 CERROR("Unknown llog record type %#x encountered\n",
813                        rec->lrh_type);
814                 RETURN(-EINVAL);
815         }
816
817         if (cfg->cfg_sb == NULL)
818                 GOTO(out, rc = -EINVAL);
819         lsi = s2lsi(cfg->cfg_sb);
820
821         lcfg = (struct lustre_cfg *)cfg_buf;
822         if (lcfg->lcfg_version == __swab32(LUSTRE_CFG_VERSION)) {
823                 lustre_swab_lustre_cfg(lcfg);
824                 swab = 1;
825         }
826
827         rc = lustre_cfg_sanity_check(cfg_buf, cfg_len);
828         if (rc)
829                 GOTO(out, rc);
830
831         switch (lcfg->lcfg_command) {
832         case LCFG_MARKER: {
833                 struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1);
834
835                 lustre_swab_cfg_marker(marker, swab,
836                                        LUSTRE_CFG_BUFLEN(lcfg, 1));
837                 if (marker->cm_flags & CM_SKIP ||
838                     marker->cm_flags & CM_EXCLUDE)
839                         GOTO(out, rc = 0);
840
841                 if (!tgt_is_mdt(marker->cm_tgtname, &cfg->cfg_lwp_idx))
842                         GOTO(out, rc = 0);
843
844                 if (IS_MDT(lsi) && cfg->cfg_lwp_idx != 0)
845                         GOTO(out, rc = 0);
846
847                 if (!strncmp(marker->cm_comment, "add mdc", 7) ||
848                     !strncmp(marker->cm_comment, "add failnid", 11)) {
849                         if (marker->cm_flags & CM_START) {
850                                 cfg->cfg_flags = CFG_F_MARKER;
851                                 /* This hack is to differentiate the
852                                  * ADD_UUID is come from "add mdc" record
853                                  * or from "add failnid" record. */
854                                 if (!strncmp(marker->cm_comment,
855                                              "add failnid", 11))
856                                         cfg->cfg_flags |= CFG_F_SKIP;
857                         } else if (marker->cm_flags & CM_END) {
858                                 cfg->cfg_flags = 0;
859                         }
860                 }
861                 break;
862         }
863         case LCFG_ADD_UUID: {
864                 if (cfg->cfg_flags == CFG_F_MARKER) {
865                         rc = lustre_lwp_setup(lcfg, lsi, cfg->cfg_lwp_idx);
866                         /* XXX: process only the first nid as
867                          * we don't need another instance of lwp */
868                         cfg->cfg_flags |= CFG_F_SKIP;
869                 } else if (cfg->cfg_flags == (CFG_F_MARKER | CFG_F_SKIP)) {
870                         rc = class_add_uuid(lustre_cfg_string(lcfg, 1),
871                                             lcfg->lcfg_nid);
872                         if (rc)
873                                 CERROR("%s: Fail to add uuid, rc:%d\n",
874                                        lsi->lsi_svname, rc);
875                 }
876                 break;
877         }
878         case LCFG_ADD_CONN: {
879                 char *devname = lustre_cfg_string(lcfg, 0);
880                 char *ptr;
881                 __u32 idx     = 0;
882
883                 if (!is_mdc_device(devname))
884                         break;
885
886                 ptr = strrchr(devname, '-');
887                 if (ptr == NULL)
888                         break;
889
890                 *ptr = 0;
891                 if (!tgt_is_mdt(devname, &idx)) {
892                         *ptr = '-';
893                         break;
894                 }
895                 *ptr = '-';
896
897                 if (IS_MDT(lsi) && idx != 0)
898                         break;
899
900                 rc = lustre_lwp_add_conn(lcfg, lsi, idx);
901                 break;
902         }
903         default:
904                 break;
905         }
906 out:
907         RETURN(rc);
908 }
909
910 static int lustre_disconnect_lwp(struct super_block *sb)
911 {
912         struct lustre_sb_info           *lsi     = s2lsi(sb);
913         struct obd_device               *lwp;
914         char                            *logname = NULL;
915         struct lustre_cfg_bufs          *bufs    = NULL;
916         struct config_llog_instance     *cfg     = NULL;
917         int                              rc      = 0;
918         int                              rc1     = 0;
919         ENTRY;
920
921         if (likely(lsi->lsi_lwp_started)) {
922                 OBD_ALLOC(logname, MTI_NAME_MAXLEN);
923                 if (logname == NULL)
924                         RETURN(-ENOMEM);
925
926                 rc = server_name2fsname(lsi->lsi_svname, logname, NULL);
927                 if (rc != 0) {
928                         CERROR("%s: failed to get fsname from svname: "
929                                "rc = %d\n", lsi->lsi_svname, rc);
930                         GOTO(out, rc = -EINVAL);
931                 }
932
933                 strcat(logname, "-client");
934                 OBD_ALLOC_PTR(cfg);
935                 if (cfg == NULL)
936                         GOTO(out, rc = -ENOMEM);
937
938                 /* end log first */
939                 cfg->cfg_instance = ll_get_cfg_instance(sb);
940                 rc = lustre_end_log(sb, logname, cfg);
941                 if (rc != 0 && rc != -ENOENT)
942                         GOTO(out, rc);
943
944                 lsi->lsi_lwp_started = 0;
945         }
946
947         OBD_ALLOC_PTR(bufs);
948         if (bufs == NULL)
949                 GOTO(out, rc = -ENOMEM);
950
951         mutex_lock(&lsi->lsi_lwp_mutex);
952         list_for_each_entry(lwp, &lsi->lsi_lwp_list, obd_lwp_list) {
953                 struct lustre_cfg *lcfg;
954
955                 if (likely(lwp->obd_lwp_export != NULL)) {
956                         class_export_put(lwp->obd_lwp_export);
957                         lwp->obd_lwp_export = NULL;
958                 }
959
960                 lustre_cfg_bufs_reset(bufs, lwp->obd_name);
961                 lustre_cfg_bufs_set_string(bufs, 1, NULL);
962                 OBD_ALLOC(lcfg, lustre_cfg_len(bufs->lcfg_bufcount,
963                                                bufs->lcfg_buflen));
964                 if (!lcfg) {
965                         rc = -ENOMEM;
966                         break;
967                 }
968                 lustre_cfg_init(lcfg, LCFG_CLEANUP, bufs);
969
970                 /* Disconnect import first. NULL is passed for the '@env',
971                  * since it will not be used. */
972                 rc = lwp->obd_lu_dev->ld_ops->ldo_process_config(NULL,
973                                                         lwp->obd_lu_dev, lcfg);
974                 OBD_FREE(lcfg, lustre_cfg_len(lcfg->lcfg_bufcount,
975                                               lcfg->lcfg_buflens));
976                 if (rc != 0 && rc != -ETIMEDOUT) {
977                         CERROR("%s: fail to disconnect LWP: rc = %d\n",
978                                lwp->obd_name, rc);
979                         rc1 = rc;
980                 }
981         }
982         mutex_unlock(&lsi->lsi_lwp_mutex);
983
984         GOTO(out, rc);
985
986 out:
987         if (bufs != NULL)
988                 OBD_FREE_PTR(bufs);
989         if (cfg != NULL)
990                 OBD_FREE_PTR(cfg);
991         if (logname != NULL)
992                 OBD_FREE(logname, MTI_NAME_MAXLEN);
993
994         return rc1 != 0 ? rc1 : rc;
995 }
996
997 /**
998  * Stop the lwp for an OST/MDT target.
999  **/
1000 static int lustre_stop_lwp(struct super_block *sb)
1001 {
1002         struct lustre_sb_info   *lsi = s2lsi(sb);
1003         struct obd_device       *lwp;
1004         int                      rc  = 0;
1005         int                      rc1 = 0;
1006         ENTRY;
1007
1008         mutex_lock(&lsi->lsi_lwp_mutex);
1009         while (!list_empty(&lsi->lsi_lwp_list)) {
1010                 lwp = list_entry(lsi->lsi_lwp_list.next, struct obd_device,
1011                                  obd_lwp_list);
1012                 list_del_init(&lwp->obd_lwp_list);
1013                 lwp->obd_force = 1;
1014                 mutex_unlock(&lsi->lsi_lwp_mutex);
1015
1016                 rc = class_manual_cleanup(lwp);
1017                 if (rc != 0) {
1018                         CERROR("%s: fail to stop LWP: rc = %d\n",
1019                                lwp->obd_name, rc);
1020                         rc1 = rc;
1021                 }
1022                 mutex_lock(&lsi->lsi_lwp_mutex);
1023         }
1024         mutex_unlock(&lsi->lsi_lwp_mutex);
1025
1026         RETURN(rc1 != 0 ? rc1 : rc);
1027 }
1028
1029 /**
1030  * Start the lwp(fsname-MDTyyyy-lwp-{MDT,OST}xxxx) for a MDT/OST or MDT target.
1031  **/
1032 static int lustre_start_lwp(struct super_block *sb)
1033 {
1034         struct lustre_sb_info       *lsi = s2lsi(sb);
1035         struct config_llog_instance *cfg = NULL;
1036         char                        *logname;
1037         int                          rc;
1038         ENTRY;
1039
1040         if (unlikely(lsi->lsi_lwp_started))
1041                 RETURN(0);
1042
1043         OBD_ALLOC(logname, MTI_NAME_MAXLEN);
1044         if (logname == NULL)
1045                 RETURN(-ENOMEM);
1046
1047         rc = server_name2fsname(lsi->lsi_svname, logname, NULL);
1048         if (rc != 0) {
1049                 CERROR("%s: failed to get fsname from svname: rc = %d\n",
1050                        lsi->lsi_svname, rc);
1051                 GOTO(out, rc = -EINVAL);
1052         }
1053
1054         strcat(logname, "-client");
1055         OBD_ALLOC_PTR(cfg);
1056         if (cfg == NULL)
1057                 GOTO(out, rc = -ENOMEM);
1058
1059         cfg->cfg_callback = client_lwp_config_process;
1060         cfg->cfg_instance = ll_get_cfg_instance(sb);
1061         rc = lustre_process_log(sb, logname, cfg);
1062         /* need to remove config llog from mgc */
1063         lsi->lsi_lwp_started = 1;
1064
1065         GOTO(out, rc);
1066
1067 out:
1068         OBD_FREE(logname, MTI_NAME_MAXLEN);
1069         if (cfg != NULL)
1070                 OBD_FREE_PTR(cfg);
1071
1072         return rc;
1073 }
1074
1075 static DEFINE_MUTEX(server_start_lock);
1076
1077 /* Stop MDS/OSS if nobody is using them */
1078 static int server_stop_servers(int lsiflags)
1079 {
1080         struct obd_device *obd = NULL;
1081         struct obd_type *type = NULL;
1082         int rc = 0;
1083         ENTRY;
1084
1085         mutex_lock(&server_start_lock);
1086
1087         /* Either an MDT or an OST or neither  */
1088         /* if this was an MDT, and there are no more MDT's, clean up the MDS */
1089         if (lsiflags & LDD_F_SV_TYPE_MDT) {
1090                 obd = class_name2obd(LUSTRE_MDS_OBDNAME);
1091                 if (obd != NULL)
1092                         type = class_search_type(LUSTRE_MDT_NAME);
1093         }
1094
1095         /* if this was an OST, and there are no more OST's, clean up the OSS */
1096         if (lsiflags & LDD_F_SV_TYPE_OST) {
1097                 obd = class_name2obd(LUSTRE_OSS_OBDNAME);
1098                 if (obd != NULL)
1099                         type = class_search_type(LUSTRE_OST_NAME);
1100         }
1101
1102         if (obd != NULL && (type == NULL || type->typ_refcnt == 0)) {
1103                 obd->obd_force = 1;
1104                 /* obd_fail doesn't mean much on a server obd */
1105                 rc = class_manual_cleanup(obd);
1106         }
1107
1108         mutex_unlock(&server_start_lock);
1109
1110         RETURN(rc);
1111 }
1112
1113 int server_mti_print(const char *title, struct mgs_target_info *mti)
1114 {
1115         PRINT_CMD(PRINT_MASK, "mti %s\n", title);
1116         PRINT_CMD(PRINT_MASK, "server: %s\n", mti->mti_svname);
1117         PRINT_CMD(PRINT_MASK, "fs:     %s\n", mti->mti_fsname);
1118         PRINT_CMD(PRINT_MASK, "uuid:   %s\n", mti->mti_uuid);
1119         PRINT_CMD(PRINT_MASK, "ver: %d  flags: %#x\n",
1120                   mti->mti_config_ver, mti->mti_flags);
1121         return 0;
1122 }
1123
1124 /* Generate data for registration */
1125 static int server_lsi2mti(struct lustre_sb_info *lsi,
1126                           struct mgs_target_info *mti)
1127 {
1128         struct lnet_process_id id;
1129         int rc, i = 0;
1130         int cplen = 0;
1131         ENTRY;
1132
1133         if (!IS_SERVER(lsi))
1134                 RETURN(-EINVAL);
1135
1136         if (strlcpy(mti->mti_svname, lsi->lsi_svname, sizeof(mti->mti_svname))
1137             >= sizeof(mti->mti_svname))
1138                 RETURN(-E2BIG);
1139
1140         mti->mti_nid_count = 0;
1141         while (LNetGetId(i++, &id) != -ENOENT) {
1142                 if (id.nid == LNET_NID_LO_0)
1143                         continue;
1144
1145                 /* server use --servicenode param, only allow specified
1146                  * nids be registered */
1147                 if ((lsi->lsi_lmd->lmd_flags & LMD_FLG_NO_PRIMNODE) != 0 &&
1148                     class_match_nid(lsi->lsi_lmd->lmd_params,
1149                                     PARAM_FAILNODE, id.nid) < 1)
1150                         continue;
1151
1152                 /* match specified network */
1153                 if (!class_match_net(lsi->lsi_lmd->lmd_params,
1154                                      PARAM_NETWORK, LNET_NIDNET(id.nid)))
1155                         continue;
1156
1157                 mti->mti_nids[mti->mti_nid_count] = id.nid;
1158                 mti->mti_nid_count++;
1159                 if (mti->mti_nid_count >= MTI_NIDS_MAX) {
1160                         CWARN("Only using first %d nids for %s\n",
1161                               mti->mti_nid_count, mti->mti_svname);
1162                         break;
1163                 }
1164         }
1165
1166         if (mti->mti_nid_count == 0) {
1167                 CERROR("Failed to get NID for server %s, please check whether "
1168                        "the target is specifed with improper --servicenode or "
1169                        "--network options.\n", mti->mti_svname);
1170                 RETURN(-EINVAL);
1171         }
1172
1173         mti->mti_lustre_ver = LUSTRE_VERSION_CODE;
1174         mti->mti_config_ver = 0;
1175
1176         rc = server_name2fsname(lsi->lsi_svname, mti->mti_fsname, NULL);
1177         if (rc != 0)
1178                 return rc;
1179
1180         rc = server_name2index(lsi->lsi_svname, &mti->mti_stripe_index, NULL);
1181         if (rc < 0)
1182                 return rc;
1183         /* Orion requires index to be set */
1184         LASSERT(!(rc & LDD_F_NEED_INDEX));
1185         /* keep only LDD flags */
1186         mti->mti_flags = lsi->lsi_flags & LDD_F_MASK;
1187         if (mti->mti_flags & (LDD_F_WRITECONF | LDD_F_VIRGIN))
1188                 mti->mti_flags |= LDD_F_UPDATE;
1189         cplen = strlcpy(mti->mti_params, lsi->lsi_lmd->lmd_params,
1190                         sizeof(mti->mti_params));
1191         if (cplen >= sizeof(mti->mti_params))
1192                 return -E2BIG;
1193         return 0;
1194 }
1195
1196 /* Register an old or new target with the MGS. If needed MGS will construct
1197    startup logs and assign index */
1198 static int server_register_target(struct lustre_sb_info *lsi)
1199 {
1200         struct obd_device *mgc = lsi->lsi_mgc;
1201         struct mgs_target_info *mti = NULL;
1202         bool writeconf;
1203         int rc;
1204         int tried = 0;
1205         ENTRY;
1206
1207         LASSERT(mgc);
1208
1209         if (!IS_SERVER(lsi))
1210                 RETURN(-EINVAL);
1211
1212         OBD_ALLOC_PTR(mti);
1213         if (!mti)
1214                 RETURN(-ENOMEM);
1215
1216         rc = server_lsi2mti(lsi, mti);
1217         if (rc)
1218                 GOTO(out, rc);
1219
1220         CDEBUG(D_MOUNT, "Registration %s, fs=%s, %s, index=%04x, flags=%#x\n",
1221                mti->mti_svname, mti->mti_fsname,
1222                libcfs_nid2str(mti->mti_nids[0]), mti->mti_stripe_index,
1223                mti->mti_flags);
1224
1225         /* if write_conf is true, the registration must succeed */
1226         writeconf = !!(lsi->lsi_flags & (LDD_F_NEED_INDEX | LDD_F_UPDATE));
1227         mti->mti_flags |= LDD_F_OPC_REG;
1228
1229 again:
1230         /* Register the target */
1231         /* FIXME use mgc_process_config instead */
1232         rc = obd_set_info_async(NULL, mgc->u.cli.cl_mgc_mgsexp,
1233                                 sizeof(KEY_REGISTER_TARGET),
1234                                 KEY_REGISTER_TARGET,
1235                                 sizeof(*mti), mti, NULL);
1236         if (rc) {
1237                 if (mti->mti_flags & LDD_F_ERROR) {
1238                         LCONSOLE_ERROR_MSG(0x160,
1239                                 "%s: the MGS refuses to allow this server "
1240                                 "to start: rc = %d. Please see messages on "
1241                                 "the MGS.\n", lsi->lsi_svname, rc);
1242                 } else if (writeconf) {
1243                         if ((rc == -ESHUTDOWN || rc == -EIO) && ++tried < 5) {
1244                                 /* The connection with MGS is not established.
1245                                  * Try again after 2 seconds. Interruptable. */
1246                                 set_current_state(TASK_INTERRUPTIBLE);
1247                                 schedule_timeout(
1248                                         msecs_to_jiffies(MSEC_PER_SEC) * 2);
1249                                 set_current_state(TASK_RUNNING);
1250                                 if (!signal_pending(current))
1251                                         goto again;
1252                         }
1253
1254                         LCONSOLE_ERROR_MSG(0x15f,
1255                                 "%s: cannot register this server with the MGS: "
1256                                 "rc = %d. Is the MGS running?\n",
1257                                 lsi->lsi_svname, rc);
1258                 } else {
1259                         CDEBUG(D_HA, "%s: error registering with the MGS: "
1260                                "rc = %d (not fatal)\n", lsi->lsi_svname, rc);
1261                         /* reset the error code for non-fatal error. */
1262                         rc = 0;
1263                 }
1264                 GOTO(out, rc);
1265         }
1266
1267 out:
1268         if (mti)
1269                 OBD_FREE_PTR(mti);
1270         RETURN(rc);
1271 }
1272
1273 /**
1274  * Notify the MGS that this target is ready.
1275  * Used by IR - if the MGS receives this message, it will notify clients.
1276  */
1277 static int server_notify_target(struct super_block *sb, struct obd_device *obd)
1278 {
1279         struct lustre_sb_info *lsi = s2lsi(sb);
1280         struct obd_device *mgc = lsi->lsi_mgc;
1281         struct mgs_target_info *mti = NULL;
1282         int rc;
1283         ENTRY;
1284
1285         LASSERT(mgc);
1286
1287         if (!(IS_SERVER(lsi)))
1288                 RETURN(-EINVAL);
1289
1290         OBD_ALLOC_PTR(mti);
1291         if (!mti)
1292                 RETURN(-ENOMEM);
1293         rc = server_lsi2mti(lsi, mti);
1294         if (rc)
1295                 GOTO(out, rc);
1296
1297         mti->mti_instance = obd->u.obt.obt_instance;
1298         mti->mti_flags |= LDD_F_OPC_READY;
1299
1300         /* FIXME use mgc_process_config instead */
1301         rc = obd_set_info_async(NULL, mgc->u.cli.cl_mgc_mgsexp,
1302                                 sizeof(KEY_REGISTER_TARGET),
1303                                 KEY_REGISTER_TARGET,
1304                                 sizeof(*mti), mti, NULL);
1305
1306         /* Imperative recovery: if the mgs informs us to use IR? */
1307         if (!rc && !(mti->mti_flags & LDD_F_ERROR) &&
1308             (mti->mti_flags & LDD_F_IR_CAPABLE))
1309                 lsi->lsi_flags |= LDD_F_IR_CAPABLE;
1310
1311 out:
1312         if (mti)
1313                 OBD_FREE_PTR(mti);
1314         RETURN(rc);
1315
1316 }
1317
1318 /** Start server targets: MDTs and OSTs
1319  */
1320 static int server_start_targets(struct super_block *sb)
1321 {
1322         struct obd_device *obd;
1323         struct lustre_sb_info *lsi = s2lsi(sb);
1324         struct config_llog_instance cfg;
1325         struct lu_env mgc_env;
1326         struct lu_device *dev;
1327         int rc;
1328         ENTRY;
1329
1330         CDEBUG(D_MOUNT, "starting target %s\n", lsi->lsi_svname);
1331
1332         if (IS_MDT(lsi)) {
1333                 /* make sure the MDS is started */
1334                 mutex_lock(&server_start_lock);
1335                 obd = class_name2obd(LUSTRE_MDS_OBDNAME);
1336                 if (!obd) {
1337                         rc = lustre_start_simple(LUSTRE_MDS_OBDNAME,
1338                                                  LUSTRE_MDS_NAME,
1339                                                  LUSTRE_MDS_OBDNAME"_uuid",
1340                                                  NULL, NULL, NULL, NULL);
1341                         if (rc) {
1342                                 mutex_unlock(&server_start_lock);
1343                                 CERROR("failed to start MDS: %d\n", rc);
1344                                 RETURN(rc);
1345                         }
1346                 }
1347                 mutex_unlock(&server_start_lock);
1348         }
1349
1350         /* If we're an OST, make sure the global OSS is running */
1351         if (IS_OST(lsi)) {
1352                 /* make sure OSS is started */
1353                 mutex_lock(&server_start_lock);
1354                 obd = class_name2obd(LUSTRE_OSS_OBDNAME);
1355                 if (!obd) {
1356                         rc = lustre_start_simple(LUSTRE_OSS_OBDNAME,
1357                                                  LUSTRE_OSS_NAME,
1358                                                  LUSTRE_OSS_OBDNAME"_uuid",
1359                                                  NULL, NULL, NULL, NULL);
1360                         if (rc) {
1361                                 mutex_unlock(&server_start_lock);
1362                                 CERROR("failed to start OSS: %d\n", rc);
1363                                 RETURN(rc);
1364                         }
1365                 }
1366                 mutex_unlock(&server_start_lock);
1367         }
1368
1369         rc = lu_env_init(&mgc_env, LCT_MG_THREAD);
1370         if (rc != 0)
1371                 GOTO(out_stop_service, rc);
1372
1373         /* Set the mgc fs to our server disk.  This allows the MGC to
1374          * read and write configs locally, in case it can't talk to the MGS. */
1375         rc = server_mgc_set_fs(&mgc_env, lsi->lsi_mgc, sb);
1376         if (rc)
1377                 GOTO(out_env, rc);
1378
1379         /* Register with MGS */
1380         rc = server_register_target(lsi);
1381         if (rc)
1382                 GOTO(out_mgc, rc);
1383
1384         /* Let the target look up the mount using the target's name
1385            (we can't pass the sb or mnt through class_process_config.) */
1386         rc = server_register_mount(lsi->lsi_svname, sb);
1387         if (rc)
1388                 GOTO(out_mgc, rc);
1389
1390         /* Start targets using the llog named for the target */
1391         memset(&cfg, 0, sizeof(cfg));
1392         cfg.cfg_callback = class_config_llog_handler;
1393         cfg.cfg_sub_clds = CONFIG_SUB_SERVER;
1394         rc = lustre_process_log(sb, lsi->lsi_svname, &cfg);
1395         if (rc) {
1396                 CERROR("failed to start server %s: %d\n",
1397                        lsi->lsi_svname, rc);
1398                 /* Do NOT call server_deregister_mount() here. This makes it
1399                  * impossible to find mount later in cleanup time and leaves
1400                  * @lsi and othder stuff leaked. -umka */
1401                 GOTO(out_mgc, rc);
1402         }
1403
1404         obd = class_name2obd(lsi->lsi_svname);
1405         if (!obd) {
1406                 CERROR("no server named %s was started\n", lsi->lsi_svname);
1407                 GOTO(out_mgc, rc = -ENXIO);
1408         }
1409
1410         if (IS_OST(lsi) || IS_MDT(lsi)) {
1411                 rc = lustre_start_lwp(sb);
1412                 if (rc) {
1413                         CERROR("%s: failed to start LWP: %d\n",
1414                                lsi->lsi_svname, rc);
1415                         GOTO(out_mgc, rc);
1416                 }
1417         }
1418
1419         server_notify_target(sb, obd);
1420
1421         /* calculate recovery timeout, do it after lustre_process_log */
1422         server_calc_timeout(lsi, obd);
1423
1424         /* log has been fully processed, let clients connect */
1425         dev = obd->obd_lu_dev;
1426         if (dev && dev->ld_ops->ldo_prepare) {
1427                 struct lu_env env;
1428
1429                 rc = lu_env_init(&env, dev->ld_type->ldt_ctx_tags);
1430                 if (rc == 0) {
1431                         struct lu_context  session_ctx;
1432
1433                         lu_context_init(&session_ctx, LCT_SERVER_SESSION);
1434                         session_ctx.lc_thread = NULL;
1435                         lu_context_enter(&session_ctx);
1436                         env.le_ses = &session_ctx;
1437
1438                         rc = dev->ld_ops->ldo_prepare(&env, NULL, dev);
1439
1440                         lu_env_fini(&env);
1441                         lu_context_exit(&session_ctx);
1442                         lu_context_fini(&session_ctx);
1443                 }
1444         }
1445
1446         /* abort recovery only on the complete stack:
1447          * many devices can be involved */
1448         if ((lsi->lsi_lmd->lmd_flags & LMD_FLG_ABORT_RECOV) &&
1449             (OBP(obd, iocontrol))) {
1450                 obd_iocontrol(OBD_IOC_ABORT_RECOVERY, obd->obd_self_export, 0,
1451                               NULL, NULL);
1452         }
1453
1454 out_mgc:
1455         /* Release the mgc fs for others to use */
1456         server_mgc_clear_fs(&mgc_env, lsi->lsi_mgc);
1457 out_env:
1458         lu_env_fini(&mgc_env);
1459 out_stop_service:
1460         if (rc != 0)
1461                 server_stop_servers(lsi->lsi_flags);
1462
1463         RETURN(rc);
1464 }
1465
1466 static int lsi_prepare(struct lustre_sb_info *lsi)
1467 {
1468         const char *osd_type;
1469         const char *fstype;
1470         __u32 index;
1471         int rc;
1472         ENTRY;
1473
1474         LASSERT(lsi);
1475         LASSERT(lsi->lsi_lmd);
1476
1477         /* The server name is given as a mount line option */
1478         if (lsi->lsi_lmd->lmd_profile == NULL) {
1479                 LCONSOLE_ERROR("Can't determine server name\n");
1480                 RETURN(-EINVAL);
1481         }
1482
1483         /* Determine osd type */
1484         if (lsi->lsi_lmd->lmd_osd_type == NULL) {
1485                 osd_type = LUSTRE_OSD_LDISKFS_NAME;
1486                 fstype = "ldiskfs";
1487         } else {
1488                 osd_type = lsi->lsi_lmd->lmd_osd_type;
1489                 fstype = lsi->lsi_lmd->lmd_osd_type;
1490         }
1491
1492         if (strlen(lsi->lsi_lmd->lmd_profile) >= sizeof(lsi->lsi_svname) ||
1493             strlen(osd_type) >= sizeof(lsi->lsi_osd_type) ||
1494             strlen(fstype) >= sizeof(lsi->lsi_fstype))
1495                 RETURN(-ENAMETOOLONG);
1496
1497         strlcpy(lsi->lsi_svname, lsi->lsi_lmd->lmd_profile,
1498                 sizeof(lsi->lsi_svname));
1499         strlcpy(lsi->lsi_osd_type, osd_type, sizeof(lsi->lsi_osd_type));
1500         /* XXX: a temp. solution for components using ldiskfs
1501          *      to be removed in one of the subsequent patches */
1502         strlcpy(lsi->lsi_fstype, fstype, sizeof(lsi->lsi_fstype));
1503
1504         /* Determine server type */
1505         rc = server_name2index(lsi->lsi_svname, &index, NULL);
1506         if (rc < 0) {
1507                 if (lsi->lsi_lmd->lmd_flags & LMD_FLG_MGS) {
1508                         /* Assume we're a bare MGS */
1509                         rc = 0;
1510                         lsi->lsi_lmd->lmd_flags |= LMD_FLG_NOSVC;
1511                 } else {
1512                         LCONSOLE_ERROR("Can't determine server type of '%s'\n",
1513                                        lsi->lsi_svname);
1514                         RETURN(rc);
1515                 }
1516         }
1517         lsi->lsi_flags |= rc;
1518
1519         /* Add mount line flags that used to be in ldd:
1520          * writeconf, mgs, anything else?
1521          */
1522         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_WRITECONF) ?
1523                 LDD_F_WRITECONF : 0;
1524         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_VIRGIN) ?
1525                 LDD_F_VIRGIN : 0;
1526         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_UPDATE) ?
1527                 LDD_F_UPDATE : 0;
1528         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_MGS) ?
1529                 LDD_F_SV_TYPE_MGS : 0;
1530         lsi->lsi_flags |= (lsi->lsi_lmd->lmd_flags & LMD_FLG_NO_PRIMNODE) ?
1531                 LDD_F_NO_PRIMNODE : 0;
1532
1533         RETURN(0);
1534 }
1535
1536 /*************** server mount ******************/
1537
1538 /** Start the shutdown of servers at umount.
1539  */
1540 static void server_put_super(struct super_block *sb)
1541 {
1542         struct lustre_sb_info *lsi = s2lsi(sb);
1543         struct obd_device     *obd;
1544         char *tmpname, *extraname = NULL;
1545         int tmpname_sz;
1546         int lsiflags = lsi->lsi_flags;
1547         ENTRY;
1548
1549         LASSERT(IS_SERVER(lsi));
1550
1551         tmpname_sz = strlen(lsi->lsi_svname) + 1;
1552         OBD_ALLOC(tmpname, tmpname_sz);
1553         memcpy(tmpname, lsi->lsi_svname, tmpname_sz);
1554         CDEBUG(D_MOUNT, "server put_super %s\n", tmpname);
1555         if (IS_MDT(lsi) && (lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC))
1556                 snprintf(tmpname, tmpname_sz, "MGS");
1557
1558         /* disconnect the lwp first to drain off the inflight request */
1559         if (IS_OST(lsi) || IS_MDT(lsi)) {
1560                 int     rc;
1561
1562                 rc = lustre_disconnect_lwp(sb);
1563                 if (rc != 0 && rc != -ETIMEDOUT &&
1564                     rc != -ENOTCONN && rc != -ESHUTDOWN)
1565                         CWARN("%s: failed to disconnect lwp: rc= %d\n",
1566                               tmpname, rc);
1567         }
1568
1569         /* Stop the target */
1570         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
1571             (IS_MDT(lsi) || IS_OST(lsi))) {
1572                 struct lustre_profile *lprof = NULL;
1573
1574                 /* tell the mgc to drop the config log */
1575                 lustre_end_log(sb, lsi->lsi_svname, NULL);
1576
1577                 /* COMPAT_146 - profile may get deleted in mgc_cleanup.
1578                    If there are any setup/cleanup errors, save the lov
1579                    name for safety cleanup later. */
1580                 lprof = class_get_profile(lsi->lsi_svname);
1581                 if (lprof != NULL) {
1582                         if (lprof->lp_dt != NULL) {
1583                                 OBD_ALLOC(extraname, strlen(lprof->lp_dt) + 1);
1584                                 strncpy(extraname, lprof->lp_dt,
1585                                         strlen(lprof->lp_dt) + 1);
1586                         }
1587                         class_put_profile(lprof);
1588                 }
1589
1590                 obd = class_name2obd(lsi->lsi_svname);
1591                 if (obd) {
1592                         CDEBUG(D_MOUNT, "stopping %s\n", obd->obd_name);
1593                         if (lsiflags & LSI_UMOUNT_FAILOVER)
1594                                 obd->obd_fail = 1;
1595                         /* We can't seem to give an error return code
1596                          * to .put_super, so we better make sure we clean up! */
1597                         obd->obd_force = 1;
1598                         class_manual_cleanup(obd);
1599                 } else {
1600                         CERROR("no obd %s\n", lsi->lsi_svname);
1601                         server_deregister_mount(lsi->lsi_svname);
1602                 }
1603         }
1604
1605         /* If they wanted the mgs to stop separately from the mdt, they
1606            should have put it on a different device. */
1607         if (IS_MGS(lsi)) {
1608                 /* if MDS start with --nomgs, don't stop MGS then */
1609                 if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS))
1610                         server_stop_mgs(sb);
1611         }
1612
1613         if (IS_OST(lsi) || IS_MDT(lsi)) {
1614                 if (lustre_stop_lwp(sb) < 0)
1615                         CERROR("%s: failed to stop lwp!\n", tmpname);
1616         }
1617
1618         /* Clean the mgc and sb */
1619         lustre_common_put_super(sb);
1620
1621         /* wait till all in-progress cleanups are done
1622          * specifically we're interested in ofd cleanup
1623          * as it pins OSS */
1624         obd_zombie_barrier();
1625
1626         /* Stop the servers (MDS, OSS) if no longer needed.  We must wait
1627            until the target is really gone so that our type refcount check
1628            is right. */
1629         server_stop_servers(lsiflags);
1630
1631         /* In case of startup or cleanup err, stop related obds */
1632         if (extraname) {
1633                 obd = class_name2obd(extraname);
1634                 if (obd) {
1635                         CWARN("Cleaning orphaned obd %s\n", extraname);
1636                         obd->obd_force = 1;
1637                         class_manual_cleanup(obd);
1638                 }
1639                 OBD_FREE(extraname, strlen(extraname) + 1);
1640         }
1641
1642         LCONSOLE_WARN("server umount %s complete\n", tmpname);
1643         OBD_FREE(tmpname, tmpname_sz);
1644         EXIT;
1645 }
1646
1647 /** Called only for 'umount -f'
1648  */
1649 static void server_umount_begin(struct super_block *sb)
1650 {
1651         struct lustre_sb_info *lsi = s2lsi(sb);
1652         ENTRY;
1653
1654         CDEBUG(D_MOUNT, "umount -f\n");
1655         /* umount = failover
1656            umount -f = force
1657            no third way to do non-force, non-failover */
1658         lsi->lsi_flags &= ~LSI_UMOUNT_FAILOVER;
1659         EXIT;
1660 }
1661
1662 static int server_statfs(struct dentry *dentry, struct kstatfs *buf)
1663 {
1664         struct super_block *sb = dentry->d_sb;
1665         struct lustre_sb_info *lsi = s2lsi(sb);
1666         struct obd_statfs statfs;
1667         int rc;
1668         ENTRY;
1669
1670         if (lsi->lsi_dt_dev) {
1671                 rc = dt_statfs(NULL, lsi->lsi_dt_dev, &statfs);
1672                 if (rc == 0) {
1673                         statfs_unpack(buf, &statfs);
1674                         buf->f_type = sb->s_magic;
1675                         RETURN(0);
1676                 }
1677         }
1678
1679         /* just return 0 */
1680         buf->f_type = sb->s_magic;
1681         buf->f_bsize = sb->s_blocksize;
1682         buf->f_blocks = 1;
1683         buf->f_bfree = 0;
1684         buf->f_bavail = 0;
1685         buf->f_files = 1;
1686         buf->f_ffree = 0;
1687         buf->f_namelen = NAME_MAX;
1688         RETURN(0);
1689 }
1690
1691 #ifdef HAVE_SUPEROPS_USE_DENTRY
1692 int server_show_options(struct seq_file *seq, struct dentry *dentry)
1693 #else
1694 int server_show_options(struct seq_file *seq, struct vfsmount *vfs)
1695 #endif
1696 {
1697         struct lustre_sb_info *lsi;
1698         struct lustre_mount_data *lmd;
1699
1700 #ifdef HAVE_SUPEROPS_USE_DENTRY
1701         LASSERT(seq != NULL && dentry != NULL);
1702         lsi = s2lsi(dentry->d_sb);
1703 #else
1704         LASSERT(seq != NULL && vfs != NULL);
1705         lsi = s2lsi(vfs->mnt_sb);
1706 #endif
1707
1708         lmd = lsi->lsi_lmd;
1709         seq_printf(seq, ",svname=%s", lmd->lmd_profile);
1710
1711         if  (lmd->lmd_flags & LMD_FLG_ABORT_RECOV)
1712                 seq_puts(seq, ",abort_recov");
1713
1714         if (lmd->lmd_flags & LMD_FLG_NOIR)
1715                 seq_puts(seq, ",noir");
1716
1717         if (lmd->lmd_flags & LMD_FLG_NOSVC)
1718                 seq_puts(seq, ",nosvc");
1719
1720         if (lmd->lmd_flags & LMD_FLG_NOMGS)
1721                 seq_puts(seq, ",nomgs");
1722
1723         if (lmd->lmd_flags & LMD_FLG_NOSCRUB)
1724                 seq_puts(seq, ",noscrub");
1725         if (lmd->lmd_flags & LMD_FLG_SKIP_LFSCK)
1726                 seq_puts(seq, ",skip_lfsck");
1727
1728         if (lmd->lmd_flags & LMD_FLG_DEV_RDONLY)
1729                 seq_puts(seq, ",rdonly_dev");
1730
1731         if (lmd->lmd_flags & LMD_FLG_MGS)
1732                 seq_puts(seq, ",mgs");
1733
1734         if (lmd->lmd_mgs != NULL)
1735                 seq_printf(seq, ",mgsnode=%s", lmd->lmd_mgs);
1736
1737         if (lmd->lmd_osd_type != NULL)
1738                 seq_printf(seq, ",osd=%s", lmd->lmd_osd_type);
1739
1740         if (lmd->lmd_opts != NULL) {
1741                 seq_putc(seq, ',');
1742                 seq_puts(seq, lmd->lmd_opts);
1743         }
1744
1745         RETURN(0);
1746 }
1747
1748 /** The operations we support directly on the superblock:
1749  * mount, umount, and df.
1750  */
1751 static struct super_operations server_ops = {
1752         .put_super      = server_put_super,
1753         .umount_begin   = server_umount_begin, /* umount -f */
1754         .statfs         = server_statfs,
1755         .show_options   = server_show_options,
1756 };
1757
1758 /*
1759  * Xattr support for Lustre servers
1760  */
1761 #ifdef HAVE_IOP_XATTR
1762 static ssize_t lustre_getxattr(struct dentry *dentry, const char *name,
1763                                 void *buffer, size_t size)
1764 {
1765         if (!selinux_is_enabled())
1766                 return -EOPNOTSUPP;
1767         return -ENODATA;
1768 }
1769
1770 static int lustre_setxattr(struct dentry *dentry, const char *name,
1771                             const void *value, size_t size, int flags)
1772 {
1773         return -EOPNOTSUPP;
1774 }
1775 #endif
1776
1777 static ssize_t lustre_listxattr(struct dentry *d_entry, char *name,
1778                                 size_t size)
1779 {
1780         return -EOPNOTSUPP;
1781 }
1782
1783 static bool is_cmd_supported(unsigned int command)
1784 {
1785         switch (command) {
1786         case FITRIM:
1787                 return true;
1788         default:
1789                 return false;
1790         }
1791
1792         return false;
1793 }
1794
1795 static long server_ioctl(struct file *filp, unsigned int command,
1796                          unsigned long arg)
1797 {
1798         struct file active_filp;
1799         struct inode *inode = file_inode(filp);
1800         struct lustre_sb_info *lsi = s2lsi(inode->i_sb);
1801         struct super_block *dd_sb = dt_mnt_sb_get(lsi->lsi_dt_dev);
1802         struct inode *active_inode;
1803         int err = -EOPNOTSUPP;
1804
1805         if (IS_ERR(dd_sb) || !is_cmd_supported(command))
1806                 return err;
1807
1808         active_inode = igrab(dd_sb->s_root->d_inode);
1809         if (!active_inode)
1810                 return -EACCES;
1811
1812         active_filp.f_inode = active_inode;
1813         if (active_inode->i_fop && active_inode->i_fop->unlocked_ioctl)
1814                 err = active_inode->i_fop->unlocked_ioctl(&active_filp,
1815                                                           command, arg);
1816         iput(active_inode);
1817         return err;
1818 }
1819
1820 static const struct inode_operations server_inode_operations = {
1821 #ifdef HAVE_IOP_XATTR
1822         .setxattr       = lustre_setxattr,
1823         .getxattr       = lustre_getxattr,
1824 #endif
1825         .listxattr      = lustre_listxattr,
1826 };
1827
1828 static const struct file_operations server_file_operations = {
1829         .unlocked_ioctl = server_ioctl,
1830 };
1831
1832 #define log2(n) ffz(~(n))
1833 #define LUSTRE_SUPER_MAGIC 0x0BD00BD1
1834
1835 static int server_fill_super_common(struct super_block *sb)
1836 {
1837         struct inode *root = NULL;
1838         ENTRY;
1839
1840         CDEBUG(D_MOUNT, "Server sb, dev=%d\n", (int)sb->s_dev);
1841
1842         sb->s_blocksize = 4096;
1843         sb->s_blocksize_bits = log2(sb->s_blocksize);
1844         sb->s_magic = LUSTRE_SUPER_MAGIC;
1845         sb->s_maxbytes = 0; /* we don't allow file IO on server mountpoints */
1846         sb->s_flags |= MS_RDONLY;
1847         sb->s_op = &server_ops;
1848
1849         root = new_inode(sb);
1850         if (!root) {
1851                 CERROR("Can't make root inode\n");
1852                 RETURN(-EIO);
1853         }
1854
1855         /* returns -EIO for every operation */
1856         /* make_bad_inode(root); -- badness - can't umount */
1857         /* apparently we need to be a directory for the mount to finish */
1858         root->i_mode = S_IFDIR;
1859         root->i_op = &server_inode_operations;
1860         root->i_fop = &server_file_operations;
1861         sb->s_root = d_make_root(root);
1862         if (!sb->s_root) {
1863                 CERROR("%s: can't make root dentry\n", sb->s_id);
1864                 RETURN(-EIO);
1865         }
1866
1867         RETURN(0);
1868 }
1869
1870 static int osd_start(struct lustre_sb_info *lsi, unsigned long mflags)
1871 {
1872         struct lustre_mount_data *lmd = lsi->lsi_lmd;
1873         struct obd_device *obd;
1874         struct dt_device_param p;
1875         char flagstr[20 + 1 + 10 + 1];
1876         int rc;
1877         ENTRY;
1878
1879         CDEBUG(D_MOUNT,
1880                "Attempting to start %s, type=%s, lsifl=%x, mountfl=%lx\n",
1881                lsi->lsi_svname, lsi->lsi_osd_type, lsi->lsi_flags, mflags);
1882
1883         sprintf(lsi->lsi_osd_obdname, "%s-osd", lsi->lsi_svname);
1884         strcpy(lsi->lsi_osd_uuid, lsi->lsi_osd_obdname);
1885         strcat(lsi->lsi_osd_uuid, "_UUID");
1886         snprintf(flagstr, sizeof(flagstr), "%lu:%u", mflags, lmd->lmd_flags);
1887
1888         obd = class_name2obd(lsi->lsi_osd_obdname);
1889         if (obd == NULL) {
1890                 rc = lustre_start_simple(lsi->lsi_osd_obdname,
1891                                          lsi->lsi_osd_type,
1892                                          lsi->lsi_osd_uuid, lmd->lmd_dev,
1893                                          flagstr, lsi->lsi_lmd->lmd_opts,
1894                                          lsi->lsi_svname);
1895                 if (rc)
1896                         GOTO(out, rc);
1897                 obd = class_name2obd(lsi->lsi_osd_obdname);
1898                 LASSERT(obd);
1899         } else {
1900                 CDEBUG(D_MOUNT, "%s already started\n", lsi->lsi_osd_obdname);
1901                 /* but continue setup to allow special case of MDT and internal
1902                  * MGT being started separately. */
1903                 if (!((IS_MGS(lsi) && (lsi->lsi_lmd->lmd_flags &
1904                                       LMD_FLG_NOMGS)) ||
1905                      (IS_MDT(lsi) && (lsi->lsi_lmd->lmd_flags &
1906                                       LMD_FLG_NOSVC))))
1907                         RETURN(-EALREADY);
1908         }
1909
1910         rc = obd_connect(NULL, &lsi->lsi_osd_exp,
1911                          obd, &obd->obd_uuid, NULL, NULL);
1912
1913         if (rc) {
1914                 obd->obd_force = 1;
1915                 class_manual_cleanup(obd);
1916                 lsi->lsi_dt_dev = NULL;
1917                 RETURN(rc);
1918         }
1919
1920         LASSERT(obd->obd_lu_dev);
1921         lu_device_get(obd->obd_lu_dev);
1922         lsi->lsi_dt_dev = lu2dt_dev(obd->obd_lu_dev);
1923         LASSERT(lsi->lsi_dt_dev);
1924
1925         /* set disk context for llog usage */
1926         OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
1927         obd->obd_lvfs_ctxt.dt = lsi->lsi_dt_dev;
1928
1929         dt_conf_get(NULL, lsi->lsi_dt_dev, &p);
1930 out:
1931         RETURN(rc);
1932 }
1933
1934 /** Fill in the superblock info for a Lustre server.
1935  * Mount the device with the correct options.
1936  * Read the on-disk config file.
1937  * Start the services.
1938  */
1939 int server_fill_super(struct super_block *sb)
1940 {
1941         struct lustre_sb_info *lsi = s2lsi(sb);
1942         int rc;
1943         ENTRY;
1944
1945         /* to simulate target mount race */
1946         OBD_RACE(OBD_FAIL_TGT_MOUNT_RACE);
1947
1948         rc = lsi_prepare(lsi);
1949         if (rc) {
1950                 lustre_put_lsi(sb);
1951                 RETURN(rc);
1952         }
1953
1954         /* Start low level OSD */
1955         rc = osd_start(lsi, sb->s_flags);
1956         if (rc) {
1957                 CERROR("Unable to start osd on %s: %d\n",
1958                        lsi->lsi_lmd->lmd_dev, rc);
1959                 lustre_put_lsi(sb);
1960                 RETURN(rc);
1961         }
1962
1963         CDEBUG(D_MOUNT, "Found service %s on device %s\n",
1964                lsi->lsi_svname, lsi->lsi_lmd->lmd_dev);
1965
1966         if (class_name2obd(lsi->lsi_svname)) {
1967                 LCONSOLE_ERROR_MSG(0x161, "The target named %s is already "
1968                                    "running. Double-mount may have compromised"
1969                                    " the disk journal.\n",
1970                                    lsi->lsi_svname);
1971                 lustre_put_lsi(sb);
1972                 RETURN(-EALREADY);
1973         }
1974
1975         /* Start MGS before MGC */
1976         if (IS_MGS(lsi) && !(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS)) {
1977                 rc = server_start_mgs(sb);
1978                 if (rc)
1979                         GOTO(out_mnt, rc);
1980         }
1981
1982         /* Start MGC before servers */
1983         rc = lustre_start_mgc(sb);
1984         if (rc)
1985                 GOTO(out_mnt, rc);
1986
1987         /* Set up all obd devices for service */
1988         if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
1989             (IS_OST(lsi) || IS_MDT(lsi))) {
1990                 rc = server_start_targets(sb);
1991                 if (rc < 0) {
1992                         CERROR("Unable to start targets: %d\n", rc);
1993                         GOTO(out_mnt, rc);
1994                 }
1995                 /* FIXME overmount client here, or can we just start a
1996                  * client log and client_fill_super on this sb?  We
1997                  * need to make sure server_put_super gets called too
1998                  * - ll_put_super calls lustre_common_put_super; check
1999                  * there for LSI_SERVER flag, call s_p_s if so.
2000                  *
2001                  * Probably should start client from new thread so we
2002                  * can return.  Client will not finish until all
2003                  * servers are connected.  Note - MGS-only server does
2004                  * NOT get a client, since there is no lustre fs
2005                  * associated - the MGS is for all lustre fs's */
2006         }
2007
2008         rc = server_fill_super_common(sb);
2009         if (rc)
2010                 GOTO(out_mnt, rc);
2011
2012         RETURN(0);
2013 out_mnt:
2014         /* We jump here in case of failure while starting targets or MGS.
2015          * In this case we can't just put @mnt and have to do real cleanup
2016          * with stoping targets, etc. */
2017         server_put_super(sb);
2018         return rc;
2019 }
2020
2021 /*
2022  * Calculate timeout value for a target.
2023  */
2024 void server_calc_timeout(struct lustre_sb_info *lsi, struct obd_device *obd)
2025 {
2026         struct lustre_mount_data *lmd;
2027         int soft = 0;
2028         int hard = 0;
2029         int factor = 0;
2030         bool has_ir = !!(lsi->lsi_flags & LDD_F_IR_CAPABLE);
2031         int min = OBD_RECOVERY_TIME_MIN;
2032
2033         LASSERT(IS_SERVER(lsi));
2034
2035         lmd = lsi->lsi_lmd;
2036         if (lmd) {
2037                 soft   = lmd->lmd_recovery_time_soft;
2038                 hard   = lmd->lmd_recovery_time_hard;
2039                 has_ir = has_ir && !(lmd->lmd_flags & LMD_FLG_NOIR);
2040                 obd->obd_no_ir = !has_ir;
2041         }
2042
2043         if (soft == 0)
2044                 soft = OBD_RECOVERY_TIME_SOFT;
2045         if (hard == 0)
2046                 hard = OBD_RECOVERY_TIME_HARD;
2047
2048         /* target may have ir_factor configured. */
2049         factor = OBD_IR_FACTOR_DEFAULT;
2050         if (obd->obd_recovery_ir_factor)
2051                 factor = obd->obd_recovery_ir_factor;
2052
2053         if (has_ir) {
2054                 int new_soft = soft;
2055
2056                 /* adjust timeout value by imperative recovery */
2057                 new_soft = (soft * factor) / OBD_IR_FACTOR_MAX;
2058                 /* make sure the timeout is not too short */
2059                 new_soft = max(min, new_soft);
2060
2061                 LCONSOLE_INFO("%s: Imperative Recovery enabled, recovery "
2062                               "window shrunk from %d-%d down to %d-%d\n",
2063                               obd->obd_name, soft, hard, new_soft, hard);
2064
2065                 soft = new_soft;
2066         } else {
2067                 LCONSOLE_INFO("%s: Imperative Recovery not enabled, recovery "
2068                               "window %d-%d\n", obd->obd_name, soft, hard);
2069         }
2070
2071         /* we're done */
2072         obd->obd_recovery_timeout = max_t(time64_t, obd->obd_recovery_timeout,
2073                                           soft);
2074         obd->obd_recovery_time_hard = hard;
2075         obd->obd_recovery_ir_factor = factor;
2076 }