aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2007-08-28 21:44:37 -0400
committerTim Shimmin <tes@chook.melbourne.sgi.com>2007-10-15 21:37:29 -0400
commitb3aea4edc2903fdee34920630b8b2433f6452f02 (patch)
tree9d9e93c4dac6dc5a30522e0c2ae051e3aad46b1b /fs
parent2f6f7b3d9b5600e1f6e7622c62ab30f36bd0f57f (diff)
[XFS] kill the v_flag member in struct bhv_vnode
All flags previously handled at the vnode level are not in the xfs_inode where we already have a flags mechanisms and free bits for flags previously in the vnode. SGI-PV: 969608 SGI-Modid: xfs-linux-melb:xfs-kern:29495a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Tim Shimmin <tes@sgi.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/linux-2.6/xfs_aops.c11
-rw-r--r--fs/xfs/linux-2.6/xfs_file.c10
-rw-r--r--fs/xfs/linux-2.6/xfs_fs_subr.c6
-rw-r--r--fs/xfs/linux-2.6/xfs_ioctl32.c3
-rw-r--r--fs/xfs/linux-2.6/xfs_iops.c6
-rw-r--r--fs/xfs/linux-2.6/xfs_super.c9
-rw-r--r--fs/xfs/linux-2.6/xfs_vnode.c9
-rw-r--r--fs/xfs/linux-2.6/xfs_vnode.h42
-rw-r--r--fs/xfs/xfs_iget.c1
-rw-r--r--fs/xfs/xfs_inode.h3
-rw-r--r--fs/xfs/xfs_vnodeops.c12
11 files changed, 33 insertions, 79 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c
index 28ccca98839b..22a40bd0cce2 100644
--- a/fs/xfs/linux-2.6/xfs_aops.c
+++ b/fs/xfs/linux-2.6/xfs_aops.c
@@ -304,13 +304,13 @@ xfs_map_blocks(
304 xfs_iomap_t *mapp, 304 xfs_iomap_t *mapp,
305 int flags) 305 int flags)
306{ 306{
307 bhv_vnode_t *vp = vn_from_inode(inode); 307 xfs_inode_t *ip = XFS_I(inode);
308 int error, nmaps = 1; 308 int error, nmaps = 1;
309 309
310 error = xfs_bmap(xfs_vtoi(vp), offset, count, 310 error = xfs_bmap(ip, offset, count,
311 flags, mapp, &nmaps); 311 flags, mapp, &nmaps);
312 if (!error && (flags & (BMAPI_WRITE|BMAPI_ALLOCATE))) 312 if (!error && (flags & (BMAPI_WRITE|BMAPI_ALLOCATE)))
313 VMODIFY(vp); 313 xfs_iflags_set(ip, XFS_IMODIFIED);
314 return -error; 314 return -error;
315} 315}
316 316
@@ -1246,10 +1246,7 @@ xfs_vm_writepages(
1246 struct address_space *mapping, 1246 struct address_space *mapping,
1247 struct writeback_control *wbc) 1247 struct writeback_control *wbc)
1248{ 1248{
1249 struct bhv_vnode *vp = vn_from_inode(mapping->host); 1249 xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED);
1250
1251 if (VN_TRUNC(vp))
1252 VUNTRUNCATE(vp);
1253 return generic_writepages(mapping, wbc); 1250 return generic_writepages(mapping, wbc);
1254} 1251}
1255 1252
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c
index 1d72dbb1a73d..123659e74b53 100644
--- a/fs/xfs/linux-2.6/xfs_file.c
+++ b/fs/xfs/linux-2.6/xfs_file.c
@@ -193,13 +193,11 @@ xfs_file_fsync(
193 struct dentry *dentry, 193 struct dentry *dentry,
194 int datasync) 194 int datasync)
195{ 195{
196 bhv_vnode_t *vp = vn_from_inode(dentry->d_inode);
197 int flags = FSYNC_WAIT; 196 int flags = FSYNC_WAIT;
198 197
199 if (datasync) 198 if (datasync)
200 flags |= FSYNC_DATA; 199 flags |= FSYNC_DATA;
201 if (VN_TRUNC(vp)) 200 xfs_iflags_clear(XFS_I(dentry->d_inode), XFS_ITRUNCATED);
202 VUNTRUNCATE(vp);
203 return -xfs_fsync(XFS_I(dentry->d_inode), flags, 201 return -xfs_fsync(XFS_I(dentry->d_inode), flags,
204 (xfs_off_t)0, (xfs_off_t)-1); 202 (xfs_off_t)0, (xfs_off_t)-1);
205} 203}
@@ -277,10 +275,9 @@ xfs_file_ioctl(
277{ 275{
278 int error; 276 int error;
279 struct inode *inode = filp->f_path.dentry->d_inode; 277 struct inode *inode = filp->f_path.dentry->d_inode;
280 bhv_vnode_t *vp = vn_from_inode(inode);
281 278
282 error = xfs_ioctl(XFS_I(inode), filp, 0, cmd, (void __user *)p); 279 error = xfs_ioctl(XFS_I(inode), filp, 0, cmd, (void __user *)p);
283 VMODIFY(vp); 280 xfs_iflags_set(XFS_I(inode), XFS_IMODIFIED);
284 281
285 /* NOTE: some of the ioctl's return positive #'s as a 282 /* NOTE: some of the ioctl's return positive #'s as a
286 * byte count indicating success, such as 283 * byte count indicating success, such as
@@ -299,10 +296,9 @@ xfs_file_ioctl_invis(
299{ 296{
300 int error; 297 int error;
301 struct inode *inode = filp->f_path.dentry->d_inode; 298 struct inode *inode = filp->f_path.dentry->d_inode;
302 bhv_vnode_t *vp = vn_from_inode(inode);
303 299
304 error = xfs_ioctl(XFS_I(inode), filp, IO_INVIS, cmd, (void __user *)p); 300 error = xfs_ioctl(XFS_I(inode), filp, IO_INVIS, cmd, (void __user *)p);
305 VMODIFY(vp); 301 xfs_iflags_set(XFS_I(inode), XFS_IMODIFIED);
306 302
307 /* NOTE: some of the ioctl's return positive #'s as a 303 /* NOTE: some of the ioctl's return positive #'s as a
308 * byte count indicating success, such as 304 * byte count indicating success, such as
diff --git a/fs/xfs/linux-2.6/xfs_fs_subr.c b/fs/xfs/linux-2.6/xfs_fs_subr.c
index e2897912fec7..ac6d34cc355d 100644
--- a/fs/xfs/linux-2.6/xfs_fs_subr.c
+++ b/fs/xfs/linux-2.6/xfs_fs_subr.c
@@ -61,8 +61,7 @@ xfs_flushinval_pages(
61 int ret = 0; 61 int ret = 0;
62 62
63 if (VN_CACHED(vp)) { 63 if (VN_CACHED(vp)) {
64 if (VN_TRUNC(vp)) 64 xfs_iflags_clear(ip, XFS_ITRUNCATED);
65 VUNTRUNCATE(vp);
66 ret = filemap_write_and_wait(inode->i_mapping); 65 ret = filemap_write_and_wait(inode->i_mapping);
67 if (!ret) 66 if (!ret)
68 truncate_inode_pages(inode->i_mapping, first); 67 truncate_inode_pages(inode->i_mapping, first);
@@ -84,8 +83,7 @@ xfs_flush_pages(
84 int ret2; 83 int ret2;
85 84
86 if (VN_DIRTY(vp)) { 85 if (VN_DIRTY(vp)) {
87 if (VN_TRUNC(vp)) 86 xfs_iflags_clear(ip, XFS_ITRUNCATED);
88 VUNTRUNCATE(vp);
89 ret = filemap_fdatawrite(inode->i_mapping); 87 ret = filemap_fdatawrite(inode->i_mapping);
90 if (flags & XFS_B_ASYNC) 88 if (flags & XFS_B_ASYNC)
91 return ret; 89 return ret;
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c
index 83f509960305..0046bdd5b7f1 100644
--- a/fs/xfs/linux-2.6/xfs_ioctl32.c
+++ b/fs/xfs/linux-2.6/xfs_ioctl32.c
@@ -371,7 +371,6 @@ xfs_compat_ioctl(
371 unsigned long arg) 371 unsigned long arg)
372{ 372{
373 struct inode *inode = file->f_path.dentry->d_inode; 373 struct inode *inode = file->f_path.dentry->d_inode;
374 bhv_vnode_t *vp = vn_from_inode(inode);
375 int error; 374 int error;
376 375
377 switch (cmd) { 376 switch (cmd) {
@@ -459,7 +458,7 @@ xfs_compat_ioctl(
459 } 458 }
460 459
461 error = xfs_ioctl(XFS_I(inode), file, mode, cmd, (void __user *)arg); 460 error = xfs_ioctl(XFS_I(inode), file, mode, cmd, (void __user *)arg);
462 VMODIFY(vp); 461 xfs_iflags_set(XFS_I(inode), XFS_IMODIFIED);
463 462
464 return error; 463 return error;
465} 464}
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
index 4da034f4ae14..98d5a7e13bd5 100644
--- a/fs/xfs/linux-2.6/xfs_iops.c
+++ b/fs/xfs/linux-2.6/xfs_iops.c
@@ -221,7 +221,7 @@ xfs_init_security(
221 error = xfs_attr_set(XFS_I(ip), name, value, 221 error = xfs_attr_set(XFS_I(ip), name, value,
222 length, ATTR_SECURE); 222 length, ATTR_SECURE);
223 if (!error) 223 if (!error)
224 VMODIFY(vp); 224 xfs_iflags_set(XFS_I(ip), XFS_IMODIFIED);
225 225
226 kfree(name); 226 kfree(name);
227 kfree(value); 227 kfree(value);
@@ -327,7 +327,7 @@ xfs_vn_mknod(
327 if (!error) { 327 if (!error) {
328 error = _ACL_INHERIT(vp, &vattr, default_acl); 328 error = _ACL_INHERIT(vp, &vattr, default_acl);
329 if (!error) 329 if (!error)
330 VMODIFY(vp); 330 xfs_iflags_set(XFS_I(&vp->v_inode), XFS_IMODIFIED);
331 else 331 else
332 xfs_cleanup_inode(dir, vp, dentry, mode); 332 xfs_cleanup_inode(dir, vp, dentry, mode);
333 } 333 }
@@ -409,7 +409,7 @@ xfs_vn_link(
409 if (unlikely(error)) { 409 if (unlikely(error)) {
410 VN_RELE(vp); 410 VN_RELE(vp);
411 } else { 411 } else {
412 VMODIFY(vn_from_inode(dir)); 412 xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
413 xfs_validate_fields(ip, &vattr); 413 xfs_validate_fields(ip, &vattr);
414 d_instantiate(dentry, ip); 414 d_instantiate(dentry, ip);
415 } 415 }
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c
index 650c24ab27e2..47bca4e4696b 100644
--- a/fs/xfs/linux-2.6/xfs_super.c
+++ b/fs/xfs/linux-2.6/xfs_super.c
@@ -197,7 +197,7 @@ xfs_revalidate_inode(
197 inode->i_flags |= S_NOATIME; 197 inode->i_flags |= S_NOATIME;
198 else 198 else
199 inode->i_flags &= ~S_NOATIME; 199 inode->i_flags &= ~S_NOATIME;
200 vp->v_flag &= ~VMODIFIED; 200 xfs_iflags_clear(ip, XFS_IMODIFIED);
201} 201}
202 202
203void 203void
@@ -441,13 +441,12 @@ xfs_fs_clear_inode(
441 if (XFS_I(inode)) 441 if (XFS_I(inode))
442 xfs_inactive(XFS_I(inode)); 442 xfs_inactive(XFS_I(inode));
443 443
444 VN_LOCK(vp);
445 vp->v_flag &= ~VMODIFIED;
446 VN_UNLOCK(vp, 0);
447 444
448 if (XFS_I(inode)) 445 if (XFS_I(inode)) {
446 xfs_iflags_clear(XFS_I(inode), XFS_IMODIFIED);
449 if (xfs_reclaim(XFS_I(inode))) 447 if (xfs_reclaim(XFS_I(inode)))
450 panic("%s: cannot reclaim 0x%p\n", __FUNCTION__, vp); 448 panic("%s: cannot reclaim 0x%p\n", __FUNCTION__, vp);
449 }
451 450
452 ASSERT(XFS_I(inode) == NULL); 451 ASSERT(XFS_I(inode) == NULL);
453 452
diff --git a/fs/xfs/linux-2.6/xfs_vnode.c b/fs/xfs/linux-2.6/xfs_vnode.c
index 342c57879901..e6c559aee446 100644
--- a/fs/xfs/linux-2.6/xfs_vnode.c
+++ b/fs/xfs/linux-2.6/xfs_vnode.c
@@ -84,9 +84,6 @@ vn_initialize(
84 XFS_STATS_INC(vn_active); 84 XFS_STATS_INC(vn_active);
85 XFS_STATS_INC(vn_alloc); 85 XFS_STATS_INC(vn_alloc);
86 86
87 vp->v_flag = VMODIFIED;
88 spinlock_init(&vp->v_lock, "v_lock");
89
90 spin_lock(&vnumber_lock); 87 spin_lock(&vnumber_lock);
91 if (!++vn_generation) /* v_number shouldn't be zero */ 88 if (!++vn_generation) /* v_number shouldn't be zero */
92 vn_generation++; 89 vn_generation++;
@@ -157,7 +154,7 @@ __vn_revalidate(
157 error = xfs_getattr(xfs_vtoi(vp), vattr, 0); 154 error = xfs_getattr(xfs_vtoi(vp), vattr, 0);
158 if (likely(!error)) { 155 if (likely(!error)) {
159 vn_revalidate_core(vp, vattr); 156 vn_revalidate_core(vp, vattr);
160 VUNMODIFY(vp); 157 xfs_iflags_clear(xfs_vtoi(vp), XFS_IMODIFIED);
161 } 158 }
162 return -error; 159 return -error;
163} 160}
@@ -182,10 +179,8 @@ vn_hold(
182 179
183 XFS_STATS_INC(vn_hold); 180 XFS_STATS_INC(vn_hold);
184 181
185 VN_LOCK(vp);
186 inode = igrab(vn_to_inode(vp)); 182 inode = igrab(vn_to_inode(vp));
187 ASSERT(inode); 183 ASSERT(inode);
188 VN_UNLOCK(vp, 0);
189 184
190 return vp; 185 return vp;
191} 186}
@@ -199,7 +194,7 @@ vn_hold(
199/* 2 */ (void *)(__psint_t) line, \ 194/* 2 */ (void *)(__psint_t) line, \
200/* 3 */ (void *)(__psint_t)(vn_count(vp)), \ 195/* 3 */ (void *)(__psint_t)(vn_count(vp)), \
201/* 4 */ (void *)(ra), \ 196/* 4 */ (void *)(ra), \
202/* 5 */ (void *)(__psunsigned_t)(vp)->v_flag, \ 197/* 5 */ NULL, \
203/* 6 */ (void *)(__psint_t)current_cpu(), \ 198/* 6 */ (void *)(__psint_t)current_cpu(), \
204/* 7 */ (void *)(__psint_t)current_pid(), \ 199/* 7 */ (void *)(__psint_t)current_pid(), \
205/* 8 */ (void *)__return_address, \ 200/* 8 */ (void *)__return_address, \
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h
index 0f9ba6585c86..c8af208a73dc 100644
--- a/fs/xfs/linux-2.6/xfs_vnode.h
+++ b/fs/xfs/linux-2.6/xfs_vnode.h
@@ -27,20 +27,8 @@ struct attrlist_cursor_kern;
27typedef struct dentry bhv_vname_t; 27typedef struct dentry bhv_vname_t;
28typedef __u64 bhv_vnumber_t; 28typedef __u64 bhv_vnumber_t;
29 29
30typedef enum bhv_vflags {
31 VMODIFIED = 0x08, /* XFS inode state possibly differs */
32 /* to the Linux inode state. */
33 VTRUNCATED = 0x40, /* truncated down so flush-on-close */
34} bhv_vflags_t;
35
36/*
37 * MP locking protocols:
38 * v_flag, VN_LOCK/VN_UNLOCK
39 */
40typedef struct bhv_vnode { 30typedef struct bhv_vnode {
41 bhv_vflags_t v_flag; /* vnode flags (see above) */
42 bhv_vnumber_t v_number; /* in-core vnode number */ 31 bhv_vnumber_t v_number; /* in-core vnode number */
43 spinlock_t v_lock; /* VN_LOCK/VN_UNLOCK */
44 atomic_t v_iocount; /* outstanding I/O count */ 32 atomic_t v_iocount; /* outstanding I/O count */
45#ifdef XFS_VNODE_TRACE 33#ifdef XFS_VNODE_TRACE
46 struct ktrace *v_trace; /* trace header structure */ 34 struct ktrace *v_trace; /* trace header structure */
@@ -255,35 +243,6 @@ static inline struct bhv_vnode *vn_grab(struct bhv_vnode *vp)
255#define VNAME_TO_VNODE(dentry) (vn_from_inode((dentry)->d_inode)) 243#define VNAME_TO_VNODE(dentry) (vn_from_inode((dentry)->d_inode))
256 244
257/* 245/*
258 * Vnode spinlock manipulation.
259 */
260#define VN_LOCK(vp) mutex_spinlock(&(vp)->v_lock)
261#define VN_UNLOCK(vp, s) mutex_spinunlock(&(vp)->v_lock, s)
262
263STATIC_INLINE void vn_flagset(struct bhv_vnode *vp, uint flag)
264{
265 spin_lock(&vp->v_lock);
266 vp->v_flag |= flag;
267 spin_unlock(&vp->v_lock);
268}
269
270STATIC_INLINE uint vn_flagclr(struct bhv_vnode *vp, uint flag)
271{
272 uint cleared;
273
274 spin_lock(&vp->v_lock);
275 cleared = (vp->v_flag & flag);
276 vp->v_flag &= ~flag;
277 spin_unlock(&vp->v_lock);
278 return cleared;
279}
280
281#define VMODIFY(vp) vn_flagset(vp, VMODIFIED)
282#define VUNMODIFY(vp) vn_flagclr(vp, VMODIFIED)
283#define VTRUNCATE(vp) vn_flagset(vp, VTRUNCATED)
284#define VUNTRUNCATE(vp) vn_flagclr(vp, VTRUNCATED)
285
286/*
287 * Dealing with bad inodes 246 * Dealing with bad inodes
288 */ 247 */
289static inline void vn_mark_bad(struct bhv_vnode *vp) 248static inline void vn_mark_bad(struct bhv_vnode *vp)
@@ -322,7 +281,6 @@ static inline void vn_atime_to_time_t(bhv_vnode_t *vp, time_t *tt)
322#define VN_CACHED(vp) (vn_to_inode(vp)->i_mapping->nrpages) 281#define VN_CACHED(vp) (vn_to_inode(vp)->i_mapping->nrpages)
323#define VN_DIRTY(vp) mapping_tagged(vn_to_inode(vp)->i_mapping, \ 282#define VN_DIRTY(vp) mapping_tagged(vn_to_inode(vp)->i_mapping, \
324 PAGECACHE_TAG_DIRTY) 283 PAGECACHE_TAG_DIRTY)
325#define VN_TRUNC(vp) ((vp)->v_flag & VTRUNCATED)
326 284
327/* 285/*
328 * Flags to vop_setattr/getattr. 286 * Flags to vop_setattr/getattr.
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c
index 5806597b9ec4..ee13d6d708c8 100644
--- a/fs/xfs/xfs_iget.c
+++ b/fs/xfs/xfs_iget.c
@@ -336,6 +336,7 @@ finish_inode:
336 ASSERT(((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) != 0) == 336 ASSERT(((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) != 0) ==
337 ((ip->i_iocore.io_flags & XFS_IOCORE_RT) != 0)); 337 ((ip->i_iocore.io_flags & XFS_IOCORE_RT) != 0));
338 338
339 xfs_iflags_set(ip, XFS_IMODIFIED);
339 *ipp = ip; 340 *ipp = ip;
340 341
341 /* 342 /*
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
index 6f88ac3b10ae..79d724615c39 100644
--- a/fs/xfs/xfs_inode.h
+++ b/fs/xfs/xfs_inode.h
@@ -391,6 +391,9 @@ xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
391#define XFS_IRECLAIMABLE 0x0020 /* inode can be reclaimed */ 391#define XFS_IRECLAIMABLE 0x0020 /* inode can be reclaimed */
392#define XFS_INEW 0x0040 392#define XFS_INEW 0x0040
393#define XFS_IFILESTREAM 0x0080 /* inode is in a filestream directory */ 393#define XFS_IFILESTREAM 0x0080 /* inode is in a filestream directory */
394#define XFS_IMODIFIED 0x0100 /* XFS inode state possibly differs */
395 /* to the Linux inode state. */
396#define XFS_ITRUNCATED 0x0200 /* truncated down so flush-on-close */
394 397
395/* 398/*
396 * Flags for inode locking. 399 * Flags for inode locking.
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
index 7ebbfa0c4f0f..f2c037a9564e 100644
--- a/fs/xfs/xfs_vnodeops.c
+++ b/fs/xfs/xfs_vnodeops.c
@@ -660,7 +660,7 @@ xfs_setattr(
660 * vnode and flush it when the file is closed, and 660 * vnode and flush it when the file is closed, and
661 * do not wait the usual (long) time for writeout. 661 * do not wait the usual (long) time for writeout.
662 */ 662 */
663 VTRUNCATE(vp); 663 xfs_iflags_set(ip, XFS_ITRUNCATED);
664 } 664 }
665 /* 665 /*
666 * Have to do this even if the file's size doesn't change. 666 * Have to do this even if the file's size doesn't change.
@@ -1519,6 +1519,8 @@ xfs_release(
1519 return 0; 1519 return 0;
1520 1520
1521 if (!XFS_FORCED_SHUTDOWN(mp)) { 1521 if (!XFS_FORCED_SHUTDOWN(mp)) {
1522 int truncated;
1523
1522 /* 1524 /*
1523 * If we are using filestreams, and we have an unlinked 1525 * If we are using filestreams, and we have an unlinked
1524 * file that we are processing the last close on, then nothing 1526 * file that we are processing the last close on, then nothing
@@ -1539,7 +1541,13 @@ xfs_release(
1539 * significantly reducing the time window where we'd otherwise 1541 * significantly reducing the time window where we'd otherwise
1540 * be exposed to that problem. 1542 * be exposed to that problem.
1541 */ 1543 */
1542 if (VUNTRUNCATE(vp) && VN_DIRTY(vp) && ip->i_delayed_blks > 0) 1544 spin_lock(&ip->i_flags_lock);
1545 truncated = __xfs_iflags_test(ip, XFS_ITRUNCATED);
1546 if (truncated)
1547 ip->i_flags &= ~XFS_ITRUNCATED;
1548 spin_unlock(&ip->i_flags_lock);
1549
1550 if (truncated && VN_DIRTY(vp) && ip->i_delayed_blks > 0)
1543 xfs_flush_pages(ip, 0, -1, XFS_B_ASYNC, FI_NONE); 1551 xfs_flush_pages(ip, 0, -1, XFS_B_ASYNC, FI_NONE);
1544 } 1552 }
1545 1553