Merge branch '3.5-merge-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull two scsi target fixes from Nicholas Bellinger: "The first is a small name-space collision fix from Stefan for the new sbp-target / ieee-1394 code, and second is the FILEIO backend conversion patch to always use O_DSYNC by default instead of O_SYNC as recommended by hch. Note the latter is CC'ed stable." * '3.5-merge-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: target/file: Use O_DSYNC by default for FILEIO backends sbp-target: rename a variable to avoid name clash
This commit is contained in:
Коммит
5f73639c63
|
@ -587,14 +587,14 @@ static void sbp_management_request_logout(
|
|||
{
|
||||
struct sbp_tport *tport = agent->tport;
|
||||
struct sbp_tpg *tpg = tport->tpg;
|
||||
int login_id;
|
||||
int id;
|
||||
struct sbp_login_descriptor *login;
|
||||
|
||||
login_id = LOGOUT_ORB_LOGIN_ID(be32_to_cpu(req->orb.misc));
|
||||
id = LOGOUT_ORB_LOGIN_ID(be32_to_cpu(req->orb.misc));
|
||||
|
||||
login = sbp_login_find_by_id(tpg, login_id);
|
||||
login = sbp_login_find_by_id(tpg, id);
|
||||
if (!login) {
|
||||
pr_warn("cannot find login: %d\n", login_id);
|
||||
pr_warn("cannot find login: %d\n", id);
|
||||
|
||||
req->status.status = cpu_to_be32(
|
||||
STATUS_BLOCK_RESP(STATUS_RESP_REQUEST_COMPLETE) |
|
||||
|
|
|
@ -133,16 +133,11 @@ static struct se_device *fd_create_virtdevice(
|
|||
ret = PTR_ERR(dev_p);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* O_DIRECT too? */
|
||||
flags = O_RDWR | O_CREAT | O_LARGEFILE;
|
||||
|
||||
/*
|
||||
* If fd_buffered_io=1 has not been set explicitly (the default),
|
||||
* use O_SYNC to force FILEIO writes to disk.
|
||||
* Use O_DSYNC by default instead of O_SYNC to forgo syncing
|
||||
* of pure timestamp updates.
|
||||
*/
|
||||
if (!(fd_dev->fbd_flags & FDBD_USE_BUFFERED_IO))
|
||||
flags |= O_SYNC;
|
||||
flags = O_RDWR | O_CREAT | O_LARGEFILE | O_DSYNC;
|
||||
|
||||
file = filp_open(dev_p, flags, 0600);
|
||||
if (IS_ERR(file)) {
|
||||
|
@ -380,23 +375,6 @@ static void fd_emulate_sync_cache(struct se_cmd *cmd)
|
|||
}
|
||||
}
|
||||
|
||||
static void fd_emulate_write_fua(struct se_cmd *cmd)
|
||||
{
|
||||
struct se_device *dev = cmd->se_dev;
|
||||
struct fd_dev *fd_dev = dev->dev_ptr;
|
||||
loff_t start = cmd->t_task_lba *
|
||||
dev->se_sub_dev->se_dev_attrib.block_size;
|
||||
loff_t end = start + cmd->data_length;
|
||||
int ret;
|
||||
|
||||
pr_debug("FILEIO: FUA WRITE LBA: %llu, bytes: %u\n",
|
||||
cmd->t_task_lba, cmd->data_length);
|
||||
|
||||
ret = vfs_fsync_range(fd_dev->fd_file, start, end, 1);
|
||||
if (ret != 0)
|
||||
pr_err("FILEIO: vfs_fsync_range() failed: %d\n", ret);
|
||||
}
|
||||
|
||||
static int fd_execute_cmd(struct se_cmd *cmd, struct scatterlist *sgl,
|
||||
u32 sgl_nents, enum dma_data_direction data_direction)
|
||||
{
|
||||
|
@ -411,19 +389,21 @@ static int fd_execute_cmd(struct se_cmd *cmd, struct scatterlist *sgl,
|
|||
ret = fd_do_readv(cmd, sgl, sgl_nents);
|
||||
} else {
|
||||
ret = fd_do_writev(cmd, sgl, sgl_nents);
|
||||
|
||||
/*
|
||||
* Perform implict vfs_fsync_range() for fd_do_writev() ops
|
||||
* for SCSI WRITEs with Forced Unit Access (FUA) set.
|
||||
* Allow this to happen independent of WCE=0 setting.
|
||||
*/
|
||||
if (ret > 0 &&
|
||||
dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0 &&
|
||||
dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0 &&
|
||||
(cmd->se_cmd_flags & SCF_FUA)) {
|
||||
/*
|
||||
* We might need to be a bit smarter here
|
||||
* and return some sense data to let the initiator
|
||||
* know the FUA WRITE cache sync failed..?
|
||||
*/
|
||||
fd_emulate_write_fua(cmd);
|
||||
}
|
||||
struct fd_dev *fd_dev = dev->dev_ptr;
|
||||
loff_t start = cmd->t_task_lba *
|
||||
dev->se_sub_dev->se_dev_attrib.block_size;
|
||||
loff_t end = start + cmd->data_length;
|
||||
|
||||
vfs_fsync_range(fd_dev->fd_file, start, end, 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
|
@ -442,7 +422,6 @@ enum {
|
|||
static match_table_t tokens = {
|
||||
{Opt_fd_dev_name, "fd_dev_name=%s"},
|
||||
{Opt_fd_dev_size, "fd_dev_size=%s"},
|
||||
{Opt_fd_buffered_io, "fd_buffered_io=%d"},
|
||||
{Opt_err, NULL}
|
||||
};
|
||||
|
||||
|
@ -454,7 +433,7 @@ static ssize_t fd_set_configfs_dev_params(
|
|||
struct fd_dev *fd_dev = se_dev->se_dev_su_ptr;
|
||||
char *orig, *ptr, *arg_p, *opts;
|
||||
substring_t args[MAX_OPT_ARGS];
|
||||
int ret = 0, arg, token;
|
||||
int ret = 0, token;
|
||||
|
||||
opts = kstrdup(page, GFP_KERNEL);
|
||||
if (!opts)
|
||||
|
@ -498,19 +477,6 @@ static ssize_t fd_set_configfs_dev_params(
|
|||
" bytes\n", fd_dev->fd_dev_size);
|
||||
fd_dev->fbd_flags |= FBDF_HAS_SIZE;
|
||||
break;
|
||||
case Opt_fd_buffered_io:
|
||||
match_int(args, &arg);
|
||||
if (arg != 1) {
|
||||
pr_err("bogus fd_buffered_io=%d value\n", arg);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
pr_debug("FILEIO: Using buffered I/O"
|
||||
" operations for struct fd_dev\n");
|
||||
|
||||
fd_dev->fbd_flags |= FDBD_USE_BUFFERED_IO;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -542,10 +508,8 @@ static ssize_t fd_show_configfs_dev_params(
|
|||
ssize_t bl = 0;
|
||||
|
||||
bl = sprintf(b + bl, "TCM FILEIO ID: %u", fd_dev->fd_dev_id);
|
||||
bl += sprintf(b + bl, " File: %s Size: %llu Mode: %s\n",
|
||||
fd_dev->fd_dev_name, fd_dev->fd_dev_size,
|
||||
(fd_dev->fbd_flags & FDBD_USE_BUFFERED_IO) ?
|
||||
"Buffered" : "Synchronous");
|
||||
bl += sprintf(b + bl, " File: %s Size: %llu Mode: O_DSYNC\n",
|
||||
fd_dev->fd_dev_name, fd_dev->fd_dev_size);
|
||||
return bl;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
|
||||
#define FBDF_HAS_PATH 0x01
|
||||
#define FBDF_HAS_SIZE 0x02
|
||||
#define FDBD_USE_BUFFERED_IO 0x04
|
||||
|
||||
struct fd_dev {
|
||||
u32 fbd_flags;
|
||||
|
|
Загрузка…
Ссылка в новой задаче