From 5a4a04ff74f2e29adfbb6fa9204287536f95c50c Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Wed, 31 Dec 2014 13:17:26 +0100 Subject: [PATCH 01/28] Bump `DEV_NB_PHYS_SEG` This allows to set larger maximum sector transfers from userspace, which increases bandwidth in sequential write workloads. This change doesn't have any effect unless some block configuration changes are made (from userspace) as well. Assuming an SRB device, `srb1` was created (using `attach`), first validate its `max_hw_sectors_kb` value: ``` $ cat /sys/class/block/srb1/queue/max_hw_sectors_kb 32768 ``` Next, the `max_sectors_kb` value can be configured. This sets the maximal transfer size for a single call to the CDMI server. The kernel sets this to 512 (1024 sectors) by default. Making this value larger can have a positive impact on performance in some workloads (sequential writes mostly, or writes of large blocks), but also has a negative impact at the kernel side (more allocator pressure etc.). Tune it according to your workload (use `blktrace` or `btrace` to find out write sizes while running your workload). We can e.g. set this to 8MB using ``` $ echo $(( 8 * 1024 )) > /sys/class/block/srb1/queue/max_sectors_kb $ cat /sys/class/block/srb1/queue/max_sectors_kb 8192 ``` After formatting the device, you can quickly validate the performance impact using e.g. ``` $ dd if=/dev/zero of=/mnt/srb1/zeros bs=8M count=$(( 1024 / 8 )) conv=fsync ``` When checking `btrace`, you should see commits of (1024 * 1024 * 8 / 512) sectors (or other relatively large values): ``` 251,0 15 70 570.000979569 6491 C WS 1795072 + 16384 (14691129571) [0] 251,0 8 135 570.413638516 6492 C WS 1811456 + 16384 (15103788266) [0] 251,0 7 399 570.725110955 6496 C W 1916928 + 8192 (2249808356) [0] 251,0 3 1478 570.946574847 6493 C WS 1925120 + 8192 (2470209854) [0] 251,0 5 1072 571.397512583 6490 C W 1867776 + 16384 (10230081008) [0] 251,0 8 136 571.615532644 6492 C W 1948672 + 9216 (3136311330) [0] 251,0 4 250 571.892105568 6494 C WS 1851392 + 16384 (10725763791) [0] 251,0 14 1000 572.277086118 6497 C W 1884160 + 16384 (3804676232) [0] ``` You're looking for lines with 'C'ommit lines for 'W'rites or synchronous 'WS'rites. These lines also provide the sector of the request and the request size (in sectors, 512B units) divided by a '+'. See `man blkparse`. --- srb.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/srb.h b/srb.h index af47373..abe8ad1 100644 --- a/srb.h +++ b/srb.h @@ -42,7 +42,10 @@ #define DEV_DEFAULT_DISKSIZE (50 * MB) #define DEV_MAX 64 #define DEV_SECTORSIZE 1 * MB -#define DEV_NB_PHYS_SEGS 512 +/* This defines the max_hw_sectors_kb value + * Unit is a sector (512B) + */ +#define DEV_NB_PHYS_SEGS (512 * 4 * 32) /* Device state (reduce spinlock section and avoid multiple operation on same device) */ #define DEV_IN_USE 1 From 9d550dfa69dad155b87ec4009bf2eb77d971e1a6 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 12:31:37 +0100 Subject: [PATCH 02/28] Restructure file layout and use Kbuild --- Kbuild | 1 + Makefile | 54 +++++++++--------- srb_log.h => include/srb/srb-log.h | 0 srb.h => include/srb/srb.h | 2 +- srb/Kbuild | 5 ++ {jsmn => srb/jsmn}/.hg/00changelog.i | Bin {jsmn => srb/jsmn}/.hg/branch | 0 {jsmn => srb/jsmn}/.hg/cache/branchheads | 0 {jsmn => srb/jsmn}/.hg/cache/tags | 0 {jsmn => srb/jsmn}/.hg/dirstate | Bin {jsmn => srb/jsmn}/.hg/hgrc | 0 {jsmn => srb/jsmn}/.hg/requires | 0 {jsmn => srb/jsmn}/.hg/store/00changelog.i | Bin {jsmn => srb/jsmn}/.hg/store/00manifest.i | Bin .../jsmn}/.hg/store/data/_l_i_c_e_n_s_e.i | Bin {jsmn => srb/jsmn}/.hg/store/data/_makefile.i | Bin .../jsmn}/.hg/store/data/_r_e_a_d_m_e.i | Bin .../jsmn}/.hg/store/data/_r_e_a_d_m_e.md.i | Bin {jsmn => srb/jsmn}/.hg/store/data/demo.c.i | Bin {jsmn => srb/jsmn}/.hg/store/data/jsmn.c.i | Bin {jsmn => srb/jsmn}/.hg/store/data/jsmn.h.i | Bin .../jsmn}/.hg/store/data/jsmn__test.c.i | Bin {jsmn => srb/jsmn}/.hg/store/data/test.sh.i | Bin {jsmn => srb/jsmn}/.hg/store/fncache | 0 {jsmn => srb/jsmn}/.hg/store/undo | Bin {jsmn => srb/jsmn}/.hg/undo.bookmarks | 0 {jsmn => srb/jsmn}/.hg/undo.branch | 0 {jsmn => srb/jsmn}/.hg/undo.desc | 0 {jsmn => srb/jsmn}/.hg/undo.dirstate | 0 {jsmn => srb/jsmn}/LICENSE | 0 {jsmn => srb/jsmn}/Makefile | 0 {jsmn => srb/jsmn}/README.md | 0 {jsmn => srb/jsmn}/jsmn.c | 0 {jsmn => srb/jsmn}/jsmn.h | 0 {jsmn => srb/jsmn}/jsmn_test.c | 0 srb_cdmi.c => srb/srb-cdmi.c | 2 +- srb_driver.c => srb/srb-driver.c | 2 +- srb_http.c => srb/srb-http.c | 2 +- srb_sysfs.c => srb/srb-sysfs.c | 2 +- 39 files changed, 37 insertions(+), 33 deletions(-) create mode 100644 Kbuild rename srb_log.h => include/srb/srb-log.h (100%) rename srb.h => include/srb/srb.h (99%) create mode 100644 srb/Kbuild rename {jsmn => srb/jsmn}/.hg/00changelog.i (100%) rename {jsmn => srb/jsmn}/.hg/branch (100%) rename {jsmn => srb/jsmn}/.hg/cache/branchheads (100%) rename {jsmn => srb/jsmn}/.hg/cache/tags (100%) rename {jsmn => srb/jsmn}/.hg/dirstate (100%) rename {jsmn => srb/jsmn}/.hg/hgrc (100%) rename {jsmn => srb/jsmn}/.hg/requires (100%) rename {jsmn => srb/jsmn}/.hg/store/00changelog.i (100%) rename {jsmn => srb/jsmn}/.hg/store/00manifest.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/_l_i_c_e_n_s_e.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/_makefile.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/_r_e_a_d_m_e.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/_r_e_a_d_m_e.md.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/demo.c.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/jsmn.c.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/jsmn.h.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/jsmn__test.c.i (100%) rename {jsmn => srb/jsmn}/.hg/store/data/test.sh.i (100%) rename {jsmn => srb/jsmn}/.hg/store/fncache (100%) rename {jsmn => srb/jsmn}/.hg/store/undo (100%) rename {jsmn => srb/jsmn}/.hg/undo.bookmarks (100%) rename {jsmn => srb/jsmn}/.hg/undo.branch (100%) rename {jsmn => srb/jsmn}/.hg/undo.desc (100%) rename {jsmn => srb/jsmn}/.hg/undo.dirstate (100%) rename {jsmn => srb/jsmn}/LICENSE (100%) rename {jsmn => srb/jsmn}/Makefile (100%) rename {jsmn => srb/jsmn}/README.md (100%) rename {jsmn => srb/jsmn}/jsmn.c (100%) rename {jsmn => srb/jsmn}/jsmn.h (100%) rename {jsmn => srb/jsmn}/jsmn_test.c (100%) rename srb_cdmi.c => srb/srb-cdmi.c (99%) rename srb_driver.c => srb/srb-driver.c (99%) rename srb_http.c => srb/srb-http.c (99%) rename srb_sysfs.c => srb/srb-sysfs.c (99%) diff --git a/Kbuild b/Kbuild new file mode 100644 index 0000000..47aff43 --- /dev/null +++ b/Kbuild @@ -0,0 +1 @@ +obj-y := srb/ diff --git a/Makefile b/Makefile index 129ec92..84fcea3 100644 --- a/Makefile +++ b/Makefile @@ -1,34 +1,32 @@ -## -## Copyright (C) 2014 SCALITY SA - http://www.scality.com -## -## This file is part of ScalityRestBlock. -## -## ScalityRestBlock 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, either version 3 of the License, or -## (at your option) any later version. -## -## ScalityRestBlock 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 ScalityRestBlock. If not, see . -## -## +# Copyright (C) 2014, 2015 Scality SA - http://www.scality.com +# +# This file is part of ScalityRestBlock. +# +# ScalityRestBlock 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, either version 3 of the License, or +# (at your option) any later version. +# +# ScalityRestBlock 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 ScalityRestBlock. If not, see . -TARGET := srb +KDIR ?= /lib/modules/$(shell uname -r)/build -srb-objs := srb_driver.o srb_sysfs.o srb_cdmi.o srb_http.o jsmn/jsmn.o -obj-m := $(TARGET).o -KDIR := /lib/modules/$(shell uname -r)/build -PWD := $(shell pwd) +default: modules -ccflags-y += -g3 -O2 -Wall -Wextra -Wno-unused-parameter -Werror -Warray-bounds -D_REENTRANT -DJSMN_PARENT_LINKS +modules: + $(MAKE) -C $(KDIR) M=$$PWD $@ -all: - $(MAKE) -C $(KDIR) M=$(PWD) modules +modules_install: + $(MAKE) -C $(KDIR) M=$$PWD $@ clean: - $(MAKE) -C $(KDIR) M=$(PWD) clean + $(MAKE) -C $(KDIR) M=$$PWD $@ + +help: + $(MAKE) -C $(KDIR) M=$$PWD $@ diff --git a/srb_log.h b/include/srb/srb-log.h similarity index 100% rename from srb_log.h rename to include/srb/srb-log.h diff --git a/srb.h b/include/srb/srb.h similarity index 99% rename from srb.h rename to include/srb/srb.h index af47373..97f27fa 100644 --- a/srb.h +++ b/include/srb/srb.h @@ -208,7 +208,7 @@ typedef struct srb_server_s { } srb_server_t; -#include "srb_log.h" +#include /* srb.c */ int srb_device_create(const char *filename, unsigned long long size); diff --git a/srb/Kbuild b/srb/Kbuild new file mode 100644 index 0000000..0964ccc --- /dev/null +++ b/srb/Kbuild @@ -0,0 +1,5 @@ +obj-m := srb.o + +srb-y := srb-driver.o srb-sysfs.o srb-cdmi.o srb-http.o jsmn/jsmn.o + +EXTRA_CFLAGS := -ggdb3 -Wall -Wextra -Werror -Wno-unused-parameter -I$(src)/../include -DJSMN_PARENT_LINKS diff --git a/jsmn/.hg/00changelog.i b/srb/jsmn/.hg/00changelog.i similarity index 100% rename from jsmn/.hg/00changelog.i rename to srb/jsmn/.hg/00changelog.i diff --git a/jsmn/.hg/branch b/srb/jsmn/.hg/branch similarity index 100% rename from jsmn/.hg/branch rename to srb/jsmn/.hg/branch diff --git a/jsmn/.hg/cache/branchheads b/srb/jsmn/.hg/cache/branchheads similarity index 100% rename from jsmn/.hg/cache/branchheads rename to srb/jsmn/.hg/cache/branchheads diff --git a/jsmn/.hg/cache/tags b/srb/jsmn/.hg/cache/tags similarity index 100% rename from jsmn/.hg/cache/tags rename to srb/jsmn/.hg/cache/tags diff --git a/jsmn/.hg/dirstate b/srb/jsmn/.hg/dirstate similarity index 100% rename from jsmn/.hg/dirstate rename to srb/jsmn/.hg/dirstate diff --git a/jsmn/.hg/hgrc b/srb/jsmn/.hg/hgrc similarity index 100% rename from jsmn/.hg/hgrc rename to srb/jsmn/.hg/hgrc diff --git a/jsmn/.hg/requires b/srb/jsmn/.hg/requires similarity index 100% rename from jsmn/.hg/requires rename to srb/jsmn/.hg/requires diff --git a/jsmn/.hg/store/00changelog.i b/srb/jsmn/.hg/store/00changelog.i similarity index 100% rename from jsmn/.hg/store/00changelog.i rename to srb/jsmn/.hg/store/00changelog.i diff --git a/jsmn/.hg/store/00manifest.i b/srb/jsmn/.hg/store/00manifest.i similarity index 100% rename from jsmn/.hg/store/00manifest.i rename to srb/jsmn/.hg/store/00manifest.i diff --git a/jsmn/.hg/store/data/_l_i_c_e_n_s_e.i b/srb/jsmn/.hg/store/data/_l_i_c_e_n_s_e.i similarity index 100% rename from jsmn/.hg/store/data/_l_i_c_e_n_s_e.i rename to srb/jsmn/.hg/store/data/_l_i_c_e_n_s_e.i diff --git a/jsmn/.hg/store/data/_makefile.i b/srb/jsmn/.hg/store/data/_makefile.i similarity index 100% rename from jsmn/.hg/store/data/_makefile.i rename to srb/jsmn/.hg/store/data/_makefile.i diff --git a/jsmn/.hg/store/data/_r_e_a_d_m_e.i b/srb/jsmn/.hg/store/data/_r_e_a_d_m_e.i similarity index 100% rename from jsmn/.hg/store/data/_r_e_a_d_m_e.i rename to srb/jsmn/.hg/store/data/_r_e_a_d_m_e.i diff --git a/jsmn/.hg/store/data/_r_e_a_d_m_e.md.i b/srb/jsmn/.hg/store/data/_r_e_a_d_m_e.md.i similarity index 100% rename from jsmn/.hg/store/data/_r_e_a_d_m_e.md.i rename to srb/jsmn/.hg/store/data/_r_e_a_d_m_e.md.i diff --git a/jsmn/.hg/store/data/demo.c.i b/srb/jsmn/.hg/store/data/demo.c.i similarity index 100% rename from jsmn/.hg/store/data/demo.c.i rename to srb/jsmn/.hg/store/data/demo.c.i diff --git a/jsmn/.hg/store/data/jsmn.c.i b/srb/jsmn/.hg/store/data/jsmn.c.i similarity index 100% rename from jsmn/.hg/store/data/jsmn.c.i rename to srb/jsmn/.hg/store/data/jsmn.c.i diff --git a/jsmn/.hg/store/data/jsmn.h.i b/srb/jsmn/.hg/store/data/jsmn.h.i similarity index 100% rename from jsmn/.hg/store/data/jsmn.h.i rename to srb/jsmn/.hg/store/data/jsmn.h.i diff --git a/jsmn/.hg/store/data/jsmn__test.c.i b/srb/jsmn/.hg/store/data/jsmn__test.c.i similarity index 100% rename from jsmn/.hg/store/data/jsmn__test.c.i rename to srb/jsmn/.hg/store/data/jsmn__test.c.i diff --git a/jsmn/.hg/store/data/test.sh.i b/srb/jsmn/.hg/store/data/test.sh.i similarity index 100% rename from jsmn/.hg/store/data/test.sh.i rename to srb/jsmn/.hg/store/data/test.sh.i diff --git a/jsmn/.hg/store/fncache b/srb/jsmn/.hg/store/fncache similarity index 100% rename from jsmn/.hg/store/fncache rename to srb/jsmn/.hg/store/fncache diff --git a/jsmn/.hg/store/undo b/srb/jsmn/.hg/store/undo similarity index 100% rename from jsmn/.hg/store/undo rename to srb/jsmn/.hg/store/undo diff --git a/jsmn/.hg/undo.bookmarks b/srb/jsmn/.hg/undo.bookmarks similarity index 100% rename from jsmn/.hg/undo.bookmarks rename to srb/jsmn/.hg/undo.bookmarks diff --git a/jsmn/.hg/undo.branch b/srb/jsmn/.hg/undo.branch similarity index 100% rename from jsmn/.hg/undo.branch rename to srb/jsmn/.hg/undo.branch diff --git a/jsmn/.hg/undo.desc b/srb/jsmn/.hg/undo.desc similarity index 100% rename from jsmn/.hg/undo.desc rename to srb/jsmn/.hg/undo.desc diff --git a/jsmn/.hg/undo.dirstate b/srb/jsmn/.hg/undo.dirstate similarity index 100% rename from jsmn/.hg/undo.dirstate rename to srb/jsmn/.hg/undo.dirstate diff --git a/jsmn/LICENSE b/srb/jsmn/LICENSE similarity index 100% rename from jsmn/LICENSE rename to srb/jsmn/LICENSE diff --git a/jsmn/Makefile b/srb/jsmn/Makefile similarity index 100% rename from jsmn/Makefile rename to srb/jsmn/Makefile diff --git a/jsmn/README.md b/srb/jsmn/README.md similarity index 100% rename from jsmn/README.md rename to srb/jsmn/README.md diff --git a/jsmn/jsmn.c b/srb/jsmn/jsmn.c similarity index 100% rename from jsmn/jsmn.c rename to srb/jsmn/jsmn.c diff --git a/jsmn/jsmn.h b/srb/jsmn/jsmn.h similarity index 100% rename from jsmn/jsmn.h rename to srb/jsmn/jsmn.h diff --git a/jsmn/jsmn_test.c b/srb/jsmn/jsmn_test.c similarity index 100% rename from jsmn/jsmn_test.c rename to srb/jsmn/jsmn_test.c diff --git a/srb_cdmi.c b/srb/srb-cdmi.c similarity index 99% rename from srb_cdmi.c rename to srb/srb-cdmi.c index 0f239ee..a5716c9 100644 --- a/srb_cdmi.c +++ b/srb/srb-cdmi.c @@ -27,7 +27,7 @@ #include #include #include -#include "srb.h" +#include #include "jsmn/jsmn.h" diff --git a/srb_driver.c b/srb/srb-driver.c similarity index 99% rename from srb_driver.c rename to srb/srb-driver.c index 67e50f8..84f1043 100644 --- a/srb_driver.c +++ b/srb/srb-driver.c @@ -37,7 +37,7 @@ #include #include -#include "srb.h" +#include // LKM information diff --git a/srb_http.c b/srb/srb-http.c similarity index 99% rename from srb_http.c rename to srb/srb-http.c index a949290..a4701c1 100644 --- a/srb_http.c +++ b/srb/srb-http.c @@ -21,7 +21,7 @@ #include #include -#include "srb.h" +#include #define HTTP_VER "HTTP/1.1" #define HTTP_OK "HTTP/1.1 200 OK" diff --git a/srb_sysfs.c b/srb/srb-sysfs.c similarity index 99% rename from srb_sysfs.c rename to srb/srb-sysfs.c index a9b23cf..99cd211 100644 --- a/srb_sysfs.c +++ b/srb/srb-sysfs.c @@ -24,7 +24,7 @@ #include #include -#include "srb.h" +#include /* Function for parsing params and reading humand readable size format From b7763604bbb14595b12bc26a6fb8c450e02b23f2 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 13:03:17 +0100 Subject: [PATCH 03/28] Add `srb-jsmn` module Also, keep private headers private. --- .gitignore | 2 +- Kbuild | 2 +- {srb/jsmn => include/srb-jsmn}/jsmn.h | 0 include/srb-jsmn/srb-jsmn.h | 32 +++++++++++++++ {srb/jsmn => srb-jsmn}/.hg/00changelog.i | Bin {srb/jsmn => srb-jsmn}/.hg/branch | 0 {srb/jsmn => srb-jsmn}/.hg/cache/branchheads | 0 {srb/jsmn => srb-jsmn}/.hg/cache/tags | 0 {srb/jsmn => srb-jsmn}/.hg/dirstate | Bin {srb/jsmn => srb-jsmn}/.hg/hgrc | 0 {srb/jsmn => srb-jsmn}/.hg/requires | 0 .../jsmn => srb-jsmn}/.hg/store/00changelog.i | Bin {srb/jsmn => srb-jsmn}/.hg/store/00manifest.i | Bin .../.hg/store/data/_l_i_c_e_n_s_e.i | Bin .../.hg/store/data/_makefile.i | Bin .../.hg/store/data/_r_e_a_d_m_e.i | Bin .../.hg/store/data/_r_e_a_d_m_e.md.i | Bin .../jsmn => srb-jsmn}/.hg/store/data/demo.c.i | Bin .../jsmn => srb-jsmn}/.hg/store/data/jsmn.c.i | Bin .../jsmn => srb-jsmn}/.hg/store/data/jsmn.h.i | Bin .../.hg/store/data/jsmn__test.c.i | Bin .../.hg/store/data/test.sh.i | Bin {srb/jsmn => srb-jsmn}/.hg/store/fncache | 0 {srb/jsmn => srb-jsmn}/.hg/store/undo | Bin {srb/jsmn => srb-jsmn}/.hg/undo.bookmarks | 0 {srb/jsmn => srb-jsmn}/.hg/undo.branch | 0 {srb/jsmn => srb-jsmn}/.hg/undo.desc | 0 {srb/jsmn => srb-jsmn}/.hg/undo.dirstate | 0 srb-jsmn/Kbuild | 6 +++ srb/jsmn/LICENSE => srb-jsmn/LICENSE-jsmn | 0 {srb/jsmn => srb-jsmn}/Makefile | 0 srb/jsmn/README.md => srb-jsmn/README-jsmn.md | 0 {srb/jsmn => srb-jsmn}/jsmn.c | 0 {srb/jsmn => srb-jsmn}/jsmn_test.c | 0 srb-jsmn/srb-jsmn-exports.c | 38 ++++++++++++++++++ srb/Kbuild | 4 +- srb/srb-cdmi.c | 10 ++--- srb/srb-driver.c | 2 +- srb/srb-http.c | 2 +- {include/srb => srb}/srb-log.h | 0 srb/srb-sysfs.c | 2 +- {include/srb => srb}/srb.h | 2 +- 42 files changed, 89 insertions(+), 13 deletions(-) rename {srb/jsmn => include/srb-jsmn}/jsmn.h (100%) create mode 100644 include/srb-jsmn/srb-jsmn.h rename {srb/jsmn => srb-jsmn}/.hg/00changelog.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/branch (100%) rename {srb/jsmn => srb-jsmn}/.hg/cache/branchheads (100%) rename {srb/jsmn => srb-jsmn}/.hg/cache/tags (100%) rename {srb/jsmn => srb-jsmn}/.hg/dirstate (100%) rename {srb/jsmn => srb-jsmn}/.hg/hgrc (100%) rename {srb/jsmn => srb-jsmn}/.hg/requires (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/00changelog.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/00manifest.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/_l_i_c_e_n_s_e.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/_makefile.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/_r_e_a_d_m_e.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/_r_e_a_d_m_e.md.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/demo.c.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/jsmn.c.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/jsmn.h.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/jsmn__test.c.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/data/test.sh.i (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/fncache (100%) rename {srb/jsmn => srb-jsmn}/.hg/store/undo (100%) rename {srb/jsmn => srb-jsmn}/.hg/undo.bookmarks (100%) rename {srb/jsmn => srb-jsmn}/.hg/undo.branch (100%) rename {srb/jsmn => srb-jsmn}/.hg/undo.desc (100%) rename {srb/jsmn => srb-jsmn}/.hg/undo.dirstate (100%) create mode 100644 srb-jsmn/Kbuild rename srb/jsmn/LICENSE => srb-jsmn/LICENSE-jsmn (100%) rename {srb/jsmn => srb-jsmn}/Makefile (100%) rename srb/jsmn/README.md => srb-jsmn/README-jsmn.md (100%) rename {srb/jsmn => srb-jsmn}/jsmn.c (100%) rename {srb/jsmn => srb-jsmn}/jsmn_test.c (100%) create mode 100644 srb-jsmn/srb-jsmn-exports.c rename {include/srb => srb}/srb-log.h (100%) rename {include/srb => srb}/srb.h (99%) diff --git a/.gitignore b/.gitignore index 7d6760e..a343e08 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,6 @@ Module.symvers .tmp_versions/ modules.order -srb.mod.c +*.mod.c linux/ linux-clones/ diff --git a/Kbuild b/Kbuild index 47aff43..25c0a0f 100644 --- a/Kbuild +++ b/Kbuild @@ -1 +1 @@ -obj-y := srb/ +obj-y := srb-jsmn/ srb/ diff --git a/srb/jsmn/jsmn.h b/include/srb-jsmn/jsmn.h similarity index 100% rename from srb/jsmn/jsmn.h rename to include/srb-jsmn/jsmn.h diff --git a/include/srb-jsmn/srb-jsmn.h b/include/srb-jsmn/srb-jsmn.h new file mode 100644 index 0000000..13be9dc --- /dev/null +++ b/include/srb-jsmn/srb-jsmn.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2015 Scality SA - http://www.scality.com + * + * This file is part of ScalityRestBlock. + * + * ScalityRestBlock 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, either version 3 of the License, or + * (at your option) any later version. + * + * ScalityRestBlock 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 ScalityRestBlock. If not, see . + */ + +#ifndef _SRB_JSMN_H +#define _SRB_JSMN_H + +#define _REENTRANT +#define JSMN_PARENT_LINKS + +#include "jsmn.h" + +void srb_jsmn_init(jsmn_parser *parser); +jsmnerr_t srb_jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens); + +#endif /* _SRB_JSMN_H */ diff --git a/srb/jsmn/.hg/00changelog.i b/srb-jsmn/.hg/00changelog.i similarity index 100% rename from srb/jsmn/.hg/00changelog.i rename to srb-jsmn/.hg/00changelog.i diff --git a/srb/jsmn/.hg/branch b/srb-jsmn/.hg/branch similarity index 100% rename from srb/jsmn/.hg/branch rename to srb-jsmn/.hg/branch diff --git a/srb/jsmn/.hg/cache/branchheads b/srb-jsmn/.hg/cache/branchheads similarity index 100% rename from srb/jsmn/.hg/cache/branchheads rename to srb-jsmn/.hg/cache/branchheads diff --git a/srb/jsmn/.hg/cache/tags b/srb-jsmn/.hg/cache/tags similarity index 100% rename from srb/jsmn/.hg/cache/tags rename to srb-jsmn/.hg/cache/tags diff --git a/srb/jsmn/.hg/dirstate b/srb-jsmn/.hg/dirstate similarity index 100% rename from srb/jsmn/.hg/dirstate rename to srb-jsmn/.hg/dirstate diff --git a/srb/jsmn/.hg/hgrc b/srb-jsmn/.hg/hgrc similarity index 100% rename from srb/jsmn/.hg/hgrc rename to srb-jsmn/.hg/hgrc diff --git a/srb/jsmn/.hg/requires b/srb-jsmn/.hg/requires similarity index 100% rename from srb/jsmn/.hg/requires rename to srb-jsmn/.hg/requires diff --git a/srb/jsmn/.hg/store/00changelog.i b/srb-jsmn/.hg/store/00changelog.i similarity index 100% rename from srb/jsmn/.hg/store/00changelog.i rename to srb-jsmn/.hg/store/00changelog.i diff --git a/srb/jsmn/.hg/store/00manifest.i b/srb-jsmn/.hg/store/00manifest.i similarity index 100% rename from srb/jsmn/.hg/store/00manifest.i rename to srb-jsmn/.hg/store/00manifest.i diff --git a/srb/jsmn/.hg/store/data/_l_i_c_e_n_s_e.i b/srb-jsmn/.hg/store/data/_l_i_c_e_n_s_e.i similarity index 100% rename from srb/jsmn/.hg/store/data/_l_i_c_e_n_s_e.i rename to srb-jsmn/.hg/store/data/_l_i_c_e_n_s_e.i diff --git a/srb/jsmn/.hg/store/data/_makefile.i b/srb-jsmn/.hg/store/data/_makefile.i similarity index 100% rename from srb/jsmn/.hg/store/data/_makefile.i rename to srb-jsmn/.hg/store/data/_makefile.i diff --git a/srb/jsmn/.hg/store/data/_r_e_a_d_m_e.i b/srb-jsmn/.hg/store/data/_r_e_a_d_m_e.i similarity index 100% rename from srb/jsmn/.hg/store/data/_r_e_a_d_m_e.i rename to srb-jsmn/.hg/store/data/_r_e_a_d_m_e.i diff --git a/srb/jsmn/.hg/store/data/_r_e_a_d_m_e.md.i b/srb-jsmn/.hg/store/data/_r_e_a_d_m_e.md.i similarity index 100% rename from srb/jsmn/.hg/store/data/_r_e_a_d_m_e.md.i rename to srb-jsmn/.hg/store/data/_r_e_a_d_m_e.md.i diff --git a/srb/jsmn/.hg/store/data/demo.c.i b/srb-jsmn/.hg/store/data/demo.c.i similarity index 100% rename from srb/jsmn/.hg/store/data/demo.c.i rename to srb-jsmn/.hg/store/data/demo.c.i diff --git a/srb/jsmn/.hg/store/data/jsmn.c.i b/srb-jsmn/.hg/store/data/jsmn.c.i similarity index 100% rename from srb/jsmn/.hg/store/data/jsmn.c.i rename to srb-jsmn/.hg/store/data/jsmn.c.i diff --git a/srb/jsmn/.hg/store/data/jsmn.h.i b/srb-jsmn/.hg/store/data/jsmn.h.i similarity index 100% rename from srb/jsmn/.hg/store/data/jsmn.h.i rename to srb-jsmn/.hg/store/data/jsmn.h.i diff --git a/srb/jsmn/.hg/store/data/jsmn__test.c.i b/srb-jsmn/.hg/store/data/jsmn__test.c.i similarity index 100% rename from srb/jsmn/.hg/store/data/jsmn__test.c.i rename to srb-jsmn/.hg/store/data/jsmn__test.c.i diff --git a/srb/jsmn/.hg/store/data/test.sh.i b/srb-jsmn/.hg/store/data/test.sh.i similarity index 100% rename from srb/jsmn/.hg/store/data/test.sh.i rename to srb-jsmn/.hg/store/data/test.sh.i diff --git a/srb/jsmn/.hg/store/fncache b/srb-jsmn/.hg/store/fncache similarity index 100% rename from srb/jsmn/.hg/store/fncache rename to srb-jsmn/.hg/store/fncache diff --git a/srb/jsmn/.hg/store/undo b/srb-jsmn/.hg/store/undo similarity index 100% rename from srb/jsmn/.hg/store/undo rename to srb-jsmn/.hg/store/undo diff --git a/srb/jsmn/.hg/undo.bookmarks b/srb-jsmn/.hg/undo.bookmarks similarity index 100% rename from srb/jsmn/.hg/undo.bookmarks rename to srb-jsmn/.hg/undo.bookmarks diff --git a/srb/jsmn/.hg/undo.branch b/srb-jsmn/.hg/undo.branch similarity index 100% rename from srb/jsmn/.hg/undo.branch rename to srb-jsmn/.hg/undo.branch diff --git a/srb/jsmn/.hg/undo.desc b/srb-jsmn/.hg/undo.desc similarity index 100% rename from srb/jsmn/.hg/undo.desc rename to srb-jsmn/.hg/undo.desc diff --git a/srb/jsmn/.hg/undo.dirstate b/srb-jsmn/.hg/undo.dirstate similarity index 100% rename from srb/jsmn/.hg/undo.dirstate rename to srb-jsmn/.hg/undo.dirstate diff --git a/srb-jsmn/Kbuild b/srb-jsmn/Kbuild new file mode 100644 index 0000000..e85372f --- /dev/null +++ b/srb-jsmn/Kbuild @@ -0,0 +1,6 @@ +obj-m := srb-jsmn.o + +srb-jsmn-y := srb-jsmn-exports.o jsmn.o + +EXTRA_CFLAGS := -ggdb3 -Wall -Wextra -Werror -Wno-unused-parameter -I$(src)/../include -I$(src)/../include/srb-jsmn +CFLAGS_jsmn.o := -D_REENTRANT -DJSMN_PARENT_LINKS diff --git a/srb/jsmn/LICENSE b/srb-jsmn/LICENSE-jsmn similarity index 100% rename from srb/jsmn/LICENSE rename to srb-jsmn/LICENSE-jsmn diff --git a/srb/jsmn/Makefile b/srb-jsmn/Makefile similarity index 100% rename from srb/jsmn/Makefile rename to srb-jsmn/Makefile diff --git a/srb/jsmn/README.md b/srb-jsmn/README-jsmn.md similarity index 100% rename from srb/jsmn/README.md rename to srb-jsmn/README-jsmn.md diff --git a/srb/jsmn/jsmn.c b/srb-jsmn/jsmn.c similarity index 100% rename from srb/jsmn/jsmn.c rename to srb-jsmn/jsmn.c diff --git a/srb/jsmn/jsmn_test.c b/srb-jsmn/jsmn_test.c similarity index 100% rename from srb/jsmn/jsmn_test.c rename to srb-jsmn/jsmn_test.c diff --git a/srb-jsmn/srb-jsmn-exports.c b/srb-jsmn/srb-jsmn-exports.c new file mode 100644 index 0000000..71fee10 --- /dev/null +++ b/srb-jsmn/srb-jsmn-exports.c @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2015 Scality SA - http://www.scality.com + * + * This file is part of ScalityRestBlock. + * + * ScalityRestBlock 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, either version 3 of the License, or + * (at your option) any later version. + * + * ScalityRestBlock 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 ScalityRestBlock. If not, see . + */ + +#include +#include + +void srb_jsmn_init(jsmn_parser *parser) { + jsmn_init(parser); +} +EXPORT_SYMBOL(srb_jsmn_init); + +jsmnerr_t srb_jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens) { + return jsmn_parse(parser, js, len, tokens, num_tokens); +} +EXPORT_SYMBOL(srb_jsmn_parse); + +MODULE_AUTHOR("Nicolas Trangez "); +MODULE_DESCRIPTION("jsmin JSON parsing library"); +MODULE_DESCRIPTION("Based on jsmin, copyright (c) 2010 Serge A. Zaitsev"); +MODULE_LICENSE("Dual MIT/GPL"); +MODULE_VERSION("1.0"); diff --git a/srb/Kbuild b/srb/Kbuild index 0964ccc..285470d 100644 --- a/srb/Kbuild +++ b/srb/Kbuild @@ -1,5 +1,5 @@ obj-m := srb.o -srb-y := srb-driver.o srb-sysfs.o srb-cdmi.o srb-http.o jsmn/jsmn.o +srb-y := srb-driver.o srb-sysfs.o srb-cdmi.o srb-http.o -EXTRA_CFLAGS := -ggdb3 -Wall -Wextra -Werror -Wno-unused-parameter -I$(src)/../include -DJSMN_PARENT_LINKS +EXTRA_CFLAGS := -ggdb3 -Wall -Wextra -Werror -Wno-unused-parameter -I$(src)/../include diff --git a/srb/srb-cdmi.c b/srb/srb-cdmi.c index a5716c9..f098dcc 100644 --- a/srb/srb-cdmi.c +++ b/srb/srb-cdmi.c @@ -27,9 +27,9 @@ #include #include #include -#include +#include "srb.h" -#include "jsmn/jsmn.h" +#include /* TODO: add username and password support */ #define CDMI_DISCONNECTED 0 @@ -690,7 +690,7 @@ int srb_cdmi_list(srb_debug_t *dbg, // Now retrieve the list of objects... #define SRB_N_JSON_TOKENS 128 - jsmn_init(&json_parser); + srb_jsmn_init(&json_parser); n_tokens = SRB_N_JSON_TOKENS; do { @@ -701,8 +701,8 @@ int srb_cdmi_list(srb_debug_t *dbg, GFP_KERNEL); if (json_tokens != NULL) { - json_err = jsmn_parse(&json_parser, content, contentlen, - json_tokens, n_tokens); + json_err = srb_jsmn_parse(&json_parser, content, contentlen, + json_tokens, n_tokens); } else { /* krealloc doesn't free the original */ kfree(json_tokens2); diff --git a/srb/srb-driver.c b/srb/srb-driver.c index 84f1043..67e50f8 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -37,7 +37,7 @@ #include #include -#include +#include "srb.h" // LKM information diff --git a/srb/srb-http.c b/srb/srb-http.c index a4701c1..a949290 100644 --- a/srb/srb-http.c +++ b/srb/srb-http.c @@ -21,7 +21,7 @@ #include #include -#include +#include "srb.h" #define HTTP_VER "HTTP/1.1" #define HTTP_OK "HTTP/1.1 200 OK" diff --git a/include/srb/srb-log.h b/srb/srb-log.h similarity index 100% rename from include/srb/srb-log.h rename to srb/srb-log.h diff --git a/srb/srb-sysfs.c b/srb/srb-sysfs.c index 99cd211..a9b23cf 100644 --- a/srb/srb-sysfs.c +++ b/srb/srb-sysfs.c @@ -24,7 +24,7 @@ #include #include -#include +#include "srb.h" /* Function for parsing params and reading humand readable size format diff --git a/include/srb/srb.h b/srb/srb.h similarity index 99% rename from include/srb/srb.h rename to srb/srb.h index 97f27fa..25b3eb5 100644 --- a/include/srb/srb.h +++ b/srb/srb.h @@ -208,7 +208,7 @@ typedef struct srb_server_s { } srb_server_t; -#include +#include "srb-log.h" /* srb.c */ int srb_device_create(const char *filename, unsigned long long size); From 0285a379a04df9cd64464fe9feb555d058884970 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 15:21:07 +0100 Subject: [PATCH 04/28] Pull some functionality apart --- include/srb/srb-cdmi.h | 82 ++++++++++++++++++ include/srb/srb-http.h | 105 +++++++++++++++++++++++ {srb => include/srb}/srb-log.h | 11 ++- include/srb/srb.h | 27 ++++++ srb/srb-cdmi.c | 34 ++++---- srb/srb-driver.c | 25 +++--- srb/srb-http.c | 14 +++ srb/srb-sysfs.c | 22 ++--- srb/srb.h | 150 ++------------------------------- 9 files changed, 286 insertions(+), 184 deletions(-) create mode 100644 include/srb/srb-cdmi.h create mode 100644 include/srb/srb-http.h rename {srb => include/srb}/srb-log.h (97%) create mode 100644 include/srb/srb.h diff --git a/include/srb/srb-cdmi.h b/include/srb/srb-cdmi.h new file mode 100644 index 0000000..efd34aa --- /dev/null +++ b/include/srb/srb-cdmi.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2015 Scality SA - http://www.scality.com + * + * This file is part of ScalityRestBlock. + * + * ScalityRestBlock 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, either version 3 of the License, or + * (at your option) any later version. + * + * ScalityRestBlock 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 Foobar. If not, see . + * + */ + +#ifndef __SRB_CDMI_H__ +#define __SRB_CDMI_H__ + +#include + +#include +#include + +#define SRB_CDMI_URL_SIZE (256) +#define SRB_CDMI_HTTP_HEADER_SIZE (1024) + +#define SRB_CDMI_XMIT_BUFFER_SIZE (SRB_CDMI_HTTP_HEADER_SIZE + SRB_DEV_SECTORSIZE) + +struct srb_cdmi_desc_s { + /* For /sys/block/srb?/srb_url */ + char url[SRB_CDMI_URL_SIZE + 1]; + uint8_t state; + char ip_addr[16]; + uint16_t port; + char filename[SRB_CDMI_URL_SIZE + 1]; + char xmit_buff[SRB_CDMI_XMIT_BUFFER_SIZE]; + uint64_t nb_requests; /* Number of HTTP + * requests already sent + * through this socket */ + struct scatterlist sgl[SRB_DEV_NB_PHYS_SEGS]; + int sgl_size; + struct socket *socket; + struct sockaddr_in sockaddr; + struct timeval timeout; +}; + +int srb_cdmi_init(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + const char *url); +int srb_cdmi_connect(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); +int srb_cdmi_disconnect(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); + +int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + uint64_t *size); + +int srb_cdmi_getrange(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + uint64_t offset, int size); + +int srb_cdmi_putrange(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + uint64_t offset, int size); + +int srb_cdmi_flush(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + unsigned long flush_size); + +int srb_cdmi_truncate(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + unsigned long trunc_size); + +int srb_cdmi_create(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + unsigned long long trunc_size); +int srb_cdmi_extend(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + unsigned long long trunc_size); +int srb_cdmi_delete(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); + +typedef int (*srb_cdmi_list_cb)(void * data, const char *); +int srb_cdmi_list(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, + srb_cdmi_list_cb cb, void *cb_data); + +#endif diff --git a/include/srb/srb-http.h b/include/srb/srb-http.h new file mode 100644 index 0000000..1d003d8 --- /dev/null +++ b/include/srb/srb-http.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2015 Scality SA - http://www.scality.com + * + * This file is part of ScalityRestBlock. + * + * ScalityRestBlock 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, either version 3 of the License, or + * (at your option) any later version. + * + * ScalityRestBlock 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 Foobar. If not, see . + * + */ + +#ifndef __SRB_HTTP_H__ +#define __SRB_HTTP_H__ + +#include + +/* + * Status Ranges extracted from RFC 2616 + */ +enum srb_http_statusrange +{ + SRB_HTTP_STATUSRANGE_INFORMATIONAL = 1, // 1.. + SRB_HTTP_STATUSRANGE_SUCCESS = 2, // 2.. + SRB_HTTP_STATUSRANGE_REDIRECTION = 3, // 3.. + SRB_HTTP_STATUSRANGE_CLIENTERROR = 4, // 4.. + SRB_HTTP_STATUSRANGE_SERVERERROR = 5, // 5.. + SRB_HTTP_STATUSRANGE_EXTENDED = 0 +}; + +/* + * Codes extracted from RFC 2616 + */ +enum srb_http_statuscode +{ + SRB_HTTP_STATUS_CONTINUE = 100, // "100" ; Section 10.1.1: Continue + SRB_HTTP_STATUS_SWITCHPROTO = 101, // "101" ; Section 10.1.2: Switching Protocols + SRB_HTTP_STATUS_OK = 200, // "200" ; Section 10.2.1: OK + SRB_HTTP_STATUS_CREATED = 201, // "201" ; Section 10.2.2: Created + SRB_HTTP_STATUS_ACCEPTED = 202, // "202" ; Section 10.2.3: Accepted + SRB_HTTP_STATUS_NONAUTH_INFO = 203, // "203" ; Section 10.2.4: Non-Authoritative Information + SRB_HTTP_STATUS_NOCONTENT = 204, // "204" ; Section 10.2.5: No Content + SRB_HTTP_STATUS_RESETCONTENT = 205, // "205" ; Section 10.2.6: Reset Content + SRB_HTTP_STATUS_PARTIAL = 206, // "206" ; Section 10.2.7: Partial Content + SRB_HTTP_STATUS_MULTIPLE_CHOICES = 300, // "300" ; Section 10.3.1: Multiple Choices + SRB_HTTP_STATUS_MOVED = 301, // "301" ; Section 10.3.2: Moved Permanently + SRB_HTTP_STATUS_FOUND = 302, // "302" ; Section 10.3.3: Found + SRB_HTTP_STATUS_SEEOTHER = 303, // "303" ; Section 10.3.4: See Other + SRB_HTTP_STATUS_NOTMODIF = 304, // "304" ; Section 10.3.5: Not Modified + SRB_HTTP_STATUS_USE_PROXY = 305, // "305" ; Section 10.3.6: Use Proxy + SRB_HTTP_STATUS_TEMP_REDIR = 307, // "307" ; Section 10.3.8: Temporary Redirect + SRB_HTTP_STATUS_BADREQ = 400, // "400" ; Section 10.4.1: Bad Request + SRB_HTTP_STATUS_UNAUTH = 401, // "401" ; Section 10.4.2: Unauthorized + SRB_HTTP_STATUS_PAYMENT_REQ = 402, // "402" ; Section 10.4.3: Payment Required + SRB_HTTP_STATUS_FORBIDDEN = 403, // "403" ; Section 10.4.4: Forbidden + SRB_HTTP_STATUS_NOT_FOUND = 404, // "404" ; Section 10.4.5: Not Found + SRB_HTTP_STATUS_NOT_ALLOWED = 405, // "405" ; Section 10.4.6: Method Not Allowed + SRB_HTTP_STATUS_NOT_ACCEPTABLE = 406, // "406" ; Section 10.4.7: Not Acceptable + SRB_HTTP_STATUS_PROXYAUTH_REQ = 407, // "407" ; Section 10.4.8: Proxy Authentication Required + SRB_HTTP_STATUS_REQTIMEOUT = 408, // "408" ; Section 10.4.9: Request Time-out + SRB_HTTP_STATUS_CONFLICT = 409, // "409" ; Section 10.4.10: Conflict + SRB_HTTP_STATUS_GONE = 410, // "410" ; Section 10.4.11: Gone + SRB_HTTP_STATUS_LENGTH_REQ = 410, // "411" ; Section 10.4.12: Length Required + SRB_HTTP_STATUS_PRECOND_FAILED = 412, // "412" ; Section 10.4.13: Precondition Failed + SRB_HTTP_STATUS_ENTITY_TOOLARGE = 413, // "413" ; Section 10.4.14: Request Entity Too Large + SRB_HTTP_STATUS_URI_TOOLARGE = 414, // "414" ; Section 10.4.15: Request-URI Too Large + SRB_HTTP_STATUS_UNSUP_MEDIA = 415, // "415" ; Section 10.4.16: Unsupported Media Type + SRB_HTTP_STATUS_BADRANGE = 416, // "416" ; Section 10.4.17: Requested range not satisfiable + SRB_HTTP_STATUS_EXPECT_FAILED = 417, // "417" ; Section 10.4.18: Expectation Failed + SRB_HTTP_STATUS_INTERNAL_ERROR = 500, // "500" ; Section 10.5.1: Internal Server Error + SRB_HTTP_STATUS_NOTIMPL = 501, // "501" ; Section 10.5.2: Not Implemented + SRB_HTTP_STATUS_BAD_GW = 502, // "502" ; Section 10.5.3: Bad Gateway + SRB_HTTP_STATUS_SERVICE_UNAVAIL = 503, // "503" ; Section 10.5.4: Service Unavailable + SRB_HTTP_STATUS_GW_TIMEOUT = 504, // "504" ; Section 10.5.5: Gateway Time-out + SRB_HTTP_STATUS_VERSION_NOTSUPP = 505, // "505" ; Section 10.5.6: HTTP Version not supported + SRB_HTTP_STATUS_EXTENSION = 0 // ; extension-code +}; + +int srb_http_check_response_complete(char *buff, int len); +int srb_http_mklist(char *buff, int len, char *host, char *page); +int srb_http_mkhead(char *buff, int len, char *host, char *page); +int srb_http_mkrange(char *cmd, char *buff, int len, char *host, char *page, + uint64_t start, uint64_t end); + +int srb_http_mkcreate(char *buff, int len, char *host, char *page); +int srb_http_mktruncate(char *buff, int len, char *host, char *page, + unsigned long long size); +int srb_http_mkdelete(char *buff, int len, char *host, char *page); +int srb_http_header_get_uint64(char *buff, int len, char *key, + uint64_t *value); +int srb_http_skipheader(char **buff, int *len); +int srb_http_mkmetadata(char *buff, int len, char *host, char *page); + +int srb_http_get_status(char *buf, int len, enum srb_http_statuscode *code); +enum srb_http_statusrange srb_http_get_status_range(enum srb_http_statuscode status); + +#endif diff --git a/srb/srb-log.h b/include/srb/srb-log.h similarity index 97% rename from srb/srb-log.h rename to include/srb/srb-log.h index 34e7b6e..6e173e4 100644 --- a/srb/srb-log.h +++ b/include/srb/srb-log.h @@ -18,8 +18,13 @@ * */ -#ifndef __SRBLOCK_LOG_H__ -# define __SRBLOCK_LOG_H__ +#ifndef __SRB_LOG_H__ +#define __SRB_LOG_H__ + +typedef struct srb_debug_s { + const char *name; + int level; +} srb_debug_t; /* * Standard Kernel value for log level @@ -153,4 +158,4 @@ printk(KERN_ERR "srb: " fmt "\n" , ##a) */ -#endif /* ! __SRBLOCK_LOG_H__ */ +#endif /* ! __SRB_LOG_H__ */ diff --git a/include/srb/srb.h b/include/srb/srb.h new file mode 100644 index 0000000..5abffa0 --- /dev/null +++ b/include/srb/srb.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2015 Scality SA - http://www.scality.com + * + * This file is part of ScalityRestBlock. + * + * ScalityRestBlock 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, either version 3 of the License, or + * (at your option) any later version. + * + * ScalityRestBlock 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 Foobar. If not, see . + * + */ + +#ifndef __SRB_H__ +#define __SRB_H__ + +#define SRB_DEV_SECTORSIZE (1 * 1024 * 1024) +#define SRB_DEV_NB_PHYS_SEGS (512) + +#endif diff --git a/srb/srb-cdmi.c b/srb/srb-cdmi.c index f098dcc..7e0445e 100644 --- a/srb/srb-cdmi.c +++ b/srb/srb-cdmi.c @@ -29,6 +29,8 @@ #include #include "srb.h" +#include +#include #include /* TODO: add username and password support */ @@ -116,9 +118,9 @@ int srb_cdmi_init(srb_debug_t *dbg, desc->filename[0] = 0; *ip = 0; - strncpy(desc->url, url, SRB_URL_SIZE); + strncpy(desc->url, url, SRB_CDMI_URL_SIZE); - desc->url[SRB_URL_SIZE] = 0; + desc->url[SRB_CDMI_URL_SIZE] = 0; /* Only 'http://' supported for the moment */ if (strncmp(url, PROTO_HTTP, strlen(PROTO_HTTP))) return -EINVAL; @@ -346,7 +348,7 @@ static int sock_send_receive(srb_debug_t *dbg, if (rcv_size == 0) { strict_rcv = 0; - rcv_size = SRB_XMIT_BUFFER_SIZE; + rcv_size = SRB_CDMI_XMIT_BUFFER_SIZE; } rcvbuf = vmalloc(rcv_size); if (rcvbuf == NULL) { @@ -445,7 +447,7 @@ static int sock_send_sglist_receive(srb_debug_t *dbg, if (rcv_size == 0) { strict_rcv = 0; - rcv_size = SRB_XMIT_BUFFER_SIZE; + rcv_size = SRB_CDMI_XMIT_BUFFER_SIZE; } rcvbuf = vmalloc(rcv_size); if (rcvbuf == NULL) { @@ -603,7 +605,7 @@ int srb_cdmi_list(srb_debug_t *dbg, unsigned int n_tokens = 0; jsmnerr_t json_err = JSMN_ERROR_NOMEM; - char filename[SRB_URL_SIZE+1]; + char filename[SRB_CDMI_URL_SIZE+1]; char *buff = desc->xmit_buff; enum srb_http_statuscode code; @@ -619,7 +621,7 @@ int srb_cdmi_list(srb_debug_t *dbg, return 0; // Construct HTTTP GET (for listing container) - len = srb_http_mklist(buff, SRB_XMIT_BUFFER_SIZE, + len = srb_http_mklist(buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename); if (len <= 0) return len; @@ -763,8 +765,8 @@ int srb_cdmi_list(srb_debug_t *dbg, &content[json_tokens[array+ret].start]); strncpy(filename, &content[json_tokens[array+ret].start], - SRB_MIN(SRB_URL_SIZE, len)); - filename[SRB_MIN(SRB_URL_SIZE, len)] = 0; + SRB_MIN(SRB_CDMI_URL_SIZE, len)); + filename[SRB_MIN(SRB_CDMI_URL_SIZE, len)] = 0; if (volume_cb(cb_data, filename) != 0) { cb_errcount += 1; @@ -806,7 +808,7 @@ int srb_cdmi_flush(srb_debug_t *dbg, return 0; /* Construct HTTP truncate */ - len = srb_http_mktruncate(buff, SRB_XMIT_BUFFER_SIZE, + len = srb_http_mktruncate(buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename, flush_size); if (len <= 0) return len; @@ -860,7 +862,7 @@ int srb_cdmi_extend(srb_debug_t *dbg, } /* Construct/send HTTP truncate */ - len = srb_http_mktruncate(buff, SRB_XMIT_BUFFER_SIZE, + len = srb_http_mktruncate(buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename, trunc_size); if (len <= 0) return len; @@ -894,7 +896,7 @@ int srb_cdmi_create(srb_debug_t *dbg, return -EINVAL; /* Construct/send HTTP create */ - len = srb_http_mkcreate(buff, SRB_XMIT_BUFFER_SIZE, + len = srb_http_mkcreate(buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename); if (len <= 0) return len; @@ -913,7 +915,7 @@ int srb_cdmi_create(srb_debug_t *dbg, } /* Construct/send HTTP truncate */ - len = srb_http_mktruncate(buff, SRB_XMIT_BUFFER_SIZE, + len = srb_http_mktruncate(buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename, trunc_size); if (len <= 0) return len; @@ -945,7 +947,7 @@ int srb_cdmi_delete(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc) return -EINVAL; /* Construct HTTP delete */ - len = srb_http_mkdelete(buff, SRB_XMIT_BUFFER_SIZE, + len = srb_http_mkdelete(buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename); if (len <= 0) return len; @@ -1003,7 +1005,7 @@ int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, int ret, len; /* Construct a GET (?metadata) command */ - len = srb_http_mkmetadata(buff, SRB_XMIT_BUFFER_SIZE, + len = srb_http_mkmetadata(buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename); if (len <= 0) return len; @@ -1051,7 +1053,7 @@ int srb_cdmi_putrange(srb_debug_t *dbg, end = offset + size - 1; /* Construct a PUT request with range info */ - ret = srb_http_mkrange("PUT", xmit_buff, SRB_XMIT_BUFFER_SIZE, + ret = srb_http_mkrange("PUT", xmit_buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename, start, end); if (ret <= 0) return ret; @@ -1096,7 +1098,7 @@ int srb_cdmi_getrange(srb_debug_t *dbg, end = offset + size - 1; /* Construct a PUT request with range info */ - len = srb_http_mkrange("GET", xmit_buff, SRB_XMIT_BUFFER_SIZE, + len = srb_http_mkrange("GET", xmit_buff, SRB_CDMI_XMIT_BUFFER_SIZE, desc->ip_addr, desc->filename, start, end); if (len <= 0) diff --git a/srb/srb-driver.c b/srb/srb-driver.c index 67e50f8..a7e4d5f 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -37,6 +37,9 @@ #include #include +#include +#include + #include "srb.h" @@ -712,16 +715,16 @@ static int _srb_reconstruct_url(char *url, char *name, if (seplen) { - urllen = snprintf(url, SRB_URL_SIZE, "%s/%s", baseurl, filename); - namelen = snprintf(name, SRB_URL_SIZE, "%s/%s", basepath, filename); + urllen = snprintf(url, SRB_CDMI_URL_SIZE, "%s/%s", baseurl, filename); + namelen = snprintf(name, SRB_CDMI_URL_SIZE, "%s/%s", basepath, filename); } else { - urllen = snprintf(url, SRB_URL_SIZE, "%s%s", baseurl, filename); - namelen = snprintf(name, SRB_URL_SIZE, "%s%s", basepath, filename); + urllen = snprintf(url, SRB_CDMI_URL_SIZE, "%s%s", baseurl, filename); + namelen = snprintf(name, SRB_CDMI_URL_SIZE, "%s%s", basepath, filename); } - if (urllen >= SRB_URL_SIZE || namelen >= SRB_URL_SIZE) + if (urllen >= SRB_CDMI_URL_SIZE || namelen >= SRB_CDMI_URL_SIZE) return -EINVAL; return 0; @@ -880,8 +883,8 @@ static int _srb_server_new(srb_debug_t *dbg, const char *url, srb_server_t **ser */ static int _srb_server_pick(const char *filename, struct srb_cdmi_desc_s *pick) { - char url[SRB_URL_SIZE]; - char name[SRB_URL_SIZE]; + char url[SRB_CDMI_URL_SIZE]; + char name[SRB_CDMI_URL_SIZE]; int ret; int found = 0; srb_server_t *server = NULL; @@ -899,8 +902,8 @@ static int _srb_server_pick(const char *filename, struct srb_cdmi_desc_s *pick) SRB_LOG_INFO(srb_log, "Dewb reconstruct url yielded %s, %i", url, ret); if (ret == 0) { memcpy(pick, &server->cdmi_desc, sizeof(struct srb_cdmi_desc_s)); - strncpy(pick->url, url, SRB_URL_SIZE); - strncpy(pick->filename, name, SRB_URL_SIZE); + strncpy(pick->url, url, SRB_CDMI_URL_SIZE); + strncpy(pick->filename, name, SRB_CDMI_URL_SIZE); SRB_LOG_INFO(srb_log, "Copied into pick: url=%s, name=%s", pick->url, pick->filename); found = 1; break ; @@ -941,7 +944,7 @@ int srb_server_add(const char *url) debug.name = ""; debug.level = srb_log; - if (strlen(url) >= SRB_URL_SIZE) { + if (strlen(url) >= SRB_CDMI_URL_SIZE) { SRB_LOG_ERR(srb_log, "Url too big: '%s'", url); ret = -EINVAL; goto err_out_dev; @@ -1039,7 +1042,7 @@ int srb_server_remove(const char *url) SRB_LOG_INFO(srb_log, "srb_server_remove: removing server %s", url); - if (strlen(url) >= SRB_URL_SIZE) { + if (strlen(url) >= SRB_CDMI_URL_SIZE) { SRB_LOG_ERR(srb_log, "Url too big: '%s'", url); ret = -EINVAL; goto end; diff --git a/srb/srb-http.c b/srb/srb-http.c index a949290..9c7b370 100644 --- a/srb/srb-http.c +++ b/srb/srb-http.c @@ -21,6 +21,8 @@ #include #include +#include +#include #include "srb.h" #define HTTP_VER "HTTP/1.1" @@ -108,6 +110,7 @@ int srb_http_get_status(char *buf, int len, enum srb_http_statuscode *code) return -1; } +EXPORT_SYMBOL(srb_http_get_status); enum srb_http_statusrange srb_http_get_status_range(enum srb_http_statuscode status) @@ -127,6 +130,7 @@ enum srb_http_statusrange srb_http_get_status_range(enum srb_http_statuscode sta return range; } +EXPORT_SYMBOL(srb_http_get_status_range); #if 0 // Add a \0 at the end of the buffer @@ -176,6 +180,7 @@ int srb_http_check_response_complete(char *buff, int len) return hdr_end + contentlen <= len; } +EXPORT_SYMBOL(srb_http_check_response_complete); int srb_http_mkhead(char *buff, int len, char *host, char *page) { @@ -218,6 +223,7 @@ int srb_http_mkhead(char *buff, int len, char *host, char *page) return (len - mylen); } +EXPORT_SYMBOL(srb_http_mkhead); int srb_http_mkcreate(char *buff, int len, char *host, char *page) { @@ -268,6 +274,7 @@ int srb_http_mkcreate(char *buff, int len, char *host, char *page) return (len - mylen); } +EXPORT_SYMBOL(srb_http_mkcreate); int srb_http_mktruncate(char *buff, int len, char *host, char *page, unsigned long long size) { @@ -321,6 +328,7 @@ int srb_http_mktruncate(char *buff, int len, char *host, char *page, unsigned lo return (len - mylen); } +EXPORT_SYMBOL(srb_http_mktruncate); int srb_http_mkdelete(char *buff, int len, char *host, char *page) { @@ -363,6 +371,7 @@ int srb_http_mkdelete(char *buff, int len, char *host, char *page) return (len - mylen); } +EXPORT_SYMBOL(srb_http_mkdelete); int srb_http_mkmetadata(char *buff, int len, char *host, char *page) { @@ -405,6 +414,7 @@ int srb_http_mkmetadata(char *buff, int len, char *host, char *page) return (len - mylen); } +EXPORT_SYMBOL(srb_http_mkmetadata); int srb_http_mkrange(char *cmd, char *buff, int len, char *host, char *page, uint64_t start, uint64_t end) @@ -478,6 +488,7 @@ int srb_http_mkrange(char *cmd, char *buff, int len, char *host, char *page, return (len - mylen); } +EXPORT_SYMBOL(srb_http_mkrange); int srb_http_mklist(char *buff, int len, char *host, char *page) { @@ -539,6 +550,7 @@ int srb_http_mklist(char *buff, int len, char *host, char *page) return (len - mylen); } +EXPORT_SYMBOL(srb_http_mklist); int srb_http_header_get_uint64(char *buff, int len, char *key, uint64_t *value) { @@ -594,6 +606,7 @@ int srb_http_header_get_uint64(char *buff, int len, char *key, uint64_t *value) return 0; } +EXPORT_SYMBOL(srb_http_header_get_uint64); int srb_http_skipheader(char **buff, int *len) { @@ -615,3 +628,4 @@ int srb_http_skipheader(char **buff, int *len) return -1; } +EXPORT_SYMBOL(srb_http_skipheader); diff --git a/srb/srb-sysfs.c b/srb/srb-sysfs.c index a9b23cf..4b9c2cf 100644 --- a/srb/srb-sysfs.c +++ b/srb/srb-sysfs.c @@ -24,6 +24,8 @@ #include #include +#include + #include "srb.h" @@ -238,7 +240,7 @@ static ssize_t class_srb_create_store(struct class *c, parse_params(tmp_buf, delim, params, 2, count); /* sanity check */ len = strlen(params[0]); - if (len >= SRB_URL_SIZE) { + if (len >= SRB_CDMI_URL_SIZE) { SRB_LOG_ERR(srb_log, "Invalid volume name (too long: %lu)", len); ret = -EINVAL; goto out; @@ -317,7 +319,7 @@ static ssize_t class_srb_extend_store(struct class *c, parse_params(tmp_buf, delim, params, 2, count); /* sanity check */ len = strlen(params[0]); - if (len >= SRB_URL_SIZE) { + if (len >= SRB_CDMI_URL_SIZE) { SRB_LOG_ERR(srb_log, "Invalid volume name (too long: %lu)", len); ret = -EINVAL; goto out; @@ -357,10 +359,10 @@ static ssize_t class_srb_destroy_store(struct class *c, const char *buf, size_t count) { ssize_t ret = 0; - char filename[SRB_URL_SIZE + 1]; + char filename[SRB_CDMI_URL_SIZE + 1]; /* Sanity check URL size */ - if ((count == 0) || (count >= SRB_URL_SIZE)) { + if ((count == 0) || (count >= SRB_CDMI_URL_SIZE)) { SRB_LOG_ERR(srb_log, "Invalid parameter (too long: %lu)", count); ret = -EINVAL; goto out; @@ -427,7 +429,7 @@ static ssize_t class_srb_attach_store(struct class *c, } /* Sanity check params sizes */ - if (NULL == *filename || strlen(*filename) > SRB_URL_SIZE) { + if (NULL == *filename || strlen(*filename) > SRB_CDMI_URL_SIZE) { SRB_LOG_ERR(srb_log, "Invalid parameter #1: " "'%s'(%lu characters)", *filename, strlen(*filename)); @@ -503,7 +505,7 @@ static ssize_t class_srb_addurl_store(struct class *c, size_t count) { ssize_t ret = 0; - char url[SRB_URL_SIZE+1]; + char url[SRB_CDMI_URL_SIZE+1]; const char *tmp = buf; const char *tmpend = tmp; int errcount = 0; @@ -523,7 +525,7 @@ static ssize_t class_srb_addurl_store(struct class *c, while (*tmpend && *tmpend != '\n') tmpend++; - if ((tmpend - tmp) > SRB_URL_SIZE) { + if ((tmpend - tmp) > SRB_CDMI_URL_SIZE) { SRB_LOG_ERR(srb_log, "Url too big: '%s'", tmp); ret = -EINVAL; goto end; @@ -532,7 +534,7 @@ static ssize_t class_srb_addurl_store(struct class *c, url[(tmpend - tmp)] = 0; tmpend = NULL; } - url[SRB_URL_SIZE] = 0; + url[SRB_CDMI_URL_SIZE] = 0; ret = srb_server_add(url); if (ret < 0) @@ -563,7 +565,7 @@ static ssize_t class_srb_removeurl_store(struct class *c, size_t count) { ssize_t ret = 0; - char url[SRB_URL_SIZE]; + char url[SRB_CDMI_URL_SIZE]; const char *tmp = buf; const char *tmpend = tmp; @@ -585,7 +587,7 @@ static ssize_t class_srb_removeurl_store(struct class *c, while (*tmpend && *tmpend != '\n') tmpend++; - if ((tmpend - tmp) > SRB_URL_SIZE) + if ((tmpend - tmp) > SRB_CDMI_URL_SIZE) { SRB_LOG_ERR(srb_log, "Url too big: '%s'", tmp); ret = -EINVAL; diff --git a/srb/srb.h b/srb/srb.h index 25b3eb5..0558a6d 100644 --- a/srb/srb.h +++ b/srb/srb.h @@ -30,6 +30,10 @@ #include #include +#include +#include +#include + /* Constants */ #define kB 1024 #define MB (1024 * kB) @@ -41,16 +45,14 @@ #define DEV_MINORS 256 #define DEV_DEFAULT_DISKSIZE (50 * MB) #define DEV_MAX 64 -#define DEV_SECTORSIZE 1 * MB -#define DEV_NB_PHYS_SEGS 512 +#define DEV_SECTORSIZE SRB_DEV_SECTORSIZE +#define DEV_NB_PHYS_SEGS SRB_DEV_NB_PHYS_SEGS /* Device state (reduce spinlock section and avoid multiple operation on same device) */ #define DEV_IN_USE 1 #define DEV_UNUSED 0 /* Dewpoint server related constants */ -#define SRB_HTTP_HEADER_SIZE 1024 -#define SRB_URL_SIZE 256 #define SRB_REUSE_LIMIT 100 /* Max number of requests sent to * a single HTTP connection before * restarting a new one. @@ -77,97 +79,9 @@ extern unsigned int thread_pool_size; #define SRB_DEBUG_LEVEL 0 /* We do not want to be polluted * by default */ -#define SRB_XMIT_BUFFER_SIZE (SRB_HTTP_HEADER_SIZE + DEV_SECTORSIZE) - #define SRB_MIN(x, y) ((x) < (y) ? (x) : (y)) #define SRB_N_JSON_TOKENS 128 -/* - * Status Ranges extracted from RFC 2616 - */ -enum srb_http_statusrange -{ - SRB_HTTP_STATUSRANGE_INFORMATIONAL = 1, // 1.. - SRB_HTTP_STATUSRANGE_SUCCESS = 2, // 2.. - SRB_HTTP_STATUSRANGE_REDIRECTION = 3, // 3.. - SRB_HTTP_STATUSRANGE_CLIENTERROR = 4, // 4.. - SRB_HTTP_STATUSRANGE_SERVERERROR = 5, // 5.. - SRB_HTTP_STATUSRANGE_EXTENDED = 0 -}; - -/* - * Codes extracted from RFC 2616 - */ -enum srb_http_statuscode -{ - SRB_HTTP_STATUS_CONTINUE = 100, // "100" ; Section 10.1.1: Continue - SRB_HTTP_STATUS_SWITCHPROTO = 101, // "101" ; Section 10.1.2: Switching Protocols - SRB_HTTP_STATUS_OK = 200, // "200" ; Section 10.2.1: OK - SRB_HTTP_STATUS_CREATED = 201, // "201" ; Section 10.2.2: Created - SRB_HTTP_STATUS_ACCEPTED = 202, // "202" ; Section 10.2.3: Accepted - SRB_HTTP_STATUS_NONAUTH_INFO = 203, // "203" ; Section 10.2.4: Non-Authoritative Information - SRB_HTTP_STATUS_NOCONTENT = 204, // "204" ; Section 10.2.5: No Content - SRB_HTTP_STATUS_RESETCONTENT = 205, // "205" ; Section 10.2.6: Reset Content - SRB_HTTP_STATUS_PARTIAL = 206, // "206" ; Section 10.2.7: Partial Content - SRB_HTTP_STATUS_MULTIPLE_CHOICES = 300, // "300" ; Section 10.3.1: Multiple Choices - SRB_HTTP_STATUS_MOVED = 301, // "301" ; Section 10.3.2: Moved Permanently - SRB_HTTP_STATUS_FOUND = 302, // "302" ; Section 10.3.3: Found - SRB_HTTP_STATUS_SEEOTHER = 303, // "303" ; Section 10.3.4: See Other - SRB_HTTP_STATUS_NOTMODIF = 304, // "304" ; Section 10.3.5: Not Modified - SRB_HTTP_STATUS_USE_PROXY = 305, // "305" ; Section 10.3.6: Use Proxy - SRB_HTTP_STATUS_TEMP_REDIR = 307, // "307" ; Section 10.3.8: Temporary Redirect - SRB_HTTP_STATUS_BADREQ = 400, // "400" ; Section 10.4.1: Bad Request - SRB_HTTP_STATUS_UNAUTH = 401, // "401" ; Section 10.4.2: Unauthorized - SRB_HTTP_STATUS_PAYMENT_REQ = 402, // "402" ; Section 10.4.3: Payment Required - SRB_HTTP_STATUS_FORBIDDEN = 403, // "403" ; Section 10.4.4: Forbidden - SRB_HTTP_STATUS_NOT_FOUND = 404, // "404" ; Section 10.4.5: Not Found - SRB_HTTP_STATUS_NOT_ALLOWED = 405, // "405" ; Section 10.4.6: Method Not Allowed - SRB_HTTP_STATUS_NOT_ACCEPTABLE = 406, // "406" ; Section 10.4.7: Not Acceptable - SRB_HTTP_STATUS_PROXYAUTH_REQ = 407, // "407" ; Section 10.4.8: Proxy Authentication Required - SRB_HTTP_STATUS_REQTIMEOUT = 408, // "408" ; Section 10.4.9: Request Time-out - SRB_HTTP_STATUS_CONFLICT = 409, // "409" ; Section 10.4.10: Conflict - SRB_HTTP_STATUS_GONE = 410, // "410" ; Section 10.4.11: Gone - SRB_HTTP_STATUS_LENGTH_REQ = 410, // "411" ; Section 10.4.12: Length Required - SRB_HTTP_STATUS_PRECOND_FAILED = 412, // "412" ; Section 10.4.13: Precondition Failed - SRB_HTTP_STATUS_ENTITY_TOOLARGE = 413, // "413" ; Section 10.4.14: Request Entity Too Large - SRB_HTTP_STATUS_URI_TOOLARGE = 414, // "414" ; Section 10.4.15: Request-URI Too Large - SRB_HTTP_STATUS_UNSUP_MEDIA = 415, // "415" ; Section 10.4.16: Unsupported Media Type - SRB_HTTP_STATUS_BADRANGE = 416, // "416" ; Section 10.4.17: Requested range not satisfiable - SRB_HTTP_STATUS_EXPECT_FAILED = 417, // "417" ; Section 10.4.18: Expectation Failed - SRB_HTTP_STATUS_INTERNAL_ERROR = 500, // "500" ; Section 10.5.1: Internal Server Error - SRB_HTTP_STATUS_NOTIMPL = 501, // "501" ; Section 10.5.2: Not Implemented - SRB_HTTP_STATUS_BAD_GW = 502, // "502" ; Section 10.5.3: Bad Gateway - SRB_HTTP_STATUS_SERVICE_UNAVAIL = 503, // "503" ; Section 10.5.4: Service Unavailable - SRB_HTTP_STATUS_GW_TIMEOUT = 504, // "504" ; Section 10.5.5: Gateway Time-out - SRB_HTTP_STATUS_VERSION_NOTSUPP = 505, // "505" ; Section 10.5.6: HTTP Version not supported - SRB_HTTP_STATUS_EXTENSION = 0 // ; extension-code -}; - -/* srb_cdmi.c */ -struct srb_cdmi_desc_s { - /* For /sys/block/srb?/srb_url */ - char url[SRB_URL_SIZE + 1]; - uint8_t state; - char ip_addr[16]; - uint16_t port; - char filename[SRB_URL_SIZE + 1]; - char xmit_buff[SRB_XMIT_BUFFER_SIZE]; - uint64_t nb_requests; /* Number of HTTP - * requests already sent - * through this socket */ - struct scatterlist sgl[DEV_NB_PHYS_SEGS]; - int sgl_size; - struct socket *socket; - struct sockaddr_in sockaddr; - struct timeval timeout; -}; - -/* srb device definition */ -typedef struct srb_debug_s { - const char *name; - int level; -} srb_debug_t; - typedef struct srb_device_s { /* Device subsystem related data */ int id; /* device ID */ @@ -208,8 +122,6 @@ typedef struct srb_server_s { } srb_server_t; -#include "srb-log.h" - /* srb.c */ int srb_device_create(const char *filename, unsigned long long size); int srb_device_extend(const char *filename, unsigned long long size); @@ -228,54 +140,4 @@ int srb_sysfs_init(void); void srb_sysfs_device_init(srb_device_t *dev); void srb_sysfs_cleanup(void); -/* srb_cdmi.c */ -int srb_cdmi_init(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - const char *url); -int srb_cdmi_connect(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); -int srb_cdmi_disconnect(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); - -int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - uint64_t *size); - -int srb_cdmi_getrange(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - uint64_t offset, int size); - -int srb_cdmi_putrange(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - uint64_t offset, int size); - -int srb_cdmi_flush(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - unsigned long flush_size); - -int srb_cdmi_truncate(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - unsigned long trunc_size); - -int srb_cdmi_create(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - unsigned long long trunc_size); -int srb_cdmi_extend(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - unsigned long long trunc_size); -int srb_cdmi_delete(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); - -typedef int (*srb_cdmi_list_cb)(void * data, const char *); -int srb_cdmi_list(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - srb_cdmi_list_cb cb, void *cb_data); - -/* srb_http.c */ -int srb_http_check_response_complete(char *buff, int len); -int srb_http_mklist(char *buff, int len, char *host, char *page); -int srb_http_mkhead(char *buff, int len, char *host, char *page); -int srb_http_mkrange(char *cmd, char *buff, int len, char *host, char *page, - uint64_t start, uint64_t end); - -int srb_http_mkcreate(char *buff, int len, char *host, char *page); -int srb_http_mktruncate(char *buff, int len, char *host, char *page, - unsigned long long size); -int srb_http_mkdelete(char *buff, int len, char *host, char *page); -int srb_http_header_get_uint64(char *buff, int len, char *key, - uint64_t *value); -int srb_http_skipheader(char **buff, int *len); -int srb_http_mkmetadata(char *buff, int len, char *host, char *page); - -int srb_http_get_status(char *buf, int len, enum srb_http_statuscode *code); -enum srb_http_statusrange srb_http_get_status_range(enum srb_http_statuscode status); - #endif From f34d45b2a8f7c5aeb2413b2aa185b080a5fd4fb0 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 15:45:50 +0100 Subject: [PATCH 05/28] Remove heaps of functionality that should be performed from userspace --- include/srb/srb-cdmi.h | 17 -- srb/srb-cdmi.c | 375 ----------------------------------------- srb/srb-driver.c | 296 -------------------------------- srb/srb-sysfs.c | 249 --------------------------- srb/srb.h | 7 - 5 files changed, 944 deletions(-) diff --git a/include/srb/srb-cdmi.h b/include/srb/srb-cdmi.h index efd34aa..59d3cbf 100644 --- a/include/srb/srb-cdmi.h +++ b/include/srb/srb-cdmi.h @@ -62,21 +62,4 @@ int srb_cdmi_getrange(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, int srb_cdmi_putrange(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, uint64_t offset, int size); - -int srb_cdmi_flush(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - unsigned long flush_size); - -int srb_cdmi_truncate(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - unsigned long trunc_size); - -int srb_cdmi_create(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - unsigned long long trunc_size); -int srb_cdmi_extend(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - unsigned long long trunc_size); -int srb_cdmi_delete(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); - -typedef int (*srb_cdmi_list_cb)(void * data, const char *); -int srb_cdmi_list(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, - srb_cdmi_list_cb cb, void *cb_data); - #endif diff --git a/srb/srb-cdmi.c b/srb/srb-cdmi.c index 7e0445e..aab1e10 100644 --- a/srb/srb-cdmi.c +++ b/srb/srb-cdmi.c @@ -595,381 +595,6 @@ static int retried_send_receive(srb_debug_t *dbg, return ret; } -int srb_cdmi_list(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, - int (*volume_cb)(void * data, const char *), - void *cb_data) -{ - jsmn_parser json_parser; - jsmntok_t *json_tokens = NULL, *json_tokens2 = NULL; - unsigned int n_tokens = 0; - jsmnerr_t json_err = JSMN_ERROR_NOMEM; - - char filename[SRB_CDMI_URL_SIZE+1]; - char *buff = desc->xmit_buff; - - enum srb_http_statuscode code; - char *content = NULL; - uint64_t contentlen; - - int len; - int ret; - int array, obj, found; - int cb_errcount = 0; - - if (!desc->socket) - return 0; - - // Construct HTTTP GET (for listing container) - len = srb_http_mklist(buff, SRB_CDMI_XMIT_BUFFER_SIZE, - desc->ip_addr, desc->filename); - if (len <= 0) return len; - - len = sock_send_receive(dbg, desc, len, 0); - if (len < 0) return len; - - // Check response status - ret = srb_http_get_status(buff, len, &code); - if (ret == -1) - { - SRB_LOG_ERR(dbg->level, "[list] Cannot retrieve response status"); - ret = -EIO; - goto err; - } - if (code != SRB_HTTP_STATUS_OK) - { - SRB_LOG_ERR(dbg->level, "[list] Server listing yielded " - "response status %i", code); - ret = -EIO; - goto err; - } - - // Get content length - ret = srb_http_header_get_uint64(buff, len, - "Content-Length", &contentlen); - if (ret) - { - SRB_LOG_ERR(dbg->level, "[list] Could not find content length in " - "response headers."); - ret = -EIO; - goto err; - } - - content = vmalloc(contentlen); - if (content == NULL) - { - SRB_LOG_ERR(dbg->level, "[list] Cannot allocate enough memory to" - " read volume repository."); - ret = -ENOMEM; - goto err; - } - memset(content, 0, contentlen); - - // Skip header - ret = srb_http_skipheader(&buff, &len); - if (ret) { - SRB_LOG_ERR(dbg->level, "[list] skipheader failed: %d", ret); - ret = -EIO; - goto err; - } - if (len > contentlen) - { - SRB_LOG_ERR(dbg->level, "[list] More data left than expected:" - " len=%i > contentlen=%llu", len, contentlen); - ret = -EIO; - goto err; - } - - // Get body - // First, copy leftovers from buff - memcpy(content, buff, len); - if (len != contentlen) { - SRB_LOG_ERR(dbg->level, "[list] Cannot read whole listing: " - "len: %d contentlen:%llu", len, contentlen); - ret = -EIO; - goto err; - } - - // Now retrieve the list of objects... -#define SRB_N_JSON_TOKENS 128 - srb_jsmn_init(&json_parser); - n_tokens = SRB_N_JSON_TOKENS; - do - { - n_tokens *= 2; - json_tokens2 = json_tokens; - json_tokens = krealloc(json_tokens2, - n_tokens * sizeof(*json_tokens), - GFP_KERNEL); - if (json_tokens != NULL) - { - json_err = srb_jsmn_parse(&json_parser, content, contentlen, - json_tokens, n_tokens); - } else { - /* krealloc doesn't free the original */ - kfree(json_tokens2); - } - - } while (json_tokens != NULL - && json_err < 0 && json_err == JSMN_ERROR_NOMEM); - - if (json_err < 0) - { - if (json_tokens == NULL) - { - SRB_LOG_ERR(dbg->level, "Could not allocate enough memory to " - "parse JSON volume list."); - ret = -ENOMEM; - } - else - { - SRB_LOG_ERR(dbg->level, "Could not parse Json: error %i", json_err); - ret = -EIO; - } - goto err; - } - - // Find the "children" object within json root object - // for each sub-loop, ret (aka tmp iterator) is intialized to 1 - // in order to start after the object/array token it iterates within. - found = 0; - for (ret = 0; ret < json_err; ret ++) - { - jsmntok_t *objtok = &json_tokens[ret]; - // Dive into root object - if (objtok->parent == -1 && objtok->type == JSMN_OBJECT) - { - obj = ret; - for (ret = 1; obj+ret < json_err; ret += 2) - { - jsmntok_t *artok = &json_tokens[obj+ret]; - // Dive into key 'children' (should contain an array) - if (artok->type == JSMN_STRING - && strncmp("children", &content[artok->start], - artok->end - artok->start) == 0 - && obj+ret < json_err - && json_tokens[obj+ret+1].type == JSMN_ARRAY) - { - array = obj + ret + 1; - SRB_LOG_DEBUG(dbg->level, "Found children list:"); - // List children of the array we found. - for (ret = 1; - array + ret < json_err - && json_tokens[array+ret].parent == array - && ret < DEV_MAX; - ++ret) - { - len = json_tokens[array+ret].end - - json_tokens[array+ret].start; - SRB_LOG_DEBUG(dbg->level, "Volume %i: %.*s", ret, len, - &content[json_tokens[array+ret].start]); - strncpy(filename, - &content[json_tokens[array+ret].start], - SRB_MIN(SRB_CDMI_URL_SIZE, len)); - filename[SRB_MIN(SRB_CDMI_URL_SIZE, len)] = 0; - - if (volume_cb(cb_data, filename) != 0) { - cb_errcount += 1; - } - } - found = 1; - break ; - } - } - if (found) - break ; - } - } - - ret = 0; - if (cb_errcount != 0) - ret = -EIO; - -err: - if (json_tokens) - kfree(json_tokens); - if (content) - vfree(content); - - return ret; -} - -int srb_cdmi_flush(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, - unsigned long flush_size) -{ - char *buff = desc->xmit_buff; - uint64_t size; - int len; - int ret; - enum srb_http_statuscode code; - - if (!desc->socket) - return 0; - - /* Construct HTTP truncate */ - len = srb_http_mktruncate(buff, SRB_CDMI_XMIT_BUFFER_SIZE, - desc->ip_addr, desc->filename, flush_size); - if (len <= 0) return len; - - len = sock_send_receive(dbg, desc, len, 0); - if (len < 0) return len; - - ret = srb_http_get_status(buff, len, &code); - if (ret != 0) - { - SRB_LOG_ERR(dbg->level, "Cannot get http response status."); - return -EIO; - } - if (srb_http_get_status_range(code) != SRB_HTTP_STATUSRANGE_SUCCESS) - { - SRB_LOG_ERR(dbg->level, "Http server responded with bad status: %i", code); - if (code == SRB_HTTP_STATUS_NOT_FOUND) - return -ENODEV; - return -EIO; - } - - buff[len] = 0; - ret = srb_http_header_get_uint64(buff, len, "Content-Length", &size); - if (ret) - return -EIO; - - return 0; -} - -int srb_cdmi_extend(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, - unsigned long long trunc_size) -{ - char *buff = desc->xmit_buff; - unsigned long long cur_size = 0; - int len; - int ret; - enum srb_http_statuscode code; - - if (!desc || !desc->socket) - return -EINVAL; - - ret = srb_cdmi_getsize(dbg, desc, &cur_size); - if (ret != 0) { - SRB_LOG_ERR(dbg->level, "[extend] Could not get size of existing volume."); - return ret; - } - - if (cur_size >= trunc_size) { - SRB_LOG_ERR(dbg->level, "[extend] Cannot shrink a volume."); - return -EINVAL; - } - - /* Construct/send HTTP truncate */ - len = srb_http_mktruncate(buff, SRB_CDMI_XMIT_BUFFER_SIZE, - desc->ip_addr, desc->filename, trunc_size); - if (len <= 0) return len; - - len = sock_send_receive(dbg, desc, len, 0); - if (len < 0) return len; - - ret = srb_http_get_status(buff, len, &code); - if (ret == -1) { - SRB_LOG_ERR(dbg->level, "[extend] Cannot retrieve response status"); - return -EIO; - } - - if (srb_http_get_status_range(code) != SRB_HTTP_STATUSRANGE_SUCCESS) { - SRB_LOG_ERR(dbg->level, "[extend] Status of extend operation = %i.", code); - return -EIO; - } - - return 0; -} - -int srb_cdmi_create(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, - unsigned long long trunc_size) -{ - char *buff = desc->xmit_buff; - int len; - int ret; - enum srb_http_statuscode code; - - if (!desc || !desc->socket) - return -EINVAL; - - /* Construct/send HTTP create */ - len = srb_http_mkcreate(buff, SRB_CDMI_XMIT_BUFFER_SIZE, - desc->ip_addr, desc->filename); - if (len <= 0) return len; - - len = sock_send_receive(dbg, desc, len, 0); - if (len < 0) return len; - - ret = srb_http_get_status(buff, len, &code); - if (ret == -1) { - SRB_LOG_ERR(dbg->level, "[create] Cannot retrieve response status from %.*s", 32, buff); - return -EIO; - } - - if (srb_http_get_status_range(code) != SRB_HTTP_STATUSRANGE_SUCCESS) { - SRB_LOG_ERR(dbg->level, "[create] Status of create operation = %i.", code); - return -EIO; - } - - /* Construct/send HTTP truncate */ - len = srb_http_mktruncate(buff, SRB_CDMI_XMIT_BUFFER_SIZE, - desc->ip_addr, desc->filename, trunc_size); - if (len <= 0) return len; - - len = sock_send_receive(dbg, desc, len, 0); - if (len < 0) return len; - - ret = srb_http_get_status(buff, len, &code); - if (ret == -1) { - SRB_LOG_ERR(dbg->level, "[create-trunc] Cannot retrieve response status"); - return -EIO; - } - - if (srb_http_get_status_range(code) != SRB_HTTP_STATUSRANGE_SUCCESS) { - SRB_LOG_ERR(dbg->level, "[create-trunc] Status of create operation = %i.", code); - return -EIO; - } - - return 0; -} - -int srb_cdmi_delete(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc) -{ - char *buff = desc->xmit_buff; - int len; - int ret; - enum srb_http_statuscode code; - - if (!desc || !desc->socket) - return -EINVAL; - - /* Construct HTTP delete */ - len = srb_http_mkdelete(buff, SRB_CDMI_XMIT_BUFFER_SIZE, - desc->ip_addr, desc->filename); - if (len <= 0) return len; - - len = sock_send_receive(dbg, desc, len, 0); - if (len < 0) return len; - - ret = srb_http_get_status(buff, len, &code); - if (ret == -1) { - SRB_LOG_ERR(dbg->level, "[destroy] Cannot retrieve response status"); - return -EIO; - } - - if (srb_http_get_status_range(code) != SRB_HTTP_STATUSRANGE_SUCCESS) { - SRB_LOG_ERR(dbg->level, "[destroy] Status of delete operation = %i.", code); - if (code == SRB_HTTP_STATUS_NOT_FOUND) - return -ENOENT; - return -EIO; - } - - return 0; -} - /* HACK: due to a bug in HTTP HEAD from scality,using metadata instead */ #if 0 int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, diff --git a/srb/srb-driver.c b/srb/srb-driver.c index a7e4d5f..f32faba 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -1100,92 +1100,6 @@ ssize_t srb_servers_dump(char *buf, ssize_t max_size) return ret < 0 ? ret : printed; } -struct cdmi_volume_list_data { - char *buf; - size_t max_size; - size_t printed; -}; -static int _srb_volume_dump(struct cdmi_volume_list_data *cb_data, const char *volname) -{ - int ret; - int len; - - SRB_LOG_DEBUG(srb_log, "Adding volume %s to listing", volname); - if (cb_data->printed + strlen(volname) + 1 < cb_data->max_size) - { - len = snprintf(cb_data->buf + cb_data->printed, - cb_data->max_size - cb_data->printed, - "%s\n", volname); - if (len == -1 - || len > cb_data->max_size - cb_data->printed) { - SRB_LOG_ERR(srb_log, "Not enough space to print" - " volume list in buffer."); - ret = -ENOMEM; - goto end; - } - cb_data->printed += len; - } - - ret = 0; - -end: - return ret; -} - -int srb_volumes_dump(char *buf, size_t max_size) -{ - int ret = 0; - int connected = 0; - struct srb_cdmi_desc_s *cdmi_desc; - struct cdmi_volume_list_data cb_data = { buf, max_size, 0}; - srb_debug_t debug; - - SRB_LOG_INFO(srb_log, "srb_volumes_dump: dumping volumes: buf: %p, max_size: %ld", buf, max_size); - - cdmi_desc = vmalloc(sizeof(*cdmi_desc)); - if (cdmi_desc == NULL) { - ret = -ENOMEM; - goto cleanup; - } - - /* Find server for directory (filename must be empty, not NULL) */ - ret = _srb_server_pick("", cdmi_desc); - if (ret != 0) { - SRB_LOG_ERR(srb_log, "Unable to get server: %i", ret); - goto cleanup; - } - SRB_LOG_INFO(srb_log, "Dumping volumes: Picked server " - "[ip=%s port=%d fullpath=%s]", - cdmi_desc->ip_addr, cdmi_desc->port, - cdmi_desc->filename); - - /* Inherit log level from srb LKM */ - debug.name = ""; - debug.level = srb_log; - - ret = srb_cdmi_connect(&debug, cdmi_desc); - if (ret != 0) - goto cleanup; - connected = 1; - - ret = srb_cdmi_list(&debug, cdmi_desc, - (srb_cdmi_list_cb)_srb_volume_dump, (void*)&cb_data); - if (ret != 0) - goto cleanup; - - ret = 0; - -cleanup: - if (NULL != cdmi_desc) - { - if (connected) - srb_cdmi_disconnect(&debug, cdmi_desc); - vfree(cdmi_desc); - } - - return ret < 0 ? ret : cb_data.printed; -} - int srb_device_detach(const char *devname) { int ret = 0; @@ -1393,216 +1307,6 @@ int srb_device_attach(const char *filename, const char *devname) return rc; } -int srb_device_create(const char *filename, unsigned long long size) -{ - srb_debug_t debug; - struct srb_cdmi_desc_s *cdmi_desc; - int rc; - - SRB_LOG_INFO(srb_log, "srb_device_create: creating volume %s of size %llu", filename, size); - - debug.name = NULL; - debug.level = srb_log; - - cdmi_desc = vmalloc(sizeof(struct srb_cdmi_desc_s)); - if (cdmi_desc == NULL) { - rc = -ENOMEM; - goto err_out_mod; - } - - /* Now, setup a cdmi connection then Truncate(create) the file. */ - rc = _srb_server_pick(filename, cdmi_desc); - if (rc != 0) - goto err_out_alloc; - - rc = srb_cdmi_connect(&debug, cdmi_desc); - if (rc != 0) - goto err_out_alloc; - - rc = srb_cdmi_create(&debug, cdmi_desc, size); - if (rc != 0) - goto err_out_cdmi; - - srb_cdmi_disconnect(&debug, cdmi_desc); - - SRB_LOG_INFO(srb_log, "Created volume with filename %s", filename); - - if (cdmi_desc) - vfree(cdmi_desc); - - return rc; - -err_out_cdmi: - srb_cdmi_disconnect(&debug, cdmi_desc); -err_out_alloc: - if (cdmi_desc) - vfree(cdmi_desc); -err_out_mod: - SRB_LOG_ERR(srb_log, "Error creating volume %s", filename); - - return rc; -} - -int srb_device_extend(const char *filename, unsigned long long size) -{ - srb_debug_t debug; - struct srb_cdmi_desc_s *cdmi_desc = NULL; - int i; - int rc = 0; - struct srb_device_s *dev = NULL; - - SRB_LOG_INFO(srb_log, "srb_device_extend: extending volume %s to %llu size", filename, size); - - debug.name = NULL; - debug.level = srb_log; - - /* check if volume is already attached, otherwise use the first empty slot */ - spin_lock(&devtab_lock); - for (i = 0; i < DEV_MAX; ++i) { - if (!device_free_slot(&devtab[i])) { - const char *fname = kbasename(devtab[i].thread_cdmi_desc[0]->filename); - if (strlen(fname) == strlen(filename) && strncmp(fname, filename, strlen(filename)) == 0) { - dev = &devtab[i]; - if (dev->state == DEV_IN_USE) - rc = -EBUSY; - else - dev->state = DEV_IN_USE; - break; - } - } - } - spin_unlock(&devtab_lock); - if (0 != rc) { - SRBDEV_LOG_ERR(dev, "Cannot extend volume %s: attached on device in use (%s)", filename, dev->name); - dev = NULL; - return rc; - } - - cdmi_desc = vmalloc(sizeof(struct srb_cdmi_desc_s)); - if (cdmi_desc == NULL) { - rc = -ENOMEM; - goto err_out_mod; - } - memset(cdmi_desc, 0, sizeof(struct srb_cdmi_desc_s)); - - /* Now, setup a cdmi connection then Truncate(create) the file. */ - rc = _srb_server_pick(filename, cdmi_desc); - if (rc != 0) - goto err_out_alloc; - - rc = srb_cdmi_connect(&debug, cdmi_desc); - if (rc != 0) - goto err_out_alloc; - - rc = srb_cdmi_extend(&debug, cdmi_desc, size); - if (rc != 0) - goto err_out_cdmi; - - rc = srb_cdmi_disconnect(&debug, cdmi_desc); - if (rc != 0) - goto err_out_cdmi; - - if (cdmi_desc) - vfree(cdmi_desc); - - // Find device (normally only 1) associated to filename and update their size - spin_lock(&devtab_lock); - if (dev) { - devtab[i].disk_size = size; - set_capacity(devtab[i].disk, devtab[i].disk_size / 512ULL); - revalidate_disk(devtab[i].disk); - dev->state = DEV_UNUSED; - } - spin_unlock(&devtab_lock); - - SRB_LOG_INFO(srb_log, "Extended filename %s", filename); - - return rc; - -err_out_cdmi: - srb_cdmi_disconnect(&debug, cdmi_desc); -err_out_alloc: - if (cdmi_desc) - vfree(cdmi_desc); -err_out_mod: - SRB_LOG_ERR(srb_log, "Error extending device %s", filename); - - return rc; -} - -int srb_device_destroy(const char *filename) -{ - srb_debug_t debug; - struct srb_cdmi_desc_s *cdmi_desc = NULL; - int rc = -EIO; - int i; - int found = 0; - - SRB_LOG_INFO(srb_log, "srb_device_destroy: destroying volume: %s", filename); - - debug.name = NULL; - debug.level = srb_log; - - // Check that there is no device associated to filename - spin_lock(&devtab_lock); - for (i = 0; i < DEV_MAX; ++i) { - if (!device_free_slot(&devtab[i])) { - const char *fname = kbasename( - devtab[i].thread_cdmi_desc[0]->filename); - if (strlen(fname) == strlen(filename) && strncmp(fname, filename, strlen(fname)) == 0) { - found = 1; - break; - } - } - } - spin_unlock(&devtab_lock); - - if (found) { - SRB_LOG_ERR(srb_log, "Found a device associated to volume %s", filename); - rc = -EBUSY; - goto err_out_mod; - } - - cdmi_desc = vmalloc(sizeof(struct srb_cdmi_desc_s)); - if (cdmi_desc == NULL) { - SRB_LOG_ERR(srb_log, "Unable to allocate memory for temporary CDMI"); - rc = -ENOMEM; - goto err_out_mod; - } - - /* First, setup a cdmi connection then Delete the file. */ - rc = _srb_server_pick(filename, cdmi_desc); - if (rc != 0) - goto err_out_alloc; - - rc = srb_cdmi_connect(&debug, cdmi_desc); - if (rc != 0) - goto err_out_alloc; - - rc = srb_cdmi_delete(&debug, cdmi_desc); - if (rc != 0) - goto err_out_cdmi; - - srb_cdmi_disconnect(&debug, cdmi_desc); - - if (cdmi_desc) - vfree(cdmi_desc); - - SRB_LOG_INFO(srb_log, "Destroyed volume %s", filename); - - return rc; - -err_out_cdmi: - srb_cdmi_disconnect(&debug, cdmi_desc); -err_out_alloc: - if (cdmi_desc) - vfree(cdmi_desc); -err_out_mod: - SRB_LOG_ERR(srb_log, "Error destroying volume %s", filename); - - return rc; -} - static int __init srb_init(void) { int rc; diff --git a/srb/srb-sysfs.c b/srb/srb-sysfs.c index 4b9c2cf..a8db854 100644 --- a/srb/srb-sysfs.c +++ b/srb/srb-sysfs.c @@ -56,44 +56,6 @@ static int parse_params(char *params, const char *delim, char **param_tbl, int p return j; } -static int human_to_bytes(char *size_str, unsigned long long *size) -{ - char h; - unsigned long long coef; - int ret; - - //printk(KERN_DEBUG "DEBUG: human_to_bytes: buff: %s\n", size_str); - - coef = 1; - h = size_str[strlen(size_str) - 1]; - /* get human format if any and set coeff */ - switch (h) { - case 'G': - coef = GB; - size_str[strlen(size_str) - 1] = '\0'; - break; - case 'M': - coef = MB; - size_str[strlen(size_str) - 1] = '\0'; - break; - case 'k': - coef = kB; - size_str[strlen(size_str) - 1] = '\0'; - break; - default: - coef = 1; - } - /* calculate size */ - ret = kstrtoull(size_str, 10, size); - if (ret != 0) { - SRB_LOG_ERR(srb_log, "Invalid volume size %s (%llu) (ret: %d)", size_str, *size, ret); - return -EINVAL; - } - *size = *size * coef; - - return 0; -} - /******************************************************************** * /sys/block/srb?/ * srb_debug Sets verbosity @@ -191,202 +153,6 @@ static void class_srb_release(struct class *cls) kfree(cls); } -static ssize_t class_srb_create_show(struct class *c, struct class_attribute *attr, - char *buf) -{ - return scnprintf(buf, PAGE_SIZE, "# Usage: echo 'VolumeName size(bytes)' > create\n"); -} - -static ssize_t class_srb_create_store(struct class *c, - struct class_attribute *attr, - const char *buf, size_t count) -{ - ssize_t ret = 0; - unsigned long long size = 0; - size_t len = 0; - char *size_str = NULL; - char *params[2]; - const char *delim = " "; - char *tmp_buf; - - SRB_LOG_INFO(srb_log, "Creating volume with params: %s (%lu)", buf, count); - - /* TODO: split the buff into two string array with a thread-safe function strtok_r - * - use a temporary buffer - * - properly end string - */ - tmp_buf = NULL; - if (count >= 256) { - SRB_LOG_ERR(srb_log, "Invalid parameter (too long: %lu)", count); - ret = -EINVAL; - goto out; - } - - tmp_buf = kmalloc(count + 1, GFP_KERNEL); - if (NULL == tmp_buf) { - SRB_LOG_ERR(srb_log, "Unable to allocate memory for parameters"); - ret = -ENOMEM; - goto out; - } - memset(tmp_buf, 0, count + 1); - memcpy(tmp_buf, buf, count); - - /* remove CR or LF if any and end string */ - if (tmp_buf[count - 1] == '\n' || tmp_buf[count - 1] == '\r') - tmp_buf[count - 1] = 0; - else - tmp_buf[count] = 0; - - parse_params(tmp_buf, delim, params, 2, count); - /* sanity check */ - len = strlen(params[0]); - if (len >= SRB_CDMI_URL_SIZE) { - SRB_LOG_ERR(srb_log, "Invalid volume name (too long: %lu)", len); - ret = -EINVAL; - goto out; - } - ret = human_to_bytes(params[1], &size); - if (ret != 0) { - SRB_LOG_ERR(srb_log, "Invalid volume size: %s", params[1]); - goto out; - } - - SRB_LOG_INFO(srb_log, "Creating volume %s of size %llu (bytes)", params[0], size); - - ret = srb_device_create(params[0], size); - if (ret != 0) { - SRB_LOG_ERR(srb_log, "Failed to create device: %lu", ret); - goto out; - } - - ret = count; - -out: - if (size_str != NULL) - kfree(size_str); - if (tmp_buf != NULL) - kfree(tmp_buf); - - return ret; -} - -static ssize_t class_srb_extend_show(struct class *c, struct class_attribute *attr, - char *buf) -{ - return scnprintf(buf, PAGE_SIZE, - "The new size must be greater than the current size.\n" - "# Usage: echo 'VolumeName size(bytes)' > extend\n"); -} - -static ssize_t class_srb_extend_store(struct class *c, - struct class_attribute *attr, - const char *buf, size_t count) -{ - ssize_t ret = 0; - //char filename[SRB_URL_SIZE + 1]; - //const char *tmp = buf; - unsigned long long size = 0; - size_t len = 0; - char *size_str = NULL; - char *params[2]; - const char *delim = " "; - char *tmp_buf; - - SRB_LOG_INFO(srb_log, "Extending volume with params: %s (%lu)", buf, count); - - tmp_buf = NULL; - if (count >= 256) { - SRB_LOG_ERR(srb_log, "Invalid parameter (too long: %lu)", count); - ret = -EINVAL; - goto out; - } - - tmp_buf = kmalloc(count, GFP_KERNEL); - if (NULL == tmp_buf) { - SRB_LOG_ERR(srb_log, "Unable to allocate memory for parameters"); - ret = -ENOMEM; - goto out; - } - memset(tmp_buf, 0, count); - memcpy(tmp_buf, buf, count); - - /* remove CR or LF if any and end string */ - if (tmp_buf[count - 1] == '\n' || tmp_buf[count - 1] == '\r') - tmp_buf[count - 1] = 0; - else - tmp_buf[count] = 0; - - parse_params(tmp_buf, delim, params, 2, count); - /* sanity check */ - len = strlen(params[0]); - if (len >= SRB_CDMI_URL_SIZE) { - SRB_LOG_ERR(srb_log, "Invalid volume name (too long: %lu)", len); - ret = -EINVAL; - goto out; - } - ret = human_to_bytes(params[1], &size); - if (ret != 0) { - SRB_LOG_ERR(srb_log, "Invalid volume size: %s", params[1]); - goto out; - } - - SRB_LOG_INFO(srb_log, "Extending volume %s of size %llu (bytes)", params[0], size); - - ret = srb_device_extend(params[0], size); - if (ret != 0) { - goto out; - } - - ret = count; - -out: - if (size_str != NULL) - kfree(size_str); - if (tmp_buf != NULL) - kfree(tmp_buf); - - return ret; -} - -static ssize_t class_srb_destroy_show(struct class *c, struct class_attribute *attr, - char *buf) -{ - return scnprintf(buf, PAGE_SIZE, "# Usage: echo VolumeName > destroy\n"); -} - -static ssize_t class_srb_destroy_store(struct class *c, - struct class_attribute *attr, - const char *buf, size_t count) -{ - ssize_t ret = 0; - char filename[SRB_CDMI_URL_SIZE + 1]; - - /* Sanity check URL size */ - if ((count == 0) || (count >= SRB_CDMI_URL_SIZE)) { - SRB_LOG_ERR(srb_log, "Invalid parameter (too long: %lu)", count); - ret = -EINVAL; - goto out; - } - - memset(filename, 0, count); - memcpy(filename, buf, count); - if (filename[count - 1] == '\n' || filename[count - 1] == '\r') - filename[count - 1] = 0; - else - filename[count] = 0; - - SRB_LOG_INFO(srb_log, "Destroying volume '%s'", filename); - ret = srb_device_destroy(filename); - if (ret != 0) { - goto out; - } - - ret = count; - -out: - return ret; -} - static ssize_t class_srb_attach_show(struct class *c, struct class_attribute *attr, char *buf) { @@ -624,17 +390,6 @@ static ssize_t class_srb_urls_show(struct class *c, struct class_attribute *attr return ret; } -static ssize_t class_srb_volumes_show(struct class *c, struct class_attribute *attr, - char *buf) -{ - ssize_t ret = 0; - - ret = srb_volumes_dump(buf, PAGE_SIZE); - - return ret; -} - - void srb_sysfs_device_init(srb_device_t *dev) { device_create_file(disk_to_dev(dev->disk), &dev_attr_srb_debug); @@ -646,13 +401,9 @@ void srb_sysfs_device_init(srb_device_t *dev) static struct class_attribute class_srb_attrs[] = { __ATTR(attach, 0600, class_srb_attach_show, class_srb_attach_store), __ATTR(detach, 0600, class_srb_detach_show, class_srb_detach_store), - __ATTR(create, 0600, class_srb_create_show, class_srb_create_store), - __ATTR(extend, 0600, class_srb_extend_show, class_srb_extend_store), - __ATTR(destroy, 0600, class_srb_destroy_show, class_srb_destroy_store), __ATTR(add_urls, 0600, class_srb_addurl_show, class_srb_addurl_store), __ATTR(remove_urls, 0600, class_srb_removeurl_show, class_srb_removeurl_store), __ATTR(urls, 0400, class_srb_urls_show, NULL), - __ATTR(volumes, 0400, class_srb_volumes_show, NULL), __ATTR_NULL }; diff --git a/srb/srb.h b/srb/srb.h index 0558a6d..7fd50e9 100644 --- a/srb/srb.h +++ b/srb/srb.h @@ -121,23 +121,16 @@ typedef struct srb_server_s { struct srb_cdmi_desc_s cdmi_desc; } srb_server_t; - /* srb.c */ -int srb_device_create(const char *filename, unsigned long long size); -int srb_device_extend(const char *filename, unsigned long long size); -int srb_device_destroy(const char *filename); - int srb_device_attach(const char *filename, const char *devname); int srb_device_detach(const char *devname); int srb_server_add(const char *url); int srb_server_remove(const char *url); ssize_t srb_servers_dump(char *buf, ssize_t max_size); -int srb_volumes_dump(char *buf, size_t max_size); /* srb_sysfs.c*/ int srb_sysfs_init(void); void srb_sysfs_device_init(srb_device_t *dev); void srb_sysfs_cleanup(void); - #endif From e2d6d76cf4991b6cbb27c82a19809251d497b224 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 15:46:37 +0100 Subject: [PATCH 06/28] Remove `srb-jsmn` Thanks to f34d45b we no longer need `jsmn` at all. --- Kbuild | 2 +- include/srb-jsmn/jsmn.h | 73 --- include/srb-jsmn/srb-jsmn.h | 32 -- srb-jsmn/.hg/00changelog.i | Bin 57 -> 0 bytes srb-jsmn/.hg/branch | 1 - srb-jsmn/.hg/cache/branchheads | 4 - srb-jsmn/.hg/cache/tags | 4 - srb-jsmn/.hg/dirstate | Bin 189 -> 0 bytes srb-jsmn/.hg/hgrc | 2 - srb-jsmn/.hg/requires | 4 - srb-jsmn/.hg/store/00changelog.i | Bin 16221 -> 0 bytes srb-jsmn/.hg/store/00manifest.i | Bin 14117 -> 0 bytes srb-jsmn/.hg/store/data/_l_i_c_e_n_s_e.i | Bin 693 -> 0 bytes srb-jsmn/.hg/store/data/_makefile.i | Bin 1683 -> 0 bytes srb-jsmn/.hg/store/data/_r_e_a_d_m_e.i | Bin 4776 -> 0 bytes srb-jsmn/.hg/store/data/_r_e_a_d_m_e.md.i | Bin 3502 -> 0 bytes srb-jsmn/.hg/store/data/demo.c.i | Bin 5011 -> 0 bytes srb-jsmn/.hg/store/data/jsmn.c.i | Bin 15706 -> 0 bytes srb-jsmn/.hg/store/data/jsmn.h.i | Bin 5420 -> 0 bytes srb-jsmn/.hg/store/data/jsmn__test.c.i | Bin 8428 -> 0 bytes srb-jsmn/.hg/store/data/test.sh.i | Bin 1520 -> 0 bytes srb-jsmn/.hg/store/fncache | 9 - srb-jsmn/.hg/store/undo | Bin 187 -> 0 bytes srb-jsmn/.hg/undo.bookmarks | 0 srb-jsmn/.hg/undo.branch | 1 - srb-jsmn/.hg/undo.desc | 3 - srb-jsmn/.hg/undo.dirstate | 0 srb-jsmn/Kbuild | 6 - srb-jsmn/LICENSE-jsmn | 20 - srb-jsmn/Makefile | 27 -- srb-jsmn/README-jsmn.md | 165 ------- srb-jsmn/jsmn.c | 282 ----------- srb-jsmn/jsmn_test.c | 556 ---------------------- srb-jsmn/srb-jsmn-exports.c | 38 -- srb/srb-cdmi.c | 1 - 35 files changed, 1 insertion(+), 1229 deletions(-) delete mode 100644 include/srb-jsmn/jsmn.h delete mode 100644 include/srb-jsmn/srb-jsmn.h delete mode 100644 srb-jsmn/.hg/00changelog.i delete mode 100644 srb-jsmn/.hg/branch delete mode 100644 srb-jsmn/.hg/cache/branchheads delete mode 100644 srb-jsmn/.hg/cache/tags delete mode 100644 srb-jsmn/.hg/dirstate delete mode 100644 srb-jsmn/.hg/hgrc delete mode 100644 srb-jsmn/.hg/requires delete mode 100644 srb-jsmn/.hg/store/00changelog.i delete mode 100644 srb-jsmn/.hg/store/00manifest.i delete mode 100644 srb-jsmn/.hg/store/data/_l_i_c_e_n_s_e.i delete mode 100644 srb-jsmn/.hg/store/data/_makefile.i delete mode 100644 srb-jsmn/.hg/store/data/_r_e_a_d_m_e.i delete mode 100644 srb-jsmn/.hg/store/data/_r_e_a_d_m_e.md.i delete mode 100644 srb-jsmn/.hg/store/data/demo.c.i delete mode 100644 srb-jsmn/.hg/store/data/jsmn.c.i delete mode 100644 srb-jsmn/.hg/store/data/jsmn.h.i delete mode 100644 srb-jsmn/.hg/store/data/jsmn__test.c.i delete mode 100644 srb-jsmn/.hg/store/data/test.sh.i delete mode 100644 srb-jsmn/.hg/store/fncache delete mode 100644 srb-jsmn/.hg/store/undo delete mode 100644 srb-jsmn/.hg/undo.bookmarks delete mode 100644 srb-jsmn/.hg/undo.branch delete mode 100644 srb-jsmn/.hg/undo.desc delete mode 100644 srb-jsmn/.hg/undo.dirstate delete mode 100644 srb-jsmn/Kbuild delete mode 100644 srb-jsmn/LICENSE-jsmn delete mode 100644 srb-jsmn/Makefile delete mode 100644 srb-jsmn/README-jsmn.md delete mode 100644 srb-jsmn/jsmn.c delete mode 100644 srb-jsmn/jsmn_test.c delete mode 100644 srb-jsmn/srb-jsmn-exports.c diff --git a/Kbuild b/Kbuild index 25c0a0f..47aff43 100644 --- a/Kbuild +++ b/Kbuild @@ -1 +1 @@ -obj-y := srb-jsmn/ srb/ +obj-y := srb/ diff --git a/include/srb-jsmn/jsmn.h b/include/srb-jsmn/jsmn.h deleted file mode 100644 index c8f388c..0000000 --- a/include/srb-jsmn/jsmn.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef __JSMN_H_ -#define __JSMN_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * JSON type identifier. Basic types are: - * o Object - * o Array - * o String - * o Other primitive: number, boolean (true/false) or null - */ -typedef enum { - JSMN_PRIMITIVE = 0, - JSMN_OBJECT = 1, - JSMN_ARRAY = 2, - JSMN_STRING = 3 -} jsmntype_t; - -typedef enum { - /* Not enough tokens were provided */ - JSMN_ERROR_NOMEM = -1, - /* Invalid character inside JSON string */ - JSMN_ERROR_INVAL = -2, - /* The string is not a full JSON packet, more bytes expected */ - JSMN_ERROR_PART = -3, -} jsmnerr_t; - -/** - * JSON token description. - * @param type type (object, array, string etc.) - * @param start start position in JSON data string - * @param end end position in JSON data string - */ -typedef struct { - jsmntype_t type; - int start; - int end; - int size; -#ifdef JSMN_PARENT_LINKS - int parent; -#endif -} jsmntok_t; - -/** - * JSON parser. Contains an array of token blocks available. Also stores - * the string being parsed now and current position in that string - */ -typedef struct { - unsigned int pos; /* offset in the JSON string */ - unsigned int toknext; /* next token to allocate */ - int toksuper; /* superior token node, e.g parent object or array */ -} jsmn_parser; - -/** - * Create JSON parser over an array of tokens - */ -void jsmn_init(jsmn_parser *parser); - -/** - * Run JSON parser. It parses a JSON data string into and array of tokens, each describing - * a single JSON object. - */ -jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len, - jsmntok_t *tokens, unsigned int num_tokens); - -#ifdef __cplusplus -} -#endif - -#endif /* __JSMN_H_ */ diff --git a/include/srb-jsmn/srb-jsmn.h b/include/srb-jsmn/srb-jsmn.h deleted file mode 100644 index 13be9dc..0000000 --- a/include/srb-jsmn/srb-jsmn.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2015 Scality SA - http://www.scality.com - * - * This file is part of ScalityRestBlock. - * - * ScalityRestBlock 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, either version 3 of the License, or - * (at your option) any later version. - * - * ScalityRestBlock 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 ScalityRestBlock. If not, see . - */ - -#ifndef _SRB_JSMN_H -#define _SRB_JSMN_H - -#define _REENTRANT -#define JSMN_PARENT_LINKS - -#include "jsmn.h" - -void srb_jsmn_init(jsmn_parser *parser); -jsmnerr_t srb_jsmn_parse(jsmn_parser *parser, const char *js, size_t len, - jsmntok_t *tokens, unsigned int num_tokens); - -#endif /* _SRB_JSMN_H */ diff --git a/srb-jsmn/.hg/00changelog.i b/srb-jsmn/.hg/00changelog.i deleted file mode 100644 index d3a8311050e54c57c5be7cfe169e60a95768812c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 zcmWN_K?=Yi3Fnwk?20bV;hUJ9nwFW9 riY~#ORh*j_Uy@o}qL+*=#|Dzq%Rm?A403gJ@paY9O+lA|Xh;SC=ZQ^U diff --git a/srb-jsmn/.hg/hgrc b/srb-jsmn/.hg/hgrc deleted file mode 100644 index 2290de1..0000000 --- a/srb-jsmn/.hg/hgrc +++ /dev/null @@ -1,2 +0,0 @@ -[paths] -default = https://bitbucket.org/zserge/jsmn diff --git a/srb-jsmn/.hg/requires b/srb-jsmn/.hg/requires deleted file mode 100644 index c1674f2..0000000 --- a/srb-jsmn/.hg/requires +++ /dev/null @@ -1,4 +0,0 @@ -revlogv1 -fncache -store -dotencode diff --git a/srb-jsmn/.hg/store/00changelog.i b/srb-jsmn/.hg/store/00changelog.i deleted file mode 100644 index 88c29358f3bccf3f45e30eab73966c0363f76e91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16221 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 Zeh<%IQNP5o%s)N7wt*J;I#FQl{{bV#%|ZYG diff --git a/srb-jsmn/.hg/store/00manifest.i b/srb-jsmn/.hg/store/00manifest.i deleted file mode 100644 index 88753bad974afc283810becc19027e3e3ddb539e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14117 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 diff --git a/srb-jsmn/.hg/store/data/_r_e_a_d_m_e.md.i b/srb-jsmn/.hg/store/data/_r_e_a_d_m_e.md.i deleted file mode 100644 index c4f7753e7c8e2793671e7a883355ef43e1e5329b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3502 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 Ot0yd6fCX`A@_zv3EKw~0 diff --git a/srb-jsmn/.hg/store/data/jsmn.c.i b/srb-jsmn/.hg/store/data/jsmn.c.i deleted file mode 100644 index 77ee22892ba443b168d4733d74882b7c105f08bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15706 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 diff --git a/srb-jsmn/.hg/store/data/jsmn.h.i b/srb-jsmn/.hg/store/data/jsmn.h.i deleted file mode 100644 index 0bcc56c1f49d2863c6cd3b745358742c0abce101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5420 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 diff --git a/srb-jsmn/.hg/store/data/jsmn__test.c.i b/srb-jsmn/.hg/store/data/jsmn__test.c.i deleted file mode 100644 index e07c7ab2448eb58bb6e6a38ccab3f83ab841100d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8428 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�A7H;8Fy#p3md49RDBfCZPJ6Q&VS0016m z*bFLi(18PE#fZGMxqXT^_xR}lIYH3;`BN?B>U+ch%M8H>M{JJRYx;h+d z3jR)e-iC!Oe$kaaw=c5nNV}BCGO{dq=)cl@xjFQPK!%e*W;*gl^v;rT-6Pn?$$K`} zd~pMzYEr->6U^{h8)7R_+HhO%Uq#w+tE!b%uDp;PN-3V`BznU?fHT*a5}$I8x_S#hxEC>h-n*xvq}(?nCVRIz|BmbXC=A-@P8AJ$-*mtA7Ym zt2KIwT<-y&E!{o`rXgJIIwe-U2WYO6WnM9%9IaP{W{g8WiZiV9zeIsvGbE-92iaud z@_J$iZ@L5U1kX|Esx-wV57;l}g$dj+ZabD14Sv)B&3?4Rj0!Hxqg}LYB*n(Q^nMrR zk|kY=>%-V|I}3_AdF}O?q*eCX4rhVu3*~i|4?N;VUbhg^}*RetV2wGdvVz`Ax`e%qC^xd7?CW{GB5wGOt7m!aDlZmH zwb*)5kl2w-T@*D2Quk{?JnhV-9A$~f8nc$B8RkG;LzUK#&h%e6l8{q~l0PVnni$Hf z9((CI*eo$|j9iY}&V7SD zb1NK7Btz+CLsU2p45rz&s}NEwTPn`TtFL`Lk@)0@ds__&w#OJ|JL!I0<0TP?f)akp zTNZg_Eo8kd3i)0wyVZgANeydrqMTRK32}0R@Zp6BzbKGG&{`xSA7NR|X=G0Jr{?l` zdHLYXF6&xlD(H-+3ti9b(bZ7Trcz@0#mV^bub^&o6ESAlH!<%Jc--GWz#{{a|%}w&lAn7uAu_IRQ#xG8~N$tW;G_UD_@# zM|pj2MQe$bn>J0~(<`-;;4E3W-??o6MB#MV%^MMq3+3bU*^46hrFNuF@2Mq1$UX?B zw3PIew=A~(9%O`I+;*AcXQ|pJDHQGfbR$JF0Lux8^ZUGY$alI#OY2gf#412>fzmgiJIp$F2th+hYaQ0-7DsOC@Iq zBEcF0%5Om3*X35P8U<^5r}u?`gbgUT-i*F$L2T{81SqQ^LbP;U!8&;Gbio6k5R@{& zQV|GiOD2zwYxAB=l+;$%7av+PmyUn$%V|^lm>p|rs8vps4YB~qaPXH z-5HF${}h;7l+LoFux%LAv|UO;?L3a?HT*Hd#)AE_J;fj=J7wnnh+AV;mk5hDs|Ufn zt221F>YTFkgE=%v?(fO0?=V3qHxwuXM|fAtoSi;gvXpy3KLyTC)qpTI(4G{T1l;8Y z?{8l+{9frz+C#dUZFht8I0fb8Nl|_kp>qw<#_BgQ^<|;X+N~VB0_A^fG#st@MfN7s z(@JosE!=w7yxxGVG5(F&HFz8CYHmySn;)QeIH~T(orqAe#Krz?KPge#zvUP_+T76U zWGS{6B$u|*qFJEHANt2+Iy3!|qPOXQsCh0o883O(Sw|K#>Yl~Yn{uO>Vl!Dm{#wMV!lu&W6;KytEicfOcarftmWrPyuTp(-*~)8cO?Ro!tB^CF0OUS6l&Wb*LD%02ye!kO_WA|tg)ZPUVk=;hV?_9s4m zF7|1W*_P{yT1UZ~&4^9jN9!pP14&>}kw3Yg89f%97#=XaB1+OjQZp>R5Qch^$9~Ug zwtJ;B>N)f#NXN#{HIJ-d|FbWbSwr`|=d{E5wBhSVoY00h*RV`MvH!n(@qaT6>|p=Y zs1O0HVhMPovECNBQ+dYJ?dRKir~eQAKl}gry*l(eJm|oe!Zo<_h5VbyVmB%dc3)oh NL}LEmRoBzc{|_wo diff --git a/srb-jsmn/.hg/store/data/test.sh.i b/srb-jsmn/.hg/store/data/test.sh.i deleted file mode 100644 index 7b9031c6238e3994a75727dfbf3563a226271bed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1520 zcmZQzWME_f17-mR2KLJkHiPJYD0mlZTU6cmY1;~ysk+sg)j~d5dL~dcV5(wHZK$vR zV*>%(>-&=orrye$J>}EJc0HMhz$LM7nSunxyCzKDapl3Ssc$!I(D`3`yim%~!=iMO z`TMhHq>tadC#CAtE0i|9C1-N(jwja|eS0IU1;n=OO!oToRMO+)frGlOa}&fG*uJ|T zRyJ-@ofQ2dUgmt-W#I&^=F5-e_b*dtj>wv+$eMY}kdu|);pyrY=?mNu#@Ur-Q3jpA z__%Ke&9Yxx`RW&Q#1pMjC+&#h%@@*A8yiJm`F&EdZwpS`a6f3~%-uCdr+&V*FX!kn z$3LH!MF->@tzE8qK6%=5sp#WA%TE2eaYcEuWxwJXGp^#POPCJj99E1^Ka;-s&P&l^ zrPLrh@w|W6Zp0c&daRY_5>{V&VE@_tNIs2kCwcoH?>O}8K?B(v>p1SMo4=?8@ z3453WnRc_sD?0tPK73t3_OQgR@(I5Dmb5A@3J;xt*XAc`GGT+e#9->x+iHFyKQ>Wz3S)YybG2XF!oR4 z%3Sa`aNC~i4(9XX7Vy?Aj9JiM{{0(&)>GyeFIjIn#Cx38YW%VI5F5W#;pUE0sg}+C zSzM|wSZi)LY(K~HZIbuO>@N&eX1WQ#+#dYhm6quIbf3`N)jczxn@j(Gano;gy!HG@ z*{z=!sVy?Un6sjA?jA>G+dQEaGP73ioT*;S{`pS+mbYi`iCud4O>**$;t#*h zZa>g-eYYHcd3*KYzYh=k`brh9|E;!g;d(EY4|{kU-(5~DENVNdens!*oO^K#d|xgr zeewCpJ?<;Zubs4gwKu>`-DKf<(@2+>OPHi@9c&3cnA#?FG_v-5y`t={3%erRo3bSz zeQpcfqhm2;Pw=tZ{Vm!b7X6rgMB5-{(v&NC#|qe|t>^s7Kby_650oiDISB|V85lU? z!7K&_F%S*PQaks~I`r|C$w6<<<2tDooTgD{-?c;4fT@Z($q5PbPcj_iv0W+3y7Htd z*Q?B*KVNaZ^6Yed#bsv36?gDo-N$uxdNEgH=6E@1sKinO(xvIgYNX$vw@+Q=w|W6xiWH zNeKyEsR;=mp6Yn%ZVbJ6;qrN{b7#B#JCT3>xTXX)H-+{{&W_$j8ONnd z{`{G<;fNB@=dF_#T?)}-2=JD10J(vM1MHFzpz~wFECvQ?Ak74Fe%8(pVg@gkdst0O zG*oN2D0f(J@?@wQD8(cMR0@hO56+_05?d7wJ^hr_+GbCBU3X4U4f^HsAphh9Nv_wHSS;5d$SCb25FiQ;Bcw{%p0!5fX qZu%PYz|OuGJ>B~oSTQi&p?%rF9A6ONfVe~3{eFDkP0|P diff --git a/srb-jsmn/.hg/undo.bookmarks b/srb-jsmn/.hg/undo.bookmarks deleted file mode 100644 index e69de29..0000000 diff --git a/srb-jsmn/.hg/undo.branch b/srb-jsmn/.hg/undo.branch deleted file mode 100644 index 331d858..0000000 --- a/srb-jsmn/.hg/undo.branch +++ /dev/null @@ -1 +0,0 @@ -default \ No newline at end of file diff --git a/srb-jsmn/.hg/undo.desc b/srb-jsmn/.hg/undo.desc deleted file mode 100644 index 561861e..0000000 --- a/srb-jsmn/.hg/undo.desc +++ /dev/null @@ -1,3 +0,0 @@ -0 -pull -https://bitbucket.org/zserge/jsmn diff --git a/srb-jsmn/.hg/undo.dirstate b/srb-jsmn/.hg/undo.dirstate deleted file mode 100644 index e69de29..0000000 diff --git a/srb-jsmn/Kbuild b/srb-jsmn/Kbuild deleted file mode 100644 index e85372f..0000000 --- a/srb-jsmn/Kbuild +++ /dev/null @@ -1,6 +0,0 @@ -obj-m := srb-jsmn.o - -srb-jsmn-y := srb-jsmn-exports.o jsmn.o - -EXTRA_CFLAGS := -ggdb3 -Wall -Wextra -Werror -Wno-unused-parameter -I$(src)/../include -I$(src)/../include/srb-jsmn -CFLAGS_jsmn.o := -D_REENTRANT -DJSMN_PARENT_LINKS diff --git a/srb-jsmn/LICENSE-jsmn b/srb-jsmn/LICENSE-jsmn deleted file mode 100644 index c84fb2e..0000000 --- a/srb-jsmn/LICENSE-jsmn +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2010 Serge A. Zaitsev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/srb-jsmn/Makefile b/srb-jsmn/Makefile deleted file mode 100644 index ac947a3..0000000 --- a/srb-jsmn/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -# You can put your build options here --include config.mk - -all: libjsmn.a - -libjsmn.a: jsmn.o - $(AR) rc $@ $^ - -%.o: %.c jsmn.h - $(CC) -c $(CFLAGS) $< -o $@ - -test: jsmn_test - ./jsmn_test - -jsmn_test: jsmn_test.o - $(CC) -L. -ljsmn $< -o $@ - -jsmn_test.o: jsmn_test.c libjsmn.a - -clean: - rm -f jsmn.o jsmn_test.o - rm -f jsmn_test - rm -f jsmn_test.exe - rm -f libjsmn.a - -.PHONY: all clean test - diff --git a/srb-jsmn/README-jsmn.md b/srb-jsmn/README-jsmn.md deleted file mode 100644 index a282407..0000000 --- a/srb-jsmn/README-jsmn.md +++ /dev/null @@ -1,165 +0,0 @@ - -JSMN -==== - -jsmn (pronounced like 'jasmine') is a minimalistic JSON parser in C. It can be -easily integrated into resource-limited or embedded projects. - -You can find more information about JSON format at [json.org][1] - -Library sources are available at [bitbucket.org/zserge/jsmn][2] - -The web page with some information about jsmn can be found at -[http://zserge.com/jsmn.html][3] - -Philosophy ----------- - -Most JSON parsers offer you a bunch of functions to load JSON data, parse it -and extract any value by its name. jsmn proves that checking the correctness of -every JSON packet or allocating temporary objects to store parsed JSON fields -often is an overkill. - -JSON format itself is extremely simple, so why should we complicate it? - -jsmn is designed to be **robust** (it should work fine even with erroneous -data), **fast** (it should parse data on the fly), **portable** (no superfluous -dependencies or non-standard C extensions). An of course, **simplicity** is a -key feature - simple code style, simple algorithm, simple integration into -other projects. - -Features --------- - -* compatible with C89 -* no dependencies (even libc!) -* highly portable (tested on x86/amd64, ARM, AVR) -* about 200 lines of code -* extremely small code footprint -* API contains only 2 functions -* no dynamic memory allocation -* incremental single-pass parsing -* library code is covered with unit-tests - -Design ------- - -The rudimentary jsmn object is a **token**. Let's consider a JSON string: - - '{ "name" : "Jack", "age" : 27 }' - -It holds the following tokens: - -* Object: `{ "name" : "Jack", "age" : 27}` (the whole object) -* Strings: `"name"`, `"Jack"`, `"age"` (keys and some values) -* Number: `27` - -In jsmn, tokens do not hold any data, but point to token boundaries in JSON -string instead. In the example above jsmn will create tokens like: Object -[0..31], String [3..7], String [12..16], String [20..23], Number [27..29]. - -Every jsmn token has a type, which indicates the type of corresponding JSON -token. jsmn supports the following token types: - -* Object - a container of key-value pairs, e.g.: - `{ "foo":"bar", "x":0.3 }` -* Array - a sequence of values, e.g.: - `[ 1, 2, 3 ]` -* String - a quoted sequence of chars, e.g.: `"foo"` -* Primitive - a number, a boolean (`true`, `false`) or `null` - -Besides start/end positions, jsmn tokens for complex types (like arrays -or objects) also contain a number of child items, so you can easily follow -object hierarchy. - -This approach provides enough information for parsing any JSON data and makes -it possible to use zero-copy techniques. - -Install -------- - -To clone the repository you should have mercurial installed. Just run: - - $ hg clone http://bitbucket.org/zserge/jsmn jsmn - -Repository layout is simple: jsmn.c and jsmn.h are library files, tests are in -the jsmn\_test.c, you will also find README, LICENSE and Makefile files inside. - -To build the library, run `make`. It is also recommended to run `make test`. -Let me know, if some tests fail. - -If build was successful, you should get a `libjsmn.a` library. -The header file you should include is called `"jsmn.h"`. - -API ---- - -Token types are described by `jsmntype_t`: - - typedef enum { - JSMN_PRIMITIVE = 0, - JSMN_OBJECT = 1, - JSMN_ARRAY = 2, - JSMN_STRING = 3 - } jsmntype_t; - -**Note:** Unlike JSON data types, primitive tokens are not divided into -numbers, booleans and null, because one can easily tell the type using the -first character: - -* 't', 'f' - boolean -* 'n' - null -* '-', '0'..'9' - number - -Token is an object of `jsmntok_t` type: - - typedef struct { - jsmntype_t type; // Token type - int start; // Token start position - int end; // Token end position - int size; // Number of child (nested) tokens - } jsmntok_t; - -**Note:** string tokens point to the first character after -the opening quote and the previous symbol before final quote. This was made -to simplify string extraction from JSON data. - -All job is done by `jsmn_parser` object. You can initialize a new parser using: - - struct jsmn_parser parser; - jsmntok_t tokens[10]; - - // js - pointer to JSON string - // tokens - an array of tokens available - // 10 - number of tokens available - jsmn_init_parser(&parser, js, tokens, 10); - -This will create a parser, that can parse up to 10 JSON tokens from `js` string. - -Later, you can use `jsmn_parse(&parser)` function to process JSON string with the parser. - -A non-negative value is the number of tokens actually used by the parser. -Passing NULL instead of the tokens array would not store parsing results, but -instead the function will return the value of tokens needed to parse the given -string. This can be useful if you don't know yet how many tokens to allocate. - -If something goes wrong, you will get an error. Error will be one of these: - -* `JSMN_ERROR_INVAL` - bad token, JSON string is corrupted -* `JSMN_ERROR_NOMEM` - not enough tokens, JSON string is too large -* `JSMN_ERROR_PART` - JSON string is too short, expecting more JSON data - -If you get `JSON_ERROR_NOMEM`, you can re-allocate more tokens and call -`jsmn_parse` once more. If you read json data from the stream, you can -periodically call `jsmn_parse` and check if return value is `JSON_ERROR_PART`. -You will get this error until you reach the end of JSON data. - -Other info ----------- - -This software is distributed under [MIT license](http://www.opensource.org/licenses/mit-license.php), - so feel free to integrate it in your commercial products. - -[1]: http://www.json.org/ -[2]: https://bitbucket.org/zserge/jsmn/wiki/Home -[3]: http://zserge.com/jsmn.html diff --git a/srb-jsmn/jsmn.c b/srb-jsmn/jsmn.c deleted file mode 100644 index c10d40c..0000000 --- a/srb-jsmn/jsmn.c +++ /dev/null @@ -1,282 +0,0 @@ -#include - -#include "jsmn.h" - -/** - * Allocates a fresh unused token from the token pull. - */ -static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, - jsmntok_t *tokens, size_t num_tokens) { - jsmntok_t *tok; - if (parser->toknext >= num_tokens) { - return NULL; - } - tok = &tokens[parser->toknext++]; - tok->start = tok->end = -1; - tok->size = 0; -#ifdef JSMN_PARENT_LINKS - tok->parent = -1; -#endif - return tok; -} - -/** - * Fills token type and boundaries. - */ -static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, - int start, int end) { - token->type = type; - token->start = start; - token->end = end; - token->size = 0; -} - -/** - * Fills next available token with JSON primitive. - */ -static jsmnerr_t jsmn_parse_primitive(jsmn_parser *parser, const char *js, - size_t len, jsmntok_t *tokens, size_t num_tokens) { - jsmntok_t *token; - int start; - - start = parser->pos; - - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { - switch (js[parser->pos]) { -#ifndef JSMN_STRICT - /* In strict mode primitive must be followed by "," or "}" or "]" */ - case ':': -#endif - case '\t' : case '\r' : case '\n' : case ' ' : - case ',' : case ']' : case '}' : - goto found; - } - if (js[parser->pos] < 32 || js[parser->pos] >= 127) { - parser->pos = start; - return JSMN_ERROR_INVAL; - } - } -#ifdef JSMN_STRICT - /* In strict mode primitive must be followed by a comma/object/array */ - parser->pos = start; - return JSMN_ERROR_PART; -#endif - -found: - if (tokens == NULL) { - parser->pos--; - return 0; - } - token = jsmn_alloc_token(parser, tokens, num_tokens); - if (token == NULL) { - parser->pos = start; - return JSMN_ERROR_NOMEM; - } - jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); -#ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; -#endif - parser->pos--; - return 0; -} - -/** - * Filsl next token with JSON string. - */ -static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js, - size_t len, jsmntok_t *tokens, size_t num_tokens) { - jsmntok_t *token; - - int start = parser->pos; - int i = 0; - - parser->pos++; - - /* Skip starting quote */ - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { - char c = js[parser->pos]; - - /* Quote: end of string */ - if (c == '\"') { - if (tokens == NULL) { - return 0; - } - token = jsmn_alloc_token(parser, tokens, num_tokens); - if (token == NULL) { - parser->pos = start; - return JSMN_ERROR_NOMEM; - } - jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos); -#ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; -#endif - return 0; - } - - /* Backslash: Quoted symbol expected */ - if (c == '\\') { - parser->pos++; - switch (js[parser->pos]) { - /* Allowed escaped symbols */ - case '\"': case '/' : case '\\' : case 'b' : - case 'f' : case 'r' : case 'n' : case 't' : - break; - /* Allows escaped symbol \uXXXX */ - case 'u': - parser->pos++; - for(; i < 4 && js[parser->pos] != '\0'; i++) { - /* If it isn't a hex character we have an error */ - if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ - (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ - (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ - parser->pos = start; - return JSMN_ERROR_INVAL; - } - parser->pos++; - } - parser->pos--; - break; - /* Unexpected symbol */ - default: - parser->pos = start; - return JSMN_ERROR_INVAL; - } - } - } - parser->pos = start; - return JSMN_ERROR_PART; -} - -/** - * Parse JSON string and fill tokens. - */ -jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len, - jsmntok_t *tokens, unsigned int num_tokens) { - jsmnerr_t r; - int i; - jsmntok_t *token; - int count = 0; - - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { - char c; - jsmntype_t type; - - c = js[parser->pos]; - switch (c) { - case '{': case '[': - count++; - if (tokens == NULL) { - break; - } - token = jsmn_alloc_token(parser, tokens, num_tokens); - if (token == NULL) - return JSMN_ERROR_NOMEM; - if (parser->toksuper != -1) { - tokens[parser->toksuper].size++; -#ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; -#endif - } - token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); - token->start = parser->pos; - parser->toksuper = parser->toknext - 1; - break; - case '}': case ']': - if (tokens == NULL) - break; - type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); -#ifdef JSMN_PARENT_LINKS - if (parser->toknext < 1) { - return JSMN_ERROR_INVAL; - } - token = &tokens[parser->toknext - 1]; - for (;;) { - if (token->start != -1 && token->end == -1) { - if (token->type != type) { - return JSMN_ERROR_INVAL; - } - token->end = parser->pos + 1; - parser->toksuper = token->parent; - break; - } - if (token->parent == -1) { - break; - } - token = &tokens[token->parent]; - } -#else - for (i = parser->toknext - 1; i >= 0; i--) { - token = &tokens[i]; - if (token->start != -1 && token->end == -1) { - if (token->type != type) { - return JSMN_ERROR_INVAL; - } - parser->toksuper = -1; - token->end = parser->pos + 1; - break; - } - } - /* Error if unmatched closing bracket */ - if (i == -1) return JSMN_ERROR_INVAL; - for (; i >= 0; i--) { - token = &tokens[i]; - if (token->start != -1 && token->end == -1) { - parser->toksuper = i; - break; - } - } -#endif - break; - case '\"': - r = jsmn_parse_string(parser, js, len, tokens, num_tokens); - if (r < 0) return r; - count++; - if (parser->toksuper != -1 && tokens != NULL) - tokens[parser->toksuper].size++; - break; - case '\t' : case '\r' : case '\n' : case ':' : case ',': case ' ': - break; -#ifdef JSMN_STRICT - /* In strict mode primitives are: numbers and booleans */ - case '-': case '0': case '1' : case '2': case '3' : case '4': - case '5': case '6': case '7' : case '8': case '9': - case 't': case 'f': case 'n' : -#else - /* In non-strict mode every unquoted value is a primitive */ - default: -#endif - r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); - if (r < 0) return r; - count++; - if (parser->toksuper != -1 && tokens != NULL) - tokens[parser->toksuper].size++; - break; - -#ifdef JSMN_STRICT - /* Unexpected char in strict mode */ - default: - return JSMN_ERROR_INVAL; -#endif - } - } - - for (i = parser->toknext - 1; i >= 0; i--) { - /* Unmatched opened object or array */ - if (tokens[i].start != -1 && tokens[i].end == -1) { - return JSMN_ERROR_PART; - } - } - - return count; -} - -/** - * Creates a new parser based over a given buffer with an array of tokens - * available. - */ -void jsmn_init(jsmn_parser *parser) { - parser->pos = 0; - parser->toknext = 0; - parser->toksuper = -1; -} - diff --git a/srb-jsmn/jsmn_test.c b/srb-jsmn/jsmn_test.c deleted file mode 100644 index c5bfc03..0000000 --- a/srb-jsmn/jsmn_test.c +++ /dev/null @@ -1,556 +0,0 @@ -#include -#include -#include - -static int test_passed = 0; -static int test_failed = 0; - -/* Terminate current test with error */ -#define fail() return __LINE__ - -/* Successfull end of the test case */ -#define done() return 0 - -/* Check single condition */ -#define check(cond) do { if (!(cond)) fail(); } while (0) - -/* Test runner */ -static void test(int (*func)(void), const char *name) { - int r = func(); - if (r == 0) { - test_passed++; - } else { - test_failed++; - printf("FAILED: %s (at line %d)\n", name, r); - } -} - -#define TOKEN_EQ(t, tok_start, tok_end, tok_type) \ - ((t).start == tok_start \ - && (t).end == tok_end \ - && (t).type == (tok_type)) - -#define TOKEN_STRING(js, t, s) \ - (strncmp(js+(t).start, s, (t).end - (t).start) == 0 \ - && strlen(s) == (t).end - (t).start) - -#define TOKEN_PRINT(t) \ - printf("start: %d, end: %d, type: %d, size: %d\n", \ - (t).start, (t).end, (t).type, (t).size) - -#define JSMN_STRICT -#include "jsmn.c" - -int test_empty() { - const char *js; - int r; - jsmn_parser p; - jsmntok_t t[10]; - - js = "{}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), t, 10); - check(r >= 0); - check(t[0].type == JSMN_OBJECT); - check(t[0].start == 0 && t[0].end == 2); - - js = "[]"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), t, 10); - check(r >= 0); - check(t[0].type == JSMN_ARRAY); - check(t[0].start == 0 && t[0].end == 2); - - js = "{\"a\":[]}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), t, 10); - check(r >= 0); - check(t[0].type == JSMN_OBJECT && t[0].start == 0 && t[0].end == 8); - check(t[1].type == JSMN_STRING && t[1].start == 2 && t[1].end == 3); - check(t[2].type == JSMN_ARRAY && t[2].start == 5 && t[2].end == 7); - - js = "[{},{}]"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), t, 10); - check(r >= 0); - check(t[0].type == JSMN_ARRAY && t[0].start == 0 && t[0].end == 7); - check(t[1].type == JSMN_OBJECT && t[1].start == 1 && t[1].end == 3); - check(t[2].type == JSMN_OBJECT && t[2].start == 4 && t[2].end == 6); - return 0; -} - -int test_simple() { - const char *js; - int r; - jsmn_parser p; - jsmntok_t tokens[10]; - - js = "{\"a\": 0}"; - - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - check(TOKEN_EQ(tokens[0], 0, 8, JSMN_OBJECT)); - check(TOKEN_EQ(tokens[1], 2, 3, JSMN_STRING)); - check(TOKEN_EQ(tokens[2], 6, 7, JSMN_PRIMITIVE)); - - check(TOKEN_STRING(js, tokens[0], js)); - check(TOKEN_STRING(js, tokens[1], "a")); - check(TOKEN_STRING(js, tokens[2], "0")); - - jsmn_init(&p); - js = "[\"a\":{},\"b\":{}]"; - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - - jsmn_init(&p); - js = "{\n \"Day\": 26,\n \"Month\": 9,\n \"Year\": 12\n }"; - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - - return 0; -} - -int test_primitive() { - int r; - jsmn_parser p; - jsmntok_t tok[10]; - const char *js; -#ifndef JSMN_STRICT - js = "\"boolVar\" : true"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_PRIMITIVE); - check(TOKEN_STRING(js, tok[0], "boolVar")); - check(TOKEN_STRING(js, tok[1], "true")); - - js = "\"boolVar\" : false"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_PRIMITIVE); - check(TOKEN_STRING(js, tok[0], "boolVar")); - check(TOKEN_STRING(js, tok[1], "false")); - - js = "\"intVar\" : 12345"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_PRIMITIVE); - check(TOKEN_STRING(js, tok[0], "intVar")); - check(TOKEN_STRING(js, tok[1], "12345")); - - js = "\"floatVar\" : 12.345"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_PRIMITIVE); - check(TOKEN_STRING(js, tok[0], "floatVar")); - check(TOKEN_STRING(js, tok[1], "12.345")); - - js = "\"nullVar\" : null"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_PRIMITIVE); - check(TOKEN_STRING(js, tok[0], "nullVar")); - check(TOKEN_STRING(js, tok[1], "null")); -#endif - return 0; -} - -int test_string() { - int r; - jsmn_parser p; - jsmntok_t tok[10]; - const char *js; - - js = "\"strVar\" : \"hello world\""; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_STRING); - check(TOKEN_STRING(js, tok[0], "strVar")); - check(TOKEN_STRING(js, tok[1], "hello world")); - - js = "\"strVar\" : \"escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\\""; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_STRING); - check(TOKEN_STRING(js, tok[0], "strVar")); - check(TOKEN_STRING(js, tok[1], "escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\")); - - js = "\"strVar\" : \"\""; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_STRING); - check(TOKEN_STRING(js, tok[0], "strVar")); - check(TOKEN_STRING(js, tok[1], "")); - - return 0; -} - -int test_partial_string() { - int r; - jsmn_parser p; - jsmntok_t tok[10]; - const char *js; - - jsmn_init(&p); - js = "\"x\": \"va"; - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r == JSMN_ERROR_PART && tok[0].type == JSMN_STRING); - check(TOKEN_STRING(js, tok[0], "x")); - check(p.toknext == 1); - - js = "\"x\": \"valu"; - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r == JSMN_ERROR_PART && tok[0].type == JSMN_STRING); - check(TOKEN_STRING(js, tok[0], "x")); - check(p.toknext == 1); - - js = "\"x\": \"value\""; - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_STRING); - check(TOKEN_STRING(js, tok[0], "x")); - check(TOKEN_STRING(js, tok[1], "value")); - - js = "\"x\": \"value\", \"y\": \"value y\""; - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_STRING - && tok[1].type == JSMN_STRING && tok[2].type == JSMN_STRING - && tok[3].type == JSMN_STRING); - check(TOKEN_STRING(js, tok[0], "x")); - check(TOKEN_STRING(js, tok[1], "value")); - check(TOKEN_STRING(js, tok[2], "y")); - check(TOKEN_STRING(js, tok[3], "value y")); - - return 0; -} - -int test_unquoted_keys() { -#ifndef JSMN_STRICT - int r; - jsmn_parser p; - jsmntok_t tok[10]; - const char *js; - - jsmn_init(&p); - js = "key1: \"value\"\nkey2 : 123"; - - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_PRIMITIVE - && tok[1].type == JSMN_STRING && tok[2].type == JSMN_PRIMITIVE - && tok[3].type == JSMN_PRIMITIVE); - check(TOKEN_STRING(js, tok[0], "key1")); - check(TOKEN_STRING(js, tok[1], "value")); - check(TOKEN_STRING(js, tok[2], "key2")); - check(TOKEN_STRING(js, tok[3], "123")); -#endif - return 0; -} - -int test_partial_array() { - int r; - jsmn_parser p; - jsmntok_t tok[10]; - const char *js; - - jsmn_init(&p); - js = " [ 1, true, "; - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r == JSMN_ERROR_PART && tok[0].type == JSMN_ARRAY - && tok[1].type == JSMN_PRIMITIVE && tok[2].type == JSMN_PRIMITIVE); - - js = " [ 1, true, [123, \"hello"; - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r == JSMN_ERROR_PART && tok[0].type == JSMN_ARRAY - && tok[1].type == JSMN_PRIMITIVE && tok[2].type == JSMN_PRIMITIVE - && tok[3].type == JSMN_ARRAY && tok[4].type == JSMN_PRIMITIVE); - - js = " [ 1, true, [123, \"hello\"]"; - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r == JSMN_ERROR_PART && tok[0].type == JSMN_ARRAY - && tok[1].type == JSMN_PRIMITIVE && tok[2].type == JSMN_PRIMITIVE - && tok[3].type == JSMN_ARRAY && tok[4].type == JSMN_PRIMITIVE - && tok[5].type == JSMN_STRING); - /* check child nodes of the 2nd array */ - check(tok[3].size == 2); - - js = " [ 1, true, [123, \"hello\"]]"; - r = jsmn_parse(&p, js, strlen(js), tok, 10); - check(r >= 0 && tok[0].type == JSMN_ARRAY - && tok[1].type == JSMN_PRIMITIVE && tok[2].type == JSMN_PRIMITIVE - && tok[3].type == JSMN_ARRAY && tok[4].type == JSMN_PRIMITIVE - && tok[5].type == JSMN_STRING); - check(tok[3].size == 2); - check(tok[0].size == 3); - return 0; -} - -int test_array_nomem() { - int i; - int r; - jsmn_parser p; - jsmntok_t toksmall[10], toklarge[10]; - const char *js; - - js = " [ 1, true, [123, \"hello\"]]"; - - for (i = 0; i < 6; i++) { - jsmn_init(&p); - memset(toksmall, 0, sizeof(toksmall)); - memset(toklarge, 0, sizeof(toklarge)); - r = jsmn_parse(&p, js, strlen(js), toksmall, i); - check(r == JSMN_ERROR_NOMEM); - - memcpy(toklarge, toksmall, sizeof(toksmall)); - - r = jsmn_parse(&p, js, strlen(js), toklarge, 10); - check(r >= 0); - - check(toklarge[0].type == JSMN_ARRAY && toklarge[0].size == 3); - check(toklarge[3].type == JSMN_ARRAY && toklarge[3].size == 2); - } - return 0; -} - -int test_objects_arrays() { - int i; - int r; - jsmn_parser p; - jsmntok_t tokens[10]; - const char *js; - - js = "[10}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r == JSMN_ERROR_INVAL); - - js = "[10]"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - - js = "{\"a\": 1]"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r == JSMN_ERROR_INVAL); - - js = "{\"a\": 1}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - - return 0; -} - -int test_issue_22() { - int i; - int r; - jsmn_parser p; - jsmntok_t tokens[128]; - const char *js; - - js = "{ \"height\":10, \"layers\":[ { \"data\":[6,6], \"height\":10, " - "\"name\":\"Calque de Tile 1\", \"opacity\":1, \"type\":\"tilelayer\", " - "\"visible\":true, \"width\":10, \"x\":0, \"y\":0 }], " - "\"orientation\":\"orthogonal\", \"properties\": { }, \"tileheight\":32, " - "\"tilesets\":[ { \"firstgid\":1, \"image\":\"..\\/images\\/tiles.png\", " - "\"imageheight\":64, \"imagewidth\":160, \"margin\":0, \"name\":\"Tiles\", " - "\"properties\":{}, \"spacing\":0, \"tileheight\":32, \"tilewidth\":32 }], " - "\"tilewidth\":32, \"version\":1, \"width\":10 }"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 128); - check(r >= 0); -#if 0 - for (i = 1; tokens[i].end < tokens[0].end; i++) { - if (tokens[i].type == JSMN_STRING || tokens[i].type == JSMN_PRIMITIVE) { - printf("%.*s\n", tokens[i].end - tokens[i].start, js + tokens[i].start); - } else if (tokens[i].type == JSMN_ARRAY) { - printf("[%d elems]\n", tokens[i].size); - } else if (tokens[i].type == JSMN_OBJECT) { - printf("{%d elems}\n", tokens[i].size); - } else { - TOKEN_PRINT(tokens[i]); - } - } -#endif - return 0; -} - -int test_unicode_characters() { - jsmn_parser p; - jsmntok_t tokens[10]; - const char *js; - - int r; - js = "{\"a\":\"\\uAbcD\"}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - - js = "{\"a\":\"str\\u0000\"}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - - js = "{\"a\":\"\\uFFFFstr\"}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - - js = "{\"a\":\"str\\uFFGFstr\"}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r == JSMN_ERROR_INVAL); - - js = "{\"a\":\"str\\u@FfF\"}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r == JSMN_ERROR_INVAL); - - js = "{\"a\":[\"\\u028\"]}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r == JSMN_ERROR_INVAL); - - js = "{\"a\":[\"\\u0280\"]}"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r >= 0); - - return 0; -} - -int test_input_length() { - const char *js; - int r; - jsmn_parser p; - jsmntok_t tokens[10]; - - js = "{\"a\": 0}garbage"; - - jsmn_init(&p); - r = jsmn_parse(&p, js, 8, tokens, 10); - check(r == 3); - check(TOKEN_STRING(js, tokens[0], "{\"a\": 0}")); - check(TOKEN_STRING(js, tokens[1], "a")); - check(TOKEN_STRING(js, tokens[2], "0")); - - return 0; -} - -int test_count() { - jsmn_parser p; - const char *js; - - js = "{}"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1); - - js = "[]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1); - - js = "[[]]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 2); - - js = "[[], []]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3); - - js = "[[], []]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3); - - js = "[[], [[]], [[], []]]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7); - - js = "[\"a\", [[], []]]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5); - - js = "[[], \"[], [[]]\", [[]]]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5); - - js = "[1, 2, 3]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 4); - - js = "[1, 2, [3, \"a\"], null]"; - jsmn_init(&p); - check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7); - - return 0; -} - -/** A huge redefinition of everything to include jsmn in non-script mode */ -#define jsmn_init jsmn_init_nonstrict -#define jsmn_parse jsmn_parse_nonstrict -#define jsmn_parser jsmn_parser_nonstrict -#define jsmn_alloc_token jsmn_alloc_token_nonstrict -#define jsmn_fill_token jsmn_fill_token_nonstrict -#define jsmn_parse_primitive jsmn_parse_primitive_nonstrict -#define jsmn_parse_string jsmn_parse_string_nonstrict -#define jsmntype_t jsmntype_nonstrict_t -#define jsmnerr_t jsmnerr_nonstrict_t -#define jsmntok_t jsmntok_nonstrict_t -#define JSMN_PRIMITIVE JSMN_PRIMITIVE_NONSTRICT -#define JSMN_OBJECT JSMN_OBJECT_NONSTRICT -#define JSMN_ARRAY JSMN_ARRAY_NONSTRICT -#define JSMN_STRING JSMN_STRING_NONSTRICT -#define JSMN_ERROR_NOMEM JSMN_ERROR_NOMEM_NONSTRICT -#define JSMN_ERROR_INVAL JSMN_ERROR_INVAL_NONSTRICT -#define JSMN_ERROR_PART JSMN_ERROR_PART_NONSTRICT -#undef __JSMN_H_ -#undef JSMN_STRICT -#include "jsmn.c" - -int test_nonstrict() { - const char *js; - int r; - jsmn_parser p; - jsmntok_t tokens[10]; - - js = "a: 0garbage"; - - jsmn_init(&p); - r = jsmn_parse(&p, js, 4, tokens, 10); - check(r == 2); - check(TOKEN_STRING(js, tokens[0], "a")); - check(TOKEN_STRING(js, tokens[1], "0")); - - js = "Day : 26\nMonth : Sep\n\nYear: 12"; - jsmn_init(&p); - r = jsmn_parse(&p, js, strlen(js), tokens, 10); - check(r == 6); - return 0; -} - -int main() { - test(test_empty, "general test for a empty JSON objects/arrays"); - test(test_simple, "general test for a simple JSON string"); - test(test_primitive, "test primitive JSON data types"); - test(test_string, "test string JSON data types"); - test(test_partial_string, "test partial JSON string parsing"); - test(test_partial_array, "test partial array reading"); - test(test_array_nomem, "test array reading with a smaller number of tokens"); - test(test_unquoted_keys, "test unquoted keys (like in JavaScript)"); - test(test_objects_arrays, "test objects and arrays"); - test(test_unicode_characters, "test unicode characters"); - test(test_input_length, "test strings that are not null-terminated"); - test(test_issue_22, "test issue #22"); - test(test_count, "test tokens count estimation"); - test(test_nonstrict, "test for non-strict mode"); - printf("\nPASSED: %d\nFAILED: %d\n", test_passed, test_failed); - return 0; -} - diff --git a/srb-jsmn/srb-jsmn-exports.c b/srb-jsmn/srb-jsmn-exports.c deleted file mode 100644 index 71fee10..0000000 --- a/srb-jsmn/srb-jsmn-exports.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2015 Scality SA - http://www.scality.com - * - * This file is part of ScalityRestBlock. - * - * ScalityRestBlock 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, either version 3 of the License, or - * (at your option) any later version. - * - * ScalityRestBlock 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 ScalityRestBlock. If not, see . - */ - -#include -#include - -void srb_jsmn_init(jsmn_parser *parser) { - jsmn_init(parser); -} -EXPORT_SYMBOL(srb_jsmn_init); - -jsmnerr_t srb_jsmn_parse(jsmn_parser *parser, const char *js, size_t len, - jsmntok_t *tokens, unsigned int num_tokens) { - return jsmn_parse(parser, js, len, tokens, num_tokens); -} -EXPORT_SYMBOL(srb_jsmn_parse); - -MODULE_AUTHOR("Nicolas Trangez "); -MODULE_DESCRIPTION("jsmin JSON parsing library"); -MODULE_DESCRIPTION("Based on jsmin, copyright (c) 2010 Serge A. Zaitsev"); -MODULE_LICENSE("Dual MIT/GPL"); -MODULE_VERSION("1.0"); diff --git a/srb/srb-cdmi.c b/srb/srb-cdmi.c index aab1e10..dabfcec 100644 --- a/srb/srb-cdmi.c +++ b/srb/srb-cdmi.c @@ -31,7 +31,6 @@ #include #include -#include /* TODO: add username and password support */ #define CDMI_DISCONNECTED 0 From f6af71356241ef5412871f8b24710687384368a3 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 16:42:10 +0100 Subject: [PATCH 07/28] Remove unused `srb_http_mklist` --- include/srb/srb-http.h | 1 - srb/srb-http.c | 62 ------------------------------------------ 2 files changed, 63 deletions(-) diff --git a/include/srb/srb-http.h b/include/srb/srb-http.h index 1d003d8..f9e707a 100644 --- a/include/srb/srb-http.h +++ b/include/srb/srb-http.h @@ -85,7 +85,6 @@ enum srb_http_statuscode }; int srb_http_check_response_complete(char *buff, int len); -int srb_http_mklist(char *buff, int len, char *host, char *page); int srb_http_mkhead(char *buff, int len, char *host, char *page); int srb_http_mkrange(char *cmd, char *buff, int len, char *host, char *page, uint64_t start, uint64_t end); diff --git a/srb/srb-http.c b/srb/srb-http.c index 9c7b370..d7c4416 100644 --- a/srb/srb-http.c +++ b/srb/srb-http.c @@ -490,68 +490,6 @@ int srb_http_mkrange(char *cmd, char *buff, int len, char *host, char *page, } EXPORT_SYMBOL(srb_http_mkrange); -int srb_http_mklist(char *buff, int len, char *host, char *page) -{ - char *bufp = buff; - int mylen = len; - int ret; - - *buff = 0; - ret = add_buffer(&bufp, &mylen, "GET "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, " "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, page); - if (ret) - return -ENOMEM; - - if (page[strlen(page) - 1] != '/') - { - ret = add_buffer(&bufp, &mylen, "/"); - if (ret) - return -ENOMEM; - } - - ret = add_buffer(&bufp, &mylen, " " HTTP_VER CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_KEEPALIVE CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_USER_AGENT CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, "Host: "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, host); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_CDMI_VERS CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, CRLF); - if (ret) - return -ENOMEM; - - return (len - mylen); -} -EXPORT_SYMBOL(srb_http_mklist); - int srb_http_header_get_uint64(char *buff, int len, char *key, uint64_t *value) { int ret; From 1b8aef0cb7fd9de737824a6f63ab9c9412983f2c Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 17:00:11 +0100 Subject: [PATCH 08/28] Let playground server deliver valid JSON That code clearly needs some cleanup. --- playground/server.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/playground/server.py b/playground/server.py index d5b4ef3..dd31e05 100644 --- a/playground/server.py +++ b/playground/server.py @@ -350,11 +350,16 @@ def _list_dir(self, response, path, do_json): else: data = "Listing of the volumes" data += "
  • " - for entry in entries: + for entry in entries[:-1]: if do_json: data += "\"%s\"," % (str(entry)) else: data += "
      %s
    " % (str(entry)) + if do_json: + data += "\"%s\"" % (str(entries[-1])) + else: + data += "
      %s
    " % (str(entry)) + if do_json: data += """], "childrenrange": "" From 281f573b9995cda57a2e080be777fac0b10f36bb Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 17:00:30 +0100 Subject: [PATCH 09/28] Initial import of SRB control script When removing functionality from a kernel driver and claiming it should be implemented in userspace, it really should be. --- bin/srb | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 bin/srb diff --git a/bin/srb b/bin/srb new file mode 100755 index 0000000..e203a7a --- /dev/null +++ b/bin/srb @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +import sys +import argparse +import httplib +import json +import subprocess +import urllib2 + +MODULE_NAME = 'srb' + +def call_silent(cmd): + return subprocess.call(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + +def stdout(msg, *args): + sys.stdout.writelines([msg % args, '\n']) + +def stderr(msg, *args): + sys.stderr.writelines([msg % args, '\n']) + +def handle_module_load(args): + rc = call_silent(['modinfo', '-n', MODULE_NAME]) + + if rc != 0: + raise EnvironmentError('Module \'%s\' not found' % MODULE_NAME) + + rc = call_silent(['modprobe', MODULE_NAME]) + if rc == 0: + stdout('Module \'%s\' loaded successfully', MODULE_NAME) + else: + stderr('Failed to load module \'%s\'', MODULE_NAME) + +def handle_volume_list(args): + req = urllib2.Request(args.url) + req.add_header('X-CDMI-Specification-Version', '1.0.1') + + resp = urllib2.urlopen(req) + if resp.code != httplib.OK: + raise Exception('Server returned code: %d' % resp.code) + + result = json.load(resp) + + for child in result['children']: + print child + +def handle_volume_create(args): + raise NotImplementedError + +def handle_volume_delete(args): + raise NotImplementedError + +def handle_volume_extend(args): + raise NotImplementedError + +def main(args): + parser = argparse.ArgumentParser( + description='SRB utilities', + epilog='Note: For some commands root permissions are required') + + subparser = parser.add_subparsers(title='subcommands') + + parser_module_load = subparser.add_parser('module-load') + parser_module_load.set_defaults(func=handle_module_load) + + parser_volume_list = subparser.add_parser('volume-list') + parser_volume_list.set_defaults(func=handle_volume_list) + parser_volume_list.add_argument('url', metavar='URL', type=str, + help='CDMI server URL') + + parser_volume_create = subparser.add_parser('volume-create') + parser_volume_create.set_defaults(func=handle_volume_create) + + parser_volume_delete = subparser.add_parser('volume-delete') + parser_volume_delete.set_defaults(func=handle_volume_delete) + + parser_volume_extend = subparser.add_parser('volume-extend') + parser_volume_extend.set_defaults(func=handle_volume_extend) + + args = parser.parse_args(args) + + try: + args.func(args) + except Exception as exc: + stderr(str(exc)) + sys.exit(1) + +if __name__ == '__main__': + main(None) From f19ffc237a75516e21cbd3c8baa3d30989770037 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 17:01:15 +0100 Subject: [PATCH 10/28] Ignore playground data --- playground/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/playground/.gitignore b/playground/.gitignore index 0d20b64..5714b6a 100644 --- a/playground/.gitignore +++ b/playground/.gitignore @@ -1 +1,2 @@ *.pyc +playground_data/ From 252cedaa37c74710af2505ea68bfdbdebc239d20 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 18:25:14 +0100 Subject: [PATCH 11/28] Remove removed functionality from `README.md` --- README.md | 89 ------------------------------------------------------- 1 file changed, 89 deletions(-) diff --git a/README.md b/README.md index 1ff0816..0e617b7 100644 --- a/README.md +++ b/README.md @@ -66,12 +66,6 @@ the servers: * add\_urls: allows adding one or more server urls to the driver * remove\_urls: allows removing one or more server urls from the driver -Then, the following management files are available: - * create: allows creating a volume file on the storage - * extend: allows extending a volume (increasing size), whether it is attached - or not - * destroy: deletes the volume file from the storage - The way those files work is described in the following sections, each dedicated to one management (/sys) file. Please mind that each one of theses files can be displayed (using cat on them) to show a simple usage text. @@ -138,69 +132,6 @@ Note also that when unloading the module, the devices are detached automatically before the module can actually be unloaded. -Creating a new volume ---------------------- - -To create a volume, just give the name of the file to create to the driver, -accompanied by a byte size, such as in the following example: - - # echo "filename human\_readable\_size" > /sys/class/srb/create - -The volume will be created on the storage with the requested size. -But beware: - * The human readable size formats understood by the LKM are the following: - * [integer number]: size in bytes - * [integer number]k: size in Kilobytes - * [integer number]M: size in Megabytes - * [integer number]G: size in Gigabytes - * At least one server url must exist and be valid for the volume to be -created - * Created volume are not automatically attached as a device on the system. - -Before you can use the volume, you have to attach it through the attach /sys -file (see below). - -Extending a volume ------------------- - -Sometimes, a volume might look to be provisionned too small for the actual -need. For this reason, you can actually extend it through the extend /sys -control file. This command follows the same usage as the create command, thus -using it is simple: - - # echo "volumename human\_readable\_size" > /sys/class/srb/extend - -Be aware that this command can only extend a volume, meaning the size you give -must be higher than the current size. Also, this is a supported operation -on an attached volume, though any file-system formatted onto the volume should -be extended to the new volume's size manually since most of the filesystems -don't support flexible partition or volume extension (unless you are using LVM -underneath). - -Once the operation is complete, the new size will be properly reported to the -system without any additional administrative task. For instance, displaying the -contents of the file /proc/partitions will show you the updated size of the -volume. - -Note that the human readable size format of the extend command follows the -same rules as that of the create command. - -Destruction of an existing volume ---------------------------------- - -Destroying a volume means that it volume will no longer be accessible after -a successful operation. To destroy a volume, give the driver the name of the -file to remove from the storage as the following example shows: - - # echo filename > /sys/class/srb/destroy - -The volume is then removed from storage and is no longer accessible. -But beware: - * The destroyed volume must exist beforehand - * Destroying a volume used by other drivers on other machines srb -can lead to errors and unexpected behaviors; this is untested. - - Attaching and Detaching devices =============================== @@ -219,26 +150,6 @@ the three following management files are available: They are described in detail in the following sections. -Listing the volumes -------------------- - -Since you might not know from memory which volumes exist on your servers, -you might want a way to list those, to attach them easily. One of the ways -provided is to read the content of the volumes /sys file: - -``` - # cat /sys/class/srb/volumes - Volume1 - Foo - Bar - Baz - Qux -``` - -This way, you can know that you have five volumes available on your servers, -and know their names, which will allow you to either attach, extend or destroy -them. - Attaching a device ------------------ From 011b8ec26af3f5dd545d1e6cbe89f4bbad9411fa Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Tue, 10 Feb 2015 18:25:28 +0100 Subject: [PATCH 12/28] Block devices already have a `size` attribute in sysfs No need to re-implement. --- srb/srb-sysfs.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/srb/srb-sysfs.c b/srb/srb-sysfs.c index a8db854..ff1ba17 100644 --- a/srb/srb-sysfs.c +++ b/srb/srb-sysfs.c @@ -61,7 +61,6 @@ static int parse_params(char *params, const char *delim, char **param_tbl, int p * srb_debug Sets verbosity * srb_urls Gets device CDMI url * srb_name Gets device's on-storage filename - * srb_size Gets device size *******************************************************************/ static ssize_t attr_debug_store(struct device *dv, struct device_attribute *attr, @@ -120,20 +119,9 @@ static ssize_t attr_disk_name_show(struct device *dv, return scnprintf(buff, PAGE_SIZE, "%s\n", kbasename(dev->thread_cdmi_desc[0]->url)); } -static ssize_t attr_disk_size_show(struct device *dv, - struct device_attribute *attr, char *buff) -{ - struct gendisk *disk = dev_to_disk(dv); - struct srb_device_s *dev = disk->private_data; - - return scnprintf(buff, PAGE_SIZE, "%llu\n", dev->disk_size); -} - static DEVICE_ATTR(srb_debug, S_IWUSR | S_IRUGO, &attr_debug_show, &attr_debug_store); static DEVICE_ATTR(srb_urls, S_IRUGO, &attr_urls_show, NULL); static DEVICE_ATTR(srb_name, S_IRUGO, &attr_disk_name_show, NULL); -static DEVICE_ATTR(srb_size, S_IRUGO, &attr_disk_size_show, NULL); - /************************************************************************ * /sys/class/srb/ @@ -395,7 +383,6 @@ void srb_sysfs_device_init(srb_device_t *dev) device_create_file(disk_to_dev(dev->disk), &dev_attr_srb_debug); device_create_file(disk_to_dev(dev->disk), &dev_attr_srb_urls); device_create_file(disk_to_dev(dev->disk), &dev_attr_srb_name); - device_create_file(disk_to_dev(dev->disk), &dev_attr_srb_size); } static struct class_attribute class_srb_attrs[] = { From 03511eddb31aa6a7b941ba0f9117cebbeca86690 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Wed, 11 Feb 2015 15:47:26 +0100 Subject: [PATCH 13/28] Remove unused includes Some might be required though when `srb.h` is gone. --- srb/srb-cdmi.c | 9 ++++----- srb/srb-driver.c | 13 +------------ srb/srb-http.c | 3 --- srb/srb-sysfs.c | 6 ------ srb/srb.h | 8 +------- 5 files changed, 6 insertions(+), 33 deletions(-) diff --git a/srb/srb-cdmi.c b/srb/srb-cdmi.c index dabfcec..2f6cbd0 100644 --- a/srb/srb-cdmi.c +++ b/srb/srb-cdmi.c @@ -20,13 +20,12 @@ * */ -#include // included for all kernel modules -#include // included for KERN_INFO -#include // for uintx_t -#include +#include +#include #include -#include #include +#include + #include "srb.h" #include diff --git a/srb/srb-driver.c b/srb/srb-driver.c index f32faba..fc3a5d7 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -21,21 +21,10 @@ // Linux Kernel/LKM headers: module.h is needed by all modules and // kernel.h is needed for KERN_INFO. -#include // included for all kernel modules -#include // included for KERN_INFO -#include // included for LKM parameters -#include // included for __init and __exit macros -#include -#include -#include -#include -#include #include -#include -#include // for vmalloc() #include +#include #include -#include #include #include diff --git a/srb/srb-http.c b/srb/srb-http.c index d7c4416..dbb09a0 100644 --- a/srb/srb-http.c +++ b/srb/srb-http.c @@ -18,9 +18,6 @@ * */ -#include -#include - #include #include #include "srb.h" diff --git a/srb/srb-sysfs.c b/srb/srb-sysfs.c index ff1ba17..28b2b6d 100644 --- a/srb/srb-sysfs.c +++ b/srb/srb-sysfs.c @@ -18,12 +18,6 @@ * */ -#include // included for all kernel modules -#include // included for KERN_INFO -#include -#include -#include - #include #include "srb.h" diff --git a/srb/srb.h b/srb/srb.h index 7fd50e9..9002279 100644 --- a/srb/srb.h +++ b/srb/srb.h @@ -21,14 +21,8 @@ #ifndef __SRBLOCK_H__ # define __SRBLOCK_H__ -#include -#include -#include // for in_aton() -#include -#include -#include -#include #include +#include #include #include From 0c254d7824dfbedccd38eb12616cf81e407c6131 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Wed, 11 Feb 2015 15:48:48 +0100 Subject: [PATCH 14/28] Fixup Clang unsignedness errors --- srb/srb-driver.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/srb/srb-driver.c b/srb/srb-driver.c index fc3a5d7..7488e33 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -489,7 +489,7 @@ static int srb_init_disk(struct srb_device_s *dev) { struct gendisk *disk = NULL; struct request_queue *q; - int i; + unsigned int i; int ret = 0; SRB_LOG_INFO(srb_log, "srb_init_disk: initializing disk for device: %s", dev->name); @@ -586,7 +586,7 @@ static int srb_init_disk(struct srb_device_s *dev) static int srb_device_new(const char *devname, srb_device_t *dev) { int ret = -EINVAL; - int i; + unsigned int i; SRB_LOG_INFO(srb_log, "srb_device_new: creating new device %s" " with %d threads", devname, thread_pool_size); @@ -666,7 +666,7 @@ static void __srb_device_free(srb_device_t *dev) static void srb_device_free(srb_device_t *dev) { - int i = 0; + unsigned int i = 0; SRB_LOG_INFO(srb_log, "srb_device_free: freeing device: %s", dev->name); @@ -721,7 +721,7 @@ static int _srb_reconstruct_url(char *url, char *name, static int __srb_device_detach(srb_device_t *dev) { - int i; + unsigned int i; int ret = 0; SRB_LOG_DEBUG(srb_log, "detaching device (%p)", dev); @@ -1152,7 +1152,7 @@ int srb_device_attach(const char *filename, const char *devname) { srb_device_t *dev = NULL; int rc = 0; - int i; + unsigned int i; int do_unregister = 0; struct srb_cdmi_desc_s *cdmi_desc = NULL; int found = 0; From 8f2c292c49a078755b5a36b23e1719c490294e5b Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Wed, 11 Feb 2015 15:49:01 +0100 Subject: [PATCH 15/28] Disable some warnings when building with Clang --- srb/Kbuild | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/srb/Kbuild b/srb/Kbuild index 285470d..5443fe0 100644 --- a/srb/Kbuild +++ b/srb/Kbuild @@ -3,3 +3,7 @@ obj-m := srb.o srb-y := srb-driver.o srb-sysfs.o srb-cdmi.o srb-http.o EXTRA_CFLAGS := -ggdb3 -Wall -Wextra -Werror -Wno-unused-parameter -I$(src)/../include + +ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1) +EXTRA_CFLAGS += -Wno-unknown-attributes -Wno-error=sign-compare -Wno-error=unused-function +endif From 2d13b39204b4896dc6c64d713dd7f5b072fa60f1 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Sat, 14 Feb 2015 17:15:01 +0100 Subject: [PATCH 16/28] bin/srb: Implement more CDMI volume management commands --- bin/srb | 83 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 16 deletions(-) diff --git a/bin/srb b/bin/srb index e203a7a..ec7b4e4 100755 --- a/bin/srb +++ b/bin/srb @@ -2,15 +2,18 @@ import sys import argparse -import httplib -import json import subprocess -import urllib2 + +import requests MODULE_NAME = 'srb' +DEFAULT_HEADERS = { + 'User-Agent': 'srb/0.0.1', +} def call_silent(cmd): - return subprocess.call(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + with open('/dev/null', 'w') as fd: + return subprocess.call(cmd, stdout=fd, stderr=fd) def stdout(msg, *args): sys.stdout.writelines([msg % args, '\n']) @@ -30,27 +33,65 @@ def handle_module_load(args): else: stderr('Failed to load module \'%s\'', MODULE_NAME) -def handle_volume_list(args): - req = urllib2.Request(args.url) - req.add_header('X-CDMI-Specification-Version', '1.0.1') +def make_headers(extra=None): + result = DEFAULT_HEADERS.copy() + if extra: + result.update(extra) - resp = urllib2.urlopen(req) - if resp.code != httplib.OK: - raise Exception('Server returned code: %d' % resp.code) + return result + +def handle_volume_list(args): + headers = make_headers({ + 'X-CDMI-Specification-Version': '1.0.1', + }) - result = json.load(resp) + response = requests.get(args.url, headers=headers) + response.raise_for_status() - for child in result['children']: + for child in response.json()['children']: print child def handle_volume_create(args): - raise NotImplementedError + headers = make_headers({ + 'If-None-Match': '*', + }) + + response = requests.put(args.url, headers=headers) + response.raise_for_status() + + headers = make_headers({ + 'X-Scal-Truncate': args.size, + }) + + response = requests.put(args.url, headers=headers) + response.raise_for_status() def handle_volume_delete(args): - raise NotImplementedError + headers = make_headers() + + response = requests.delete(args.url, headers=headers) + response.raise_for_status() def handle_volume_extend(args): - raise NotImplementedError + headers = make_headers() + params = { + 'metadata': 1, + } + + response = requests.get(args.url, params=params) + response.raise_for_status() + + current_size = response.json()['metadata']['cdmi_size'] + + if current_size > args.size: + raise ValueError('Can\'t shrink volumes') + + headers == make_headers({ + 'X-Scal-Truncate': args.size, + }) + + response = requests.put(args.url, headers=headers) + response.raise_for_status() def main(args): parser = argparse.ArgumentParser( @@ -65,16 +106,26 @@ def main(args): parser_volume_list = subparser.add_parser('volume-list') parser_volume_list.set_defaults(func=handle_volume_list) parser_volume_list.add_argument('url', metavar='URL', type=str, - help='CDMI server URL') + help='CDMI container URL') parser_volume_create = subparser.add_parser('volume-create') parser_volume_create.set_defaults(func=handle_volume_create) + parser_volume_create.add_argument('url', metavar='URL', type=str, + help='CDMI object URL') + parser_volume_create.add_argument('size', metavar='SIZE', type=int, + help='Object size (in bytes)') parser_volume_delete = subparser.add_parser('volume-delete') parser_volume_delete.set_defaults(func=handle_volume_delete) + parser_volume_delete.add_argument('url', metavar='URL', type=str, + help='CDMI object URL') parser_volume_extend = subparser.add_parser('volume-extend') parser_volume_extend.set_defaults(func=handle_volume_extend) + parser_volume_extend.add_argument('url', metavar='URL', type=str, + help='CDMI object URL') + parser_volume_extend.add_argument('size', metavar='SIZE', type=int, + help='Object size (in bytes)') args = parser.parse_args(args) From 865fd8023667210f6b07435f8191b1575a18776f Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Sat, 14 Feb 2015 17:20:06 +0100 Subject: [PATCH 17/28] Remove SysV/SystemD stuff --- README.centos | 52 ------------- README.ubuntu | 42 ---------- system-v_init/srb-ubuntu.init | 140 ---------------------------------- system-v_init/srb.conf | 35 --------- systemd/srb.conf | 35 --------- systemd/srb.service | 33 -------- 6 files changed, 337 deletions(-) delete mode 100644 README.centos delete mode 100644 README.ubuntu delete mode 100755 system-v_init/srb-ubuntu.init delete mode 100644 system-v_init/srb.conf delete mode 100644 systemd/srb.conf delete mode 100644 systemd/srb.service diff --git a/README.centos b/README.centos deleted file mode 100644 index 830817f..0000000 --- a/README.centos +++ /dev/null @@ -1,52 +0,0 @@ - README file for CentOS Installation - - -INTRODUCTION -============ - -This Linux Kernel Driver can be installed on CentOS v7 and greater releases -with Linux Kernel v3.10 and greater. - - -Installing the driver with a service ------------------------------------- -CentOS system uses 'systemd' as system management daemon which has been -designed for Linux as a replacement of the init system inherited from -UNIX System V. -'systemd' Project: http://www.freedesktop.org/wiki/Software/systemd/ - -In order to install the driver as a service, you can install the 'systemd' -script in order to configure and use the driver to access your CDMI Rest API. - -In order to install the system script, please use the following command: - - # cp systemd/srb.service /etc/systemd/system/ - # cp systemd/srb.conf /etc/ - -NB: Update your srb.conf according to your CDMI condiguration: ---- - set KMOD_PATH with the path where you have built the driver - - set URLS with your server(s) URL(S) - - -Using the driver as a service ------------------------------ -'systemd' provides a command named 'systemctl' that allows to interact with any -service. - -In order to start / stop the service use the following command: - - # systemctl start srb.service - # systemctl stop srb.service - -In order to enable / disable the service at boot time, use the following command: - - # systemctl enable srb.service - # systemctl disable srb.service - - -Listing device used by ScalityRestBlock service: - # systemctl list-units | grep -E '(rest|srb)' - UNIT LOAD ACTIVE SUB DESCRIPTION - sys-devices-virtual-block-srba-srba1.device loaded active plugged /sys/devices/virtual/block/srba/srba1 - sys-devices-virtual-block-srba.device loaded active plugged /sys/devices/virtual/block/srba - srb.service loaded active exited Scality RestBlock driver diff --git a/README.ubuntu b/README.ubuntu deleted file mode 100644 index 7325728..0000000 --- a/README.ubuntu +++ /dev/null @@ -1,42 +0,0 @@ - README file for Ubuntu Installation - - -INTRODUCTION -============ - -This Linux Kernel Driver can be installed on Ubuntu 14 LTS and greater releases -with Linux Kernel v3.10 and greater. - - -Installing the driver with a service ------------------------------------- -Ubuntu system uses 'UNIX System V' as system management daemon. - - -In order to install the driver as a service, you have to install the 'systemd' -script in order to configure and use the driver to access your CDMI Rest API. - -In order to install the system script, please use the following command: - - # cp system-v_init/srb-ubuntu.init /etc/init.d/srb - # cp system-v_init/srb.conf /etc/ - -NB: Update your srb.conf according to your CDMI condiguration: ---- - set KMOD_PATH with the path where you have built the driver - - set URLS with your server URL(S) - - -Using the driver as a service ------------------------------ -Ubuntu systems provide a command named 'update-rc.d' that allows to interact with -any service. - -In order to start / stop the service use the following command: - - # /etc/init.d/srb start - # /etc/init.d/srb stop - -In order to enable / disable the service at boot time, use the following command: - - # update-rc.d srb defaults - # update-rc.d -f srb remove diff --git a/system-v_init/srb-ubuntu.init b/system-v_init/srb-ubuntu.init deleted file mode 100755 index 927cc85..0000000 --- a/system-v_init/srb-ubuntu.init +++ /dev/null @@ -1,140 +0,0 @@ -#! /bin/sh -### BEGIN INIT INFO -# Provides: srb -# Required-Start: $syslog -# Required-Stop: $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Scality RestBlock Driver -# Description: This service loads Scality RestBlock Driver -# and configures the servers from /etc/srb.conf. -### END INIT INFO - -# Author: Frederic Donnat -# - -# Do NOT "set -e" - -# PATH should only include /usr/* if it runs after the mountnfs.sh script -PATH=/sbin:/usr/sbin:/bin:/usr/bin -DESC="Scality RestBlock driver" -NAME=srb -SCRIPTNAME=/etc/init.d/$NAME -VERBOSE=yes -KMOD_NAME=srb - -# Exit if the package is not installed -#[ -x "$DAEMON" ] || exit 0 - -# Read configuration variable file if it is present -[ -r /etc/${NAME}.conf ] && . /etc/${NAME}.conf - -# Load the VERBOSE setting and other rcS variables -#. /lib/init/vars.sh - -# Define LSB log_* functions. -# Depend on lsb-base (>= 3.2-14) to ensure that this file is present -# and status_of_proc is working. -. /lib/lsb/init-functions - -# -# Parsing config -# -if [ -z $KMOD_PATH ]; then KMOD_PATH="/lib/modules/$(uname -r)/kernel/drivers/srb/"; fi - -# -# Function that loads the ScalityRestBlock -# -do_load_drv() { - # Load the driver - insmod $KMOD_PATH/${KMOD_NAME}.ko > /dev/null || return 2 -} - -# -# Function that unload the ScalityRestBlock -# -do_unload_drv() { - # Unload the driver - rmmod $KMOD_NAME > /dev/null || return 2 -} - -# -# Function that configures the servers -# -do_config_servers() { - echo "$URLS" > /sys/class/srb/add_urls || return 2 -} - -# -# Function that unconfigures the servers -# -do_deconfig_servers() { - echo "$URLS" > /sys/class/srb/remove_urls || return 2 -} - -# -# Function that checks status -# -do_check_drv_status() { - lsmod | grep $KMOD_NAME > /dev/null || return 2 -} -do_check_servers_status() { - nb_urls=$(cat /sys/class/srb/urls | wc -l) - [ $nb_urls -ne 0 ] && return 0 || return 2 -} - -case "$1" in - start) - #log_begin_msg "Starting $DESC" "$NAME" - [ "$VERBOSE" != no ] && log_action_begin_msg "Loading ${KMOD_NAME} driver" - do_load_drv - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_action_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_action_end_msg 1 ;; - esac - [ "$VERBOSE" != no ] && log_action_begin_msg "Adding ${NAME} servers" - do_config_servers - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_action_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_action_end_msg 1 ; return 2 ;; - esac - #log_end_msg $? - ;; - stop) - #log_begin_msg "Stopping $DESC" "$NAME" - [ "$VERBOSE" != no ] && log_action_begin_msg "Removing ${NAME} servers" - do_deconfig_servers - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_action_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_action_end_msg 1 ; return 2 ;; - esac - [ "$VERBOSE" != no ] && log_action_begin_msg "Unloading ${KMOD_NAME} driver" - do_unload_drv - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_action_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_action_end_msg 1 ; return 2 ;; - esac - #log_end_msg $? - ;; - status) - [ "$VERBOSE" != no ] && do_check_drv_status - if [ $? -eq 0 ]; then - [ "$VERBOSE" != no ] && log_success_msg "${KMOD_NAME} driver loaded" - else - [ "$VERBOSE" != no ] && log_failure_msg "${KMOD_NAME} driver *NOT* loaded" - return 2 - fi - [ "$VERBOSE" != no ] && do_check_servers_status - if [ $? -eq 0 ]; then - [ "$VERBOSE" != no ] && log_success_msg "${NAME} servers configured" - else - [ "$VERBOSE" != no ] && log_failure_msg "${NAME} *NO* servers configured" - return 2 - fi - return 0 - ;; - *) - echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 - exit 3 - ;; -esac diff --git a/system-v_init/srb.conf b/system-v_init/srb.conf deleted file mode 100644 index 66a16a0..0000000 --- a/system-v_init/srb.conf +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (C) 2014 SCALITY SA - http://www.scality.com -# -# This file is part of ScalityRestBlock. -# -# ScalityRestBlock 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, either version 3 of the License, or -# (at your option) any later version. -# -# ScalityRestBlock 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 ScalityRestBlock. If not, see . -# - -# -# ScalityRestBlock configuration -# - -# -# Kernel module path (if not default) -# -KMOD_PATH="/media/data/scality/ScalityRestBlock" - -# -# Servers list: List of server urls comma separated -# Example: URLS="http://First_Server/Server_Path,http://Second_Server/Server_Path" -URLS="http://192.168.40.134/fdt_test" - -# Module Default configuration - diff --git a/systemd/srb.conf b/systemd/srb.conf deleted file mode 100644 index dc5cc6b..0000000 --- a/systemd/srb.conf +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (C) 2014 SCALITY SA - http://www.scality.com -# -# This file is part of ScalityRestBlock. -# -# ScalityRestBlock 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, either version 3 of the License, or -# (at your option) any later version. -# -# ScalityRestBlock 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 ScalityRestBlock. If not, see . -# - -# -# ScalityRestBlock configuration -# - -# -# Kernel module path (if not default) -# -KMOD_PATH=/opt/scality/ScalityRestBlock -KMOD_NAME=srb - -# -# Servers list: List of server urls comma separated -# Example: URLS="http://First_Server/Server_Path,http://Second_Server/Server_Path" -URLS=http://192.168.40.134/fdt_test - -# Module Default configuration diff --git a/systemd/srb.service b/systemd/srb.service deleted file mode 100644 index 97838b4..0000000 --- a/systemd/srb.service +++ /dev/null @@ -1,33 +0,0 @@ -[Unit] -Description=Scality RestBlock Driver -After=syslog.target network.target - -# Check if configuration file exists -ConditionFileNotEmpty=/etc/srb.conf - - -[Service] -Type=oneshot -RemainAfterExit=yes -EnvironmentFile=/etc/srb.conf - -# -# Start -# -ExecStart=/usr/sbin/insmod ${KMOD_PATH}/${KMOD_NAME}.ko -ExecStart=/usr/bin/cp /sys/class/srb/add_urls /tmp/add_urls -ExecStart=/usr/bin/sed -r -e "s,.*,${URLS}," -i /tmp/add_urls -ExecStart=/usr/bin/cp /tmp/add_urls /sys/class/srb/add_urls -ExecStart=/usr/bin/rm -f /tmp/add_urls - -# -# Stop -# -ExecStop=/usr/bin/touch /tmp/add_urls -ExecStop=/usr/bin/cp /tmp/add_urls /sys/class/srb/add_urls -ExecStop=/usr/sbin/rmmod $KMOD_NAME -ExecStop=/usr/bin/rm -f /tmp/add_urls - - -[Install] -WantedBy=multi-user.target From 500672b1fd0e1afc0ab53f7b92ea439c98c0c4c8 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Sat, 14 Feb 2015 17:22:29 +0100 Subject: [PATCH 18/28] bin/srb: Add license header --- bin/srb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/bin/srb b/bin/srb index ec7b4e4..295332c 100755 --- a/bin/srb +++ b/bin/srb @@ -1,5 +1,21 @@ #!/usr/bin/env python +# srb - A simple CDMI volume operations client +# Copyright (C) 2015 Scality SA +# +# 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, either version 3 of the License, or +# (at your option) any later version. +# +# 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, see . + import sys import argparse import subprocess From 7459fff2ccf13eac92ad232feb92d7215dbda69e Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Sat, 14 Feb 2015 17:30:17 +0100 Subject: [PATCH 19/28] Remove some unused macro constants --- srb/srb.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/srb/srb.h b/srb/srb.h index 9002279..5ff30bb 100644 --- a/srb/srb.h +++ b/srb/srb.h @@ -28,16 +28,10 @@ #include #include -/* Constants */ -#define kB 1024 -#define MB (1024 * kB) -#define GB (1024 * MB) - /* Unix device constants */ #define DEV_NAME "srb" #define DEV_REL_VERSION "0.6.1" // Set version of srb LKM #define DEV_MINORS 256 -#define DEV_DEFAULT_DISKSIZE (50 * MB) #define DEV_MAX 64 #define DEV_SECTORSIZE SRB_DEV_SECTORSIZE #define DEV_NB_PHYS_SEGS SRB_DEV_NB_PHYS_SEGS @@ -74,7 +68,6 @@ extern unsigned int thread_pool_size; * by default */ #define SRB_MIN(x, y) ((x) < (y) ? (x) : (y)) -#define SRB_N_JSON_TOKENS 128 typedef struct srb_device_s { /* Device subsystem related data */ From 06d18c693b3cdf39ac7ce9589b35db6c6b0bbc96 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Sat, 14 Feb 2015 17:30:30 +0100 Subject: [PATCH 20/28] C has enums for quite a while. Use them. --- srb/srb.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/srb/srb.h b/srb/srb.h index 5ff30bb..8ae39b9 100644 --- a/srb/srb.h +++ b/srb/srb.h @@ -37,8 +37,10 @@ #define DEV_NB_PHYS_SEGS SRB_DEV_NB_PHYS_SEGS /* Device state (reduce spinlock section and avoid multiple operation on same device) */ -#define DEV_IN_USE 1 -#define DEV_UNUSED 0 +enum device_state { + DEV_IN_USE, + DEV_UNUSED, +}; /* Dewpoint server related constants */ #define SRB_REUSE_LIMIT 100 /* Max number of requests sent to @@ -80,7 +82,7 @@ typedef struct srb_device_s { uint64_t disk_size; /* Size in bytes */ int users; /* Number of users who * opened dev */ - int state; /* for create extend attach detach destroy purpose */ + enum device_state state; /* for create extend attach detach destroy purpose */ struct request_queue *q; spinlock_t rq_lock; /* request queue lock */ From 88e0238709c6451a53e57af87254220ede44e6ce Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Sat, 14 Feb 2015 17:43:53 +0100 Subject: [PATCH 21/28] Slowly getting rid of `srb/srb.h` --- srb/srb-cdmi.c | 5 +++++ srb/srb-driver.c | 16 ++++++++++++++++ srb/srb.h | 30 ------------------------------ 3 files changed, 21 insertions(+), 30 deletions(-) diff --git a/srb/srb-cdmi.c b/srb/srb-cdmi.c index 2f6cbd0..633e790 100644 --- a/srb/srb-cdmi.c +++ b/srb/srb-cdmi.c @@ -31,6 +31,11 @@ #include #include +#define SRB_REUSE_LIMIT 100 /* Max number of requests sent to + * a single HTTP connection before + * restarting a new one. + */ + /* TODO: add username and password support */ #define CDMI_DISCONNECTED 0 #define CDMI_CONNECTED 1 diff --git a/srb/srb-driver.c b/srb/srb-driver.c index 7488e33..857e240 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -31,6 +31,17 @@ #include "srb.h" +#define DEV_MAX 64 +#define DEV_MINORS 256 + +/* + * Default values for ScalityRestBlock LKM parameters + */ +#define SRB_REQ_TIMEOUT_DFLT 30 +#define SRB_NB_REQ_RETRIES_DFLT 3 +#define SRB_CONN_TIMEOUT_DFLT 30 +#define SRB_LOG_LEVEL_DFLT SRB_INFO +#define SRB_THREAD_POOL_SIZE_DFLT 8 // LKM information MODULE_AUTHOR("Laurent Meyer "); @@ -39,6 +50,11 @@ MODULE_DESCRIPTION("Block Device Driver for REST-based storage"); MODULE_LICENSE("GPL"); MODULE_VERSION(DEV_REL_VERSION); +typedef struct srb_server_s { + struct srb_server_s *next; + struct srb_cdmi_desc_s cdmi_desc; +} srb_server_t; + static srb_device_t devtab[DEV_MAX]; static srb_server_t *servers = NULL; static DEFINE_SPINLOCK(devtab_lock); diff --git a/srb/srb.h b/srb/srb.h index 8ae39b9..9cc3ed7 100644 --- a/srb/srb.h +++ b/srb/srb.h @@ -31,8 +31,6 @@ /* Unix device constants */ #define DEV_NAME "srb" #define DEV_REL_VERSION "0.6.1" // Set version of srb LKM -#define DEV_MINORS 256 -#define DEV_MAX 64 #define DEV_SECTORSIZE SRB_DEV_SECTORSIZE #define DEV_NB_PHYS_SEGS SRB_DEV_NB_PHYS_SEGS @@ -42,34 +40,11 @@ enum device_state { DEV_UNUSED, }; -/* Dewpoint server related constants */ -#define SRB_REUSE_LIMIT 100 /* Max number of requests sent to - * a single HTTP connection before - * restarting a new one. - */ - /* * Linux Kernel Module (LKM) parameters */ extern unsigned short srb_log; -extern unsigned short req_timeout; extern unsigned short nb_req_retries; -extern unsigned short server_conn_timeout; -extern unsigned int thread_pool_size; - -/* - * Default values for ScalityRestBlock LKM parameters - */ -#define SRB_REQ_TIMEOUT_DFLT 30 -#define SRB_NB_REQ_RETRIES_DFLT 3 -#define SRB_CONN_TIMEOUT_DFLT 30 -#define SRB_LOG_LEVEL_DFLT SRB_INFO -#define SRB_THREAD_POOL_SIZE_DFLT 8 - -#define SRB_DEBUG_LEVEL 0 /* We do not want to be polluted - * by default */ - -#define SRB_MIN(x, y) ((x) < (y) ? (x) : (y)) typedef struct srb_device_s { /* Device subsystem related data */ @@ -105,11 +80,6 @@ typedef struct srb_device_s { srb_debug_t debug; } srb_device_t; -typedef struct srb_server_s { - struct srb_server_s *next; - struct srb_cdmi_desc_s cdmi_desc; -} srb_server_t; - /* srb.c */ int srb_device_attach(const char *filename, const char *devname); int srb_device_detach(const char *devname); From c4ebe79ec667d40d45e76b6c56519ea70c55ba29 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Sun, 15 Feb 2015 00:44:29 +0100 Subject: [PATCH 22/28] Abstractify `srb_device` struct --- include/srb/srb-cdmi.h | 14 +++--- include/srb/srb-log.h | 54 ++++++++++++++++++----- srb/srb-cdmi.c | 20 ++++----- srb/srb-driver.c | 97 ++++++++++++++++++++++++++++++++++-------- srb/srb-sysfs.c | 30 +++++++------ srb/srb.h | 43 +++++-------------- 6 files changed, 166 insertions(+), 92 deletions(-) diff --git a/include/srb/srb-cdmi.h b/include/srb/srb-cdmi.h index 59d3cbf..10234ba 100644 --- a/include/srb/srb-cdmi.h +++ b/include/srb/srb-cdmi.h @@ -31,7 +31,7 @@ #define SRB_CDMI_XMIT_BUFFER_SIZE (SRB_CDMI_HTTP_HEADER_SIZE + SRB_DEV_SECTORSIZE) -struct srb_cdmi_desc_s { +struct srb_cdmi_desc { /* For /sys/block/srb?/srb_url */ char url[SRB_CDMI_URL_SIZE + 1]; uint8_t state; @@ -49,17 +49,17 @@ struct srb_cdmi_desc_s { struct timeval timeout; }; -int srb_cdmi_init(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, +int srb_cdmi_init(srb_debug_t *dbg, struct srb_cdmi_desc *desc, const char *url); -int srb_cdmi_connect(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); -int srb_cdmi_disconnect(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc); +int srb_cdmi_connect(srb_debug_t *dbg, struct srb_cdmi_desc *desc); +int srb_cdmi_disconnect(srb_debug_t *dbg, struct srb_cdmi_desc *desc); -int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, +int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc *desc, uint64_t *size); -int srb_cdmi_getrange(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, +int srb_cdmi_getrange(srb_debug_t *dbg, struct srb_cdmi_desc *desc, uint64_t offset, int size); -int srb_cdmi_putrange(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, +int srb_cdmi_putrange(srb_debug_t *dbg, struct srb_cdmi_desc *desc, uint64_t offset, int size); #endif diff --git a/include/srb/srb-log.h b/include/srb/srb-log.h index 6e173e4..00e88ce 100644 --- a/include/srb/srb-log.h +++ b/include/srb/srb-log.h @@ -58,7 +58,7 @@ typedef struct srb_debug_s { #define SRB_LOGFMT_LVL(lvl) "[" SRB_LVLSTR_##lvl "]" #define SRB_LOGFMT_NAME DEV_NAME ": " #define SRB_LOGFMT_DEVICE "device %i: " -#define SRB_LOGARG_DEVICE(dev) (dev)->major +#define SRB_LOGARG_DEVICE(dev) srb_device_get_major(dev) #define SRB_LOGFMT_MODULE "%s: " #define SRB_LOGARG_MODULE(dbg) dbg ? (dbg)->name : NULL #define SRB_LOGFMT_DBG "@%s(l.%i): " @@ -133,22 +133,56 @@ typedef struct srb_debug_s { if (level >= SRB_EMERG) SRB_INTERNAL_DBG(EMERG, fmt, ##args) #define SRBDEV_LOG_DEBUG(dev, fmt, a...) \ - if ((dev)->debug.level >= SRB_DEBUG) SRBDEV_INTERNAL_DBG(DEBUG, dev, &((dev)->debug), fmt, ##a) + do { \ + const srb_debug_t *debug = srb_device_get_debug(dev); \ + if (debug->level >= SRB_DEBUG) SRBDEV_INTERNAL_DBG(DEBUG, dev, debug, fmt, ##a); \ + } while(0) #define SRBDEV_LOG_INFO(dev, fmt, a...) \ - if ((dev)->debug.level >= SRB_INFO) SRBDEV_INTERNAL_DBG(INFO, dev, &((dev)->debug), fmt, ##a) + do { \ + const srb_debug_t *debug = srb_device_get_debug(dev); \ + if (debug->level >= SRB_INFO) SRBDEV_INTERNAL_DBG(INFO, dev, debug, fmt, ##a) \ + } while(0) #define SRBDEV_LOG_NOTICE(dev, fmt, a...) \ - if ((dev)->debug.level >= SRB_NOTICE) SRBDEV_INTERNAL_DBG(NOTICE, dev, &((dev)->debug), fmt, ##a) + do { \ + const srb_debug_t *debug = srb_device_get_debug(dev); \ + if (debug->level >= SRB_NOTICE) SRBDEV_INTERNAL_DBG(NOTICE, dev, debug, fmt, ##a) \ + } while(0) #define SRBDEV_LOG_WARN(dev, fmt, a...) \ - if ((dev)->debug.level >= SRB_WARNING) SRBDEV_INTERNAL_DBG(WARNING, dev, &((dev)->debug), fmt, ##a) + do { \ + const srb_debug_t *debug = srb_device_get_debug(dev); \ + if (debug->level >= SRB_WARNING) SRBDEV_INTERNAL_DBG(WARNING, dev, debug, fmt, ##a) \ + } while(0) #define SRBDEV_LOG_ERR(dev, fmt, a...) \ - if ((dev)->debug.level >= SRB_ERR) SRBDEV_INTERNAL_DBG(ERR, dev, &((dev)->debug), fmt, ##a) + do { \ + const srb_debug_t *debug = srb_device_get_debug(dev); \ + if (debug->level >= SRB_ERR) SRBDEV_INTERNAL_DBG(ERR, dev, debug, fmt, ##a) \ + } while(0) #define SRBDEV_LOG_CRIT(dev, fmt, a...) \ - if ((dev)->debug.level >= SRB_CRIT) SRBDEV_INTERNAL_DBG(CRIT, dev, &((dev)->debug), fmt, ##a) + do { \ + const srb_debug_t *debug = srb_device_get_debug(dev); \ + if (debug->level >= SRB_CRIT) SRBDEV_INTERNAL_DBG(CRIT, dev, debug, fmt, ##a) \ + } while(0) #define SRBDEV_LOG_ALERT(dev, fmt, a...) \ - if ((dev)->debug.level >= SRB_ALERT) SRBDEV_INTERNAL_DBG(ALERT, dev, &((dev)->debug), fmt, ##a) + do { \ + const srb_debug_t *debug = srb_device_get_debug(dev); \ + if (debug->level >= SRB_ALERT) SRBDEV_INTERNAL_DBG(ALERT, dev, debug, fmt, ##a) \ + } while(0) #define SRBDEV_LOG_EMERG(dev, fmt, a...) \ - if ((dev)->debug.level >= SRB_EMERG) SRBDEV_INTERNAL_DBG(EMERG, dev, &((dev)->debug), fmt, ##a) - + do { \ + const srb_debug_t *debug = srb_device_get_debug(dev); \ + if (debug->level >= SRB_EMERG) SRBDEV_INTERNAL_DBG(EMERG, dev, debug, fmt, ##a) \ + } while(0) + +#if 0 +#define SRBDEV_LOG_DEBUG(dev, fmt, a...) +#define SRBDEV_LOG_INFO(dev, fmt, a...) +#define SRBDEV_LOG_NOTICE(dev, fmt, a...) +#define SRBDEV_LOG_WARN(dev, fmt, a...) +#define SRBDEV_LOG_ERR(dev, fmt, a...) +#define SRBDEV_LOG_CRIT(dev, fmt, a...) +#define SRBDEV_LOG_ALERT(dev, fmt, a...) +#define SRBDEV_LOG_EMERG(dev, fmt, a...) +#endif /* #define SRB_INFO(fmt, a...) \ diff --git a/srb/srb-cdmi.c b/srb/srb-cdmi.c index 633e790..445a32a 100644 --- a/srb/srb-cdmi.c +++ b/srb/srb-cdmi.c @@ -108,7 +108,7 @@ static int get_port(const char *url, int *port) * */ int srb_cdmi_init(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, + struct srb_cdmi_desc *desc, const char *url) { /* 1 1 */ @@ -168,7 +168,7 @@ int srb_cdmi_init(srb_debug_t *dbg, * Returns 0 if successfull or a negative value depending the error. */ int srb_cdmi_connect(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc) + struct srb_cdmi_desc *desc) { int ret; int arg = 1; @@ -244,7 +244,7 @@ int srb_cdmi_connect(srb_debug_t *dbg, * */ int srb_cdmi_disconnect(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc) + struct srb_cdmi_desc *desc) { if (!desc) return -EINVAL; @@ -264,7 +264,7 @@ int srb_cdmi_disconnect(srb_debug_t *dbg, * Send or receive packet. */ static int sock_xmit(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, + struct srb_cdmi_desc *desc, int send, void *buf, int size, int strict_receive) @@ -339,7 +339,7 @@ static int sock_xmit(srb_debug_t *dbg, } static int sock_send_receive(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, + struct srb_cdmi_desc *desc, int send_size, int rcv_size) { char *buff = desc->xmit_buff; @@ -437,7 +437,7 @@ static int sock_send_receive(srb_debug_t *dbg, } static int sock_send_sglist_receive(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, + struct srb_cdmi_desc *desc, int send_size, int rcv_size) { char *buff = desc->xmit_buff; @@ -563,7 +563,7 @@ static int sock_send_sglist_receive(srb_debug_t *dbg, } static int retried_send_receive(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, + struct srb_cdmi_desc *desc, int send_size, int rcv_size, int do_sglist, int attempts) { @@ -624,7 +624,7 @@ int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, } #endif -int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, +int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc *desc, uint64_t *size) { char *buff = desc->xmit_buff; @@ -667,7 +667,7 @@ int srb_cdmi_getsize(srb_debug_t *dbg, struct srb_cdmi_desc_s *desc, * at specified "offset" writing "size" bytes from "buff". */ int srb_cdmi_putrange(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, + struct srb_cdmi_desc *desc, uint64_t offset, int size) { char *xmit_buff = desc->xmit_buff; @@ -712,7 +712,7 @@ int srb_cdmi_putrange(srb_debug_t *dbg, * at specified "offset" reading "size" bytes from "buff". */ int srb_cdmi_getrange(srb_debug_t *dbg, - struct srb_cdmi_desc_s *desc, + struct srb_cdmi_desc *desc, uint64_t offset, int size) { char *xmit_buff = desc->xmit_buff; diff --git a/srb/srb-driver.c b/srb/srb-driver.c index 857e240..3f3c75b 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -52,9 +52,70 @@ MODULE_VERSION(DEV_REL_VERSION); typedef struct srb_server_s { struct srb_server_s *next; - struct srb_cdmi_desc_s cdmi_desc; + struct srb_cdmi_desc cdmi_desc; } srb_server_t; +struct srb_device { + /* Device subsystem related data */ + int id; /* device ID */ + int major; /* blkdev assigned major */ + + /* NOTE: use const from ./linux/genhd.h */ + char name[DISK_NAME_LEN]; /* blkdev name, e.g. srba */ + struct gendisk *disk; + uint64_t disk_size; /* Size in bytes */ + int users; /* Number of users who + * opened dev */ + enum device_state state; /* for create extend attach detach destroy purpose */ + + struct request_queue *q; + spinlock_t rq_lock; /* request queue lock */ + + struct task_struct **thread; /* allow dynamic allocation during device creation */ + int nb_threads; + + /* Dewpoint specific data */ + struct srb_cdmi_desc **thread_cdmi_desc; /* allow dynamic allocation during device creation*/ + + /* + ** List of requests received by the drivers, but still to be + ** processed. This due to network latency. + */ + spinlock_t waiting_lock; /* wait_queue lock */ + wait_queue_head_t waiting_wq; + struct list_head waiting_queue; /* Requests to be sent */ + + /* Debug traces */ + srb_debug_t debug; +}; + +const srb_debug_t * srb_device_get_debug(const struct srb_device *dev) { + return &dev->debug; +} + +int srb_device_get_major(const struct srb_device *dev) { + return dev->major; +} + +const char * srb_device_get_name(const struct srb_device *dev) { + return dev->name; +} + +int srb_device_get_debug_level(const struct srb_device *dev) { + return dev->debug.level; +} +void srb_device_set_debug_level(struct srb_device *dev, int level) { + dev->debug.level = level; +} + +struct srb_cdmi_desc * srb_device_get_thread_cdmi_desc(const struct srb_device *dev, int idx) { + return dev->thread_cdmi_desc[idx]; +} + +struct gendisk * srb_device_get_disk(const struct srb_device *dev) { + return dev->disk; +} + static srb_device_t devtab[DEV_MAX]; static srb_server_t *servers = NULL; static DEFINE_SPINLOCK(devtab_lock); @@ -264,8 +325,8 @@ static int req_flags_to_str(int flags, char *buff) /* * Handle an I/O request. */ -static int srb_xfer_scl(struct srb_device_s *dev, - struct srb_cdmi_desc_s *desc, +static int srb_xfer_scl(struct srb_device *dev, + struct srb_cdmi_desc *desc, struct request *req) { int ret = 0; @@ -310,7 +371,7 @@ static int srb_xfer_scl(struct srb_device_s *dev, /* * Free internal disk */ -static int srb_free_disk(struct srb_device_s *dev) +static int srb_free_disk(struct srb_device *dev) { struct gendisk *disk = NULL; @@ -338,7 +399,7 @@ static int srb_free_disk(struct srb_device_s *dev) */ static int srb_thread(void *data) { - struct srb_device_s *dev; + struct srb_device *dev; struct request *req; unsigned long flags; int th_id; @@ -350,9 +411,9 @@ static int srb_thread(void *data) #else struct bio_vec bvec; #endif - struct srb_cdmi_desc_s *cdmi_desc; + struct srb_cdmi_desc *cdmi_desc; - SRBDEV_LOG_DEBUG(((struct srb_device_s *)data), "Thread started with device %p", data); + SRBDEV_LOG_DEBUG(((struct srb_device *)data), "Thread started with device %p", data); dev = data; @@ -409,8 +470,8 @@ static int srb_thread(void *data) } /* Create scatterlist */ - cdmi_desc = dev->thread_cdmi_desc[th_id]; - sg_init_table(dev->thread_cdmi_desc[th_id]->sgl, DEV_NB_PHYS_SEGS); + cdmi_desc = srb_device_get_thread_cdmi_desc(dev, th_id); + sg_init_table(cdmi_desc->sgl, DEV_NB_PHYS_SEGS); dev->thread_cdmi_desc[th_id]->sgl_size = blk_rq_map_sg(dev->q, req, dev->thread_cdmi_desc[th_id]->sgl); SRBDEV_LOG_DEBUG(dev, "scatter_list size %d [nb_seg = %d," @@ -436,7 +497,7 @@ static int srb_thread(void *data) static void srb_rq_fn(struct request_queue *q) { - struct srb_device_s *dev = q->queuedata; + struct srb_device *dev = q->queuedata; struct request *req; unsigned long flags; @@ -501,7 +562,7 @@ static const struct block_device_operations srb_fops = .release = srb_release, }; -static int srb_init_disk(struct srb_device_s *dev) +static int srb_init_disk(struct srb_device *dev) { struct gendisk *disk = NULL; struct request_queue *q; @@ -640,7 +701,7 @@ static int srb_device_new(const char *devname, srb_device_t *dev) goto err_mem; } for (i = 0; i < thread_pool_size; i++) { - dev->thread_cdmi_desc[i] = vmalloc(sizeof(struct srb_cdmi_desc_s)); + dev->thread_cdmi_desc[i] = vmalloc(sizeof(struct srb_cdmi_desc)); if (dev->thread_cdmi_desc[i] == NULL) { SRB_LOG_CRIT(srb_log, "srb_device_new: Unable to allocate memory for CDMI struct, step %d", i); ret = -ENOMEM; @@ -886,7 +947,7 @@ static int _srb_server_new(srb_debug_t *dbg, const char *url, srb_server_t **ser * XXX NOTE XXX: #13 This function picks only one server that has enough free * space in the URL buffer to append the filename. */ -static int _srb_server_pick(const char *filename, struct srb_cdmi_desc_s *pick) +static int _srb_server_pick(const char *filename, struct srb_cdmi_desc *pick) { char url[SRB_CDMI_URL_SIZE]; char name[SRB_CDMI_URL_SIZE]; @@ -906,7 +967,7 @@ static int _srb_server_pick(const char *filename, struct srb_cdmi_desc_s *pick) filename); SRB_LOG_INFO(srb_log, "Dewb reconstruct url yielded %s, %i", url, ret); if (ret == 0) { - memcpy(pick, &server->cdmi_desc, sizeof(struct srb_cdmi_desc_s)); + memcpy(pick, &server->cdmi_desc, sizeof(struct srb_cdmi_desc)); strncpy(pick->url, url, SRB_CDMI_URL_SIZE); strncpy(pick->filename, name, SRB_CDMI_URL_SIZE); SRB_LOG_INFO(srb_log, "Copied into pick: url=%s, name=%s", pick->url, pick->filename); @@ -1110,7 +1171,7 @@ int srb_device_detach(const char *devname) int ret = 0; int i; int found = 0; - struct srb_device_s *dev = NULL; + struct srb_device *dev = NULL; SRB_LOG_INFO(srb_log, "srb_device_detach: detaching device name %s", devname); @@ -1170,7 +1231,7 @@ int srb_device_attach(const char *filename, const char *devname) int rc = 0; unsigned int i; int do_unregister = 0; - struct srb_cdmi_desc_s *cdmi_desc = NULL; + struct srb_cdmi_desc *cdmi_desc = NULL; int found = 0; const char *fname; @@ -1220,7 +1281,7 @@ int srb_device_attach(const char *filename, const char *devname) SRB_LOG_INFO(srb_log, "Volume %s not attached yet, using device slot %d", filename, dev->id); - cdmi_desc = vmalloc(sizeof(struct srb_cdmi_desc_s)); + cdmi_desc = vmalloc(sizeof(struct srb_cdmi_desc)); if (cdmi_desc == NULL) { SRB_LOG_ERR(srb_log, "Unable to allocate memory for cdmi struct"); rc = -ENOMEM; @@ -1260,7 +1321,7 @@ int srb_device_attach(const char *filename, const char *devname) for (i = 0; i < thread_pool_size; i++) { memcpy(dev->thread_cdmi_desc[i], cdmi_desc, - sizeof(struct srb_cdmi_desc_s)); + sizeof(struct srb_cdmi_desc)); } rc = register_blkdev(0, DEV_NAME); if (rc < 0) { diff --git a/srb/srb-sysfs.c b/srb/srb-sysfs.c index 28b2b6d..d38b70c 100644 --- a/srb/srb-sysfs.c +++ b/srb/srb-sysfs.c @@ -61,7 +61,7 @@ static ssize_t attr_debug_store(struct device *dv, const char *buff, size_t count) { struct gendisk *disk = dev_to_disk(dv); - struct srb_device_s *dev = disk->private_data; + struct srb_device *dev = disk->private_data; long int val; int ret; @@ -73,12 +73,12 @@ static ssize_t attr_debug_store(struct device *dv, if ((int)val < 0 || (int)val > 7) { SRBDEV_LOG_WARN(dev, "Invalid debug value (%d) for device %s in sysfs", - (int)val, dev->name); + (int)val, srb_device_get_name(dev)); return -EINVAL; } - dev->debug.level = (int)val; - SRBDEV_LOG_DEBUG(dev, "Setting Log level to %d for device %s", (int)val, dev->name); + srb_device_set_debug_level(dev, (int)val); + SRBDEV_LOG_DEBUG(dev, "Setting Log level to %d for device %s", (int)val, srb_device_get_name(dev)); return count; } @@ -87,9 +87,9 @@ static ssize_t attr_debug_show(struct device *dv, struct device_attribute *attr, char *buff) { struct gendisk *disk = dev_to_disk(dv); - struct srb_device_s *dev = disk->private_data; + struct srb_device *dev = disk->private_data; - return scnprintf(buff, PAGE_SIZE, "%d\n", dev->debug.level); + return scnprintf(buff, PAGE_SIZE, "%d\n", srb_device_get_debug_level(dev)); } @@ -97,20 +97,20 @@ static ssize_t attr_urls_show(struct device *dv, struct device_attribute *attr, char *buff) { struct gendisk *disk = dev_to_disk(dv); - struct srb_device_s *dev = disk->private_data; + struct srb_device *dev = disk->private_data; //snprintf(buff, PAGE_SIZE, "%s\n", dev->thread_cdmi_desc[0].url); - return scnprintf(buff, PAGE_SIZE, "%s\n", dev->thread_cdmi_desc[0]->url); + return scnprintf(buff, PAGE_SIZE, "%s\n", srb_device_get_thread_cdmi_desc(dev, 0)->url); } static ssize_t attr_disk_name_show(struct device *dv, struct device_attribute *attr, char *buff) { struct gendisk *disk = dev_to_disk(dv); - struct srb_device_s *dev = disk->private_data; + struct srb_device *dev = disk->private_data; //snprintf(buff, PAGE_SIZE, "%s\n", kbasename(dev->thread_cdmi_desc[0].url)); - return scnprintf(buff, PAGE_SIZE, "%s\n", kbasename(dev->thread_cdmi_desc[0]->url)); + return scnprintf(buff, PAGE_SIZE, "%s\n", kbasename(srb_device_get_thread_cdmi_desc(dev, 0)->url)); } static DEVICE_ATTR(srb_debug, S_IWUSR | S_IRUGO, &attr_debug_show, &attr_debug_store); @@ -372,11 +372,13 @@ static ssize_t class_srb_urls_show(struct class *c, struct class_attribute *attr return ret; } -void srb_sysfs_device_init(srb_device_t *dev) +void srb_sysfs_device_init(struct srb_device *dev) { - device_create_file(disk_to_dev(dev->disk), &dev_attr_srb_debug); - device_create_file(disk_to_dev(dev->disk), &dev_attr_srb_urls); - device_create_file(disk_to_dev(dev->disk), &dev_attr_srb_name); + struct gendisk *disk = srb_device_get_disk(dev); + + device_create_file(disk_to_dev(disk), &dev_attr_srb_debug); + device_create_file(disk_to_dev(disk), &dev_attr_srb_urls); + device_create_file(disk_to_dev(disk), &dev_attr_srb_name); } static struct class_attribute class_srb_attrs[] = { diff --git a/srb/srb.h b/srb/srb.h index 9cc3ed7..cb350be 100644 --- a/srb/srb.h +++ b/srb/srb.h @@ -46,39 +46,6 @@ enum device_state { extern unsigned short srb_log; extern unsigned short nb_req_retries; -typedef struct srb_device_s { - /* Device subsystem related data */ - int id; /* device ID */ - int major; /* blkdev assigned major */ - - /* NOTE: use const from ./linux/genhd.h */ - char name[DISK_NAME_LEN]; /* blkdev name, e.g. srba */ - struct gendisk *disk; - uint64_t disk_size; /* Size in bytes */ - int users; /* Number of users who - * opened dev */ - enum device_state state; /* for create extend attach detach destroy purpose */ - - struct request_queue *q; - spinlock_t rq_lock; /* request queue lock */ - - struct task_struct **thread; /* allow dynamic allocation during device creation */ - int nb_threads; - - /* Dewpoint specific data */ - struct srb_cdmi_desc_s **thread_cdmi_desc; /* allow dynamic allocation during device creation*/ - - /* - ** List of requests received by the drivers, but still to be - ** processed. This due to network latency. - */ - spinlock_t waiting_lock; /* wait_queue lock */ - wait_queue_head_t waiting_wq; - struct list_head waiting_queue; /* Requests to be sent */ - - /* Debug traces */ - srb_debug_t debug; -} srb_device_t; /* srb.c */ int srb_device_attach(const char *filename, const char *devname); @@ -88,6 +55,16 @@ int srb_server_add(const char *url); int srb_server_remove(const char *url); ssize_t srb_servers_dump(char *buf, ssize_t max_size); +struct srb_device; +typedef struct srb_device srb_device_t; +const srb_debug_t * srb_device_get_debug(const struct srb_device *dev); +int srb_device_get_debug_level(const struct srb_device *dev); +int srb_device_get_major(const struct srb_device *dev); +const char * srb_device_get_name(const struct srb_device *dev); +void srb_device_set_debug_level(struct srb_device *dev, int level); +struct srb_cdmi_desc * srb_device_get_thread_cdmi_desc(const struct srb_device *dev, int idx); +struct gendisk * srb_device_get_disk(const struct srb_device *dev); + /* srb_sysfs.c*/ int srb_sysfs_init(void); void srb_sysfs_device_init(srb_device_t *dev); From ba9f9a2d461432d6580ba16e7fb82d15db916b2b Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Sun, 15 Feb 2015 00:48:14 +0100 Subject: [PATCH 23/28] Further cleanup of `srb/srb.h` --- srb/srb-driver.c | 6 ++++++ srb/srb.h | 7 ------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/srb/srb-driver.c b/srb/srb-driver.c index 3f3c75b..3e6a852 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -55,6 +55,12 @@ typedef struct srb_server_s { struct srb_cdmi_desc cdmi_desc; } srb_server_t; +/* Device state (reduce spinlock section and avoid multiple operation on same device) */ +enum device_state { + DEV_IN_USE, + DEV_UNUSED, +}; + struct srb_device { /* Device subsystem related data */ int id; /* device ID */ diff --git a/srb/srb.h b/srb/srb.h index cb350be..54ac1aa 100644 --- a/srb/srb.h +++ b/srb/srb.h @@ -34,19 +34,12 @@ #define DEV_SECTORSIZE SRB_DEV_SECTORSIZE #define DEV_NB_PHYS_SEGS SRB_DEV_NB_PHYS_SEGS -/* Device state (reduce spinlock section and avoid multiple operation on same device) */ -enum device_state { - DEV_IN_USE, - DEV_UNUSED, -}; - /* * Linux Kernel Module (LKM) parameters */ extern unsigned short srb_log; extern unsigned short nb_req_retries; - /* srb.c */ int srb_device_attach(const char *filename, const char *devname); int srb_device_detach(const char *devname); From 65553ad59e4a7e38fec28e0c8c10449c85eed164 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 26 Mar 2015 12:40:32 +0100 Subject: [PATCH 24/28] Simplify `Makefile` --- Makefile | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 84fcea3..62fceea 100644 --- a/Makefile +++ b/Makefile @@ -19,14 +19,5 @@ KDIR ?= /lib/modules/$(shell uname -r)/build default: modules -modules: - $(MAKE) -C $(KDIR) M=$$PWD $@ - -modules_install: - $(MAKE) -C $(KDIR) M=$$PWD $@ - -clean: - $(MAKE) -C $(KDIR) M=$$PWD $@ - -help: +modules modules_install clean help: $(MAKE) -C $(KDIR) M=$$PWD $@ From 0b56e85ae8a2537e2d7d07baf3812bea276643e4 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 26 Mar 2015 14:19:13 +0100 Subject: [PATCH 25/28] Add ftrace support files --- include/srb/srb-trace.h | 34 ++++++++++++++++++++++++++++++++++ srb/Kbuild | 2 +- srb/srb-trace.c | 22 ++++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 include/srb/srb-trace.h create mode 100644 srb/srb-trace.c diff --git a/include/srb/srb-trace.h b/include/srb/srb-trace.h new file mode 100644 index 0000000..f09179c --- /dev/null +++ b/include/srb/srb-trace.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2015 Scality SA - http://www.scality.com + * + * This file is part of ScalityRestBlock. + * + * ScalityRestBlock 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, either version 3 of the License, or + * (at your option) any later version. + * + * ScalityRestBlock 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 ScalityRestBlock. If not, see . + * + */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM srb + +#if !defined(_SRB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) +#define _SRB_TRACE_H + +#include + +#endif /* _SRB_TRACE_H */ + +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH srb/ +#define TRACE_INCLUDE_FILE srb-trace +#include diff --git a/srb/Kbuild b/srb/Kbuild index 5443fe0..3141c98 100644 --- a/srb/Kbuild +++ b/srb/Kbuild @@ -1,6 +1,6 @@ obj-m := srb.o -srb-y := srb-driver.o srb-sysfs.o srb-cdmi.o srb-http.o +srb-y := srb-driver.o srb-sysfs.o srb-cdmi.o srb-http.o srb-trace.o EXTRA_CFLAGS := -ggdb3 -Wall -Wextra -Werror -Wno-unused-parameter -I$(src)/../include diff --git a/srb/srb-trace.c b/srb/srb-trace.c new file mode 100644 index 0000000..885bd33 --- /dev/null +++ b/srb/srb-trace.c @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2015 Scality SA - http://www.scality.com + * + * This file is part of ScalityRestBlock. + * + * ScalityRestBlock 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, either version 3 of the License, or + * (at your option) any later version. + * + * ScalityRestBlock 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 ScalityRestBlock. If not, see . + * + */ + +#define CREATE_TRACE_POINTS +#include From f000f60fed15b73a17d496395416e9e9b6ae8f7d Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 26 Mar 2015 15:17:43 +0100 Subject: [PATCH 26/28] Use `atomic_t` for reference counting --- srb/srb-driver.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/srb/srb-driver.c b/srb/srb-driver.c index 3e6a852..9820ba7 100644 --- a/srb/srb-driver.c +++ b/srb/srb-driver.c @@ -70,7 +70,7 @@ struct srb_device { char name[DISK_NAME_LEN]; /* blkdev name, e.g. srba */ struct gendisk *disk; uint64_t disk_size; /* Size in bytes */ - int users; /* Number of users who + atomic_t users; /* Number of users who * opened dev */ enum device_state state; /* for create extend attach detach destroy purpose */ @@ -540,7 +540,7 @@ static int srb_open(struct block_device *bdev, fmode_t mode) goto out; } - dev->users++; + atomic_inc(&dev->users); out: spin_unlock(&devtab_lock); return ret; @@ -557,7 +557,7 @@ static void srb_release(struct gendisk *disk, fmode_t mode) dev = disk->private_data; SRBDEV_LOG_INFO(dev, "Releasing device (%s)", disk->disk_name); spin_lock(&devtab_lock); - dev->users--; + atomic_dec(&dev->users); spin_unlock(&devtab_lock); } @@ -692,7 +692,7 @@ static int srb_device_new(const char *devname, srb_device_t *dev) */ dev->debug.name = &dev->name[0]; dev->debug.level = srb_log; - dev->users = 0; + atomic_set(&dev->users, 0); strncpy(dev->name, devname, strlen(devname)); /* XXX: dynamic allocation of thread pool and cdmi connection pool @@ -804,7 +804,7 @@ static int _srb_reconstruct_url(char *url, char *name, static int __srb_device_detach(srb_device_t *dev) { - unsigned int i; + unsigned int i, users = 0; int ret = 0; SRB_LOG_DEBUG(srb_log, "detaching device (%p)", dev); @@ -816,8 +816,9 @@ static int __srb_device_detach(srb_device_t *dev) SRBDEV_LOG_DEBUG(dev, "Detaching device (%s)", dev->name); - if (dev->users > 0) { - SRBDEV_LOG_ERR(dev, "Unable to remove, device still opened (#users: %d)", dev->users); + users = atomic_read(&dev->users); + if (users > 0) { + SRBDEV_LOG_ERR(dev, "Unable to remove, device still opened (#users: %d)", users); return -EBUSY; } @@ -1189,7 +1190,7 @@ int srb_device_detach(const char *devname) if (strcmp(devname, devtab[i].name) == 0) { found = 1; dev = &devtab[i]; - if (devtab[i].users > 0) + if (atomic_read(&devtab[i].users) > 0) ret = -EBUSY; else if (devtab[i].state == DEV_IN_USE) { ret = -EBUSY; From 867ad5ad01b56c4f0e11a662e51f0788bbc3744d Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 26 Mar 2015 15:20:12 +0100 Subject: [PATCH 27/28] Remove unused `srb_http_mkhead` --- include/srb/srb-http.h | 1 - srb/srb-http.c | 43 ------------------------------------------ 2 files changed, 44 deletions(-) diff --git a/include/srb/srb-http.h b/include/srb/srb-http.h index f9e707a..5e1c81c 100644 --- a/include/srb/srb-http.h +++ b/include/srb/srb-http.h @@ -85,7 +85,6 @@ enum srb_http_statuscode }; int srb_http_check_response_complete(char *buff, int len); -int srb_http_mkhead(char *buff, int len, char *host, char *page); int srb_http_mkrange(char *cmd, char *buff, int len, char *host, char *page, uint64_t start, uint64_t end); diff --git a/srb/srb-http.c b/srb/srb-http.c index dbb09a0..537f447 100644 --- a/srb/srb-http.c +++ b/srb/srb-http.c @@ -179,49 +179,6 @@ int srb_http_check_response_complete(char *buff, int len) } EXPORT_SYMBOL(srb_http_check_response_complete); -int srb_http_mkhead(char *buff, int len, char *host, char *page) -{ - char *bufp = buff; - int mylen = len; - int ret; - - *buff = 0; - ret = add_buffer(&bufp, &mylen, "HEAD "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, page); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, " " HTTP_VER CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_KEEPALIVE CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_USER_AGENT CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, "Host: "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, host); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, CRLF CRLF); - if (ret) - return -ENOMEM; - - return (len - mylen); -} -EXPORT_SYMBOL(srb_http_mkhead); - int srb_http_mkcreate(char *buff, int len, char *host, char *page) { char *bufp = buff; From ad8a1631bf6e1bc6820f82bfdcbc33059b192773 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 26 Mar 2015 15:25:42 +0100 Subject: [PATCH 28/28] Remove unused `srb_http_{mkcreate|mktruncate|mkdelete}` --- include/srb/srb-http.h | 4 -- srb/srb-http.c | 148 ----------------------------------------- 2 files changed, 152 deletions(-) diff --git a/include/srb/srb-http.h b/include/srb/srb-http.h index 5e1c81c..65bf3ca 100644 --- a/include/srb/srb-http.h +++ b/include/srb/srb-http.h @@ -88,10 +88,6 @@ int srb_http_check_response_complete(char *buff, int len); int srb_http_mkrange(char *cmd, char *buff, int len, char *host, char *page, uint64_t start, uint64_t end); -int srb_http_mkcreate(char *buff, int len, char *host, char *page); -int srb_http_mktruncate(char *buff, int len, char *host, char *page, - unsigned long long size); -int srb_http_mkdelete(char *buff, int len, char *host, char *page); int srb_http_header_get_uint64(char *buff, int len, char *key, uint64_t *value); int srb_http_skipheader(char **buff, int *len); diff --git a/srb/srb-http.c b/srb/srb-http.c index 537f447..2ff4f52 100644 --- a/srb/srb-http.c +++ b/srb/srb-http.c @@ -179,154 +179,6 @@ int srb_http_check_response_complete(char *buff, int len) } EXPORT_SYMBOL(srb_http_check_response_complete); -int srb_http_mkcreate(char *buff, int len, char *host, char *page) -{ - char *bufp = buff; - int mylen = len; - int ret; - - *buff = 0; - ret = add_buffer(&bufp, &mylen, "PUT "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, page); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, " " HTTP_VER CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_KEEPALIVE CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_USER_AGENT CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, "Host: "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, host); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, "If-None-Match: *"); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, CRLF CRLF); - if (ret) - return -ENOMEM; - - return (len - mylen); -} -EXPORT_SYMBOL(srb_http_mkcreate); - -int srb_http_mktruncate(char *buff, int len, char *host, char *page, unsigned long long size) -{ - char *bufp = buff; - int mylen = len; - char buf[64]; - int ret; - - *buff = 0; - ret = add_buffer(&bufp, &mylen, "PUT "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, page); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, " " HTTP_VER CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_KEEPALIVE CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_USER_AGENT CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, "Host: "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, host); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, CRLF); - if (ret) - return -ENOMEM; - - sprintf(buf, "%s: %llu", HTTP_TRUNCATE, size); - - ret = add_buffer(&bufp, &mylen, buf); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, CRLF CRLF); - if (ret) - return -ENOMEM; - - return (len - mylen); -} -EXPORT_SYMBOL(srb_http_mktruncate); - -int srb_http_mkdelete(char *buff, int len, char *host, char *page) -{ - char *bufp = buff; - int mylen = len; - int ret; - - *buff = 0; - ret = add_buffer(&bufp, &mylen, "DELETE "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, page); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, " " HTTP_VER CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_KEEPALIVE CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, HTTP_USER_AGENT CRLF); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, "Host: "); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, host); - if (ret) - return -ENOMEM; - - ret = add_buffer(&bufp, &mylen, CRLF CRLF); - if (ret) - return -ENOMEM; - - return (len - mylen); -} -EXPORT_SYMBOL(srb_http_mkdelete); - int srb_http_mkmetadata(char *buff, int len, char *host, char *page) { char *bufp = buff;