diff options
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 8 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.h | 1 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 7 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_bmap.c | 14 | ||||
| -rw-r--r-- | fs/xfs/xfs_fs.h | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 13 |
7 files changed, 35 insertions, 14 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index ea79072f5210..d72cf2bb054a 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
| @@ -440,12 +440,7 @@ _xfs_buf_find( | |||
| 440 | ASSERT(btp == bp->b_target); | 440 | ASSERT(btp == bp->b_target); |
| 441 | if (bp->b_file_offset == range_base && | 441 | if (bp->b_file_offset == range_base && |
| 442 | bp->b_buffer_length == range_length) { | 442 | bp->b_buffer_length == range_length) { |
| 443 | /* | ||
| 444 | * If we look at something, bring it to the | ||
| 445 | * front of the list for next time. | ||
| 446 | */ | ||
| 447 | atomic_inc(&bp->b_hold); | 443 | atomic_inc(&bp->b_hold); |
| 448 | list_move(&bp->b_hash_list, &hash->bh_list); | ||
| 449 | goto found; | 444 | goto found; |
| 450 | } | 445 | } |
| 451 | } | 446 | } |
| @@ -1443,8 +1438,7 @@ xfs_alloc_bufhash( | |||
| 1443 | { | 1438 | { |
| 1444 | unsigned int i; | 1439 | unsigned int i; |
| 1445 | 1440 | ||
| 1446 | btp->bt_hashshift = external ? 3 : 8; /* 8 or 256 buckets */ | 1441 | btp->bt_hashshift = external ? 3 : 12; /* 8 or 4096 buckets */ |
| 1447 | btp->bt_hashmask = (1 << btp->bt_hashshift) - 1; | ||
| 1448 | btp->bt_hash = kmem_zalloc_large((1 << btp->bt_hashshift) * | 1442 | btp->bt_hash = kmem_zalloc_large((1 << btp->bt_hashshift) * |
| 1449 | sizeof(xfs_bufhash_t)); | 1443 | sizeof(xfs_bufhash_t)); |
| 1450 | for (i = 0; i < (1 << btp->bt_hashshift); i++) { | 1444 | for (i = 0; i < (1 << btp->bt_hashshift); i++) { |
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index d072e5ff923b..2a05614f0b92 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h | |||
| @@ -137,7 +137,6 @@ typedef struct xfs_buftarg { | |||
| 137 | size_t bt_smask; | 137 | size_t bt_smask; |
| 138 | 138 | ||
| 139 | /* per device buffer hash table */ | 139 | /* per device buffer hash table */ |
| 140 | uint bt_hashmask; | ||
| 141 | uint bt_hashshift; | 140 | uint bt_hashshift; |
| 142 | xfs_bufhash_t *bt_hash; | 141 | xfs_bufhash_t *bt_hash; |
| 143 | 142 | ||
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 237f5ffb2ee8..4fec427b83ef 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -907,6 +907,13 @@ xfs_ioctl_setattr( | |||
| 907 | return XFS_ERROR(EIO); | 907 | return XFS_ERROR(EIO); |
| 908 | 908 | ||
| 909 | /* | 909 | /* |
| 910 | * Disallow 32bit project ids because on-disk structure | ||
| 911 | * is 16bit only. | ||
| 912 | */ | ||
| 913 | if ((mask & FSX_PROJID) && (fa->fsx_projid > (__uint16_t)-1)) | ||
| 914 | return XFS_ERROR(EINVAL); | ||
| 915 | |||
| 916 | /* | ||
| 910 | * If disk quotas is on, we make sure that the dquots do exist on disk, | 917 | * If disk quotas is on, we make sure that the dquots do exist on disk, |
| 911 | * before we start any other transactions. Trying to do this later | 918 | * before we start any other transactions. Trying to do this later |
| 912 | * is messy. We don't care to take a readlock to look at the ids | 919 | * is messy. We don't care to take a readlock to look at the ids |
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 68be25dcd301..b1fc2a6bfe83 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
| @@ -664,7 +664,7 @@ xfs_vn_fiemap( | |||
| 664 | fieinfo->fi_extents_max + 1; | 664 | fieinfo->fi_extents_max + 1; |
| 665 | bm.bmv_count = min_t(__s32, bm.bmv_count, | 665 | bm.bmv_count = min_t(__s32, bm.bmv_count, |
| 666 | (PAGE_SIZE * 16 / sizeof(struct getbmapx))); | 666 | (PAGE_SIZE * 16 / sizeof(struct getbmapx))); |
| 667 | bm.bmv_iflags = BMV_IF_PREALLOC; | 667 | bm.bmv_iflags = BMV_IF_PREALLOC | BMV_IF_NO_HOLES; |
| 668 | if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) | 668 | if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) |
| 669 | bm.bmv_iflags |= BMV_IF_ATTRFORK; | 669 | bm.bmv_iflags |= BMV_IF_ATTRFORK; |
| 670 | if (!(fieinfo->fi_flags & FIEMAP_FLAG_SYNC)) | 670 | if (!(fieinfo->fi_flags & FIEMAP_FLAG_SYNC)) |
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 23f14e595c18..f90dadd5a968 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
| @@ -5533,12 +5533,24 @@ xfs_getbmap( | |||
| 5533 | map[i].br_startblock)) | 5533 | map[i].br_startblock)) |
| 5534 | goto out_free_map; | 5534 | goto out_free_map; |
| 5535 | 5535 | ||
| 5536 | nexleft--; | ||
| 5537 | bmv->bmv_offset = | 5536 | bmv->bmv_offset = |
| 5538 | out[cur_ext].bmv_offset + | 5537 | out[cur_ext].bmv_offset + |
| 5539 | out[cur_ext].bmv_length; | 5538 | out[cur_ext].bmv_length; |
| 5540 | bmv->bmv_length = | 5539 | bmv->bmv_length = |
| 5541 | max_t(__int64_t, 0, bmvend - bmv->bmv_offset); | 5540 | max_t(__int64_t, 0, bmvend - bmv->bmv_offset); |
| 5541 | |||
| 5542 | /* | ||
| 5543 | * In case we don't want to return the hole, | ||
| 5544 | * don't increase cur_ext so that we can reuse | ||
| 5545 | * it in the next loop. | ||
| 5546 | */ | ||
| 5547 | if ((iflags & BMV_IF_NO_HOLES) && | ||
| 5548 | map[i].br_startblock == HOLESTARTBLOCK) { | ||
| 5549 | memset(&out[cur_ext], 0, sizeof(out[cur_ext])); | ||
| 5550 | continue; | ||
| 5551 | } | ||
| 5552 | |||
| 5553 | nexleft--; | ||
| 5542 | bmv->bmv_entries++; | 5554 | bmv->bmv_entries++; |
| 5543 | cur_ext++; | 5555 | cur_ext++; |
| 5544 | } | 5556 | } |
diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 7cf7220e7d5f..87c2e9d02288 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h | |||
| @@ -114,8 +114,10 @@ struct getbmapx { | |||
| 114 | #define BMV_IF_NO_DMAPI_READ 0x2 /* Do not generate DMAPI read event */ | 114 | #define BMV_IF_NO_DMAPI_READ 0x2 /* Do not generate DMAPI read event */ |
| 115 | #define BMV_IF_PREALLOC 0x4 /* rtn status BMV_OF_PREALLOC if req */ | 115 | #define BMV_IF_PREALLOC 0x4 /* rtn status BMV_OF_PREALLOC if req */ |
| 116 | #define BMV_IF_DELALLOC 0x8 /* rtn status BMV_OF_DELALLOC if req */ | 116 | #define BMV_IF_DELALLOC 0x8 /* rtn status BMV_OF_DELALLOC if req */ |
| 117 | #define BMV_IF_NO_HOLES 0x10 /* Do not return holes */ | ||
| 117 | #define BMV_IF_VALID \ | 118 | #define BMV_IF_VALID \ |
| 118 | (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC|BMV_IF_DELALLOC) | 119 | (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC| \ |
| 120 | BMV_IF_DELALLOC|BMV_IF_NO_HOLES) | ||
| 119 | 121 | ||
| 120 | /* bmv_oflags values - returned for each non-header segment */ | 122 | /* bmv_oflags values - returned for each non-header segment */ |
| 121 | #define BMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ | 123 | #define BMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 66d585c6917c..4c7c7bfb2b2f 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -2299,15 +2299,22 @@ xfs_alloc_file_space( | |||
| 2299 | e = allocatesize_fsb; | 2299 | e = allocatesize_fsb; |
| 2300 | } | 2300 | } |
| 2301 | 2301 | ||
| 2302 | /* | ||
| 2303 | * The transaction reservation is limited to a 32-bit block | ||
| 2304 | * count, hence we need to limit the number of blocks we are | ||
| 2305 | * trying to reserve to avoid an overflow. We can't allocate | ||
| 2306 | * more than @nimaps extents, and an extent is limited on disk | ||
| 2307 | * to MAXEXTLEN (21 bits), so use that to enforce the limit. | ||
| 2308 | */ | ||
| 2309 | resblks = min_t(xfs_fileoff_t, (e - s), (MAXEXTLEN * nimaps)); | ||
| 2302 | if (unlikely(rt)) { | 2310 | if (unlikely(rt)) { |
| 2303 | resrtextents = qblocks = (uint)(e - s); | 2311 | resrtextents = qblocks = resblks; |
| 2304 | resrtextents /= mp->m_sb.sb_rextsize; | 2312 | resrtextents /= mp->m_sb.sb_rextsize; |
| 2305 | resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0); | 2313 | resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0); |
| 2306 | quota_flag = XFS_QMOPT_RES_RTBLKS; | 2314 | quota_flag = XFS_QMOPT_RES_RTBLKS; |
| 2307 | } else { | 2315 | } else { |
| 2308 | resrtextents = 0; | 2316 | resrtextents = 0; |
| 2309 | resblks = qblocks = \ | 2317 | resblks = qblocks = XFS_DIOSTRAT_SPACE_RES(mp, resblks); |
| 2310 | XFS_DIOSTRAT_SPACE_RES(mp, (uint)(e - s)); | ||
| 2311 | quota_flag = XFS_QMOPT_RES_REGBLKS; | 2318 | quota_flag = XFS_QMOPT_RES_REGBLKS; |
| 2312 | } | 2319 | } |
| 2313 | 2320 | ||
