From owner-p4-projects@FreeBSD.ORG Mon Jul 4 16:28:44 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7DDDF1065670; Mon, 4 Jul 2011 16:28:44 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 283A2106564A for ; Mon, 4 Jul 2011 16:28:44 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 0E6C58FC19 for ; Mon, 4 Jul 2011 16:28:44 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p64GShTm047699 for ; Mon, 4 Jul 2011 16:28:43 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p64GSh7Z047696 for perforce@freebsd.org; Mon, 4 Jul 2011 16:28:43 GMT (envelope-from ilya@FreeBSD.org) Date: Mon, 4 Jul 2011 16:28:43 GMT Message-Id: <201107041628.p64GSh7Z047696@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195719 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Jul 2011 16:28:44 -0000 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;