__be32
-nfsd4_process_open1(struct nfsd4_open *open)
+nfsd4_process_open1(struct nfsd4_compound_state *cstate,
+                   struct nfsd4_open *open)
 {
        clientid_t *clientid = &open->op_clientid;
        struct nfs4_client *clp = NULL;
                        return nfserr_expired;
                goto renew;
        }
+       /* When sessions are used, skip open sequenceid processing */
+       if (nfsd4_has_session(cstate))
+               goto renew;
        if (!sop->so_confirmed) {
                /* Replace unconfirmed owners without checking for replay. */
                clp = sop->so_client;
 __be32
 nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
 {
+       struct nfsd4_compoundres *resp = rqstp->rq_resp;
        struct nfs4_file *fp = NULL;
        struct inode *ino = current_fh->fh_dentry->d_inode;
        struct nfs4_stateid *stp = NULL;
                        release_open_stateid(stp);
                        goto out;
                }
+               if (nfsd4_has_session(&resp->cstate))
+                       update_stateid(&stp->st_stateid);
        }
        memcpy(&open->op_stateid, &stp->st_stateid, sizeof(stateid_t));
 
+       if (nfsd4_has_session(&resp->cstate))
+               open->op_stateowner->so_confirmed = 1;
+
        /*
        * Attempt to hand out a delegation. No error return, because the
        * OPEN succeeds even if we fail.
        * To finish the open response, we just need to set the rflags.
        */
        open->op_rflags = NFS4_OPEN_RESULT_LOCKTYPE_POSIX;
-       if (!open->op_stateowner->so_confirmed)
+       if (!open->op_stateowner->so_confirmed &&
+           !nfsd4_has_session(&resp->cstate))
                open->op_rflags |= NFS4_OPEN_RESULT_CONFIRM;
 
        return status;
        return locks_in_grace() && mandatory_lock(inode);
 }
 
-static int check_stateid_generation(stateid_t *in, stateid_t *ref)
+static int check_stateid_generation(stateid_t *in, stateid_t *ref, int flags)
 {
+       /*
+        * When sessions are used the stateid generation number is ignored
+        * when it is zero.
+        */
+       if ((flags & HAS_SESSION) && in->si_generation == 0)
+               goto out;
+
        /* If the client sends us a stateid from the future, it's buggy: */
        if (in->si_generation > ref->si_generation)
                return nfserr_bad_stateid;
         */
        if (in->si_generation < ref->si_generation)
                return nfserr_old_stateid;
+out:
        return nfs_ok;
 }
 
        if (grace_disallows_io(ino))
                return nfserr_grace;
 
+       if (nfsd4_has_session(cstate))
+               flags |= HAS_SESSION;
+
        if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
                return check_special_stateids(current_fh, stateid, flags);
 
                dp = find_delegation_stateid(ino, stateid);
                if (!dp)
                        goto out;
-               status = check_stateid_generation(stateid, &dp->dl_stateid);
+               status = check_stateid_generation(stateid, &dp->dl_stateid,
+                                                 flags);
                if (status)
                        goto out;
                status = nfs4_check_delegmode(dp, flags);
                        goto out;
                if (!stp->st_stateowner->so_confirmed)
                        goto out;
-               status = check_stateid_generation(stateid, &stp->st_stateid);
+               status = check_stateid_generation(stateid, &stp->st_stateid,
+                                                 flags);
                if (status)
                        goto out;
                status = nfs4_check_openmode(stp, flags);
 
        if (STALE_STATEID(stateid))
                return nfserr_stale_stateid;
+
+       if (nfsd4_has_session(cstate))
+               flags |= HAS_SESSION;
+
        /*
        * We return BAD_STATEID if filehandle doesn't match stateid, 
        * the confirmed flag is incorrecly set, or the generation 
        *  For the moment, we ignore the possibility of 
        *  generation number wraparound.
        */
-       if (seqid != sop->so_seqid)
+       if (!(flags & HAS_SESSION) && seqid != sop->so_seqid)
                goto check_replay;
 
        if (sop->so_confirmed && flags & CONFIRM) {
                                " confirmed yet!\n");
                return nfserr_bad_stateid;
        }
-       status = check_stateid_generation(stateid, &stp->st_stateid);
+       status = check_stateid_generation(stateid, &stp->st_stateid, flags);
        if (status)
                return status;
        renew_client(sop->so_client);
        stateid_t *stateid = &dr->dr_stateid;
        struct inode *inode;
        __be32 status;
+       int flags = 0;
 
        if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
                return status;
        inode = cstate->current_fh.fh_dentry->d_inode;
 
+       if (nfsd4_has_session(cstate))
+               flags |= HAS_SESSION;
        nfs4_lock_state();
        status = nfserr_bad_stateid;
        if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
        dp = find_delegation_stateid(inode, stateid);
        if (!dp)
                goto out;
-       status = check_stateid_generation(stateid, &dp->dl_stateid);
+       status = check_stateid_generation(stateid, &dp->dl_stateid, flags);
        if (status)
                goto out;
        renew_client(dp->dl_client);