static inline struct inode *ASMFS_F2I(struct file *file)
{
- return file->f_dentry->d_inode;
+ return file->f_path.dentry->d_inode;
}
/*
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:
break;
case -EILSEQ:
- r->r_error = asm_integrity_error(r);
+ r->r_error = ASM_ERR_INTEGRITY;
break;
case -ENOLINK:
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;
"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);
}
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;
/* 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);
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;
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) {
kfree(pages);
- if (bio->bi_integrity->bip_vcnt == 0)
+ if (bip->bip_vcnt == 0)
ret = -EINVAL;
return ret;
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;
-}
*/
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;
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;
__u16 ai_type; /* Type of operation */
__u32 ai_size; /* Size of passed struct */
__u32 ai_status; /* Did it succeed */
-/*10*/
+/*10*/
};
/*
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
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 */
};
/*10*/ __u32 od_fd;
__u32 od_pad1;
__u64 od_handle;
-/*20*/
+/*20*/
};
struct oracleasm_close_disk_v2