Whamcloud - gitweb
LU-17744 ldiskfs: mballoc stats fixes
[fs/lustre-release.git] / lustre / quota / qmt_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, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 021110-1307, USA
20  *
21  * GPL HEADER END
22  */
23 /*
24  * Copyright (c) 2012, 2017, Intel Corporation.
25  * Use is subject to license terms.
26  */
27
28 #ifndef _QMT_INTERNAL_H
29 #define _QMT_INTERNAL_H
30
31 #include "lquota_internal.h"
32
33 /*
34  * The Quota Master Target Device.
35  * The qmt is responsible for:
36  * - all interactions with MDT0 (provide request handlers, share ldlm namespace,
37  *   manage ldlm lvbo, ...)
38  * - all quota lock management (i.e. global quota locks as well as per-ID locks)
39  * - manage the quota pool configuration
40  *
41  * That's the structure MDT0 connects to in mdt_quota_init().
42  */
43 struct qmt_device {
44         /* Super-class. dt_device/lu_device for this master target */
45         struct dt_device        qmt_dt_dev;
46
47         /* service name of this qmt */
48         char                    qmt_svname[MAX_OBD_NAME];
49         /* root directory for this qmt */
50         struct dt_object        *qmt_root;
51
52         /* Reference to the next device in the side stack
53          * The child device is actually the OSD device where we store the quota
54          * index files */
55         struct obd_export       *qmt_child_exp;
56         struct dt_device        *qmt_child;
57
58         /* pointer to ldlm namespace to be used for quota locks */
59         struct ldlm_namespace   *qmt_ns;
60
61         /* Hash table containing a qmt_pool_info structure for each pool
62          * this quota master is in charge of. We only have 2 pools in this
63          * hash for the time being:
64          * - one for quota management on the default metadata pool
65          * - one for quota managment on the default data pool
66          *
67          * Once we support quota on non-default pools, then more pools will
68          * be added to this hash table and pool master setup would have to be
69          * handled via configuration logs */
70         struct cfs_hash         *qmt_pool_hash;
71
72         /* List of pools managed by this master target */
73         struct list_head         qmt_pool_list;
74         /* rw semaphore to protect pool list */
75         struct rw_semaphore      qmt_pool_lock;
76
77         /* procfs root directory for this qmt */
78         struct proc_dir_entry   *qmt_proc;
79
80         /* dedicated thread in charge of space rebalancing */
81         struct task_struct      *qmt_reba_task;
82
83         /* list of lqe entry which need space rebalancing */
84         struct list_head         qmt_reba_list;
85
86         /* lock protecting rebalancing list */
87         spinlock_t               qmt_reba_lock;
88
89         unsigned long            qmt_stopping:1; /* qmt is stopping */
90
91 };
92
93 struct qmt_pool_info;
94 #define QPI_MAXNAME     (LOV_MAXPOOLNAME + 1)
95 #define qmt_pool_global(qpi) \
96         (!strncmp(qpi->qpi_name, GLB_POOL_NAME, \
97                   strlen(GLB_POOL_NAME) + 1) ? true : false)
98 /* Draft for mdt pools */
99 union qmt_sarray {
100         struct lu_tgt_pool      osts;
101 };
102
103 /* Since DOM support, data resources can exist
104  * on both MDT and OST targets. */
105 enum {
106         QMT_STYPE_MDT,
107         QMT_STYPE_OST,
108         QMT_STYPE_CNT
109 };
110
111 enum {
112         /* set while recalc_thread is working */
113         QPI_FLAG_RECALC_OFFSET,
114 };
115
116 /*
117  * Per-pool quota information.
118  * The qmt creates one such structure for each pool
119  * with quota enforced. All the structures are kept in a list.
120  * We currently only support the default data pool and default metadata pool.
121  */
122 struct qmt_pool_info {
123         /* chained list of all pools managed by the same qmt */
124         struct list_head         qpi_linkage;
125
126         /* Could be  LQUOTA_RES_MD or LQUOTA_RES_DT */
127         int                      qpi_rtype;
128         char                     qpi_name[QPI_MAXNAME];
129
130         union qmt_sarray         qpi_sarr;
131         /* recalculation thread pointer */
132         struct task_struct      *qpi_recalc_task;
133         /* rw semaphore to avoid acquire/release during
134          * pool recalculation. */
135         struct rw_semaphore      qpi_recalc_sem;
136         unsigned long            qpi_flags;
137
138         /* track users of this pool instance */
139         atomic_t                 qpi_ref;
140
141         /* back pointer to master target
142          * immutable after creation. */
143         struct qmt_device       *qpi_qmt;
144
145         /* pointer to dt object associated with global indexes for both user
146          * and group quota */
147         struct dt_object        *qpi_glb_obj[LL_MAXQUOTAS];
148
149         /* A pool supports two different quota types: user and group quota.
150          * Each quota type has its own global index and lquota_entry hash table.
151          */
152         struct lquota_site      *qpi_site[LL_MAXQUOTAS];
153
154         /* number of slaves registered for each quota types */
155         int                      qpi_slv_nr[QMT_STYPE_CNT][LL_MAXQUOTAS];
156
157         /* reference on lqe (ID 0) storing grace time. */
158         struct lquota_entry     *qpi_grace_lqe[LL_MAXQUOTAS];
159
160         /* procfs root directory for this pool */
161         struct proc_dir_entry   *qpi_proc;
162
163         /* pool directory where all indexes related to this pool instance are
164          * stored */
165         struct dt_object        *qpi_root;
166
167         /* Global quota parameters which apply to all quota type */
168         /* the least value of qunit */
169         unsigned long            qpi_least_qunit;
170
171         /* Least value of qunit when soft limit is exceeded.
172          *
173          * When soft limit is exceeded, qunit will be shrinked to least_qunit
174          * (1M for block limit), that results in significant write performance
175          * drop since the client will turn to sync write from now on.
176          *
177          * To retain the write performance in an acceptable level, we choose
178          * to sacrifice grace time accuracy a bit and use a larger least_qunit
179          * when soft limit is exceeded. It's (qpi_least_qunit * 4) by default,
180          * and user may enlarge it via procfs to get even better performance
181          * (with the cost of losing more grace time accuracy).
182          *
183          * See qmt_calc_softlimit().
184          */
185         unsigned long            qpi_soft_least_qunit;
186 };
187
188 static inline int qpi_slv_nr(struct qmt_pool_info *pool, int qtype)
189 {
190         int i, sum = 0;
191
192         for (i = 0; i < QMT_STYPE_CNT; i++)
193                 sum += pool->qpi_slv_nr[i][qtype];
194
195         return sum;
196 }
197
198 static inline int qpi_slv_nr_by_rtype(struct qmt_pool_info *pool, int qtype)
199 {
200         if (pool->qpi_rtype == LQUOTA_RES_DT)
201                 /* Here should be qpi_slv_nr() if MDTs will be added
202                  * to quota pools */
203                 return pool->qpi_slv_nr[QMT_STYPE_OST][qtype];
204         else
205                 return pool->qpi_slv_nr[QMT_STYPE_MDT][qtype];
206 }
207 /*
208  * Helper routines and prototypes
209  */
210
211 /* helper routine to find qmt_pool_info associated a lquota_entry */
212 static inline struct qmt_pool_info *lqe2qpi(struct lquota_entry *lqe)
213 {
214         LASSERT(lqe_is_master(lqe));
215         return (struct qmt_pool_info *)lqe->lqe_site->lqs_parent;
216 }
217
218 /* return true if someone holds either a read or write lock on the lqe */
219 static inline bool lqe_is_locked(struct lquota_entry *lqe)
220 {
221         LASSERT(lqe_is_master(lqe));
222         if (down_write_trylock(&lqe->lqe_sem) == 0)
223                 return true;
224         lqe_write_unlock(lqe);
225         return false;
226 }
227
228 /* value to be restored if someone wrong happens during lqe writeback */
229 struct qmt_lqe_restore {
230         __u64   qlr_hardlimit;
231         __u64   qlr_softlimit;
232         __u64   qlr_gracetime;
233         __u64   qlr_granted;
234         __u64   qlr_qunit;
235 };
236
237 #define QMT_MAX_POOL_NUM        16
238 /* Common data shared by qmt handlers */
239 struct qmt_thread_info {
240         union lquota_rec         qti_rec;
241         union lquota_id          qti_id;
242         char                     qti_buf[MTI_NAME_MAXLEN];
243         struct lu_fid            qti_fid;
244         struct ldlm_res_id       qti_resid;
245         union ldlm_gl_desc       qti_gl_desc;
246         struct quota_body        qti_body;
247         union {
248                 struct qmt_lqe_restore  qti_lqes_rstr_small[QMT_MAX_POOL_NUM];
249                 struct qmt_lqe_restore  *qti_lqes_rstr;
250         };
251         union {
252                 struct qmt_pool_info    *qti_pools_small[QMT_MAX_POOL_NUM];
253                 /* Pointer to an array of qpis in case when
254                  * qti_pools_cnt > QMT_MAX_POOL_NUM. */
255                 struct qmt_pool_info    **qti_pools;
256         };
257         /* The number of pools in qti_pools */
258         int                      qti_pools_cnt;
259         /* Maximum number of elements in qti_pools array.
260          * By default it is QMT_MAX_POOL_NUM. */
261         int                      qti_pools_num;
262         int                      qti_glbl_lqe_idx;
263         /* The same is for lqe ... */
264         union {
265                 struct lquota_entry     *qti_lqes_small[QMT_MAX_POOL_NUM];
266                 /* Pointer to an array of lqes in case when
267                  * qti_lqes_cnt > QMT_MAX_POOL_NUM. */
268                 struct lquota_entry     **qti_lqes;
269         };
270         /* The number of lqes in qti_lqes */
271         int                      qti_lqes_cnt;
272         /* Maximum number of elements in qti_lqes array.
273          * By default it is QMT_MAX_POOL_NUM. */
274         int                      qti_lqes_num;
275 };
276
277 extern struct lu_context_key qmt_thread_key;
278
279 /* helper function to extract qmt_thread_info from current environment */
280 static inline
281 struct qmt_thread_info *qmt_info(const struct lu_env *env)
282 {
283         return lu_env_info(env, &qmt_thread_key);
284 }
285
286 #define qti_lqes_num(env)       (qmt_info(env)->qti_lqes_num)
287 #define qti_lqes_inited(env)    (qmt_info(env)->qti_lqes_num)
288 #define qti_lqes_cnt(env)       (qmt_info(env)->qti_lqes_cnt)
289 #define qti_glbl_lqe_idx(env)   (qmt_info(env)->qti_glbl_lqe_idx)
290 #define qti_lqes(env)           (qti_lqes_num(env) > QMT_MAX_POOL_NUM ? \
291                                         qmt_info(env)->qti_lqes : \
292                                         qmt_info(env)->qti_lqes_small)
293 #define qti_lqes_rstr(env)      (qti_lqes_num(env) > QMT_MAX_POOL_NUM ? \
294                                         qmt_info(env)->qti_lqes_rstr : \
295                                         qmt_info(env)->qti_lqes_rstr_small)
296 #define qti_lqes_glbl(env)      (qti_lqes(env)[qti_glbl_lqe_idx(env)])
297 #define qti_lqe_hard(env, i)    (qti_lqes(env)[i]->lqe_hardlimit)
298 #define qti_lqe_soft(env, i)    (qti_lqes(env)[i]->lqe_softlimit)
299 #define qti_lqe_granted(env, i) (qti_lqes(env)[i]->lqe_granted)
300 #define qti_lqe_qunit(env, i)   (qti_lqes(env)[i]->lqe_qunit)
301
302 /* helper routine to convert a lu_device into a qmt_device */
303 static inline struct qmt_device *lu2qmt_dev(struct lu_device *ld)
304 {
305         return container_of_safe(lu2dt_dev(ld), struct qmt_device, qmt_dt_dev);
306 }
307
308 /* helper routine to convert a qmt_device into lu_device */
309 static inline struct lu_device *qmt2lu_dev(struct qmt_device *qmt)
310 {
311         return &qmt->qmt_dt_dev.dd_lu_dev;
312 }
313
314 #define LQE_ROOT(lqe)    (lqe2qpi(lqe)->qpi_root)
315 #define LQE_GLB_OBJ(lqe) (lqe2qpi(lqe)->qpi_glb_obj[lqe_qtype(lqe)])
316
317 /* helper function returning grace time to use for a given lquota entry */
318 static inline __u64 qmt_lqe_grace(struct lquota_entry *lqe)
319 {
320         struct qmt_pool_info    *pool = lqe2qpi(lqe);
321         struct lquota_entry     *grace_lqe;
322
323         grace_lqe = pool->qpi_grace_lqe[lqe_qtype(lqe)];
324         LASSERT(grace_lqe != NULL);
325
326         return grace_lqe->lqe_gracetime;
327 }
328
329 static inline void qmt_restore(struct lquota_entry *lqe,
330                                struct qmt_lqe_restore *restore)
331 {
332         lqe->lqe_hardlimit = restore->qlr_hardlimit;
333         lqe->lqe_softlimit = restore->qlr_softlimit;
334         lqe->lqe_gracetime = restore->qlr_gracetime;
335         lqe->lqe_granted   = restore->qlr_granted;
336         lqe->lqe_qunit     = restore->qlr_qunit;
337 }
338
339 static inline void qmt_restore_lqes(const struct lu_env *env)
340 {
341         int i;
342
343         for (i = 0; i < qti_lqes_cnt(env); i++)
344                 qmt_restore(qti_lqes(env)[i], &qti_lqes_rstr(env)[i]);
345 }
346
347 #define QMT_GRANT(lqe, slv, cnt)             \
348         do {                                 \
349                 (lqe)->lqe_granted += (cnt); \
350                 (slv) += (cnt);              \
351         } while (0)
352 #define QMT_REL(lqe, slv, cnt)               \
353         do {                                 \
354                 (lqe)->lqe_granted -= (cnt); \
355                 (slv) -= (cnt);              \
356         } while (0)
357
358 /* helper routine returning true when reached hardlimit */
359 static inline bool qmt_hard_exhausted(struct lquota_entry *lqe)
360 {
361         if (lqe->lqe_hardlimit != 0 && lqe->lqe_granted >= lqe->lqe_hardlimit)
362                 return true;
363         return false;
364 }
365
366 /* helper routine returning true when reached softlimit */
367 static inline bool qmt_soft_exhausted(struct lquota_entry *lqe, __u64 now)
368 {
369         if (lqe->lqe_softlimit != 0 && lqe->lqe_granted > lqe->lqe_softlimit &&
370             lqe->lqe_gracetime != 0 && now >= lqe->lqe_gracetime)
371                 return true;
372         return false;
373 }
374
375 /* helper routine returning true when the id has run out of quota space:
376  * - reached hardlimit
377  * OR
378  * - reached softlimit and grace time expired already */
379 static inline bool qmt_space_exhausted(struct lquota_entry *lqe, __u64 now)
380 {
381         return (qmt_hard_exhausted(lqe) || qmt_soft_exhausted(lqe, now));
382 }
383
384 static inline bool qmt_space_exhausted_lqes(const struct lu_env *env, __u64 now)
385 {
386         bool exhausted = false;
387         int i;
388
389         for (i = 0; i < qti_lqes_cnt(env) && !exhausted; i++)
390                 exhausted |= qmt_space_exhausted(qti_lqes(env)[i], now);
391
392         return exhausted;
393 }
394
395 /* helper routine clearing the default quota setting  */
396 static inline void qmt_lqe_clear_default(struct lquota_entry *lqe)
397 {
398         lqe->lqe_is_default = false;
399         lqe->lqe_gracetime &= ~((__u64)LQUOTA_FLAG_DEFAULT <<
400                                                         LQUOTA_GRACE_BITS);
401 }
402
403 /* number of seconds to wait for slaves to release quota space after
404  * rebalancing */
405 #define QMT_REBA_TIMEOUT 2
406
407 /* qmt_pool.c */
408
409 void qmt_pool_free(const struct lu_env *, struct qmt_pool_info *);
410 /*
411  * Reference counter management for qmt_pool_info structures
412  */
413 static inline void qpi_getref(struct qmt_pool_info *pool)
414 {
415         atomic_inc(&pool->qpi_ref);
416 }
417
418 static inline void qpi_putref(const struct lu_env *env,
419                               struct qmt_pool_info *pool)
420 {
421         LASSERT(atomic_read(&pool->qpi_ref) > 0);
422         if (atomic_dec_and_test(&pool->qpi_ref))
423                 qmt_pool_free(env, pool);
424 }
425
426
427 void qmt_pool_fini(const struct lu_env *, struct qmt_device *);
428 int qmt_pool_init(const struct lu_env *, struct qmt_device *);
429 int qmt_pool_prepare(const struct lu_env *, struct qmt_device *,
430                    struct dt_object *, char *);
431 int qmt_pool_new_conn(const struct lu_env *, struct qmt_device *,
432                       struct lu_fid *, struct lu_fid *, __u64 *,
433                       struct obd_uuid *);
434
435 #define GLB_POOL_NAME   "0x0"
436 #define qmt_pool_lookup_glb(env, qmt, type) \
437                 qmt_pool_lookup(env, qmt, type, NULL, -1, false)
438 #define qmt_pool_lookup_name(env, qmt, type, name) \
439                 qmt_pool_lookup(env, qmt, type, name, -1, false)
440 #define qmt_pool_lookup_arr(env, qmt, type, idx) \
441                 qmt_pool_lookup(env, qmt, type, NULL, idx, true)
442 struct qmt_pool_info *qmt_pool_lookup(const struct lu_env *env,
443                                              struct qmt_device *qmt,
444                                              int rtype,
445                                              char *pool_name,
446                                              int idx,
447                                              bool add);
448 struct lquota_entry *qmt_pool_lqe_lookup(const struct lu_env *,
449                                          struct qmt_device *, int, int,
450                                          union lquota_id *, char *);
451 int qmt_pool_lqes_lookup(const struct lu_env *, struct qmt_device *, int,
452                          int, int, union lquota_id *, char *, int);
453 int qmt_pool_lqes_lookup_spec(const struct lu_env *env, struct qmt_device *qmt,
454                               int rtype, int qtype, union lquota_id *qid);
455 void qmt_lqes_sort(const struct lu_env *env);
456 int qmt_pool_new(struct obd_device *obd, char *poolname);
457 int qmt_pool_add(struct obd_device *obd, char *poolname, char *ostname);
458 int qmt_pool_rem(struct obd_device *obd, char *poolname, char *ostname);
459 int qmt_pool_del(struct obd_device *obd, char *poolname);
460
461 struct rw_semaphore *qmt_sarr_rwsem(struct qmt_pool_info *qpi);
462 int qmt_sarr_get_idx(struct qmt_pool_info *qpi, int arr_idx);
463 unsigned int qmt_sarr_count(struct qmt_pool_info *qpi);
464
465 /* qmt_entry.c */
466 extern const struct lquota_entry_operations qmt_lqe_ops;
467 int qmt_lqe_set_default(const struct lu_env *env, struct qmt_pool_info *pool,
468                         struct lquota_entry *lqe, bool create_record);
469 struct thandle *qmt_trans_start_with_slv(const struct lu_env *,
470                                          struct lquota_entry *,
471                                          struct dt_object *,
472                                          bool);
473 struct thandle *qmt_trans_start(const struct lu_env *, struct lquota_entry *);
474 int qmt_glb_write_lqes(const struct lu_env *, struct thandle *, __u32, __u64 *);
475 int qmt_glb_write(const struct lu_env *, struct thandle *,
476                   struct lquota_entry *, __u32, __u64 *);
477 int qmt_slv_write(const struct lu_env *, struct thandle *,
478                   struct lquota_entry *, struct dt_object *, __u32, __u64 *,
479                   __u64);
480 int qmt_slv_read(const struct lu_env *,  union lquota_id *,
481                  struct dt_object *, __u64 *);
482 int qmt_validate_limits(struct lquota_entry *, __u64, __u64);
483 bool qmt_adjust_qunit(const struct lu_env *, struct lquota_entry *);
484 bool qmt_adjust_edquot(struct lquota_entry *, __u64);
485
486 #define qmt_adjust_edquot_notify(env, qmt, now, qb_flags) \
487           qmt_adjust_edquot_qunit_notify(env, qmt, now, true, false, qb_flags)
488 #define qmt_adjust_qunit_notify(env, qmt, qb_flags) \
489           qmt_adjust_edquot_qunit_notify(env, qmt, 0, false, true, qb_flags)
490 #define qmt_adjust_and_notify(env, qmt, now, qb_flags) \
491           qmt_adjust_edquot_qunit_notify(env, qmt, now, true, true, qb_flags)
492 bool qmt_adjust_edquot_qunit_notify(const struct lu_env *, struct qmt_device *,
493                                     __u64, bool, bool, __u32);
494 bool qmt_revalidate(const struct lu_env *, struct lquota_entry *);
495 void qmt_revalidate_lqes(const struct lu_env *, struct qmt_device *, __u32);
496 __u64 qmt_alloc_expand(struct lquota_entry *, __u64, __u64);
497
498 void qti_lqes_init(const struct lu_env *env);
499 int qti_lqes_add(const struct lu_env *env, struct lquota_entry *lqe);
500 void qti_lqes_del(const struct lu_env *env, int index);
501 void qti_lqes_fini(const struct lu_env *env);
502 int qti_lqes_min_qunit(const struct lu_env *env);
503 int qti_lqes_edquot(const struct lu_env *env);
504 int qti_lqes_restore_init(const struct lu_env *env);
505 void qti_lqes_restore_fini(const struct lu_env *env);
506 void qti_lqes_write_lock(const struct lu_env *env);
507 void qti_lqes_write_unlock(const struct lu_env *env);
508
509 struct lqe_glbl_data *qmt_alloc_lqe_gd(struct qmt_pool_info *, int);
510 void qmt_free_lqe_gd(struct lqe_glbl_data *);
511 void qmt_setup_lqe_gd(const struct lu_env *,  struct qmt_device *,
512                     struct lquota_entry *, struct lqe_glbl_data *, int);
513 #define qmt_seed_glbe_edquot(env, lqeg) \
514                 qmt_seed_glbe_all(env, lqeg, false, true)
515 #define qmt_seed_glbe_qunit(env, lqeg) \
516                 qmt_seed_glbe_all(env, lqeg, true, false)
517 #define qmt_seed_glbe(env, lqeg) \
518                 qmt_seed_glbe_all(env, lqeg, true, true)
519 void qmt_seed_glbe_all(const struct lu_env *, struct lqe_glbl_data *,
520                        bool , bool);
521
522 /* qmt_handler.c */
523 int qmt_set_with_lqe(const struct lu_env *env, struct qmt_device *qmt,
524                      struct lquota_entry *lqe, __u64 hard, __u64 soft,
525                      __u64 time, __u32 valid, bool is_default, bool is_updated);
526 int qmt_dqacq0(const struct lu_env *, struct qmt_device *, struct obd_uuid *,
527                __u32, __u64, __u64, struct quota_body *);
528 int qmt_uuid2idx(struct obd_uuid *, int *);
529
530 /* qmt_lock.c */
531 int qmt_intent_policy(const struct lu_env *, struct lu_device *,
532                       struct ptlrpc_request *, struct ldlm_lock **, int);
533 int qmt_lvbo_init(struct lu_device *, struct ldlm_resource *);
534 int qmt_lvbo_update(struct lu_device *, struct ldlm_resource *,
535                     struct ptlrpc_request *, int);
536 int qmt_lvbo_size(struct lu_device *, struct ldlm_lock *);
537 int qmt_lvbo_fill(struct lu_device *, struct ldlm_lock *, void *, int);
538 int qmt_lvbo_free(struct lu_device *, struct ldlm_resource *);
539 int qmt_start_reba_thread(struct qmt_device *);
540 void qmt_stop_reba_thread(struct qmt_device *);
541 void qmt_glb_lock_notify(const struct lu_env *, struct lquota_entry *, __u64);
542 void qmt_id_lock_notify(struct qmt_device *, struct lquota_entry *);
543 #endif /* _QMT_INTERNAL_H */