From: Boaz Harrosh <boaz@plexistor.com>
To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com
Cc: linux-fsdevel@vger.kernel.org, willy@linux.intel.com, jack@suse.cz
Subject: Re: [PATCH 8/8] xfs: add initial DAX support
Date: Tue, 24 Mar 2015 14:52:48 +0200 [thread overview]
Message-ID: <55115E20.7090105@plexistor.com> (raw)
In-Reply-To: <1427194266-2885-9-git-send-email-david@fromorbit.com>
On 03/24/2015 12:51 PM, 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;
> }
>
> /*
> 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;
Hi
So what I see, (I might be wrong), is that once this flag is set here the
fs (At above xfs_diflags_to_iflags() ) will start serving DAX inodes.
This is a problem because the bdev passed in might not support direct_access
at all.
I think we might want a dax_supported(sb) and call somewhere at mount time.
> +#endif
> } 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;
> + }
> + }
>
If we agree about the s_flags MS_MOUNT_DAX then we can define a
if (MNTOPT_DAX)
dax_enable_if_supported(sb);
This will try a call to bdev_direct_access(sb->s_bdev, ...) and set the
flag if everything is OK, else will leave it off.
(I can do this patch if you want)
> error = xfs_mountfs(mp);
> if (error)
> goto out_filestream_unmount;
>
Thanks
Boaz
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
WARNING: multiple messages have this Message-ID (diff)
From: Boaz Harrosh <boaz@plexistor.com>
To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com
Cc: linux-fsdevel@vger.kernel.org, willy@linux.intel.com, jack@suse.cz
Subject: Re: [PATCH 8/8] xfs: add initial DAX support
Date: Tue, 24 Mar 2015 14:52:48 +0200 [thread overview]
Message-ID: <55115E20.7090105@plexistor.com> (raw)
In-Reply-To: <1427194266-2885-9-git-send-email-david@fromorbit.com>
On 03/24/2015 12:51 PM, 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;
> }
>
> /*
> 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;
Hi
So what I see, (I might be wrong), is that once this flag is set here the
fs (At above xfs_diflags_to_iflags() ) will start serving DAX inodes.
This is a problem because the bdev passed in might not support direct_access
at all.
I think we might want a dax_supported(sb) and call somewhere at mount time.
> +#endif
> } 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;
> + }
> + }
>
If we agree about the s_flags MS_MOUNT_DAX then we can define a
if (MNTOPT_DAX)
dax_enable_if_supported(sb);
This will try a call to bdev_direct_access(sb->s_bdev, ...) and set the
flag if everything is OK, else will leave it off.
(I can do this patch if you want)
> error = xfs_mountfs(mp);
> if (error)
> goto out_filestream_unmount;
>
Thanks
Boaz
next prev parent reply other threads:[~2015-03-24 12:52 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 [this message]
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
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=55115E20.7090105@plexistor.com \
--to=boaz@plexistor.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.