|
@@ -650,6 +650,18 @@ static u32 se_dev_align_max_sectors(u32 max_sectors, u32 block_size)
|
|
|
return aligned_max_sectors;
|
|
|
}
|
|
|
|
|
|
+bool se_dev_check_wce(struct se_device *dev)
|
|
|
+{
|
|
|
+ bool wce = false;
|
|
|
+
|
|
|
+ if (dev->transport->get_write_cache)
|
|
|
+ wce = dev->transport->get_write_cache(dev);
|
|
|
+ else if (dev->dev_attrib.emulate_write_cache > 0)
|
|
|
+ wce = true;
|
|
|
+
|
|
|
+ return wce;
|
|
|
+}
|
|
|
+
|
|
|
int se_dev_set_max_unmap_lba_count(
|
|
|
struct se_device *dev,
|
|
|
u32 max_unmap_lba_count)
|
|
@@ -767,6 +779,16 @@ int se_dev_set_emulate_fua_write(struct se_device *dev, int flag)
|
|
|
pr_err("Illegal value %d\n", flag);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
+ if (flag &&
|
|
|
+ dev->transport->get_write_cache) {
|
|
|
+ pr_err("emulate_fua_write not supported for this device\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ if (dev->export_count) {
|
|
|
+ pr_err("emulate_fua_write cannot be changed with active"
|
|
|
+ " exports: %d\n", dev->export_count);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
dev->dev_attrib.emulate_fua_write = flag;
|
|
|
pr_debug("dev[%p]: SE Device Forced Unit Access WRITEs: %d\n",
|
|
|
dev, dev->dev_attrib.emulate_fua_write);
|
|
@@ -801,7 +823,11 @@ int se_dev_set_emulate_write_cache(struct se_device *dev, int flag)
|
|
|
pr_err("emulate_write_cache not supported for this device\n");
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
-
|
|
|
+ if (dev->export_count) {
|
|
|
+ pr_err("emulate_write_cache cannot be changed with active"
|
|
|
+ " exports: %d\n", dev->export_count);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
dev->dev_attrib.emulate_write_cache = flag;
|
|
|
pr_debug("dev[%p]: SE Device WRITE_CACHE_EMULATION flag: %d\n",
|
|
|
dev, dev->dev_attrib.emulate_write_cache);
|
|
@@ -1534,8 +1560,6 @@ int target_configure_device(struct se_device *dev)
|
|
|
ret = dev->transport->configure_device(dev);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
- dev->dev_flags |= DF_CONFIGURED;
|
|
|
-
|
|
|
/*
|
|
|
* XXX: there is not much point to have two different values here..
|
|
|
*/
|
|
@@ -1597,6 +1621,8 @@ int target_configure_device(struct se_device *dev)
|
|
|
list_add_tail(&dev->g_dev_node, &g_device_list);
|
|
|
mutex_unlock(&g_device_mutex);
|
|
|
|
|
|
+ dev->dev_flags |= DF_CONFIGURED;
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
out_free_alua:
|