diff options
Diffstat (limited to 'drivers/target/target_core_file.c')
-rw-r--r-- | drivers/target/target_core_file.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index e921948415c7..24cf11d9e50a 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c | |||
@@ -237,13 +237,17 @@ static void fd_dev_call_rcu(struct rcu_head *p) | |||
237 | 237 | ||
238 | static void fd_free_device(struct se_device *dev) | 238 | static void fd_free_device(struct se_device *dev) |
239 | { | 239 | { |
240 | call_rcu(&dev->rcu_head, fd_dev_call_rcu); | ||
241 | } | ||
242 | |||
243 | static void fd_destroy_device(struct se_device *dev) | ||
244 | { | ||
240 | struct fd_dev *fd_dev = FD_DEV(dev); | 245 | struct fd_dev *fd_dev = FD_DEV(dev); |
241 | 246 | ||
242 | if (fd_dev->fd_file) { | 247 | if (fd_dev->fd_file) { |
243 | filp_close(fd_dev->fd_file, NULL); | 248 | filp_close(fd_dev->fd_file, NULL); |
244 | fd_dev->fd_file = NULL; | 249 | fd_dev->fd_file = NULL; |
245 | } | 250 | } |
246 | call_rcu(&dev->rcu_head, fd_dev_call_rcu); | ||
247 | } | 251 | } |
248 | 252 | ||
249 | static int fd_do_rw(struct se_cmd *cmd, struct file *fd, | 253 | static int fd_do_rw(struct se_cmd *cmd, struct file *fd, |
@@ -826,6 +830,7 @@ static const struct target_backend_ops fileio_ops = { | |||
826 | .detach_hba = fd_detach_hba, | 830 | .detach_hba = fd_detach_hba, |
827 | .alloc_device = fd_alloc_device, | 831 | .alloc_device = fd_alloc_device, |
828 | .configure_device = fd_configure_device, | 832 | .configure_device = fd_configure_device, |
833 | .destroy_device = fd_destroy_device, | ||
829 | .free_device = fd_free_device, | 834 | .free_device = fd_free_device, |
830 | .parse_cdb = fd_parse_cdb, | 835 | .parse_cdb = fd_parse_cdb, |
831 | .set_configfs_dev_params = fd_set_configfs_dev_params, | 836 | .set_configfs_dev_params = fd_set_configfs_dev_params, |