From: NeilBrown <neilb@suse.com>
To: Al Viro <viro@ZenIV.linux.org.uk>,
Trond Myklebust <trond.myklebust@primarydata.com>
Cc: Jens Axboe <axboe@fb.com>,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
Linux NFS Mailing list <linux-nfs@vger.kernel.org>
Subject: Re: [PATCH 1/2] loop: use filp_close() rather than fput()
Date: Sun, 18 Jun 2017 14:30:18 +1000 [thread overview]
Message-ID: <87efuh6hph.fsf@notabene.neil.brown.name> (raw)
In-Reply-To: <20170617000157.GQ31671@ZenIV.linux.org.uk>
[-- Attachment #1: Type: text/plain, Size: 2004 bytes --]
On Sat, Jun 17 2017, Al Viro wrote:
> On Fri, Jun 16, 2017 at 03:02:09PM +1000, NeilBrown wrote:
>> When a loop device is being shutdown the backing file is
>> closed with fput(). This is different from how close(2)
>> closes files - it uses filp_close().
>>
>> The difference is important for filesystems which provide a ->flush
>> file operation such as NFS. NFS assumes a flush will always
>> be called on last close, and gets confused otherwise.
>
> Huh? You do realize that mmap() + close() + modify + msync() + munmap()
> will have IO done *after* the last flush, right?
Yes I do ... or rather I did. I didn't make that connection this time.
The sequence you describe causes exactly the same sort of problem.
I sent a patch to Trond to add a vfs_fsync() call to nfs_file_release()
but he claims the current behaviour is "working as expected". I didn't
quite know what to make of that..
https://www.spinics.net/lists/linux-nfs/msg62603.html
To provide the full picture:
When an NFS file has dirty pages, they (indirectly) hold extra
references on the superblock, using nfs_sb_active().
This means that when the filesystem is unmounted, the superblock
remains active until all the writes complete. This contrasts with
every other filesystems where all writes will complete before the
umount returns.
When you open/write/close, there will be no dirty pages at umount time
(because close() flushes) so this doesn't cause a problem. But when
you mmap, or use a loop device, then dirty pages can still be around to
keep the superblock alive.
The observable symptom that brought this to my attention was that
umount -a -t nfs
disable network
sync
can hang in sync, because the NFS filesystems can still be waiting to
write out data.
If nfs_file_release() adds vfs_fsync(), or maybe if __fput() calls
filp->f_op->flush(), then loop.c wouldn't need to use filp_close().
Which would you prefer?
Thanks,
NeilBrown
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
next prev parent reply other threads:[~2017-06-18 4:30 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-16 5:02 [PATCH 0/2] Two fixes for loop devices NeilBrown
2017-06-16 5:02 ` [PATCH 2/2] loop: Add PF_LESS_THROTTLE to block/loop device thread NeilBrown
2017-06-16 7:36 ` Christoph Hellwig
2017-06-16 5:02 ` [PATCH 1/2] loop: use filp_close() rather than fput() NeilBrown
2017-06-16 7:37 ` Christoph Hellwig
2017-06-17 0:01 ` Al Viro
2017-06-18 4:30 ` NeilBrown [this message]
2017-06-16 14:29 ` [PATCH 0/2] Two fixes for loop devices Jens Axboe
2017-06-18 4:33 ` NeilBrown
2017-06-18 15:06 ` Jens Axboe
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=87efuh6hph.fsf@notabene.neil.brown.name \
--to=neilb@suse.com \
--cc=axboe@fb.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=trond.myklebust@primarydata.com \
--cc=viro@ZenIV.linux.org.uk \
/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 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).