]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: wsize option, some writepages bits
authorSage Weil <sage@newdream.net>
Tue, 1 Apr 2008 03:56:04 +0000 (20:56 -0700)
committerSage Weil <sage@newdream.net>
Tue, 1 Apr 2008 03:56:04 +0000 (20:56 -0700)
src/kernel/addr.c
src/kernel/super.c
src/kernel/super.h

index 7e4494004820cf801c42cae3c24240a0a7da5cdb..4f5ef1e69e9f51e09d4044203ceea49389f4a446 100644 (file)
@@ -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;
+       }
+
+               
+
 }
 
 
index 297498164dca539397ac24301bb61703b6bcbf6d..8e6ffcdef5a2a1302fd8aedb48b768e290148f36 100644 (file)
@@ -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;
index dc6043c026e311b1eb2ee7e65d30e1d5ef173fa1..bf4050d726c80df5756d187c4b4bb426c5ae0d67 100644 (file)
@@ -64,6 +64,7 @@ struct ceph_mount_args {
        struct ceph_entity_addr mon_addr[5];
        char path[100];
        int silly_write;
+       int wsize;
 };