From: Brian Foster <bfoster@redhat.com>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-fsdevel@vger.kernel.org, willy@linux.intel.com,
jack@suse.cz, xfs@oss.sgi.com
Subject: Re: [PATCH 8/8] xfs: add initial DAX support
Date: Mon, 6 Apr 2015 15:00:31 -0400 [thread overview]
Message-ID: <20150406190031.GF58965@bfoster.bfoster> (raw)
In-Reply-To: <1427194266-2885-9-git-send-email-david@fromorbit.com>
On Tue, Mar 24, 2015 at 09:51:06PM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> Add initial DAX support to XFS. To do this we need a new mount
> option to turn DAX on filesystem, and we need to propagate thi into
> the inode flags whenever an inode is instantiated so that the
> per-inode checks throughout the code Do The Right Thing.
>
> There are still some things remaining to be done:
>
> - needs per-inode flags to mark inodes as DAX enabled, and
> an inheritance flag to enable automatic filesystem
> propagation of the property
> - fails occasionally with zero length writes instead of
> ENOSPC errors, so error propagation inside/from the DAX
> code need work
> - occasionally creates two extents rather than a single
> larger extent like non-dax filesystems.
> - much more testing
>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/xfs_iops.c | 24 ++++++++++++------------
> fs/xfs/xfs_mount.h | 2 ++
> fs/xfs/xfs_super.c | 25 +++++++++++++++++++++++--
> 3 files changed, 37 insertions(+), 14 deletions(-)
>
> diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
> index 9ca5352..695d857 100644
> --- a/fs/xfs/xfs_iops.c
> +++ b/fs/xfs/xfs_iops.c
> @@ -1195,22 +1195,22 @@ xfs_diflags_to_iflags(
> struct inode *inode,
> struct xfs_inode *ip)
> {
> - if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
> + uint16_t flags = ip->i_d.di_flags;
> +
> + inode->i_flags &= ~(S_IMMUTABLE | S_APPEND | S_SYNC |
> + S_NOATIME | S_DAX);
> +
> + if (flags & XFS_DIFLAG_IMMUTABLE)
> inode->i_flags |= S_IMMUTABLE;
> - else
> - inode->i_flags &= ~S_IMMUTABLE;
> - if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
> + if (flags & XFS_DIFLAG_APPEND)
> inode->i_flags |= S_APPEND;
> - else
> - inode->i_flags &= ~S_APPEND;
> - if (ip->i_d.di_flags & XFS_DIFLAG_SYNC)
> + if (flags & XFS_DIFLAG_SYNC)
> inode->i_flags |= S_SYNC;
> - else
> - inode->i_flags &= ~S_SYNC;
> - if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME)
> + if (flags & XFS_DIFLAG_NOATIME)
> inode->i_flags |= S_NOATIME;
> - else
> - inode->i_flags &= ~S_NOATIME;
> + /* XXX: Also needs an on-disk per inode flag! */
> + if (ip->i_mount->m_flags & XFS_MOUNT_DAX)
> + inode->i_flags |= S_DAX;
This is a temporary hack until we have some kind of inode flag
inheritance mechanism as mentioned in the commit log, correct?
> }
>
> /*
> diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
> index 8c995a2..cd44e88 100644
> --- a/fs/xfs/xfs_mount.h
> +++ b/fs/xfs/xfs_mount.h
> @@ -179,6 +179,8 @@ typedef struct xfs_mount {
> allocator */
> #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */
>
> +#define XFS_MOUNT_DAX (1ULL << 62) /* TEST ONLY! */
> +
>
> /*
> * Default minimum read and write sizes.
> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> index 3ad0b17..0f26d7a 100644
> --- a/fs/xfs/xfs_super.c
> +++ b/fs/xfs/xfs_super.c
> @@ -112,6 +112,8 @@ static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */
> #define MNTOPT_DISCARD "discard" /* Discard unused blocks */
> #define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */
>
> +#define MNTOPT_DAX "dax" /* Enable direct access to bdev pages */
> +
> /*
> * Table driven mount option parser.
> *
> @@ -363,6 +365,10 @@ xfs_parseargs(
> mp->m_flags |= XFS_MOUNT_DISCARD;
> } else if (!strcmp(this_char, MNTOPT_NODISCARD)) {
> mp->m_flags &= ~XFS_MOUNT_DISCARD;
> +#ifdef CONFIG_FS_DAX
> + } else if (!strcmp(this_char, MNTOPT_DAX)) {
> + mp->m_flags |= XFS_MOUNT_DAX;
> +#endif
Something like what we do for !CONFIG_XFS_QUOTA just a few lines below
might be a bit nicer. Then we can have a slightly more useful error
message.
> } else {
> xfs_warn(mp, "unknown mount option [%s].", this_char);
> return -EINVAL;
> @@ -452,8 +458,8 @@ done:
> }
>
> struct proc_xfs_info {
> - int flag;
> - char *str;
> + uint64_t flag;
> + char *str;
> };
>
> STATIC int
> @@ -474,6 +480,7 @@ xfs_showargs(
> { XFS_MOUNT_GRPID, "," MNTOPT_GRPID },
> { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD },
> { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE },
> + { XFS_MOUNT_DAX, "," MNTOPT_DAX },
> { 0, NULL }
> };
> static struct proc_xfs_info xfs_info_unset[] = {
> @@ -1501,6 +1508,20 @@ xfs_fs_fill_super(
> if (XFS_SB_VERSION_NUM(&mp->m_sb) == XFS_SB_VERSION_5)
> sb->s_flags |= MS_I_VERSION;
>
> + if (mp->m_flags & XFS_MOUNT_DAX) {
> + xfs_warn(mp,
> + "DAX enabled. Warning: EXPERIMENTAL, use at your own risk");
> + if (sb->s_blocksize != PAGE_SIZE) {
> + xfs_alert(mp,
> + "Filesystem block size invalid for DAX Turning DAX off.");
> + mp->m_flags &= ~XFS_MOUNT_DAX;
> + } else if (!sb->s_bdev->bd_disk->fops->direct_access) {
> + xfs_alert(mp,
> + "Block device does not support DAX Turning DAX off.");
> + mp->m_flags &= ~XFS_MOUNT_DAX;
> + }
Missing period in both error messages above. ;)
Brian
> + }
> +
> error = xfs_mountfs(mp);
> if (error)
> goto out_filestream_unmount;
> --
> 2.0.0
>
> _______________________________________________
> 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
WARNING: multiple messages have this Message-ID (diff)
From: Brian Foster <bfoster@redhat.com>
To: Dave Chinner <david@fromorbit.com>
Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org,
willy@linux.intel.com, jack@suse.cz
Subject: Re: [PATCH 8/8] xfs: add initial DAX support
Date: Mon, 6 Apr 2015 15:00:31 -0400 [thread overview]
Message-ID: <20150406190031.GF58965@bfoster.bfoster> (raw)
In-Reply-To: <1427194266-2885-9-git-send-email-david@fromorbit.com>
On Tue, Mar 24, 2015 at 09:51:06PM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> Add initial DAX support to XFS. To do this we need a new mount
> option to turn DAX on filesystem, and we need to propagate thi into
> the inode flags whenever an inode is instantiated so that the
> per-inode checks throughout the code Do The Right Thing.
>
> There are still some things remaining to be done:
>
> - needs per-inode flags to mark inodes as DAX enabled, and
> an inheritance flag to enable automatic filesystem
> propagation of the property
> - fails occasionally with zero length writes instead of
> ENOSPC errors, so error propagation inside/from the DAX
> code need work
> - occasionally creates two extents rather than a single
> larger extent like non-dax filesystems.
> - much more testing
>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/xfs_iops.c | 24 ++++++++++++------------
> fs/xfs/xfs_mount.h | 2 ++
> fs/xfs/xfs_super.c | 25 +++++++++++++++++++++++--
> 3 files changed, 37 insertions(+), 14 deletions(-)
>
> diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
> index 9ca5352..695d857 100644
> --- a/fs/xfs/xfs_iops.c
> +++ b/fs/xfs/xfs_iops.c
> @@ -1195,22 +1195,22 @@ xfs_diflags_to_iflags(
> struct inode *inode,
> struct xfs_inode *ip)
> {
> - if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
> + uint16_t flags = ip->i_d.di_flags;
> +
> + inode->i_flags &= ~(S_IMMUTABLE | S_APPEND | S_SYNC |
> + S_NOATIME | S_DAX);
> +
> + if (flags & XFS_DIFLAG_IMMUTABLE)
> inode->i_flags |= S_IMMUTABLE;
> - else
> - inode->i_flags &= ~S_IMMUTABLE;
> - if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
> + if (flags & XFS_DIFLAG_APPEND)
> inode->i_flags |= S_APPEND;
> - else
> - inode->i_flags &= ~S_APPEND;
> - if (ip->i_d.di_flags & XFS_DIFLAG_SYNC)
> + if (flags & XFS_DIFLAG_SYNC)
> inode->i_flags |= S_SYNC;
> - else
> - inode->i_flags &= ~S_SYNC;
> - if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME)
> + if (flags & XFS_DIFLAG_NOATIME)
> inode->i_flags |= S_NOATIME;
> - else
> - inode->i_flags &= ~S_NOATIME;
> + /* XXX: Also needs an on-disk per inode flag! */
> + if (ip->i_mount->m_flags & XFS_MOUNT_DAX)
> + inode->i_flags |= S_DAX;
This is a temporary hack until we have some kind of inode flag
inheritance mechanism as mentioned in the commit log, correct?
> }
>
> /*
> diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
> index 8c995a2..cd44e88 100644
> --- a/fs/xfs/xfs_mount.h
> +++ b/fs/xfs/xfs_mount.h
> @@ -179,6 +179,8 @@ typedef struct xfs_mount {
> allocator */
> #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */
>
> +#define XFS_MOUNT_DAX (1ULL << 62) /* TEST ONLY! */
> +
>
> /*
> * Default minimum read and write sizes.
> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> index 3ad0b17..0f26d7a 100644
> --- a/fs/xfs/xfs_super.c
> +++ b/fs/xfs/xfs_super.c
> @@ -112,6 +112,8 @@ static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */
> #define MNTOPT_DISCARD "discard" /* Discard unused blocks */
> #define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */
>
> +#define MNTOPT_DAX "dax" /* Enable direct access to bdev pages */
> +
> /*
> * Table driven mount option parser.
> *
> @@ -363,6 +365,10 @@ xfs_parseargs(
> mp->m_flags |= XFS_MOUNT_DISCARD;
> } else if (!strcmp(this_char, MNTOPT_NODISCARD)) {
> mp->m_flags &= ~XFS_MOUNT_DISCARD;
> +#ifdef CONFIG_FS_DAX
> + } else if (!strcmp(this_char, MNTOPT_DAX)) {
> + mp->m_flags |= XFS_MOUNT_DAX;
> +#endif
Something like what we do for !CONFIG_XFS_QUOTA just a few lines below
might be a bit nicer. Then we can have a slightly more useful error
message.
> } else {
> xfs_warn(mp, "unknown mount option [%s].", this_char);
> return -EINVAL;
> @@ -452,8 +458,8 @@ done:
> }
>
> struct proc_xfs_info {
> - int flag;
> - char *str;
> + uint64_t flag;
> + char *str;
> };
>
> STATIC int
> @@ -474,6 +480,7 @@ xfs_showargs(
> { XFS_MOUNT_GRPID, "," MNTOPT_GRPID },
> { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD },
> { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE },
> + { XFS_MOUNT_DAX, "," MNTOPT_DAX },
> { 0, NULL }
> };
> static struct proc_xfs_info xfs_info_unset[] = {
> @@ -1501,6 +1508,20 @@ xfs_fs_fill_super(
> if (XFS_SB_VERSION_NUM(&mp->m_sb) == XFS_SB_VERSION_5)
> sb->s_flags |= MS_I_VERSION;
>
> + if (mp->m_flags & XFS_MOUNT_DAX) {
> + xfs_warn(mp,
> + "DAX enabled. Warning: EXPERIMENTAL, use at your own risk");
> + if (sb->s_blocksize != PAGE_SIZE) {
> + xfs_alert(mp,
> + "Filesystem block size invalid for DAX Turning DAX off.");
> + mp->m_flags &= ~XFS_MOUNT_DAX;
> + } else if (!sb->s_bdev->bd_disk->fops->direct_access) {
> + xfs_alert(mp,
> + "Block device does not support DAX Turning DAX off.");
> + mp->m_flags &= ~XFS_MOUNT_DAX;
> + }
Missing period in both error messages above. ;)
Brian
> + }
> +
> error = xfs_mountfs(mp);
> if (error)
> goto out_filestream_unmount;
> --
> 2.0.0
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2015-04-06 19:00 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-24 10:50 [PATCH 0/8 v2] xfs: DAX support Dave Chinner
2015-03-24 10:50 ` Dave Chinner
2015-03-24 10:50 ` [PATCH 1/8] xfs: mmap lock needs to be inside freeze protection Dave Chinner
2015-04-01 14:34 ` Jan Kara
2015-04-01 14:34 ` Jan Kara
2015-04-06 17:48 ` Brian Foster
2015-04-06 17:48 ` Brian Foster
2015-03-24 10:51 ` [PATCH 2/8] dax: don't abuse get_block mapping for endio callbacks Dave Chinner
2015-03-24 10:51 ` Dave Chinner
2015-04-01 14:53 ` Jan Kara
2015-04-01 14:53 ` Jan Kara
2015-03-24 10:51 ` [PATCH 3/8] dax: expose __dax_fault for filesystems with locking constraints Dave Chinner
2015-03-24 10:51 ` Dave Chinner
2015-04-01 15:07 ` Jan Kara
2015-04-01 15:07 ` Jan Kara
2015-03-24 10:51 ` [PATCH 4/8] xfs: add DAX block zeroing support Dave Chinner
2015-03-24 10:51 ` Dave Chinner
2015-04-06 17:48 ` Brian Foster
2015-04-06 17:48 ` Brian Foster
2015-03-24 10:51 ` [PATCH 5/8] xfs: add DAX file operations support Dave Chinner
2015-03-24 10:51 ` Dave Chinner
2015-03-24 12:08 ` Boaz Harrosh
2015-03-24 12:08 ` Boaz Harrosh
2015-03-24 12:24 ` Boaz Harrosh
2015-03-24 12:24 ` Boaz Harrosh
2015-03-24 21:17 ` Dave Chinner
2015-03-24 21:17 ` Dave Chinner
2015-03-25 8:47 ` Boaz Harrosh
2015-03-25 8:47 ` Boaz Harrosh
2015-04-06 17:49 ` Brian Foster
2015-04-06 17:49 ` Brian Foster
2015-04-16 8:29 ` Dave Chinner
2015-04-16 8:29 ` Dave Chinner
2015-04-16 9:33 ` Boaz Harrosh
2015-04-16 9:33 ` Boaz Harrosh
2015-04-16 11:47 ` Dave Chinner
2015-04-16 11:47 ` Dave Chinner
2015-03-24 10:51 ` [PATCH 6/8] xfs: add DAX truncate support Dave Chinner
2015-03-24 10:51 ` Dave Chinner
2015-04-06 17:49 ` Brian Foster
2015-04-06 17:49 ` Brian Foster
2015-03-24 10:51 ` [PATCH 7/8] xfs: add DAX IO path support Dave Chinner
2015-03-24 10:51 ` Dave Chinner
2015-04-06 17:49 ` Brian Foster
2015-04-06 17:49 ` Brian Foster
2015-04-16 8:54 ` Dave Chinner
2015-04-16 8:54 ` Dave Chinner
2015-03-24 10:51 ` [PATCH 8/8] xfs: add initial DAX support Dave Chinner
2015-03-24 10:51 ` Dave Chinner
2015-03-24 12:52 ` Boaz Harrosh
2015-03-24 12:52 ` Boaz Harrosh
2015-03-24 21:25 ` Dave Chinner
2015-03-24 21:25 ` Dave Chinner
2015-03-25 9:14 ` Boaz Harrosh
2015-03-25 9:14 ` Boaz Harrosh
2015-04-06 19:00 ` Brian Foster [this message]
2015-04-06 19:00 ` Brian Foster
-- strict thread matches above, loose matches on Subject: below --
2015-05-28 23:45 [PATCH 0/8 v3] xfs: " Dave Chinner
2015-05-28 23:45 ` [PATCH 8/8] xfs: add initial " Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150406190031.GF58965@bfoster.bfoster \
--to=bfoster@redhat.com \
--cc=david@fromorbit.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=willy@linux.intel.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.