X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-zfs%2Fosd_io.c;h=3fe29ef287d88762af882db66423e111542db91f;hb=df1d59429cbfd1ea2464e863458b6a4a268e516b;hp=b081857a27ff3b695cb2c99a2b691ffde18d0277;hpb=c20047193c2bc268e5c0782f4fed8d10525c1008;p=fs%2Flustre-release.git diff --git a/lustre/osd-zfs/osd_io.c b/lustre/osd-zfs/osd_io.c index b081857..3fe29ef 100644 --- a/lustre/osd-zfs/osd_io.c +++ b/lustre/osd-zfs/osd_io.c @@ -28,7 +28,7 @@ * Use is subject to license terms. */ /* - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2013, Intel Corporation. * Use is subject to license terms. */ /* @@ -41,14 +41,10 @@ * Author: Mike Pershin */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_OSD #include #include -#include #include #include #include @@ -242,16 +238,12 @@ static int osd_bufs_put(const struct lu_env *env, struct dt_object *dt, return 0; } -static struct page *kmem_to_page(void *addr) +static inline struct page *kmem_to_page(void *addr) { - struct page *page; - - if (kmem_virt(addr)) - page = vmalloc_to_page(addr); + if (is_vmalloc_addr(addr)) + return vmalloc_to_page(addr); else - page = virt_to_page(addr); - - return page; + return virt_to_page(addr); } static int osd_bufs_get_read(const struct lu_env *env, struct osd_object *obj, @@ -271,9 +263,10 @@ static int osd_bufs_get_read(const struct lu_env *env, struct osd_object *obj, */ while (len > 0) { rc = -dmu_buf_hold_array_by_bonus(obj->oo_db, off, len, TRUE, - osd_zerocopy_tag, &numbufs, - &dbp); - LASSERT(rc == 0); + osd_zerocopy_tag, &numbufs, + &dbp); + if (unlikely(rc)) + GOTO(err, rc); for (i = 0; i < numbufs; i++) { int bufoff, tocpy, thispage; @@ -291,8 +284,8 @@ static int osd_bufs_get_read(const struct lu_env *env, struct osd_object *obj, dbf = (void *) ((unsigned long)dbp[i] | 1); while (tocpy > 0) { - thispage = CFS_PAGE_SIZE; - thispage -= bufoff & (CFS_PAGE_SIZE - 1); + thispage = PAGE_CACHE_SIZE; + thispage -= bufoff & (PAGE_CACHE_SIZE - 1); thispage = min(tocpy, thispage); lnb->rc = 0; @@ -323,6 +316,11 @@ static int osd_bufs_get_read(const struct lu_env *env, struct osd_object *obj, } RETURN(npages); + +err: + LASSERT(rc < 0); + osd_bufs_put(env, &obj->oo_dt, lnb - npages, npages); + RETURN(rc); } static int osd_bufs_get_write(const struct lu_env *env, struct osd_object *obj, @@ -330,7 +328,7 @@ static int osd_bufs_get_write(const struct lu_env *env, struct osd_object *obj, { struct osd_device *osd = osd_obj2dev(obj); int plen, off_in_block, sz_in_block; - int i = 0, npages = 0; + int rc, i = 0, npages = 0; arc_buf_t *abuf; uint32_t bs; uint64_t dummy; @@ -353,14 +351,14 @@ static int osd_bufs_get_write(const struct lu_env *env, struct osd_object *obj, abuf = dmu_request_arcbuf(obj->oo_db, bs); if (unlikely(abuf == NULL)) - GOTO(out_err, -ENOMEM); + GOTO(out_err, rc = -ENOMEM); cfs_atomic_inc(&osd->od_zerocopy_loan); /* go over pages arcbuf contains, put them as * local niobufs for ptlrpc's bulks */ while (sz_in_block > 0) { - plen = min_t(int, sz_in_block, CFS_PAGE_SIZE); + plen = min_t(int, sz_in_block, PAGE_CACHE_SIZE); lnb[i].lnb_file_offset = off; lnb[i].lnb_page_offset = 0; @@ -394,7 +392,7 @@ static int osd_bufs_get_write(const struct lu_env *env, struct osd_object *obj, /* can't use zerocopy, allocate temp. buffers */ while (sz_in_block > 0) { - plen = min_t(int, sz_in_block, CFS_PAGE_SIZE); + plen = min_t(int, sz_in_block, PAGE_CACHE_SIZE); lnb[i].lnb_file_offset = off; lnb[i].lnb_page_offset = 0; @@ -404,7 +402,7 @@ static int osd_bufs_get_write(const struct lu_env *env, struct osd_object *obj, lnb[i].page = alloc_page(OSD_GFP_IO); if (unlikely(lnb[i].page == NULL)) - GOTO(out_err, -ENOMEM); + GOTO(out_err, rc = -ENOMEM); LASSERT(lnb[i].page->mapping == NULL); lnb[i].page->mapping = (void *)obj; @@ -426,7 +424,7 @@ static int osd_bufs_get_write(const struct lu_env *env, struct osd_object *obj, out_err: osd_bufs_put(env, &obj->oo_dt, lnb, npages); - RETURN(-ENOMEM); + RETURN(rc); } static int osd_bufs_get(const struct lu_env *env, struct dt_object *dt, @@ -863,7 +861,7 @@ struct dt_body_operations osd_body_ops = { .dbo_declare_write_commit = osd_declare_write_commit, .dbo_write_commit = osd_write_commit, .dbo_read_prep = osd_read_prep, - .do_declare_punch = osd_declare_punch, - .do_punch = osd_punch, + .dbo_declare_punch = osd_declare_punch, + .dbo_punch = osd_punch, };