Introduce a new header that includes definitions of all OS specific services. stgt code will use abstract API from os.h. (start with os_xxx). Then a linux/os.c and bsd/os.c implement these services for the needed platform. First such service is sync_file_range which needs to be emulated in bsd. Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx> --- usr/Makefile | 3 +++ usr/bs_mmap.c | 2 +- usr/bs_rdwr.c | 2 +- usr/bsd/os.c | 33 +++++++++++++++++++++++++++++++++ usr/linux/os.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ usr/os.h | 15 +++++++++++++++ usr/util.h | 38 +------------------------------------- 7 files changed, 108 insertions(+), 39 deletions(-) create mode 100644 usr/bsd/os.c create mode 100644 usr/linux/os.c create mode 100644 usr/os.h diff --git a/usr/Makefile b/usr/Makefile index 3fc848e..03b3c90 100644 --- a/usr/Makefile +++ b/usr/Makefile @@ -65,6 +65,9 @@ TGTD_OBJS += tgtd.o mgmt.o target.o scsi.o log.o driver.o util.o work.o \ parser.o spc.o sbc.o mmc.o osd.o scc.o smc.o \ ssc.o bs_ssc.o libssc.o \ bs_null.o bs_sg.o bs.o libcrc32c.o + +TGTD_OBJS += linux/os.o + MANPAGES = ../doc/manpages/tgtadm.8 ../doc/manpages/tgt-admin.8 \ ../doc/manpages/tgt-setup-lun.8 DOCS = ../doc/README.fcoe ../doc/README.ibmvstgt ../doc/README.iscsi ../doc/README.iser \ diff --git a/usr/bs_mmap.c b/usr/bs_mmap.c index bb24f5e..8eb6a47 100644 --- a/usr/bs_mmap.c +++ b/usr/bs_mmap.c @@ -60,7 +60,7 @@ static void bs_mmap_request(struct scsi_cmd *cmd) unsigned int flags = SYNC_FILE_RANGE_WAIT_BEFORE| SYNC_FILE_RANGE_WRITE; - ret = __sync_file_range(cmd->dev->fd, cmd->offset, length, flags); + ret = os_sync_file_range(cmd->dev->fd, cmd->offset, length, flags); if (ret) { result = SAM_STAT_CHECK_CONDITION; key = MEDIUM_ERROR; diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c index 65a6136..0c21e01 100644 --- a/usr/bs_rdwr.c +++ b/usr/bs_rdwr.c @@ -51,7 +51,7 @@ static void bs_sync_sync_range(struct scsi_cmd *cmd, uint32_t length, 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 = os_sync_file_range(cmd->dev->fd, cmd->offset, length, flags); if (ret) set_medium_error(result, key, asc); } diff --git a/usr/bsd/os.c b/usr/bsd/os.c new file mode 100644 index 0000000..7fbcd5c --- /dev/null +++ b/usr/bsd/os.c @@ -0,0 +1,33 @@ +/* + * OS dependent services implementation for BSD platform + * + * Copyright (C) 2009 Boaz Harrosh <bharrosh@xxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include <errno.h> +#include <unistd.h> + +#include <linux/fs.h> + +#include "os.h" + +int os_sync_file_range(int fd, __off64_t offset, __off64_t bytes, + unsigned int flags) +{ + return fsync(fd); +} diff --git a/usr/linux/os.c b/usr/linux/os.c new file mode 100644 index 0000000..2094eec --- /dev/null +++ b/usr/linux/os.c @@ -0,0 +1,54 @@ +/* + * OS dependent services implementation for Linux platform + * + * Copyright (C) 2009 Boaz Harrosh <bharrosh@xxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include <errno.h> +#include <unistd.h> +#include <sys/syscall.h> + +#include "os.h" + +/* + * the latest glibc have a proper sync_file_range definition but + * most of the distributions aren't shipped with it yet. +*/ +#ifndef __NR_sync_file_range +#if defined(__i386) +#define __NR_sync_file_range 314 +#elif defined(__x86_64__) +#define __NR_sync_file_range 277 +#elif defined(__ia64__) +#define __NR_sync_file_range 1300 +#elif defined(__powerpc64__) || defined(__PPC__) +#define __NR_sync_file_range 308 +#endif +#endif + +int os_sync_file_range(int fd, __off64_t offset, __off64_t bytes, + unsigned int flags) +{ + int ret; + + ret = syscall(__NR_sync_file_range, fd, offset, bytes, flags); + if (ret == -EPERM) + ret = fsync(fd); + return ret; +} + diff --git a/usr/os.h b/usr/os.h new file mode 100644 index 0000000..c32ce29 --- /dev/null +++ b/usr/os.h @@ -0,0 +1,15 @@ +#ifndef __TGT_OS_H__ +#define __TGT_OS_H__ + +#include <sys/types.h> +#include <linux/fs.h> + +#ifndef SYNC_FILE_RANGE_WAIT_BEFORE +#define SYNC_FILE_RANGE_WAIT_BEFORE 1 +#define SYNC_FILE_RANGE_WRITE 2 +#define SYNC_FILE_RANGE_WAIT_AFTER 4 +#endif +int os_sync_file_range(int fd, __off64_t offset, __off64_t bytes, + unsigned int flags); + +#endif /* ndef __TGT_OS_H__*/ diff --git a/usr/util.h b/usr/util.h index 419f648..18e0eb0 100644 --- a/usr/util.h +++ b/usr/util.h @@ -7,6 +7,7 @@ #include <errno.h> #include <endian.h> #include "be_byteshift.h" +#include "os.h" #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) @@ -101,41 +102,4 @@ do { \ extern unsigned long pagesize, pageshift; - -/* - * the latest glibc have a proper sync_file_range definition but - * most of the distributions aren't shipped with it yet. -*/ - -#ifndef __NR_sync_file_range -#if defined(__i386) -#define __NR_sync_file_range 314 -#elif defined(__x86_64__) -#define __NR_sync_file_range 277 -#elif defined(__ia64__) -#define __NR_sync_file_range 1300 -#elif defined(__powerpc64__) || defined(__PPC__) -#define __NR_sync_file_range 308 -#endif -#endif - -#ifndef SYNC_FILE_RANGE_WAIT_BEFORE -#define SYNC_FILE_RANGE_WAIT_BEFORE 1 -#define SYNC_FILE_RANGE_WRITE 2 -#define SYNC_FILE_RANGE_WAIT_AFTER 4 -#endif - -extern long int syscall(long int sysno, ...); - -static inline int __sync_file_range(int fd, __off64_t offset, __off64_t bytes, - unsigned int flags) -{ - int ret; - - ret = syscall(__NR_sync_file_range, fd, offset, bytes, flags); - if (ret == -EPERM) - ret = fsync(fd); - return ret; -} - #endif -- 1.6.0.6 -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html