mirror of
https://github.com/s3fs-fuse/s3fs-fuse.git
synced 2024-11-19 02:35:13 +00:00
Merge pull request #212 from s3fs-fuse/master
update content of the master to macosx branch.
This commit is contained in:
commit
730262f000
61
ChangeLog
61
ChangeLog
@ -1,16 +1,69 @@
|
|||||||
ChangeLog for S3FS
|
ChangeLog for S3FS
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
Version 1.79 -- Jul 19, 2015
|
||||||
|
issue #60 - Emit user-friendly log messages on failed CheckBucket requests
|
||||||
|
issue #62 - Remove stray chars from source files
|
||||||
|
issue #63 - Fix spelling errors
|
||||||
|
issue #68 - FreeBSD issue
|
||||||
|
issue #69 - Address clang always true warnings
|
||||||
|
issue #73 - Small gitignore fixes
|
||||||
|
issue #74 - url: handle scheme omission
|
||||||
|
issue #83 - Changed option processing to use strtol() to get a umask
|
||||||
|
issue #93 - Add simple unit tests for trim functions
|
||||||
|
issue #100 - CURL handles not properly initialized to use DNS or SSL session caching
|
||||||
|
issue #101 - Optimized function "bool directory_empty()"
|
||||||
|
issue #103 - Remove prefix option in s3fs man page - issue#87
|
||||||
|
issue #104 - fix rename before close
|
||||||
|
issue #116 - Supported signature version 4
|
||||||
|
issue #119 - Added new mp_umask option about issue#107, pr#110
|
||||||
|
issue #124 - Fallback to v2 signatures correctly.
|
||||||
|
issue #130 - refactor integration tests create/cleanup file
|
||||||
|
issue #131 - Test ls
|
||||||
|
issue #132 - Use S3Proxy to run integration tests
|
||||||
|
issue #134 - Include Content-Type in complete MPU V2 signature
|
||||||
|
issue #135 - Correct V4 signature for initiate multipart upload
|
||||||
|
issue #136 - Small fixes to integration tests
|
||||||
|
issue #137 - Add test for multi-part upload
|
||||||
|
issue #138 - Fixed bugs, not turn use_cache off and ty to load to end - issue#97
|
||||||
|
issue #143 - Fixed a bug no use_cache case about fixed #138 - issue#141
|
||||||
|
issue #144 - Add Travis configuration
|
||||||
|
issue #146 - add exit handler to cleanup on failures
|
||||||
|
issue #147 - Use S3Proxy 1.4.0-SNAPSHOT
|
||||||
|
issue #150 - Fixed a bug not handling fsync - #145
|
||||||
|
issue #154 - Fixed url-encoding for ampersand etc on sigv4 - Improvement/#149
|
||||||
|
issue #155 - Fixed a bug: unable to mount bucket subdirectory
|
||||||
|
issue #156 - Fixed a bug about ssl session sharing with libcurl older 7.23.0 - issue#126
|
||||||
|
issue #159 - Upgrade to S3Proxy 1.4.0
|
||||||
|
issue #164 - send the correct Host header when using -o url
|
||||||
|
issue #165 - Auth v4 refactor
|
||||||
|
issue #167 - Increased default connecting/reading/writing timeout value
|
||||||
|
issue #168 - switch to use region specific endpoints to compute correct v4 signature
|
||||||
|
issue #170 - Reviewed and fixed response codes print in curl.cpp - #157
|
||||||
|
issue #171 - Support buckets with mixed-case names
|
||||||
|
issue #173 - Run integration tests via Travis
|
||||||
|
issue #176 - configure.ac: detect target, if target is darwin (OSX), then #176
|
||||||
|
issue #177 - Add .mailmap
|
||||||
|
issue #178 - Update .gitignore
|
||||||
|
issue #184 - Add usage information for multipart_size
|
||||||
|
issue #185 - Correct obvious typos in usage and README
|
||||||
|
issue #190 - Add a no_check_certificate option.
|
||||||
|
issue #194 - Tilda in a file-name breaks things (EPERM)
|
||||||
|
issue #198 - Disasble integration tests for Travis
|
||||||
|
issue #199 - Supported extended attributes(retry)
|
||||||
|
issue #200 - fixed fallback to sigv2 for bucket create and GCS
|
||||||
|
issue #202 - Specialize {set,get}xattr for OS X
|
||||||
|
issue #204 - Add integration test for xattr
|
||||||
|
issue #207 - Fixed a few small spelling issues.
|
||||||
|
|
||||||
Version 1.78 -- Sep 15, 2014
|
Version 1.78 -- Sep 15, 2014
|
||||||
issue #29 - Possible to create Debian/Ubuntu packages?(googlecode issue 109)
|
issue #29 - Possible to create Debian/Ubuntu packages?(googlecode issue 109)
|
||||||
issue 417(googlecode) - Password file with DOS format is not handled properly
|
issue 417(googlecode) - Password file with DOS format is not handled properly
|
||||||
issue #41 - Failed making signature
|
issue #41 - Failed making signature
|
||||||
issue #40 - Moving a directory containing more than 1000 files truncates the
|
issue #40 - Moving a directory containing more than 1000 files truncates the directory
|
||||||
directory
|
|
||||||
issue #49 - use_sse is ignored when creating new files
|
issue #49 - use_sse is ignored when creating new files
|
||||||
issue #39 - Support for SSE-C
|
issue #39 - Support for SSE-C
|
||||||
issue #50 - Cannot find pkg-config when configured with any SSL backend except
|
issue #50 - Cannot find pkg-config when configured with any SSL backend except openssl
|
||||||
openssl
|
|
||||||
|
|
||||||
Version 1.77 -- Apr 19, 2014
|
Version 1.77 -- Apr 19, 2014
|
||||||
issue 405(googlecode) - enable_content_md5 Input/output error
|
issue 405(googlecode) - enable_content_md5 Input/output error
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ(2.59)
|
AC_PREREQ(2.59)
|
||||||
AC_INIT(s3fs, 1.78)
|
AC_INIT(s3fs, 1.79)
|
||||||
|
|
||||||
AC_CANONICAL_SYSTEM
|
AC_CANONICAL_SYSTEM
|
||||||
AM_INIT_AUTOMAKE()
|
AM_INIT_AUTOMAKE()
|
||||||
|
@ -138,7 +138,7 @@ It is necessary to set this value depending on a CPU and a network band.
|
|||||||
This option is lated to fd_page_size option and affects it.
|
This option is lated to fd_page_size option and affects it.
|
||||||
.TP
|
.TP
|
||||||
\fB\-o\fR fd_page_size(default="52428800"(50MB))
|
\fB\-o\fR fd_page_size(default="52428800"(50MB))
|
||||||
number of internal management page size for each file discriptor.
|
number of internal management page size for each file descriptor.
|
||||||
For delayed reading and writing by s3fs, s3fs manages pages which is separated from object. Each pages has a status that data is already loaded(or not loaded yet).
|
For delayed reading and writing by s3fs, s3fs manages pages which is separated from object. Each pages has a status that data is already loaded(or not loaded yet).
|
||||||
This option should not be changed when you don't have a trouble with performance.
|
This option should not be changed when you don't have a trouble with performance.
|
||||||
This value is changed automatically by parallel_count and multipart_size values(fd_page_size value = parallel_count * multipart_size).
|
This value is changed automatically by parallel_count and multipart_size values(fd_page_size value = parallel_count * multipart_size).
|
||||||
|
@ -1053,14 +1053,14 @@ int S3fsCurl::ParallelMultipartUploadRequest(const char* tpath, headers_t& meta,
|
|||||||
|
|
||||||
// duplicate fd
|
// duplicate fd
|
||||||
if(-1 == (fd2 = dup(fd)) || 0 != lseek(fd2, 0, SEEK_SET)){
|
if(-1 == (fd2 = dup(fd)) || 0 != lseek(fd2, 0, SEEK_SET)){
|
||||||
DPRN("Cloud not duplicate file discriptor(errno=%d)", errno);
|
DPRN("Could not duplicate file descriptor(errno=%d)", errno);
|
||||||
if(-1 != fd2){
|
if(-1 != fd2){
|
||||||
close(fd2);
|
close(fd2);
|
||||||
}
|
}
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
if(-1 == fstat(fd2, &st)){
|
if(-1 == fstat(fd2, &st)){
|
||||||
DPRN("Invalid file discriptor(errno=%d)", errno);
|
DPRN("Invalid file descriptor(errno=%d)", errno);
|
||||||
close(fd2);
|
close(fd2);
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
@ -3192,14 +3192,14 @@ int S3fsCurl::MultipartUploadRequest(const char* tpath, headers_t& meta, int fd,
|
|||||||
|
|
||||||
// duplicate fd
|
// duplicate fd
|
||||||
if(-1 == (fd2 = dup(fd)) || 0 != lseek(fd2, 0, SEEK_SET)){
|
if(-1 == (fd2 = dup(fd)) || 0 != lseek(fd2, 0, SEEK_SET)){
|
||||||
DPRN("Cloud not duplicate file discriptor(errno=%d)", errno);
|
DPRN("Could not duplicate file descriptor(errno=%d)", errno);
|
||||||
if(-1 != fd2){
|
if(-1 != fd2){
|
||||||
close(fd2);
|
close(fd2);
|
||||||
}
|
}
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
if(-1 == fstat(fd2, &st)){
|
if(-1 == fstat(fd2, &st)){
|
||||||
DPRN("Invalid file discriptor(errno=%d)", errno);
|
DPRN("Invalid file descriptor(errno=%d)", errno);
|
||||||
close(fd2);
|
close(fd2);
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ struct filepart
|
|||||||
{
|
{
|
||||||
bool uploaded; // does finish uploading
|
bool uploaded; // does finish uploading
|
||||||
std::string etag; // expected etag value
|
std::string etag; // expected etag value
|
||||||
int fd; // base file(temporary full file) discriptor
|
int fd; // base file(temporary full file) descriptor
|
||||||
off_t startpos; // seek fd point for uploading
|
off_t startpos; // seek fd point for uploading
|
||||||
ssize_t size; // uploading size
|
ssize_t size; // uploading size
|
||||||
etaglist_t* etaglist; // use only parallel upload
|
etaglist_t* etaglist; // use only parallel upload
|
||||||
|
@ -1001,10 +1001,10 @@ ssize_t FdEntity::Write(const char* bytes, off_t start, size_t size)
|
|||||||
// NOCACHE_PATH_PREFIX symbol needs for not using cache mode.
|
// NOCACHE_PATH_PREFIX symbol needs for not using cache mode.
|
||||||
// Now s3fs I/F functions in s3fs.cpp has left the processing
|
// Now s3fs I/F functions in s3fs.cpp has left the processing
|
||||||
// to FdManager and FdEntity class. FdManager class manages
|
// to FdManager and FdEntity class. FdManager class manages
|
||||||
// the list of local file stat and file discriptor in conjunction
|
// the list of local file stat and file descriptor in conjunction
|
||||||
// with the FdEntity class.
|
// with the FdEntity class.
|
||||||
// When s3fs is not using local cache, it means FdManager must
|
// When s3fs is not using local cache, it means FdManager must
|
||||||
// return new temporary file discriptor at each opening it.
|
// return new temporary file descriptor at each opening it.
|
||||||
// Then FdManager caches fd by key which is dummy file path
|
// Then FdManager caches fd by key which is dummy file path
|
||||||
// instead of real file path.
|
// instead of real file path.
|
||||||
// This process may not be complete, but it is easy way can
|
// This process may not be complete, but it is easy way can
|
||||||
@ -1176,7 +1176,7 @@ FdEntity* FdManager::GetFdEntity(const char* path, int existfd)
|
|||||||
if(0 == strcmp((*iter).second->GetPath(), path)){
|
if(0 == strcmp((*iter).second->GetPath(), path)){
|
||||||
return (*iter).second;
|
return (*iter).second;
|
||||||
}
|
}
|
||||||
// found fd, but it is used another file(file discriptor is recycled)
|
// found fd, but it is used another file(file descriptor is recycled)
|
||||||
// so returns NULL.
|
// so returns NULL.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1259,7 +1259,7 @@ FdEntity* FdManager::ExistOpen(const char* path, int existfd)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
// found fd, but it is used another file(file discriptor is recycled)
|
// found fd, but it is used another file(file descriptor is recycled)
|
||||||
// so returns NULL.
|
// so returns NULL.
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -102,7 +102,7 @@ class FdEntity
|
|||||||
int refcnt; // reference count
|
int refcnt; // reference count
|
||||||
std::string path; // object path
|
std::string path; // object path
|
||||||
std::string cachepath; // local cache file path
|
std::string cachepath; // local cache file path
|
||||||
int fd; // file discriptor(tmp file or cache file)
|
int fd; // file descriptor(tmp file or cache file)
|
||||||
FILE* file; // file pointer(tmp file or cache file)
|
FILE* file; // file pointer(tmp file or cache file)
|
||||||
bool is_modify; // if file is changed, this flag is true
|
bool is_modify; // if file is changed, this flag is true
|
||||||
|
|
||||||
|
29
src/s3fs.cpp
29
src/s3fs.cpp
@ -201,8 +201,13 @@ static int s3fs_readdir(const char* path, void* buf, fuse_fill_dir_t filler, off
|
|||||||
static int s3fs_access(const char* path, int mask);
|
static int s3fs_access(const char* path, int mask);
|
||||||
static void* s3fs_init(struct fuse_conn_info* conn);
|
static void* s3fs_init(struct fuse_conn_info* conn);
|
||||||
static void s3fs_destroy(void*);
|
static void s3fs_destroy(void*);
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
static int s3fs_setxattr(const char* path, const char* name, const char* value, size_t size, int flags, uint32_t position);
|
||||||
|
static int s3fs_getxattr(const char* path, const char* name, char* value, size_t size, uint32_t position);
|
||||||
|
#else
|
||||||
static int s3fs_setxattr(const char* path, const char* name, const char* value, size_t size, int flags);
|
static int s3fs_setxattr(const char* path, const char* name, const char* value, size_t size, int flags);
|
||||||
static int s3fs_getxattr(const char* path, const char* name, char* value, size_t size);
|
static int s3fs_getxattr(const char* path, const char* name, char* value, size_t size);
|
||||||
|
#endif
|
||||||
static int s3fs_listxattr(const char* path, char* list, size_t size);
|
static int s3fs_listxattr(const char* path, char* list, size_t size);
|
||||||
static int s3fs_removexattr(const char* path, const char* name);
|
static int s3fs_removexattr(const char* path, const char* name);
|
||||||
|
|
||||||
@ -1803,7 +1808,7 @@ static int s3fs_utimens_nocopy(const char* path, const struct timespec ts[2])
|
|||||||
FPRNN("[path=%s][mtime=%s]", path, str(ts[1].tv_sec).c_str());
|
FPRNN("[path=%s][mtime=%s]", path, str(ts[1].tv_sec).c_str());
|
||||||
|
|
||||||
if(0 == strcmp(path, "/")){
|
if(0 == strcmp(path, "/")){
|
||||||
DPRNNN("Could not change mtime for maount point.");
|
DPRNNN("Could not change mtime for mount point.");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
if(0 != (result = check_parent_object_access(path, X_OK))){
|
if(0 != (result = check_parent_object_access(path, X_OK))){
|
||||||
@ -2884,7 +2889,11 @@ static int set_xattrs_to_header(headers_t& meta, const char* name, const char* v
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
static int s3fs_setxattr(const char* path, const char* name, const char* value, size_t size, int flags, uint32_t position)
|
||||||
|
#else
|
||||||
static int s3fs_setxattr(const char* path, const char* name, const char* value, size_t size, int flags)
|
static int s3fs_setxattr(const char* path, const char* name, const char* value, size_t size, int flags)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
FPRN("[path=%s][name=%s][value=%p][size=%zu][flags=%d]", path, name, value, size, flags);
|
FPRN("[path=%s][name=%s][value=%p][size=%zu][flags=%d]", path, name, value, size, flags);
|
||||||
|
|
||||||
@ -2893,6 +2902,13 @@ static int s3fs_setxattr(const char* path, const char* name, const char* value,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
if (position != 0) {
|
||||||
|
// No resource fork support
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int result;
|
int result;
|
||||||
string strpath;
|
string strpath;
|
||||||
string newpath;
|
string newpath;
|
||||||
@ -2963,7 +2979,11 @@ static int s3fs_setxattr(const char* path, const char* name, const char* value,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
static int s3fs_getxattr(const char* path, const char* name, char* value, size_t size, uint32_t position)
|
||||||
|
#else
|
||||||
static int s3fs_getxattr(const char* path, const char* name, char* value, size_t size)
|
static int s3fs_getxattr(const char* path, const char* name, char* value, size_t size)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
FPRN("[path=%s][name=%s][value=%p][size=%zu]", path, name, value, size);
|
FPRN("[path=%s][name=%s][value=%p][size=%zu]", path, name, value, size);
|
||||||
|
|
||||||
@ -2971,6 +2991,13 @@ static int s3fs_getxattr(const char* path, const char* name, char* value, size_t
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (__APPLE__)
|
||||||
|
if (position != 0) {
|
||||||
|
// No resource fork support
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int result;
|
int result;
|
||||||
headers_t meta;
|
headers_t meta;
|
||||||
xattrs_t xattrs;
|
xattrs_t xattrs;
|
||||||
|
@ -314,6 +314,27 @@ ls 'special*' 2>&1 | grep -q 'No such file or directory'
|
|||||||
ls 'special~' 2>&1 | grep -q 'No such file or directory'
|
ls 'special~' 2>&1 | grep -q 'No such file or directory'
|
||||||
ls 'specialµ' 2>&1 | grep -q 'No such file or directory'
|
ls 'specialµ' 2>&1 | grep -q 'No such file or directory'
|
||||||
|
|
||||||
|
##########################################################
|
||||||
|
# Testing extended attributes
|
||||||
|
##########################################################
|
||||||
|
|
||||||
|
rm -f $TEST_TEXT_FILE
|
||||||
|
touch $TEST_TEXT_FILE
|
||||||
|
|
||||||
|
# set value
|
||||||
|
setfattr -n key1 -v value1 $TEST_TEXT_FILE
|
||||||
|
getfattr -n key1 --only-values $TEST_TEXT_FILE | grep -q '^value1$'
|
||||||
|
|
||||||
|
# append value
|
||||||
|
setfattr -n key2 -v value2 $TEST_TEXT_FILE
|
||||||
|
getfattr -n key1 --only-values $TEST_TEXT_FILE | grep -q '^value1$'
|
||||||
|
getfattr -n key2 --only-values $TEST_TEXT_FILE | grep -q '^value2$'
|
||||||
|
|
||||||
|
# remove value
|
||||||
|
setfattr -x key1 $TEST_TEXT_FILE
|
||||||
|
! getfattr -n key1 --only-values $TEST_TEXT_FILE
|
||||||
|
getfattr -n key2 --only-values $TEST_TEXT_FILE | grep -q '^value2$'
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
# Tests are finished
|
# Tests are finished
|
||||||
#####################################################################
|
#####################################################################
|
||||||
|
Loading…
Reference in New Issue
Block a user