Message ID | 20210218165348.4754-6-allison.henderson@oracle.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xfs: Delayed Attributes | expand |
On Thu, Feb 18, 2021 at 09:53:31AM -0700, Allison Henderson wrote: > This patch adds a helper function xfs_attr_set_fmt. This will help > isolate the code that will require state management from the portions > that do not. xfs_attr_set_fmt returns 0 when the attr has been set and > no further action is needed. It returns -EAGAIN when shortform has been > transformed to leaf, and the calling function should proceed the set the > attr in leaf form. > > Signed-off-by: Allison Henderson <allison.henderson@oracle.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/libxfs/xfs_attr.c | 77 +++++++++++++++++++++++++++--------------------- > 1 file changed, 44 insertions(+), 33 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c > index a064c5b..205ad26 100644 > --- a/fs/xfs/libxfs/xfs_attr.c > +++ b/fs/xfs/libxfs/xfs_attr.c > @@ -216,6 +216,46 @@ xfs_attr_is_shortform( > ip->i_afp->if_nextents == 0); > } > > +STATIC int > +xfs_attr_set_fmt( > + struct xfs_da_args *args) > +{ > + struct xfs_buf *leaf_bp = NULL; > + struct xfs_inode *dp = args->dp; > + int error2, error = 0; > + > + /* > + * Try to add the attr to the attribute list in the inode. > + */ > + error = xfs_attr_try_sf_addname(dp, args); > + if (error != -ENOSPC) { > + error2 = xfs_trans_commit(args->trans); > + args->trans = NULL; > + return error ? error : error2; > + } > + > + /* > + * It won't fit in the shortform, transform to a leaf block. > + * GROT: another possible req'mt for a double-split btree op. > + */ > + error = xfs_attr_shortform_to_leaf(args, &leaf_bp); > + if (error) > + return error; > + > + /* > + * Prevent the leaf buffer from being unlocked so that a > + * concurrent AIL push cannot grab the half-baked leaf buffer > + * and run into problems with the write verifier. > + */ > + xfs_trans_bhold(args->trans, leaf_bp); > + error = xfs_defer_finish(&args->trans); > + xfs_trans_bhold_release(args->trans, leaf_bp); > + if (error) > + xfs_trans_brelse(args->trans, leaf_bp); > + > + return -EAGAIN; > +} > + > /* > * Set the attribute specified in @args. > */ > @@ -224,8 +264,7 @@ xfs_attr_set_args( > struct xfs_da_args *args) > { > struct xfs_inode *dp = args->dp; > - struct xfs_buf *leaf_bp = NULL; > - int error2, error = 0; > + int error; > > /* > * If the attribute list is already in leaf format, jump straight to > @@ -234,36 +273,9 @@ xfs_attr_set_args( > * again. > */ > if (xfs_attr_is_shortform(dp)) { > - /* > - * Try to add the attr to the attribute list in the inode. > - */ > - error = xfs_attr_try_sf_addname(dp, args); > - if (error != -ENOSPC) { > - error2 = xfs_trans_commit(args->trans); > - args->trans = NULL; > - return error ? error : error2; > - } > - > - /* > - * It won't fit in the shortform, transform to a leaf block. > - * GROT: another possible req'mt for a double-split btree op. > - */ > - error = xfs_attr_shortform_to_leaf(args, &leaf_bp); > - if (error) > + error = xfs_attr_set_fmt(args); > + if (error != -EAGAIN) > return error; > - > - /* > - * Prevent the leaf buffer from being unlocked so that a > - * concurrent AIL push cannot grab the half-baked leaf buffer > - * and run into problems with the write verifier. > - */ > - xfs_trans_bhold(args->trans, leaf_bp); > - error = xfs_defer_finish(&args->trans); > - xfs_trans_bhold_release(args->trans, leaf_bp); > - if (error) { > - xfs_trans_brelse(args->trans, leaf_bp); > - return error; > - } > } > > if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { > @@ -297,8 +309,7 @@ xfs_attr_set_args( > return error; > } > > - error = xfs_attr_node_addname(args); > - return error; > + return xfs_attr_node_addname(args); > } > > /* > -- > 2.7.4 >
On 2/24/21 8:04 AM, Brian Foster wrote: > On Thu, Feb 18, 2021 at 09:53:31AM -0700, Allison Henderson wrote: >> This patch adds a helper function xfs_attr_set_fmt. This will help >> isolate the code that will require state management from the portions >> that do not. xfs_attr_set_fmt returns 0 when the attr has been set and >> no further action is needed. It returns -EAGAIN when shortform has been >> transformed to leaf, and the calling function should proceed the set the >> attr in leaf form. >> >> Signed-off-by: Allison Henderson <allison.henderson@oracle.com> >> --- > > Reviewed-by: Brian Foster <bfoster@redhat.com> Will add. Thank you!! Allison > >> fs/xfs/libxfs/xfs_attr.c | 77 +++++++++++++++++++++++++++--------------------- >> 1 file changed, 44 insertions(+), 33 deletions(-) >> >> diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c >> index a064c5b..205ad26 100644 >> --- a/fs/xfs/libxfs/xfs_attr.c >> +++ b/fs/xfs/libxfs/xfs_attr.c >> @@ -216,6 +216,46 @@ xfs_attr_is_shortform( >> ip->i_afp->if_nextents == 0); >> } >> >> +STATIC int >> +xfs_attr_set_fmt( >> + struct xfs_da_args *args) >> +{ >> + struct xfs_buf *leaf_bp = NULL; >> + struct xfs_inode *dp = args->dp; >> + int error2, error = 0; >> + >> + /* >> + * Try to add the attr to the attribute list in the inode. >> + */ >> + error = xfs_attr_try_sf_addname(dp, args); >> + if (error != -ENOSPC) { >> + error2 = xfs_trans_commit(args->trans); >> + args->trans = NULL; >> + return error ? error : error2; >> + } >> + >> + /* >> + * It won't fit in the shortform, transform to a leaf block. >> + * GROT: another possible req'mt for a double-split btree op. >> + */ >> + error = xfs_attr_shortform_to_leaf(args, &leaf_bp); >> + if (error) >> + return error; >> + >> + /* >> + * Prevent the leaf buffer from being unlocked so that a >> + * concurrent AIL push cannot grab the half-baked leaf buffer >> + * and run into problems with the write verifier. >> + */ >> + xfs_trans_bhold(args->trans, leaf_bp); >> + error = xfs_defer_finish(&args->trans); >> + xfs_trans_bhold_release(args->trans, leaf_bp); >> + if (error) >> + xfs_trans_brelse(args->trans, leaf_bp); >> + >> + return -EAGAIN; >> +} >> + >> /* >> * Set the attribute specified in @args. >> */ >> @@ -224,8 +264,7 @@ xfs_attr_set_args( >> struct xfs_da_args *args) >> { >> struct xfs_inode *dp = args->dp; >> - struct xfs_buf *leaf_bp = NULL; >> - int error2, error = 0; >> + int error; >> >> /* >> * If the attribute list is already in leaf format, jump straight to >> @@ -234,36 +273,9 @@ xfs_attr_set_args( >> * again. >> */ >> if (xfs_attr_is_shortform(dp)) { >> - /* >> - * Try to add the attr to the attribute list in the inode. >> - */ >> - error = xfs_attr_try_sf_addname(dp, args); >> - if (error != -ENOSPC) { >> - error2 = xfs_trans_commit(args->trans); >> - args->trans = NULL; >> - return error ? error : error2; >> - } >> - >> - /* >> - * It won't fit in the shortform, transform to a leaf block. >> - * GROT: another possible req'mt for a double-split btree op. >> - */ >> - error = xfs_attr_shortform_to_leaf(args, &leaf_bp); >> - if (error) >> + error = xfs_attr_set_fmt(args); >> + if (error != -EAGAIN) >> return error; >> - >> - /* >> - * Prevent the leaf buffer from being unlocked so that a >> - * concurrent AIL push cannot grab the half-baked leaf buffer >> - * and run into problems with the write verifier. >> - */ >> - xfs_trans_bhold(args->trans, leaf_bp); >> - error = xfs_defer_finish(&args->trans); >> - xfs_trans_bhold_release(args->trans, leaf_bp); >> - if (error) { >> - xfs_trans_brelse(args->trans, leaf_bp); >> - return error; >> - } >> } >> >> if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { >> @@ -297,8 +309,7 @@ xfs_attr_set_args( >> return error; >> } >> >> - error = xfs_attr_node_addname(args); >> - return error; >> + return xfs_attr_node_addname(args); >> } >> >> /* >> -- >> 2.7.4 >> >
On Thu, Feb 18, 2021 at 09:53:31AM -0700, Allison Henderson wrote: > This patch adds a helper function xfs_attr_set_fmt. This will help > isolate the code that will require state management from the portions > that do not. xfs_attr_set_fmt returns 0 when the attr has been set and > no further action is needed. It returns -EAGAIN when shortform has been > transformed to leaf, and the calling function should proceed the set the > attr in leaf form. > > Signed-off-by: Allison Henderson <allison.henderson@oracle.com> > --- > fs/xfs/libxfs/xfs_attr.c | 77 +++++++++++++++++++++++++++--------------------- > 1 file changed, 44 insertions(+), 33 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c > index a064c5b..205ad26 100644 > --- a/fs/xfs/libxfs/xfs_attr.c > +++ b/fs/xfs/libxfs/xfs_attr.c > @@ -216,6 +216,46 @@ xfs_attr_is_shortform( > ip->i_afp->if_nextents == 0); > } > > +STATIC int > +xfs_attr_set_fmt( > + struct xfs_da_args *args) > +{ > + struct xfs_buf *leaf_bp = NULL; > + struct xfs_inode *dp = args->dp; > + int error2, error = 0; > + > + /* > + * Try to add the attr to the attribute list in the inode. > + */ > + error = xfs_attr_try_sf_addname(dp, args); > + if (error != -ENOSPC) { > + error2 = xfs_trans_commit(args->trans); > + args->trans = NULL; > + return error ? error : error2; > + } > + > + /* > + * It won't fit in the shortform, transform to a leaf block. > + * GROT: another possible req'mt for a double-split btree op. > + */ > + error = xfs_attr_shortform_to_leaf(args, &leaf_bp); > + if (error) > + return error; > + > + /* > + * Prevent the leaf buffer from being unlocked so that a > + * concurrent AIL push cannot grab the half-baked leaf buffer > + * and run into problems with the write verifier. > + */ > + xfs_trans_bhold(args->trans, leaf_bp); > + error = xfs_defer_finish(&args->trans); > + xfs_trans_bhold_release(args->trans, leaf_bp); > + if (error) > + xfs_trans_brelse(args->trans, leaf_bp); Shouldn't this pass the error back to the caller? --D > + > + return -EAGAIN; > +} > + > /* > * Set the attribute specified in @args. > */ > @@ -224,8 +264,7 @@ xfs_attr_set_args( > struct xfs_da_args *args) > { > struct xfs_inode *dp = args->dp; > - struct xfs_buf *leaf_bp = NULL; > - int error2, error = 0; > + int error; > > /* > * If the attribute list is already in leaf format, jump straight to > @@ -234,36 +273,9 @@ xfs_attr_set_args( > * again. > */ > if (xfs_attr_is_shortform(dp)) { > - /* > - * Try to add the attr to the attribute list in the inode. > - */ > - error = xfs_attr_try_sf_addname(dp, args); > - if (error != -ENOSPC) { > - error2 = xfs_trans_commit(args->trans); > - args->trans = NULL; > - return error ? error : error2; > - } > - > - /* > - * It won't fit in the shortform, transform to a leaf block. > - * GROT: another possible req'mt for a double-split btree op. > - */ > - error = xfs_attr_shortform_to_leaf(args, &leaf_bp); > - if (error) > + error = xfs_attr_set_fmt(args); > + if (error != -EAGAIN) > return error; > - > - /* > - * Prevent the leaf buffer from being unlocked so that a > - * concurrent AIL push cannot grab the half-baked leaf buffer > - * and run into problems with the write verifier. > - */ > - xfs_trans_bhold(args->trans, leaf_bp); > - error = xfs_defer_finish(&args->trans); > - xfs_trans_bhold_release(args->trans, leaf_bp); > - if (error) { > - xfs_trans_brelse(args->trans, leaf_bp); > - return error; > - } > } > > if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { > @@ -297,8 +309,7 @@ xfs_attr_set_args( > return error; > } > > - error = xfs_attr_node_addname(args); > - return error; > + return xfs_attr_node_addname(args); > } > > /* > -- > 2.7.4 >
On 2/25/21 8:07 PM, Darrick J. Wong wrote: > On Thu, Feb 18, 2021 at 09:53:31AM -0700, Allison Henderson wrote: >> This patch adds a helper function xfs_attr_set_fmt. This will help >> isolate the code that will require state management from the portions >> that do not. xfs_attr_set_fmt returns 0 when the attr has been set and >> no further action is needed. It returns -EAGAIN when shortform has been >> transformed to leaf, and the calling function should proceed the set the >> attr in leaf form. >> >> Signed-off-by: Allison Henderson <allison.henderson@oracle.com> >> --- >> fs/xfs/libxfs/xfs_attr.c | 77 +++++++++++++++++++++++++++--------------------- >> 1 file changed, 44 insertions(+), 33 deletions(-) >> >> diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c >> index a064c5b..205ad26 100644 >> --- a/fs/xfs/libxfs/xfs_attr.c >> +++ b/fs/xfs/libxfs/xfs_attr.c >> @@ -216,6 +216,46 @@ xfs_attr_is_shortform( >> ip->i_afp->if_nextents == 0); >> } >> >> +STATIC int >> +xfs_attr_set_fmt( >> + struct xfs_da_args *args) >> +{ >> + struct xfs_buf *leaf_bp = NULL; >> + struct xfs_inode *dp = args->dp; >> + int error2, error = 0; >> + >> + /* >> + * Try to add the attr to the attribute list in the inode. >> + */ >> + error = xfs_attr_try_sf_addname(dp, args); >> + if (error != -ENOSPC) { >> + error2 = xfs_trans_commit(args->trans); >> + args->trans = NULL; >> + return error ? error : error2; >> + } >> + >> + /* >> + * It won't fit in the shortform, transform to a leaf block. >> + * GROT: another possible req'mt for a double-split btree op. >> + */ >> + error = xfs_attr_shortform_to_leaf(args, &leaf_bp); >> + if (error) >> + return error; >> + >> + /* >> + * Prevent the leaf buffer from being unlocked so that a >> + * concurrent AIL push cannot grab the half-baked leaf buffer >> + * and run into problems with the write verifier. >> + */ >> + xfs_trans_bhold(args->trans, leaf_bp); >> + error = xfs_defer_finish(&args->trans); >> + xfs_trans_bhold_release(args->trans, leaf_bp); >> + if (error) >> + xfs_trans_brelse(args->trans, leaf_bp); > > Shouldn't this pass the error back to the caller? > > --D Yes, I must of have missed it in this temporary phase of this function. It quickly gets pulled back out when the defer_finishes go away, but will fix for this phase in the series. Thanks for the catch! Allison > >> + >> + return -EAGAIN; >> +} >> + >> /* >> * Set the attribute specified in @args. >> */ >> @@ -224,8 +264,7 @@ xfs_attr_set_args( >> struct xfs_da_args *args) >> { >> struct xfs_inode *dp = args->dp; >> - struct xfs_buf *leaf_bp = NULL; >> - int error2, error = 0; >> + int error; >> >> /* >> * If the attribute list is already in leaf format, jump straight to >> @@ -234,36 +273,9 @@ xfs_attr_set_args( >> * again. >> */ >> if (xfs_attr_is_shortform(dp)) { >> - /* >> - * Try to add the attr to the attribute list in the inode. >> - */ >> - error = xfs_attr_try_sf_addname(dp, args); >> - if (error != -ENOSPC) { >> - error2 = xfs_trans_commit(args->trans); >> - args->trans = NULL; >> - return error ? error : error2; >> - } >> - >> - /* >> - * It won't fit in the shortform, transform to a leaf block. >> - * GROT: another possible req'mt for a double-split btree op. >> - */ >> - error = xfs_attr_shortform_to_leaf(args, &leaf_bp); >> - if (error) >> + error = xfs_attr_set_fmt(args); >> + if (error != -EAGAIN) >> return error; >> - >> - /* >> - * Prevent the leaf buffer from being unlocked so that a >> - * concurrent AIL push cannot grab the half-baked leaf buffer >> - * and run into problems with the write verifier. >> - */ >> - xfs_trans_bhold(args->trans, leaf_bp); >> - error = xfs_defer_finish(&args->trans); >> - xfs_trans_bhold_release(args->trans, leaf_bp); >> - if (error) { >> - xfs_trans_brelse(args->trans, leaf_bp); >> - return error; >> - } >> } >> >> if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { >> @@ -297,8 +309,7 @@ xfs_attr_set_args( >> return error; >> } >> >> - error = xfs_attr_node_addname(args); >> - return error; >> + return xfs_attr_node_addname(args); >> } >> >> /* >> -- >> 2.7.4 >>
diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index a064c5b..205ad26 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -216,6 +216,46 @@ xfs_attr_is_shortform( ip->i_afp->if_nextents == 0); } +STATIC int +xfs_attr_set_fmt( + struct xfs_da_args *args) +{ + struct xfs_buf *leaf_bp = NULL; + struct xfs_inode *dp = args->dp; + int error2, error = 0; + + /* + * Try to add the attr to the attribute list in the inode. + */ + error = xfs_attr_try_sf_addname(dp, args); + if (error != -ENOSPC) { + error2 = xfs_trans_commit(args->trans); + args->trans = NULL; + return error ? error : error2; + } + + /* + * It won't fit in the shortform, transform to a leaf block. + * GROT: another possible req'mt for a double-split btree op. + */ + error = xfs_attr_shortform_to_leaf(args, &leaf_bp); + if (error) + return error; + + /* + * Prevent the leaf buffer from being unlocked so that a + * concurrent AIL push cannot grab the half-baked leaf buffer + * and run into problems with the write verifier. + */ + xfs_trans_bhold(args->trans, leaf_bp); + error = xfs_defer_finish(&args->trans); + xfs_trans_bhold_release(args->trans, leaf_bp); + if (error) + xfs_trans_brelse(args->trans, leaf_bp); + + return -EAGAIN; +} + /* * Set the attribute specified in @args. */ @@ -224,8 +264,7 @@ xfs_attr_set_args( struct xfs_da_args *args) { struct xfs_inode *dp = args->dp; - struct xfs_buf *leaf_bp = NULL; - int error2, error = 0; + int error; /* * If the attribute list is already in leaf format, jump straight to @@ -234,36 +273,9 @@ xfs_attr_set_args( * again. */ if (xfs_attr_is_shortform(dp)) { - /* - * Try to add the attr to the attribute list in the inode. - */ - error = xfs_attr_try_sf_addname(dp, args); - if (error != -ENOSPC) { - error2 = xfs_trans_commit(args->trans); - args->trans = NULL; - return error ? error : error2; - } - - /* - * It won't fit in the shortform, transform to a leaf block. - * GROT: another possible req'mt for a double-split btree op. - */ - error = xfs_attr_shortform_to_leaf(args, &leaf_bp); - if (error) + error = xfs_attr_set_fmt(args); + if (error != -EAGAIN) return error; - - /* - * Prevent the leaf buffer from being unlocked so that a - * concurrent AIL push cannot grab the half-baked leaf buffer - * and run into problems with the write verifier. - */ - xfs_trans_bhold(args->trans, leaf_bp); - error = xfs_defer_finish(&args->trans); - xfs_trans_bhold_release(args->trans, leaf_bp); - if (error) { - xfs_trans_brelse(args->trans, leaf_bp); - return error; - } } if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { @@ -297,8 +309,7 @@ xfs_attr_set_args( return error; } - error = xfs_attr_node_addname(args); - return error; + return xfs_attr_node_addname(args); } /*
This patch adds a helper function xfs_attr_set_fmt. This will help isolate the code that will require state management from the portions that do not. xfs_attr_set_fmt returns 0 when the attr has been set and no further action is needed. It returns -EAGAIN when shortform has been transformed to leaf, and the calling function should proceed the set the attr in leaf form. Signed-off-by: Allison Henderson <allison.henderson@oracle.com> --- fs/xfs/libxfs/xfs_attr.c | 77 +++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 33 deletions(-)