On Tue, May 18, 2021 at 01:04:56PM -0400, J. Bruce Fields wrote: > On Mon, May 17, 2021 at 06:43:29PM -0400, Dai Ngo wrote: > > +struct nfsd4_ssc_umount; > > > > enum { > > /* cache misses due only to checksum comparison failures */ > > @@ -176,6 +177,10 @@ struct nfsd_net { > > unsigned int longest_chain_cachesize; > > > > struct shrinker nfsd_reply_cache_shrinker; > > + > > + spinlock_t nfsd_ssc_lock; > > + struct nfsd4_ssc_umount *nfsd_ssc_umount; > ... > > > +void nfsd4_ssc_init_umount_work(struct nfsd_net *nn) > > +{ > > + nn->nfsd_ssc_umount = kzalloc(sizeof(struct nfsd4_ssc_umount), > > + GFP_KERNEL); > > + if (!nn->nfsd_ssc_umount) > > + return; > > Is there any reason this needs to be allocated dynamically? Let's just > embed it in nfsd_net. > > Actually, I'm not convinced the separate structure definition's really > that helpful: > > > +struct nfsd4_ssc_umount { > > + struct list_head nsu_list; > > + unsigned long nsu_expire; Also: doesn't look like nsu_expire is actually used. Am I missing something, or is this a leftover from the conversion to the using the laundromat thread? --b. > > + wait_queue_head_t nsu_waitq; > > +}; > > How about just: > > struct nfsd_net { > ... > /* tracking server-to-server copy mounts: */ > spinlock_t nfsd_ssc_lock; > struct list_head nfsd_ssc_mount_list; > unsigned long nfsd_ssc_mount_expire; > wait_queeu_head_t nfsd_ssc_mount_waitq; > > or something along those lines? > > --b.