Date: Mon, 4 Jul 2011 16:28:43 GMT From: Ilya Putsikau <ilya@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 195719 for review Message-ID: <201107041628.p64GSh7Z047696@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@195719?ac=10 Change 195719 by ilya@ilya_triton2011 on 2011/07/04 16:27:47 Add user space daemon reply timeout Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse.h#12 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#9 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.h#10 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vfsops.c#18 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse.h#12 (text+ko) ==== @@ -6,6 +6,11 @@ #include "fuse4bsd.h" #include "fuse_kernel.h" +#define FUSE_DEFAULT_DAEMON_TIMEOUT 60 /* s */ +#define FUSE_MIN_DAEMON_TIMEOUT 0 /* s */ +#define FUSE_MAX_DAEMON_TIMEOUT 600 /* s */ + + /* Mapping versions to features */ #define FUSE_KERNELABI_GEQ(maj, min) \ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#9 (text+ko) ==== @@ -195,6 +195,7 @@ fticket_wait_answer(struct fuse_ticket *ftick) { int err = 0; + struct fuse_data *data; debug_printf("ftick=%p\n", ftick); fuse_lck_mtx_lock(ftick->tk_aw_mtx); @@ -203,13 +204,25 @@ goto out; } - if (fdata_get_dead(ftick->tk_data)) { + data = ftick->tk_data; + + if (fdata_get_dead(data)) { err = ENOTCONN; fticket_set_answered(ftick); goto out; } - err = msleep(ftick, &ftick->tk_aw_mtx, PCATCH, "fu_ans", 0); + err = msleep(ftick, &ftick->tk_aw_mtx, PCATCH, "fu_ans", + data->daemon_timeout * hz); + if (err == EAGAIN) { /* same as EWOULDBLOCK */ +#ifdef XXXIP /* die conditionally */ + if (!fdata_get_dead(data)) { + fdata_set_dead(data); + } +#endif + err = ETIMEDOUT; + fticket_set_answered(ftick); + } out: fuse_lck_mtx_unlock(ftick->tk_aw_mtx); @@ -301,6 +314,7 @@ data->ticketer = 0; data->freeticket_counter = 0; data->daemoncred = crhold(cred); + data->daemon_timeout = FUSE_DEFAULT_DAEMON_TIMEOUT; #ifdef FUSE_EXPLICIT_RENAME_LOCK sx_init(&data->rename_lock, "fuse rename lock"); ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.h#10 (text+ko) ==== @@ -146,6 +146,8 @@ char volname[MAXPATHLEN]; struct selinfo ks_rsel; + + int daemon_timeout; }; #define FSESS_DEAD 0x0001 // session is to be closed ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vfsops.c#18 (text+ko) ==== @@ -85,6 +85,7 @@ int __mntopts = 0; int max_read_set = 0; uint32_t max_read = ~0; + int daemon_timeout; size_t len; @@ -208,6 +209,13 @@ if (vfs_scanopt(opts, "max_read=", "%u", &max_read) == 1) max_read_set = 1; + if (vfs_scanopt(opts, "timeout=", "%u", &daemon_timeout) == 1) { + if (daemon_timeout < FUSE_MIN_DAEMON_TIMEOUT) + daemon_timeout = FUSE_MIN_DAEMON_TIMEOUT; + else if (daemon_timeout > FUSE_MAX_DAEMON_TIMEOUT) + daemon_timeout = FUSE_MAX_DAEMON_TIMEOUT; + data->daemon_timeout = daemon_timeout; + } subtype = vfs_getopts(opts, "subtype=", &err); err = 0;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107041628.p64GSh7Z047696>