From: Andrew Morton <akpm@linux-foundation.org>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: cmm@us.ibm.com, linux-ext4@vger.kernel.org,
aneesh.kumar@linux.vnet.ibm.com,
Nick Piggin <nickpiggin@yahoo.com.au>,
linux-mm@kvack.org
Subject: Re: [PATCH] ext3: Use page_mkwrite vma_operations to get mmap write notification.
Date: Mon, 24 Mar 2008 16:01:41 -0700 [thread overview]
Message-ID: <20080324160141.67746905.akpm@linux-foundation.org> (raw)
In-Reply-To: <1206378298-10341-2-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
On Mon, 24 Mar 2008 22:34:56 +0530
"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> wrote:
> We would like to get notified when we are doing a write on mmap section.
> The changes are needed to handle ENOSPC when writing to an mmap section
> of files with holes.
>
umm,
>
> diff --git a/fs/ext3/file.c b/fs/ext3/file.c
> index acc4913..09e22e4 100644
> --- a/fs/ext3/file.c
> +++ b/fs/ext3/file.c
> @@ -106,6 +106,23 @@ force_commit:
> return ret;
> }
>
> +static struct vm_operations_struct ext3_file_vm_ops = {
> + .fault = filemap_fault,
> + .page_mkwrite = ext3_page_mkwrite,
> +};
> +
> +static int ext3_file_mmap(struct file *file, struct vm_area_struct *vma)
> +{
> + struct address_space *mapping = file->f_mapping;
> +
> + if (!mapping->a_ops->readpage)
> + return -ENOEXEC;
> + file_accessed(file);
> + vma->vm_ops = &ext3_file_vm_ops;
> + vma->vm_flags |= VM_CAN_NONLINEAR;
> + return 0;
> +}
> +
> const struct file_operations ext3_file_operations = {
> .llseek = generic_file_llseek,
> .read = do_sync_read,
> @@ -116,7 +133,7 @@ const struct file_operations ext3_file_operations = {
> #ifdef CONFIG_COMPAT
> .compat_ioctl = ext3_compat_ioctl,
> #endif
> - .mmap = generic_file_mmap,
> + .mmap = ext3_file_mmap,
> .open = generic_file_open,
> .release = ext3_release_file,
> .fsync = ext3_sync_file,
> diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
> index eb95670..2293506 100644
> --- a/fs/ext3/inode.c
> +++ b/fs/ext3/inode.c
> @@ -3306,3 +3306,8 @@ int ext3_change_inode_journal_flag(struct inode *inode, int val)
>
> return err;
> }
> +
> +int ext3_page_mkwrite(struct vm_area_struct *vma, struct page *page)
> +{
> + return block_page_mkwrite(vma, page, ext3_get_block);
> +}
This gets called within the pagefault handler.
And block_page_mkwrite() does lock_page().
But the pagefault handler can be called with a page already locked, from
generic_perform_write().
Nick, why are we not vulnerable to A-A or to AB-BA deadlocks here?
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Morton <akpm@linux-foundation.org>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: cmm@us.ibm.com, linux-ext4@vger.kernel.org,
Nick Piggin <nickpiggin@yahoo.com.au>,
linux-mm@kvack.org
Subject: Re: [PATCH] ext3: Use page_mkwrite vma_operations to get mmap write notification.
Date: Mon, 24 Mar 2008 16:01:41 -0700 [thread overview]
Message-ID: <20080324160141.67746905.akpm@linux-foundation.org> (raw)
In-Reply-To: <1206378298-10341-2-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
On Mon, 24 Mar 2008 22:34:56 +0530
"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> wrote:
> We would like to get notified when we are doing a write on mmap section.
> The changes are needed to handle ENOSPC when writing to an mmap section
> of files with holes.
>
umm,
>
> diff --git a/fs/ext3/file.c b/fs/ext3/file.c
> index acc4913..09e22e4 100644
> --- a/fs/ext3/file.c
> +++ b/fs/ext3/file.c
> @@ -106,6 +106,23 @@ force_commit:
> return ret;
> }
>
> +static struct vm_operations_struct ext3_file_vm_ops = {
> + .fault = filemap_fault,
> + .page_mkwrite = ext3_page_mkwrite,
> +};
> +
> +static int ext3_file_mmap(struct file *file, struct vm_area_struct *vma)
> +{
> + struct address_space *mapping = file->f_mapping;
> +
> + if (!mapping->a_ops->readpage)
> + return -ENOEXEC;
> + file_accessed(file);
> + vma->vm_ops = &ext3_file_vm_ops;
> + vma->vm_flags |= VM_CAN_NONLINEAR;
> + return 0;
> +}
> +
> const struct file_operations ext3_file_operations = {
> .llseek = generic_file_llseek,
> .read = do_sync_read,
> @@ -116,7 +133,7 @@ const struct file_operations ext3_file_operations = {
> #ifdef CONFIG_COMPAT
> .compat_ioctl = ext3_compat_ioctl,
> #endif
> - .mmap = generic_file_mmap,
> + .mmap = ext3_file_mmap,
> .open = generic_file_open,
> .release = ext3_release_file,
> .fsync = ext3_sync_file,
> diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
> index eb95670..2293506 100644
> --- a/fs/ext3/inode.c
> +++ b/fs/ext3/inode.c
> @@ -3306,3 +3306,8 @@ int ext3_change_inode_journal_flag(struct inode *inode, int val)
>
> return err;
> }
> +
> +int ext3_page_mkwrite(struct vm_area_struct *vma, struct page *page)
> +{
> + return block_page_mkwrite(vma, page, ext3_get_block);
> +}
This gets called within the pagefault handler.
And block_page_mkwrite() does lock_page().
But the pagefault handler can be called with a page already locked, from
generic_perform_write().
Nick, why are we not vulnerable to A-A or to AB-BA deadlocks here?
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2008-03-24 23:01 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-24 17:04 [PATCH] ext3: Return EIO if new block is allocated from system zone Aneesh Kumar K.V
2008-03-24 17:04 ` [PATCH] ext3: Use page_mkwrite vma_operations to get mmap write notification Aneesh Kumar K.V
2008-03-24 17:04 ` [PATCH] ext4: Export needed symbol for ZERO_PAGE usage in modules Aneesh Kumar K.V
2008-03-24 17:04 ` [PATCH] ext2: Use page_mkwrite vma_operations to get mmap write notification Aneesh Kumar K.V
2008-03-24 23:01 ` Andrew Morton [this message]
2008-03-24 23:01 ` [PATCH] ext3: " Andrew Morton
2008-03-25 9:21 ` Nick Piggin
2008-03-25 9:21 ` Nick Piggin
2008-03-24 22:32 ` [PATCH] ext3: Return EIO if new block is allocated from system zone Andreas Dilger
2008-03-25 11:03 ` Aneesh Kumar K.V
2008-03-25 20:59 ` Andreas Dilger
-- strict thread matches above, loose matches on Subject: below --
2008-06-05 17:05 [PATCH] ext2: Use page_mkwrite vma_operations to get mmap write notification Aneesh Kumar K.V
2008-06-05 17:05 ` [PATCH] ext3: " Aneesh Kumar K.V
2008-06-06 18:24 Patches for the patchqueue Aneesh Kumar K.V
2008-06-06 18:24 ` [PATCH] ext4: cleanup blockallocator Aneesh Kumar K.V
2008-06-06 18:24 ` [PATCH] ext2: Use page_mkwrite vma_operations to get mmap write notification Aneesh Kumar K.V
2008-06-06 18:24 ` [PATCH] ext3: " Aneesh Kumar K.V
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=20080324160141.67746905.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.vnet.ibm.com \
--cc=cmm@us.ibm.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nickpiggin@yahoo.com.au \
/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.