* [PATCH 0/4] xfs: more code refactoring
@ 2014-08-22 0:51 Eric Sandeen
2014-08-22 0:55 ` [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter Eric Sandeen
` (3 more replies)
0 siblings, 4 replies; 15+ messages in thread
From: Eric Sandeen @ 2014-08-22 0:51 UTC (permalink / raw)
To: xfs-oss
combine some directory & rt code which was cut&paste
long ago...
libxfs/xfs_dir2.c | 67 +++---------------
libxfs/xfs_dir2.h | 2
libxfs/xfs_rtbitmap.c | 45 ++++++++++--
xfs_file.c | 178 ++++++++++++++------------------------------------
xfs_inode.c | 24 ++++--
xfs_log_recover.c | 83 ++++++++---------------
xfs_rtalloc.c | 55 ---------------
xfs_rtalloc.h | 4 +
xfs_symlink.c | 8 +-
9 files changed, 158 insertions(+), 308 deletions(-)
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter
2014-08-22 0:51 [PATCH 0/4] xfs: more code refactoring Eric Sandeen
@ 2014-08-22 0:55 ` Eric Sandeen
2014-08-22 13:19 ` Brian Foster
2014-08-29 0:59 ` Christoph Hellwig
2014-08-22 0:58 ` [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname Eric Sandeen
` (2 subsequent siblings)
3 siblings, 2 replies; 15+ messages in thread
From: Eric Sandeen @ 2014-08-22 0:55 UTC (permalink / raw)
To: Eric Sandeen, xfs-oss
Move the resblks test out of the xfs_dir_canenter,
and into the caller.
This makes a little more sense on the face of it;
xfs_dir_canenter immediately returns if resblks !=0;
and given some of the comments preceding the calls:
* Check for ability to enter directory entry, if no space reserved.
even more so.
It also facilitates the next patch.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
index 6cef221..ea84e1c 100644
--- a/fs/xfs/libxfs/xfs_dir2.c
+++ b/fs/xfs/libxfs/xfs_dir2.c
@@ -535,22 +535,17 @@ out_free:
/*
* See if this entry can be added to the directory without allocating space.
- * First checks that the caller couldn't reserve enough space (resblks = 0).
*/
int
xfs_dir_canenter(
xfs_trans_t *tp,
xfs_inode_t *dp,
- struct xfs_name *name, /* name of entry to add */
- uint resblks)
+ struct xfs_name *name) /* name of entry to add */
{
struct xfs_da_args *args;
int rval;
int v; /* type-checking value */
- if (resblks)
- return 0;
-
ASSERT(S_ISDIR(dp->i_d.di_mode));
args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h
index c8e86b0..4dff261 100644
--- a/fs/xfs/libxfs/xfs_dir2.h
+++ b/fs/xfs/libxfs/xfs_dir2.h
@@ -136,7 +136,7 @@ extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
xfs_fsblock_t *first,
struct xfs_bmap_free *flist, xfs_extlen_t tot);
extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
- struct xfs_name *name, uint resblks);
+ struct xfs_name *name);
/*
* Direct call from the bmap code, bypassing the generic directory layer.
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index fea3c92..c92cb48 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1153,9 +1153,11 @@ xfs_create(
if (error)
goto out_trans_cancel;
- error = xfs_dir_canenter(tp, dp, name, resblks);
- if (error)
- goto out_trans_cancel;
+ if (!resblks) {
+ error = xfs_dir_canenter(tp, dp, name);
+ if (error)
+ goto out_trans_cancel;
+ }
/*
* A newly created regular or special file just has one directory
@@ -1421,9 +1423,11 @@ xfs_link(
goto error_return;
}
- error = xfs_dir_canenter(tp, tdp, target_name, resblks);
- if (error)
- goto error_return;
+ if (!resblks) {
+ error = xfs_dir_canenter(tp, tdp, target_name);
+ if (error)
+ goto error_return;
+ }
xfs_bmap_init(&free_list, &first_block);
@@ -2759,9 +2763,11 @@ xfs_rename(
* If there's no space reservation, check the entry will
* fit before actually inserting it.
*/
- error = xfs_dir_canenter(tp, target_dp, target_name, spaceres);
- if (error)
- goto error_return;
+ if (!spaceres) {
+ error = xfs_dir_canenter(tp, target_dp, target_name);
+ if (error)
+ goto error_return;
+ }
/*
* If target does not exist and the rename crosses
* directories, adjust the target directory link count
diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c
index 6a944a2..02ae62a 100644
--- a/fs/xfs/xfs_symlink.c
+++ b/fs/xfs/xfs_symlink.c
@@ -269,9 +269,11 @@ xfs_symlink(
/*
* Check for ability to enter directory entry, if no space reserved.
*/
- error = xfs_dir_canenter(tp, dp, link_name, resblks);
- if (error)
- goto error_return;
+ if (!resblks) {
+ error = xfs_dir_canenter(tp, dp, link_name);
+ if (error)
+ goto error_return;
+ }
/*
* Initialize the bmap freelist prior to calling either
* bmapi or the directory create code.
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname
2014-08-22 0:51 [PATCH 0/4] xfs: more code refactoring Eric Sandeen
2014-08-22 0:55 ` [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter Eric Sandeen
@ 2014-08-22 0:58 ` Eric Sandeen
2014-08-22 13:19 ` Brian Foster
` (2 more replies)
2014-08-22 1:00 ` [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary Eric Sandeen
2014-08-22 1:03 ` [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int Eric Sandeen
3 siblings, 3 replies; 15+ messages in thread
From: Eric Sandeen @ 2014-08-22 0:58 UTC (permalink / raw)
To: Eric Sandeen, xfs-oss
xfs_dir_canenter and xfs_dir_createname are
almost identical.
Fold the former into the latter, with a helpful
wrapper for the former. If createname is called without
an inode number, it now only checks for space, and does
not actually add the entry.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
index ea84e1c..fdd391f 100644
--- a/fs/xfs/libxfs/xfs_dir2.c
+++ b/fs/xfs/libxfs/xfs_dir2.c
@@ -237,7 +237,8 @@ xfs_dir_init(
}
/*
- Enter a name in a directory.
+ * Enter a name in a directory.
+ * If inum is 0, only test for available space.
*/
int
xfs_dir_createname(
@@ -254,10 +255,12 @@ xfs_dir_createname(
int v; /* type-checking value */
ASSERT(S_ISDIR(dp->i_d.di_mode));
- rval = xfs_dir_ino_validate(tp->t_mountp, inum);
- if (rval)
- return rval;
- XFS_STATS_INC(xs_dir_create);
+ if (inum) {
+ rval = xfs_dir_ino_validate(tp->t_mountp, inum);
+ if (rval)
+ return rval;
+ XFS_STATS_INC(xs_dir_create);
+ }
args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
if (!args)
@@ -276,6 +279,8 @@ xfs_dir_createname(
args->whichfork = XFS_DATA_FORK;
args->trans = tp;
args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT;
+ if (!inum)
+ args->op_flags |= XFS_DA_OP_JUSTCHECK;
if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) {
rval = xfs_dir2_sf_addname(args);
@@ -542,50 +547,7 @@ xfs_dir_canenter(
xfs_inode_t *dp,
struct xfs_name *name) /* name of entry to add */
{
- struct xfs_da_args *args;
- int rval;
- int v; /* type-checking value */
-
- ASSERT(S_ISDIR(dp->i_d.di_mode));
-
- args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
- if (!args)
- return -ENOMEM;
-
- args->geo = dp->i_mount->m_dir_geo;
- args->name = name->name;
- args->namelen = name->len;
- args->filetype = name->type;
- args->hashval = dp->i_mount->m_dirnameops->hashname(name);
- args->dp = dp;
- args->whichfork = XFS_DATA_FORK;
- args->trans = tp;
- args->op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME |
- XFS_DA_OP_OKNOENT;
-
- if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) {
- rval = xfs_dir2_sf_addname(args);
- goto out_free;
- }
-
- rval = xfs_dir2_isblock(args, &v);
- if (rval)
- goto out_free;
- if (v) {
- rval = xfs_dir2_block_addname(args);
- goto out_free;
- }
-
- rval = xfs_dir2_isleaf(args, &v);
- if (rval)
- goto out_free;
- if (v)
- rval = xfs_dir2_leaf_addname(args);
- else
- rval = xfs_dir2_node_addname(args);
-out_free:
- kmem_free(args);
- return rval;
+ return xfs_dir_createname(tp, dp, name, 0, NULL, NULL, 0);
}
/*
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary
2014-08-22 0:51 [PATCH 0/4] xfs: more code refactoring Eric Sandeen
2014-08-22 0:55 ` [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter Eric Sandeen
2014-08-22 0:58 ` [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname Eric Sandeen
@ 2014-08-22 1:00 ` Eric Sandeen
2014-08-22 13:19 ` Brian Foster
2014-08-22 1:03 ` [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int Eric Sandeen
3 siblings, 1 reply; 15+ messages in thread
From: Eric Sandeen @ 2014-08-22 1:00 UTC (permalink / raw)
To: Eric Sandeen, xfs-oss
xfs_rtmodify_summary and xfs_rtget_summary are
almost identical; fold them into
xfs_rtmodify_summary_int(), with wrappers for
each of the original calls.
The _int function modifies if a delta is passed,
and returns a summary pointer if *sum is passed.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
index f4dd697..50e3b93 100644
--- a/fs/xfs/libxfs/xfs_rtbitmap.c
+++ b/fs/xfs/libxfs/xfs_rtbitmap.c
@@ -424,20 +424,24 @@ xfs_rtfind_forw(
}
/*
- * Read and modify the summary information for a given extent size,
+ * Read and/or modify the summary information for a given extent size,
* bitmap block combination.
* Keeps track of a current summary block, so we don't keep reading
* it from the buffer cache.
+ *
+ * Summary information is returned in *sum if specified.
+ * If no delta is specified, returns summary only.
*/
int
-xfs_rtmodify_summary(
- xfs_mount_t *mp, /* file system mount point */
+xfs_rtmodify_summary_int(
+ xfs_mount_t *mp, /* file system mount structure */
xfs_trans_t *tp, /* transaction pointer */
int log, /* log2 of extent size */
xfs_rtblock_t bbno, /* bitmap block number */
int delta, /* change to make to summary info */
xfs_buf_t **rbpp, /* in/out: summary block buffer */
- xfs_fsblock_t *rsb) /* in/out: summary block number */
+ xfs_fsblock_t *rsb, /* in/out: summary block number */
+ xfs_suminfo_t *sum) /* out: summary info for this block */
{
xfs_buf_t *bp; /* buffer for the summary block */
int error; /* error value */
@@ -480,15 +484,40 @@ xfs_rtmodify_summary(
}
}
/*
- * Point to the summary information, modify and log it.
+ * Point to the summary information, modify/log it, and/or copy it out.
*/
sp = XFS_SUMPTR(mp, bp, so);
- *sp += delta;
- xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr),
- (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1));
+ if (delta) {
+ uint first = (uint)((char *)sp - (char *)bp->b_addr);
+
+ *sp += delta;
+ xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
+ }
+ if (sum) {
+ /*
+ * Drop the buffer if we're not asked to remember it.
+ */
+ if (!rbpp)
+ xfs_trans_brelse(tp, bp);
+ *sum = *sp;
+ }
return 0;
}
+int
+xfs_rtmodify_summary(
+ xfs_mount_t *mp, /* file system mount structure */
+ xfs_trans_t *tp, /* transaction pointer */
+ int log, /* log2 of extent size */
+ xfs_rtblock_t bbno, /* bitmap block number */
+ int delta, /* change to make to summary info */
+ xfs_buf_t **rbpp, /* in/out: summary block buffer */
+ xfs_fsblock_t *rsb) /* in/out: summary block number */
+{
+ return xfs_rtmodify_summary_int(mp, tp, log, bbno,
+ delta, rbpp, rsb, NULL);
+}
+
/*
* Set the given range of bitmap bits to the given value.
* Do whatever I/O and logging is required.
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c
index 909e143..d1160cc 100644
--- a/fs/xfs/xfs_rtalloc.c
+++ b/fs/xfs/xfs_rtalloc.c
@@ -46,7 +46,7 @@
* Keeps track of a current summary block, so we don't keep reading
* it from the buffer cache.
*/
-STATIC int /* error */
+int
xfs_rtget_summary(
xfs_mount_t *mp, /* file system mount structure */
xfs_trans_t *tp, /* transaction pointer */
@@ -56,60 +56,9 @@ xfs_rtget_summary(
xfs_fsblock_t *rsb, /* in/out: summary block number */
xfs_suminfo_t *sum) /* out: summary info for this block */
{
- xfs_buf_t *bp; /* buffer for summary block */
- int error; /* error value */
- xfs_fsblock_t sb; /* summary fsblock */
- int so; /* index into the summary file */
- xfs_suminfo_t *sp; /* pointer to returned data */
-
- /*
- * Compute entry number in the summary file.
- */
- so = XFS_SUMOFFS(mp, log, bbno);
- /*
- * Compute the block number in the summary file.
- */
- sb = XFS_SUMOFFSTOBLOCK(mp, so);
- /*
- * If we have an old buffer, and the block number matches, use that.
- */
- if (rbpp && *rbpp && *rsb == sb)
- bp = *rbpp;
- /*
- * Otherwise we have to get the buffer.
- */
- else {
- /*
- * If there was an old one, get rid of it first.
- */
- if (rbpp && *rbpp)
- xfs_trans_brelse(tp, *rbpp);
- error = xfs_rtbuf_get(mp, tp, sb, 1, &bp);
- if (error) {
- return error;
- }
- /*
- * Remember this buffer and block for the next call.
- */
- if (rbpp) {
- *rbpp = bp;
- *rsb = sb;
- }
- }
- /*
- * Point to the summary information & copy it out.
- */
- sp = XFS_SUMPTR(mp, bp, so);
- *sum = *sp;
- /*
- * Drop the buffer if we're not asked to remember it.
- */
- if (!rbpp)
- xfs_trans_brelse(tp, bp);
- return 0;
+ return xfs_rtmodify_summary_int(mp, tp, log, bbno, 0, rbpp, rsb, sum);
}
-
/*
* Return whether there are any free extents in the size range given
* by low and high, for the bitmap block bbno.
diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h
index c642795..76c0a4a 100644
--- a/fs/xfs/xfs_rtalloc.h
+++ b/fs/xfs/xfs_rtalloc.h
@@ -111,6 +111,10 @@ int xfs_rtfind_forw(struct xfs_mount *mp, struct xfs_trans *tp,
xfs_rtblock_t *rtblock);
int xfs_rtmodify_range(struct xfs_mount *mp, struct xfs_trans *tp,
xfs_rtblock_t start, xfs_extlen_t len, int val);
+int xfs_rtmodify_summary_int(struct xfs_mount *mp, struct xfs_trans *tp,
+ int log, xfs_rtblock_t bbno, int delta,
+ xfs_buf_t **rbpp, xfs_fsblock_t *rsb,
+ xfs_suminfo_t *sum);
int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log,
xfs_rtblock_t bbno, int delta, xfs_buf_t **rbpp,
xfs_fsblock_t *rsb);
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int
2014-08-22 0:51 [PATCH 0/4] xfs: more code refactoring Eric Sandeen
` (2 preceding siblings ...)
2014-08-22 1:00 ` [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary Eric Sandeen
@ 2014-08-22 1:03 ` Eric Sandeen
2014-08-22 13:20 ` Brian Foster
3 siblings, 1 reply; 15+ messages in thread
From: Eric Sandeen @ 2014-08-22 1:03 UTC (permalink / raw)
To: Eric Sandeen, xfs-oss
rbpp is always passed into xfs_rtmodify_summary
and xfs_rtget_summary, so there is no need to
test for it in xfs_rtmodify_summary_int.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
index 50e3b93..7c818f1 100644
--- a/fs/xfs/libxfs/xfs_rtbitmap.c
+++ b/fs/xfs/libxfs/xfs_rtbitmap.c
@@ -460,7 +460,7 @@ xfs_rtmodify_summary_int(
/*
* If we have an old buffer, and the block number matches, use that.
*/
- if (rbpp && *rbpp && *rsb == sb)
+ if (*rbpp && *rsb == sb)
bp = *rbpp;
/*
* Otherwise we have to get the buffer.
@@ -469,7 +469,7 @@ xfs_rtmodify_summary_int(
/*
* If there was an old one, get rid of it first.
*/
- if (rbpp && *rbpp)
+ if (*rbpp)
xfs_trans_brelse(tp, *rbpp);
error = xfs_rtbuf_get(mp, tp, sb, 1, &bp);
if (error) {
@@ -478,10 +478,8 @@ xfs_rtmodify_summary_int(
/*
* Remember this buffer and block for the next call.
*/
- if (rbpp) {
- *rbpp = bp;
- *rsb = sb;
- }
+ *rbpp = bp;
+ *rsb = sb;
}
/*
* Point to the summary information, modify/log it, and/or copy it out.
@@ -493,14 +491,8 @@ xfs_rtmodify_summary_int(
*sp += delta;
xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
}
- if (sum) {
- /*
- * Drop the buffer if we're not asked to remember it.
- */
- if (!rbpp)
- xfs_trans_brelse(tp, bp);
+ if (sum)
*sum = *sp;
- }
return 0;
}
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter
2014-08-22 0:55 ` [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter Eric Sandeen
@ 2014-08-22 13:19 ` Brian Foster
2014-08-29 0:59 ` Christoph Hellwig
1 sibling, 0 replies; 15+ messages in thread
From: Brian Foster @ 2014-08-22 13:19 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, xfs-oss
On Thu, Aug 21, 2014 at 07:55:21PM -0500, Eric Sandeen wrote:
> Move the resblks test out of the xfs_dir_canenter,
> and into the caller.
>
> This makes a little more sense on the face of it;
> xfs_dir_canenter immediately returns if resblks !=0;
> and given some of the comments preceding the calls:
>
> * Check for ability to enter directory entry, if no space reserved.
>
> even more so.
>
> It also facilitates the next patch.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
Reviewed-by: Brian Foster <bfoster@redhat.com>
>
>
> diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
> index 6cef221..ea84e1c 100644
> --- a/fs/xfs/libxfs/xfs_dir2.c
> +++ b/fs/xfs/libxfs/xfs_dir2.c
> @@ -535,22 +535,17 @@ out_free:
>
> /*
> * See if this entry can be added to the directory without allocating space.
> - * First checks that the caller couldn't reserve enough space (resblks = 0).
> */
> int
> xfs_dir_canenter(
> xfs_trans_t *tp,
> xfs_inode_t *dp,
> - struct xfs_name *name, /* name of entry to add */
> - uint resblks)
> + struct xfs_name *name) /* name of entry to add */
> {
> struct xfs_da_args *args;
> int rval;
> int v; /* type-checking value */
>
> - if (resblks)
> - return 0;
> -
> ASSERT(S_ISDIR(dp->i_d.di_mode));
>
> args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
> diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h
> index c8e86b0..4dff261 100644
> --- a/fs/xfs/libxfs/xfs_dir2.h
> +++ b/fs/xfs/libxfs/xfs_dir2.h
> @@ -136,7 +136,7 @@ extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
> xfs_fsblock_t *first,
> struct xfs_bmap_free *flist, xfs_extlen_t tot);
> extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
> - struct xfs_name *name, uint resblks);
> + struct xfs_name *name);
>
> /*
> * Direct call from the bmap code, bypassing the generic directory layer.
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index fea3c92..c92cb48 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -1153,9 +1153,11 @@ xfs_create(
> if (error)
> goto out_trans_cancel;
>
> - error = xfs_dir_canenter(tp, dp, name, resblks);
> - if (error)
> - goto out_trans_cancel;
> + if (!resblks) {
> + error = xfs_dir_canenter(tp, dp, name);
> + if (error)
> + goto out_trans_cancel;
> + }
>
> /*
> * A newly created regular or special file just has one directory
> @@ -1421,9 +1423,11 @@ xfs_link(
> goto error_return;
> }
>
> - error = xfs_dir_canenter(tp, tdp, target_name, resblks);
> - if (error)
> - goto error_return;
> + if (!resblks) {
> + error = xfs_dir_canenter(tp, tdp, target_name);
> + if (error)
> + goto error_return;
> + }
>
> xfs_bmap_init(&free_list, &first_block);
>
> @@ -2759,9 +2763,11 @@ xfs_rename(
> * If there's no space reservation, check the entry will
> * fit before actually inserting it.
> */
> - error = xfs_dir_canenter(tp, target_dp, target_name, spaceres);
> - if (error)
> - goto error_return;
> + if (!spaceres) {
> + error = xfs_dir_canenter(tp, target_dp, target_name);
> + if (error)
> + goto error_return;
> + }
> /*
> * If target does not exist and the rename crosses
> * directories, adjust the target directory link count
> diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c
> index 6a944a2..02ae62a 100644
> --- a/fs/xfs/xfs_symlink.c
> +++ b/fs/xfs/xfs_symlink.c
> @@ -269,9 +269,11 @@ xfs_symlink(
> /*
> * Check for ability to enter directory entry, if no space reserved.
> */
> - error = xfs_dir_canenter(tp, dp, link_name, resblks);
> - if (error)
> - goto error_return;
> + if (!resblks) {
> + error = xfs_dir_canenter(tp, dp, link_name);
> + if (error)
> + goto error_return;
> + }
> /*
> * Initialize the bmap freelist prior to calling either
> * bmapi or the directory create code.
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname
2014-08-22 0:58 ` [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname Eric Sandeen
@ 2014-08-22 13:19 ` Brian Foster
2014-08-29 1:00 ` Christoph Hellwig
2014-08-29 2:14 ` [PATCH 2/4 V2] " Eric Sandeen
2 siblings, 0 replies; 15+ messages in thread
From: Brian Foster @ 2014-08-22 13:19 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, xfs-oss
On Thu, Aug 21, 2014 at 07:58:43PM -0500, Eric Sandeen wrote:
> xfs_dir_canenter and xfs_dir_createname are
> almost identical.
>
> Fold the former into the latter, with a helpful
> wrapper for the former. If createname is called without
> an inode number, it now only checks for space, and does
> not actually add the entry.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
Reviewed-by: Brian Foster <bfoster@redhat.com>
>
> diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
> index ea84e1c..fdd391f 100644
> --- a/fs/xfs/libxfs/xfs_dir2.c
> +++ b/fs/xfs/libxfs/xfs_dir2.c
> @@ -237,7 +237,8 @@ xfs_dir_init(
> }
>
> /*
> - Enter a name in a directory.
> + * Enter a name in a directory.
> + * If inum is 0, only test for available space.
> */
> int
> xfs_dir_createname(
> @@ -254,10 +255,12 @@ xfs_dir_createname(
> int v; /* type-checking value */
>
> ASSERT(S_ISDIR(dp->i_d.di_mode));
> - rval = xfs_dir_ino_validate(tp->t_mountp, inum);
> - if (rval)
> - return rval;
> - XFS_STATS_INC(xs_dir_create);
> + if (inum) {
> + rval = xfs_dir_ino_validate(tp->t_mountp, inum);
> + if (rval)
> + return rval;
> + XFS_STATS_INC(xs_dir_create);
> + }
>
> args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
> if (!args)
> @@ -276,6 +279,8 @@ xfs_dir_createname(
> args->whichfork = XFS_DATA_FORK;
> args->trans = tp;
> args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT;
> + if (!inum)
> + args->op_flags |= XFS_DA_OP_JUSTCHECK;
>
> if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) {
> rval = xfs_dir2_sf_addname(args);
> @@ -542,50 +547,7 @@ xfs_dir_canenter(
> xfs_inode_t *dp,
> struct xfs_name *name) /* name of entry to add */
> {
> - struct xfs_da_args *args;
> - int rval;
> - int v; /* type-checking value */
> -
> - ASSERT(S_ISDIR(dp->i_d.di_mode));
> -
> - args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
> - if (!args)
> - return -ENOMEM;
> -
> - args->geo = dp->i_mount->m_dir_geo;
> - args->name = name->name;
> - args->namelen = name->len;
> - args->filetype = name->type;
> - args->hashval = dp->i_mount->m_dirnameops->hashname(name);
> - args->dp = dp;
> - args->whichfork = XFS_DATA_FORK;
> - args->trans = tp;
> - args->op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME |
> - XFS_DA_OP_OKNOENT;
> -
> - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) {
> - rval = xfs_dir2_sf_addname(args);
> - goto out_free;
> - }
> -
> - rval = xfs_dir2_isblock(args, &v);
> - if (rval)
> - goto out_free;
> - if (v) {
> - rval = xfs_dir2_block_addname(args);
> - goto out_free;
> - }
> -
> - rval = xfs_dir2_isleaf(args, &v);
> - if (rval)
> - goto out_free;
> - if (v)
> - rval = xfs_dir2_leaf_addname(args);
> - else
> - rval = xfs_dir2_node_addname(args);
> -out_free:
> - kmem_free(args);
> - return rval;
> + return xfs_dir_createname(tp, dp, name, 0, NULL, NULL, 0);
> }
>
> /*
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary
2014-08-22 1:00 ` [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary Eric Sandeen
@ 2014-08-22 13:19 ` Brian Foster
2014-08-22 15:01 ` Eric Sandeen
0 siblings, 1 reply; 15+ messages in thread
From: Brian Foster @ 2014-08-22 13:19 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, xfs-oss
On Thu, Aug 21, 2014 at 08:00:45PM -0500, Eric Sandeen wrote:
> xfs_rtmodify_summary and xfs_rtget_summary are
> almost identical; fold them into
> xfs_rtmodify_summary_int(), with wrappers for
> each of the original calls.
>
> The _int function modifies if a delta is passed,
> and returns a summary pointer if *sum is passed.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
>
> diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
> index f4dd697..50e3b93 100644
> --- a/fs/xfs/libxfs/xfs_rtbitmap.c
> +++ b/fs/xfs/libxfs/xfs_rtbitmap.c
> @@ -424,20 +424,24 @@ xfs_rtfind_forw(
> }
>
> /*
> - * Read and modify the summary information for a given extent size,
> + * Read and/or modify the summary information for a given extent size,
> * bitmap block combination.
> * Keeps track of a current summary block, so we don't keep reading
> * it from the buffer cache.
> + *
> + * Summary information is returned in *sum if specified.
> + * If no delta is specified, returns summary only.
> */
> int
> -xfs_rtmodify_summary(
> - xfs_mount_t *mp, /* file system mount point */
> +xfs_rtmodify_summary_int(
> + xfs_mount_t *mp, /* file system mount structure */
> xfs_trans_t *tp, /* transaction pointer */
> int log, /* log2 of extent size */
> xfs_rtblock_t bbno, /* bitmap block number */
> int delta, /* change to make to summary info */
> xfs_buf_t **rbpp, /* in/out: summary block buffer */
> - xfs_fsblock_t *rsb) /* in/out: summary block number */
> + xfs_fsblock_t *rsb, /* in/out: summary block number */
> + xfs_suminfo_t *sum) /* out: summary info for this block */
> {
> xfs_buf_t *bp; /* buffer for the summary block */
> int error; /* error value */
> @@ -480,15 +484,40 @@ xfs_rtmodify_summary(
> }
> }
> /*
> - * Point to the summary information, modify and log it.
> + * Point to the summary information, modify/log it, and/or copy it out.
> */
> sp = XFS_SUMPTR(mp, bp, so);
> - *sp += delta;
> - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr),
> - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1));
> + if (delta) {
> + uint first = (uint)((char *)sp - (char *)bp->b_addr);
> +
> + *sp += delta;
> + xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
> + }
> + if (sum) {
> + /*
> + * Drop the buffer if we're not asked to remember it.
> + */
> + if (!rbpp)
> + xfs_trans_brelse(tp, bp);
This introduces some potentially weird circumstances (e.g., acquire,
log, release of a buffer), but I think it's resolved by the next patch.
Reviewed-by: Brian Foster <bfoster@redhat.com>
> + *sum = *sp;
> + }
> return 0;
> }
>
> +int
> +xfs_rtmodify_summary(
> + xfs_mount_t *mp, /* file system mount structure */
> + xfs_trans_t *tp, /* transaction pointer */
> + int log, /* log2 of extent size */
> + xfs_rtblock_t bbno, /* bitmap block number */
> + int delta, /* change to make to summary info */
> + xfs_buf_t **rbpp, /* in/out: summary block buffer */
> + xfs_fsblock_t *rsb) /* in/out: summary block number */
> +{
> + return xfs_rtmodify_summary_int(mp, tp, log, bbno,
> + delta, rbpp, rsb, NULL);
> +}
> +
> /*
> * Set the given range of bitmap bits to the given value.
> * Do whatever I/O and logging is required.
> diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c
> index 909e143..d1160cc 100644
> --- a/fs/xfs/xfs_rtalloc.c
> +++ b/fs/xfs/xfs_rtalloc.c
> @@ -46,7 +46,7 @@
> * Keeps track of a current summary block, so we don't keep reading
> * it from the buffer cache.
> */
> -STATIC int /* error */
> +int
> xfs_rtget_summary(
> xfs_mount_t *mp, /* file system mount structure */
> xfs_trans_t *tp, /* transaction pointer */
> @@ -56,60 +56,9 @@ xfs_rtget_summary(
> xfs_fsblock_t *rsb, /* in/out: summary block number */
> xfs_suminfo_t *sum) /* out: summary info for this block */
> {
> - xfs_buf_t *bp; /* buffer for summary block */
> - int error; /* error value */
> - xfs_fsblock_t sb; /* summary fsblock */
> - int so; /* index into the summary file */
> - xfs_suminfo_t *sp; /* pointer to returned data */
> -
> - /*
> - * Compute entry number in the summary file.
> - */
> - so = XFS_SUMOFFS(mp, log, bbno);
> - /*
> - * Compute the block number in the summary file.
> - */
> - sb = XFS_SUMOFFSTOBLOCK(mp, so);
> - /*
> - * If we have an old buffer, and the block number matches, use that.
> - */
> - if (rbpp && *rbpp && *rsb == sb)
> - bp = *rbpp;
> - /*
> - * Otherwise we have to get the buffer.
> - */
> - else {
> - /*
> - * If there was an old one, get rid of it first.
> - */
> - if (rbpp && *rbpp)
> - xfs_trans_brelse(tp, *rbpp);
> - error = xfs_rtbuf_get(mp, tp, sb, 1, &bp);
> - if (error) {
> - return error;
> - }
> - /*
> - * Remember this buffer and block for the next call.
> - */
> - if (rbpp) {
> - *rbpp = bp;
> - *rsb = sb;
> - }
> - }
> - /*
> - * Point to the summary information & copy it out.
> - */
> - sp = XFS_SUMPTR(mp, bp, so);
> - *sum = *sp;
> - /*
> - * Drop the buffer if we're not asked to remember it.
> - */
> - if (!rbpp)
> - xfs_trans_brelse(tp, bp);
> - return 0;
> + return xfs_rtmodify_summary_int(mp, tp, log, bbno, 0, rbpp, rsb, sum);
> }
>
> -
> /*
> * Return whether there are any free extents in the size range given
> * by low and high, for the bitmap block bbno.
> diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h
> index c642795..76c0a4a 100644
> --- a/fs/xfs/xfs_rtalloc.h
> +++ b/fs/xfs/xfs_rtalloc.h
> @@ -111,6 +111,10 @@ int xfs_rtfind_forw(struct xfs_mount *mp, struct xfs_trans *tp,
> xfs_rtblock_t *rtblock);
> int xfs_rtmodify_range(struct xfs_mount *mp, struct xfs_trans *tp,
> xfs_rtblock_t start, xfs_extlen_t len, int val);
> +int xfs_rtmodify_summary_int(struct xfs_mount *mp, struct xfs_trans *tp,
> + int log, xfs_rtblock_t bbno, int delta,
> + xfs_buf_t **rbpp, xfs_fsblock_t *rsb,
> + xfs_suminfo_t *sum);
> int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log,
> xfs_rtblock_t bbno, int delta, xfs_buf_t **rbpp,
> xfs_fsblock_t *rsb);
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int
2014-08-22 1:03 ` [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int Eric Sandeen
@ 2014-08-22 13:20 ` Brian Foster
2014-08-23 23:50 ` Eric Sandeen
0 siblings, 1 reply; 15+ messages in thread
From: Brian Foster @ 2014-08-22 13:20 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, xfs-oss
On Thu, Aug 21, 2014 at 08:03:19PM -0500, Eric Sandeen wrote:
> rbpp is always passed into xfs_rtmodify_summary
> and xfs_rtget_summary, so there is no need to
> test for it in xfs_rtmodify_summary_int.
>
Looks fine, but this is also called through a variety of twisty paths.
Could we add a top-level error check or assert?
Brian
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
>
> diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
> index 50e3b93..7c818f1 100644
> --- a/fs/xfs/libxfs/xfs_rtbitmap.c
> +++ b/fs/xfs/libxfs/xfs_rtbitmap.c
> @@ -460,7 +460,7 @@ xfs_rtmodify_summary_int(
> /*
> * If we have an old buffer, and the block number matches, use that.
> */
> - if (rbpp && *rbpp && *rsb == sb)
> + if (*rbpp && *rsb == sb)
> bp = *rbpp;
> /*
> * Otherwise we have to get the buffer.
> @@ -469,7 +469,7 @@ xfs_rtmodify_summary_int(
> /*
> * If there was an old one, get rid of it first.
> */
> - if (rbpp && *rbpp)
> + if (*rbpp)
> xfs_trans_brelse(tp, *rbpp);
> error = xfs_rtbuf_get(mp, tp, sb, 1, &bp);
> if (error) {
> @@ -478,10 +478,8 @@ xfs_rtmodify_summary_int(
> /*
> * Remember this buffer and block for the next call.
> */
> - if (rbpp) {
> - *rbpp = bp;
> - *rsb = sb;
> - }
> + *rbpp = bp;
> + *rsb = sb;
> }
> /*
> * Point to the summary information, modify/log it, and/or copy it out.
> @@ -493,14 +491,8 @@ xfs_rtmodify_summary_int(
> *sp += delta;
> xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
> }
> - if (sum) {
> - /*
> - * Drop the buffer if we're not asked to remember it.
> - */
> - if (!rbpp)
> - xfs_trans_brelse(tp, bp);
> + if (sum)
> *sum = *sp;
> - }
> return 0;
> }
>
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary
2014-08-22 13:19 ` Brian Foster
@ 2014-08-22 15:01 ` Eric Sandeen
2014-08-22 15:23 ` Eric Sandeen
0 siblings, 1 reply; 15+ messages in thread
From: Eric Sandeen @ 2014-08-22 15:01 UTC (permalink / raw)
To: Brian Foster; +Cc: Eric Sandeen, xfs-oss
On 8/22/14, 8:19 AM, Brian Foster wrote:
> On Thu, Aug 21, 2014 at 08:00:45PM -0500, Eric Sandeen wrote:
...
>> @@ -480,15 +484,40 @@ xfs_rtmodify_summary(
>> }
>> }
>> /*
>> - * Point to the summary information, modify and log it.
>> + * Point to the summary information, modify/log it, and/or copy it out.
>> */
>> sp = XFS_SUMPTR(mp, bp, so);
>> - *sp += delta;
>> - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr),
>> - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1));
>> + if (delta) {
>> + uint first = (uint)((char *)sp - (char *)bp->b_addr);
>> +
>> + *sp += delta;
>> + xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
>> + }
>> + if (sum) {
>> + /*
>> + * Drop the buffer if we're not asked to remember it.
>> + */
>> + if (!rbpp)
>> + xfs_trans_brelse(tp, bp);
>
> This introduces some potentially weird circumstances (e.g., acquire,
> log, release of a buffer), but I think it's resolved by the next patch.
>
> Reviewed-by: Brian Foster <bfoster@redhat.com>
does it introduce it, or just highlight it? I thought it was weird too,
but I think it existed before; that's what prompted me to go looking at
callers and drop the rbpp checks, FWIW.
-Eric
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary
2014-08-22 15:01 ` Eric Sandeen
@ 2014-08-22 15:23 ` Eric Sandeen
0 siblings, 0 replies; 15+ messages in thread
From: Eric Sandeen @ 2014-08-22 15:23 UTC (permalink / raw)
To: Brian Foster; +Cc: Eric Sandeen, xfs-oss
On 8/22/14, 10:01 AM, Eric Sandeen wrote:
> On 8/22/14, 8:19 AM, Brian Foster wrote:
>> On Thu, Aug 21, 2014 at 08:00:45PM -0500, Eric Sandeen wrote:
>
> ...
>
>>> @@ -480,15 +484,40 @@ xfs_rtmodify_summary(
>>> }
>>> }
>>> /*
>>> - * Point to the summary information, modify and log it.
>>> + * Point to the summary information, modify/log it, and/or copy it out.
>>> */
>>> sp = XFS_SUMPTR(mp, bp, so);
>>> - *sp += delta;
>>> - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr),
>>> - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1));
>>> + if (delta) {
>>> + uint first = (uint)((char *)sp - (char *)bp->b_addr);
>>> +
>>> + *sp += delta;
>>> + xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
>>> + }
>>> + if (sum) {
>>> + /*
>>> + * Drop the buffer if we're not asked to remember it.
>>> + */
>>> + if (!rbpp)
>>> + xfs_trans_brelse(tp, bp);
>>
>> This introduces some potentially weird circumstances (e.g., acquire,
>> log, release of a buffer), but I think it's resolved by the next patch.
>>
>> Reviewed-by: Brian Foster <bfoster@redhat.com>
>
> does it introduce it, or just highlight it? I thought it was weird too,
> but I think it existed before; that's what prompted me to go looking at
> callers and drop the rbpp checks, FWIW.
Oh, right, if delta & sum,there's a problem if (!rpbb). And I did introduce
that as a new issue. But the code at that point never sees (!rbpp) so I think
it's safe. I could respin patches 3 & 4, to do them in the opposite order,
if desired.
-Eric
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int
2014-08-22 13:20 ` Brian Foster
@ 2014-08-23 23:50 ` Eric Sandeen
0 siblings, 0 replies; 15+ messages in thread
From: Eric Sandeen @ 2014-08-23 23:50 UTC (permalink / raw)
To: Brian Foster; +Cc: Eric Sandeen, xfs-oss
On 8/22/14, 8:20 AM, Brian Foster wrote:
> On Thu, Aug 21, 2014 at 08:03:19PM -0500, Eric Sandeen wrote:
>> rbpp is always passed into xfs_rtmodify_summary
>> and xfs_rtget_summary, so there is no need to
>> test for it in xfs_rtmodify_summary_int.
>>
>
> Looks fine, but this is also called through a variety of twisty paths.
> Could we add a top-level error check or assert?
We could, though it'll oops pretty fast if we don't send rbpp anyway.
An ASSERT might be decent for documentation, though...
-Eric
> Brian
>
>> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
>> ---
>>
>> diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
>> index 50e3b93..7c818f1 100644
>> --- a/fs/xfs/libxfs/xfs_rtbitmap.c
>> +++ b/fs/xfs/libxfs/xfs_rtbitmap.c
>> @@ -460,7 +460,7 @@ xfs_rtmodify_summary_int(
>> /*
>> * If we have an old buffer, and the block number matches, use that.
>> */
>> - if (rbpp && *rbpp && *rsb == sb)
>> + if (*rbpp && *rsb == sb)
>> bp = *rbpp;
>> /*
>> * Otherwise we have to get the buffer.
>> @@ -469,7 +469,7 @@ xfs_rtmodify_summary_int(
>> /*
>> * If there was an old one, get rid of it first.
>> */
>> - if (rbpp && *rbpp)
>> + if (*rbpp)
>> xfs_trans_brelse(tp, *rbpp);
>> error = xfs_rtbuf_get(mp, tp, sb, 1, &bp);
>> if (error) {
>> @@ -478,10 +478,8 @@ xfs_rtmodify_summary_int(
>> /*
>> * Remember this buffer and block for the next call.
>> */
>> - if (rbpp) {
>> - *rbpp = bp;
>> - *rsb = sb;
>> - }
>> + *rbpp = bp;
>> + *rsb = sb;
>> }
>> /*
>> * Point to the summary information, modify/log it, and/or copy it out.
>> @@ -493,14 +491,8 @@ xfs_rtmodify_summary_int(
>> *sp += delta;
>> xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
>> }
>> - if (sum) {
>> - /*
>> - * Drop the buffer if we're not asked to remember it.
>> - */
>> - if (!rbpp)
>> - xfs_trans_brelse(tp, bp);
>> + if (sum)
>> *sum = *sp;
>> - }
>> return 0;
>> }
>>
>>
>>
>> _______________________________________________
>> xfs mailing list
>> xfs@oss.sgi.com
>> http://oss.sgi.com/mailman/listinfo/xfs
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
>
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter
2014-08-22 0:55 ` [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter Eric Sandeen
2014-08-22 13:19 ` Brian Foster
@ 2014-08-29 0:59 ` Christoph Hellwig
1 sibling, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2014-08-29 0:59 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, xfs-oss
Looks good (although not useful on it's own, but there's more followups)
Reviewed-by: Christoph Hellwig <hch@lst.de>
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname
2014-08-22 0:58 ` [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname Eric Sandeen
2014-08-22 13:19 ` Brian Foster
@ 2014-08-29 1:00 ` Christoph Hellwig
2014-08-29 2:14 ` [PATCH 2/4 V2] " Eric Sandeen
2 siblings, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2014-08-29 1:00 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, xfs-oss
On Thu, Aug 21, 2014 at 07:58:43PM -0500, Eric Sandeen wrote:
> xfs_dir_canenter and xfs_dir_createname are
> almost identical.
>
> Fold the former into the latter, with a helpful
> wrapper for the former. If createname is called without
> an inode number, it now only checks for space, and does
> not actually add the entry.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
The code changes looks good to me, but..
> /*
> - Enter a name in a directory.
> + * Enter a name in a directory.
> + * If inum is 0, only test for available space.
> */
> int
> xfs_dir_createname(
Given how confusing the xfs_dir_createname function name is now this
probably needs a more detailed description mentioning the checking as
first class behavior.
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/4 V2] xfs: combine xfs_dir_canenter into xfs_dir_createname
2014-08-22 0:58 ` [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname Eric Sandeen
2014-08-22 13:19 ` Brian Foster
2014-08-29 1:00 ` Christoph Hellwig
@ 2014-08-29 2:14 ` Eric Sandeen
2 siblings, 0 replies; 15+ messages in thread
From: Eric Sandeen @ 2014-08-29 2:14 UTC (permalink / raw)
To: Eric Sandeen, xfs-oss
xfs_dir_canenter and xfs_dir_createname are
almost identical.
Fold the former into the latter, with a helpful
wrapper for the former. If createname is called without
an inode number, it now only checks for space, and does
not actually add the entry.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
V2: slightly more verbose comment
diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
index ea84e1c..fdd391f 100644
--- a/fs/xfs/libxfs/xfs_dir2.c
+++ b/fs/xfs/libxfs/xfs_dir2.c
@@ -237,7 +237,8 @@ xfs_dir_init(
}
/*
- Enter a name in a directory.
+ * Enter a name in a directory, or check for available space.
+ * If inum is 0, only the available space test is performed.
*/
int
xfs_dir_createname(
@@ -254,10 +255,12 @@ xfs_dir_createname(
int v; /* type-checking value */
ASSERT(S_ISDIR(dp->i_d.di_mode));
- rval = xfs_dir_ino_validate(tp->t_mountp, inum);
- if (rval)
- return rval;
- XFS_STATS_INC(xs_dir_create);
+ if (inum) {
+ rval = xfs_dir_ino_validate(tp->t_mountp, inum);
+ if (rval)
+ return rval;
+ XFS_STATS_INC(xs_dir_create);
+ }
args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
if (!args)
@@ -276,6 +279,8 @@ xfs_dir_createname(
args->whichfork = XFS_DATA_FORK;
args->trans = tp;
args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT;
+ if (!inum)
+ args->op_flags |= XFS_DA_OP_JUSTCHECK;
if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) {
rval = xfs_dir2_sf_addname(args);
@@ -542,50 +547,7 @@ xfs_dir_canenter(
xfs_inode_t *dp,
struct xfs_name *name) /* name of entry to add */
{
- struct xfs_da_args *args;
- int rval;
- int v; /* type-checking value */
-
- ASSERT(S_ISDIR(dp->i_d.di_mode));
-
- args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
- if (!args)
- return -ENOMEM;
-
- args->geo = dp->i_mount->m_dir_geo;
- args->name = name->name;
- args->namelen = name->len;
- args->filetype = name->type;
- args->hashval = dp->i_mount->m_dirnameops->hashname(name);
- args->dp = dp;
- args->whichfork = XFS_DATA_FORK;
- args->trans = tp;
- args->op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME |
- XFS_DA_OP_OKNOENT;
-
- if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) {
- rval = xfs_dir2_sf_addname(args);
- goto out_free;
- }
-
- rval = xfs_dir2_isblock(args, &v);
- if (rval)
- goto out_free;
- if (v) {
- rval = xfs_dir2_block_addname(args);
- goto out_free;
- }
-
- rval = xfs_dir2_isleaf(args, &v);
- if (rval)
- goto out_free;
- if (v)
- rval = xfs_dir2_leaf_addname(args);
- else
- rval = xfs_dir2_node_addname(args);
-out_free:
- kmem_free(args);
- return rval;
+ return xfs_dir_createname(tp, dp, name, 0, NULL, NULL, 0);
}
/*
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply related [flat|nested] 15+ messages in thread
end of thread, other threads:[~2014-08-29 2:14 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-22 0:51 [PATCH 0/4] xfs: more code refactoring Eric Sandeen
2014-08-22 0:55 ` [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter Eric Sandeen
2014-08-22 13:19 ` Brian Foster
2014-08-29 0:59 ` Christoph Hellwig
2014-08-22 0:58 ` [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname Eric Sandeen
2014-08-22 13:19 ` Brian Foster
2014-08-29 1:00 ` Christoph Hellwig
2014-08-29 2:14 ` [PATCH 2/4 V2] " Eric Sandeen
2014-08-22 1:00 ` [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary Eric Sandeen
2014-08-22 13:19 ` Brian Foster
2014-08-22 15:01 ` Eric Sandeen
2014-08-22 15:23 ` Eric Sandeen
2014-08-22 1:03 ` [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int Eric Sandeen
2014-08-22 13:20 ` Brian Foster
2014-08-23 23:50 ` Eric Sandeen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.