Re: [PATCH v3] ceph: fail the request if the peer MDS doesn't support getvxattr op

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

 



On Tue, Aug 09, 2022 at 06:16:36PM +0800, Xiubo Li wrote:
> 
> On 8/9/22 6:07 PM, Luís Henriques wrote:
> > On Mon, Aug 08, 2022 at 03:08:23PM +0800, xiubli@xxxxxxxxxx wrote:
> > > From: Xiubo Li <xiubli@xxxxxxxxxx>
> > > 
> > > Just fail the request instead sending the request out, or the peer
> > > MDS will crash.
> > > 
> > > URL: https://tracker.ceph.com/issues/56529
> > > Signed-off-by: Xiubo Li <xiubli@xxxxxxxxxx>
> > > ---
> > >   fs/ceph/inode.c      |  1 +
> > >   fs/ceph/mds_client.c | 11 +++++++++++
> > >   fs/ceph/mds_client.h |  6 +++++-
> > >   3 files changed, 17 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
> > > index 79ff197c7cc5..cfa0b550eef2 100644
> > > --- a/fs/ceph/inode.c
> > > +++ b/fs/ceph/inode.c
> > > @@ -2607,6 +2607,7 @@ int ceph_do_getvxattr(struct inode *inode, const char *name, void *value,
> > >   		goto out;
> > >   	}
> > > +	req->r_feature_needed = CEPHFS_FEATURE_OP_GETVXATTR;
> > >   	req->r_path2 = kstrdup(name, GFP_NOFS);
> > >   	if (!req->r_path2) {
> > >   		err = -ENOMEM;
> > > diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
> > > index 598012ddc401..3e22783109ad 100644
> > > --- a/fs/ceph/mds_client.c
> > > +++ b/fs/ceph/mds_client.c
> > > @@ -2501,6 +2501,7 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode)
> > >   	INIT_LIST_HEAD(&req->r_unsafe_dir_item);
> > >   	INIT_LIST_HEAD(&req->r_unsafe_target_item);
> > >   	req->r_fmode = -1;
> > > +	req->r_feature_needed = -1;
> > >   	kref_init(&req->r_kref);
> > >   	RB_CLEAR_NODE(&req->r_node);
> > >   	INIT_LIST_HEAD(&req->r_wait);
> > > @@ -3255,6 +3256,16 @@ static void __do_request(struct ceph_mds_client *mdsc,
> > >   	dout("do_request mds%d session %p state %s\n", mds, session,
> > >   	     ceph_session_state_name(session->s_state));
> > > +
> > > +	/*
> > > +	 * The old ceph will crash the MDSs when see unknown OPs
> > > +	 */
> > > +	if (req->r_feature_needed > 0 &&
> > > +	    !test_bit(req->r_feature_needed, &session->s_features)) {
> > > +		err = -ENODATA;
> > > +		goto out_session;
> > > +	}
> > This patch looks good to me.  The only thing I would have preferred would
> > be to have ->r_feature_needed defined as an unsigned and initialised to
> > zero (instead of -1).  But that's me, so feel free to ignore this nit.
> 
> I am just following the 'test_bit()':
> 
>    9    132  include/asm-generic/bitops/instrumented-non-atomic.h
> <<test_bit>>
>              static inline bool test_bit(long nr, const volatile unsigned
> long *addr)
>   10    104  include/asm-generic/bitops/non-atomic.h <<test_bit>>
>              static inline int test_bit(int nr, const volatile unsigned long
> *addr)
> 
> Which is a signed type. If we use a unsigned, won't compiler complain about
> it ?
> 

Oh, yeah you're right.  And now that I think about it, I think I've been
there already in the past.  Sorry for the noise.

Cheers,
--
Luís

> BRs
> 
> -- Xiubo
> 
> > Cheers,
> > --
> > Luís
> > 
> > > +
> > >   	if (session->s_state != CEPH_MDS_SESSION_OPEN &&
> > >   	    session->s_state != CEPH_MDS_SESSION_HUNG) {
> > >   		/*
> > > diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
> > > index e15ee2858fef..728b7d72bf76 100644
> > > --- a/fs/ceph/mds_client.h
> > > +++ b/fs/ceph/mds_client.h
> > > @@ -31,8 +31,9 @@ enum ceph_feature_type {
> > >   	CEPHFS_FEATURE_METRIC_COLLECT,
> > >   	CEPHFS_FEATURE_ALTERNATE_NAME,
> > >   	CEPHFS_FEATURE_NOTIFY_SESSION_STATE,
> > > +	CEPHFS_FEATURE_OP_GETVXATTR,
> > > -	CEPHFS_FEATURE_MAX = CEPHFS_FEATURE_NOTIFY_SESSION_STATE,
> > > +	CEPHFS_FEATURE_MAX = CEPHFS_FEATURE_OP_GETVXATTR,
> > >   };
> > >   #define CEPHFS_FEATURES_CLIENT_SUPPORTED {	\
> > > @@ -45,6 +46,7 @@ enum ceph_feature_type {
> > >   	CEPHFS_FEATURE_METRIC_COLLECT,		\
> > >   	CEPHFS_FEATURE_ALTERNATE_NAME,		\
> > >   	CEPHFS_FEATURE_NOTIFY_SESSION_STATE,	\
> > > +	CEPHFS_FEATURE_OP_GETVXATTR,		\
> > >   }
> > >   /*
> > > @@ -352,6 +354,8 @@ struct ceph_mds_request {
> > >   	long long	  r_dir_ordered_cnt;
> > >   	int		  r_readdir_cache_idx;
> > > +	int		  r_feature_needed;
> > > +
> > >   	struct ceph_cap_reservation r_caps_reservation;
> > >   };
> > > -- 
> > > 2.36.0.rc1
> > > 
> 




[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