X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_io.c;h=f8568c7e0d1776ad01d608c6641d4bbb615a13d7;hp=349e8450b73e2e2c0ed8e3c2d68b737e57c8c1e8;hb=0f81c5ae973bf7fba45b6ba7f9c5f4fb1f6eadcb;hpb=a23767580aebfab7f093df562ac7598e85b71b3e diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 349e845..f8568c7 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1209,12 +1209,12 @@ cont_map: GOTO(cleanup, rc); /* * decay extent blocks if we could allocate - * good large(1M) extent. + * good large extent. */ - if (previous_total == 0 && - total >= OSD_DEFAULT_EXTENT_BYTES >> inode->i_blkbits) + if (total - previous_total >= + osd_extent_bytes(osd) >> inode->i_blkbits) osd_decay_extent_bytes(osd, - total << inode->i_blkbits); + (total - previous_total) << inode->i_blkbits); /* look for next extent */ fp = NULL; blocks += blocks_per_page * clen; @@ -1355,6 +1355,7 @@ static int osd_is_mapped(struct dt_object *dt, __u64 offset, return cached_extent->mapped; } +#define MAX_EXTENTS_PER_WRITE 100 static int osd_declare_write_commit(const struct lu_env *env, struct dt_object *dt, struct niobuf_local *lnb, int npages, @@ -1420,7 +1421,7 @@ static int osd_declare_write_commit(const struct lu_env *env, if (lnb[i].lnb_file_offset != extent.end || extent.end == 0) { if (extent.end != 0) extents += (extent.end - extent.start + - extent_bytes - 1) / extent_bytes; + extent_bytes - 1) / extent_bytes; extent.start = lnb[i].lnb_file_offset; extent.end = lnb[i].lnb_file_offset + lnb[i].lnb_len; } else { @@ -1440,6 +1441,18 @@ static int osd_declare_write_commit(const struct lu_env *env, extents += (extent.end - extent.start + extent_bytes - 1) / extent_bytes; + /** + * with system space usage growing up, mballoc codes won't + * try best to scan block group to align best free extent as + * we can. So extent bytes per extent could be decayed to a + * very small value, this could make us reserve too many credits. + * We could be more optimistic in the credit reservations, even + * in a case where the filesystem is nearly full, it is extremely + * unlikely that the worst case would ever be hit. + */ + if (extents > MAX_EXTENTS_PER_WRITE) + extents = MAX_EXTENTS_PER_WRITE; + /* * each extent can go into new leaf causing a split * 5 is max tree depth: inode + 4 index blocks @@ -1482,6 +1495,11 @@ static int osd_declare_write_commit(const struct lu_env *env, else credits += extents; + CDEBUG(D_INODE, + "%s: inode #%lu extent_bytes %u extents %d credits %d\n", + osd_ino2name(inode), inode->i_ino, extent_bytes, extents, + credits); + out_declare: osd_trans_declare_op(env, oh, OSD_OT_WRITE, credits);