summaryrefslogtreecommitdiff
path: root/source4/ntvfs/posix/pvfs_xattr.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2004-12-17 03:39:29 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:07:28 -0500
commit50005129ab0a5c5f2422460e6d7c19616e5e1124 (patch)
tree52136d40aec54f98539c6f684c048112566b0414 /source4/ntvfs/posix/pvfs_xattr.c
parentcf5cb51bfc7f7c23f366fcb902946d6f4feb2d3b (diff)
downloadsamba-50005129ab0a5c5f2422460e6d7c19616e5e1124.tar.gz
samba-50005129ab0a5c5f2422460e6d7c19616e5e1124.tar.bz2
samba-50005129ab0a5c5f2422460e6d7c19616e5e1124.zip
r4242: added support for storing xattrs in a tdb. This allows all advanced NT
attributes (streams, EAs, NT ACLs, timestamps etc) to be used on filesystems that don't support xattrs. It also allows for large streams, although they are very inefficient. I won't enable this by default, as I really wrote it as a way of testing large stream support while still using ext3, but perhaps with a bit more work this could be generally usable. To enable this use: posix:eadb = /home/test/myeas.tdb (This used to be commit 0c927d912cb65754351189d3a0442004a14aa5c6)
Diffstat (limited to 'source4/ntvfs/posix/pvfs_xattr.c')
-rw-r--r--source4/ntvfs/posix/pvfs_xattr.c93
1 files changed, 26 insertions, 67 deletions
diff --git a/source4/ntvfs/posix/pvfs_xattr.c b/source4/ntvfs/posix/pvfs_xattr.c
index 47549499e6..4487663e8d 100644
--- a/source4/ntvfs/posix/pvfs_xattr.c
+++ b/source4/ntvfs/posix/pvfs_xattr.c
@@ -21,12 +21,11 @@
*/
#include "includes.h"
-#include "system/filesys.h"
#include "vfs_posix.h"
#include "librpc/gen_ndr/ndr_xattr.h"
/*
- pull a xattr as a blob, from either a file or a file descriptor
+ pull a xattr as a blob
*/
static NTSTATUS pull_xattr_blob(struct pvfs_state *pvfs,
TALLOC_CTX *mem_ctx,
@@ -36,45 +35,16 @@ static NTSTATUS pull_xattr_blob(struct pvfs_state *pvfs,
size_t estimated_size,
DATA_BLOB *blob)
{
-#if HAVE_XATTR_SUPPORT
- int ret;
-
- *blob = data_blob_talloc(mem_ctx, NULL, estimated_size);
- if (blob->data == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
-again:
- if (fd != -1) {
- ret = fgetxattr(fd, attr_name, blob->data, estimated_size);
- } else {
- ret = getxattr(fname, attr_name, blob->data, estimated_size);
- }
- if (ret == -1 && errno == ERANGE) {
- estimated_size *= 2;
- blob->data = talloc_realloc(mem_ctx, blob->data, estimated_size);
- if (blob->data == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
- blob->length = estimated_size;
- goto again;
+ if (pvfs->ea_db) {
+ return pull_xattr_blob_tdb(pvfs, mem_ctx, attr_name, fname,
+ fd, estimated_size, blob);
}
-
- if (ret == -1) {
- data_blob_free(blob);
- return pvfs_map_errno(pvfs, errno);
- }
-
- blob->length = ret;
-
- return NT_STATUS_OK;
-#else
- return NT_STATUS_NOT_SUPPORTED;
-#endif
+ return pull_xattr_blob_system(pvfs, mem_ctx, attr_name, fname,
+ fd, estimated_size, blob);
}
/*
- push a xattr as a blob, from either a file or a file descriptor
+ push a xattr as a blob
*/
static NTSTATUS push_xattr_blob(struct pvfs_state *pvfs,
const char *attr_name,
@@ -82,22 +52,10 @@ static NTSTATUS push_xattr_blob(struct pvfs_state *pvfs,
int fd,
const DATA_BLOB *blob)
{
-#if HAVE_XATTR_SUPPORT
- int ret;
-
- if (fd != -1) {
- ret = fsetxattr(fd, attr_name, blob->data, blob->length, 0);
- } else {
- ret = setxattr(fname, attr_name, blob->data, blob->length, 0);
+ if (pvfs->ea_db) {
+ return push_xattr_blob_tdb(pvfs, attr_name, fname, fd, blob);
}
- if (ret == -1) {
- return pvfs_map_errno(pvfs, errno);
- }
-
- return NT_STATUS_OK;
-#else
- return NT_STATUS_NOT_SUPPORTED;
-#endif
+ return push_xattr_blob_system(pvfs, attr_name, fname, fd, blob);
}
@@ -107,24 +65,24 @@ static NTSTATUS push_xattr_blob(struct pvfs_state *pvfs,
static NTSTATUS delete_xattr(struct pvfs_state *pvfs, const char *attr_name,
const char *fname, int fd)
{
-#if HAVE_XATTR_SUPPORT
- int ret;
-
- if (fd != -1) {
- ret = fremovexattr(fd, attr_name);
- } else {
- ret = removexattr(fname, attr_name);
- }
- if (ret == -1) {
- return pvfs_map_errno(pvfs, errno);
+ if (pvfs->ea_db) {
+ return delete_xattr_tdb(pvfs, attr_name, fname, fd);
}
+ return delete_xattr_system(pvfs, attr_name, fname, fd);
+}
- return NT_STATUS_OK;
-#else
- return NT_STATUS_NOT_SUPPORTED;
-#endif
+/*
+ a hook called on unlink - allows the tdb xattr backend to cleanup
+*/
+NTSTATUS pvfs_xattr_unlink_hook(struct pvfs_state *pvfs, const char *fname)
+{
+ if (pvfs->ea_db) {
+ return unlink_xattr_tdb(pvfs, fname);
+ }
+ return unlink_xattr_system(pvfs, fname);
}
+
/*
load a NDR structure from a xattr
*/
@@ -211,7 +169,7 @@ NTSTATUS pvfs_dosattrib_load(struct pvfs_state *pvfs, struct pvfs_filename *name
/* not having a DosAttrib is not an error */
if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
talloc_free(mem_ctx);
- return NT_STATUS_OK;
+ return pvfs_stream_info(pvfs, name, fd);
}
if (!NT_STATUS_IS_OK(status)) {
@@ -493,3 +451,4 @@ NTSTATUS pvfs_xattr_save(struct pvfs_state *pvfs,
talloc_free(aname);
return status;
}
+