Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
eb8171b8
Commit
eb8171b8
authored
Jan 31, 2004
by
Russell Cattelan
Committed by
Christoph Hellwig
Jan 31, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[XFS] Move bits around to better manage common code. No functional change.
parent
2c640f57
Changes
20
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
317 additions
and
346 deletions
+317
-346
fs/xfs/Makefile
fs/xfs/Makefile
+5
-7
fs/xfs/linux/kmem.h
fs/xfs/linux/kmem.h
+0
-0
fs/xfs/linux/mrlock.c
fs/xfs/linux/mrlock.c
+0
-0
fs/xfs/linux/mrlock.h
fs/xfs/linux/mrlock.h
+0
-0
fs/xfs/linux/mutex.h
fs/xfs/linux/mutex.h
+0
-0
fs/xfs/linux/sema.h
fs/xfs/linux/sema.h
+0
-0
fs/xfs/linux/spin.h
fs/xfs/linux/spin.h
+0
-0
fs/xfs/linux/sv.h
fs/xfs/linux/sv.h
+0
-0
fs/xfs/linux/time.h
fs/xfs/linux/time.h
+0
-0
fs/xfs/linux/xfs_buf.c
fs/xfs/linux/xfs_buf.c
+5
-2
fs/xfs/linux/xfs_buf.h
fs/xfs/linux/xfs_buf.h
+281
-3
fs/xfs/linux/xfs_linux.h
fs/xfs/linux/xfs_linux.h
+20
-13
fs/xfs/support/ktrace.c
fs/xfs/support/ktrace.c
+2
-2
fs/xfs/support/ktrace.h
fs/xfs/support/ktrace.h
+1
-1
fs/xfs/support/uuid.c
fs/xfs/support/uuid.c
+3
-3
fs/xfs/xfs.h
fs/xfs/xfs.h
+0
-7
fs/xfs/xfs_behavior.c
fs/xfs/xfs_behavior.c
+0
-0
fs/xfs/xfs_behavior.h
fs/xfs/xfs_behavior.h
+0
-0
fs/xfs/xfs_buf.h
fs/xfs/xfs_buf.h
+0
-308
fs/xfs/xfs_iomap.c
fs/xfs/xfs_iomap.c
+0
-0
No files found.
fs/xfs/Makefile
View file @
eb8171b8
...
...
@@ -30,7 +30,7 @@
# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
#
EXTRA_CFLAGS
+=
-Ifs
/xfs
-funsigned-char
EXTRA_CFLAGS
+=
-Ifs
/xfs
-
Ifs
/xfs/linux
-
funsigned-char
ifeq
($(CONFIG_XFS_DEBUG),y)
EXTRA_CFLAGS
+=
-g
-DSTATIC
=
""
-DDEBUG
-DXFSDEBUG
...
...
@@ -83,6 +83,7 @@ xfs-y += xfs_alloc.o \
xfs_alloc_btree.o
\
xfs_attr.o
\
xfs_attr_leaf.o
\
xfs_behavior.o
\
xfs_bit.o
\
xfs_bmap.o
\
xfs_bmap_btree.o
\
...
...
@@ -106,6 +107,7 @@ xfs-y += xfs_alloc.o \
xfs_inode.o
\
xfs_inode_item.o
\
xfs_iocore.o
\
xfs_iomap.o
\
xfs_itable.o
\
xfs_dfrag.o
\
xfs_log.o
\
...
...
@@ -126,18 +128,15 @@ xfs-y += xfs_alloc.o \
xfs-$(CONFIG_XFS_TRACE)
+=
xfs_dir2_trace.o
# Objects in pagebuf/
xfs-y
+=
pagebuf/page_buf.o
# Objects in linux/
xfs-y
+=
$(
addprefix
linux/,
\
mrlock.o
\
xfs_aops.o
\
xfs_b
ehavior
.o
\
xfs_b
uf
.o
\
xfs_file.o
\
xfs_fs_subr.o
\
xfs_globals.o
\
xfs_ioctl.o
\
xfs_iomap.o
\
xfs_iops.o
\
xfs_lrw.o
\
xfs_super.o
\
...
...
@@ -148,7 +147,6 @@ xfs-y += $(addprefix linux/, \
xfs-y
+=
$(
addprefix
support/,
\
debug.o
\
move.o
\
mrlock.o
\
qsort.o
\
uuid.o
)
...
...
fs/xfs/
support
/kmem.h
→
fs/xfs/
linux
/kmem.h
View file @
eb8171b8
File moved
fs/xfs/
support
/mrlock.c
→
fs/xfs/
linux
/mrlock.c
View file @
eb8171b8
File moved
fs/xfs/
support
/mrlock.h
→
fs/xfs/
linux
/mrlock.h
View file @
eb8171b8
File moved
fs/xfs/
support
/mutex.h
→
fs/xfs/
linux
/mutex.h
View file @
eb8171b8
File moved
fs/xfs/
support
/sema.h
→
fs/xfs/
linux
/sema.h
View file @
eb8171b8
File moved
fs/xfs/
support
/spin.h
→
fs/xfs/
linux
/spin.h
View file @
eb8171b8
File moved
fs/xfs/
support
/sv.h
→
fs/xfs/
linux
/sv.h
View file @
eb8171b8
File moved
fs/xfs/
support
/time.h
→
fs/xfs/
linux
/time.h
View file @
eb8171b8
File moved
fs/xfs/
pagebuf/page
_buf.c
→
fs/xfs/
linux/xfs
_buf.c
View file @
eb8171b8
...
...
@@ -62,9 +62,12 @@
#include <support/ktrace.h>
#include <support/debug.h>
#include
<support/kmem.h>
#include
"kmem.h"
#include "page_buf.h"
#include "xfs_types.h"
#include "xfs_cred.h"
#include "xfs_lrw.h"
#include "xfs_buf.h"
#define BBSHIFT 9
#define BN_ALIGN_MASK ((1 << (PAGE_CACHE_SHIFT - BBSHIFT)) - 1)
...
...
fs/xfs/
pagebuf/page
_buf.h
→
fs/xfs/
linux/xfs
_buf.h
View file @
eb8171b8
...
...
@@ -34,8 +34,8 @@
* Written by Steve Lord, Jim Mostek, Russell Cattelan at SGI
*/
#ifndef __
PAGE
_BUF_H__
#define __
PAGE
_BUF_H__
#ifndef __
XFS
_BUF_H__
#define __
XFS
_BUF_H__
#include <linux/config.h>
#include <linux/list.h>
...
...
@@ -337,4 +337,282 @@ extern void pagebuf_trace(
#define pagebuf_target_name(target) \
({ char __b[BDEVNAME_SIZE]; bdevname((target)->pbr_bdev, __b); __b; })
#endif
/* __PAGE_BUF_H__ */
/* These are just for xfs_syncsub... it sets an internal variable
* then passes it to VOP_FLUSH_PAGES or adds the flags to a newly gotten buf_t
*/
#define XFS_B_ASYNC PBF_ASYNC
#define XFS_B_DELWRI PBF_DELWRI
#define XFS_B_READ PBF_READ
#define XFS_B_WRITE PBF_WRITE
#define XFS_B_STALE PBF_STALE
#define XFS_BUF_TRYLOCK PBF_TRYLOCK
#define XFS_INCORE_TRYLOCK PBF_TRYLOCK
#define XFS_BUF_LOCK PBF_LOCK
#define XFS_BUF_MAPPED PBF_MAPPED
#define BUF_BUSY PBF_DONT_BLOCK
#define XFS_BUF_BFLAGS(x) ((x)->pb_flags)
#define XFS_BUF_ZEROFLAGS(x) \
((x)->pb_flags &= ~(PBF_READ|PBF_WRITE|PBF_ASYNC|PBF_SYNC|PBF_DELWRI))
#define XFS_BUF_STALE(x) ((x)->pb_flags |= XFS_B_STALE)
#define XFS_BUF_UNSTALE(x) ((x)->pb_flags &= ~XFS_B_STALE)
#define XFS_BUF_ISSTALE(x) ((x)->pb_flags & XFS_B_STALE)
#define XFS_BUF_SUPER_STALE(x) do { \
XFS_BUF_STALE(x); \
xfs_buf_undelay(x); \
XFS_BUF_DONE(x); \
} while (0)
#define XFS_BUF_MANAGE PBF_FS_MANAGED
#define XFS_BUF_UNMANAGE(x) ((x)->pb_flags &= ~PBF_FS_MANAGED)
static
inline
void
xfs_buf_undelay
(
page_buf_t
*
pb
)
{
if
(
pb
->
pb_flags
&
PBF_DELWRI
)
{
if
(
pb
->
pb_list
.
next
!=
&
pb
->
pb_list
)
{
pagebuf_delwri_dequeue
(
pb
);
pagebuf_rele
(
pb
);
}
else
{
pb
->
pb_flags
&=
~
PBF_DELWRI
;
}
}
}
#define XFS_BUF_DELAYWRITE(x) ((x)->pb_flags |= PBF_DELWRI)
#define XFS_BUF_UNDELAYWRITE(x) xfs_buf_undelay(x)
#define XFS_BUF_ISDELAYWRITE(x) ((x)->pb_flags & PBF_DELWRI)
#define XFS_BUF_ERROR(x,no) pagebuf_ioerror(x,no)
#define XFS_BUF_GETERROR(x) pagebuf_geterror(x)
#define XFS_BUF_ISERROR(x) (pagebuf_geterror(x)?1:0)
#define XFS_BUF_DONE(x) ((x)->pb_flags &= ~(PBF_PARTIAL|PBF_NONE))
#define XFS_BUF_UNDONE(x) ((x)->pb_flags |= PBF_PARTIAL|PBF_NONE)
#define XFS_BUF_ISDONE(x) (!(PBF_NOT_DONE(x)))
#define XFS_BUF_BUSY(x) ((x)->pb_flags |= PBF_FORCEIO)
#define XFS_BUF_UNBUSY(x) ((x)->pb_flags &= ~PBF_FORCEIO)
#define XFS_BUF_ISBUSY(x) (1)
#define XFS_BUF_ASYNC(x) ((x)->pb_flags |= PBF_ASYNC)
#define XFS_BUF_UNASYNC(x) ((x)->pb_flags &= ~PBF_ASYNC)
#define XFS_BUF_ISASYNC(x) ((x)->pb_flags & PBF_ASYNC)
#define XFS_BUF_FLUSH(x) ((x)->pb_flags |= PBF_FLUSH)
#define XFS_BUF_UNFLUSH(x) ((x)->pb_flags &= ~PBF_FLUSH)
#define XFS_BUF_ISFLUSH(x) ((x)->pb_flags & PBF_FLUSH)
#define XFS_BUF_SHUT(x) printk("XFS_BUF_SHUT not implemented yet\n")
#define XFS_BUF_UNSHUT(x) printk("XFS_BUF_UNSHUT not implemented yet\n")
#define XFS_BUF_ISSHUT(x) (0)
#define XFS_BUF_HOLD(x) pagebuf_hold(x)
#define XFS_BUF_READ(x) ((x)->pb_flags |= PBF_READ)
#define XFS_BUF_UNREAD(x) ((x)->pb_flags &= ~PBF_READ)
#define XFS_BUF_ISREAD(x) ((x)->pb_flags & PBF_READ)
#define XFS_BUF_WRITE(x) ((x)->pb_flags |= PBF_WRITE)
#define XFS_BUF_UNWRITE(x) ((x)->pb_flags &= ~PBF_WRITE)
#define XFS_BUF_ISWRITE(x) ((x)->pb_flags & PBF_WRITE)
#define XFS_BUF_ISUNINITIAL(x) (0)
#define XFS_BUF_UNUNINITIAL(x) (0)
#define XFS_BUF_BP_ISMAPPED(bp) 1
typedef
struct
page_buf_s
xfs_buf_t
;
#define xfs_buf page_buf_s
typedef
struct
pb_target
xfs_buftarg_t
;
#define xfs_buftarg pb_target
#define XFS_BUF_DATAIO(x) ((x)->pb_flags |= PBF_FS_DATAIOD)
#define XFS_BUF_UNDATAIO(x) ((x)->pb_flags &= ~PBF_FS_DATAIOD)
#define XFS_BUF_IODONE_FUNC(buf) (buf)->pb_iodone
#define XFS_BUF_SET_IODONE_FUNC(buf, func) \
(buf)->pb_iodone = (func)
#define XFS_BUF_CLR_IODONE_FUNC(buf) \
(buf)->pb_iodone = NULL
#define XFS_BUF_SET_BDSTRAT_FUNC(buf, func) \
(buf)->pb_strat = (func)
#define XFS_BUF_CLR_BDSTRAT_FUNC(buf) \
(buf)->pb_strat = NULL
#define XFS_BUF_FSPRIVATE(buf, type) \
((type)(buf)->pb_fspriv)
#define XFS_BUF_SET_FSPRIVATE(buf, value) \
(buf)->pb_fspriv = (void *)(value)
#define XFS_BUF_FSPRIVATE2(buf, type) \
((type)(buf)->pb_fspriv2)
#define XFS_BUF_SET_FSPRIVATE2(buf, value) \
(buf)->pb_fspriv2 = (void *)(value)
#define XFS_BUF_FSPRIVATE3(buf, type) \
((type)(buf)->pb_fspriv3)
#define XFS_BUF_SET_FSPRIVATE3(buf, value) \
(buf)->pb_fspriv3 = (void *)(value)
#define XFS_BUF_SET_START(buf)
#define XFS_BUF_SET_BRELSE_FUNC(buf, value) \
(buf)->pb_relse = (value)
#define XFS_BUF_PTR(bp) (xfs_caddr_t)((bp)->pb_addr)
extern
inline
xfs_caddr_t
xfs_buf_offset
(
page_buf_t
*
bp
,
size_t
offset
)
{
if
(
bp
->
pb_flags
&
PBF_MAPPED
)
return
XFS_BUF_PTR
(
bp
)
+
offset
;
return
(
xfs_caddr_t
)
pagebuf_offset
(
bp
,
offset
);
}
#define XFS_BUF_SET_PTR(bp, val, count) \
pagebuf_associate_memory(bp, val, count)
#define XFS_BUF_ADDR(bp) ((bp)->pb_bn)
#define XFS_BUF_SET_ADDR(bp, blk) \
((bp)->pb_bn = (page_buf_daddr_t)(blk))
#define XFS_BUF_OFFSET(bp) ((bp)->pb_file_offset)
#define XFS_BUF_SET_OFFSET(bp, off) \
((bp)->pb_file_offset = (off))
#define XFS_BUF_COUNT(bp) ((bp)->pb_count_desired)
#define XFS_BUF_SET_COUNT(bp, cnt) \
((bp)->pb_count_desired = (cnt))
#define XFS_BUF_SIZE(bp) ((bp)->pb_buffer_length)
#define XFS_BUF_SET_SIZE(bp, cnt) \
((bp)->pb_buffer_length = (cnt))
#define XFS_BUF_SET_VTYPE_REF(bp, type, ref)
#define XFS_BUF_SET_VTYPE(bp, type)
#define XFS_BUF_SET_REF(bp, ref)
#define XFS_BUF_ISPINNED(bp) pagebuf_ispin(bp)
#define XFS_BUF_VALUSEMA(bp) pagebuf_lock_value(bp)
#define XFS_BUF_CPSEMA(bp) (pagebuf_cond_lock(bp) == 0)
#define XFS_BUF_VSEMA(bp) pagebuf_unlock(bp)
#define XFS_BUF_PSEMA(bp,x) pagebuf_lock(bp)
#define XFS_BUF_V_IODONESEMA(bp) up(&bp->pb_iodonesema);
/* setup the buffer target from a buftarg structure */
#define XFS_BUF_SET_TARGET(bp, target) \
(bp)->pb_target = (target)
#define XFS_BUF_TARGET(bp) ((bp)->pb_target)
#define XFS_BUFTARG_NAME(target) \
pagebuf_target_name(target)
#define XFS_BUF_SET_VTYPE_REF(bp, type, ref)
#define XFS_BUF_SET_VTYPE(bp, type)
#define XFS_BUF_SET_REF(bp, ref)
#define xfs_buf_read(target, blkno, len, flags) \
pagebuf_get((target), (blkno), (len), \
PBF_LOCK | PBF_READ | PBF_MAPPED | PBF_MAPPABLE)
#define xfs_buf_get(target, blkno, len, flags) \
pagebuf_get((target), (blkno), (len), \
PBF_LOCK | PBF_MAPPED | PBF_MAPPABLE)
#define xfs_buf_read_flags(target, blkno, len, flags) \
pagebuf_get((target), (blkno), (len), \
PBF_READ | PBF_MAPPABLE | flags)
#define xfs_buf_get_flags(target, blkno, len, flags) \
pagebuf_get((target), (blkno), (len), \
PBF_MAPPABLE | flags)
static
inline
int
xfs_bawrite
(
void
*
mp
,
page_buf_t
*
bp
)
{
bp
->
pb_fspriv3
=
mp
;
bp
->
pb_strat
=
xfs_bdstrat_cb
;
xfs_buf_undelay
(
bp
);
return
pagebuf_iostart
(
bp
,
PBF_WRITE
|
PBF_ASYNC
|
PBF_RUN_QUEUES
);
}
static
inline
void
xfs_buf_relse
(
page_buf_t
*
bp
)
{
if
((
bp
->
pb_flags
&
_PBF_LOCKABLE
)
&&
!
bp
->
pb_relse
)
pagebuf_unlock
(
bp
);
pagebuf_rele
(
bp
);
}
#define xfs_bpin(bp) pagebuf_pin(bp)
#define xfs_bunpin(bp) pagebuf_unpin(bp)
#define xfs_buftrace(id, bp) \
pagebuf_trace(bp, id, NULL, (void *)__builtin_return_address(0))
#define xfs_biodone(pb) \
pagebuf_iodone(pb, (pb->pb_flags & PBF_FS_DATAIOD), 0)
#define xfs_incore(buftarg,blkno,len,lockit) \
pagebuf_find(buftarg, blkno ,len, lockit)
#define xfs_biomove(pb, off, len, data, rw) \
pagebuf_iomove((pb), (off), (len), (data), \
((rw) == XFS_B_WRITE) ? PBRW_WRITE : PBRW_READ)
#define xfs_biozero(pb, off, len) \
pagebuf_iomove((pb), (off), (len), NULL, PBRW_ZERO)
static
inline
int
XFS_bwrite
(
page_buf_t
*
pb
)
{
int
iowait
=
(
pb
->
pb_flags
&
PBF_ASYNC
)
==
0
;
int
error
=
0
;
pb
->
pb_flags
|=
PBF_SYNC
;
if
(
!
iowait
)
pb
->
pb_flags
|=
PBF_RUN_QUEUES
;
xfs_buf_undelay
(
pb
);
pagebuf_iostrategy
(
pb
);
if
(
iowait
)
{
error
=
pagebuf_iowait
(
pb
);
xfs_buf_relse
(
pb
);
}
return
error
;
}
#define XFS_bdwrite(pb) \
pagebuf_iostart(pb, PBF_DELWRI | PBF_ASYNC)
static
inline
int
xfs_bdwrite
(
void
*
mp
,
page_buf_t
*
bp
)
{
bp
->
pb_strat
=
xfs_bdstrat_cb
;
bp
->
pb_fspriv3
=
mp
;
return
pagebuf_iostart
(
bp
,
PBF_DELWRI
|
PBF_ASYNC
);
}
#define XFS_bdstrat(bp) pagebuf_iorequest(bp)
#define xfs_iowait(pb) pagebuf_iowait(pb)
/*
* Go through all incore buffers, and release buffers
* if they belong to the given device. This is used in
* filesystem error handling to preserve the consistency
* of its metadata.
*/
#define xfs_binval(buftarg) xfs_flush_buftarg(buftarg)
#define XFS_bflush(buftarg) xfs_flush_buftarg(buftarg)
#define xfs_incore_relse(buftarg,delwri_only,wait) \
xfs_relse_buftarg(buftarg)
#define xfs_baread(target, rablkno, ralen) \
pagebuf_readahead((target), (rablkno), (ralen), PBF_DONT_BLOCK)
#define xfs_buf_get_empty(len, target) pagebuf_get_empty((len), (target))
#define xfs_buf_get_noaddr(len, target) pagebuf_get_no_daddr((len), (target))
#define xfs_buf_free(bp) pagebuf_free(bp)
#endif
/* __XFS_BUF_H__ */
fs/xfs/linux/xfs_linux.h
View file @
eb8171b8
...
...
@@ -55,19 +55,26 @@
#include <asm/byteorder.h>
#include <asm/unaligned.h>
#include <linux/xfs_behavior.h>
#include <linux/xfs_vfs.h>
#include <linux/xfs_cred.h>
#include <linux/xfs_vnode.h>
#include <linux/xfs_stats.h>
#include <linux/xfs_sysctl.h>
#include <linux/xfs_iops.h>
#include <linux/xfs_super.h>
#include <linux/xfs_globals.h>
#include <linux/xfs_fs_subr.h>
#include <linux/xfs_lrw.h>
#include <pagebuf/page_buf.h>
#include <mrlock.h>
#include <spin.h>
#include <sv.h>
#include <mutex.h>
#include <sema.h>
#include <time.h>
#include <kmem.h>
#include <xfs_behavior.h>
#include <xfs_vfs.h>
#include <xfs_cred.h>
#include <xfs_vnode.h>
#include <xfs_stats.h>
#include <xfs_sysctl.h>
#include <xfs_iops.h>
#include <xfs_super.h>
#include <xfs_globals.h>
#include <xfs_fs_subr.h>
#include <xfs_lrw.h>
#include <xfs_buf.h>
/*
* Feature macros (disable/enable)
...
...
fs/xfs/support/ktrace.c
View file @
eb8171b8
...
...
@@ -35,8 +35,8 @@
#include <linux/slab.h>
#include <xfs_types.h>
#include
"kmem.h"
#include
"spin.h"
#include
<kmem.h>
#include
<spin.h>
#include "debug.h"
#include "ktrace.h"
...
...
fs/xfs/support/ktrace.h
View file @
eb8171b8
...
...
@@ -32,7 +32,7 @@
#ifndef __XFS_SUPPORT_KTRACE_H__
#define __XFS_SUPPORT_KTRACE_H__
#include <s
upport/s
pin.h>
#include <spin.h>
/*
* Trace buffer entry structure.
...
...
fs/xfs/support/uuid.c
View file @
eb8171b8
...
...
@@ -33,11 +33,11 @@
#include <linux/types.h>
#include <xfs_types.h>
#include <xfs_arch.h>
#include "time.h"
#include <time.h>
#include <kmem.h>
#include <mutex.h>
#include "uuid.h"
#include "kmem.h"
#include "debug.h"
#include "mutex.h"
static
mutex_t
uuid_monitor
;
static
int
uuid_table_size
;
...
...
fs/xfs/xfs.h
View file @
eb8171b8
...
...
@@ -38,18 +38,11 @@
#include <xfs_arch.h>
#include <support/kmem.h>
#include <support/mrlock.h>
#include <support/qsort.h>
#include <support/spin.h>
#include <support/sv.h>
#include <support/ktrace.h>
#include <support/mutex.h>
#include <support/sema.h>
#include <support/debug.h>
#include <support/move.h>
#include <support/uuid.h>
#include <support/time.h>
#include <linux/xfs_linux.h>
...
...
fs/xfs/
linux/
xfs_behavior.c
→
fs/xfs/xfs_behavior.c
View file @
eb8171b8
File moved
fs/xfs/
linux/
xfs_behavior.h
→
fs/xfs/xfs_behavior.h
View file @
eb8171b8
File moved
fs/xfs/xfs_buf.h
deleted
100644 → 0
View file @
2c640f57
This diff is collapsed.
Click to expand it.
fs/xfs/
linux/
xfs_iomap.c
→
fs/xfs/xfs_iomap.c
View file @
eb8171b8
File moved
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment