From: Martin K. Petersen Date: Thu, 22 Jan 2015 21:54:38 +0000 (-0500) Subject: oracleasm: Compat changes for 3.18 X-Git-Tag: v4.1.12-92~323^2~7 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=3a5376a2ffe1dbbc3383d06bdcb3d8b1ebbed75c;p=users%2Fjedix%2Flinux-maple.git oracleasm: Compat changes for 3.18 - 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 --- diff --git a/drivers/block/oracleasm/driver.c b/drivers/block/oracleasm/driver.c index 5c9e86dd06131..bc13e7c21126a 100644 --- a/drivers/block/oracleasm/driver.c +++ b/drivers/block/oracleasm/driver.c @@ -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); diff --git a/drivers/block/oracleasm/integrity.c b/drivers/block/oracleasm/integrity.c index c5f7368a3bb02..059f5ad237ee5 100644 --- a/drivers/block/oracleasm/integrity.c +++ b/drivers/block/oracleasm/integrity.c @@ -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; -} diff --git a/drivers/block/oracleasm/transaction_file.c b/drivers/block/oracleasm/transaction_file.c index b524edf1e7f62..dd368f369b2de 100644 --- a/drivers/block/oracleasm/transaction_file.c +++ b/drivers/block/oracleasm/transaction_file.c @@ -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; diff --git a/include/linux/oracleasm/abi.h b/include/linux/oracleasm/abi.h index 0733eed823df6..0b5e0c480a102 100644 --- a/include/linux/oracleasm/abi.h +++ b/include/linux/oracleasm/abi.h @@ -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