* [PATCH] xfs: allow logical-sector sized O_DIRECT for any fs sector size
@ 2014-01-15 17:59 Eric Sandeen
2014-01-15 22:38 ` Dave Chinner
2014-01-17 20:22 ` [PATCH 0/3 V2] " Eric Sandeen
0 siblings, 2 replies; 16+ messages in thread
From: Eric Sandeen @ 2014-01-15 17:59 UTC (permalink / raw)
To: xfs-oss
Some time ago, mkfs.xfs started picking the storage physical
sector size as the default filesystem "sector size" in order
to avoid RMW costs incurred by doing IOs at logical sector
size alignments.
However, this means that for a filesystem made with i.e.
a 4k sector size on an "advanced format" 4k/512 disk,
512-byte direct IOs are no longer allowed. This means
that XFS has essentially turned this AF drive into a hard
4K device, from the filesystem on up.
XFS's mkfs-specified "sector size" is really just controlling
the minimum size & alignment of filesystem metadata IO.
There is no real need to tightly couple XFS's minimal
metadata size to the minimum allowed direct IO size;
XFS can continue doing metadata in optimal sizes, but
still allow smaller DIOs for apps which issue them,
for whatever reason.
This patch adds 2 new fields to the xfs_buftarg, so that
we now track 3 sizes:
1) The device logical sector size
2) The device physical sector size
3) The filesystem sector size, which is the minimum unit and
alignment of IO which will be performed by metadata operations.
The first is used for the minimum allowed direct IO alignment,
the 2nd is used to report DIO sizes in XFS_IOC_DIOINFO
(the theory being, if an app actually asks, we can give them
the optimal answer, even if we allow smaller IOs), and the
3rd is used internally by the filesystem for metadata IOs.
This has passed xfstests on filesystems made with 4k sectors,
including when run under the patch I sent to ignore
XFS_IOC_DIOINFO, and issue 512 DIOs anyway. I also directly
tested end of block behavior on preallocated, sparse, and
existing files when we do a 512 IO into a 4k file on a
4k-sector filesystem, to be sure there were no unexpected
behaviors.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
NB: This depends on this patch which is in the xfs tree,
but not yet upstream:
xfs: simplify xfs_setsize_buftarg callchain; remove unused arg
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 9fccfb5..a89dcdf 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1599,6 +1599,7 @@ xfs_setsize_buftarg(
unsigned int blocksize,
unsigned int sectorsize)
{
+ /* Set up filesystem block and sector sizes */
btp->bt_bsize = blocksize;
btp->bt_sshift = ffs(sectorsize) - 1;
btp->bt_smask = sectorsize - 1;
@@ -1614,6 +1615,9 @@ xfs_setsize_buftarg(
return EINVAL;
}
+ /* Set up device logical & physical sector size info */
+ btp->bt_lsmask = bdev_logical_block_size(btp->bt_bdev) - 1;
+ btp->bt_pssize = bdev_physical_block_size(btp->bt_bdev);
return 0;
}
diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h
index 1cf21a4..29a0db9 100644
--- a/fs/xfs/xfs_buf.h
+++ b/fs/xfs/xfs_buf.h
@@ -88,14 +88,28 @@ typedef unsigned int xfs_buf_flags_t;
*/
#define XFS_BSTATE_DISPOSE (1 << 0) /* buffer being discarded */
+/*
+ * The xfs_buftarg contains 3 notions of "sector size" -
+ *
+ * 1) The device logical sector size
+ * 2) The device physical sector size
+ * 3) The filesystem sector size, which is the minimum unit and
+ * alignment of IO which will be performed by metadata operations.
+ *
+ * The latter is specified at mkfs time, stored on-disk in the
+ * superblock's sb_sectsize, and is set from there.
+ */
+
typedef struct xfs_buftarg {
dev_t bt_dev;
struct block_device *bt_bdev;
struct backing_dev_info *bt_bdi;
struct xfs_mount *bt_mount;
- unsigned int bt_bsize;
- unsigned int bt_sshift;
- size_t bt_smask;
+ unsigned int bt_bsize; /* fs block size */
+ unsigned int bt_sshift; /* fs sector size shift */
+ size_t bt_smask; /* fs sector size mask */
+ size_t bt_lsmask; /* dev logical sectsz mask */
+ unsigned int bt_pssize; /* dev physical sector size */
/* LRU control structures */
struct shrinker bt_shrinker;
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 52c91e1..09f9df9 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -261,7 +261,8 @@ xfs_file_aio_read(
xfs_buftarg_t *target =
XFS_IS_REALTIME_INODE(ip) ?
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 & target->bt_lsmask) || (size & target->bt_lsmask)) {
if (pos == i_size_read(inode))
return 0;
return -XFS_ERROR(EINVAL);
@@ -641,9 +642,11 @@ xfs_file_dio_aio_write(
struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ?
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 & target->bt_lsmask) || (count & target->bt_lsmask))
return -XFS_ERROR(EINVAL);
+ /* "unaligned" here means not aligned to a filesystem block */
if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask))
unaligned_io = 1;
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index 33ad9a7..1f3431f 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -1587,7 +1587,12 @@ xfs_file_ioctl(
XFS_IS_REALTIME_INODE(ip) ?
mp->m_rtdev_targp : mp->m_ddev_targp;
- da.d_mem = da.d_miniosz = 1 << target->bt_sshift;
+ /*
+ * Report device physical sector size as "optimal" minimum,
+ * unless blocksize is smaller than that.
+ */
+ da.d_miniosz = min(target->bt_pssize, target->bt_bsize);
+ da.d_mem = da.d_miniosz;
da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
if (copy_to_user(arg, &da, sizeof(da)))
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH] xfs: allow logical-sector sized O_DIRECT for any fs sector size 2014-01-15 17:59 [PATCH] xfs: allow logical-sector sized O_DIRECT for any fs sector size Eric Sandeen @ 2014-01-15 22:38 ` Dave Chinner 2014-01-15 22:52 ` Eric Sandeen 2014-01-17 20:22 ` [PATCH 0/3 V2] " Eric Sandeen 1 sibling, 1 reply; 16+ messages in thread From: Dave Chinner @ 2014-01-15 22:38 UTC (permalink / raw) To: Eric Sandeen; +Cc: xfs-oss On Wed, Jan 15, 2014 at 11:59:45AM -0600, Eric Sandeen wrote: > Some time ago, mkfs.xfs started picking the storage physical > sector size as the default filesystem "sector size" in order > to avoid RMW costs incurred by doing IOs at logical sector > size alignments. > > However, this means that for a filesystem made with i.e. > a 4k sector size on an "advanced format" 4k/512 disk, > 512-byte direct IOs are no longer allowed. This means > that XFS has essentially turned this AF drive into a hard > 4K device, from the filesystem on up. > > XFS's mkfs-specified "sector size" is really just controlling > the minimum size & alignment of filesystem metadata IO. > > There is no real need to tightly couple XFS's minimal > metadata size to the minimum allowed direct IO size; > XFS can continue doing metadata in optimal sizes, but > still allow smaller DIOs for apps which issue them, > for whatever reason. Given that we already serialise sub-block IO completely, doing "sub-sector" IO will also be serialised so there shouldn't be any new issues introduced by this change. > This patch adds 2 new fields to the xfs_buftarg, so that > we now track 3 sizes: > > 1) The device logical sector size > 2) The device physical sector size > 3) The filesystem sector size, which is the minimum unit and > alignment of IO which will be performed by metadata operations. I wouldn't call it the "filesystem sector size" because it's clear that it doesn't apply to everything in the filesystem. I'd prefer that we call it the "metadata sector size", similar to the "log sector size" we keep for situations where the external log device has a different sector size to the data device. > The first is used for the minimum allowed direct IO alignment, > the 2nd is used to report DIO sizes in XFS_IOC_DIOINFO > (the theory being, if an app actually asks, we can give them > the optimal answer, even if we allow smaller IOs), and the > 3rd is used internally by the filesystem for metadata IOs. Terminology nit: the 3rd is set by mkfs to define the physical format constraints that metadata in the filesystem must obey. If we ever have to allocate sector sized metadata, then it will be used for more than just IO.... > This has passed xfstests on filesystems made with 4k sectors, > including when run under the patch I sent to ignore > XFS_IOC_DIOINFO, and issue 512 DIOs anyway. I also directly > tested end of block behavior on preallocated, sparse, and > existing files when we do a 512 IO into a 4k file on a > 4k-sector filesystem, to be sure there were no unexpected > behaviors. > > Signed-off-by: Eric Sandeen <sandeen@redhat.com> > --- > > NB: This depends on this patch which is in the xfs tree, > but not yet upstream: > xfs: simplify xfs_setsize_buftarg callchain; remove unused arg > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 9fccfb5..a89dcdf 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1599,6 +1599,7 @@ xfs_setsize_buftarg( > unsigned int blocksize, > unsigned int sectorsize) > { > + /* Set up filesystem block and sector sizes */ > btp->bt_bsize = blocksize; > btp->bt_sshift = ffs(sectorsize) - 1; The two places that use bt_sshift convert it back to a byte count. We should change this simply to being a byte count. > btp->bt_smask = sectorsize - 1; > @@ -1614,6 +1615,9 @@ xfs_setsize_buftarg( > return EINVAL; > } > > + /* Set up device logical & physical sector size info */ > + btp->bt_lsmask = bdev_logical_block_size(btp->bt_bdev) - 1; > + btp->bt_pssize = bdev_physical_block_size(btp->bt_bdev); > return 0; > } > > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index 1cf21a4..29a0db9 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -88,14 +88,28 @@ typedef unsigned int xfs_buf_flags_t; > */ > #define XFS_BSTATE_DISPOSE (1 << 0) /* buffer being discarded */ > > +/* > + * The xfs_buftarg contains 3 notions of "sector size" - > + * > + * 1) The device logical sector size > + * 2) The device physical sector size > + * 3) The filesystem sector size, which is the minimum unit and > + * alignment of IO which will be performed by metadata operations. > + * > + * The latter is specified at mkfs time, stored on-disk in the > + * superblock's sb_sectsize, and is set from there. > + */ > + > typedef struct xfs_buftarg { > dev_t bt_dev; > struct block_device *bt_bdev; > struct backing_dev_info *bt_bdi; > struct xfs_mount *bt_mount; > - unsigned int bt_bsize; > - unsigned int bt_sshift; > - size_t bt_smask; > + unsigned int bt_bsize; /* fs block size */ > + unsigned int bt_sshift; /* fs sector size shift */ > + size_t bt_smask; /* fs sector size mask */ > + size_t bt_lsmask; /* dev logical sectsz mask */ > + unsigned int bt_pssize; /* dev physical sector size */ This patch makes bt_smask unused, so it can be removed. bt_bsize is also unused, so that should be removed, too. indeed, the buftarg has a backpointer to the xfs_mount, so we can get the block size from there if it is ever necessary. And I think we should make these names a little more descriptive while we are touching them so comments to describe them are unnecessary: unsigned int bt_meta_sectorsize; unsigned int bt_physical_sectorsize; size_t bt_logical_sectormask; > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 33ad9a7..1f3431f 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1587,7 +1587,12 @@ xfs_file_ioctl( > XFS_IS_REALTIME_INODE(ip) ? > mp->m_rtdev_targp : mp->m_ddev_targp; > > - da.d_mem = da.d_miniosz = 1 << target->bt_sshift; > + /* > + * Report device physical sector size as "optimal" minimum, > + * unless blocksize is smaller than that. > + */ > + da.d_miniosz = min(target->bt_pssize, target->bt_bsize); Just grab the filesysetm block size from the xfs_mount: da.d_miniosz = min(target->bt_pssize, mp->m_sb.sb_blocksize); > + da.d_mem = da.d_miniosz; I'd suggest that this should be PAGE_SIZE - it's for memory buffer alignment, not IO alignment, so using the IO alignment just seems wrong to me... Cheers, Dave. -- Dave Chinner david@fromorbit.com _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] xfs: allow logical-sector sized O_DIRECT for any fs sector size 2014-01-15 22:38 ` Dave Chinner @ 2014-01-15 22:52 ` Eric Sandeen 2014-01-16 23:21 ` Dave Chinner 0 siblings, 1 reply; 16+ messages in thread From: Eric Sandeen @ 2014-01-15 22:52 UTC (permalink / raw) To: Dave Chinner, Eric Sandeen; +Cc: xfs-oss On 1/15/14, 4:38 PM, Dave Chinner wrote: > On Wed, Jan 15, 2014 at 11:59:45AM -0600, Eric Sandeen wrote: >> Some time ago, mkfs.xfs started picking the storage physical >> sector size as the default filesystem "sector size" in order >> to avoid RMW costs incurred by doing IOs at logical sector >> size alignments. >> >> However, this means that for a filesystem made with i.e. >> a 4k sector size on an "advanced format" 4k/512 disk, >> 512-byte direct IOs are no longer allowed. This means >> that XFS has essentially turned this AF drive into a hard >> 4K device, from the filesystem on up. >> >> XFS's mkfs-specified "sector size" is really just controlling >> the minimum size & alignment of filesystem metadata IO. >> >> There is no real need to tightly couple XFS's minimal >> metadata size to the minimum allowed direct IO size; >> XFS can continue doing metadata in optimal sizes, but >> still allow smaller DIOs for apps which issue them, >> for whatever reason. > > Given that we already serialise sub-block IO completely, doing > "sub-sector" IO will also be serialised so there shouldn't be any > new issues introduced by this change. > >> This patch adds 2 new fields to the xfs_buftarg, so that >> we now track 3 sizes: >> >> 1) The device logical sector size >> 2) The device physical sector size >> 3) The filesystem sector size, which is the minimum unit and >> alignment of IO which will be performed by metadata operations. > > I wouldn't call it the "filesystem sector size" because it's clear > that it doesn't apply to everything in the filesystem. I'd prefer > that we call it the "metadata sector size", similar to the "log > sector size" we keep for situations where the external log device > has a different sector size to the data device. Ok, fair enough. >> The first is used for the minimum allowed direct IO alignment, >> the 2nd is used to report DIO sizes in XFS_IOC_DIOINFO >> (the theory being, if an app actually asks, we can give them >> the optimal answer, even if we allow smaller IOs), and the >> 3rd is used internally by the filesystem for metadata IOs. > > Terminology nit: the 3rd is set by mkfs to define the physical > format constraints that metadata in the filesystem must obey. If we > ever have to allocate sector sized metadata, then it will be used > for more than just IO.... Ok. I can fix comments. :D >> This has passed xfstests on filesystems made with 4k sectors, >> including when run under the patch I sent to ignore >> XFS_IOC_DIOINFO, and issue 512 DIOs anyway. I also directly >> tested end of block behavior on preallocated, sparse, and >> existing files when we do a 512 IO into a 4k file on a >> 4k-sector filesystem, to be sure there were no unexpected >> behaviors. >> >> Signed-off-by: Eric Sandeen <sandeen@redhat.com> >> --- >> >> NB: This depends on this patch which is in the xfs tree, >> but not yet upstream: >> xfs: simplify xfs_setsize_buftarg callchain; remove unused arg >> >> >> >> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c >> index 9fccfb5..a89dcdf 100644 >> --- a/fs/xfs/xfs_buf.c >> +++ b/fs/xfs/xfs_buf.c >> @@ -1599,6 +1599,7 @@ xfs_setsize_buftarg( >> unsigned int blocksize, >> unsigned int sectorsize) >> { >> + /* Set up filesystem block and sector sizes */ >> btp->bt_bsize = blocksize; >> btp->bt_sshift = ffs(sectorsize) - 1; > > The two places that use bt_sshift convert it back to a byte count. > We should change this simply to being a byte count. Ok, yeah, good point. I think I considered that along the way. >> btp->bt_smask = sectorsize - 1; >> @@ -1614,6 +1615,9 @@ xfs_setsize_buftarg( >> return EINVAL; >> } >> >> + /* Set up device logical & physical sector size info */ >> + btp->bt_lsmask = bdev_logical_block_size(btp->bt_bdev) - 1; >> + btp->bt_pssize = bdev_physical_block_size(btp->bt_bdev); >> return 0; >> } >> >> diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h >> index 1cf21a4..29a0db9 100644 >> --- a/fs/xfs/xfs_buf.h >> +++ b/fs/xfs/xfs_buf.h >> @@ -88,14 +88,28 @@ typedef unsigned int xfs_buf_flags_t; >> */ >> #define XFS_BSTATE_DISPOSE (1 << 0) /* buffer being discarded */ >> >> +/* >> + * The xfs_buftarg contains 3 notions of "sector size" - >> + * >> + * 1) The device logical sector size >> + * 2) The device physical sector size >> + * 3) The filesystem sector size, which is the minimum unit and >> + * alignment of IO which will be performed by metadata operations. >> + * >> + * The latter is specified at mkfs time, stored on-disk in the >> + * superblock's sb_sectsize, and is set from there. >> + */ >> + >> typedef struct xfs_buftarg { >> dev_t bt_dev; >> struct block_device *bt_bdev; >> struct backing_dev_info *bt_bdi; >> struct xfs_mount *bt_mount; >> - unsigned int bt_bsize; >> - unsigned int bt_sshift; >> - size_t bt_smask; >> + unsigned int bt_bsize; /* fs block size */ >> + unsigned int bt_sshift; /* fs sector size shift */ >> + size_t bt_smask; /* fs sector size mask */ >> + size_t bt_lsmask; /* dev logical sectsz mask */ >> + unsigned int bt_pssize; /* dev physical sector size */ > > This patch makes bt_smask unused, so it can be removed. bt_bsize is > also unused, so that should be removed, too. indeed, the buftarg has > a backpointer to the xfs_mount, so we can get the block size from > there if it is ever necessary. bt_bsize is used, until your suggestion below. :) But I can remove it with that change, sure. > And I think we should make these names a little more descriptive > while we are touching them so comments to describe them are > unnecessary: > > unsigned int bt_meta_sectorsize; > unsigned int bt_physical_sectorsize; > size_t bt_logical_sectormask; Ok. I was just sticking with the tradtional (lack of) verbosity. >> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c >> index 33ad9a7..1f3431f 100644 >> --- a/fs/xfs/xfs_ioctl.c >> +++ b/fs/xfs/xfs_ioctl.c >> @@ -1587,7 +1587,12 @@ xfs_file_ioctl( >> XFS_IS_REALTIME_INODE(ip) ? >> mp->m_rtdev_targp : mp->m_ddev_targp; >> >> - da.d_mem = da.d_miniosz = 1 << target->bt_sshift; >> + /* >> + * Report device physical sector size as "optimal" minimum, >> + * unless blocksize is smaller than that. >> + */ >> + da.d_miniosz = min(target->bt_pssize, target->bt_bsize); > > Just grab the filesysetm block size from the xfs_mount: > > da.d_miniosz = min(target->bt_pssize, mp->m_sb.sb_blocksize); > >> + da.d_mem = da.d_miniosz; > > I'd suggest that this should be PAGE_SIZE - it's for memory buffer > alignment, not IO alignment, so using the IO alignment just seems > wrong to me... Ok. Was just sticking close to what we had before. So: da.d_miniosz = min(target->bt_pssize, mp->m_sb.sb_blocksize); da.d_mem = PAGE_SIZE; ? Then we can have a minimum IO size of 512, and a memory alignment of 4k, isn't that a little odd? (IOWs we could do 512-aligned memory before, right? What's the downside, or the value in changing it now?) Thanks, -Eric > Cheers, > > Dave. > _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] xfs: allow logical-sector sized O_DIRECT for any fs sector size 2014-01-15 22:52 ` Eric Sandeen @ 2014-01-16 23:21 ` Dave Chinner 2014-01-17 17:35 ` Eric Sandeen 0 siblings, 1 reply; 16+ messages in thread From: Dave Chinner @ 2014-01-16 23:21 UTC (permalink / raw) To: Eric Sandeen; +Cc: Eric Sandeen, xfs-oss On Wed, Jan 15, 2014 at 04:52:05PM -0600, Eric Sandeen wrote: > On 1/15/14, 4:38 PM, Dave Chinner wrote: > > On Wed, Jan 15, 2014 at 11:59:45AM -0600, Eric Sandeen wrote: > >> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > >> index 33ad9a7..1f3431f 100644 > >> --- a/fs/xfs/xfs_ioctl.c > >> +++ b/fs/xfs/xfs_ioctl.c > >> @@ -1587,7 +1587,12 @@ xfs_file_ioctl( > >> XFS_IS_REALTIME_INODE(ip) ? > >> mp->m_rtdev_targp : mp->m_ddev_targp; > >> > >> - da.d_mem = da.d_miniosz = 1 << target->bt_sshift; > >> + /* > >> + * Report device physical sector size as "optimal" minimum, > >> + * unless blocksize is smaller than that. > >> + */ > >> + da.d_miniosz = min(target->bt_pssize, target->bt_bsize); > > > > Just grab the filesysetm block size from the xfs_mount: > > > > da.d_miniosz = min(target->bt_pssize, mp->m_sb.sb_blocksize); > > > >> + da.d_mem = da.d_miniosz; > > > > I'd suggest that this should be PAGE_SIZE - it's for memory buffer > > alignment, not IO alignment, so using the IO alignment just seems > > wrong to me... > > Ok. Was just sticking close to what we had before. > > So: > da.d_miniosz = min(target->bt_pssize, mp->m_sb.sb_blocksize); > da.d_mem = PAGE_SIZE; > > ? Then we can have a minimum IO size of 512, and a memory alignment of > 4k, isn't that a little odd? > > (IOWs we could do 512-aligned memory before, right? What's the downside, > or the value in changing it now?) We can do arbitrary byte aligned buffers if I understand get_user_pages() correctly - it just maps the page under the buffer into the kernel address space and then the bio is pointed at it. AFAICT, the reason for the "memory buffer needs 512 byte alignment" is simply that this is the minimum IO size supported. However, for large IOs, 512 byte alignment is not really optimal. If we don't align the buffer to PAGE_SIZE, then we have partial head and tail pages, so for a 512k IO we need to map 129 pages into a bio instead of 128. When you have hardware that can only handle 128 segments in a DMA transfer, that means the 512k IO needs to be sent in two IOs rather than one. There's quite a bit of hardware out there that have a limit of 128 segments to each IO.... Cheers, Dave. -- Dave Chinner david@fromorbit.com _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] xfs: allow logical-sector sized O_DIRECT for any fs sector size 2014-01-16 23:21 ` Dave Chinner @ 2014-01-17 17:35 ` Eric Sandeen 0 siblings, 0 replies; 16+ messages in thread From: Eric Sandeen @ 2014-01-17 17:35 UTC (permalink / raw) To: Dave Chinner; +Cc: Eric Sandeen, xfs-oss On 1/16/14, 5:21 PM, Dave Chinner wrote: > On Wed, Jan 15, 2014 at 04:52:05PM -0600, Eric Sandeen wrote: >> On 1/15/14, 4:38 PM, Dave Chinner wrote: >>> On Wed, Jan 15, 2014 at 11:59:45AM -0600, Eric Sandeen wrote: >>>> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c >>>> index 33ad9a7..1f3431f 100644 >>>> --- a/fs/xfs/xfs_ioctl.c >>>> +++ b/fs/xfs/xfs_ioctl.c >>>> @@ -1587,7 +1587,12 @@ xfs_file_ioctl( >>>> XFS_IS_REALTIME_INODE(ip) ? >>>> mp->m_rtdev_targp : mp->m_ddev_targp; >>>> >>>> - da.d_mem = da.d_miniosz = 1 << target->bt_sshift; >>>> + /* >>>> + * Report device physical sector size as "optimal" minimum, >>>> + * unless blocksize is smaller than that. >>>> + */ >>>> + da.d_miniosz = min(target->bt_pssize, target->bt_bsize); >>> >>> Just grab the filesysetm block size from the xfs_mount: >>> >>> da.d_miniosz = min(target->bt_pssize, mp->m_sb.sb_blocksize); >>> >>>> + da.d_mem = da.d_miniosz; >>> >>> I'd suggest that this should be PAGE_SIZE - it's for memory buffer >>> alignment, not IO alignment, so using the IO alignment just seems >>> wrong to me... >> >> Ok. Was just sticking close to what we had before. >> >> So: >> da.d_miniosz = min(target->bt_pssize, mp->m_sb.sb_blocksize); >> da.d_mem = PAGE_SIZE; >> >> ? Then we can have a minimum IO size of 512, and a memory alignment of >> 4k, isn't that a little odd? >> >> (IOWs we could do 512-aligned memory before, right? What's the downside, >> or the value in changing it now?) > > We can do arbitrary byte aligned buffers if I understand > get_user_pages() correctly - it just maps the page under the buffer > into the kernel address space and then the bio is pointed at it. > AFAICT, the reason for the "memory buffer needs 512 byte alignment" > is simply that this is the minimum IO size supported. Actually, it's fs/direct-io.c which enforces this (not sure why I couldn't find that before), in do_blockdev_direct_IO(); the *enforced* minimum memory alignment is the size of the bev's logical block size. > However, for large IOs, 512 byte alignment is not really optimal. If > we don't align the buffer to PAGE_SIZE, then we have partial head > and tail pages, so for a 512k IO we need to map 129 pages into a bio > instead of 128. When you have hardware that can only handle 128 > segments in a DMA transfer, that means the 512k IO needs to be sent > in two IOs rather than one. Ok, but I have a bit of a problem with changing what XFS_IOC_DIOINFO reports. (I had originally thought to change the minimum IO size, but I have talked myself out of that, too). The xfsctl(3) manpage says that XFS_IOC_DIOINFO: "Get(s) information required to perform direct I/O on the specified file descriptor." and "the user’s data buffer must conform to the same type of constraints as required for accessing a raw disk partition." IOWs, the ioctl is documented as returning minimum, not optimal, requirements, and it has always been implemented as such. Changing its meaning now seems wrong. At least, I would not like to do so as part of this functional change; to do so would probably be best in a new ioctl which reports both minimum & optimal sizes. And at that point we should just do a vfs interface. :) Of course, applications don't have to use the minimum sizes reported by the ioctl; they are free to be smarter and do larger sizes and alignments. But if the ioctl was designed and documented to report required *minimums*, I think we should leave it as such. I'm going to resend the change, split up a bit more to separate cleanups from functional changes, and maybe we can discuss the ioctl change as a potential additional patch. Thanks, -Eric > There's quite a bit of hardware out there that have a limit of 128 > segments to each IO.... > > Cheers, > > Dave. > _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 0/3 V2] xfs: allow logical-sector sized O_DIRECT for any fs sector size 2014-01-15 17:59 [PATCH] xfs: allow logical-sector sized O_DIRECT for any fs sector size Eric Sandeen 2014-01-15 22:38 ` Dave Chinner @ 2014-01-17 20:22 ` Eric Sandeen 2014-01-17 20:23 ` [PATCH 1/3] xfs: clean up xfs_buftarg Eric Sandeen ` (2 more replies) 1 sibling, 3 replies; 16+ messages in thread From: Eric Sandeen @ 2014-01-17 20:22 UTC (permalink / raw) To: xfs-oss Resend of the previous patch, now in 3 parts, incorporating some of Dave's suggestions, and split up for SUPER-easy review. ;) I have explicitly not changed XFS_IOC_DIOINFO output for now; it still reports the actual minimum sizes and alignments which will be allowed by the filesystem (and block layer beneath it). Thanks, -Eric _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/3] xfs: clean up xfs_buftarg 2014-01-17 20:22 ` [PATCH 0/3 V2] " Eric Sandeen @ 2014-01-17 20:23 ` Eric Sandeen 2014-01-20 14:21 ` Brian Foster 2014-01-17 20:26 ` [PATCH 2/3] xfs: rename xfs_buftarg structure members Eric Sandeen 2014-01-17 20:28 ` [PATCH 3/3] xfs: allow logical-sector sized O_DIRECT IOs Eric Sandeen 2 siblings, 1 reply; 16+ messages in thread From: Eric Sandeen @ 2014-01-17 20:23 UTC (permalink / raw) To: xfs-oss Clean up the xfs_buftarg structure a bit: - remove bt_bsize, which is never used - replace bt_sshift with bt_ssize; we only ever shift it back to a size anyway Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9fccfb5..b664bce 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -445,7 +445,7 @@ _xfs_buf_find( numbytes = BBTOB(numblks); /* Check for IOs smaller than the sector size / not sector aligned */ - ASSERT(!(numbytes < (1 << btp->bt_sshift))); + ASSERT(!(numbytes < btp->bt_ssize)); ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); /* @@ -1599,8 +1599,7 @@ xfs_setsize_buftarg( unsigned int blocksize, unsigned int sectorsize) { - btp->bt_bsize = blocksize; - btp->bt_sshift = ffs(sectorsize) - 1; + btp->bt_ssize = sectorsize; btp->bt_smask = sectorsize - 1; if (set_blocksize(btp->bt_bdev, sectorsize)) { diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 1cf21a4..4ef949a 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -93,8 +93,7 @@ typedef struct xfs_buftarg { struct block_device *bt_bdev; struct backing_dev_info *bt_bdi; struct xfs_mount *bt_mount; - unsigned int bt_bsize; - unsigned int bt_sshift; + unsigned int bt_ssize; size_t bt_smask; /* LRU control structures */ diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 33ad9a7..39c38ee 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1587,7 +1587,7 @@ xfs_file_ioctl( XFS_IS_REALTIME_INODE(ip) ? 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_ssize; da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); if (copy_to_user(arg, &da, sizeof(da))) _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] xfs: clean up xfs_buftarg 2014-01-17 20:23 ` [PATCH 1/3] xfs: clean up xfs_buftarg Eric Sandeen @ 2014-01-20 14:21 ` Brian Foster 0 siblings, 0 replies; 16+ messages in thread From: Brian Foster @ 2014-01-20 14:21 UTC (permalink / raw) To: xfs On 01/17/2014 03:23 PM, Eric Sandeen wrote: > Clean up the xfs_buftarg structure a bit: > - remove bt_bsize, which is never used > - replace bt_sshift with bt_ssize; we only ever shift it back > to a size anyway > > Signed-off-by: Eric Sandeen <sandeen@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 9fccfb5..b664bce 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -445,7 +445,7 @@ _xfs_buf_find( > numbytes = BBTOB(numblks); > > /* Check for IOs smaller than the sector size / not sector aligned */ > - ASSERT(!(numbytes < (1 << btp->bt_sshift))); > + ASSERT(!(numbytes < btp->bt_ssize)); > ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); > > /* > @@ -1599,8 +1599,7 @@ xfs_setsize_buftarg( > unsigned int blocksize, > unsigned int sectorsize) > { > - btp->bt_bsize = blocksize; > - btp->bt_sshift = ffs(sectorsize) - 1; > + btp->bt_ssize = sectorsize; > btp->bt_smask = sectorsize - 1; > > if (set_blocksize(btp->bt_bdev, sectorsize)) { > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index 1cf21a4..4ef949a 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -93,8 +93,7 @@ typedef struct xfs_buftarg { > struct block_device *bt_bdev; > struct backing_dev_info *bt_bdi; > struct xfs_mount *bt_mount; > - unsigned int bt_bsize; > - unsigned int bt_sshift; > + unsigned int bt_ssize; > size_t bt_smask; > > /* LRU control structures */ > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 33ad9a7..39c38ee 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1587,7 +1587,7 @@ xfs_file_ioctl( > XFS_IS_REALTIME_INODE(ip) ? > 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_ssize; > da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); > > if (copy_to_user(arg, &da, sizeof(da))) > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/3] xfs: rename xfs_buftarg structure members 2014-01-17 20:22 ` [PATCH 0/3 V2] " Eric Sandeen 2014-01-17 20:23 ` [PATCH 1/3] xfs: clean up xfs_buftarg Eric Sandeen @ 2014-01-17 20:26 ` Eric Sandeen 2014-01-17 21:12 ` Roger Willcocks 2014-01-17 21:14 ` [PATCH 2/3 V2] " Eric Sandeen 2014-01-17 20:28 ` [PATCH 3/3] xfs: allow logical-sector sized O_DIRECT IOs Eric Sandeen 2 siblings, 2 replies; 16+ messages in thread From: Eric Sandeen @ 2014-01-17 20:26 UTC (permalink / raw) To: xfs-oss In preparation for adding new members to the xfs_buftarg structure, give these old ones more descriptive names: bt_ssize -> bt_meta_sectorsize bt_smask -> bt_meta_sectormask (Note the slight change in logic format in xfs_file_aio_read(() and xfs_file_dio_aio_write(); this was done just for formatting, and should not change actual logic or behavior.) Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index b664bce..a526f8d 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -445,8 +445,8 @@ _xfs_buf_find( numbytes = BBTOB(numblks); /* Check for IOs smaller than the sector size / not sector aligned */ - ASSERT(!(numbytes < btp->bt_ssize)); - ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); + ASSERT(!(numbytes < btp->bt_meta_sectorsize)); + ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_meta_sectormask)); /* * Corrupted block numbers can get through to here, unfortunately, so we @@ -1599,8 +1599,8 @@ xfs_setsize_buftarg( unsigned int blocksize, unsigned int sectorsize) { - btp->bt_ssize = sectorsize; - btp->bt_smask = sectorsize - 1; + btp->bt_meta_sectorsize = sectorsize; + btp->bt_meta_sectormask = sectorsize - 1; if (set_blocksize(btp->bt_bdev, sectorsize)) { char name[BDEVNAME_SIZE]; diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 4ef949a..d5d88dd 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -93,8 +93,8 @@ typedef struct xfs_buftarg { struct block_device *bt_bdev; struct backing_dev_info *bt_bdi; struct xfs_mount *bt_mount; - unsigned int bt_ssize; - size_t bt_smask; + unsigned int bt_meta_sectorsize; + size_t bt_meta_sectormask; /* LRU control structures */ struct shrinker bt_shrinker; diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 52c91e1..61a7de0 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -261,7 +261,7 @@ xfs_file_aio_read( xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - if ((pos & target->bt_smask) || (size & target->bt_smask)) { + if ((pos || size) & target->bt_meta_sectormask) { if (pos == i_size_read(inode)) return 0; return -XFS_ERROR(EINVAL); @@ -641,7 +641,7 @@ xfs_file_dio_aio_write( struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - if ((pos & target->bt_smask) || (count & target->bt_smask)) + if ((pos || count) & target->bt_meta_sectormask) return -XFS_ERROR(EINVAL); if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask)) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 39c38ee..64ca8e9 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1587,7 +1587,7 @@ xfs_file_ioctl( XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - da.d_mem = da.d_miniosz = target->bt_ssize; + da.d_mem = da.d_miniosz = target->bt_meta_sectorsize; da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); if (copy_to_user(arg, &da, sizeof(da))) _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] xfs: rename xfs_buftarg structure members 2014-01-17 20:26 ` [PATCH 2/3] xfs: rename xfs_buftarg structure members Eric Sandeen @ 2014-01-17 21:12 ` Roger Willcocks 2014-01-17 21:13 ` Eric Sandeen 2014-01-17 21:14 ` [PATCH 2/3 V2] " Eric Sandeen 1 sibling, 1 reply; 16+ messages in thread From: Roger Willcocks @ 2014-01-17 21:12 UTC (permalink / raw) To: Eric Sandeen; +Cc: xfs-oss - if ((pos & target->bt_smask) || (size & target->bt_smask)) { + if ((pos || size) & target->bt_meta_sectormask) { nope... || needs to be | (pos || size) yields a boolean Roger Willcocks <roger@filmlight.ltd.uk> _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] xfs: rename xfs_buftarg structure members 2014-01-17 21:12 ` Roger Willcocks @ 2014-01-17 21:13 ` Eric Sandeen 0 siblings, 0 replies; 16+ messages in thread From: Eric Sandeen @ 2014-01-17 21:13 UTC (permalink / raw) To: Roger Willcocks; +Cc: xfs-oss On 1/17/14, 3:12 PM, Roger Willcocks wrote: > - if ((pos & target->bt_smask) || (size & target->bt_smask)) { > + if ((pos || size) & target->bt_meta_sectormask) { > > nope... > > || needs to be | > > (pos || size) yields a boolean > > > > > Roger Willcocks <roger@filmlight.ltd.uk> > Oof. Brain fart. Thank you :) _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/3 V2] xfs: rename xfs_buftarg structure members 2014-01-17 20:26 ` [PATCH 2/3] xfs: rename xfs_buftarg structure members Eric Sandeen 2014-01-17 21:12 ` Roger Willcocks @ 2014-01-17 21:14 ` Eric Sandeen 2014-01-20 14:21 ` Brian Foster 1 sibling, 1 reply; 16+ messages in thread From: Eric Sandeen @ 2014-01-17 21:14 UTC (permalink / raw) To: xfs-oss In preparation for adding new members to the xfs_buftarg structure, give these old ones more descriptive names: bt_ssize -> bt_meta_sectorsize bt_smask -> bt_meta_sectormask (Note the slight change in logic format in xfs_file_aio_read(() and xfs_file_dio_aio_write(); this was done just for formatting, and should not change actual logic or behavior.) Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- V2: Really make the logic equivalent, thanks Roger! diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index b664bce..a526f8d 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -445,8 +445,8 @@ _xfs_buf_find( numbytes = BBTOB(numblks); /* Check for IOs smaller than the sector size / not sector aligned */ - ASSERT(!(numbytes < btp->bt_ssize)); - ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); + ASSERT(!(numbytes < btp->bt_meta_sectorsize)); + ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_meta_sectormask)); /* * Corrupted block numbers can get through to here, unfortunately, so we @@ -1599,8 +1599,8 @@ xfs_setsize_buftarg( unsigned int blocksize, unsigned int sectorsize) { - btp->bt_ssize = sectorsize; - btp->bt_smask = sectorsize - 1; + btp->bt_meta_sectorsize = sectorsize; + btp->bt_meta_sectormask = sectorsize - 1; if (set_blocksize(btp->bt_bdev, sectorsize)) { char name[BDEVNAME_SIZE]; diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 4ef949a..d5d88dd 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -93,8 +93,8 @@ typedef struct xfs_buftarg { struct block_device *bt_bdev; struct backing_dev_info *bt_bdi; struct xfs_mount *bt_mount; - unsigned int bt_ssize; - size_t bt_smask; + unsigned int bt_meta_sectorsize; + size_t bt_meta_sectormask; /* LRU control structures */ struct shrinker bt_shrinker; diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 52c91e1..61a7de0 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -261,7 +261,7 @@ xfs_file_aio_read( xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - if ((pos & target->bt_smask) || (size & target->bt_smask)) { + if ((pos | size) & target->bt_meta_sectormask) { if (pos == i_size_read(inode)) return 0; return -XFS_ERROR(EINVAL); @@ -641,7 +641,7 @@ xfs_file_dio_aio_write( struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - if ((pos & target->bt_smask) || (count & target->bt_smask)) + if ((pos | count) & target->bt_meta_sectormask) return -XFS_ERROR(EINVAL); if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask)) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 39c38ee..64ca8e9 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1587,7 +1587,7 @@ xfs_file_ioctl( XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - da.d_mem = da.d_miniosz = target->bt_ssize; + da.d_mem = da.d_miniosz = target->bt_meta_sectorsize; da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); if (copy_to_user(arg, &da, sizeof(da))) _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3 V2] xfs: rename xfs_buftarg structure members 2014-01-17 21:14 ` [PATCH 2/3 V2] " Eric Sandeen @ 2014-01-20 14:21 ` Brian Foster 0 siblings, 0 replies; 16+ messages in thread From: Brian Foster @ 2014-01-20 14:21 UTC (permalink / raw) To: xfs On 01/17/2014 04:14 PM, Eric Sandeen wrote: > In preparation for adding new members to the xfs_buftarg > structure, give these old ones more descriptive names: > > bt_ssize -> bt_meta_sectorsize > bt_smask -> bt_meta_sectormask > > (Note the slight change in logic format in xfs_file_aio_read(() > and xfs_file_dio_aio_write(); this was done just for formatting, > and should not change actual logic or behavior.) > > Signed-off-by: Eric Sandeen <sandeen@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > > V2: Really make the logic equivalent, thanks Roger! > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index b664bce..a526f8d 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -445,8 +445,8 @@ _xfs_buf_find( > numbytes = BBTOB(numblks); > > /* Check for IOs smaller than the sector size / not sector aligned */ > - ASSERT(!(numbytes < btp->bt_ssize)); > - ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); > + ASSERT(!(numbytes < btp->bt_meta_sectorsize)); > + ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_meta_sectormask)); > > /* > * Corrupted block numbers can get through to here, unfortunately, so we > @@ -1599,8 +1599,8 @@ xfs_setsize_buftarg( > unsigned int blocksize, > unsigned int sectorsize) > { > - btp->bt_ssize = sectorsize; > - btp->bt_smask = sectorsize - 1; > + btp->bt_meta_sectorsize = sectorsize; > + btp->bt_meta_sectormask = sectorsize - 1; > > if (set_blocksize(btp->bt_bdev, sectorsize)) { > char name[BDEVNAME_SIZE]; > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index 4ef949a..d5d88dd 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -93,8 +93,8 @@ typedef struct xfs_buftarg { > struct block_device *bt_bdev; > struct backing_dev_info *bt_bdi; > struct xfs_mount *bt_mount; > - unsigned int bt_ssize; > - size_t bt_smask; > + unsigned int bt_meta_sectorsize; > + size_t bt_meta_sectormask; > > /* LRU control structures */ > struct shrinker bt_shrinker; > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 52c91e1..61a7de0 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -261,7 +261,7 @@ xfs_file_aio_read( > xfs_buftarg_t *target = > XFS_IS_REALTIME_INODE(ip) ? > mp->m_rtdev_targp : mp->m_ddev_targp; > - if ((pos & target->bt_smask) || (size & target->bt_smask)) { > + if ((pos | size) & target->bt_meta_sectormask) { > if (pos == i_size_read(inode)) > return 0; > return -XFS_ERROR(EINVAL); > @@ -641,7 +641,7 @@ xfs_file_dio_aio_write( > struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? > mp->m_rtdev_targp : mp->m_ddev_targp; > > - if ((pos & target->bt_smask) || (count & target->bt_smask)) > + if ((pos | count) & target->bt_meta_sectormask) > return -XFS_ERROR(EINVAL); > > if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask)) > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 39c38ee..64ca8e9 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1587,7 +1587,7 @@ xfs_file_ioctl( > XFS_IS_REALTIME_INODE(ip) ? > mp->m_rtdev_targp : mp->m_ddev_targp; > > - da.d_mem = da.d_miniosz = target->bt_ssize; > + da.d_mem = da.d_miniosz = target->bt_meta_sectorsize; > da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); > > if (copy_to_user(arg, &da, sizeof(da))) > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 3/3] xfs: allow logical-sector sized O_DIRECT IOs 2014-01-17 20:22 ` [PATCH 0/3 V2] " Eric Sandeen 2014-01-17 20:23 ` [PATCH 1/3] xfs: clean up xfs_buftarg Eric Sandeen 2014-01-17 20:26 ` [PATCH 2/3] xfs: rename xfs_buftarg structure members Eric Sandeen @ 2014-01-17 20:28 ` Eric Sandeen 2014-01-20 14:21 ` Brian Foster 2 siblings, 1 reply; 16+ messages in thread From: Eric Sandeen @ 2014-01-17 20:28 UTC (permalink / raw) To: xfs-oss Some time ago, mkfs.xfs started picking the storage physical sector size as the default filesystem "sector size" in order to avoid RMW costs incurred by doing IOs at logical sector size alignments. However, this means that for a filesystem made with i.e. a 4k sector size on an "advanced format" 4k/512 disk, 512-byte direct IOs are no longer allowed. This means that XFS has essentially turned this AF drive into a hard 4K device, from the filesystem on up. XFS's mkfs-specified "sector size" is really just controlling the minimum size & alignment of filesystem metadata. There is no real need to tightly couple XFS's minimal metadata size to the minimum allowed direct IO size; XFS can continue doing metadata in optimal sizes, but still allow smaller DIOs for apps which issue them, for whatever reason. This patch adds new information to the xfs_buftarg, so that we now track 2 sizes: 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 used internally by the file system for metadata alignment and IOs. The second is used for the minimum allowed direct IO size and alignment. This has passed xfstests on filesystems made with 4k sectors, including when run under the patch I sent to ignore XFS_IOC_DIOINFO, and issue 512 DIOs anyway. I also directly tested end of block behavior on preallocated, sparse, and existing files when we do a 512 IO into a 4k file on a 4k-sector filesystem, to be sure there were no unexpected behaviors. Signed-off-by: Eric Sandeen <sandeen@redhat.com> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index a526f8d..5175711 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1599,6 +1599,7 @@ xfs_setsize_buftarg( unsigned int blocksize, unsigned int sectorsize) { + /* Set up metadata sector size info */ btp->bt_meta_sectorsize = sectorsize; btp->bt_meta_sectormask = sectorsize - 1; @@ -1613,6 +1614,10 @@ xfs_setsize_buftarg( 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; } diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index d5d88dd..9953395 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -88,6 +88,19 @@ typedef unsigned int xfs_buf_flags_t; */ #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 { dev_t bt_dev; struct block_device *bt_bdev; @@ -95,6 +108,8 @@ typedef struct xfs_buftarg { struct xfs_mount *bt_mount; unsigned int bt_meta_sectorsize; size_t bt_meta_sectormask; + size_t bt_logical_sectorsize; + size_t bt_logical_sectormask; /* LRU control structures */ struct shrinker bt_shrinker; diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 61a7de0..5507420 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -261,7 +261,8 @@ xfs_file_aio_read( xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - if ((pos || size) & target->bt_meta_sectormask) { + /* DIO must be aligned to device logical sector size */ + if ((pos || size) & target->bt_logical_sectormask) { if (pos == i_size_read(inode)) return 0; return -XFS_ERROR(EINVAL); @@ -641,9 +642,11 @@ xfs_file_dio_aio_write( struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - if ((pos || count) & target->bt_meta_sectormask) + /* DIO must be aligned to device logical sector size */ + if ((pos || count) & target->bt_logical_sectormask) return -XFS_ERROR(EINVAL); + /* "unaligned" here means not aligned to a filesystem block */ if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask)) unaligned_io = 1; diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 64ca8e9..f7ac335 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1587,7 +1587,7 @@ xfs_file_ioctl( XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; - da.d_mem = da.d_miniosz = target->bt_meta_sectorsize; + da.d_mem = da.d_miniosz = target->bt_logical_sectorsize; da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); if (copy_to_user(arg, &da, sizeof(da))) _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 3/3] xfs: allow logical-sector sized O_DIRECT IOs 2014-01-17 20:28 ` [PATCH 3/3] xfs: allow logical-sector sized O_DIRECT IOs Eric Sandeen @ 2014-01-20 14:21 ` Brian Foster 2014-01-20 14:53 ` Eric Sandeen 0 siblings, 1 reply; 16+ messages in thread From: Brian Foster @ 2014-01-20 14:21 UTC (permalink / raw) To: Eric Sandeen, xfs-oss On 01/17/2014 03:28 PM, Eric Sandeen wrote: > Some time ago, mkfs.xfs started picking the storage physical > sector size as the default filesystem "sector size" in order > to avoid RMW costs incurred by doing IOs at logical sector > size alignments. > > However, this means that for a filesystem made with i.e. > a 4k sector size on an "advanced format" 4k/512 disk, > 512-byte direct IOs are no longer allowed. This means > that XFS has essentially turned this AF drive into a hard > 4K device, from the filesystem on up. > > XFS's mkfs-specified "sector size" is really just controlling > the minimum size & alignment of filesystem metadata. > > There is no real need to tightly couple XFS's minimal > metadata size to the minimum allowed direct IO size; > XFS can continue doing metadata in optimal sizes, but > still allow smaller DIOs for apps which issue them, > for whatever reason. > > This patch adds new information to the xfs_buftarg, so that > we now track 2 sizes: > > 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 used internally by the file system for metadata > alignment and IOs. > The second is used for the minimum allowed direct IO size and > alignment. > > This has passed xfstests on filesystems made with 4k sectors, > including when run under the patch I sent to ignore > XFS_IOC_DIOINFO, and issue 512 DIOs anyway. I also directly > tested end of block behavior on preallocated, sparse, and > existing files when we do a 512 IO into a 4k file on a > 4k-sector filesystem, to be sure there were no unexpected > behaviors. > > Signed-off-by: Eric Sandeen <sandeen@redhat.com> > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index a526f8d..5175711 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1599,6 +1599,7 @@ xfs_setsize_buftarg( > unsigned int blocksize, > unsigned int sectorsize) > { > + /* Set up metadata sector size info */ > btp->bt_meta_sectorsize = sectorsize; > btp->bt_meta_sectormask = sectorsize - 1; > > @@ -1613,6 +1614,10 @@ xfs_setsize_buftarg( > 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; > } > > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index d5d88dd..9953395 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -88,6 +88,19 @@ typedef unsigned int xfs_buf_flags_t; > */ > #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 { > dev_t bt_dev; > struct block_device *bt_bdev; > @@ -95,6 +108,8 @@ typedef struct xfs_buftarg { > struct xfs_mount *bt_mount; > unsigned int bt_meta_sectorsize; > size_t bt_meta_sectormask; > + size_t bt_logical_sectorsize; > + size_t bt_logical_sectormask; > > /* LRU control structures */ > struct shrinker bt_shrinker; > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 61a7de0..5507420 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -261,7 +261,8 @@ xfs_file_aio_read( > xfs_buftarg_t *target = > XFS_IS_REALTIME_INODE(ip) ? > mp->m_rtdev_targp : mp->m_ddev_targp; > - if ((pos || size) & target->bt_meta_sectormask) { > + /* DIO must be aligned to device logical sector size */ > + if ((pos || size) & target->bt_logical_sectormask) { > if (pos == i_size_read(inode)) > return 0; > return -XFS_ERROR(EINVAL); > @@ -641,9 +642,11 @@ xfs_file_dio_aio_write( > struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? > mp->m_rtdev_targp : mp->m_ddev_targp; > > - if ((pos || count) & target->bt_meta_sectormask) > + /* DIO must be aligned to device logical sector size */ > + if ((pos || count) & target->bt_logical_sectormask) > return -XFS_ERROR(EINVAL); > Looks like this requires a v2 to preserve the fixes made in v2 of patch 2, unless I missed a newer version of this somewhere. Brian > + /* "unaligned" here means not aligned to a filesystem block */ > if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask)) > unaligned_io = 1; > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 64ca8e9..f7ac335 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1587,7 +1587,7 @@ xfs_file_ioctl( > XFS_IS_REALTIME_INODE(ip) ? > mp->m_rtdev_targp : mp->m_ddev_targp; > > - da.d_mem = da.d_miniosz = target->bt_meta_sectorsize; > + da.d_mem = da.d_miniosz = target->bt_logical_sectorsize; > da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); > > if (copy_to_user(arg, &da, sizeof(da))) > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 3/3] xfs: allow logical-sector sized O_DIRECT IOs 2014-01-20 14:21 ` Brian Foster @ 2014-01-20 14:53 ` Eric Sandeen 0 siblings, 0 replies; 16+ messages in thread From: Eric Sandeen @ 2014-01-20 14:53 UTC (permalink / raw) To: Brian Foster, xfs-oss On 1/20/14, 8:21 AM, Brian Foster wrote: > On 01/17/2014 03:28 PM, Eric Sandeen wrote: >> Some time ago, mkfs.xfs started picking the storage physical >> sector size as the default filesystem "sector size" in order >> to avoid RMW costs incurred by doing IOs at logical sector >> size alignments. >> >> However, this means that for a filesystem made with i.e. >> a 4k sector size on an "advanced format" 4k/512 disk, >> 512-byte direct IOs are no longer allowed. This means >> that XFS has essentially turned this AF drive into a hard >> 4K device, from the filesystem on up. >> >> XFS's mkfs-specified "sector size" is really just controlling >> the minimum size & alignment of filesystem metadata. >> >> There is no real need to tightly couple XFS's minimal >> metadata size to the minimum allowed direct IO size; >> XFS can continue doing metadata in optimal sizes, but >> still allow smaller DIOs for apps which issue them, >> for whatever reason. >> >> This patch adds new information to the xfs_buftarg, so that >> we now track 2 sizes: >> >> 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 used internally by the file system for metadata >> alignment and IOs. >> The second is used for the minimum allowed direct IO size and >> alignment. >> >> This has passed xfstests on filesystems made with 4k sectors, >> including when run under the patch I sent to ignore >> XFS_IOC_DIOINFO, and issue 512 DIOs anyway. I also directly >> tested end of block behavior on preallocated, sparse, and >> existing files when we do a 512 IO into a 4k file on a >> 4k-sector filesystem, to be sure there were no unexpected >> behaviors. >> >> Signed-off-by: Eric Sandeen <sandeen@redhat.com> >> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c >> index a526f8d..5175711 100644 >> --- a/fs/xfs/xfs_buf.c >> +++ b/fs/xfs/xfs_buf.c >> @@ -1599,6 +1599,7 @@ xfs_setsize_buftarg( >> unsigned int blocksize, >> unsigned int sectorsize) >> { >> + /* Set up metadata sector size info */ >> btp->bt_meta_sectorsize = sectorsize; >> btp->bt_meta_sectormask = sectorsize - 1; >> >> @@ -1613,6 +1614,10 @@ xfs_setsize_buftarg( >> 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; >> } >> >> diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h >> index d5d88dd..9953395 100644 >> --- a/fs/xfs/xfs_buf.h >> +++ b/fs/xfs/xfs_buf.h >> @@ -88,6 +88,19 @@ typedef unsigned int xfs_buf_flags_t; >> */ >> #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 { >> dev_t bt_dev; >> struct block_device *bt_bdev; >> @@ -95,6 +108,8 @@ typedef struct xfs_buftarg { >> struct xfs_mount *bt_mount; >> unsigned int bt_meta_sectorsize; >> size_t bt_meta_sectormask; >> + size_t bt_logical_sectorsize; >> + size_t bt_logical_sectormask; >> >> /* LRU control structures */ >> struct shrinker bt_shrinker; >> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c >> index 61a7de0..5507420 100644 >> --- a/fs/xfs/xfs_file.c >> +++ b/fs/xfs/xfs_file.c >> @@ -261,7 +261,8 @@ xfs_file_aio_read( >> xfs_buftarg_t *target = >> XFS_IS_REALTIME_INODE(ip) ? >> mp->m_rtdev_targp : mp->m_ddev_targp; >> - if ((pos || size) & target->bt_meta_sectormask) { >> + /* DIO must be aligned to device logical sector size */ >> + if ((pos || size) & target->bt_logical_sectormask) { >> if (pos == i_size_read(inode)) >> return 0; >> return -XFS_ERROR(EINVAL); >> @@ -641,9 +642,11 @@ xfs_file_dio_aio_write( >> struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? >> mp->m_rtdev_targp : mp->m_ddev_targp; >> >> - if ((pos || count) & target->bt_meta_sectormask) >> + /* DIO must be aligned to device logical sector size */ >> + if ((pos || count) & target->bt_logical_sectormask) >> return -XFS_ERROR(EINVAL); >> > > Looks like this requires a v2 to preserve the fixes made in v2 of patch > 2, unless I missed a newer version of this somewhere. You're right. 2 diligence demerits for me. :( (Hopefully it just wouldn't have applied...) Maybe I'll just resend the whole series. Thanks, -Eric _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2014-01-20 14:53 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-01-15 17:59 [PATCH] xfs: allow logical-sector sized O_DIRECT for any fs sector size Eric Sandeen 2014-01-15 22:38 ` Dave Chinner 2014-01-15 22:52 ` Eric Sandeen 2014-01-16 23:21 ` Dave Chinner 2014-01-17 17:35 ` Eric Sandeen 2014-01-17 20:22 ` [PATCH 0/3 V2] " Eric Sandeen 2014-01-17 20:23 ` [PATCH 1/3] xfs: clean up xfs_buftarg Eric Sandeen 2014-01-20 14:21 ` Brian Foster 2014-01-17 20:26 ` [PATCH 2/3] xfs: rename xfs_buftarg structure members Eric Sandeen 2014-01-17 21:12 ` Roger Willcocks 2014-01-17 21:13 ` Eric Sandeen 2014-01-17 21:14 ` [PATCH 2/3 V2] " Eric Sandeen 2014-01-20 14:21 ` Brian Foster 2014-01-17 20:28 ` [PATCH 3/3] xfs: allow logical-sector sized O_DIRECT IOs Eric Sandeen 2014-01-20 14:21 ` Brian Foster 2014-01-20 14:53 ` Eric Sandeen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).