X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_io.c;h=56e5231a61603ac8e5732645d0afae7916e833d3;hb=b0ab95d6133e783acacc6329c025d17fb282775e;hp=13b40c6b1fe362bbd97d7bb751749cd5fd288b54;hpb=2272a301f5e365c0ca02b5c939934c1051d910d3;p=fs%2Flustre-release.git diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 13b40c6..56e5231 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -421,16 +421,18 @@ static int osd_map_remote_to_local(loff_t offset, ssize_t len, int *nrpages, RETURN(0); } -static struct page *osd_get_page(struct dt_object *dt, loff_t offset, int rw) +static struct page *osd_get_page(struct dt_object *dt, loff_t offset, + gfp_t gfp_mask) { - struct inode *inode = osd_dt_obj(dt)->oo_inode; - struct osd_device *d = osd_obj2dev(osd_dt_obj(dt)); - struct page *page; + struct inode *inode = osd_dt_obj(dt)->oo_inode; + struct osd_device *d = osd_obj2dev(osd_dt_obj(dt)); + struct page *page; LASSERT(inode); page = find_or_create_page(inode->i_mapping, offset >> PAGE_SHIFT, - GFP_NOFS | __GFP_HIGHMEM); + gfp_mask); + if (unlikely(page == NULL)) lprocfs_counter_add(d->od_stats, LPROC_OSD_NO_PAGE, 1); @@ -504,7 +506,7 @@ static int osd_bufs_put(const struct lu_env *env, struct dt_object *dt, * \param pos byte offset of IO start * \param len number of bytes of IO * \param lnb array of extents undergoing IO - * \param rw read or write operation? + * \param rw read or write operation, and other flags * \param capa capabilities * * \retval pages (zero or more) loaded successfully @@ -512,17 +514,22 @@ static int osd_bufs_put(const struct lu_env *env, struct dt_object *dt, */ static int osd_bufs_get(const struct lu_env *env, struct dt_object *dt, loff_t pos, ssize_t len, struct niobuf_local *lnb, - int rw) + enum dt_bufs_type rw) { - struct osd_object *obj = osd_dt_obj(dt); + struct osd_object *obj = osd_dt_obj(dt); int npages, i, rc = 0; + gfp_t gfp_mask; LASSERT(obj->oo_inode); osd_map_remote_to_local(pos, len, &npages, lnb); + /* this could also try less hard for DT_BUFS_TYPE_READAHEAD pages */ + gfp_mask = rw & DT_BUFS_TYPE_LOCAL ? (GFP_NOFS | __GFP_HIGHMEM) : + GFP_HIGHUSER; for (i = 0; i < npages; i++, lnb++) { - lnb->lnb_page = osd_get_page(dt, lnb->lnb_file_offset, rw); + lnb->lnb_page = osd_get_page(dt, lnb->lnb_file_offset, + gfp_mask); if (lnb->lnb_page == NULL) GOTO(cleanup, rc = -ENOMEM); @@ -1616,7 +1623,7 @@ static ssize_t osd_declare_write(const struct lu_env *env, struct dt_object *dt, credits = depth; /* if not append, then split may need to modify * existing blocks moving entries into the new ones */ - if (_pos == -1) + if (_pos != -1) credits += depth; /* blocks to store data: bitmap,gd,itself */ credits += blocks * 3; @@ -1680,9 +1687,12 @@ int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, ((char *)buf)[bufsize] = '\0'; ++bufsize; } - while (bufsize > 0) { - if (bh != NULL) - brelse(bh); + + while (bufsize > 0) { + int credits = handle->h_buffer_credits; + + if (bh) + brelse(bh); block = offset >> inode->i_blkbits; boffs = offset & (blocksize - 1); @@ -1695,9 +1705,11 @@ int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, err = PTR_ERR(bh); bh = NULL; } - CERROR("%s: error reading offset %llu (block %lu): " - "rc = %d\n", - inode->i_sb->s_id, offset, block, err); + + CERROR("%s: error reading offset %llu (block %lu, " + "size %d, offs %llu), credits %d/%d: rc = %d\n", + inode->i_sb->s_id, offset, block, bufsize, *offs, + credits, handle->h_buffer_credits, err); break; }