Whamcloud - gitweb
LU-1812 fsfilt: ext4_free_blocks() has changed slightly
[fs/lustre-release.git] / lustre / lvfs / fsfilt_ext3.c
index fa46534..d2ff06d 100644 (file)
@@ -45,6 +45,7 @@
 #include <linux/fs.h>
 #include <linux/slab.h>
 #include <linux/pagemap.h>
+#include <ldiskfs/ldiskfs_config.h>
 #include <ext4/ext4.h>
 #include <ext4/ext4_jbd2.h>
 #include <linux/version.h>
 #define fsfilt_log_start_commit(journal, tid) jbd2_log_start_commit(journal, tid)
 #define fsfilt_log_wait_commit(journal, tid) jbd2_log_wait_commit(journal, tid)
 
-#ifdef HAVE_EXT4_JOURNAL_CALLBACK_ADD
-# define journal_callback ext4_journal_cb_entry
-# define fsfilt_journal_callback_set(handle, func, jcb) \
-         ext4_journal_callback_add(handle, func, jcb)
-#elif defined(HAVE_JBD2_JOURNAL_CALLBACK_SET)
-# define fsfilt_journal_callback_set(handle, func, jcb) \
-         jbd2_journal_callback_set(handle, func, jcb)
-#else
-# error missing journal commit callback
-#endif /* HAVE_EXT4_JOURNAL_CALLBACK_ADD */
-
 static cfs_mem_cache_t *fcb_cache;
 
 struct fsfilt_cb_data {
-        struct journal_callback cb_jcb; /* jbd private data - MUST BE FIRST */
-        fsfilt_cb_t cb_func;            /* MDS/OBD completion function */
-        struct obd_device *cb_obd;      /* MDS/OBD completion device */
-        __u64 cb_last_rcvd;             /* MDS/OST last committed operation */
-        void *cb_data;                  /* MDS/OST completion function data */
+       struct ext4_journal_cb_entry cb_jcb; /* private data - MUST BE FIRST */
+       fsfilt_cb_t cb_func;            /* MDS/OBD completion function */
+       struct obd_device *cb_obd;      /* MDS/OBD completion device */
+       __u64 cb_last_rcvd;             /* MDS/OST last committed operation */
+       void *cb_data;                  /* MDS/OST completion function data */
 };
 
 static char *fsfilt_ext3_get_label(struct super_block *sb)
@@ -135,46 +125,12 @@ static void *fsfilt_ext3_start(struct inode *inode, int op, void *desc_private,
         }
 
         switch(op) {
-        case FSFILT_OP_RMDIR:
         case FSFILT_OP_UNLINK:
                /* delete one file + create/update logs for each stripe */
                nblocks += EXT3_DELETE_TRANS_BLOCKS(inode->i_sb);
                nblocks += (EXT3_INDEX_EXTRA_TRANS_BLOCKS +
                            FSFILT_SINGLEDATA_TRANS_BLOCKS(inode->i_sb)) * logs;
                break;
-        case FSFILT_OP_RENAME:
-                /* modify additional directory */
-                nblocks += FSFILT_SINGLEDATA_TRANS_BLOCKS(inode->i_sb);
-                /* no break */
-        case FSFILT_OP_SYMLINK:
-                /* additional block + block bitmap + GDT for long symlink */
-                nblocks += 3;
-                /* no break */
-        case FSFILT_OP_CREATE: {
-                /* no break */
-        }
-        case FSFILT_OP_MKDIR:
-        case FSFILT_OP_MKNOD:
-                /* modify one inode + block bitmap + GDT */
-                nblocks += 3;
-                /* no break */
-        case FSFILT_OP_LINK:
-                /* modify parent directory */
-               nblocks += EXT3_INDEX_EXTRA_TRANS_BLOCKS +
-                          EXT3_DATA_TRANS_BLOCKS(inode->i_sb);
-                /* create/update logs for each stripe */
-                nblocks += (EXT3_INDEX_EXTRA_TRANS_BLOCKS +
-                            FSFILT_SINGLEDATA_TRANS_BLOCKS(inode->i_sb)) * logs;
-                break;
-        case FSFILT_OP_SETATTR:
-                /* Setattr on inode */
-               nblocks += 1;
-               nblocks += EXT3_INDEX_EXTRA_TRANS_BLOCKS +
-                          EXT3_DATA_TRANS_BLOCKS(inode->i_sb);
-                /* quota chown log for each stripe */
-                nblocks += (EXT3_INDEX_EXTRA_TRANS_BLOCKS +
-                            FSFILT_SINGLEDATA_TRANS_BLOCKS(inode->i_sb)) * logs;
-                break;
         case FSFILT_OP_CANCEL_UNLINK:
                LASSERT(logs == 1);
 
@@ -240,7 +196,6 @@ static int fsfilt_ext3_commit(struct inode *inode, void *h, int force_sync)
 
 struct bpointers {
         unsigned long *blocks;
-        int *created;
         unsigned long start;
         int num;
         int init_num;
@@ -344,7 +299,12 @@ static int ext3_ext_new_extent_cb(struct ext3_ext_base *base,
         unsigned long count;
         handle_t *handle;
 
-        if (cex->ec_type == EXT3_EXT_CACHE_EXTENT) {
+#ifdef EXT3_EXT_CACHE_EXTENT
+        if (cex->ec_type == EXT3_EXT_CACHE_EXTENT)
+#else
+        if ((cex->ec_len != 0) && (cex->ec_start != 0))
+#endif
+                                                  {
                 err = EXT_CONTINUE;
                 goto map;
         }
@@ -357,8 +317,6 @@ static int ext3_ext_new_extent_cb(struct ext3_ext_base *base,
                         CERROR("nothing to do?! i = %d, e_num = %u\n",
                                         i, cex->ec_len);
                 for (; i < cex->ec_len && bp->num; i++) {
-                        *(bp->created) = 0;
-                        bp->created++;
                         *(bp->blocks) = 0;
                         bp->blocks++;
                         bp->num--;
@@ -413,8 +371,13 @@ static int ext3_ext_new_extent_cb(struct ext3_ext_base *base,
 #ifdef EXT3_MB_HINT_GROUP_ALLOC
                 ext3_mb_discard_inode_preallocations(inode);
 #endif
-                ext3_free_blocks(handle, inode, ext_pblock(&nex),
-                                 cpu_to_le16(nex.ee_len), 0);
+#ifdef HAVE_EXT_FREE_BLOCK_WITH_BUFFER_HEAD /* Introduced in 2.6.32-rc7 */
+               ext3_free_blocks(handle, inode, NULL, ext_pblock(&nex),
+                                cpu_to_le16(nex.ee_len), 0);
+#else
+               ext3_free_blocks(handle, inode, ext_pblock(&nex),
+                                cpu_to_le16(nex.ee_len), 0);
+#endif
                 goto out;
         }
 
@@ -438,10 +401,16 @@ map:
                         CERROR("hmm. why do we find this extent?\n");
                         CERROR("initial space: %lu:%u\n",
                                 bp->start, bp->init_num);
+#ifdef EXT3_EXT_CACHE_EXTENT
                         CERROR("current extent: %u/%u/%llu %d\n",
                                 cex->ec_block, cex->ec_len,
                                 (unsigned long long)cex->ec_start,
                                 cex->ec_type);
+#else
+                        CERROR("current extent: %u/%u/%llu\n",
+                                cex->ec_block, cex->ec_len,
+                                (unsigned long long)cex->ec_start);
+#endif
                 }
                 i = 0;
                 if (cex->ec_block < bp->start)
@@ -451,16 +420,17 @@ map:
                                         i, cex->ec_len);
                 for (; i < cex->ec_len && bp->num; i++) {
                         *(bp->blocks) = cex->ec_start + i;
-                        if (cex->ec_type == EXT3_EXT_CACHE_EXTENT) {
-                                *(bp->created) = 0;
-                        } else {
-                                *(bp->created) = 1;
+#ifdef EXT3_EXT_CACHE_EXTENT
+                       if (cex->ec_type != EXT3_EXT_CACHE_EXTENT)
+#else
+                       if ((cex->ec_len == 0) || (cex->ec_start == 0))
+#endif
+                                                                       {
                                 /* unmap any possible underlying metadata from
                                  * the block device mapping.  bug 6998. */
                                 ll_unmap_underlying_metadata(inode->i_sb,
                                                              *(bp->blocks));
                         }
-                        bp->created++;
                         bp->blocks++;
                         bp->num--;
                         bp->start++;
@@ -470,8 +440,8 @@ map:
 }
 
 int fsfilt_map_nblocks(struct inode *inode, unsigned long block,
-                       unsigned long num, unsigned long *blocks,
-                       int *created, int create)
+                      unsigned long num, unsigned long *blocks,
+                      int create)
 {
         struct ext3_ext_base *base = inode;
         struct bpointers bp;
@@ -481,7 +451,6 @@ int fsfilt_map_nblocks(struct inode *inode, unsigned long block,
                block, block + num - 1, (unsigned) inode->i_ino);
 
         bp.blocks = blocks;
-        bp.created = created;
         bp.start = block;
         bp.init_num = bp.num = num;
         bp.create = create;
@@ -494,8 +463,8 @@ int fsfilt_map_nblocks(struct inode *inode, unsigned long block,
 }
 
 int fsfilt_ext3_map_ext_inode_pages(struct inode *inode, struct page **page,
-                                    int pages, unsigned long *blocks,
-                                    int *created, int create)
+                                   int pages, unsigned long *blocks,
+                                   int create)
 {
         int blocks_per_page = CFS_PAGE_SIZE >> inode->i_blkbits;
         int rc = 0, i = 0;
@@ -524,65 +493,59 @@ int fsfilt_ext3_map_ext_inode_pages(struct inode *inode, struct page **page,
 
                 /* process found extent */
                 rc = fsfilt_map_nblocks(inode, fp->index * blocks_per_page,
-                                        clen * blocks_per_page, blocks,
-                                        created, create);
+                                       clen * blocks_per_page, blocks,
+                                       create);
                 if (rc)
                         GOTO(cleanup, rc);
 
                 /* look for next extent */
                 fp = NULL;
                 blocks += blocks_per_page * clen;
-                created += blocks_per_page * clen;
         }
 
         if (fp)
                 rc = fsfilt_map_nblocks(inode, fp->index * blocks_per_page,
-                                        clen * blocks_per_page, blocks,
-                                        created, create);
+                                       clen * blocks_per_page, blocks,
+                                       create);
 cleanup:
         return rc;
 }
 
-extern int ext3_map_inode_page(struct inode *inode, struct page *page,
-                               unsigned long *blocks, int *created, int create);
 int fsfilt_ext3_map_bm_inode_pages(struct inode *inode, struct page **page,
-                                   int pages, unsigned long *blocks,
-                                   int *created, int create)
+                                  int pages, unsigned long *blocks,
+                                  int create)
 {
-        int blocks_per_page = CFS_PAGE_SIZE >> inode->i_blkbits;
-        unsigned long *b;
-        int rc = 0, i, *cr;
+       int blocks_per_page = CFS_PAGE_SIZE >> inode->i_blkbits;
+       unsigned long *b;
+       int rc = 0, i;
 
-        for (i = 0, cr = created, b = blocks; i < pages; i++, page++) {
-                rc = ext3_map_inode_page(inode, *page, b, cr, create);
+       for (i = 0, b = blocks; i < pages; i++, page++) {
+               rc = ext3_map_inode_page(inode, *page, b, create);
                 if (rc) {
-                        CERROR("ino %lu, blk %lu cr %u create %d: rc %d\n",
-                               inode->i_ino, *b, *cr, create, rc);
+                       CERROR("ino %lu, blk %lu create %d: rc %d\n",
+                              inode->i_ino, *b, create, rc);
                         break;
                 }
 
                 b += blocks_per_page;
-                cr += blocks_per_page;
         }
         return rc;
 }
 
 int fsfilt_ext3_map_inode_pages(struct inode *inode, struct page **page,
-                                int pages, unsigned long *blocks,
-                                int *created, int create,
-                               struct mutex *optional_mutex)
+                               int pages, unsigned long *blocks,
+                               int create, struct mutex *optional_mutex)
 {
         int rc;
 
         if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) {
-                rc = fsfilt_ext3_map_ext_inode_pages(inode, page, pages,
-                                                     blocks, created, create);
+               rc = fsfilt_ext3_map_ext_inode_pages(inode, page, pages,
+                                                    blocks, create);
                 return rc;
         }
         if (optional_mutex != NULL)
                mutex_lock(optional_mutex);
-        rc = fsfilt_ext3_map_bm_inode_pages(inode, page, pages, blocks,
-                                            created, create);
+       rc = fsfilt_ext3_map_bm_inode_pages(inode, page, pages, blocks, create);
         if (optional_mutex != NULL)
                mutex_unlock(optional_mutex);