On Tue 07-04-26 09:21:21, Jeff Layton wrote:
> Add a new helper function that will update the mask on the nfsd_file's
> fsnotify_mark to be a union of all current directory delegations on an
> inode. Call that when directory delegations are added or removed.
> 
> Signed-off-by: Jeff Layton <[email protected]>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <[email protected]>

                                                                Honza

> ---
>  fs/nfsd/nfs4state.c | 33 +++++++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index c8fb84c38637..9a4cff08c67d 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -1258,6 +1258,37 @@ static void nfsd4_finalize_deleg_timestamps(struct 
> nfs4_delegation *dp, struct f
>       }
>  }
>  
> +static void nfsd_fsnotify_recalc_mask(struct nfsd_file *nf)
> +{
> +     struct fsnotify_mark *mark = &nf->nf_mark->nfm_mark;
> +     struct inode *inode = file_inode(nf->nf_file);
> +     u32 lease_mask, set = 0, clear = 0;
> +
> +     /* This is only needed when adding or removing dir delegs */
> +     if (!S_ISDIR(inode->i_mode))
> +             return;
> +
> +     /* Set up notifications for any ignored delegation events */
> +     lease_mask = inode_lease_ignore_mask(inode);
> +
> +     if (lease_mask & FL_IGN_DIR_CREATE)
> +             set |= FS_CREATE;
> +     else
> +             clear |= FS_CREATE;
> +
> +     if (lease_mask & FL_IGN_DIR_DELETE)
> +             set |= FS_DELETE;
> +     else
> +             clear |= FS_DELETE;
> +
> +     if (lease_mask & FL_IGN_DIR_RENAME)
> +             set |= FS_RENAME;
> +     else
> +             clear |= FS_RENAME;
> +
> +     fsnotify_modify_mark_mask(mark, set, clear);
> +}
> +
>  static void nfs4_unlock_deleg_lease(struct nfs4_delegation *dp)
>  {
>       struct nfs4_file *fp = dp->dl_stid.sc_file;
> @@ -1266,6 +1297,7 @@ static void nfs4_unlock_deleg_lease(struct 
> nfs4_delegation *dp)
>       WARN_ON_ONCE(!fp->fi_delegees);
>  
>       nfsd4_finalize_deleg_timestamps(dp, nf->nf_file);
> +     nfsd_fsnotify_recalc_mask(nf);
>       kernel_setlease(nf->nf_file, F_UNLCK, NULL, (void **)&dp);
>       put_deleg_file(fp);
>  }
> @@ -9652,6 +9684,7 @@ nfsd_get_dir_deleg(struct nfsd4_compound_state *cstate,
>  
>       if (!status) {
>               put_nfs4_file(fp);
> +             nfsd_fsnotify_recalc_mask(nf);
>               return dp;
>       }
>  
> 
> -- 
> 2.53.0
> 
-- 
Jan Kara <[email protected]>
SUSE Labs, CR

Reply via email to