xfs
[Top] [All Lists]

Re: [PATCH] xfs: quiesce the filesystem after recovery on readonly mount

To: xfs@xxxxxxxxxxx, linux-xfs <linux-xfs@xxxxxxxxxxxxxxx>
Subject: Re: [PATCH] xfs: quiesce the filesystem after recovery on readonly mount
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Fri, 23 Sep 2016 11:24:53 -0500
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <af65b5ae-2ff8-c344-0e04-cbbef3efe197@xxxxxxxxxxx>
References: <1474589500-13584-1-git-send-email-david@xxxxxxxxxxxxx> <af65b5ae-2ff8-c344-0e04-cbbef3efe197@xxxxxxxxxxx>
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.3.0
On 9/22/16 8:39 PM, Eric Sandeen wrote:
> On 9/22/16 7:11 PM, Dave Chinner wrote:
>> From: Dave Chinner <dchinner@xxxxxxxxxx>

...

>> To avoid this problem, we need to ensure that a read-only mount
>> always updates the log when it completes the second phase of
>> recovery. We already handle this sort of issue with rw->ro remount
>> transitions, so the solution is as simple as quiescing the
>> filesystem at the appropriate time during the mount process. This
>> results in the log being marked clean so the mount behaviour
>> recorded in the logs on repeated RO mounts will change (i.e. log
>> recovery will no longer be run on every mount until a RW mount is
>> done). This is a user visible change in behaviour, but it is
>> harmless.
> 
> Excellent idea :)
> 
> Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx>

Actually ...  after playing with this a bit ...

Should we restrict this to only when the log got
replayed, with a !XFS_LAST_UNMOUNT_WAS_CLEAN(mp) test?

Maybe it's harmless as it is, but it seems we should restrict
it to the log-got-replayed case.

-Eric

>> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
>> ---
>>  fs/xfs/xfs_mount.c | 14 ++++++++++++++
>>  fs/xfs/xfs_super.c |  2 +-
>>  fs/xfs/xfs_super.h |  1 +
>>  3 files changed, 16 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
>> index faeead6..56e85a6 100644
>> --- a/fs/xfs/xfs_mount.c
>> +++ b/fs/xfs/xfs_mount.c
>> @@ -934,6 +934,20 @@ xfs_mountfs(
>>      }
>>  
>>      /*
>> +     * Now the log is fully replayed, we can transition to full read-only
>> +     * mode for read-only mounts. This will sync all the metadata and clean
>> +     * the log so that the recovery we just performed does not have to be
>> +     * replayed again on the next mount.
>> +     *
>> +     * We use the same quiesce mechanism as the rw->ro remount, as they are
>> +     * semantically identical operations.
>> +     */
>> +    if ((mp->m_flags & (XFS_MOUNT_RDONLY|XFS_MOUNT_NORECOVERY)) ==
>> +                                                    XFS_MOUNT_RDONLY) {
>> +            xfs_quiesce_attr(mp);
>> +    }
>> +
>> +    /*
>>       * Complete the quota initialisation, post-log-replay component.
>>       */
>>      if (quotamount) {
>> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
>> index 3409753..2d092f9 100644
>> --- a/fs/xfs/xfs_super.c
>> +++ b/fs/xfs/xfs_super.c
>> @@ -1137,7 +1137,7 @@ xfs_restore_resvblks(struct xfs_mount *mp)
>>   * Note: xfs_log_quiesce() stops background log work - the callers must 
>> ensure
>>   * it is started again when appropriate.
>>   */
>> -static void
>> +void
>>  xfs_quiesce_attr(
>>      struct xfs_mount        *mp)
>>  {
>> diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h
>> index 529bce9..b6418ab 100644
>> --- a/fs/xfs/xfs_super.h
>> +++ b/fs/xfs/xfs_super.h
>> @@ -61,6 +61,7 @@ struct xfs_mount;
>>  struct xfs_buftarg;
>>  struct block_device;
>>  
>> +extern void xfs_quiesce_attr(struct xfs_mount *mp);
>>  extern void xfs_flush_inodes(struct xfs_mount *mp);
>>  extern void xfs_blkdev_issue_flush(struct xfs_buftarg *);
>>  extern xfs_agnumber_t xfs_set_inode_alloc(struct xfs_mount *,
>>
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs
> 

<Prev in Thread] Current Thread [Next in Thread>