Merge branch 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / fs / nfs / objlayout / objio_osd.c
index 3b10d09..8ff2ea3 100644 (file)
@@ -108,7 +108,6 @@ _dev_list_add(const struct nfs_server *nfss,
                de = n;
        }
 
-       atomic_inc(&de->id_node.ref);
        return de;
 }
 
@@ -128,6 +127,8 @@ struct objio_segment {
        u64 group_depth;
        unsigned group_count;
 
+       unsigned max_io_size;
+
        unsigned comps_index;
        unsigned num_comps;
        /* variable length */
@@ -365,6 +366,11 @@ int objio_alloc_lseg(struct pnfs_layout_segment **outp,
                objio_seg->group_count = 1;
        }
 
+       /* Cache this calculation it will hit for every page */
+       objio_seg->max_io_size = (BIO_MAX_PAGES_KMALLOC * PAGE_SIZE -
+                                 objio_seg->stripe_unit) *
+                                objio_seg->group_width;
+
        *outp = &objio_seg->lseg;
        return 0;
 
@@ -988,6 +994,19 @@ ssize_t objio_write_pagelist(struct objlayout_io_state *ol_state, bool stable)
        return _write_exec(ios);
 }
 
+static bool objio_pg_test(struct nfs_pageio_descriptor *pgio,
+                         struct nfs_page *prev, struct nfs_page *req)
+{
+       if (!pnfs_generic_pg_test(pgio, prev, req))
+               return false;
+
+       if (pgio->pg_lseg == NULL)
+               return true;
+
+       return pgio->pg_count + req->wb_bytes <=
+                       OBJIO_LSEG(pgio->pg_lseg)->max_io_size;
+}
+
 static struct pnfs_layoutdriver_type objlayout_type = {
        .id = LAYOUT_OSD2_OBJECTS,
        .name = "LAYOUT_OSD2_OBJECTS",
@@ -1001,7 +1020,7 @@ static struct pnfs_layoutdriver_type objlayout_type = {
 
        .read_pagelist           = objlayout_read_pagelist,
        .write_pagelist          = objlayout_write_pagelist,
-       .pg_test                 = pnfs_generic_pg_test,
+       .pg_test                 = objio_pg_test,
 
        .free_deviceid_node      = objio_free_deviceid_node,