]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: convert list of extents to free into a regular list
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 10 Aug 2016 01:29:36 +0000 (11:29 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 10 Aug 2016 01:29:36 +0000 (11:29 +1000)
Source kernel commit: e66a4c678e64932eb4befd95a348b9632603d27c

In struct xfs_bmap_free, convert the open-coded free extent list to
a regular list, then use list_sort to sort it prior to processing.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
libxfs/init.c
libxfs/libxfs_priv.h
libxfs/util.c
libxfs/xfs_bmap.c
libxfs/xfs_bmap.h

index e04b6e0cc7ce259042057568d35906296bdab95d..697d303979ed0be1fb411d48cd3fb9de369762d0 100644 (file)
@@ -417,7 +417,7 @@ manage_zones(int release)
        xfs_btree_cur_zone = kmem_zone_init(
                        sizeof(xfs_btree_cur_t), "xfs_btree_cur");
        xfs_bmap_free_item_zone = kmem_zone_init(
-                       sizeof(xfs_bmap_free_item_t), "xfs_bmap_free_item");
+                       sizeof(struct xfs_bmap_free_item), "xfs_bmap_free_item");
        xfs_log_item_desc_zone = kmem_zone_init(
                        sizeof(struct xfs_log_item_desc), "xfs_log_item_desc");
        xfs_dir_startup();
index eba7640d61e83dae62f960af3c49b0ebd7a0f2e8..cb4639ad9c238ee8a4756e9f0d1e8d61271b31cb 100644 (file)
@@ -474,8 +474,7 @@ struct xfs_buftarg;
 int xfs_attr_rmtval_get(struct xfs_da_args *);
 
 /* xfs_bmap.c */
-void xfs_bmap_del_free(struct xfs_bmap_free *, struct xfs_bmap_free_item *,
-                       struct xfs_bmap_free_item *);
+void xfs_bmap_del_free(struct xfs_bmap_free *, struct xfs_bmap_free_item *);
 
 /* xfs_mount.c */
 int xfs_initialize_perag_data(struct xfs_mount *, xfs_agnumber_t);
index 2a38c89fb0e26228b54c41ed100e1df0bf99c779..e6404e6434b10770ba5b698bfbc0881a15b2e031 100644 (file)
@@ -479,20 +479,20 @@ libxfs_bmap_finish(
        struct xfs_bmap_free    *flist,
        struct xfs_inode        *ip)
 {
-       xfs_bmap_free_item_t    *free;  /* free extent list item */
-       xfs_bmap_free_item_t    *next;  /* next item on free list */
+       struct xfs_bmap_free_item *free;        /* free extent list item */
        int                     error;
 
        if (flist->xbf_count == 0)
                return 0;
 
-       for (free = flist->xbf_first; free != NULL; free = next) {
-               next = free->xbfi_next;
+       while (!list_empty(&flist->xbf_flist)) {
+               free = list_first_entry(&flist->xbf_flist,
+                       struct xfs_bmap_free_item, xbfi_list);
                error = xfs_free_extent(*tp, free->xbfi_startblock,
                                        free->xbfi_blockcount);
                if (error)
                        return error;
-               xfs_bmap_del_free(flist, NULL, free);
+               xfs_bmap_del_free(flist, free);
        }
        return 0;
 }
index c2a2c53327e5bccce1fbbaaef787a48112d206cc..65de5addd629310be32f7195faa4de2be8a736d5 100644 (file)
@@ -567,9 +567,7 @@ xfs_bmap_add_free(
        xfs_fsblock_t           bno,            /* fs block number of extent */
        xfs_filblks_t           len)            /* length of extent */
 {
-       xfs_bmap_free_item_t    *cur;           /* current (next) element */
-       xfs_bmap_free_item_t    *new;           /* new element */
-       xfs_bmap_free_item_t    *prev;          /* previous element */
+       struct xfs_bmap_free_item       *new;           /* new element */
 #ifdef DEBUG
        xfs_agnumber_t          agno;
        xfs_agblock_t           agbno;
@@ -589,17 +587,7 @@ xfs_bmap_add_free(
        new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP);
        new->xbfi_startblock = bno;
        new->xbfi_blockcount = (xfs_extlen_t)len;
-       for (prev = NULL, cur = flist->xbf_first;
-            cur != NULL;
-            prev = cur, cur = cur->xbfi_next) {
-               if (cur->xbfi_startblock >= bno)
-                       break;
-       }
-       if (prev)
-               prev->xbfi_next = new;
-       else
-               flist->xbf_first = new;
-       new->xbfi_next = cur;
+       list_add(&new->xbfi_list, &flist->xbf_flist);
        flist->xbf_count++;
 }
 
@@ -609,14 +597,10 @@ xfs_bmap_add_free(
  */
 void
 xfs_bmap_del_free(
-       xfs_bmap_free_t         *flist, /* free item list header */
-       xfs_bmap_free_item_t    *prev,  /* previous item on list, if any */
-       xfs_bmap_free_item_t    *free)  /* list item to be freed */
+       struct xfs_bmap_free            *flist, /* free item list header */
+       struct xfs_bmap_free_item       *free)  /* list item to be freed */
 {
-       if (prev)
-               prev->xbfi_next = free->xbfi_next;
-       else
-               flist->xbf_first = free->xbfi_next;
+       list_del(&free->xbfi_list);
        flist->xbf_count--;
        kmem_zone_free(xfs_bmap_free_item_zone, free);
 }
@@ -626,17 +610,16 @@ xfs_bmap_del_free(
  */
 void
 xfs_bmap_cancel(
-       xfs_bmap_free_t         *flist) /* list of bmap_free_items */
+       struct xfs_bmap_free            *flist) /* list of bmap_free_items */
 {
-       xfs_bmap_free_item_t    *free;  /* free list item */
-       xfs_bmap_free_item_t    *next;
+       struct xfs_bmap_free_item       *free;  /* free list item */
 
        if (flist->xbf_count == 0)
                return;
-       ASSERT(flist->xbf_first != NULL);
-       for (free = flist->xbf_first; free; free = next) {
-               next = free->xbfi_next;
-               xfs_bmap_del_free(flist, NULL, free);
+       while (!list_empty(&flist->xbf_flist)) {
+               free = list_first_entry(&flist->xbf_flist,
+                               struct xfs_bmap_free_item, xbfi_list);
+               xfs_bmap_del_free(flist, free);
        }
        ASSERT(flist->xbf_count == 0);
 }
index 6485403cb2acce291418bf362a25dff5e9bf1cd3..c165b2d131a9daf843888e3aeeb1f2ff2e93aa05 100644 (file)
@@ -62,12 +62,12 @@ struct xfs_bmalloca {
  * List of extents to be free "later".
  * The list is kept sorted on xbf_startblock.
  */
-typedef struct xfs_bmap_free_item
+struct xfs_bmap_free_item
 {
        xfs_fsblock_t           xbfi_startblock;/* starting fs block number */
        xfs_extlen_t            xbfi_blockcount;/* number of blocks in extent */
-       struct xfs_bmap_free_item *xbfi_next;   /* link to next entry */
-} xfs_bmap_free_item_t;
+       struct list_head        xbfi_list;
+};
 
 /*
  * Header for free extent list.
@@ -85,7 +85,7 @@ typedef struct xfs_bmap_free_item
  */
 typedef        struct xfs_bmap_free
 {
-       xfs_bmap_free_item_t    *xbf_first;     /* list of to-be-free extents */
+       struct list_head        xbf_flist;      /* list of to-be-free extents */
        int                     xbf_count;      /* count of items on list */
        int                     xbf_low;        /* alloc in low mode */
 } xfs_bmap_free_t;
@@ -141,8 +141,10 @@ static inline int xfs_bmapi_aflag(int w)
 
 static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp)
 {
-       ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \
-               (flp)->xbf_low = 0, *(fbp) = NULLFSBLOCK);
+       INIT_LIST_HEAD(&flp->xbf_flist);
+       flp->xbf_count = 0;
+       flp->xbf_low = 0;
+       *fbp = NULLFSBLOCK;
 }
 
 /*