Re: [PATCH v2] ceph: skip existing superblocks that are blocklisted when mounting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2021-10-11 at 11:37 +0800, Yan, Zheng wrote:
> 
> 
> On Tue, Oct 5, 2021 at 6:17 PM Jeff Layton <jlayton@xxxxxxxxxx> wrote:
> > On Tue, 2021-10-05 at 10:00 +0200, Ilya Dryomov wrote:
> > > On Thu, Sep 30, 2021 at 7:03 PM Jeff Layton <jlayton@xxxxxxxxxx>
> > wrote:
> > > > 
> > > > Currently when mounting, we may end up finding an existing
> > superblock
> > > > that corresponds to a blocklisted MDS client. This means that
> > > > the
> > new
> > > > mount ends up being unusable.
> > > > 
> > > > If we've found an existing superblock with a client that is
> > already
> > > > blocklisted, and the client is not configured to recover on its
> > own,
> > > > fail the match.
> > > > 
> > > > While we're in here, also rename "other" to the more
> > > > conventional
> > "fsc".
> > > > 
> > 
> 
> 
> Note: we have similar issue for forced umounted superblock 
>  

True...

There is a small window of time between when ->umount_begin runs and
generic_shutdown_super happens. Between that period, you could match a
superblock that's been forcibly umounted and is on the way to being
detached from the tree.

I'm a little less concerned about that because the time window should be
pretty short, and someone would need to try to make a new mount while
"umount -f" is still running. I don't think we can fully prevent that
anyway, as there is some raciness involved (your mount might match the
thing just before umount_begin runs).

I'm inclined not to worry about that case, unless we have some reports
of people hitting that problem.

Thoughts?


> >  
> > > > Cc: Patrick Donnelly <pdonnell@xxxxxxxxxx>
> > > > Cc: Niels de Vos <ndevos@xxxxxxxxxx>
> > > > URL: https://bugzilla.redhat.com/show_bug.cgi?id=1901499
> > > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> > > > ---
> > > >   fs/ceph/super.c | 11 ++++++++---
> > > >   1 file changed, 8 insertions(+), 3 deletions(-)
> > > > 
> > > > diff --git a/fs/ceph/super.c b/fs/ceph/super.c
> > > > index f517ad9eeb26..a7f1b66a91a7 100644
> > > > --- a/fs/ceph/super.c
> > > > +++ b/fs/ceph/super.c
> > > > @@ -1123,16 +1123,16 @@ static int ceph_compare_super(struct
> > super_block *sb, struct fs_context *fc)
> > > >          struct ceph_fs_client *new = fc->s_fs_info;
> > > >          struct ceph_mount_options *fsopt = new->mount_options;
> > > >          struct ceph_options *opt = new->client->options;
> > > > -       struct ceph_fs_client *other = ceph_sb_to_client(sb);
> > > > +       struct ceph_fs_client *fsc = ceph_sb_to_client(sb);
> > > > 
> > > >          dout("ceph_compare_super %p\n", sb);
> > > > 
> > > > -       if (compare_mount_options(fsopt, opt, other)) {
> > > > +       if (compare_mount_options(fsopt, opt, fsc)) {
> > > >                  dout("monitor(s)/mount options don't match\n");
> > > >                  return 0;
> > > >          }
> > > >          if ((opt->flags & CEPH_OPT_FSID) &&
> > > > -           ceph_fsid_compare(&opt->fsid, &other->client->fsid))
> > > > {
> > > > +           ceph_fsid_compare(&opt->fsid, &fsc->client->fsid)) {
> > > >                  dout("fsid doesn't match\n");
> > > >                  return 0;
> > > >          }
> > > > @@ -1140,6 +1140,11 @@ static int ceph_compare_super(struct
> > super_block *sb, struct fs_context *fc)
> > > >                  dout("flags differ\n");
> > > >                  return 0;
> > > >          }
> > > > +       /* Exclude any blocklisted superblocks */
> > > > +       if (fsc->blocklisted && !(fsopt->flags &
> > CEPH_MOUNT_OPT_CLEANRECOVER)) {
> > > 
> > > Hi Jeff,
> > > 
> > > Nit: This looks a bit weird because fsc is the existing client
> > > while
> > > fsopt is the new set of mount options.  They are guaranteed to
> > > match
> > at
> > > that point because of compare_mount_options() but it feels better
> > > to
> > > stick to probing the existing client, e.g.
> > > 
> > >     if (fsc->blocklisted && !ceph_test_mount_opt(fsc,
> > > CLEANRECOVER))
> > > 
> > 
> > Yeah, that does look cleaner. I went ahead and made that change in
> > the
> > testing branch patch, but I'll skip re-posting it.
> > 
> > Thanks,

-- 
Jeff Layton <jlayton@xxxxxxxxxx>




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux