From 6c48578ef9fc0b542369ae897caac2488a83553c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 31 Mar 2008 20:56:04 -0700 Subject: [PATCH] kclient: wsize option, some writepages bits --- src/kernel/addr.c | 53 ++++++++++++++++++++++++++++++++-------------- src/kernel/super.c | 8 ++++++- src/kernel/super.h | 1 + 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/kernel/addr.c b/src/kernel/addr.c index 7e4494004820c..4f5ef1e69e9f5 100644 --- a/src/kernel/addr.c +++ b/src/kernel/addr.c @@ -76,6 +76,7 @@ static int ceph_writepage(struct page *page, struct writeback_control *wbc) ci = ceph_inode(inode); osdc = &ceph_inode_to_client(inode)->osdc; + /* is this a partial page at end of file? */ i_size = i_size_read(inode); if (i_size < page_off + len) len = i_size - page_off; @@ -85,15 +86,12 @@ static int ceph_writepage(struct page *page, struct writeback_control *wbc) page_cache_get(page); set_page_writeback(page); - - - /* write a page at the index of page->index, by size of PAGE_SIZE */ err = ceph_osdc_writepage(osdc, ceph_ino(inode), &ci->i_layout, page_off, len, page); if (err >= 0) SetPageUptodate(page); - //else - //redirty_page_for_writepage(page); /* is this right?? */ + else + redirty_page_for_writepage(wbc, page); /* is this right?? */ unlock_page(page); end_page_writeback(page); page_cache_release(page); @@ -104,23 +102,46 @@ static int ceph_writepage(struct page *page, struct writeback_control *wbc) * ceph_writepages: * do write jobs for several pages */ -static int ceph_writepages(struct address_space *mapping, struct writeback_control *wbc) +static int ceph_writepages(struct address_space *mapping, + struct writeback_control *wbc) { -#if 0 struct inode *inode = mapping->host; - struct ceph_pageio_descriptor pgio; - int err; + struct ceph_client *client = ceph_inode_to_client(inode); + pgoff_t index, end; + int range_whole = 0; + int scanned = 0; - ceph_pageio_init_write(&pgio, inode, wb_priority(wbc)); - wbc->fs_private = &pgio; - err = generic_writepages(mapping, wbc); - if (err) - return err; + dout(10, "writepages on %p\n", inode); - return 0; -#endif + /* if wsize is small, write 1 page at a time */ + if (client->mount_args.wsize && + client->mount_args.wsize < PAGE_CACHE_SIZE) + return generic_writepages(mapping, wbc); + + /* ?? from cifs. */ + /* + if (wbc->nonblocking && bdi_write_congested(bdi)) { + wbc->encountered_congestions = 1; + return 0; + } + */ return generic_writepages(mapping, wbc); + + /* where to start? */ + if (wbc->range_cyclic) { + index = mapping->writeback_index; /* Start from prev offset */ + end = -1; + } else { + index = wbc->range_start >> PAGE_CACHE_SHIFT; + end = wbc->range_end >> PAGE_CACHE_SHIFT; + if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) + range_whole = 1; + scanned = 1; + } + + + } diff --git a/src/kernel/super.c b/src/kernel/super.c index 297498164dca5..8e6ffcdef5a2a 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -217,6 +217,8 @@ enum { Opt_debug_osdc, Opt_monport, Opt_port, + Opt_wsize, + /* int args above */ Opt_ip, Opt_sillywrite, }; @@ -231,8 +233,9 @@ static match_table_t arg_tokens = { {Opt_debug_osdc, "debug_osdc=%d"}, {Opt_monport, "monport=%d"}, {Opt_port, "port=%d"}, + {Opt_wsize, "wsize=%d"}, + /* int args above */ {Opt_ip, "ip=%s"}, - /* int args above, no arguments below */ {Opt_sillywrite, "sillywrite"}, }; @@ -376,6 +379,9 @@ static int parse_mount_args(int flags, char *options, const char *dev_name, break; /* misc */ + case Opt_wsize: + args->wsize = intval; + break; case Opt_sillywrite: args->silly_write = 1; break; diff --git a/src/kernel/super.h b/src/kernel/super.h index dc6043c026e31..bf4050d726c80 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -64,6 +64,7 @@ struct ceph_mount_args { struct ceph_entity_addr mon_addr[5]; char path[100]; int silly_write; + int wsize; }; -- 2.39.5