]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - fs/btrfs/volumes.h
Merge tag 'asoc-fix-v4.12-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broon...
[mirror_ubuntu-artful-kernel.git] / fs / btrfs / volumes.h
CommitLineData
0b86a832
CM
1/*
2 * Copyright (C) 2007 Oracle. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License v2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public
14 * License along with this program; if not, write to the
15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 * Boston, MA 021110-1307, USA.
17 */
18
19#ifndef __BTRFS_VOLUMES_
20#define __BTRFS_VOLUMES_
8790d502 21
cea9e445 22#include <linux/bio.h>
b2117a39 23#include <linux/sort.h>
55e301fd 24#include <linux/btrfs.h>
8b712842 25#include "async-thread.h"
cea9e445 26
67a2c45e
MX
27extern struct mutex uuid_mutex;
28
ee22184b 29#define BTRFS_STRIPE_LEN SZ_64K
b2117a39 30
f2984462 31struct buffer_head;
ffbd517d
CM
32struct btrfs_pending_bios {
33 struct bio *head;
34 struct bio *tail;
35};
36
7cc8e58d
MX
37/*
38 * Use sequence counter to get consistent device stat data on
39 * 32-bit processors.
40 */
41#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
42#include <linux/seqlock.h>
43#define __BTRFS_NEED_DEVICE_DATA_ORDERED
44#define btrfs_device_data_ordered_init(device) \
45 seqcount_init(&device->data_seqcount)
46#else
47#define btrfs_device_data_ordered_init(device) do { } while (0)
48#endif
49
0b86a832
CM
50struct btrfs_device {
51 struct list_head dev_list;
b3075717 52 struct list_head dev_alloc_list;
2b82032c 53 struct btrfs_fs_devices *fs_devices;
fb456252 54 struct btrfs_fs_info *fs_info;
ffbd517d 55
d5ee37bc
MX
56 struct rcu_string *name;
57
58 u64 generation;
59
60 spinlock_t io_lock ____cacheline_aligned;
61 int running_pending;
ffbd517d
CM
62 /* regular prio bios */
63 struct btrfs_pending_bios pending_bios;
70fd7614 64 /* sync bios */
ffbd517d
CM
65 struct btrfs_pending_bios pending_sync_bios;
66
d5ee37bc
MX
67 struct block_device *bdev;
68
69 /* the mode sent to blkdev_get */
70 fmode_t mode;
71
2b82032c 72 int writeable;
dfe25020 73 int in_fs_metadata;
cd02dca5 74 int missing;
d5e2003c 75 int can_discard;
63a212ab 76 int is_tgtdev_for_dev_replace;
b3075717 77
7cc8e58d
MX
78#ifdef __BTRFS_NEED_DEVICE_DATA_ORDERED
79 seqcount_t data_seqcount;
80#endif
81
0b86a832
CM
82 /* the internal btrfs device id */
83 u64 devid;
84
6ba40b61 85 /* size of the device in memory */
0b86a832
CM
86 u64 total_bytes;
87
6ba40b61 88 /* size of the device on disk */
d6397bae
CB
89 u64 disk_total_bytes;
90
0b86a832
CM
91 /* bytes used */
92 u64 bytes_used;
93
94 /* optimal io alignment for this device */
95 u32 io_align;
96
97 /* optimal io width for this device */
98 u32 io_width;
3c45bfc1
DG
99 /* type and info about this device */
100 u64 type;
0b86a832
CM
101
102 /* minimal io size for this device */
103 u32 sector_size;
104
0b86a832 105 /* physical drive uuid (or lvm uuid) */
e17cade2 106 u8 uuid[BTRFS_UUID_SIZE];
8b712842 107
935e5cc9
MX
108 /*
109 * size of the device on the current transaction
110 *
111 * This variant is update when committing the transaction,
112 * and protected by device_list_mutex
113 */
114 u64 commit_total_bytes;
115
ce7213c7
MX
116 /* bytes used on the current transaction */
117 u64 commit_bytes_used;
935e5cc9
MX
118 /*
119 * used to manage the device which is resized
120 *
121 * It is protected by chunk_lock.
122 */
123 struct list_head resized_list;
124
3c45bfc1 125 /* for sending down flush barriers */
3c45bfc1
DG
126 struct bio *flush_bio;
127 struct completion flush_wait;
128
a2de733c 129 /* per-device scrub information */
d9d181c1 130 struct scrub_ctx *scrub_device;
a2de733c 131
d458b054 132 struct btrfs_work work;
1f78160c
XG
133 struct rcu_head rcu;
134 struct work_struct rcu_work;
90519d66
AJ
135
136 /* readahead state */
137 spinlock_t reada_lock;
138 atomic_t reada_in_flight;
139 u64 reada_next;
140 struct reada_zone *reada_curr_zone;
141 struct radix_tree_root reada_zones;
142 struct radix_tree_root reada_extents;
387125fc 143
442a4f63
SB
144 /* disk I/O failure stats. For detailed description refer to
145 * enum btrfs_dev_stat_values in ioctl.h */
733f4fbb 146 int dev_stats_valid;
addc3fa7
MX
147
148 /* Counter to record the change of device stats */
149 atomic_t dev_stats_ccnt;
442a4f63 150 atomic_t dev_stat_values[BTRFS_DEV_STAT_VALUES_MAX];
0b86a832
CM
151};
152
7cc8e58d
MX
153/*
154 * If we read those variants at the context of their own lock, we needn't
155 * use the following helpers, reading them directly is safe.
156 */
157#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
158#define BTRFS_DEVICE_GETSET_FUNCS(name) \
159static inline u64 \
160btrfs_device_get_##name(const struct btrfs_device *dev) \
161{ \
162 u64 size; \
163 unsigned int seq; \
164 \
165 do { \
166 seq = read_seqcount_begin(&dev->data_seqcount); \
167 size = dev->name; \
168 } while (read_seqcount_retry(&dev->data_seqcount, seq)); \
169 return size; \
170} \
171 \
172static inline void \
173btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \
174{ \
175 preempt_disable(); \
176 write_seqcount_begin(&dev->data_seqcount); \
177 dev->name = size; \
178 write_seqcount_end(&dev->data_seqcount); \
179 preempt_enable(); \
180}
181#elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPT)
182#define BTRFS_DEVICE_GETSET_FUNCS(name) \
183static inline u64 \
184btrfs_device_get_##name(const struct btrfs_device *dev) \
185{ \
186 u64 size; \
187 \
188 preempt_disable(); \
189 size = dev->name; \
190 preempt_enable(); \
191 return size; \
192} \
193 \
194static inline void \
195btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \
196{ \
197 preempt_disable(); \
198 dev->name = size; \
199 preempt_enable(); \
200}
201#else
202#define BTRFS_DEVICE_GETSET_FUNCS(name) \
203static inline u64 \
204btrfs_device_get_##name(const struct btrfs_device *dev) \
205{ \
206 return dev->name; \
207} \
208 \
209static inline void \
210btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \
211{ \
212 dev->name = size; \
213}
214#endif
215
216BTRFS_DEVICE_GETSET_FUNCS(total_bytes);
217BTRFS_DEVICE_GETSET_FUNCS(disk_total_bytes);
218BTRFS_DEVICE_GETSET_FUNCS(bytes_used);
219
8a4b83cc
CM
220struct btrfs_fs_devices {
221 u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
222
8a4b83cc 223 u64 num_devices;
a0af469b 224 u64 open_devices;
2b82032c 225 u64 rw_devices;
cd02dca5 226 u64 missing_devices;
2b82032c 227 u64 total_rw_bytes;
02db0844 228 u64 total_devices;
8a4b83cc 229 struct block_device *latest_bdev;
e5e9a520
CM
230
231 /* all of the devices in the FS, protected by a mutex
232 * so we can safely walk it to write out the supers without
9b011adf
WS
233 * worrying about add/remove by the multi-device code.
234 * Scrubbing super can kick off supers writing by holding
235 * this mutex lock.
e5e9a520
CM
236 */
237 struct mutex device_list_mutex;
8a4b83cc 238 struct list_head devices;
b3075717 239
935e5cc9 240 struct list_head resized_devices;
b3075717
CM
241 /* devices not currently being allocated */
242 struct list_head alloc_list;
8a4b83cc 243 struct list_head list;
2b82032c
YZ
244
245 struct btrfs_fs_devices *seed;
246 int seeding;
2b82032c
YZ
247
248 int opened;
c289811c
CM
249
250 /* set when we find or add a device that doesn't have the
251 * nonrot flag set
252 */
253 int rotating;
2e7910d6 254
5a13f430 255 struct btrfs_fs_info *fs_info;
2e7910d6 256 /* sysfs kobjects */
c1b7e474 257 struct kobject fsid_kobj;
2e7910d6
AJ
258 struct kobject *device_dir_kobj;
259 struct completion kobj_unregister;
8a4b83cc
CM
260};
261
facc8a22
MX
262#define BTRFS_BIO_INLINE_CSUM_SIZE 64
263
9be3395b
CM
264/*
265 * we need the mirror number and stripe index to be passed around
266 * the call chain while we are processing end_io (especially errors).
267 * Really, what we need is a btrfs_bio structure that has this info
268 * and is properly sized with its stripe array, but we're not there
269 * quite yet. We have our own btrfs bioset, and all of the bios
270 * we allocate are actually btrfs_io_bios. We'll cram as much of
271 * struct btrfs_bio as we can into this over time.
272 */
facc8a22 273typedef void (btrfs_io_bio_end_io_t) (struct btrfs_io_bio *bio, int err);
9be3395b 274struct btrfs_io_bio {
c1dc0896
MX
275 unsigned int mirror_num;
276 unsigned int stripe_index;
277 u64 logical;
facc8a22
MX
278 u8 *csum;
279 u8 csum_inline[BTRFS_BIO_INLINE_CSUM_SIZE];
280 u8 *csum_allocated;
281 btrfs_io_bio_end_io_t *end_io;
9be3395b
CM
282 struct bio bio;
283};
284
285static inline struct btrfs_io_bio *btrfs_io_bio(struct bio *bio)
286{
287 return container_of(bio, struct btrfs_io_bio, bio);
288}
289
cea9e445
CM
290struct btrfs_bio_stripe {
291 struct btrfs_device *dev;
292 u64 physical;
fce3bb9a 293 u64 length; /* only used for discard mappings */
cea9e445
CM
294};
295
a1d3c478
JS
296struct btrfs_bio;
297typedef void (btrfs_bio_end_io_t) (struct btrfs_bio *bio, int err);
298
299struct btrfs_bio {
140475ae 300 refcount_t refs;
cea9e445 301 atomic_t stripes_pending;
c404e0dc 302 struct btrfs_fs_info *fs_info;
10f11900 303 u64 map_type; /* get from map_lookup->type */
cea9e445 304 bio_end_io_t *end_io;
7d2b4daa 305 struct bio *orig_bio;
c55f1396 306 unsigned long flags;
cea9e445 307 void *private;
a236aed1
CM
308 atomic_t error;
309 int max_errors;
cea9e445 310 int num_stripes;
a1d3c478 311 int mirror_num;
2c8cdd6e
MX
312 int num_tgtdevs;
313 int *tgtdev_map;
8e5cfb55
ZL
314 /*
315 * logical block numbers for the start of each stripe
316 * The last one or two are p/q. These are sorted,
317 * so raid_map[0] is the start of our full stripe
318 */
319 u64 *raid_map;
cea9e445
CM
320 struct btrfs_bio_stripe stripes[];
321};
322
b2117a39
MX
323struct btrfs_device_info {
324 struct btrfs_device *dev;
325 u64 dev_offset;
326 u64 max_avail;
73c5de00 327 u64 total_avail;
b2117a39
MX
328};
329
31e50229
LB
330struct btrfs_raid_attr {
331 int sub_stripes; /* sub_stripes info for map */
332 int dev_stripes; /* stripes per dev */
333 int devs_max; /* max devs to use */
334 int devs_min; /* min devs needed */
8789f4fe 335 int tolerated_failures; /* max tolerated fail devs */
31e50229
LB
336 int devs_increment; /* ndevs has to be a multiple of this */
337 int ncopies; /* how many copies to data has */
338};
339
af902047 340extern const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES];
621292ba 341extern const int btrfs_raid_mindev_error[BTRFS_NR_RAID_TYPES];
af902047
ZL
342extern const u64 btrfs_raid_group[BTRFS_NR_RAID_TYPES];
343
1abe9b8a 344struct map_lookup {
345 u64 type;
346 int io_align;
347 int io_width;
3d8da678 348 u64 stripe_len;
1abe9b8a 349 int sector_size;
350 int num_stripes;
351 int sub_stripes;
352 struct btrfs_bio_stripe stripes[];
353};
354
a2de733c
AJ
355#define map_lookup_size(n) (sizeof(struct map_lookup) + \
356 (sizeof(struct btrfs_bio_stripe) * (n)))
357
c9e9f97b 358struct btrfs_balance_args;
19a39dce 359struct btrfs_balance_progress;
c9e9f97b
ID
360struct btrfs_balance_control {
361 struct btrfs_fs_info *fs_info;
362
363 struct btrfs_balance_args data;
364 struct btrfs_balance_args meta;
365 struct btrfs_balance_args sys;
366
367 u64 flags;
19a39dce
ID
368
369 struct btrfs_balance_progress stat;
c9e9f97b
ID
370};
371
cf8cddd3
CH
372enum btrfs_map_op {
373 BTRFS_MAP_READ,
374 BTRFS_MAP_WRITE,
375 BTRFS_MAP_DISCARD,
376 BTRFS_MAP_GET_READ_MIRRORS,
377};
378
379static inline enum btrfs_map_op btrfs_op(struct bio *bio)
380{
381 switch (bio_op(bio)) {
382 case REQ_OP_DISCARD:
383 return BTRFS_MAP_DISCARD;
384 case REQ_OP_WRITE:
385 return BTRFS_MAP_WRITE;
386 default:
387 WARN_ON_ONCE(1);
388 case REQ_OP_READ:
389 return BTRFS_MAP_READ;
390 }
391}
392
6d07bcec
MX
393int btrfs_account_dev_extents_size(struct btrfs_device *device, u64 start,
394 u64 end, u64 *length);
6e9606d2
ZL
395void btrfs_get_bbio(struct btrfs_bio *bbio);
396void btrfs_put_bbio(struct btrfs_bio *bbio);
cf8cddd3 397int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
cea9e445 398 u64 logical, u64 *length,
a1d3c478 399 struct btrfs_bio **bbio_ret, int mirror_num);
cf8cddd3 400int btrfs_map_sblock(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
af8e2d1d 401 u64 logical, u64 *length,
825ad4c9 402 struct btrfs_bio **bbio_ret);
ab8d0fc4 403int btrfs_rmap_block(struct btrfs_fs_info *fs_info,
a512bbf8
YZ
404 u64 chunk_start, u64 physical, u64 devid,
405 u64 **logical, int *naddrs, int *stripe_len);
6bccf3ab 406int btrfs_read_sys_array(struct btrfs_fs_info *fs_info);
5b4aacef 407int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info);
0b86a832 408int btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
2ff7e61e 409 struct btrfs_fs_info *fs_info, u64 type);
0b86a832
CM
410void btrfs_mapping_init(struct btrfs_mapping_tree *tree);
411void btrfs_mapping_tree_free(struct btrfs_mapping_tree *tree);
2ff7e61e 412int btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
8b712842 413 int mirror_num, int async_submit);
8a4b83cc 414int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
97288f2c
CH
415 fmode_t flags, void *holder);
416int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
8a4b83cc
CM
417 struct btrfs_fs_devices **fs_devices_ret);
418int btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
9eaed21e 419void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step);
88acff64
AJ
420void btrfs_assign_next_active_device(struct btrfs_fs_info *fs_info,
421 struct btrfs_device *device, struct btrfs_device *this_dev);
2ff7e61e 422int btrfs_find_device_missing_or_by_path(struct btrfs_fs_info *fs_info,
da353f6b 423 const char *device_path,
7ba15b7d 424 struct btrfs_device **device);
2ff7e61e 425int btrfs_find_device_by_devspec(struct btrfs_fs_info *fs_info, u64 devid,
da353f6b 426 const char *devpath,
24e0474b 427 struct btrfs_device **device);
12bd2fc0
ID
428struct btrfs_device *btrfs_alloc_device(struct btrfs_fs_info *fs_info,
429 const u64 *devid,
430 const u8 *uuid);
2ff7e61e 431int btrfs_rm_device(struct btrfs_fs_info *fs_info,
da353f6b 432 const char *device_path, u64 devid);
143bede5 433void btrfs_cleanup_fs_uuids(void);
5d964051 434int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len);
8f18cf13
CM
435int btrfs_grow_device(struct btrfs_trans_handle *trans,
436 struct btrfs_device *device, u64 new_size);
aa1b8cd4 437struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
2b82032c 438 u8 *uuid, u8 *fsid);
8f18cf13 439int btrfs_shrink_device(struct btrfs_device *device, u64 new_size);
da353f6b 440int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *path);
2ff7e61e 441int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
da353f6b 442 const char *device_path,
1c43366d 443 struct btrfs_device *srcdev,
e93c89c1 444 struct btrfs_device **device_out);
c9e9f97b
ID
445int btrfs_balance(struct btrfs_balance_control *bctl,
446 struct btrfs_ioctl_balance_args *bargs);
2b6ba629 447int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info);
68310a5e 448int btrfs_recover_balance(struct btrfs_fs_info *fs_info);
837d5b6e 449int btrfs_pause_balance(struct btrfs_fs_info *fs_info);
a7e99c69 450int btrfs_cancel_balance(struct btrfs_fs_info *fs_info);
f7a81ea4 451int btrfs_create_uuid_tree(struct btrfs_fs_info *fs_info);
70f80175 452int btrfs_check_uuid_tree(struct btrfs_fs_info *fs_info);
2ff7e61e 453int btrfs_chunk_readonly(struct btrfs_fs_info *fs_info, u64 chunk_offset);
499f377f
JM
454int find_free_dev_extent_start(struct btrfs_transaction *transaction,
455 struct btrfs_device *device, u64 num_bytes,
456 u64 search_start, u64 *start, u64 *max_avail);
6df9a95e
JB
457int find_free_dev_extent(struct btrfs_trans_handle *trans,
458 struct btrfs_device *device, u64 num_bytes,
ba1bf481 459 u64 *start, u64 *max_avail);
442a4f63 460void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index);
2ff7e61e 461int btrfs_get_dev_stats(struct btrfs_fs_info *fs_info,
b27f7c0c 462 struct btrfs_ioctl_get_dev_stats *stats);
cb517eab 463void btrfs_init_devices_late(struct btrfs_fs_info *fs_info);
733f4fbb
SB
464int btrfs_init_dev_stats(struct btrfs_fs_info *fs_info);
465int btrfs_run_dev_stats(struct btrfs_trans_handle *trans,
466 struct btrfs_fs_info *fs_info);
084b6e7c
QW
467void btrfs_rm_dev_replace_remove_srcdev(struct btrfs_fs_info *fs_info,
468 struct btrfs_device *srcdev);
469void btrfs_rm_dev_replace_free_srcdev(struct btrfs_fs_info *fs_info,
470 struct btrfs_device *srcdev);
e93c89c1
SB
471void btrfs_destroy_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
472 struct btrfs_device *tgtdev);
473void btrfs_init_dev_replace_tgtdev_for_resume(struct btrfs_fs_info *fs_info,
474 struct btrfs_device *tgtdev);
da353f6b 475void btrfs_scratch_superblocks(struct block_device *bdev, const char *device_path);
592d92ee 476int btrfs_is_parity_mirror(struct btrfs_fs_info *fs_info,
53b381b3 477 u64 logical, u64 len, int mirror_num);
2ff7e61e 478unsigned long btrfs_full_stripe_len(struct btrfs_fs_info *fs_info,
53b381b3
DW
479 struct btrfs_mapping_tree *map_tree,
480 u64 logical);
6df9a95e 481int btrfs_finish_chunk_alloc(struct btrfs_trans_handle *trans,
6bccf3ab 482 struct btrfs_fs_info *fs_info,
6df9a95e 483 u64 chunk_offset, u64 chunk_size);
47ab2a6c 484int btrfs_remove_chunk(struct btrfs_trans_handle *trans,
5b4aacef 485 struct btrfs_fs_info *fs_info, u64 chunk_offset);
addc3fa7
MX
486
487static inline int btrfs_dev_stats_dirty(struct btrfs_device *dev)
488{
489 return atomic_read(&dev->dev_stats_ccnt);
490}
491
442a4f63
SB
492static inline void btrfs_dev_stat_inc(struct btrfs_device *dev,
493 int index)
494{
495 atomic_inc(dev->dev_stat_values + index);
addc3fa7
MX
496 smp_mb__before_atomic();
497 atomic_inc(&dev->dev_stats_ccnt);
442a4f63
SB
498}
499
500static inline int btrfs_dev_stat_read(struct btrfs_device *dev,
501 int index)
502{
503 return atomic_read(dev->dev_stat_values + index);
504}
505
506static inline int btrfs_dev_stat_read_and_reset(struct btrfs_device *dev,
507 int index)
508{
509 int ret;
510
511 ret = atomic_xchg(dev->dev_stat_values + index, 0);
addc3fa7
MX
512 smp_mb__before_atomic();
513 atomic_inc(&dev->dev_stats_ccnt);
442a4f63
SB
514 return ret;
515}
516
517static inline void btrfs_dev_stat_set(struct btrfs_device *dev,
518 int index, unsigned long val)
519{
520 atomic_set(dev->dev_stat_values + index, val);
addc3fa7
MX
521 smp_mb__before_atomic();
522 atomic_inc(&dev->dev_stats_ccnt);
442a4f63
SB
523}
524
525static inline void btrfs_dev_stat_reset(struct btrfs_device *dev,
526 int index)
527{
528 btrfs_dev_stat_set(dev, index, 0);
529}
935e5cc9
MX
530
531void btrfs_update_commit_device_size(struct btrfs_fs_info *fs_info);
2ff7e61e 532void btrfs_update_commit_device_bytes_used(struct btrfs_fs_info *fs_info,
ce7213c7 533 struct btrfs_transaction *transaction);
04216820 534
c73eccf7 535struct list_head *btrfs_get_fs_uuids(void);
5a13f430
AJ
536void btrfs_set_fs_info_ptr(struct btrfs_fs_info *fs_info);
537void btrfs_reset_fs_info_ptr(struct btrfs_fs_info *fs_info);
04216820 538
0b86a832 539#endif