#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)
struct bpointers {
unsigned long *blocks;
- int *created;
unsigned long start;
int num;
int init_num;
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;
}
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--;
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)
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++;
}
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;
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;
}
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;
/* 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);