package org.dcache.chimera.nfsv41.door.proxy;
import java.io.IOException;
import org.dcache.nfs.ChimeraNFSException;
import org.dcache.nfs.nfsstat;
import org.dcache.nfs.v4.AbstractNFSv4Operation;
import org.dcache.nfs.v4.CompoundContext;
import org.dcache.nfs.v4.NFS4Client;
import org.dcache.nfs.v4.Stateids;
import org.dcache.nfs.v4.xdr.CLOSE4res;
import org.dcache.nfs.v4.xdr.nfs_argop4;
import org.dcache.nfs.v4.xdr.nfs_opnum4;
import org.dcache.nfs.v4.xdr.nfs_resop4;
import org.dcache.nfs.vfs.Inode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProxyIoClose extends AbstractNFSv4Operation {
private static final Logger _log = LoggerFactory.getLogger(ProxyIoClose.class);
ProxyIoClose(nfs_argop4 args) {
super(args, nfs_opnum4.OP_CLOSE);
}
@Override
public void process(CompoundContext context, nfs_resop4 result)
throws ChimeraNFSException, IOException {
final CLOSE4res res = result.opclose;
Inode inode = context.currentInode();
NFS4Client client;
if (context.getMinorversion() > 0) {
client = context.getSession().getClient();
} else {
client = context.getStateHandler().getClientIdByStateId(_args.opclose.open_stateid);
client.validateSequence(_args.opclose.seqid);
}
context.getDeviceManager().layoutReturn(context, _args.opclose.open_stateid);
// REVISIT: as we pass open-state id as layout state id, we dont need to invalidate it
// client.releaseState(_args.opclose.open_stateid);
client.updateLeaseTime();
res.open_stateid = Stateids.invalidStateId();
res.status = nfsstat.NFS_OK;
}
}