[stgt] Turning off write-caching
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Wed Mar 25 04:39:15 CET 2009
On Sun, 22 Mar 2009 15:34:01 +0000
Chris Webb <chris at arachsys.com> wrote:
> I'm trying to disable write-caching for devices exported via iSCSI by tgtd
> 0.9.5. According to
>
> http://lists.wpkg.org/pipermail/stgt/2008-June/001699.html
>
> I should be able to do this with
>
> tgtadm -L iscsi -m logicalunit -o update -t $TID -l $LUN \
> -P mode_page=8:0:18:0x10:0:0xff:0xff:0:0:0xff:0xff:0xff:0xff:0x80:0x14:0:0:0:0:0:0
>
> (Both of the patches listed seem already to be in the newly released tgtd
> 0.9.5.)
>
> However, despite having run this for the LUN concerned before logging in to
> it with an initiator, I'm still getting uncached writes (far too fast for
> the underlying disk) when I do an O_SYNC/O_DIRECT write to the /dev/sdX on a
> remote machine. O_DIRECT/O_SYNC writes to the local block device run at the
> expected speed, of course. My sequence of commands to export looks like
>
> tgtadm -L iscsi -m target -o new -t $TID -T $TARGET
> tgtadm -L iscsi -m logicalunit -o new -t $TID -l 1 -b $DEVICE
> tgtadm -L iscsi -m logicalunit -o update -t $TID -l 1
> -P mode_page=8:0:18:0x10:0:0xff:0xff:0:0:0xff:0xff:0xff:0xff:0x80:0x14:0:0:0:0:0:0
> tgtadm -L iscsi -m account -o bind -t $TID -u $USER
> tgtadm -L iscsi -m target -o bind -t $TID -I ALL
>
> and everything is apparently working fine apart from the unwanted write
> caching.
>
> I'm testing using tgtd 0.9.5 with the kernel target driver from stock linux
> 2.6.28.2 (amd64). My initiator is also linux: iscsi_tcp from 2.6.28.2. Any
> suggestions as to what I'm doing wrong would be greatly appreciated.
Seems that we misuse sync_file_range.
Can you please try this?
diff --git a/usr/bs_mmap.c b/usr/bs_mmap.c
index bb24f5e..b62c8e6 100644
--- a/usr/bs_mmap.c
+++ b/usr/bs_mmap.c
@@ -57,10 +57,7 @@ static void bs_mmap_request(struct scsi_cmd *cmd)
key = ILLEGAL_REQUEST;
asc = ASC_INVALID_FIELD_IN_CDB;
} else {
- unsigned int flags =
- SYNC_FILE_RANGE_WAIT_BEFORE| SYNC_FILE_RANGE_WRITE;
-
- ret = __sync_file_range(cmd->dev->fd, cmd->offset, length, flags);
+ ret = __sync_file_range(cmd->dev->fd, cmd->offset, length);
if (ret) {
result = SAM_STAT_CHECK_CONDITION;
key = MEDIUM_ERROR;
diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
index 65a6136..6068479 100644
--- a/usr/bs_rdwr.c
+++ b/usr/bs_rdwr.c
@@ -49,9 +49,8 @@ static void bs_sync_sync_range(struct scsi_cmd *cmd, uint32_t length,
int *result, uint8_t *key, uint16_t *asc)
{
int ret;
- unsigned int flags = SYNC_FILE_RANGE_WAIT_BEFORE| SYNC_FILE_RANGE_WRITE;
- ret = __sync_file_range(cmd->dev->fd, cmd->offset, length, flags);
+ ret = __sync_file_range(cmd->dev->fd, cmd->offset, length);
if (ret)
set_medium_error(result, key, asc);
}
diff --git a/usr/util.h b/usr/util.h
index 794c70b..49d980d 100644
--- a/usr/util.h
+++ b/usr/util.h
@@ -119,13 +119,14 @@ extern unsigned long pagesize, pageshift;
extern long int syscall(long int sysno, ...);
-static inline int __sync_file_range(int fd, __off64_t offset, __off64_t bytes,
- unsigned int flags)
+static inline int __sync_file_range(int fd, __off64_t offset, __off64_t bytes)
{
int ret;
+ unsigned int flags = SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE
+ | SYNC_FILE_RANGE_WAIT_AFTER;
ret = syscall(__NR_sync_file_range, fd, offset, bytes, flags);
- if (ret == -EPERM)
+ if (ret)
ret = fsync(fd);
return ret;
}
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list