GNU Linux-libre 4.9.311-gnu1
[releases.git] / drivers / staging / lustre / lustre / lov / lov_cl_internal.h
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) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2012, 2015 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 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * Internal interfaces of LOV layer.
37  *
38  *   Author: Nikita Danilov <nikita.danilov@sun.com>
39  *   Author: Jinshan Xiong <jinshan.xiong@intel.com>
40  */
41
42 #ifndef LOV_CL_INTERNAL_H
43 #define LOV_CL_INTERNAL_H
44
45 #include "../../include/linux/libcfs/libcfs.h"
46
47 #include "../include/obd.h"
48 #include "../include/cl_object.h"
49 #include "lov_internal.h"
50
51 /** \defgroup lov lov
52  * Logical object volume layer. This layer implements data striping (raid0).
53  *
54  * At the lov layer top-entity (object, page, lock, io) is connected to one or
55  * more sub-entities: top-object, representing a file is connected to a set of
56  * sub-objects, each representing a stripe, file-level top-lock is connected
57  * to a set of per-stripe sub-locks, top-page is connected to a (single)
58  * sub-page, and a top-level IO is connected to a set of (potentially
59  * concurrent) sub-IO's.
60  *
61  * Sub-object, sub-page, and sub-io have well-defined top-object and top-page
62  * respectively, while a single sub-lock can be part of multiple top-locks.
63  *
64  * Reference counting models are different for different types of entities:
65  *
66  *     - top-object keeps a reference to its sub-objects, and destroys them
67  *       when it is destroyed.
68  *
69  *     - top-page keeps a reference to its sub-page, and destroys it when it
70  *       is destroyed.
71  *
72  *     - IO's are not reference counted.
73  *
74  * To implement a connection between top and sub entities, lov layer is split
75  * into two pieces: lov ("upper half"), and lovsub ("bottom half"), both
76  * implementing full set of cl-interfaces. For example, top-object has vvp and
77  * lov layers, and it's sub-object has lovsub and osc layers. lovsub layer is
78  * used to track child-parent relationship.
79  *
80  * @{
81  */
82
83 struct lovsub_device;
84 struct lovsub_object;
85 struct lovsub_lock;
86
87 enum lov_device_flags {
88         LOV_DEV_INITIALIZED = 1 << 0
89 };
90
91 /*
92  * Upper half.
93  */
94
95 /**
96  * Resources that are used in memory-cleaning path, and whose allocation
97  * cannot fail even when memory is tight. They are preallocated in sufficient
98  * quantities in lov_device::ld_emerg[], and access to them is serialized
99  * lov_device::ld_mutex.
100  */
101 struct lov_device_emerg {
102         /**
103          * Page list used to submit IO when memory is in pressure.
104          */
105         struct cl_page_list emrg_page_list;
106         /**
107          * sub-io's shared by all threads accessing this device when memory is
108          * too low to allocate sub-io's dynamically.
109          */
110         struct cl_io    emrg_subio;
111         /**
112          * Environments used by sub-io's in
113          * lov_device_emerg::emrg_subio.
114          */
115         struct lu_env      *emrg_env;
116         /**
117          * Refchecks for lov_device_emerg::emrg_env.
118          *
119          * \see cl_env_get()
120          */
121         int              emrg_refcheck;
122 };
123
124 struct lov_device {
125         /*
126          * XXX Locking of lov-private data is missing.
127          */
128         struct cl_device          ld_cl;
129         struct lov_obd     *ld_lov;
130         /** size of lov_device::ld_target[] array */
131         __u32                ld_target_nr;
132         struct lovsub_device    **ld_target;
133         __u32                ld_flags;
134
135         /** Emergency resources used in memory-cleansing paths. */
136         struct lov_device_emerg **ld_emrg;
137         /**
138          * Serializes access to lov_device::ld_emrg in low-memory
139          * conditions.
140          */
141         struct mutex              ld_mutex;
142 };
143
144 /**
145  * Layout type.
146  */
147 enum lov_layout_type {
148         LLT_EMPTY,      /** empty file without body (mknod + truncate) */
149         LLT_RAID0,      /** striped file */
150         LLT_RELEASED,   /** file with no objects (data in HSM) */
151         LLT_NR
152 };
153
154 static inline char *llt2str(enum lov_layout_type llt)
155 {
156         switch (llt) {
157         case LLT_EMPTY:
158                 return "EMPTY";
159         case LLT_RAID0:
160                 return "RAID0";
161         case LLT_RELEASED:
162                 return "RELEASED";
163         case LLT_NR:
164                 LBUG();
165         }
166         LBUG();
167         return "";
168 }
169
170 /**
171  * lov-specific file state.
172  *
173  * lov object has particular layout type, determining how top-object is built
174  * on top of sub-objects. Layout type can change dynamically. When this
175  * happens, lov_object::lo_type_guard semaphore is taken in exclusive mode,
176  * all state pertaining to the old layout type is destroyed, and new state is
177  * constructed. All object methods take said semaphore in the shared mode,
178  * providing serialization against transition between layout types.
179  *
180  * To avoid multiple `if' or `switch' statements, selecting behavior for the
181  * current layout type, object methods perform double-dispatch, invoking
182  * function corresponding to the current layout type.
183  */
184 struct lov_object {
185         struct cl_object       lo_cl;
186         /**
187          * Serializes object operations with transitions between layout types.
188          *
189          * This semaphore is taken in shared mode by all object methods, and
190          * is taken in exclusive mode when object type is changed.
191          *
192          * \see lov_object::lo_type
193          */
194         struct rw_semaphore     lo_type_guard;
195         /**
196          * Type of an object. Protected by lov_object::lo_type_guard.
197          */
198         enum lov_layout_type    lo_type;
199         /**
200          * True if layout is invalid. This bit is cleared when layout lock
201          * is lost.
202          */
203         bool                    lo_layout_invalid;
204         /**
205          * How many IOs are on going on this object. Layout can be changed
206          * only if there is no active IO.
207          */
208         atomic_t               lo_active_ios;
209         /**
210          * Waitq - wait for no one else is using lo_lsm
211          */
212         wait_queue_head_t              lo_waitq;
213         /**
214          * Layout metadata. NULL if empty layout.
215          */
216         struct lov_stripe_md  *lo_lsm;
217
218         union lov_layout_state {
219                 struct lov_layout_raid0 {
220                         unsigned               lo_nr;
221                         /**
222                          * When this is true, lov_object::lo_attr contains
223                          * valid up to date attributes for a top-level
224                          * object. This field is reset to 0 when attributes of
225                          * any sub-object change.
226                          */
227                         int                    lo_attr_valid;
228                         /**
229                          * Array of sub-objects. Allocated when top-object is
230                          * created (lov_init_raid0()).
231                          *
232                          * Top-object is a strict master of its sub-objects:
233                          * it is created before them, and outlives its
234                          * children (this later is necessary so that basic
235                          * functions like cl_object_top() always
236                          * work). Top-object keeps a reference on every
237                          * sub-object.
238                          *
239                          * When top-object is destroyed (lov_delete_raid0())
240                          * it releases its reference to a sub-object and waits
241                          * until the latter is finally destroyed.
242                          */
243                         struct lovsub_object **lo_sub;
244                         /**
245                          * protect lo_sub
246                          */
247                         spinlock_t              lo_sub_lock;
248                         /**
249                          * Cached object attribute, built from sub-object
250                          * attributes.
251                          */
252                         struct cl_attr   lo_attr;
253                 } raid0;
254                 struct lov_layout_state_empty {
255                 } empty;
256                 struct lov_layout_state_released {
257                 } released;
258         } u;
259         /**
260          * Thread that acquired lov_object::lo_type_guard in an exclusive
261          * mode.
262          */
263         struct task_struct      *lo_owner;
264 };
265
266 /**
267  * State lov_lock keeps for each sub-lock.
268  */
269 struct lov_lock_sub {
270         /** sub-lock itself */
271         struct cl_lock          sub_lock;
272         /** Set if the sublock has ever been enqueued, meaning it may
273          * hold resources of underlying layers
274          */
275         unsigned int            sub_is_enqueued:1,
276                                 sub_initialized:1;
277         int               sub_stripe;
278 };
279
280 /**
281  * lov-specific lock state.
282  */
283 struct lov_lock {
284         struct cl_lock_slice   lls_cl;
285         /** Number of sub-locks in this lock */
286         int                 lls_nr;
287         /** sublock array */
288         struct lov_lock_sub     lls_sub[0];
289 };
290
291 struct lov_page {
292         struct cl_page_slice    lps_cl;
293         unsigned int            lps_stripe; /* stripe index */
294 };
295
296 /*
297  * Bottom half.
298  */
299
300 struct lovsub_device {
301         struct cl_device   acid_cl;
302         struct lov_device *acid_super;
303         int             acid_idx;
304         struct cl_device  *acid_next;
305 };
306
307 struct lovsub_object {
308         struct cl_object_header lso_header;
309         struct cl_object        lso_cl;
310         struct lov_object      *lso_super;
311         int                  lso_index;
312 };
313
314 /**
315  * A link between a top-lock and a sub-lock. Separate data-structure is
316  * necessary, because top-locks and sub-locks are in M:N relationship.
317  *
318  * \todo This can be optimized for a (by far) most frequent case of a single
319  * top-lock per sub-lock.
320  */
321 struct lov_lock_link {
322         struct lov_lock *lll_super;
323         /** An index within parent lock. */
324         int           lll_idx;
325         /**
326          * A linkage into per sub-lock list of all corresponding top-locks,
327          * hanging off lovsub_lock::lss_parents.
328          */
329         struct list_head       lll_list;
330 };
331
332 /**
333  * Lock state at lovsub layer.
334  */
335 struct lovsub_lock {
336         struct cl_lock_slice  lss_cl;
337         /**
338          * List of top-locks that have given sub-lock as their part. Protected
339          * by cl_lock::cll_guard mutex.
340          */
341         struct list_head            lss_parents;
342         /**
343          * Top-lock that initiated current operation on this sub-lock. This is
344          * only set during top-to-bottom lock operations like enqueue, and is
345          * used to optimize state change notification. Protected by
346          * cl_lock::cll_guard mutex.
347          *
348          * \see lovsub_lock_state_one().
349          */
350         struct cl_lock       *lss_active;
351 };
352
353 /**
354  * Describe the environment settings for sublocks.
355  */
356 struct lov_sublock_env {
357         const struct lu_env *lse_env;
358         struct cl_io    *lse_io;
359         struct lov_io_sub   *lse_sub;
360 };
361
362 struct lovsub_page {
363         struct cl_page_slice lsb_cl;
364 };
365
366 struct lov_thread_info {
367         struct cl_object_conf   lti_stripe_conf;
368         struct lu_fid      lti_fid;
369         struct cl_lock_descr    lti_ldescr;
370         struct ost_lvb    lti_lvb;
371         struct cl_2queue        lti_cl2q;
372         struct cl_page_list     lti_plist;
373         wait_queue_t      lti_waiter;
374         struct cl_attr          lti_attr;
375 };
376
377 /**
378  * State that lov_io maintains for every sub-io.
379  */
380 struct lov_io_sub {
381         int               sub_stripe;
382         /**
383          * sub-io for a stripe. Ideally sub-io's can be stopped and resumed
384          * independently, with lov acting as a scheduler to maximize overall
385          * throughput.
386          */
387         struct cl_io    *sub_io;
388         /**
389          * Linkage into a list (hanging off lov_io::lis_active) of all
390          * sub-io's active for the current IO iteration.
391          */
392         struct list_head           sub_linkage;
393         /**
394          * true, iff cl_io_init() was successfully executed against
395          * lov_io_sub::sub_io.
396          */
397         int               sub_io_initialized;
398         /**
399          * True, iff lov_io_sub::sub_io and lov_io_sub::sub_env weren't
400          * allocated, but borrowed from a per-device emergency pool.
401          */
402         int               sub_borrowed;
403         /**
404          * environment, in which sub-io executes.
405          */
406         struct lu_env *sub_env;
407         /**
408          * environment's refcheck.
409          *
410          * \see cl_env_get()
411          */
412         int               sub_refcheck;
413         int               sub_refcheck2;
414         int               sub_reenter;
415         void            *sub_cookie;
416 };
417
418 /**
419  * IO state private for LOV.
420  */
421 struct lov_io {
422         /** super-class */
423         struct cl_io_slice lis_cl;
424         /**
425          * Pointer to the object slice. This is a duplicate of
426          * lov_io::lis_cl::cis_object.
427          */
428         struct lov_object *lis_object;
429         /**
430          * Original end-of-io position for this IO, set by the upper layer as
431          * cl_io::u::ci_rw::pos + cl_io::u::ci_rw::count. lov remembers this,
432          * changes pos and count to fit IO into a single stripe and uses saved
433          * value to determine when IO iterations have to stop.
434          *
435          * This is used only for CIT_READ and CIT_WRITE io's.
436          */
437         loff_t       lis_io_endpos;
438
439         /**
440          * starting position within a file, for the current io loop iteration
441          * (stripe), used by ci_io_loop().
442          */
443         u64         lis_pos;
444         /**
445          * end position with in a file, for the current stripe io. This is
446          * exclusive (i.e., next offset after last byte affected by io).
447          */
448         u64         lis_endpos;
449
450         int             lis_mem_frozen;
451         int             lis_stripe_count;
452         int             lis_active_subios;
453
454         /**
455          * the index of ls_single_subio in ls_subios array
456          */
457         int             lis_single_subio_index;
458         struct cl_io       lis_single_subio;
459
460         /**
461          * size of ls_subios array, actually the highest stripe #
462          */
463         int             lis_nr_subios;
464         struct lov_io_sub *lis_subs;
465         /**
466          * List of active sub-io's.
467          */
468         struct list_head         lis_active;
469 };
470
471 struct lov_session {
472         struct lov_io     ls_io;
473         struct lov_sublock_env ls_subenv;
474 };
475
476 /**
477  * State of transfer for lov.
478  */
479 struct lov_req {
480         struct cl_req_slice lr_cl;
481 };
482
483 /**
484  * State of transfer for lovsub.
485  */
486 struct lovsub_req {
487         struct cl_req_slice lsrq_cl;
488 };
489
490 extern struct lu_device_type lov_device_type;
491 extern struct lu_device_type lovsub_device_type;
492
493 extern struct lu_context_key lov_key;
494 extern struct lu_context_key lov_session_key;
495
496 extern struct kmem_cache *lov_lock_kmem;
497 extern struct kmem_cache *lov_object_kmem;
498 extern struct kmem_cache *lov_thread_kmem;
499 extern struct kmem_cache *lov_session_kmem;
500 extern struct kmem_cache *lov_req_kmem;
501
502 extern struct kmem_cache *lovsub_lock_kmem;
503 extern struct kmem_cache *lovsub_object_kmem;
504 extern struct kmem_cache *lovsub_req_kmem;
505
506 extern struct kmem_cache *lov_lock_link_kmem;
507
508 int lov_object_init(const struct lu_env *env, struct lu_object *obj,
509                     const struct lu_object_conf *conf);
510 int lovsub_object_init(const struct lu_env *env, struct lu_object *obj,
511                        const struct lu_object_conf *conf);
512 int lov_lock_init(const struct lu_env *env, struct cl_object *obj,
513                   struct cl_lock *lock, const struct cl_io *io);
514 int lov_io_init(const struct lu_env *env, struct cl_object *obj,
515                 struct cl_io *io);
516 int lovsub_lock_init(const struct lu_env *env, struct cl_object *obj,
517                      struct cl_lock *lock, const struct cl_io *io);
518
519 int lov_lock_init_raid0(const struct lu_env *env, struct cl_object *obj,
520                         struct cl_lock *lock, const struct cl_io *io);
521 int lov_lock_init_empty(const struct lu_env *env, struct cl_object *obj,
522                         struct cl_lock *lock, const struct cl_io *io);
523 int lov_io_init_raid0(const struct lu_env *env, struct cl_object *obj,
524                       struct cl_io *io);
525 int lov_io_init_empty(const struct lu_env *env, struct cl_object *obj,
526                       struct cl_io *io);
527 int lov_io_init_released(const struct lu_env *env, struct cl_object *obj,
528                          struct cl_io *io);
529 void lov_lock_unlink(const struct lu_env *env, struct lov_lock_link *link,
530                      struct lovsub_lock *sub);
531
532 struct lov_io_sub *lov_sub_get(const struct lu_env *env, struct lov_io *lio,
533                                int stripe);
534 void lov_sub_put(struct lov_io_sub *sub);
535 int lov_sublock_modify(const struct lu_env *env, struct lov_lock *lov,
536                        struct lovsub_lock *sublock,
537                        const struct cl_lock_descr *d, int idx);
538
539 int lov_page_init(const struct lu_env *env, struct cl_object *ob,
540                   struct cl_page *page, pgoff_t index);
541 int lovsub_page_init(const struct lu_env *env, struct cl_object *ob,
542                      struct cl_page *page, pgoff_t index);
543 int lov_page_init_empty(const struct lu_env *env, struct cl_object *obj,
544                         struct cl_page *page, pgoff_t index);
545 int lov_page_init_raid0(const struct lu_env *env, struct cl_object *obj,
546                         struct cl_page *page, pgoff_t index);
547 struct lu_object *lov_object_alloc(const struct lu_env *env,
548                                    const struct lu_object_header *hdr,
549                                    struct lu_device *dev);
550 struct lu_object *lovsub_object_alloc(const struct lu_env *env,
551                                       const struct lu_object_header *hdr,
552                                       struct lu_device *dev);
553
554 struct lov_lock_link *lov_lock_link_find(const struct lu_env *env,
555                                          struct lov_lock *lck,
556                                          struct lovsub_lock *sub);
557 struct lov_io_sub *lov_page_subio(const struct lu_env *env, struct lov_io *lio,
558                                   const struct cl_page_slice *slice);
559
560 struct lov_stripe_md *lov_lsm_addref(struct lov_object *lov);
561 int lov_page_stripe(const struct cl_page *page);
562
563 #define lov_foreach_target(lov, var)                \
564         for (var = 0; var < lov_targets_nr(lov); ++var)
565
566 /*****************************************************************************
567  *
568  * Type conversions.
569  *
570  * Accessors.
571  *
572  */
573
574 static inline struct lov_session *lov_env_session(const struct lu_env *env)
575 {
576         struct lov_session *ses;
577
578         ses = lu_context_key_get(env->le_ses, &lov_session_key);
579         LASSERT(ses);
580         return ses;
581 }
582
583 static inline struct lov_io *lov_env_io(const struct lu_env *env)
584 {
585         return &lov_env_session(env)->ls_io;
586 }
587
588 static inline int lov_is_object(const struct lu_object *obj)
589 {
590         return obj->lo_dev->ld_type == &lov_device_type;
591 }
592
593 static inline int lovsub_is_object(const struct lu_object *obj)
594 {
595         return obj->lo_dev->ld_type == &lovsub_device_type;
596 }
597
598 static inline struct lu_device *lov2lu_dev(struct lov_device *lov)
599 {
600         return &lov->ld_cl.cd_lu_dev;
601 }
602
603 static inline struct lov_device *lu2lov_dev(const struct lu_device *d)
604 {
605         LINVRNT(d->ld_type == &lov_device_type);
606         return container_of0(d, struct lov_device, ld_cl.cd_lu_dev);
607 }
608
609 static inline struct cl_device *lovsub2cl_dev(struct lovsub_device *lovsub)
610 {
611         return &lovsub->acid_cl;
612 }
613
614 static inline struct lu_device *lovsub2lu_dev(struct lovsub_device *lovsub)
615 {
616         return &lovsub2cl_dev(lovsub)->cd_lu_dev;
617 }
618
619 static inline struct lovsub_device *lu2lovsub_dev(const struct lu_device *d)
620 {
621         LINVRNT(d->ld_type == &lovsub_device_type);
622         return container_of0(d, struct lovsub_device, acid_cl.cd_lu_dev);
623 }
624
625 static inline struct lovsub_device *cl2lovsub_dev(const struct cl_device *d)
626 {
627         LINVRNT(d->cd_lu_dev.ld_type == &lovsub_device_type);
628         return container_of0(d, struct lovsub_device, acid_cl);
629 }
630
631 static inline struct lu_object *lov2lu(struct lov_object *lov)
632 {
633         return &lov->lo_cl.co_lu;
634 }
635
636 static inline struct cl_object *lov2cl(struct lov_object *lov)
637 {
638         return &lov->lo_cl;
639 }
640
641 static inline struct lov_object *lu2lov(const struct lu_object *obj)
642 {
643         LINVRNT(lov_is_object(obj));
644         return container_of0(obj, struct lov_object, lo_cl.co_lu);
645 }
646
647 static inline struct lov_object *cl2lov(const struct cl_object *obj)
648 {
649         LINVRNT(lov_is_object(&obj->co_lu));
650         return container_of0(obj, struct lov_object, lo_cl);
651 }
652
653 static inline struct lu_object *lovsub2lu(struct lovsub_object *los)
654 {
655         return &los->lso_cl.co_lu;
656 }
657
658 static inline struct cl_object *lovsub2cl(struct lovsub_object *los)
659 {
660         return &los->lso_cl;
661 }
662
663 static inline struct lovsub_object *cl2lovsub(const struct cl_object *obj)
664 {
665         LINVRNT(lovsub_is_object(&obj->co_lu));
666         return container_of0(obj, struct lovsub_object, lso_cl);
667 }
668
669 static inline struct lovsub_object *lu2lovsub(const struct lu_object *obj)
670 {
671         LINVRNT(lovsub_is_object(obj));
672         return container_of0(obj, struct lovsub_object, lso_cl.co_lu);
673 }
674
675 static inline struct lovsub_lock *
676 cl2lovsub_lock(const struct cl_lock_slice *slice)
677 {
678         LINVRNT(lovsub_is_object(&slice->cls_obj->co_lu));
679         return container_of(slice, struct lovsub_lock, lss_cl);
680 }
681
682 static inline struct lovsub_lock *cl2sub_lock(const struct cl_lock *lock)
683 {
684         const struct cl_lock_slice *slice;
685
686         slice = cl_lock_at(lock, &lovsub_device_type);
687         LASSERT(slice);
688         return cl2lovsub_lock(slice);
689 }
690
691 static inline struct lov_lock *cl2lov_lock(const struct cl_lock_slice *slice)
692 {
693         LINVRNT(lov_is_object(&slice->cls_obj->co_lu));
694         return container_of(slice, struct lov_lock, lls_cl);
695 }
696
697 static inline struct lov_page *cl2lov_page(const struct cl_page_slice *slice)
698 {
699         LINVRNT(lov_is_object(&slice->cpl_obj->co_lu));
700         return container_of0(slice, struct lov_page, lps_cl);
701 }
702
703 static inline struct lov_req *cl2lov_req(const struct cl_req_slice *slice)
704 {
705         return container_of0(slice, struct lov_req, lr_cl);
706 }
707
708 static inline struct lovsub_page *
709 cl2lovsub_page(const struct cl_page_slice *slice)
710 {
711         LINVRNT(lovsub_is_object(&slice->cpl_obj->co_lu));
712         return container_of0(slice, struct lovsub_page, lsb_cl);
713 }
714
715 static inline struct lovsub_req *cl2lovsub_req(const struct cl_req_slice *slice)
716 {
717         return container_of0(slice, struct lovsub_req, lsrq_cl);
718 }
719
720 static inline struct lov_io *cl2lov_io(const struct lu_env *env,
721                                        const struct cl_io_slice *ios)
722 {
723         struct lov_io *lio;
724
725         lio = container_of(ios, struct lov_io, lis_cl);
726         LASSERT(lio == lov_env_io(env));
727         return lio;
728 }
729
730 static inline int lov_targets_nr(const struct lov_device *lov)
731 {
732         return lov->ld_lov->desc.ld_tgt_count;
733 }
734
735 static inline struct lov_thread_info *lov_env_info(const struct lu_env *env)
736 {
737         struct lov_thread_info *info;
738
739         info = lu_context_key_get(&env->le_ctx, &lov_key);
740         LASSERT(info);
741         return info;
742 }
743
744 static inline struct lov_layout_raid0 *lov_r0(struct lov_object *lov)
745 {
746         LASSERT(lov->lo_type == LLT_RAID0);
747         LASSERT(lov->lo_lsm->lsm_magic == LOV_MAGIC ||
748                 lov->lo_lsm->lsm_magic == LOV_MAGIC_V3);
749         return &lov->u.raid0;
750 }
751
752 /* lov_pack.c */
753 int lov_getstripe(struct lov_object *obj, struct lov_stripe_md *lsm,
754                   struct lov_user_md __user *lump);
755
756 /** @} lov */
757
758 #endif