xfs: update #2 for v3.14-rc1
- allow logical sector sized direct io on 'advanced format' 4k/512 disk. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQIcBAABAgAGBQJS6C5lAAoJENaLyazVq6ZOFFMP/Ag3IzyGv9zQ1I1ebqxdGNmU 8bNVvurN+Az1ISgXkMdcbqNgpVxcWaAcpbJwxWsRBaKBxtBmBWa0TF33XEmrFdmO Qqw3qLSsPzIDP5l518/bpn1Q0XhMWO2zss9HtHogw/7WBkB5qQYn94DAwIF1Zrga cimpuiVv7u73BnlMJeQl+mqONkuEUl9Oc9lOyDP7lqbAlp3mBDylTs0q99kug8fF LSQ+f+06PFKshPzTtcZHhqwMtK7Pd+wPp3B3i0iGvv1GcWWL1adM5HfWPLLQ/85l CvdTnKnIWpNvmaEbPtpB+kuz7V3CtnLFIBM1oRiYZoNRNEUG3SkkqH+xSkXY+Wfr Wiuplt50vHUvn1tiL6n2GE0QAyTNhcy2RiWzpkIim6S2LUXCmdOKvT9hEEs5ymVl Y+VSXwdPEbCHSfhqkg+PXUbWxk+WTkDe9rOMFK4VcTjDuxiWUAiFgVpEHrxjPV4A rFPwNgfUpaRMou5SzTZHLuM8YQ75DckDH+O3XpWD4boEfeTGeV3LhlRzLvIkL0I2 8VB24kV9TPUj+rphh9AckdU3kfN1wIb7ZOjwr008I5udfgPwjoj+kSgnd+k2yPtr r/ryHTV+RchbsiYEdriibSgUOtJNdNWnboba1DEDZDSvqALsq5eKWmpm3InE85Ix 2bN0SdjsTphp/Mc1Mllg =c0tN -----END PGP SIGNATURE----- Merge tag 'xfs-for-linus-v3.14-rc1-2' of git://oss.sgi.com/xfs/xfs Pull second xfs update from Ben Myers: "Allow logical sector sized direct io on 'advanced format' 4k/512 disk" * tag 'xfs-for-linus-v3.14-rc1-2' of git://oss.sgi.com/xfs/xfs: xfs: allow logical-sector sized O_DIRECT xfs: rename xfs_buftarg structure members xfs: clean up xfs_buftarg
This commit is contained in:
commit
f1499382f1
4 changed files with 32 additions and 11 deletions
|
@ -445,8 +445,8 @@ _xfs_buf_find(
|
||||||
numbytes = BBTOB(numblks);
|
numbytes = BBTOB(numblks);
|
||||||
|
|
||||||
/* Check for IOs smaller than the sector size / not sector aligned */
|
/* Check for IOs smaller than the sector size / not sector aligned */
|
||||||
ASSERT(!(numbytes < (1 << btp->bt_sshift)));
|
ASSERT(!(numbytes < btp->bt_meta_sectorsize));
|
||||||
ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask));
|
ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_meta_sectormask));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Corrupted block numbers can get through to here, unfortunately, so we
|
* Corrupted block numbers can get through to here, unfortunately, so we
|
||||||
|
@ -1599,9 +1599,9 @@ xfs_setsize_buftarg(
|
||||||
unsigned int blocksize,
|
unsigned int blocksize,
|
||||||
unsigned int sectorsize)
|
unsigned int sectorsize)
|
||||||
{
|
{
|
||||||
btp->bt_bsize = blocksize;
|
/* Set up metadata sector size info */
|
||||||
btp->bt_sshift = ffs(sectorsize) - 1;
|
btp->bt_meta_sectorsize = sectorsize;
|
||||||
btp->bt_smask = sectorsize - 1;
|
btp->bt_meta_sectormask = sectorsize - 1;
|
||||||
|
|
||||||
if (set_blocksize(btp->bt_bdev, sectorsize)) {
|
if (set_blocksize(btp->bt_bdev, sectorsize)) {
|
||||||
char name[BDEVNAME_SIZE];
|
char name[BDEVNAME_SIZE];
|
||||||
|
@ -1614,6 +1614,10 @@ xfs_setsize_buftarg(
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set up device logical sector size mask */
|
||||||
|
btp->bt_logical_sectorsize = bdev_logical_block_size(btp->bt_bdev);
|
||||||
|
btp->bt_logical_sectormask = bdev_logical_block_size(btp->bt_bdev) - 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -88,14 +88,28 @@ typedef unsigned int xfs_buf_flags_t;
|
||||||
*/
|
*/
|
||||||
#define XFS_BSTATE_DISPOSE (1 << 0) /* buffer being discarded */
|
#define XFS_BSTATE_DISPOSE (1 << 0) /* buffer being discarded */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The xfs_buftarg contains 2 notions of "sector size" -
|
||||||
|
*
|
||||||
|
* 1) The metadata sector size, which is the minimum unit and
|
||||||
|
* alignment of IO which will be performed by metadata operations.
|
||||||
|
* 2) The device logical sector size
|
||||||
|
*
|
||||||
|
* The first is specified at mkfs time, and is stored on-disk in the
|
||||||
|
* superblock's sb_sectsize.
|
||||||
|
*
|
||||||
|
* The latter is derived from the underlying device, and controls direct IO
|
||||||
|
* alignment constraints.
|
||||||
|
*/
|
||||||
typedef struct xfs_buftarg {
|
typedef struct xfs_buftarg {
|
||||||
dev_t bt_dev;
|
dev_t bt_dev;
|
||||||
struct block_device *bt_bdev;
|
struct block_device *bt_bdev;
|
||||||
struct backing_dev_info *bt_bdi;
|
struct backing_dev_info *bt_bdi;
|
||||||
struct xfs_mount *bt_mount;
|
struct xfs_mount *bt_mount;
|
||||||
unsigned int bt_bsize;
|
unsigned int bt_meta_sectorsize;
|
||||||
unsigned int bt_sshift;
|
size_t bt_meta_sectormask;
|
||||||
size_t bt_smask;
|
size_t bt_logical_sectorsize;
|
||||||
|
size_t bt_logical_sectormask;
|
||||||
|
|
||||||
/* LRU control structures */
|
/* LRU control structures */
|
||||||
struct shrinker bt_shrinker;
|
struct shrinker bt_shrinker;
|
||||||
|
|
|
@ -261,7 +261,8 @@ xfs_file_aio_read(
|
||||||
xfs_buftarg_t *target =
|
xfs_buftarg_t *target =
|
||||||
XFS_IS_REALTIME_INODE(ip) ?
|
XFS_IS_REALTIME_INODE(ip) ?
|
||||||
mp->m_rtdev_targp : mp->m_ddev_targp;
|
mp->m_rtdev_targp : mp->m_ddev_targp;
|
||||||
if ((pos & target->bt_smask) || (size & target->bt_smask)) {
|
/* DIO must be aligned to device logical sector size */
|
||||||
|
if ((pos | size) & target->bt_logical_sectormask) {
|
||||||
if (pos == i_size_read(inode))
|
if (pos == i_size_read(inode))
|
||||||
return 0;
|
return 0;
|
||||||
return -XFS_ERROR(EINVAL);
|
return -XFS_ERROR(EINVAL);
|
||||||
|
@ -641,9 +642,11 @@ xfs_file_dio_aio_write(
|
||||||
struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ?
|
struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ?
|
||||||
mp->m_rtdev_targp : mp->m_ddev_targp;
|
mp->m_rtdev_targp : mp->m_ddev_targp;
|
||||||
|
|
||||||
if ((pos & target->bt_smask) || (count & target->bt_smask))
|
/* DIO must be aligned to device logical sector size */
|
||||||
|
if ((pos | count) & target->bt_logical_sectormask)
|
||||||
return -XFS_ERROR(EINVAL);
|
return -XFS_ERROR(EINVAL);
|
||||||
|
|
||||||
|
/* "unaligned" here means not aligned to a filesystem block */
|
||||||
if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask))
|
if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask))
|
||||||
unaligned_io = 1;
|
unaligned_io = 1;
|
||||||
|
|
||||||
|
|
|
@ -1583,7 +1583,7 @@ xfs_file_ioctl(
|
||||||
XFS_IS_REALTIME_INODE(ip) ?
|
XFS_IS_REALTIME_INODE(ip) ?
|
||||||
mp->m_rtdev_targp : mp->m_ddev_targp;
|
mp->m_rtdev_targp : mp->m_ddev_targp;
|
||||||
|
|
||||||
da.d_mem = da.d_miniosz = 1 << target->bt_sshift;
|
da.d_mem = da.d_miniosz = target->bt_logical_sectorsize;
|
||||||
da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
|
da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
|
||||||
|
|
||||||
if (copy_to_user(arg, &da, sizeof(da)))
|
if (copy_to_user(arg, &da, sizeof(da)))
|
||||||
|
|
Loading…
Add table
Reference in a new issue