X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdfilter%2Ffilter_io.c;h=859e29090776f5ec3659974453669b5d64fbd57c;hb=655d5e708e01a77368459a1dd9c34fab5b6838b1;hp=ea2721e9469302867be1a0894083a731d5365410;hpb=3dcf18d393b990e143fbb11fba2ec6137b7b8b43;p=fs%2Flustre-release.git diff --git a/lustre/obdfilter/filter_io.c b/lustre/obdfilter/filter_io.c index ea2721e..859e290 100644 --- a/lustre/obdfilter/filter_io.c +++ b/lustre/obdfilter/filter_io.c @@ -26,7 +26,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -109,14 +109,14 @@ void filter_grant_incoming(struct obd_export *exp, struct obdo *oa) fed->fed_grant -= oa->o_dropped; fed->fed_dirty = oa->o_dirty; - if (oa->o_flags & OBD_FL_SHRINK_GRANT) { + if (oa->o_valid & OBD_MD_FLFLAGS && oa->o_flags & OBD_FL_SHRINK_GRANT) { obd_size left_space = filter_grant_space_left(exp); struct filter_obd *filter = &exp->exp_obd->u.filter; - /*Only if left_space < fo_tot_clients * 32M, + /*Only if left_space < fo_tot_clients * 32M, *then the grant space could be shrinked */ - if (left_space < filter->fo_tot_granted_clients * - FILTER_GRANT_SHRINK_LIMIT) { + if (left_space < filter->fo_tot_granted_clients * + FILTER_GRANT_SHRINK_LIMIT) { fed->fed_grant -= oa->o_grant; filter->fo_tot_granted -= oa->o_grant; CDEBUG(D_CACHE, "%s: cli %s/%p shrink "LPU64 @@ -132,7 +132,7 @@ void filter_grant_incoming(struct obd_export *exp, struct obdo *oa) CERROR("%s: cli %s/%p dirty %ld pend %ld grant %ld\n", obd->obd_name, exp->exp_client_uuid.uuid, exp, fed->fed_dirty, fed->fed_pending, fed->fed_grant); - spin_unlock(&obd->obd_osfs_lock); + cfs_spin_unlock(&obd->obd_osfs_lock); LBUG(); } EXIT; @@ -152,10 +152,11 @@ obd_size filter_grant_space_left(struct obd_export *exp) LASSERT_SPIN_LOCKED(&obd->obd_osfs_lock); - if (cfs_time_before_64(obd->obd_osfs_age, cfs_time_current_64() - HZ)) { + if (cfs_time_before_64(obd->obd_osfs_age, + cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS))) { restat: rc = fsfilt_statfs(obd, obd->u.obt.obt_sb, - cfs_time_current_64() + HZ); + cfs_time_shift_64(OBD_STATFS_CACHE_SECONDS)); if (rc) /* N.B. statfs can't really fail */ RETURN(0); statfs_done = 1; @@ -198,9 +199,13 @@ restat: /* Calculate how much grant space to allocate to this client, based on how * much space is currently free and how much of that is already granted. * + * if @conservative != 0, we limit the maximum grant to FILTER_GRANT_CHUNK; + * otherwise we'll satisfy the requested amount as possible as we can, this + * is usually due to client reconnect. + * * Caller must hold obd_osfs_lock. */ long filter_grant(struct obd_export *exp, obd_size current_grant, - obd_size want, obd_size fs_space_left) + obd_size want, obd_size fs_space_left, int conservative) { struct obd_device *obd = exp->exp_obd; struct filter_export_data *fed = &exp->exp_filter_data; @@ -223,16 +228,11 @@ long filter_grant(struct obd_export *exp, obd_size current_grant, obd->obd_name, exp->exp_client_uuid.uuid, exp, want); } else if (current_grant < want && current_grant < fed->fed_grant + FILTER_GRANT_CHUNK) { - grant = min((want >> blockbits), - (fs_space_left >> blockbits) / 8); - grant <<= blockbits; + grant = min(want + (1 << blockbits) - 1, fs_space_left / 8); + grant &= ~((1ULL << blockbits) - 1); if (grant) { - /* Allow >FILTER_GRANT_CHUNK size when clients - * reconnect due to a server reboot. - */ - if ((grant > FILTER_GRANT_CHUNK) && - (!obd->obd_recovering)) + if (grant > FILTER_GRANT_CHUNK && conservative) grant = FILTER_GRANT_CHUNK; obd->u.filter.fo_tot_granted += grant; @@ -242,7 +242,7 @@ long filter_grant(struct obd_export *exp, obd_size current_grant, "current"LPU64"\n", obd->obd_name, exp->exp_client_uuid.uuid, exp, fed->fed_grant, want,current_grant); - spin_unlock(&obd->obd_osfs_lock); + cfs_spin_unlock(&obd->obd_osfs_lock); LBUG(); } } @@ -268,11 +268,10 @@ long filter_grant(struct obd_export *exp, obd_size current_grant, * as we might end up waiting on a page he sent in the request we're serving. * use __GFP_HIGHMEM so that the pages can use all of the available memory * on 32-bit machines - * use more agressive GFP_HIGHUSER flags from non-local clients to be able to - * generate more memory pressure, but at the same time use __GFP_NOMEMALLOC - * in order not to exhaust emergency reserves. + * use more aggressive GFP_HIGHUSER flags from non-local clients to be able to + * generate more memory pressure. * - * See Bug 19529 and Bug 19917 for details. + * See Bug 19529 and Bug 19917 for details. */ static struct page *filter_get_page(struct obd_device *obd, struct inode *inode, @@ -282,8 +281,8 @@ static struct page *filter_get_page(struct obd_device *obd, struct page *page; page = find_or_create_page(inode->i_mapping, offset >> CFS_PAGE_SHIFT, - (localreq ? (GFP_NOFS | __GFP_HIGHMEM) - : (GFP_HIGHUSER | __GFP_NOMEMALLOC))); + (localreq ? (GFP_NOFS | __GFP_HIGHMEM) + : GFP_HIGHUSER)); if (unlikely(page == NULL)) lprocfs_counter_add(obd->obd_stats, LPROC_FILTER_NO_PAGE, 1); @@ -341,56 +340,30 @@ static int filter_map_remote_to_local(int objcount, struct obd_ioobj *obj, } /* - * the function is used to free all pages used for request - * just to mimic cacheless OSS which don't occupy much memory - */ -void filter_invalidate_cache(struct obd_device *obd, struct obd_ioobj *obj, - struct niobuf_remote *nb, struct inode *inode) -{ - struct niobuf_remote *rnb; - int i; - - LASSERT(inode != NULL); - - for (i = 0, rnb = nb; i < obj->ioo_bufcnt; i++, rnb++) { - obd_off start; - obd_off end; - - start = rnb->offset >> CFS_PAGE_SHIFT; - end = (rnb->offset + rnb->len) >> CFS_PAGE_SHIFT; - invalidate_mapping_pages(inode->i_mapping, start, end); - /* just to avoid warnings */ - start = 0; - end = 0; - } -} - -/* * the invalidate above doesn't work during read because lnet pins pages. * The truncate is used here instead to drop pages from cache */ -void filter_truncate_cache(struct obd_device *obd, struct obd_ioobj *obj, - struct niobuf_remote *nb, int pages, - struct niobuf_local *res, struct inode *inode) +void filter_release_cache(struct obd_device *obd, struct obd_ioobj *obj, + struct niobuf_remote *rnb, struct inode *inode) { - struct niobuf_remote *rnb; int i; LASSERT(inode != NULL); + for (i = 0; i < obj->ioo_bufcnt; i++, rnb++) { #ifdef HAVE_TRUNCATE_RANGE - for (i = 0, rnb = nb; i < obj->ioo_bufcnt; i++, rnb++) { /* remove pages in which range is fit */ truncate_inode_pages_range(inode->i_mapping, rnb->offset & CFS_PAGE_MASK, (rnb->offset + rnb->len - 1) | ~CFS_PAGE_MASK); - } -#elif (defined HAVE_TRUNCATE_COMPLETE) - for (i = 0, lnb = res; i < pages; i++, lnb++) - truncate_complete_page(inode->i_mapping, lnb->page); #else -#error "Nor truncate_inode_pages_range or truncate_complete_page are supported" + /* use invalidate for old kernels */ + invalidate_mapping_pages(inode->i_mapping, + rnb->offset >> CFS_PAGE_SHIFT, + (rnb->offset + rnb->len) >> + CFS_PAGE_SHIFT); #endif + } } static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa, @@ -410,6 +383,7 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa, int rc = 0, i, tot_bytes = 0; unsigned long now = jiffies; long timediff; + loff_t isize; ENTRY; /* We are currently not supporting multi-obj BRW_READ RPCS at all. @@ -418,18 +392,19 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa, LASSERTF(objcount == 1, "%d\n", objcount); LASSERTF(obj->ioo_bufcnt > 0, "%d\n", obj->ioo_bufcnt); - rc = filter_auth_capa(exp, NULL, obdo_mdsno(oa), capa, + rc = filter_auth_capa(exp, NULL, oa->o_seq, capa, CAPA_OPC_OSS_READ); if (rc) RETURN(rc); if (oa && oa->o_valid & OBD_MD_FLGRANT) { - spin_lock(&obd->obd_osfs_lock); + cfs_spin_lock(&obd->obd_osfs_lock); filter_grant_incoming(exp, oa); - if (!(oa->o_flags & OBD_FL_SHRINK_GRANT)) + if (!(oa->o_valid & OBD_MD_FLFLAGS) || + !(oa->o_flags & OBD_FL_SHRINK_GRANT)) oa->o_grant = 0; - spin_unlock(&obd->obd_osfs_lock); + cfs_spin_unlock(&obd->obd_osfs_lock); } iobuf = filter_iobuf_get(&obd->u.filter, oti); @@ -437,7 +412,7 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa, RETURN(PTR_ERR(iobuf)); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); - dentry = filter_oa2dentry(obd, oa); + dentry = filter_oa2dentry(obd, &oa->o_oi); if (IS_ERR(dentry)) { rc = PTR_ERR(dentry); dentry = NULL; @@ -445,6 +420,7 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa, } inode = dentry->d_inode; + isize = i_size_read(inode); obdo_to_inode(inode, oa, OBD_MD_FLATIME); @@ -455,12 +431,12 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa, fsfilt_check_slow(obd, now, "preprw_read setup"); /* find pages for all segments, fill array with them */ - do_gettimeofday(&start); + cfs_gettimeofday(&start); for (i = 0, lnb = res; i < *npages; i++, lnb++) { lnb->dentry = dentry; - if (i_size_read(inode) <= lnb->offset) + if (isize <= lnb->offset) /* If there's no more data, abort early. lnb->rc == 0, * so it's easy to detect later. */ break; @@ -471,8 +447,8 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa, lprocfs_counter_add(obd->obd_stats, LPROC_FILTER_CACHE_ACCESS, 1); - if (i_size_read(inode) < lnb->offset + lnb->len - 1) - lnb->rc = i_size_read(inode) - lnb->offset; + if (isize < lnb->offset + lnb->len - 1) + lnb->rc = isize - lnb->offset; else lnb->rc = lnb->len; @@ -487,7 +463,7 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa, lprocfs_counter_add(obd->obd_stats, LPROC_FILTER_CACHE_MISS, 1); filter_iobuf_add_page(obd, iobuf, inode, lnb->page); } - do_gettimeofday(&end); + cfs_gettimeofday(&end); timediff = cfs_timeval_sub(&end, &start, NULL); lprocfs_counter_add(obd->obd_stats, LPROC_FILTER_GET_PAGE, timediff); @@ -554,6 +530,14 @@ static int filter_grant_check(struct obd_export *exp, struct obdo *oa, int blocksize = exp->exp_obd->u.obt.obt_sb->s_blocksize; unsigned long used = 0, ungranted = 0, using; int i, rc = -ENOSPC, obj, n = 0; + int resend = 0; + + if ((oa->o_valid & OBD_MD_FLFLAGS) && + (oa->o_flags & OBD_FL_RECOV_RESEND)) { + resend = 1; + CDEBUG(D_CACHE, "Recoverable resend arrived, skipping " + "accounting\n"); + } LASSERT_SPIN_LOCKED(&exp->exp_obd->obd_osfs_lock); @@ -570,7 +554,12 @@ static int filter_grant_check(struct obd_export *exp, struct obdo *oa, if ((lnb[n].flags & OBD_BRW_FROM_GRANT) && (oa->o_valid & OBD_MD_FLGRANT)) { - if (fed->fed_grant < used + bytes) { + if (resend) { + /* this is a recoverable resent */ + lnb[n].flags |= OBD_BRW_GRANTED; + rc = 0; + continue; + } else if (fed->fed_grant < used + bytes) { CDEBUG(D_CACHE, "%s: cli %s/%p claims %ld+%d " "GRANT, real grant %lu idx %d\n", @@ -646,7 +635,7 @@ static int filter_grant_check(struct obd_export *exp, struct obdo *oa, CERROR("%s: cli %s/%p dirty %ld pend %ld grant %ld\n", exp->exp_obd->obd_name, exp->exp_client_uuid.uuid, exp, fed->fed_dirty, fed->fed_pending, fed->fed_grant); - spin_unlock(&exp->exp_obd->obd_osfs_lock); + cfs_spin_unlock(&exp->exp_obd->obd_osfs_lock); LBUG(); } return rc; @@ -684,12 +673,13 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa, LASSERT(objcount == 1); LASSERT(obj->ioo_bufcnt > 0); - rc = filter_auth_capa(exp, NULL, obdo_mdsno(oa), capa, + rc = filter_auth_capa(exp, NULL, oa->o_seq, capa, CAPA_OPC_OSS_WRITE); if (rc) RETURN(rc); - if (exp->exp_connection->c_peer.nid == exp->exp_connection->c_self) + if (exp->exp_connection && + exp->exp_connection->c_peer.nid == exp->exp_connection->c_self) localreq = 1; push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); @@ -698,21 +688,48 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa, GOTO(cleanup, rc = PTR_ERR(iobuf)); cleanup_phase = 1; - dentry = filter_fid2dentry(obd, NULL, obj->ioo_gr, + dentry = filter_fid2dentry(obd, NULL, obj->ioo_seq, obj->ioo_id); if (IS_ERR(dentry)) GOTO(cleanup, rc = PTR_ERR(dentry)); cleanup_phase = 2; if (dentry->d_inode == NULL) { - CERROR("%s: trying to BRW to non-existent file "LPU64"\n", - obd->obd_name, obj->ioo_id); - GOTO(cleanup, rc = -ENOENT); + if (exp->exp_obd->obd_recovering) { + struct obdo *noa = oa; + + if (oa == NULL) { + OBDO_ALLOC(noa); + if (noa == NULL) + GOTO(recreate_out, rc = -ENOMEM); + noa->o_id = obj->ioo_id; + noa->o_valid = OBD_MD_FLID; + } + + if (filter_create(exp, noa, NULL, oti) == 0) { + f_dput(dentry); + dentry = filter_fid2dentry(exp->exp_obd, NULL, + obj->ioo_seq, + obj->ioo_id); + } + if (oa == NULL) + OBDO_FREE(noa); + } + recreate_out: + if (IS_ERR(dentry) || dentry->d_inode == NULL) { + CERROR("%s: BRW to missing obj "LPU64"/"LPU64":rc %d\n", + exp->exp_obd->obd_name, + obj->ioo_id, obj->ioo_seq, + IS_ERR(dentry) ? (int)PTR_ERR(dentry) : -ENOENT); + if (IS_ERR(dentry)) + cleanup_phase = 1; + GOTO(cleanup, rc = -ENOENT); + } } if (oa->o_valid & (OBD_MD_FLUID | OBD_MD_FLGID) && dentry->d_inode->i_mode & (S_ISUID | S_ISGID)) { - rc = filter_capa_fixoa(exp, oa, obdo_mdsno(oa), capa); + rc = filter_capa_fixoa(exp, oa, oa->o_seq, capa); if (rc) GOTO(cleanup, rc); } @@ -723,15 +740,24 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa, fsfilt_check_slow(obd, now, "preprw_write setup"); + /* Filter truncate first locks i_mutex then partially truncated + * page, filter write code first locks pages then take + * i_mutex. To avoid a deadlock in case of concurrent + * punch/write requests from one client, filter writes and + * filter truncates are serialized by i_alloc_sem, allowing + * multiple writes or single truncate. */ + down_read(&dentry->d_inode->i_alloc_sem); + fsfilt_check_slow(obd, now, "i_alloc_sem"); + /* Don't update inode timestamps if this write is older than a * setattr which modifies the timestamps. b=10150 */ /* XXX when we start having persistent reservations this needs to * be changed to filter_fmd_get() to create the fmd if it doesn't * already exist so we can store the reservation handle there. */ - fmd = filter_fmd_find(exp, obj->ioo_id, obj->ioo_gr); + fmd = filter_fmd_find(exp, obj->ioo_id, obj->ioo_seq); LASSERT(oa != NULL); - spin_lock(&obd->obd_osfs_lock); + cfs_spin_lock(&obd->obd_osfs_lock); filter_grant_incoming(exp, oa); if (fmd && fmd->fmd_mactime_xid > oti->oti_xid) oa->o_valid &= ~(OBD_MD_FLMTIME | OBD_MD_FLCTIME | @@ -751,25 +777,26 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa, /* do not zero out oa->o_valid as it is used in filter_commitrw_write() * for setting UID/GID and fid EA in first write time. */ - if (oa->o_valid & OBD_MD_FLGRANT) - oa->o_grant = filter_grant(exp,oa->o_grant,oa->o_undirty,left); - - spin_unlock(&obd->obd_osfs_lock); + /* If OBD_FL_SHRINK_GRANT is set, the client just returned us some grant + * so no sense in allocating it some more. We either return the grant + * back to the client if we have plenty of space or we don't return + * anything if we are short. This was decided in filter_grant_incoming*/ + if ((oa->o_valid & OBD_MD_FLGRANT) && + (!(oa->o_valid & OBD_MD_FLFLAGS) || + !(oa->o_flags & OBD_FL_SHRINK_GRANT))) + oa->o_grant = filter_grant(exp, oa->o_grant, oa->o_undirty, + left, 1); + + cfs_spin_unlock(&obd->obd_osfs_lock); filter_fmd_put(exp, fmd); + OBD_FAIL_TIMEOUT(OBD_FAIL_OST_BRW_PAUSE_BULK2, (obd_timeout + 1) / 4); + if (rc) GOTO(cleanup, rc); cleanup_phase = 4; - /* Filter truncate first locks i_mutex then partally truncated - * page, filter write code first locks pages then take - * i_mutex. To avoid a deadlock in case of concurrent - * punch/write requests from one client, filter writes and - * filter truncates are serialized by i_alloc_sem, allowing - * multiple writes or single truncate. */ - down_read(&dentry->d_inode->i_alloc_sem); - - do_gettimeofday(&start); + cfs_gettimeofday(&start); for (i = 0, lnb = res; i < *npages; i++, lnb++) { /* We still set up for ungranted pages so that granted pages @@ -790,8 +817,7 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa, * be able to proceed in filter_commitrw_write(). thus let's * just wait for writeout completion, should be rare enough. * -bzzz */ - if (obd->u.filter.fo_writethrough_cache) - wait_on_page_writeback(lnb->page); + wait_on_page_writeback(lnb->page); BUG_ON(PageWriteback(lnb->page)); /* If the filter writes a partial page, then has the file @@ -829,7 +855,7 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa, if (lnb->rc == 0) tot_bytes += lnb->len; } - do_gettimeofday(&end); + cfs_gettimeofday(&end); timediff = cfs_timeval_sub(&end, &start, NULL); lprocfs_counter_add(obd->obd_stats, LPROC_FILTER_GET_PAGE, timediff); @@ -842,6 +868,9 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa, fsfilt_check_slow(obd, now, "start_page_write"); + lprocfs_counter_add(obd->obd_stats, LPROC_FILTER_WRITE_BYTES, + tot_bytes); + if (exp->exp_nid_stats && exp->exp_nid_stats->nid_stats) lprocfs_counter_add(exp->exp_nid_stats->nid_stats, LPROC_FILTER_WRITE_BYTES, tot_bytes); @@ -857,9 +886,11 @@ cleanup: lnb->page = NULL; } } - up_read(&dentry->d_inode->i_alloc_sem); } case 3: + if (rc) + up_read(&dentry->d_inode->i_alloc_sem); + filter_iobuf_put(&obd->u.filter, iobuf, oti); case 2: pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); @@ -869,10 +900,10 @@ cleanup: case 1: filter_iobuf_put(&obd->u.filter, iobuf, oti); case 0: - spin_lock(&obd->obd_osfs_lock); + cfs_spin_lock(&obd->obd_osfs_lock); if (oa) filter_grant_incoming(exp, oa); - spin_unlock(&obd->obd_osfs_lock); + cfs_spin_unlock(&obd->obd_osfs_lock); pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); break; default:; @@ -911,7 +942,7 @@ static int filter_commitrw_read(struct obd_export *exp, struct obdo *oa, int i; ENTRY; - osc_build_res_name(obj->ioo_id, obj->ioo_gr, &res_id); + osc_build_res_name(obj->ioo_id, obj->ioo_seq, &res_id); /* If oa != NULL then filter_preprw_read updated the inode atime * and we should update the lvb so that other glimpses will also * get the updated value. bug 5972 */ @@ -920,7 +951,7 @@ static int filter_commitrw_read(struct obd_export *exp, struct obdo *oa, if (resource != NULL) { LDLM_RESOURCE_ADDREF(resource); - ns->ns_lvbo->lvbo_update(resource, NULL, 0, 1); + ns->ns_lvbo->lvbo_update(resource, NULL, 1); LDLM_RESOURCE_DELREF(resource); ldlm_resource_putref(resource); } @@ -929,17 +960,15 @@ static int filter_commitrw_read(struct obd_export *exp, struct obdo *oa, if (res->dentry != NULL) inode = res->dentry->d_inode; - for (i = 0, lnb = res; i < npages; i++, lnb++) - if (lnb->page != NULL) + for (i = 0, lnb = res; i < npages; i++, lnb++) { + if (lnb->page != NULL) { page_cache_release(lnb->page); - + lnb->page = NULL; + } + } if (inode && (fo->fo_read_cache == 0 || i_size_read(inode) > fo->fo_readcache_max_filesize)) - filter_truncate_cache(exp->exp_obd, obj, rnb, npages, res, - inode); - - for (i = 0, lnb = res; i < npages; i++, lnb++) - lnb->page = NULL; + filter_release_cache(exp->exp_obd, obj, rnb, inode); if (res->dentry != NULL) f_dput(res->dentry); @@ -954,7 +983,7 @@ void filter_grant_commit(struct obd_export *exp, int niocount, unsigned long pending = 0; int i; - spin_lock(&exp->exp_obd->obd_osfs_lock); + cfs_spin_lock(&exp->exp_obd->obd_osfs_lock); for (i = 0, lnb = res; i < niocount; i++, lnb++) pending += lnb->lnb_grant_used; @@ -974,7 +1003,7 @@ void filter_grant_commit(struct obd_export *exp, int niocount, filter->fo_tot_pending, pending); filter->fo_tot_pending -= pending; - spin_unlock(&exp->exp_obd->obd_osfs_lock); + cfs_spin_unlock(&exp->exp_obd->obd_osfs_lock); } int filter_commitrw(int cmd, struct obd_export *exp, struct obdo *oa, @@ -1014,6 +1043,7 @@ int filter_brw(int cmd, struct obd_export *exp, struct obd_info *oinfo, lnb[i].page = pga[i].pg; rnb[i].offset = pga[i].off; rnb[i].len = pga[i].count; + lnb[i].flags = rnb[i].flags = pga[i].flag; } obdo_to_ioobj(oinfo->oi_oa, &ioo);