]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
oracleasm: Compat changes for 3.18
authorMartin K. Petersen <martin.petersen@oracle.com>
Thu, 22 Jan 2015 21:54:38 +0000 (16:54 -0500)
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>
Mon, 29 Jun 2015 15:34:53 +0000 (08:34 -0700)
 - file->f_dentry is now file->f_path.dentry

 - bio and bip iterators replace sector and size values

 - Post 3.18 integrity flags

 - Add error injection flags and disk type flags

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/block/oracleasm/driver.c
drivers/block/oracleasm/integrity.c
drivers/block/oracleasm/transaction_file.c
include/linux/oracleasm/abi.h

index 5c9e86dd06131721a54a7e99c67124e98a0d8ea0..bc13e7c21126abcb4c021d1e2bb0328ede0bad0b 100644 (file)
@@ -200,7 +200,7 @@ static inline struct asmfs_inode_info *ASMFS_I(struct inode *inode)
 
 static inline struct inode *ASMFS_F2I(struct file *file)
 {
-       return file->f_dentry->d_inode;
+       return file->f_path.dentry->d_inode;
 }
 
 /*
@@ -1144,7 +1144,7 @@ static void asm_end_ioc(struct asm_request *r, unsigned int bytes_done,
        mlog(ML_REQUEST|ML_BIO,
             "Ending request 0x%p, bio 0x%p, len = %u\n",
             r, r->r_bio,
-            bytes_done + (r->r_bio ? r->r_bio->bi_size : 0));
+            bytes_done + (r->r_bio ? r->r_bio->bi_iter.bi_size : 0));
 
        switch (error) {
                default:
@@ -1170,7 +1170,7 @@ static void asm_end_ioc(struct asm_request *r, unsigned int bytes_done,
                        break;
 
                case -EILSEQ:
-                       r->r_error = asm_integrity_error(r);
+                       r->r_error = ASM_ERR_INTEGRITY;
                        break;
 
                case -ENOLINK:
@@ -1203,7 +1203,7 @@ static void asm_end_bio_io(struct bio *bio, int error)
 
        mlog_entry("(0x%p, %d)\n", bio, error);
 
-       mlog(ML_BIO, "bio 0x%p, bi_size is %u\n", bio, bio->bi_size);
+       mlog(ML_BIO, "bio 0x%p, bi_size is %u\n", bio, bio->bi_iter.bi_size);
 
        r = bio->bi_private;
 
@@ -1211,7 +1211,7 @@ static void asm_end_bio_io(struct bio *bio, int error)
             "Completed bio 0x%p for request 0x%p\n", bio, r);
        if (atomic_dec_and_test(&r->r_bio_count)) {
                asm_end_ioc(r, r->r_count - (r->r_bio ?
-                                            r->r_bio->bi_size : 0),
+                                            r->r_bio->bi_iter.bi_size : 0),
                            error);
        }
 
@@ -1392,7 +1392,7 @@ static int asm_submit_io(struct file *file,
                goto out_error;
        }
 
-       if (r->r_bio->bi_size != r->r_count) {
+       if (r->r_bio->bi_iter.bi_size != r->r_count) {
                mlog(ML_ERROR|ML_BIO, "Only mapped partial ioc buffer\n");
                bio_unmap_user(r->r_bio);
                r->r_bio = NULL;
@@ -1405,7 +1405,8 @@ static int asm_submit_io(struct file *file,
        /* Block layer always uses 512-byte sector addressing,
         * regardless of logical and physical block size.
         */
-       r->r_bio->bi_sector = ioc->first_asm_ioc * (asm_block_size(bdev) >> 9);
+       r->r_bio->bi_iter.bi_sector =
+               ioc->first_asm_ioc * (asm_block_size(bdev) >> 9);
 
        if (it) {
                ret = asm_integrity_map(it, r, rw == READ);
index c5f7368a3bb02f6074b90dcceacdd83f66384699..059f5ad237ee5e626f061960d66bca8dce5ff13e 100644 (file)
@@ -64,6 +64,12 @@ u32 asm_integrity_format(struct block_device *bdev)
        else
                return 0;
 
+       if (bi->flags & BLK_INTEGRITY_DEVICE_CAPABLE)
+               format |= ASM_IFMT_DISK;
+
+       if (bi->tag_size)
+               format |= ASM_IFMT_DISK | ASM_IFMT_ATO;
+
        if (!strcmp(bi->name, "T10-DIF-TYPE1-CRC"))
                return format;
 
@@ -138,13 +144,21 @@ int asm_integrity_map(struct oracleasm_integrity_v2 *it, struct asm_request *r,
                return -ENOMEM;
        }
 
-       bip->bip_size = len;
-       bip->bip_sector = bio->bi_sector;
-       bio->bi_flags |= (1 << BIO_FS_INTEGRITY);
+       bip->bip_iter.bi_size = len;
+       bip->bip_iter.bi_sector = bio->bi_iter.bi_sector;
 
        /* This is a retry. Prevent reference tag from being remapped again */
        if (it->it_flags & ASM_IFLAG_REMAPPED)
-               bio->bi_flags |= 1 << BIO_MAPPED_INTEGRITY;
+               bip->bip_flags |= 1 << BIP_MAPPED_INTEGRITY;
+
+       if (it->it_flags & ASM_IFLAG_IP_CHECKSUM)
+               bip->bip_flags |= BIP_IP_CHECKSUM;
+
+       if (it->it_flags & ASM_IFLAG_CTRL_NOCHECK)
+               bip->bip_flags |= BIP_CTRL_NOCHECK;
+
+       if (it->it_flags & ASM_IFLAG_DISK_NOCHECK)
+               bip->bip_flags |= BIP_DISK_NOCHECK;
 
        pages = kcalloc(nr_pages, sizeof(struct page *), GFP_KERNEL);
        if (!pages) {
@@ -190,7 +204,7 @@ int asm_integrity_map(struct oracleasm_integrity_v2 *it, struct asm_request *r,
 
        kfree(pages);
 
-       if (bio->bi_integrity->bip_vcnt == 0)
+       if (bip->bip_vcnt == 0)
                ret = -EINVAL;
 
        return ret;
@@ -199,22 +213,17 @@ int asm_integrity_map(struct oracleasm_integrity_v2 *it, struct asm_request *r,
 
 void asm_integrity_unmap(struct bio *bio)
 {
-       struct bio_vec *iv;
-       unsigned int i;
+       struct bio_vec iv;
+       struct bvec_iter iter;
+       struct bio_integrity_payload *bip = bio_integrity(bio);
 
-       if (!bio_flagged(bio, BIO_FS_INTEGRITY))
+       if (!bip)
                return;
 
-       bip_for_each_vec(iv, bio->bi_integrity, i) {
+       bip_for_each_vec(iv, bio_integrity(bio), iter) {
                if (bio_data_dir(bio) == READ)
-                       set_page_dirty_lock(iv->bv_page);
+                       set_page_dirty_lock(iv.bv_page);
 
-               page_cache_release(iv->bv_page);
+               page_cache_release(iv.bv_page);
        }
 } /* asm_integrity_unmap */
-
-
-unsigned int asm_integrity_error(struct asm_request *r)
-{
-       return ASM_ERR_INTEGRITY;
-}
index b524edf1e7f6272e0b6909d008a41581ec359d73..dd368f369b2de59bbf7e94cca05d3b49164e7afa 100644 (file)
@@ -39,7 +39,8 @@ struct argresp {
  */
 static ssize_t TA_write(struct file *file, const char *buf, size_t size, loff_t *pos)
 {
-       struct transaction_context *tctxt = TRANSACTION_CONTEXT(file->f_dentry->d_inode);
+       struct transaction_context *tctxt =
+               TRANSACTION_CONTEXT(file->f_path.dentry->d_inode);
        struct argresp *ar;
        ssize_t rv = 0;
 
@@ -54,12 +55,12 @@ static ssize_t TA_write(struct file *file, const char *buf, size_t size, loff_t
        if (!ar)
                return -ENOMEM;
        ar->size = 0;
-       mutex_lock(&file->f_dentry->d_inode->i_mutex);
+       mutex_lock(&file->f_path.dentry->d_inode->i_mutex);
        if (file->private_data)
                rv = -EINVAL;
        else
                file->private_data = ar;
-       mutex_unlock(&file->f_dentry->d_inode->i_mutex);
+       mutex_unlock(&file->f_path.dentry->d_inode->i_mutex);
        if (rv) {
                kfree(ar);
                return rv;
index 0733eed823df69bd2c6294007c3353cc1a521add..0b5e0c480a10257ce557bc8fac67ef90b621859b 100644 (file)
@@ -128,7 +128,7 @@ struct oracleasm_abi_info
        __u16                           ai_type;        /* Type of operation */
        __u32                           ai_size;        /* Size of passed struct */
        __u32                           ai_status;      /* Did it succeed */
-/*10*/ 
+/*10*/
 };
 
 /*
@@ -162,6 +162,8 @@ struct oracleasm_integrity_v2
 enum oracleasm_integrity_handling_flags {
        ASM_IFLAG_REMAPPED              = 1,    /* PI has been remapped */
        ASM_IFLAG_IP_CHECKSUM           = 2,    /* IP checksum instead of CRC */
+       ASM_IFLAG_CTRL_NOCHECK          = 4,    /* Disable HBA PI checks */
+       ASM_IFLAG_DISK_NOCHECK          = 8,    /* Disable disk PI checks */
 };
 
 struct oracleasm_query_disk_v2
@@ -182,6 +184,8 @@ enum oracleasm_feature_integrity {
        ASM_IMODE_MASK                  = 3,    /* Interleaving mode mask */
        ASM_IFMT_IP_CHECKSUM            = 4,    /* 0: T10 CRC, 1: IP checksum */
        ASM_INTEGRITY_HANDLE_MASK       = 7,    /* Integrity handle mask */
+       ASM_IFMT_DISK                   = 8,    /* Supports DIF */
+       ASM_IFMT_ATO                    = 16,   /* Supports app tag */
        ASM_INTEGRITY_QDF_MASK          = 0xff, /* Querydisk feature mask */
 };
 
@@ -196,7 +200,7 @@ struct oracleasm_open_disk_v2
 /*10*/ __u32                           od_fd;
        __u32                           od_pad1;
        __u64                           od_handle;
-/*20*/ 
+/*20*/
 };
 
 struct oracleasm_close_disk_v2