From: <n-...@us...> - 2012-02-08 09:23:52
|
Revision: 5887 http://gfarm.svn.sourceforge.net/gfarm/?rev=5887&view=rev Author: n-soda Date: 2012-02-08 09:23:40 +0000 (Wed, 08 Feb 2012) Log Message: ----------- merge r5886 from the main trunk: * implement #329 - gfs_seekdir() and gfs_telldir() * add one more sanity check to GFM_PROTO_SEEK handler of gfmd Revision Links: -------------- http://gfarm.svn.sourceforge.net/gfarm/?rev=5886&view=rev Modified Paths: -------------- gfarm_v2/branches/2.5/doc/internal/ja/gfarm-v2-protocol-gfm.txt gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dir.c gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dir.h gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dircache.c gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dirplusxattr.c gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dirplusxattr.h gfarm_v2/branches/2.5/regress/Makefile gfarm_v2/branches/2.5/regress/schedule gfarm_v2/branches/2.5/server/gfmd/fs.c Added Paths: ----------- gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh Removed Paths: ------------- gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh Property Changed: ---------------- gfarm_v2/branches/2.5/ gfarm_v2/branches/2.5/gftool/gfgroup/gfgroup.c Property changes on: gfarm_v2/branches/2.5 ___________________________________________________________________ Modified: svn:mergeinfo - /gfarm_v2/branches/2.4:5271,5275-5281,5290,5329 /gfarm_v2/trunk:5598,5616-5624,5627-5628,5641-5647,5650,5653,5657-5666,5670,5674,5683-5685,5693,5695-5696,5699,5719-5720,5727,5729-5730,5775,5793,5799,5808-5809,5821,5825,5827-5831,5839-5842,5844-5849,5863-5864,5868,5870,5874-5878 + /gfarm_v2/branches/2.4:5271,5275-5281,5290,5329 /gfarm_v2/trunk:5598,5616-5624,5627-5628,5641-5647,5650,5653,5657-5666,5670,5674,5683-5685,5693,5695-5696,5699,5719-5720,5727,5729-5730,5775,5793,5799,5808-5809,5821,5825,5827-5831,5839-5842,5844-5849,5863-5864,5868,5870,5874-5878,5886 Modified: gfarm_v2/branches/2.5/doc/internal/ja/gfarm-v2-protocol-gfm.txt =================================================================== --- gfarm_v2/branches/2.5/doc/internal/ja/gfarm-v2-protocol-gfm.txt 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/doc/internal/ja/gfarm-v2-protocol-gfm.txt 2012-02-08 09:23:40 UTC (rev 5887) @@ -269,6 +269,11 @@ l:offset \xA2\xA8 current file descriptor \xA4\xAC\xA5ǥ\xA3\xA5쥯\xA5ȥ꤫\xA4ɤ\xA6\xA4\xAB\xA4\xBA\xA4\xB9\xA4롣 \xA5ǥ\xA3\xA5쥯\xA5ȥ\xEA\xA4Ǥʤ\xB1\xA4\xEC\xA4\xD0 GFARM_ERR_NOT_A_DIRECTORY \xA4\xF2\xCA֤\xB9\xA1\xA3 + \xA2\xA8 offset \xA4ϡ\xA2UNIX semantics \xA4Ȥϰۤꡢopaque \xA4ǤϤʤ\xA4\xA1\xA3 + gfs_seekdir()/gfs_telldir() \xA4θ\xBD\xBAߤμ\xC2\xC1\xF5\xA4Ǥϡ\xA2offset \xA4\xAC\xA1\xA2 + \xA5ǥ\xA3\xA5쥯\xA5ȥ\xEA\xC0\xE8Ƭ\xA4\xAB\xA4\xE9\xBF\x{124A24}\xBF\xCD\xD7\xC1ǿ\xF4\xA4Ǥ\xA2\xA4\xEB\xBB\xF6\xBC¤\xF2\xCD\xF8\xCDѤ\xB7\xA4Ƥ\xA4\xA4롣 + \xA4⤷\xA5ץ\xED\xA5ȥ\xB3\xA5\xEB\xB2\xFE\xC4\xFB\xA4\xF2\xB9Ԥʤ\xA6\xB5\xA1\xB2\xA2\xA4\xEC\xA4С\xA2GETDIRENT\xB7ϥץ\xED\xA5ȥ\xB3\xA5\xEB\xA4\xCE + \xCC\xE1\xA4\xEA\xC3ͤ\xCB d_off \xA4\xF2\xB2ä\xA8\xA4\xBF\xBE\xE5\xA4ǡ\xA2offset \xA4\xF2 opaque \xA4Ȥ\xB7\xA4\xBF\xA4\xA4\xA1\xA3 GFM_PROTO_GETDIRENTSPLUS \xB0\xC5\xCCۤ\xCE\xC6\xFE\xCE\xCF: i:current file descriptor (target directory) Property changes on: gfarm_v2/branches/2.5/gftool/gfgroup/gfgroup.c ___________________________________________________________________ Modified: svn:mergeinfo - /gfarm_v2/branches/2.4/gftool/gfgroup/gfgroup.c:5271,5275-5281,5290,5329,5335 /gfarm_v2/trunk/gftool/gfgroup/gfgroup.c:5598,5616-5624,5627-5628,5641-5647,5650,5653,5657-5666,5670,5674,5683-5685,5693,5695-5696,5699,5719-5720,5727,5729-5730,5775,5793,5799,5808-5809,5821,5827-5831,5839-5842,5844-5849,5863-5864,5868,5870,5874-5878 + /gfarm_v2/branches/2.4/gftool/gfgroup/gfgroup.c:5271,5275-5281,5290,5329,5335 /gfarm_v2/trunk/gftool/gfgroup/gfgroup.c:5598,5616-5624,5627-5628,5641-5647,5650,5653,5657-5666,5670,5674,5683-5685,5693,5695-5696,5699,5719-5720,5727,5729-5730,5775,5793,5799,5808-5809,5821,5827-5831,5839-5842,5844-5849,5863-5864,5868,5870,5874-5878,5886 Modified: gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dir.c =================================================================== --- gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dir.c 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dir.c 2012-02-08 09:23:40 UTC (rev 5887) @@ -181,8 +181,10 @@ struct gfm_connection *gfm_server; int fd; + struct gfs_dirent buffer[DIRENTS_BUFCOUNT]; int n, index; + gfarm_off_t seek_pos; }; static gfarm_error_t @@ -216,8 +218,10 @@ { struct gfs_dir_internal *dir = (struct gfs_dir_internal *)super; gfarm_error_t e; + int n; if (dir->index >= dir->n) { + n = dir->n; e = gfm_client_compound_fd_op(dir->gfm_server, dir->fd, gfm_getdirents_request, gfm_getdirents_result, NULL, dir); if (e != GFARM_ERR_NO_ERROR) { @@ -227,11 +231,12 @@ return (e); } + dir->seek_pos += n; + dir->index = 0; if (dir->n == 0) { *entry = NULL; return (GFARM_ERR_NO_ERROR); } - dir->index = 0; } *entry = &dir->buffer[dir->index++]; return (GFARM_ERR_NO_ERROR); @@ -249,24 +254,68 @@ } gfarm_error_t -gfs_seekdir_unimpl(GFS_Dir dir, gfarm_off_t off) +gfm_seekdir_request(struct gfm_connection *gfm_server, void *closure) { - gflog_debug(GFARM_MSG_1001271, - "Not implemented: %s", - gfarm_error_string(GFARM_ERR_FUNCTION_NOT_IMPLEMENTED)); - return (GFARM_ERR_FUNCTION_NOT_IMPLEMENTED); /* XXX FIXME */ + struct gfm_seekdir_closure *c = closure; + gfarm_error_t e = gfm_client_seek_request(gfm_server, + c->offset, c->whence); + + if (e != GFARM_ERR_NO_ERROR) + gflog_warning(GFARM_MSG_UNFIXED, + "seek request: %s", gfarm_error_string(e)); + return (e); } gfarm_error_t -gfs_telldir_unimpl(GFS_Dir dir, gfarm_off_t *offp) +gfm_seekdir_result(struct gfm_connection *gfm_server, void *closure) { - gflog_debug(GFARM_MSG_1001272, - "Not implemented: %s", - gfarm_error_string(GFARM_ERR_FUNCTION_NOT_IMPLEMENTED)); - return (GFARM_ERR_FUNCTION_NOT_IMPLEMENTED); /* XXX FIXME */ + struct gfm_seekdir_closure *c = closure; + gfarm_error_t e = gfm_client_seek_result(gfm_server, + &c->offset); + + if (e != GFARM_ERR_NO_ERROR) + gflog_warning(GFARM_MSG_UNFIXED, + "seek result: %s", gfarm_error_string(e)); + return (e); } static gfarm_error_t +gfs_seekdir_internal(GFS_Dir super, gfarm_off_t off) +{ + struct gfs_dir_internal *dir = (struct gfs_dir_internal *)super; + gfarm_error_t e; + struct gfm_seekdir_closure closure; + + if (dir->seek_pos <= off && off <= dir->seek_pos + dir->n) { + dir->index = off - dir->seek_pos; + return (GFARM_ERR_NO_ERROR); + } + + closure.offset = off; + closure.whence = 0; + e = gfm_client_compound_fd_op(dir->gfm_server, dir->fd, + gfm_seekdir_request, gfm_seekdir_result, NULL, &closure); + if (e != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_UNFIXED, + "gfm_client_compound_fd_op_readonly(seek): %s", + gfarm_error_string(e)); + return (e); + } + dir->n = dir->index = 0; /* purge dir->buffer */ + dir->seek_pos = closure.offset; + return (GFARM_ERR_NO_ERROR); +} + +static gfarm_error_t +gfs_telldir_internal(GFS_Dir super, gfarm_off_t *offp) +{ + struct gfs_dir_internal *dir = (struct gfs_dir_internal *)super; + + *offp = dir->seek_pos + dir->index; + return (GFARM_ERR_NO_ERROR); +} + +static gfarm_error_t gfs_dir_alloc(struct gfm_connection *gfm_server, gfarm_int32_t fd, GFS_Dir *dirp) { @@ -274,8 +323,8 @@ static struct gfs_dir_ops ops = { gfs_closedir_internal, gfs_readdir_internal, - gfs_seekdir_unimpl, - gfs_telldir_unimpl + gfs_seekdir_internal, + gfs_telldir_internal }; GFARM_MALLOC(dir); @@ -289,9 +338,11 @@ dir->super.ops = &ops; dir->gfm_server = gfm_server; dir->fd = fd; - dir->n = 0; - dir->index = 0; + dir->n = dir->index = 0; + dir->seek_pos = 0; + + *dirp = &dir->super; return (GFARM_ERR_NO_ERROR); } Modified: gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dir.h =================================================================== --- gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dir.h 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dir.h 2012-02-08 09:23:40 UTC (rev 5887) @@ -9,5 +9,9 @@ struct gfs_dir_ops *ops; }; -gfarm_error_t gfs_seekdir_unimpl(GFS_Dir, gfarm_off_t); -gfarm_error_t gfs_telldir_unimpl(GFS_Dir, gfarm_off_t *); +struct gfm_seekdir_closure { + gfarm_off_t offset; + gfarm_int32_t whence; +}; +gfarm_error_t gfm_seekdir_request(struct gfm_connection *, void *); +gfarm_error_t gfm_seekdir_result(struct gfm_connection *, void *); Modified: gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dircache.c =================================================================== --- gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dircache.c 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dircache.c 2012-02-08 09:23:40 UTC (rev 5887) @@ -799,6 +799,22 @@ } static gfarm_error_t +gfs_seekdir_caching_internal(GFS_Dir super, gfarm_off_t off) +{ + struct gfs_dir_caching *dir = (struct gfs_dir_caching *)super; + + return (gfs_seekdirplusxattr(dir->dp, off)); +} + +static gfarm_error_t +gfs_telldir_caching_internal(GFS_Dir super, gfarm_off_t *offp) +{ + struct gfs_dir_caching *dir = (struct gfs_dir_caching *)super; + + return (gfs_telldirplusxattr(dir->dp, offp)); +} + +static gfarm_error_t gfs_closedir_caching_internal(GFS_Dir super) { struct gfs_dir_caching *dir = (struct gfs_dir_caching *)super; @@ -819,8 +835,8 @@ static struct gfs_dir_ops ops = { gfs_closedir_caching_internal, gfs_readdir_caching_internal, - gfs_seekdir_unimpl, - gfs_telldir_unimpl + gfs_seekdir_caching_internal, + gfs_telldir_caching_internal }; if ((e = gfs_opendirplusxattr(path, &dp)) != GFARM_ERR_NO_ERROR) { Modified: gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dirplusxattr.c =================================================================== --- gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dirplusxattr.c 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dirplusxattr.c 2012-02-08 09:23:40 UTC (rev 5887) @@ -9,6 +9,7 @@ #include "gfm_client.h" #include "lookup.h" #include "gfs_io.h" +#include "gfs_dir.h" /* gfm_seekdir_{request,result}() */ #include "gfs_dirplusxattr.h" /* @@ -20,6 +21,7 @@ struct gfs_dirplusxattr { struct gfm_connection *gfm_server; int fd; + struct gfs_dirent buffer[DIRENTSPLUSXATTR_BUFCOUNT]; struct gfs_stat stbuf[DIRENTSPLUSXATTR_BUFCOUNT]; int nattrbuf[DIRENTSPLUSXATTR_BUFCOUNT]; @@ -27,6 +29,7 @@ void **attrvaluebuf[DIRENTSPLUSXATTR_BUFCOUNT]; size_t *attrsizebuf[DIRENTSPLUSXATTR_BUFCOUNT]; int n, index; + gfarm_off_t seek_pos; }; static gfarm_error_t @@ -45,7 +48,9 @@ dir->gfm_server = gfm_server; dir->fd = fd; + dir->n = dir->index = 0; + dir->seek_pos = 0; *dirp = dir; return (GFARM_ERR_NO_ERROR); @@ -151,8 +156,10 @@ char ***attrnamesp, void ***attrvaluesp, size_t **attrsizesp) { gfarm_error_t e; + int n; if (dir->index >= dir->n) { + n = dir->n; gfs_dirplusxattr_clear(dir); e = gfm_client_compound_fd_op(dir->gfm_server, dir->fd, gfm_getdirentsplusxattr_request, @@ -165,12 +172,13 @@ gfarm_error_string(e)); return (e); } + + dir->seek_pos += n; if (dir->n == 0) { *entry = NULL; *status = NULL; return (GFARM_ERR_NO_ERROR); } - dir->index = 0; } *entry = &dir->buffer[dir->index]; *status = &dir->stbuf[dir->index]; @@ -190,6 +198,38 @@ } gfarm_error_t +gfs_seekdirplusxattr(GFS_DirPlusXAttr dir, gfarm_off_t off) +{ + gfarm_error_t e; + struct gfm_seekdir_closure closure; + + if (dir->seek_pos <= off && off <= dir->seek_pos + dir->n) { + dir->index = off - dir->seek_pos; + return (GFARM_ERR_NO_ERROR); + } + + closure.offset = off; + closure.whence = 0; + e = gfm_client_compound_fd_op(dir->gfm_server, dir->fd, + gfm_seekdir_request, gfm_seekdir_result, NULL, &closure); + if (e != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_UNFIXED, + "gfm_client_compound_fd_op_readonly(seek): %s", + gfarm_error_string(e)); + } + gfs_dirplusxattr_clear(dir); + dir->seek_pos = closure.offset; + return (e); +} + +gfarm_error_t +gfs_telldirplusxattr(GFS_DirPlusXAttr dir, gfarm_off_t *offp) +{ + *offp = dir->seek_pos + dir->index; + return (GFARM_ERR_NO_ERROR); +} + +gfarm_error_t gfs_closedirplusxattr(GFS_DirPlusXAttr dir) { gfarm_error_t e = gfm_close_fd(dir->gfm_server, dir->fd); Modified: gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dirplusxattr.h =================================================================== --- gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dirplusxattr.h 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/lib/libgfarm/gfarm/gfs_dirplusxattr.h 2012-02-08 09:23:40 UTC (rev 5887) @@ -4,5 +4,7 @@ gfarm_error_t gfs_readdirplusxattr(GFS_DirPlusXAttr, struct gfs_dirent **, struct gfs_stat **, int *, char ***, void ***, size_t **); +gfarm_error_t gfs_seekdirplusxattr(GFS_DirPlusXAttr, gfarm_off_t); +gfarm_error_t gfs_telldirplusxattr(GFS_DirPlusXAttr, gfarm_off_t *); gfarm_error_t gfs_closedirplusxattr(GFS_DirPlusXAttr); Modified: gfarm_v2/branches/2.5/regress/Makefile =================================================================== --- gfarm_v2/branches/2.5/regress/Makefile 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/regress/Makefile 2012-02-08 09:23:40 UTC (rev 5887) @@ -12,6 +12,7 @@ SUBDIRS= \ lib/libgfarm/gfarm/gfarm_error_range_alloc \ lib/libgfarm/gfarm/gfarm_error_to_errno \ + lib/libgfarm/gfarm/gfs_dir_test \ lib/libgfarm/gfarm/gfs_pio_test \ lib/libgfarm/gfarm/gfs_replicate_file_from_to_request/file_busy \ lib/libgfarm/gfarm/gfs_replicate_file_from_to_request/in_progress \ Deleted: gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile =================================================================== --- gfarm_v2/trunk/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile 2012-02-08 09:23:40 UTC (rev 5887) @@ -1,20 +0,0 @@ -top_builddir = ../../../../.. -top_srcdir = $(top_builddir) -srcdir = . - -include $(top_srcdir)/makes/var.mk - -PROGRAM = gfs_dir_test -SRCS = $(PROGRAM).c -OBJS = $(PROGRAM).o -CFLAGS = $(COMMON_CFLAGS) -LDLIBS = $(COMMON_LDLIBS) $(GFARMLIB) $(LIBS) -DEPLIBS = $(DEPGFARMLIB) - -all: $(PROGRAM) - -include $(top_srcdir)/makes/prog.mk - -### - -$(OBJS): $(DEPGFARMINC) Copied: gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile (from rev 5886, gfarm_v2/trunk/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile) =================================================================== --- gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile (rev 0) +++ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/Makefile 2012-02-08 09:23:40 UTC (rev 5887) @@ -0,0 +1,20 @@ +top_builddir = ../../../../.. +top_srcdir = $(top_builddir) +srcdir = . + +include $(top_srcdir)/makes/var.mk + +PROGRAM = gfs_dir_test +SRCS = $(PROGRAM).c +OBJS = $(PROGRAM).o +CFLAGS = $(COMMON_CFLAGS) +LDLIBS = $(COMMON_LDLIBS) $(GFARMLIB) $(LIBS) +DEPLIBS = $(DEPGFARMLIB) + +all: $(PROGRAM) + +include $(top_srcdir)/makes/prog.mk + +### + +$(OBJS): $(DEPGFARMINC) Deleted: gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out =================================================================== --- gfarm_v2/trunk/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out 2012-02-08 09:23:40 UTC (rev 5887) @@ -1,8 +0,0 @@ -. -.. -/EOF/ -aaa -bbb -ccc -ddd -eee Copied: gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out (from rev 5886, gfarm_v2/trunk/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out) =================================================================== --- gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out (rev 0) +++ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/all.out 2012-02-08 09:23:40 UTC (rev 5887) @@ -0,0 +1,8 @@ +. +.. +/EOF/ +aaa +bbb +ccc +ddd +eee Deleted: gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c =================================================================== --- gfarm_v2/trunk/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c 2012-02-08 09:23:40 UTC (rev 5887) @@ -1,204 +0,0 @@ -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <libgen.h> - -#include <gfarm/gfarm.h> - -#define EXIT_USAGE 250 - -char *program_name = "gfs_dir_test"; - -#define OP_READ_ALL 'A' -#define OP_READ 'R' -#define OP_SEEK 'S' -#define OP_TELL 'T' - -struct op { - unsigned char op; - union param { - gfarm_off_t off; /* for OP_SEEK */ - } u; -}; - -void -usage(void) -{ - fprintf(stderr, "Usage: %s [-ARSTelsv] <dirname>\n", - program_name); - exit(EXIT_USAGE); -} - -#define MAX_OPS 1024 - -struct op ops[MAX_OPS]; -int nops = 0; - -void -add_op(unsigned char op, union param *p) -{ - if (nops >= MAX_OPS) { - fprintf(stderr, - "%s: number of operations reaches its limit (%d)\n", - program_name, MAX_OPS); - usage(); - } - ops[nops].op = op; - if (p != NULL) - ops[nops].u = *p; - ++nops; -} - -int -main(int argc, char **argv) -{ - gfarm_error_t e; - GFS_Dir gd; - int enable_caching = 0, long_format = 0, verbose = 0, silent_read = 0; - int c, i, all; - union param p; - struct gfs_dirent *gde; - gfarm_off_t roff; - - if (argc > 0) - program_name = basename(argv[0]); - - e = gfarm_initialize(&argc, &argv); - if (e != GFARM_ERR_NO_ERROR) { - fprintf(stderr, "gfarm_initialize: %s\n", - gfarm_error_string(e)); - return (1); - } - - while ((c = getopt(argc, argv, "ARS:Telsv")) != -1) { - switch (c) { - case OP_READ_ALL: - add_op(c, NULL); - break; - case OP_READ: - add_op(c, NULL); - break; - case OP_SEEK: - p.off = strtol(optarg, NULL, 0); - add_op(c, &p); - break; - case OP_TELL: - add_op(c, NULL); - break; - case 'e': - enable_caching = 1; - break; - case 'l': - long_format = 1; - break; - case 's': - silent_read = 1; - break; - case 'v': - verbose = 1; - break; - default: - fprintf(stderr, "%s: unknown option -%c\n", - program_name, c); - usage(); - } - } - argc -= optind; - argv += optind; - if (argc != 1) { - fprintf(stderr, "%s: %s <filename>\n", program_name, - argc == 0 ? "missing" : "extra arguments after"); - usage(); - } - - e = (enable_caching ? gfs_opendir_caching : gfs_opendir)(argv[0], &gd); - if (e != GFARM_ERR_NO_ERROR) { - fprintf(stderr, "%s(): %s\n", - (enable_caching ? "gfs_opendir_caching" : "gfs_opendir"), - gfarm_error_string(e)); - return (2); - } - if (verbose) - fprintf(stderr, "%s(\"%s\")\n", - (enable_caching ? "gfs_opendir_caching" : "gfs_opendir"), - argv[0]); - for (i = 0; i < nops; i++) { - c = ops[i].op; - all = 0; - switch (c) { - case OP_READ_ALL: - all = 1; - /*FALLTHROUGH*/ - case OP_READ: - do { - e = gfs_readdir(gd, &gde); - if (e != GFARM_ERR_NO_ERROR) { - fprintf(stderr, "gfs_readdir(): %s\n", - gfarm_error_string(e)); - return (c); - } - if (verbose) - fprintf(stderr, "gfs_readdir():\n"); - /* print nothing */ - if (gde == NULL) { - if (!silent_read) - printf("/EOF/\n"); - break; - } - if (silent_read) { - /* print nothing */ - } else if (long_format) { - printf("%lld %d %d %s\n", - (long long)gde->d_fileno, - gde->d_reclen, gde->d_type, - gde->d_name); - } else { - printf("%s\n", gde->d_name); - } - } while (all); - break; - case OP_SEEK: - e = gfs_seekdir(gd, ops[i].u.off); - if (e != GFARM_ERR_NO_ERROR) { - fprintf(stderr, - "gfs_seekdir(%lld): %s\n", - (long long)ops[i].u.off, - gfarm_error_string(e)); - return (c); - } - if (verbose) - fprintf(stderr, "gfs_seekdir(%lld)\n", - (long long)ops[i].u.off); - break; - case OP_TELL: - e = gfs_telldir(gd, &roff); - if (e != GFARM_ERR_NO_ERROR) { - fprintf(stderr, "gfs_telldir(): %s\n", - gfarm_error_string(e)); - return (c); - } - if (verbose) - fprintf(stderr, "gfs_tell()\n"); - printf("%lld\n", (long long)roff); - break; - default: - assert(0); - } - } - e = gfs_closedir(gd); - if (e != GFARM_ERR_NO_ERROR) { - fprintf(stderr, "gfs_closedir(): %s\n", gfarm_error_string(e)); - return (3); - } - if (verbose) - fprintf(stderr, "gfs_closedir()\n"); - - e = gfarm_terminate(); - if (e != GFARM_ERR_NO_ERROR) { - fprintf(stderr, "gfarm_terminate: %s\n", - gfarm_error_string(e)); - return (4); - } - return (0); -} Copied: gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c (from rev 5886, gfarm_v2/trunk/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c) =================================================================== --- gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c (rev 0) +++ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.c 2012-02-08 09:23:40 UTC (rev 5887) @@ -0,0 +1,204 @@ +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <libgen.h> + +#include <gfarm/gfarm.h> + +#define EXIT_USAGE 250 + +char *program_name = "gfs_dir_test"; + +#define OP_READ_ALL 'A' +#define OP_READ 'R' +#define OP_SEEK 'S' +#define OP_TELL 'T' + +struct op { + unsigned char op; + union param { + gfarm_off_t off; /* for OP_SEEK */ + } u; +}; + +void +usage(void) +{ + fprintf(stderr, "Usage: %s [-ARSTelsv] <dirname>\n", + program_name); + exit(EXIT_USAGE); +} + +#define MAX_OPS 1024 + +struct op ops[MAX_OPS]; +int nops = 0; + +void +add_op(unsigned char op, union param *p) +{ + if (nops >= MAX_OPS) { + fprintf(stderr, + "%s: number of operations reaches its limit (%d)\n", + program_name, MAX_OPS); + usage(); + } + ops[nops].op = op; + if (p != NULL) + ops[nops].u = *p; + ++nops; +} + +int +main(int argc, char **argv) +{ + gfarm_error_t e; + GFS_Dir gd; + int enable_caching = 0, long_format = 0, verbose = 0, silent_read = 0; + int c, i, all; + union param p; + struct gfs_dirent *gde; + gfarm_off_t roff; + + if (argc > 0) + program_name = basename(argv[0]); + + e = gfarm_initialize(&argc, &argv); + if (e != GFARM_ERR_NO_ERROR) { + fprintf(stderr, "gfarm_initialize: %s\n", + gfarm_error_string(e)); + return (1); + } + + while ((c = getopt(argc, argv, "ARS:Telsv")) != -1) { + switch (c) { + case OP_READ_ALL: + add_op(c, NULL); + break; + case OP_READ: + add_op(c, NULL); + break; + case OP_SEEK: + p.off = strtol(optarg, NULL, 0); + add_op(c, &p); + break; + case OP_TELL: + add_op(c, NULL); + break; + case 'e': + enable_caching = 1; + break; + case 'l': + long_format = 1; + break; + case 's': + silent_read = 1; + break; + case 'v': + verbose = 1; + break; + default: + fprintf(stderr, "%s: unknown option -%c\n", + program_name, c); + usage(); + } + } + argc -= optind; + argv += optind; + if (argc != 1) { + fprintf(stderr, "%s: %s <filename>\n", program_name, + argc == 0 ? "missing" : "extra arguments after"); + usage(); + } + + e = (enable_caching ? gfs_opendir_caching : gfs_opendir)(argv[0], &gd); + if (e != GFARM_ERR_NO_ERROR) { + fprintf(stderr, "%s(): %s\n", + (enable_caching ? "gfs_opendir_caching" : "gfs_opendir"), + gfarm_error_string(e)); + return (2); + } + if (verbose) + fprintf(stderr, "%s(\"%s\")\n", + (enable_caching ? "gfs_opendir_caching" : "gfs_opendir"), + argv[0]); + for (i = 0; i < nops; i++) { + c = ops[i].op; + all = 0; + switch (c) { + case OP_READ_ALL: + all = 1; + /*FALLTHROUGH*/ + case OP_READ: + do { + e = gfs_readdir(gd, &gde); + if (e != GFARM_ERR_NO_ERROR) { + fprintf(stderr, "gfs_readdir(): %s\n", + gfarm_error_string(e)); + return (c); + } + if (verbose) + fprintf(stderr, "gfs_readdir():\n"); + /* print nothing */ + if (gde == NULL) { + if (!silent_read) + printf("/EOF/\n"); + break; + } + if (silent_read) { + /* print nothing */ + } else if (long_format) { + printf("%lld %d %d %s\n", + (long long)gde->d_fileno, + gde->d_reclen, gde->d_type, + gde->d_name); + } else { + printf("%s\n", gde->d_name); + } + } while (all); + break; + case OP_SEEK: + e = gfs_seekdir(gd, ops[i].u.off); + if (e != GFARM_ERR_NO_ERROR) { + fprintf(stderr, + "gfs_seekdir(%lld): %s\n", + (long long)ops[i].u.off, + gfarm_error_string(e)); + return (c); + } + if (verbose) + fprintf(stderr, "gfs_seekdir(%lld)\n", + (long long)ops[i].u.off); + break; + case OP_TELL: + e = gfs_telldir(gd, &roff); + if (e != GFARM_ERR_NO_ERROR) { + fprintf(stderr, "gfs_telldir(): %s\n", + gfarm_error_string(e)); + return (c); + } + if (verbose) + fprintf(stderr, "gfs_tell()\n"); + printf("%lld\n", (long long)roff); + break; + default: + assert(0); + } + } + e = gfs_closedir(gd); + if (e != GFARM_ERR_NO_ERROR) { + fprintf(stderr, "gfs_closedir(): %s\n", gfarm_error_string(e)); + return (3); + } + if (verbose) + fprintf(stderr, "gfs_closedir()\n"); + + e = gfarm_terminate(); + if (e != GFARM_ERR_NO_ERROR) { + fprintf(stderr, "gfarm_terminate: %s\n", + gfarm_error_string(e)); + return (4); + } + return (0); +} Deleted: gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh =================================================================== --- gfarm_v2/trunk/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh 2012-02-08 09:23:40 UTC (rev 5887) @@ -1,56 +0,0 @@ -#!/bin/sh - -. ./regress.conf - -gfs_dir_test=$testbin/gfs_dir_test - -cleanup() -{ - for i in aaa bbb ccc ddd eee; do - gfrm -f $gftmp/$i - done - gfrmdir $gftmp -} - -trap 'cleanup; exit $exit_trap' $trap_sigs - -cmp_entry() -{ - opt=$1 - read_skip=$2 - - entry=`$gfs_dir_test $opt $read_skip -R $gftmp | tail -1` - position=`$gfs_dir_test $opt -s $read_skip -T $gftmp` - [ X"`$gfs_dir_test $opt -S $position -R $gftmp`" = X"$entry" ] && - [ X"`$gfs_dir_test $opt $read_skip -R -R -S $position -R $gftmp | tail -1`" = X"$entry" ] -} - -run_test() -{ - opt=$1 - - if $gfs_dir_test $opt -A $gftmp | sort | cmp - $testbase/all.out; then - : - else - return 1 - fi - - cmp_entry "$opt" "" && - cmp_entry "$opt" "-R -R -R -R" && - cmp_entry "$opt" "-R -R -R -R -R -R -R -R -R -R" -} - -if gfmkdir $gftmp && - gfreg $data/0byte $gftmp/aaa && - gfreg $data/0byte $gftmp/bbb && - gfreg $data/0byte $gftmp/ccc && - gfreg $data/0byte $gftmp/ddd && - gfreg $data/0byte $gftmp/eee && - run_test '' && - run_test -e -then - exit_code=$exit_pass -fi - -cleanup -exit $exit_code Copied: gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh (from rev 5886, gfarm_v2/trunk/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh) =================================================================== --- gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh (rev 0) +++ gfarm_v2/branches/2.5/regress/lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh 2012-02-08 09:23:40 UTC (rev 5887) @@ -0,0 +1,56 @@ +#!/bin/sh + +. ./regress.conf + +gfs_dir_test=$testbin/gfs_dir_test + +cleanup() +{ + for i in aaa bbb ccc ddd eee; do + gfrm -f $gftmp/$i + done + gfrmdir $gftmp +} + +trap 'cleanup; exit $exit_trap' $trap_sigs + +cmp_entry() +{ + opt=$1 + read_skip=$2 + + entry=`$gfs_dir_test $opt $read_skip -R $gftmp | tail -1` + position=`$gfs_dir_test $opt -s $read_skip -T $gftmp` + [ X"`$gfs_dir_test $opt -S $position -R $gftmp`" = X"$entry" ] && + [ X"`$gfs_dir_test $opt $read_skip -R -R -S $position -R $gftmp | tail -1`" = X"$entry" ] +} + +run_test() +{ + opt=$1 + + if $gfs_dir_test $opt -A $gftmp | sort | cmp - $testbase/all.out; then + : + else + return 1 + fi + + cmp_entry "$opt" "" && + cmp_entry "$opt" "-R -R -R -R" && + cmp_entry "$opt" "-R -R -R -R -R -R -R -R -R -R" +} + +if gfmkdir $gftmp && + gfreg $data/0byte $gftmp/aaa && + gfreg $data/0byte $gftmp/bbb && + gfreg $data/0byte $gftmp/ccc && + gfreg $data/0byte $gftmp/ddd && + gfreg $data/0byte $gftmp/eee && + run_test '' && + run_test -e +then + exit_code=$exit_pass +fi + +cleanup +exit $exit_code Modified: gfarm_v2/branches/2.5/regress/schedule =================================================================== --- gfarm_v2/branches/2.5/regress/schedule 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/regress/schedule 2012-02-08 09:23:40 UTC (rev 5887) @@ -1,5 +1,6 @@ lib/libgfarm/gfarm/gfarm_error_range_alloc/errmsg.sh lib/libgfarm/gfarm/gfarm_error_to_errno/all_mapped.sh +lib/libgfarm/gfarm/gfs_dir_test/gfs_dir_test.sh lib/libgfarm/gfarm/gfs_pio_create/normal.sh lib/libgfarm/gfarm/gfs_pio_create/not_writable.sh lib/libgfarm/gfarm/gfs_pio_create/not_writable_rdonly.sh Modified: gfarm_v2/branches/2.5/server/gfmd/fs.c =================================================================== --- gfarm_v2/branches/2.5/server/gfmd/fs.c 2012-02-08 08:53:51 UTC (rev 5886) +++ gfarm_v2/branches/2.5/server/gfmd/fs.c 2012-02-08 09:23:40 UTC (rev 5887) @@ -2631,7 +2631,9 @@ default: assert(0); } if (offset != current) { - if (offset > max) + if (offset < 0) + offset = 0; + else if (offset > max) offset = max; process_clear_dir_key(process, peer, fd); process_set_dir_offset(process, peer, fd, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |