From cf157f09eb604311e99d5fa87e7e8c14eb0ad774 Mon Sep 17 00:00:00 2001 From: Andrew Hanushevsky Date: Wed, 9 Oct 2019 08:20:23 -0700 Subject: [PATCH] [Server] Add default OSS implementation of pgread and pgwrite. --- src/XrdOss/XrdOss.cc | 60 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/src/XrdOss/XrdOss.cc b/src/XrdOss/XrdOss.cc index e119ddd828b..1c54f29b18d 100644 --- a/src/XrdOss/XrdOss.cc +++ b/src/XrdOss/XrdOss.cc @@ -29,8 +29,18 @@ /******************************************************************************/ #include "XrdOss/XrdOss.hh" +#include "XrdOuc/XrdOucCRC.hh" #include "XrdSfs/XrdSfsAio.hh" +/******************************************************************************/ +/* S t a t i c S y m b o l s */ +/******************************************************************************/ + +namespace +{ +static const size_t pgSize = 4096; +} + /******************************************************************************/ /* C l a s s X r d O s s */ /******************************************************************************/ @@ -161,10 +171,26 @@ ssize_t XrdOssDF::pgRead(void *buffer, size_t rdlen, uint32_t *csvec, bool verify) -{(void)buffer; (void)offset; (void)rdlen; - (void)csvec; (void)verify; +{ + ssize_t bytes; - return (ssize_t)-ENOTSUP; +// Make sure the offset is on a 4K boundary and the size if a multiple of +// 4k as well (we use simple and for this). +// + if ((offset & ~pgSize) || (rdlen & ~pgSize)) return -EINVAL; + +// Read the data into the buffer +// + bytes = Read(buffer, offset, rdlen); + +// Calculate checksums if so wanted +// + if (bytes > 0 && csvec) + XrdOucCRC::Calc32C((void *)buffer, rdlen, csvec, pgSize); + +// All done +// + return bytes; } /******************************************************************************/ @@ -188,10 +214,32 @@ ssize_t XrdOssDF::pgWrite(void *buffer, size_t wrlen, uint32_t *csvec, bool verify) -{(void)buffer; (void)offset; (void)wrlen; - (void)csvec; (void)verify; +{ +// Make sure the offset is on a 4K boundary +// + if (offset & ~pgSize) return -EINVAL; + +// If a virtual end of file marker is set, make sure we are not trying to +// write past it. +// + if (pgwEOF && (off_t)(offset+wrlen) > pgwEOF) return -ESPIPE; + +// If this is a short write then establish the virtual eof +// + if (wrlen & ~pgSize) pgwEOF = (offset + wrlen) & ~pgSize; + +// If we have a checksum vector and verify is on, make sure the data +// in the buffer corresponds to he checksums. +// + if (csvec && verify) + {int pgErr; + if (!XrdOucCRC::Ver32C((void *)buffer,wrlen,csvec,pgSize,pgErr)) + return -EDOM; + } - return (ssize_t)-ENOTSUP; +// Now just return the result of a plain write +// + return Write(buffer, offset, wrlen); } /******************************************************************************/