target: fix PR state file path truncation
If an LIO backstore is configured with a sufficiently long Unit Serial
string, alongside a similarly long dbroot path, then a truncated
Persistent Reservation APTPL state file path will be used. This
truncation can unintentionally lead to two LUs with differing serial
numbers sharing PR state file.
Fixes: fdddf93226
("target: use new "dbroot" target attribute")
Signed-off-by: David Disseldorp <ddiss@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Родитель
1ae01724ae
Коммит
bdc79f0ed1
|
@ -1973,24 +1973,21 @@ static int __core_scsi3_write_aptpl_to_file(
|
||||||
struct t10_wwn *wwn = &dev->t10_wwn;
|
struct t10_wwn *wwn = &dev->t10_wwn;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
int flags = O_RDWR | O_CREAT | O_TRUNC;
|
int flags = O_RDWR | O_CREAT | O_TRUNC;
|
||||||
char path[512];
|
char *path;
|
||||||
u32 pr_aptpl_buf_len;
|
u32 pr_aptpl_buf_len;
|
||||||
int ret;
|
int ret;
|
||||||
loff_t pos = 0;
|
loff_t pos = 0;
|
||||||
|
|
||||||
memset(path, 0, 512);
|
path = kasprintf(GFP_KERNEL, "%s/pr/aptpl_%s", db_root,
|
||||||
|
&wwn->unit_serial[0]);
|
||||||
|
if (!path)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
if (strlen(&wwn->unit_serial[0]) >= 512) {
|
|
||||||
pr_err("WWN value for struct se_device does not fit"
|
|
||||||
" into path buffer\n");
|
|
||||||
return -EMSGSIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(path, 512, "%s/pr/aptpl_%s", db_root, &wwn->unit_serial[0]);
|
|
||||||
file = filp_open(path, flags, 0600);
|
file = filp_open(path, flags, 0600);
|
||||||
if (IS_ERR(file)) {
|
if (IS_ERR(file)) {
|
||||||
pr_err("filp_open(%s) for APTPL metadata"
|
pr_err("filp_open(%s) for APTPL metadata"
|
||||||
" failed\n", path);
|
" failed\n", path);
|
||||||
|
kfree(path);
|
||||||
return PTR_ERR(file);
|
return PTR_ERR(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2001,6 +1998,7 @@ static int __core_scsi3_write_aptpl_to_file(
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
pr_debug("Error writing APTPL metadata file: %s\n", path);
|
pr_debug("Error writing APTPL metadata file: %s\n", path);
|
||||||
fput(file);
|
fput(file);
|
||||||
|
kfree(path);
|
||||||
|
|
||||||
return (ret < 0) ? -EIO : 0;
|
return (ret < 0) ? -EIO : 0;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче