return ret;
 }
 
-static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
+static int nfs4_delay_killable(long *timeout)
 {
-       int res = 0;
-
        might_sleep();
 
        freezable_schedule_timeout_killable_unsafe(
                nfs4_update_delay(timeout));
-       if (fatal_signal_pending(current))
-               res = -ERESTARTSYS;
-       return res;
+       if (!__fatal_signal_pending(current))
+               return 0;
+       return -EINTR;
+}
+
+static int nfs4_delay_interruptible(long *timeout)
+{
+       might_sleep();
+
+       freezable_schedule_timeout_interruptible(nfs4_update_delay(timeout));
+       if (!signal_pending(current))
+               return 0;
+       return __fatal_signal_pending(current) ? -EINTR :-ERESTARTSYS;
+}
+
+static int nfs4_delay(long *timeout, bool interruptible)
+{
+       if (interruptible)
+               return nfs4_delay_interruptible(timeout);
+       return nfs4_delay_killable(timeout);
 }
 
 /* This is the error handling routine for processes that are allowed
 
        ret = nfs4_do_handle_exception(server, errorcode, exception);
        if (exception->delay) {
-               ret = nfs4_delay(server->client, &exception->timeout);
+               ret = nfs4_delay(&exception->timeout,
+                               exception->interruptible);
                goto out_retry;
        }
        if (exception->recovering) {
                                        int *opened)
 {
        struct nfs_server *server = NFS_SERVER(dir);
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        struct nfs4_state *res;
        struct nfs4_open_createattrs c = {
                .label = label,
 
 int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = nfs4_handle_exception(server,
 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
                struct nfs_fsinfo *info)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = _nfs4_lookup_root(server, fhandle, info);
                                struct nfs_fattr *fattr, struct nfs4_label *label,
                                struct inode *inode)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = _nfs4_proc_getattr(server, fhandle, fattr, label, inode);
                                   const struct qstr *name, struct nfs_fh *fhandle,
                                   struct nfs_fattr *fattr, struct nfs4_label *label)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        struct rpc_clnt *client = *clnt;
        int err;
        do {
 static int nfs4_proc_lookupp(struct inode *inode, struct nfs_fh *fhandle,
                             struct nfs_fattr *fattr, struct nfs4_label *label)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = _nfs4_proc_lookupp(inode, fhandle, fattr, label);
 
 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = _nfs4_proc_access(inode, entry);
 static int nfs4_proc_readlink(struct inode *inode, struct page *page,
                unsigned int pgbase, unsigned int pglen)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = _nfs4_proc_readlink(inode, page, pgbase, pglen);
 
 static int nfs4_proc_remove(struct inode *dir, struct dentry *dentry)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        struct inode *inode = d_inode(dentry);
        int err;
 
 
 static int nfs4_proc_rmdir(struct inode *dir, const struct qstr *name)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
 
        do {
 
 static int nfs4_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = nfs4_handle_exception(NFS_SERVER(inode),
 static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
                struct page *page, unsigned int len, struct iattr *sattr)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        struct nfs4_label l, *label = NULL;
        int err;
 
                struct iattr *sattr)
 {
        struct nfs_server *server = NFS_SERVER(dir);
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        struct nfs4_label l, *label = NULL;
        int err;
 
 static int nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
                u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = _nfs4_proc_readdir(dentry, cred, cookie,
                struct iattr *sattr, dev_t rdev)
 {
        struct nfs_server *server = NFS_SERVER(dir);
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        struct nfs4_label l, *label = NULL;
        int err;
 
 
 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = nfs4_handle_exception(server,
 
 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        unsigned long now = jiffies;
        int err;
 
 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
                struct nfs_pathconf *pathconf)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
 
        do {
 
 static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        ssize_t ret;
        do {
                ret = __nfs4_get_acl_uncached(inode, buf, buflen);
 static int nfs4_get_security_label(struct inode *inode, void *buf,
                                        size_t buflen)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
 
        if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
 
 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
 
        do {
        struct nfs4_exception exception = {
                .state = state,
                .inode = state->inode,
+               .interruptible = true,
        };
        int err;
 
                           struct nfs4_fs_locations *fs_locations,
                           struct page *page)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = _nfs4_proc_fs_locations(client, dir, name,
        struct nfs_client *clp = server->nfs_client;
        const struct nfs4_mig_recovery_ops *ops =
                                        clp->cl_mvops->mig_recovery_ops;
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int status;
 
        dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
        struct nfs_client *clp = server->nfs_client;
        const struct nfs4_mig_recovery_ops *ops =
                                        clp->cl_mvops->mig_recovery_ops;
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int status;
 
        dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
 int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name,
                      struct nfs4_secinfo_flavors *flavors)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = -NFS4ERR_WRONGSEC;
 nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
                           struct nfs_fsinfo *info, struct nfs4_secinfo_flavors *flavors)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                /* first try using integrity protection */
                nfs4_stateid *stateid,
                const struct cred *cred)
 {
-       struct nfs4_exception exception = { };
+       struct nfs4_exception exception = {
+               .interruptible = true,
+       };
        int err;
        do {
                err = _nfs41_test_stateid(server, stateid, cred);