* [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page @ 2013-02-26 5:37 Jaegeuk Kim 2013-02-26 5:37 ` [PATCH 2/2] f2fs: introduce readahead mode of node pages Jaegeuk Kim 2013-02-26 9:35 ` [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page Namjae Jeon 0 siblings, 2 replies; 8+ messages in thread From: Jaegeuk Kim @ 2013-02-26 5:37 UTC (permalink / raw) To: linux-fsdevel, linux-kernel, linux-f2fs-devel; +Cc: Jaegeuk Kim It must be set READ_SYNC not READA. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> --- fs/f2fs/node.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index e275218..185454f 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -930,7 +930,7 @@ repeat: if (!page) return ERR_PTR(-ENOMEM); - err = read_node_page(page, READA); + err = read_node_page(page, READ_SYNC); if (err) { f2fs_put_page(page, 1); return ERR_PTR(err); -- 1.8.1.3.566.gaa39828 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] f2fs: introduce readahead mode of node pages 2013-02-26 5:37 [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page Jaegeuk Kim @ 2013-02-26 5:37 ` Jaegeuk Kim 2013-02-26 11:52 ` Namjae Jeon 2013-02-26 9:35 ` [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page Namjae Jeon 1 sibling, 1 reply; 8+ messages in thread From: Jaegeuk Kim @ 2013-02-26 5:37 UTC (permalink / raw) To: linux-fsdevel, linux-kernel, linux-f2fs-devel; +Cc: Jaegeuk Kim Previously, f2fs reads several node pages ahead when get_dnode_of_data is called with RDONLY_NODE flag. And, this flag is set by the following functions. - get_data_block_ro - get_lock_data_page - do_write_data_page - truncate_blocks - truncate_hole However, this readahead mechanism is initially introduced for the use of get_data_block_ro to enhance the sequential read performance. So, let's clarify all the cases with the additional modes as follows. enum { ALLOC_NODE, /* allocate a new node page if needed */ LOOKUP_NODE, /* look up a node without readahead */ LOOKUP_NODE_RA, /* * look up a node with readahead called * by get_datablock_ro. */ } Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> --- fs/f2fs/data.c | 12 ++++++------ fs/f2fs/f2fs.h | 12 ++++++++---- fs/f2fs/file.c | 8 ++++---- fs/f2fs/node.c | 6 +++--- fs/f2fs/recovery.c | 2 +- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 7bd22a2..277966a 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -183,7 +183,7 @@ struct page *find_data_page(struct inode *inode, pgoff_t index) f2fs_put_page(page, 0); set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, index, RDONLY_NODE); + err = get_dnode_of_data(&dn, index, LOOKUP_NODE); if (err) return ERR_PTR(err); f2fs_put_dnode(&dn); @@ -222,7 +222,7 @@ struct page *get_lock_data_page(struct inode *inode, pgoff_t index) int err; set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, index, RDONLY_NODE); + err = get_dnode_of_data(&dn, index, LOOKUP_NODE); if (err) return ERR_PTR(err); f2fs_put_dnode(&dn); @@ -262,7 +262,7 @@ struct page *get_new_data_page(struct inode *inode, pgoff_t index, int err; set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, index, 0); + err = get_dnode_of_data(&dn, index, ALLOC_NODE); if (err) return ERR_PTR(err); @@ -392,7 +392,7 @@ static int get_data_block_ro(struct inode *inode, sector_t iblock, /* When reading holes, we need its node page */ set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, pgofs, RDONLY_NODE); + err = get_dnode_of_data(&dn, pgofs, LOOKUP_NODE_RA); if (err) return (err == -ENOENT) ? 0 : err; @@ -443,7 +443,7 @@ int do_write_data_page(struct page *page) int err = 0; set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, page->index, RDONLY_NODE); + err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE); if (err) return err; @@ -607,7 +607,7 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping, mutex_lock_op(sbi, DATA_NEW); set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, index, 0); + err = get_dnode_of_data(&dn, index, ALLOC_NODE); if (err) { mutex_unlock_op(sbi, DATA_NEW); f2fs_put_page(page, 1); diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index cc2213a..be7ae70 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -125,11 +125,15 @@ static inline int update_sits_in_cursum(struct f2fs_summary_block *rs, int i) * file keeping -1 as its node offset to * distinguish from index node blocks. */ -#define RDONLY_NODE 1 /* - * specify a read-only mode when getting - * a node block. 0 is read-write mode. - * used by get_dnode_of_data(). +enum { + ALLOC_NODE, /* allocate a new node page if needed */ + LOOKUP_NODE, /* look up a node without readahead */ + LOOKUP_NODE_RA, /* + * look up a node with readahead called + * by get_datablock_ro. */ +}; + #define F2FS_LINK_MAX 32000 /* maximum link count per file */ /* for in-memory extent cache entry */ diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index b7a053d..d4e29a5 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -43,7 +43,7 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma, /* block allocation */ set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, page->index, 0); + err = get_dnode_of_data(&dn, page->index, ALLOC_NODE); if (err) { mutex_unlock_op(sbi, DATA_NEW); goto out; @@ -258,7 +258,7 @@ static int truncate_blocks(struct inode *inode, u64 from) mutex_lock_op(sbi, DATA_TRUNC); set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, free_from, RDONLY_NODE); + err = get_dnode_of_data(&dn, free_from, LOOKUP_NODE); if (err) { if (err == -ENOENT) goto free_next; @@ -420,7 +420,7 @@ int truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end) mutex_lock_op(sbi, DATA_TRUNC); set_new_dnode(&dn, inode, NULL, NULL, 0); - err = get_dnode_of_data(&dn, index, RDONLY_NODE); + err = get_dnode_of_data(&dn, index, LOOKUP_NODE); if (err) { mutex_unlock_op(sbi, DATA_TRUNC); if (err == -ENOENT) @@ -504,7 +504,7 @@ static int expand_inode_data(struct inode *inode, loff_t offset, mutex_lock_op(sbi, DATA_NEW); set_new_dnode(&dn, inode, NULL, NULL, 0); - ret = get_dnode_of_data(&dn, index, 0); + ret = get_dnode_of_data(&dn, index, ALLOC_NODE); if (ret) { mutex_unlock_op(sbi, DATA_NEW); break; diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 185454f..e88bf2b 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -384,7 +384,7 @@ got: /* * Caller should call f2fs_put_dnode(dn). */ -int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int ro) +int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode) { struct f2fs_sb_info *sbi = F2FS_SB(dn->inode->i_sb); struct page *npage[4]; @@ -411,7 +411,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int ro) for (i = 1; i <= level; i++) { bool done = false; - if (!nids[i] && !ro) { + if (!nids[i] && mode == ALLOC_NODE) { mutex_lock_op(sbi, NODE_NEW); /* alloc new node */ @@ -434,7 +434,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int ro) alloc_nid_done(sbi, nids[i]); mutex_unlock_op(sbi, NODE_NEW); done = true; - } else if (ro && i == level && level > 1) { + } else if (mode == LOOKUP_NODE_RA && i == level && level > 1) { npage[i] = get_node_page_ra(parent, offset[i - 1]); if (IS_ERR(npage[i])) { err = PTR_ERR(npage[i]); diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index b235215..6b82e20 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c @@ -247,7 +247,7 @@ static void do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, end = start + ADDRS_PER_BLOCK; set_new_dnode(&dn, inode, NULL, NULL, 0); - if (get_dnode_of_data(&dn, start, 0)) + if (get_dnode_of_data(&dn, start, ALLOC_NODE)) return; wait_on_page_writeback(dn.node_page); -- 1.8.1.3.566.gaa39828 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] f2fs: introduce readahead mode of node pages 2013-02-26 5:37 ` [PATCH 2/2] f2fs: introduce readahead mode of node pages Jaegeuk Kim @ 2013-02-26 11:52 ` Namjae Jeon 2013-02-27 1:04 ` Jaegeuk Kim 0 siblings, 1 reply; 8+ messages in thread From: Namjae Jeon @ 2013-02-26 11:52 UTC (permalink / raw) To: Jaegeuk Kim; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel > @@ -434,7 +434,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t > index, int ro) > alloc_nid_done(sbi, nids[i]); > mutex_unlock_op(sbi, NODE_NEW); > done = true; > - } else if (ro && i == level && level > 1) { > + } else if (mode == LOOKUP_NODE_RA && i == level && level > 1) { > npage[i] = get_node_page_ra(parent, offset[i - 1]); > if (IS_ERR(npage[i])) { > err = PTR_ERR(npage[i]); Hi Jaegeuk. There is no LOOKUP_NODE usage in this patch. I think that we can use LOOKUP_NODE flag instead of done(bool) like this. if (mode == LOOKUP_NODE) Thanks. > diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c > index b235215..6b82e20 100644 > --- a/fs/f2fs/recovery.c > +++ b/fs/f2fs/recovery.c > @@ -247,7 +247,7 @@ static void do_recover_data(struct f2fs_sb_info *sbi, > struct inode *inode, > end = start + ADDRS_PER_BLOCK; > > set_new_dnode(&dn, inode, NULL, NULL, 0); > - if (get_dnode_of_data(&dn, start, 0)) > + if (get_dnode_of_data(&dn, start, ALLOC_NODE)) > return; > > wait_on_page_writeback(dn.node_page); > -- > 1.8.1.3.566.gaa39828 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] f2fs: introduce readahead mode of node pages 2013-02-26 11:52 ` Namjae Jeon @ 2013-02-27 1:04 ` Jaegeuk Kim 2013-02-27 1:41 ` Namjae Jeon 0 siblings, 1 reply; 8+ messages in thread From: Jaegeuk Kim @ 2013-02-27 1:04 UTC (permalink / raw) To: Namjae Jeon; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel [-- Attachment #1: Type: text/plain, Size: 1013 bytes --] 2013-02-26 (화), 20:52 +0900, Namjae Jeon: > > @@ -434,7 +434,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t > > index, int ro) > > alloc_nid_done(sbi, nids[i]); > > mutex_unlock_op(sbi, NODE_NEW); > > done = true; > > - } else if (ro && i == level && level > 1) { > > + } else if (mode == LOOKUP_NODE_RA && i == level && level > 1) { > > npage[i] = get_node_page_ra(parent, offset[i - 1]); > > if (IS_ERR(npage[i])) { > > err = PTR_ERR(npage[i]); > > Hi Jaegeuk. > There is no LOOKUP_NODE usage in this patch. > I think that we can use LOOKUP_NODE flag instead of done(bool) like this. > if (mode == LOOKUP_NODE) Hi. In order to do that, we should check additional conditions like i and level together with mode == LOOKUP_NODE. So, I'm not sure how much it makes clearer by using LOOKUP_NODE explicitly. It seems fine to me, since we can just use LOOKUP_NODE to distinguish it from the other modes. Any thought? -- Jaegeuk Kim Samsung [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] f2fs: introduce readahead mode of node pages 2013-02-27 1:04 ` Jaegeuk Kim @ 2013-02-27 1:41 ` Namjae Jeon 0 siblings, 0 replies; 8+ messages in thread From: Namjae Jeon @ 2013-02-27 1:41 UTC (permalink / raw) To: jaegeuk.kim; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel 2013/2/27, Jaegeuk Kim <jaegeuk.kim@samsung.com>: > 2013-02-26 (화), 20:52 +0900, Namjae Jeon: >> > @@ -434,7 +434,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, >> > pgoff_t >> > index, int ro) >> > alloc_nid_done(sbi, nids[i]); >> > mutex_unlock_op(sbi, NODE_NEW); >> > done = true; >> > - } else if (ro && i == level && level > 1) { >> > + } else if (mode == LOOKUP_NODE_RA && i == level && level > 1) { >> > npage[i] = get_node_page_ra(parent, offset[i - 1]); >> > if (IS_ERR(npage[i])) { >> > err = PTR_ERR(npage[i]); >> >> Hi Jaegeuk. >> There is no LOOKUP_NODE usage in this patch. >> I think that we can use LOOKUP_NODE flag instead of done(bool) like >> this. >> if (mode == LOOKUP_NODE) > > Hi. > In order to do that, we should check additional conditions like i and > level together with mode == LOOKUP_NODE. > So, I'm not sure how much it makes clearer by using LOOKUP_NODE > explicitly. > It seems fine to me, since we can just use LOOKUP_NODE to distinguish it > from the other modes. > Any thought? I agree. And It does really need additional condition. So Rather, It can make more complicated If using LOOKUP_NODE. Looks reasonable to me on current change. Reviewed-by: Namjae Jeon <namjae.jeon@samsung.com> Thanks! > > -- > Jaegeuk Kim > Samsung > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page 2013-02-26 5:37 [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page Jaegeuk Kim 2013-02-26 5:37 ` [PATCH 2/2] f2fs: introduce readahead mode of node pages Jaegeuk Kim @ 2013-02-26 9:35 ` Namjae Jeon 2013-02-26 23:38 ` Jaegeuk Kim 1 sibling, 1 reply; 8+ messages in thread From: Namjae Jeon @ 2013-02-26 9:35 UTC (permalink / raw) To: Jaegeuk Kim; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel 2013/2/26, Jaegeuk Kim <jaegeuk.kim@samsung.com>: > It must be set READ_SYNC not READA. Hi Jaegeuk. Could you please elaborate more? Why we need to change READA to READ_SYNC over here, when the purpose was to read the node page in READ ahead mode. Thanks. > > Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> > --- > fs/f2fs/node.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c > index e275218..185454f 100644 > --- a/fs/f2fs/node.c > +++ b/fs/f2fs/node.c > @@ -930,7 +930,7 @@ repeat: > if (!page) > return ERR_PTR(-ENOMEM); > > - err = read_node_page(page, READA); > + err = read_node_page(page, READ_SYNC); > if (err) { > f2fs_put_page(page, 1); > return ERR_PTR(err); > -- > 1.8.1.3.566.gaa39828 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page 2013-02-26 9:35 ` [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page Namjae Jeon @ 2013-02-26 23:38 ` Jaegeuk Kim 2013-02-27 0:36 ` Namjae Jeon 0 siblings, 1 reply; 8+ messages in thread From: Jaegeuk Kim @ 2013-02-26 23:38 UTC (permalink / raw) To: Namjae Jeon; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel [-- Attachment #1: Type: text/plain, Size: 1681 bytes --] Hi, 2013-02-26 (화), 18:35 +0900, Namjae Jeon: > 2013/2/26, Jaegeuk Kim <jaegeuk.kim@samsung.com>: > > It must be set READ_SYNC not READA. > Hi Jaegeuk. > Could you please elaborate more? > Why we need to change READA to READ_SYNC over here, when the purpose > was to read the node page in READ ahead mode. That point was a reason for me to make this bug before. This is get_node_page_ra, not ra_node_page, which means that ra_node_page does actual readahead for another node pages. In summary, get_node_page_ra tries to: 1. grab or read a target node page for the given nid, 2. then, call ra_node_page to read other adjacent node pages in advance. So, when we try to read a target node page by #1, we should submit bio with READ_SYNC instead of READA. I'll add this to the description. Thanks, > > Thanks. > > > > Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> > > --- > > fs/f2fs/node.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c > > index e275218..185454f 100644 > > --- a/fs/f2fs/node.c > > +++ b/fs/f2fs/node.c > > @@ -930,7 +930,7 @@ repeat: > > if (!page) > > return ERR_PTR(-ENOMEM); > > > > - err = read_node_page(page, READA); > > + err = read_node_page(page, READ_SYNC); > > if (err) { > > f2fs_put_page(page, 1); > > return ERR_PTR(err); > > -- > > 1.8.1.3.566.gaa39828 > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- Jaegeuk Kim Samsung [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page 2013-02-26 23:38 ` Jaegeuk Kim @ 2013-02-27 0:36 ` Namjae Jeon 0 siblings, 0 replies; 8+ messages in thread From: Namjae Jeon @ 2013-02-27 0:36 UTC (permalink / raw) To: jaegeuk.kim; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel 2013/2/27, Jaegeuk Kim <jaegeuk.kim@samsung.com>: > Hi, > > 2013-02-26 (화), 18:35 +0900, Namjae Jeon: >> 2013/2/26, Jaegeuk Kim <jaegeuk.kim@samsung.com>: >> > It must be set READ_SYNC not READA. >> Hi Jaegeuk. >> Could you please elaborate more? >> Why we need to change READA to READ_SYNC over here, when the purpose >> was to read the node page in READ ahead mode. > > That point was a reason for me to make this bug before. > This is get_node_page_ra, not ra_node_page, which means that > ra_node_page does actual readahead for another node pages. > > In summary, get_node_page_ra tries to: > 1. grab or read a target node page for the given nid, > 2. then, call ra_node_page to read other adjacent node pages in advance. > > So, when we try to read a target node page by #1, we should submit bio > with READ_SYNC instead of READA. > > I'll add this to the description. > Thanks, okay, Clear :) Reviewed-by: Namjae Jeon <namjae.jeon@samsung.com> Thanks for explanation! > >> >> Thanks. >> > >> > Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> >> > --- >> > fs/f2fs/node.c | 2 +- >> > 1 file changed, 1 insertion(+), 1 deletion(-) >> > >> > diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c >> > index e275218..185454f 100644 >> > --- a/fs/f2fs/node.c >> > +++ b/fs/f2fs/node.c >> > @@ -930,7 +930,7 @@ repeat: >> > if (!page) >> > return ERR_PTR(-ENOMEM); >> > >> > - err = read_node_page(page, READA); >> > + err = read_node_page(page, READ_SYNC); >> > if (err) { >> > f2fs_put_page(page, 1); >> > return ERR_PTR(err); >> > -- >> > 1.8.1.3.566.gaa39828 >> > >> > -- >> > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" >> > in >> > the body of a message to majordomo@vger.kernel.org >> > More majordomo info at http://vger.kernel.org/majordomo-info.html >> > > > -- > Jaegeuk Kim > Samsung > ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-02-27 1:41 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-02-26 5:37 [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page Jaegeuk Kim 2013-02-26 5:37 ` [PATCH 2/2] f2fs: introduce readahead mode of node pages Jaegeuk Kim 2013-02-26 11:52 ` Namjae Jeon 2013-02-27 1:04 ` Jaegeuk Kim 2013-02-27 1:41 ` Namjae Jeon 2013-02-26 9:35 ` [PATCH 1/2] f2fs: read with READ_SYNC when getting dnode page Namjae Jeon 2013-02-26 23:38 ` Jaegeuk Kim 2013-02-27 0:36 ` Namjae Jeon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).