Whamcloud - gitweb
b=6403
[fs/lustre-release.git] / lustre / lvfs / fsfilt_ext3.c
index 9e72149..4bc107d 100644 (file)
@@ -42,7 +42,7 @@
 #include <ext3/xattr.h>
 #endif
 
-#include <linux/kp30.h>
+#include <libcfs/kp30.h>
 #include <linux/lustre_fsfilt.h>
 #include <linux/obd.h>
 #include <linux/obd_class.h>
 #endif
 
 
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7))
+# define lock_24kernel() lock_kernel()
+# define unlock_24kernel() unlock_kernel()
+#else
+# define lock_24kernel() do {} while (0)
+# define unlock_24kernel() do {} while (0)
+#endif
+
 static kmem_cache_t *fcb_cache;
 static atomic_t fcb_cache_count = ATOMIC_INIT(0);
 
@@ -68,6 +76,7 @@ struct fsfilt_cb_data {
 #endif
 
 #define XATTR_LUSTRE_MDS_LOV_EA         "lov"
+#define XATTR_LUSTRE_MDS_MEA_EA         "mea"
 #define XATTR_LUSTRE_MDS_MID_EA         "mid"
 #define XATTR_LUSTRE_MDS_SID_EA         "sid"
 
@@ -91,26 +100,17 @@ static void *fsfilt_ext3_start(struct inode *inode, int op, void *desc_private,
                 goto journal_start;
         }
 
-        /* XXX BUG 3188 -- must return to one set of opcodes */
-        /* FIXME - cache hook */
-        if (op & 0x20) {
-                nblocks += EXT3_INDEX_EXTRA_TRANS_BLOCKS+EXT3_DATA_TRANS_BLOCKS;
-                op = op & ~0x20;
-        }
-
-        /* FIXME - kml */
-        if (op & 0x10) {
-                nblocks += EXT3_INDEX_EXTRA_TRANS_BLOCKS+EXT3_DATA_TRANS_BLOCKS;
-                op = op & ~0x10;
-        }
-
+       if (logs)
+               nblocks += (EXT3_INDEX_EXTRA_TRANS_BLOCKS +
+                            EXT3_SINGLEDATA_TRANS_BLOCKS) * logs;
+                
         switch(op) {
         case FSFILT_OP_RMDIR:
         case FSFILT_OP_UNLINK:
                 /* delete one file + create/update logs for each stripe */
                 nblocks += EXT3_DELETE_TRANS_BLOCKS;
-                nblocks += (EXT3_INDEX_EXTRA_TRANS_BLOCKS +
-                            EXT3_SINGLEDATA_TRANS_BLOCKS) * logs;
+                /*nblocks += (EXT3_INDEX_EXTRA_TRANS_BLOCKS +
+                            EXT3_SINGLEDATA_TRANS_BLOCKS) * logs;*/
                 break;
         case FSFILT_OP_RENAME:
                 /* modify additional directory */
@@ -122,8 +122,8 @@ static void *fsfilt_ext3_start(struct inode *inode, int op, void *desc_private,
                 /* no break */
         case FSFILT_OP_CREATE:
                 /* create/update logs for each stripe */
-                nblocks += (EXT3_INDEX_EXTRA_TRANS_BLOCKS +
-                            EXT3_SINGLEDATA_TRANS_BLOCKS) * logs;
+                /*nblocks += (EXT3_INDEX_EXTRA_TRANS_BLOCKS +
+                            EXT3_SINGLEDATA_TRANS_BLOCKS) * logs;*/
                 /* no break */
         case FSFILT_OP_MKDIR:
         case FSFILT_OP_MKNOD:
@@ -161,9 +161,10 @@ static void *fsfilt_ext3_start(struct inode *inode, int op, void *desc_private,
         }
 
  journal_start:
-        lock_kernel();
+        LASSERTF(nblocks > 0, "can't start %d credit transaction\n", nblocks);
+        lock_24kernel();
         handle = journal_start(EXT3_JOURNAL(inode), nblocks);
-        unlock_kernel();
+        unlock_24kernel();
 
         if (!IS_ERR(handle))
                 LASSERT(current->journal_info == handle);
@@ -299,9 +300,10 @@ static void *fsfilt_ext3_brw_start(int objcount, struct fsfilt_objinfo *fso,
                 needed = journal->j_max_transaction_buffers;
         }
 
-        lock_kernel();
+        LASSERTF(needed > 0, "can't start %d credit transaction\n", needed);
+        lock_24kernel();
         handle = journal_start(journal, needed);
-        unlock_kernel();
+        unlock_24kernel();
         if (IS_ERR(handle)) {
                 CERROR("can't get handle for %d credits: rc = %ld\n", needed,
                        PTR_ERR(handle));
@@ -323,9 +325,9 @@ static int fsfilt_ext3_commit(struct super_block *sb, struct inode *inode,
         if (force_sync)
                 handle->h_sync = 1; /* recovery likes this */
 
-        lock_kernel();
+        lock_24kernel();
         rc = journal_stop(handle);
-        unlock_kernel();
+        unlock_24kernel();
 
         return rc;
 }
@@ -484,99 +486,95 @@ static int fsfilt_ext3_get_xattr(struct inode *inode, char *name,
 }
 
 static int fsfilt_ext3_set_md(struct inode *inode, void *handle,
-                              void *lmm, int lmm_size)
-{
-        int rc;
-
-        LASSERT(down_trylock(&inode->i_sem) != 0);
-
-        /* keep this when we get rid of OLD_EA (too noisy during conversion) */
-        if (EXT3_I(inode)->i_file_acl /* || large inode EA flag */)
-                CWARN("setting EA on %lu/%u again... interesting\n",
-                      inode->i_ino, inode->i_generation);
-
-        rc = fsfilt_ext3_set_xattr(inode, handle, XATTR_LUSTRE_MDS_LOV_EA,
-                                   lmm, lmm_size);
-        return rc;
-}
-
-/* Must be called with i_sem held */
-static int fsfilt_ext3_get_md(struct inode *inode, void *lmm, int lmm_size)
-{
-        int rc;
-
-        rc = fsfilt_ext3_get_xattr(inode, XATTR_LUSTRE_MDS_LOV_EA,
-                                   lmm, lmm_size);
-        return rc;
-}
-
-static int fsfilt_ext3_set_mid(struct inode *inode, void *handle,
-                               void *mid, int mid_size)
-{
-        int rc;
-
-        rc = fsfilt_ext3_set_xattr(inode, handle, XATTR_LUSTRE_MDS_MID_EA,
-                                   mid, mid_size);
-        return rc;
-}
-
-/* Must be called with i_sem held */
-static int fsfilt_ext3_get_mid(struct inode *inode, void *mid, int mid_size)
+                              void *lmm, int lmm_size,
+                              enum ea_type type)
 {
         int rc;
+        
+        switch(type) {
+        case EA_LOV:
+                rc = fsfilt_ext3_set_xattr(inode, handle,
+                                           XATTR_LUSTRE_MDS_LOV_EA,
+                                           lmm, lmm_size);
+                break;
+        case EA_MEA:
+                rc = fsfilt_ext3_set_xattr(inode, handle,
+                                           XATTR_LUSTRE_MDS_MEA_EA,
+                                           lmm, lmm_size);
+                break;
+        case EA_SID:
+                rc = fsfilt_ext3_set_xattr(inode, handle,
+                                           XATTR_LUSTRE_MDS_SID_EA,
+                                           lmm, lmm_size);
+                break;
+        case EA_MID:
+                rc = fsfilt_ext3_set_xattr(inode, handle,
+                                           XATTR_LUSTRE_MDS_MID_EA,
+                                           lmm, lmm_size);
+                break;
+        default:
+                return -EINVAL;
+        }
 
-        rc = fsfilt_ext3_get_xattr(inode, XATTR_LUSTRE_MDS_MID_EA,
-                                   mid, mid_size);
         return rc;
 }
 
-static int fsfilt_ext3_set_sid(struct inode *inode, void *handle,
-                               void *sid, int sid_size)
+static int fsfilt_ext3_get_md(struct inode *inode, void *lmm,
+                              int lmm_size, enum ea_type type)
 {
         int rc;
-
-        rc = fsfilt_ext3_set_xattr(inode, handle, XATTR_LUSTRE_MDS_SID_EA,
-                                   sid, sid_size);
+        
+        switch (type) {
+        case EA_LOV:
+                rc = fsfilt_ext3_get_xattr(inode,
+                                           XATTR_LUSTRE_MDS_LOV_EA,
+                                           lmm, lmm_size);
+                break;
+        case EA_MEA:
+                rc = fsfilt_ext3_get_xattr(inode,
+                                           XATTR_LUSTRE_MDS_MEA_EA,
+                                           lmm, lmm_size);
+                break;
+        case EA_SID:
+                rc = fsfilt_ext3_get_xattr(inode,
+                                           XATTR_LUSTRE_MDS_SID_EA,
+                                           lmm, lmm_size);
+                break;
+        case EA_MID:
+                rc = fsfilt_ext3_get_xattr(inode,
+                                           XATTR_LUSTRE_MDS_MID_EA,
+                                           lmm, lmm_size);
+                break;
+        default:
+                return -EINVAL;
+        }
+        
         return rc;
 }
 
-/* Must be called with i_sem held */
-static int fsfilt_ext3_get_sid(struct inode *inode, void *sid, int sid_size)
+static int fsfilt_ext3_send_bio(int rw, struct inode *inode, void *bio)
 {
-        int rc;
-
-        rc = fsfilt_ext3_get_xattr(inode, XATTR_LUSTRE_MDS_SID_EA,
-                                   sid, sid_size);
-        return rc;
-}
-
+       int rc = 0;
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-static int fsfilt_ext3_send_bio(int rw, struct inode *inode, struct bio *bio)
-{
-        submit_bio(rw, bio);
-        return 0;
-}
+        submit_bio(rw, (struct bio *)bio);
 #else
-static int fsfilt_ext3_send_bio(int rw, struct inode *inode, struct kiobuf *bio)
-{
-        int rc, blocks_per_page;
-
-        rc = brw_kiovec(rw, 1, &bio, inode->i_dev,
-                        bio->blocks, 1 << inode->i_blkbits);
+       struct bio *b = (struct kiobuf *)bio;
+        int blocks_per_page;
+       
+        rc = brw_kiovec(rw, 1, &b, inode->i_dev,
+                        b->blocks, 1 << inode->i_blkbits);
 
         blocks_per_page = PAGE_SIZE >> inode->i_blkbits;
 
-        if (rc != (1 << inode->i_blkbits) * bio->nr_pages * blocks_per_page) {
+        if (rc != (1 << inode->i_blkbits) * b->nr_pages * blocks_per_page) {
                 CERROR("short write?  expected %d, wrote %d\n",
-                       (1 << inode->i_blkbits) * bio->nr_pages *
+                       (1 << inode->i_blkbits) * b->nr_pages *
                        blocks_per_page, rc);
         }
-
+#endif
         return rc;
 }
-#endif
 
-/* FIXME-UMKA: This should be used in 2.6.x io code later. */
 static struct page *fsfilt_ext3_getpage(struct inode *inode, long int index)
 {
         int rc;
@@ -685,12 +683,10 @@ static int fsfilt_ext3_add_journal_cb(struct obd_device *obd,
         fcb->cb_data = cb_data;
 
         CDEBUG(D_EXT2, "set callback for last_num: "LPD64"\n", last_num);
-        
         lock_kernel();
         journal_callback_set(handle, fsfilt_ext3_cb_func,
                              (struct journal_callback *)fcb);
         unlock_kernel();
-
         return 0;
 }
 
@@ -732,7 +728,7 @@ static int fsfilt_ext3_sync(struct super_block *sb)
 #define ext3_up_truncate_sem(inode)  up(&EXT3_I(inode)->truncate_sem);
 #define ext3_down_truncate_sem(inode)  down(&EXT3_I(inode)->truncate_sem);
 #endif
-                                                                                                                                                                                                     
+
 #include <linux/lustre_version.h>
 #if EXT3_EXT_MAGIC == 0xf301
 #define ee_start e_start
@@ -797,16 +793,16 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
         loff_t new_i_size;
         handle_t *handle;
         int i, aflags = 0;
-                                                                                                                                                                                                     
+        
         i = EXT_DEPTH(tree);
         EXT_ASSERT(i == path->p_depth);
         EXT_ASSERT(path[i].p_hdr);
-                                                                                                                                                                                                     
+        
         if (exist) {
                 err = EXT_CONTINUE;
                 goto map;
         }
-                                                                                                                                                                                                     
+        
         if (bp->create == 0) {
                 i = 0;
                 if (newex->ee_block < bp->start)
@@ -828,7 +824,6 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
         tgen = EXT_GENERATION(tree);
         count = ext3_ext_calc_credits_for_insert(tree, path);
         ext3_up_truncate_sem(inode);
-                                                                                                                                                                                                     
         lock_kernel();
         handle = journal_start(EXT3_JOURNAL(inode), count + EXT3_ALLOC_NEEDED + 1);
         unlock_kernel();
@@ -836,7 +831,7 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
                 ext3_down_truncate_sem(inode);
                 return PTR_ERR(handle);
         }
-                                                                                                                                                                                                     
+        
         if (tgen != EXT_GENERATION(tree)) {
                 /* the tree has changed. so path can be invalid at moment */
                 lock_kernel();
@@ -845,7 +840,6 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
                 ext3_down_truncate_sem(inode);
                 return EXT_REPEAT;
         }
-                                                                                                                                                                                                     
         ext3_down_truncate_sem(inode);
         count = newex->ee_len;
         goal = ext3_ext_find_goal(inode, path, newex->ee_block, &aflags);
@@ -872,9 +866,9 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
                 }
         }
 out:
-        lock_kernel();
+        lock_24kernel();
         journal_stop(handle);
-        unlock_kernel();
+        unlock_24kernel();
 map:
         if (err >= 0) {
                 /* map blocks */
@@ -922,12 +916,11 @@ int fsfilt_map_nblocks(struct inode *inode, unsigned long block,
         bp.start = block;
         bp.init_num = bp.num = num;
         bp.create = create;
-                                                                                                                                                                                                     
+        
         ext3_down_truncate_sem(inode);
         err = ext3_ext_walk_space(&tree, block, num, ext3_ext_new_extent_cb);
         ext3_ext_invalidate_cache(&tree);
         ext3_up_truncate_sem(inode);
-                                                                                                                                                                                                     
         return err;
 }
 
@@ -1101,10 +1094,10 @@ static int fsfilt_ext3_write_record(struct file *file, void *buf, int bufsize,
         block_count = (block_count + blocksize - 1) >> inode->i_blkbits;
 
         journal = EXT3_SB(inode->i_sb)->s_journal;
-        lock_kernel();
+        lock_24kernel();
         handle = journal_start(journal,
                                block_count * EXT3_DATA_TRANS_BLOCKS + 2);
-        unlock_kernel();
+        unlock_24kernel();
         if (IS_ERR(handle)) {
                 CERROR("can't start transaction\n");
                 return PTR_ERR(handle);
@@ -1162,9 +1155,9 @@ out:
                 unlock_kernel();
         }
 
-        lock_kernel();
+        lock_24kernel();
         journal_stop(handle);
-        unlock_kernel();
+        unlock_24kernel();
 
         if (err == 0)
                 *offs = offset;
@@ -1187,15 +1180,15 @@ static int fsfilt_ext3_setup(struct obd_device *obd, struct super_block *sb)
 #endif
         /* setup mdsnum in underlying fs */
 #ifdef EXT3_FEATURE_INCOMPAT_MDSNUM
-        if (mds->mds_lmv_obd) {
+        if (mds->mds_md_obd) {
                 struct ext3_sb_info *sbi = EXT3_SB(sb);
                 struct ext3_super_block *es = sbi->s_es;
                 handle_t *handle;
                 int err;
                 
                 if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_MDSNUM)) {
-                        CWARN("%s: set mdsnum %d in ext3fs\n",
-                                        obd->obd_name, mds->mds_num);
+                        CWARN("%s: set mdsnum %d in ext3\n",
+                              obd->obd_name, mds->mds_num);
                         lock_kernel();
                         handle = journal_start(sbi->s_journal, 1);
                         unlock_kernel();
@@ -1396,10 +1389,6 @@ static struct fsfilt_operations fsfilt_ext3_ops = {
         .fs_iocontrol               = fsfilt_ext3_iocontrol,
         .fs_set_md                  = fsfilt_ext3_set_md,
         .fs_get_md                  = fsfilt_ext3_get_md,
-        .fs_set_mid                 = fsfilt_ext3_set_mid,
-        .fs_get_mid                 = fsfilt_ext3_get_mid,
-        .fs_set_sid                 = fsfilt_ext3_set_sid,
-        .fs_get_sid                 = fsfilt_ext3_get_sid,
         .fs_readpage                = fsfilt_ext3_readpage,
         .fs_add_journal_cb          = fsfilt_ext3_add_journal_cb,
         .fs_statfs                  = fsfilt_ext3_statfs,