Re: [PATCH] ceph: fix up endian bug in managing feature bits

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

 



On Wed, Apr 29, 2020 at 5:42 PM Jeff Layton <jlayton@xxxxxxxxxx> wrote:
>
> On Wed, 2020-04-29 at 11:46 +0200, Eduard Shishkin wrote:
> > On 4/28/20 2:23 PM, Jeff Layton wrote:
> > > On Mon, 2020-04-27 at 23:46 +0200, edward6@xxxxxxxxxxxxx wrote:
> > > > From: Eduard Shishkin <edward6@xxxxxxxxxxxxx>
> > > >
> > > > In the function handle_session() variable @features always
> > > > contains little endian order of bytes. Just because the feature
> > > > bits are packed bytewise from left to right in
> > > > encode_supported_features().
> > > >
> > > > However, test_bit(), called to check features availability, assumes
> > > > the host order of bytes in that variable. This leads to problems on
> > > > big endian architectures. Specifically it is impossible to mount
> > > > ceph volume on s390.
> > > >
> > > > This patch adds conversion from little endian to the host order
> > > > of bytes, thus fixing the problem.
> > > >
> > > > Signed-off-by: Eduard Shishkin <edward6@xxxxxxxxxxxxx>
> > > > ---
> > > >   fs/ceph/mds_client.c | 4 ++--
> > > >   1 file changed, 2 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
> > > > index 486f91f..190598d 100644
> > > > --- a/fs/ceph/mds_client.c
> > > > +++ b/fs/ceph/mds_client.c
> > > > @@ -3252,7 +3252,7 @@ static void handle_session(struct ceph_mds_session *session,
> > > >           struct ceph_mds_session_head *h;
> > > >           u32 op;
> > > >           u64 seq;
> > > > - unsigned long features = 0;
> > > > + __le64 features = 0;
> > > >           int wake = 0;
> > > >           bool blacklisted = false;
> > > >
> > > > @@ -3301,7 +3301,7 @@ static void handle_session(struct ceph_mds_session *session,
> > > >                   if (session->s_state == CEPH_MDS_SESSION_RECONNECTING)
> > > >                           pr_info("mds%d reconnect success\n", session->s_mds);
> > > >                   session->s_state = CEPH_MDS_SESSION_OPEN;
> > > > -         session->s_features = features;
> > > > +         session->s_features = le64_to_cpu(features);
> > > >                   renewed_caps(mdsc, session, 0);
> > > >                   wake = 1;
> > > >                   if (mdsc->stopping)
> > >
> > > (cc'ing Zheng since he did the original patches here)
> > >
> > > Thanks Eduard. The problem is real, but I think we can just do the
> > > conversion during the decode.
> > >
> > > The feature mask words sent by the MDS are 64 bits, so if it's smaller
> > > we can assume that it's malformed. So, I don't think we need to handle
> > > the case where it's smaller than 8 bytes.
> > >
> > > How about this patch instead?
> >
> > Hi Jeff,
> >
> > This also works. Please, apply.
> >
> > Thanks,
> > Eduard.
> >
>
> Thanks. Merged into ceph-client/testing branch, and should make v5.8.

I think this is stable material.  I'll tag it and get it queued up for 5.7-rc.

Thanks,

                Ilya



[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