diff options
author | Anand V. Avati <avati@blackhole.gluster.com> | 2010-03-16 09:46:33 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2010-03-16 08:31:32 -0700 |
commit | 283ec9608e6cbc9393941d5fae901e558360d2bd (patch) | |
tree | 5d90ea94d5df8fd542b30d6e88f44b940133d9b2 /xlators/storage/posix/src/posix.c | |
parent | cc7515fc3db005383ffa575236ec29c212ed1e48 (diff) |
iatt: changes across the codebase
- libglusterfs
-- call-stub
-- inode
-- protocol
- libglusterfsclient
- cluster/replicate
- cluster/{dht,nufa,switch}
- cluster/unify
- cluster/HA
- cluster/map
- cluster/stripe
- debug/error-gen
- debug/trace
- debug/io-stats
- encryption/rot-13
- features/filter
- features/locks
- features/path-converter
- features/quota
- features/trash
- mount/fuse
- performance/io-threads
- performance/io-cache
- performance/quick-read
- performance/read-ahead
- performance/stat-prefetch
- performance/symlink-cache
- performance/write-behind
- protocol/client
- protocol/server
- storage-posix
Signed-off-by: Anand V. Avati <avati@blackhole.gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 361 (GlusterFS 3.0 should work on Mac OS/X)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=361
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r-- | xlators/storage/posix/src/posix.c | 696 |
1 files changed, 126 insertions, 570 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index f1541a2da..330fe80fa 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -80,7 +80,7 @@ typedef struct { xlator_t *this; const char *real_path; dict_t *xattr; - struct stat *stbuf; + struct iatt *stbuf; loc_t *loc; } posix_xattr_filler_t; @@ -112,11 +112,11 @@ _posix_xattr_get_set (dict_t *xattr_req, /* should size be put into the data_t ? */ if (!strcmp (key, "glusterfs.content") - && S_ISREG (filler->stbuf->st_mode)) { + && IA_ISREG (filler->stbuf->ia_type)) { /* file content request */ req_size = data_to_uint64 (data); - if (req_size >= filler->stbuf->st_size) { + if (req_size >= filler->stbuf->ia_size) { _fd = open (filler->real_path, O_RDONLY); if (_fd == -1) { @@ -126,7 +126,7 @@ _posix_xattr_get_set (dict_t *xattr_req, goto err; } - databuf = calloc (1, filler->stbuf->st_size); + databuf = calloc (1, filler->stbuf->ia_size); if (!databuf) { gf_log (filler->this->name, GF_LOG_ERROR, @@ -134,7 +134,7 @@ _posix_xattr_get_set (dict_t *xattr_req, goto err; } - ret = read (_fd, databuf, filler->stbuf->st_size); + ret = read (_fd, databuf, filler->stbuf->ia_size); if (ret == -1) { gf_log (filler->this->name, GF_LOG_ERROR, "Read on file %s failed: %s", @@ -152,7 +152,7 @@ _posix_xattr_get_set (dict_t *xattr_req, } ret = dict_set_bin (filler->xattr, key, - databuf, filler->stbuf->st_size); + databuf, filler->stbuf->ia_size); if (ret < 0) { goto err; } @@ -194,27 +194,29 @@ _posix_xattr_get_set (dict_t *xattr_req, static int -posix_scale_st_ino (struct posix_private *priv, struct stat *buf) +posix_scale_ia_ino (struct posix_private *priv, struct iatt *buf) { int i = 0; int ret = -1; ino_t temp_ino = 0; int r; - struct stat export_buf; + struct stat lstatbuf; + struct iatt export_buf; for (i = 0; i < priv->num_devices_to_span; i++) { - if (buf->st_dev == priv->st_device[i]) { + if (buf->ia_dev == priv->st_device[i]) { break; } if (priv->st_device[i] == 0) { - priv->st_device[i] = buf->st_dev; + priv->st_device[i] = buf->ia_dev; break; } } if (i == priv->num_devices_to_span) { - r = lstat (priv->base_path, &export_buf); - if ((r != 0) || (buf->st_dev != export_buf.st_dev)) { + r = lstat (priv->base_path, &lstatbuf); + iatt_from_stat (&export_buf, &lstatbuf); + if ((r != 0) || (buf->ia_gen != export_buf.ia_gen)) { goto out; } @@ -223,12 +225,12 @@ posix_scale_st_ino (struct posix_private *priv, struct stat *buf) "since init --- assuming done by automount", priv->base_path); - priv->st_device[0] = export_buf.st_dev; + priv->st_device[0] = export_buf.ia_dev; } - temp_ino = (buf->st_ino * priv->num_devices_to_span) + i; + temp_ino = (buf->ia_ino * priv->num_devices_to_span) + i; - buf->st_ino = temp_ino; + buf->ia_ino = temp_ino; ret = 0; out: @@ -237,29 +239,32 @@ out: int -posix_lstat_with_gen (xlator_t *this, const char *path, struct stat *stbuf_p) +posix_lstat_with_gen (xlator_t *this, const char *path, struct iatt *stbuf_p) { struct posix_private *priv = NULL; int ret = 0; char gen_key[1024] = {0, }; uint64_t gen_val_be = 0; uint64_t gen_val = 0; - struct stat stbuf = {0, }; + struct stat lstatbuf = {0, }; + struct iatt stbuf = {0, }; priv = this->private; - ret = lstat (path, &stbuf); + ret = lstat (path, &lstatbuf); if (ret == -1) return -1; - ret = posix_scale_st_ino (priv, &stbuf); + iatt_from_stat (&stbuf, &lstatbuf); + + ret = posix_scale_ia_ino (priv, &stbuf); if ((ret == -1) && !strcmp (path, "..")) { /* stat on ../ might land us outside the export directory, so don't panic */ gf_log (this->name, GF_LOG_WARNING, "Access to %s (on dev %lld) is crossing device (%lld)", - path, (unsigned long long) stbuf.st_dev, + path, (unsigned long long) stbuf.ia_dev, (unsigned long long) priv->st_device[0]); errno = EXDEV; return -1; @@ -267,7 +272,7 @@ posix_lstat_with_gen (xlator_t *this, const char *path, struct stat *stbuf_p) #ifndef GF_LINUX_HOST_OS if (!S_ISDIR (stbuf.st_mode) && !S_ISREG (stbuf.st_mode)) { - stbuf.st_dev = (typeof(stbuf.st_dev))stbuf.st_mtime; + stbuf.ia_gen = (typeof(stbuf.ia_gen))stbuf.ia_mtime; if (stbuf_p) *stbuf_p = stbuf; return 0; @@ -298,7 +303,7 @@ posix_lstat_with_gen (xlator_t *this, const char *path, struct stat *stbuf_p) if (ret >= 0) { ret = 0; - stbuf.st_dev = (typeof(stbuf.st_dev))gen_val; + stbuf.ia_gen = (typeof(stbuf.ia_gen))gen_val; if (stbuf_p) *stbuf_p = stbuf; } @@ -308,26 +313,29 @@ posix_lstat_with_gen (xlator_t *this, const char *path, struct stat *stbuf_p) int -posix_fstat_with_gen (xlator_t *this, int fd, struct stat *stbuf_p) +posix_fstat_with_gen (xlator_t *this, int fd, struct iatt *stbuf_p) { struct posix_private *priv = NULL; int ret = 0; char gen_key[1024] = {0, }; uint64_t gen_val_be = 0; uint64_t gen_val = 0; - struct stat stbuf = {0, }; + struct stat fstatbuf = {0, }; + struct iatt stbuf = {0, }; priv = this->private; - ret = fstat (fd, &stbuf); + ret = fstat (fd, &fstatbuf); if (ret == -1) return -1; - ret = posix_scale_st_ino (priv, &stbuf); + iatt_from_stat (&stbuf, &fstatbuf); + + ret = posix_scale_ia_ino (priv, &stbuf); if (ret == -1) { gf_log (this->name, GF_LOG_WARNING, "Access to fd %d (on dev %lld) is crossing device (%lld)", - fd, (unsigned long long) stbuf.st_dev, + fd, (unsigned long long) stbuf.ia_dev, (unsigned long long) priv->st_device[0]); errno = EXDEV; return -1; @@ -335,7 +343,7 @@ posix_fstat_with_gen (xlator_t *this, int fd, struct stat *stbuf_p) #ifndef GF_LINUX_HOST_OS if (!S_ISDIR (stbuf.st_mode) && !S_ISREG (stbuf.st_mode)) { - stbuf.st_dev = (typeof(stbuf.st_dev))stbuf.st_mtime; + stbuf.ia_gen = (typeof(stbuf.ia_gen))stbuf.ia_mtime; return 0; } #endif /* !GF_LINUX_HOST_OS */ @@ -364,7 +372,7 @@ posix_fstat_with_gen (xlator_t *this, int fd, struct stat *stbuf_p) if (ret >= 0) { ret = 0; - stbuf.st_dev = (typeof(stbuf.st_dev))gen_val; + stbuf.ia_gen = (typeof(stbuf.ia_gen))gen_val; if (stbuf_p) *stbuf_p = stbuf; } @@ -375,7 +383,7 @@ posix_fstat_with_gen (xlator_t *this, int fd, struct stat *stbuf_p) dict_t * posix_lookup_xattr_fill (xlator_t *this, const char *real_path, loc_t *loc, - dict_t *xattr_req, struct stat *buf) + dict_t *xattr_req, struct iatt *buf) { dict_t *xattr = NULL; posix_xattr_filler_t filler = {0, }; @@ -410,7 +418,7 @@ setgid_override (xlator_t *this, char *real_path, gid_t *gid) { char * tmp_path = NULL; char * parent_path = NULL; - struct stat parent_stbuf; + struct iatt parent_stbuf; int op_ret = 0; @@ -434,13 +442,13 @@ setgid_override (xlator_t *this, char *real_path, gid_t *gid) goto out; } - if (parent_stbuf.st_mode & S_ISGID) { + if (parent_stbuf.ia_prot.sgid) { /* Entries created inside a setgid directory should inherit the gid from the parent */ - *gid = parent_stbuf.st_gid; + *gid = parent_stbuf.ia_gid; } out: @@ -455,7 +463,7 @@ int32_t posix_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req) { - struct stat buf = {0, }; + struct iatt buf = {0, }; char * real_path = NULL; int32_t op_ret = -1; int32_t entry_ret = 0; @@ -463,7 +471,7 @@ posix_lookup (call_frame_t *frame, xlator_t *this, dict_t * xattr = NULL; char * pathdup = NULL; char * parentpath = NULL; - struct stat postparent = {0,}; + struct iatt postparent = {0,}; struct posix_private *priv = NULL; VALIDATE_OR_GOTO (frame, out); @@ -534,7 +542,7 @@ posix_stat (call_frame_t *frame, xlator_t *this, loc_t *loc) { - struct stat buf = {0,}; + struct iatt buf = {0,}; char * real_path = NULL; int32_t op_ret = -1; int32_t op_errno = 0; @@ -573,13 +581,15 @@ posix_stat (call_frame_t *frame, static int posix_do_chmod (xlator_t *this, const char *path, - struct stat *stbuf) + struct iatt *stbuf) { int32_t ret = -1; + mode_t mode = 0; - ret = lchmod (path, stbuf->st_mode); + mode = st_mode_from_ia (stbuf->ia_prot, stbuf->ia_type); + ret = lchmod (path, mode); if ((ret == -1) && (errno == ENOSYS)) { - ret = chmod (path, stbuf->st_mode); + ret = chmod (path, mode); } return ret; @@ -588,7 +598,7 @@ posix_do_chmod (xlator_t *this, static int posix_do_chown (xlator_t *this, const char *path, - struct stat *stbuf, + struct iatt *stbuf, int32_t valid) { int32_t ret = -1; @@ -596,10 +606,10 @@ posix_do_chown (xlator_t *this, gid_t gid = -1; if (valid & GF_SET_ATTR_UID) - uid = stbuf->st_uid; + uid = stbuf->ia_uid; if (valid & GF_SET_ATTR_GID) - gid = stbuf->st_gid; + gid = stbuf->ia_gid; ret = lchown (path, uid, gid); @@ -609,15 +619,15 @@ posix_do_chown (xlator_t *this, static int posix_do_utimes (xlator_t *this, const char *path, - struct stat *stbuf) + struct iatt *stbuf) { int32_t ret = -1; struct timeval tv[2] = {{0,},{0,}}; - tv[0].tv_sec = stbuf->st_atime; - tv[0].tv_usec = ST_ATIM_NSEC (stbuf) / 1000; - tv[1].tv_sec = stbuf->st_mtime; - tv[1].tv_usec = ST_MTIM_NSEC (stbuf) / 1000; + tv[0].tv_sec = stbuf->ia_atime; + tv[0].tv_usec = stbuf->ia_atime_nsec / 1000; + tv[1].tv_sec = stbuf->ia_mtime; + tv[1].tv_usec = stbuf->ia_mtime_nsec / 1000; ret = utimes (path, tv); @@ -626,13 +636,13 @@ posix_do_utimes (xlator_t *this, int posix_setattr (call_frame_t *frame, xlator_t *this, - loc_t *loc, struct stat *stbuf, int32_t valid) + loc_t *loc, struct iatt *stbuf, int32_t valid) { int32_t op_ret = -1; int32_t op_errno = 0; char * real_path = 0; - struct stat statpre = {0,}; - struct stat statpost = {0,}; + struct iatt statpre = {0,}; + struct iatt statpost = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -720,7 +730,7 @@ out: int32_t posix_do_fchown (xlator_t *this, int fd, - struct stat *stbuf, + struct iatt *stbuf, int32_t valid) { int ret = -1; @@ -728,10 +738,10 @@ posix_do_fchown (xlator_t *this, gid_t gid = -1; if (valid & GF_SET_ATTR_UID) - uid = stbuf->st_uid; + uid = stbuf->ia_uid; if (valid & GF_SET_ATTR_GID) - gid = stbuf->st_gid; + gid = stbuf->ia_gid; ret = fchown (fd, uid, gid); @@ -741,15 +751,18 @@ posix_do_fchown (xlator_t *this, int32_t posix_do_fchmod (xlator_t *this, - int fd, struct stat *stbuf) + int fd, struct iatt *stbuf) { - return fchmod (fd, stbuf->st_mode); + mode_t mode = 0; + + mode = st_mode_from_ia (stbuf->ia_prot, stbuf->ia_type); + return fchmod (fd, mode); } static int posix_do_futimes (xlator_t *this, int fd, - struct stat *stbuf) + struct iatt *stbuf) { errno = ENOSYS; return -1; @@ -757,12 +770,12 @@ posix_do_futimes (xlator_t *this, int posix_fsetattr (call_frame_t *frame, xlator_t *this, - fd_t *fd, struct stat *stbuf, int32_t valid) + fd_t *fd, struct iatt *stbuf, int32_t valid) { int32_t op_ret = -1; int32_t op_errno = 0; - struct stat statpre = {0,}; - struct stat statpost = {0,}; + struct iatt statpre = {0,}; + struct iatt statpost = {0,}; struct posix_fd *pfd = NULL; uint64_t tmp_pfd = 0; int32_t ret = -1; @@ -940,185 +953,11 @@ posix_opendir (call_frame_t *frame, xlator_t *this, } -int32_t +int posix_getdents (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, off_t off, int32_t flag) { - int32_t op_ret = -1; - int32_t op_errno = 0; - char *real_path = NULL; - dir_entry_t entries = {0, }; - dir_entry_t *tmp = NULL; - DIR *dir = NULL; - struct dirent *dirent = NULL; - int real_path_len = -1; - int entry_path_len = -1; - char *entry_path = NULL; - int count = 0; - struct posix_fd *pfd = NULL; - uint64_t tmp_pfd = 0; - struct stat buf = {0,}; - int ret = -1; - char tmp_real_path[ZR_PATH_MAX]; - char linkpath[ZR_PATH_MAX]; - struct posix_private *priv = NULL; - - DECLARE_OLD_FS_ID_VAR ; - - VALIDATE_OR_GOTO (frame, out); - VALIDATE_OR_GOTO (this, out); - VALIDATE_OR_GOTO (fd, out); - - priv = this->private; - VALIDATE_OR_GOTO (priv, out); - - SET_FS_ID (frame->root->uid, frame->root->gid); - - ret = fd_ctx_get (fd, this, &tmp_pfd); - if (ret < 0) { - op_errno = -ret; - gf_log (this->name, GF_LOG_DEBUG, - "fd %p does not have context in %s", - fd, this->name); - goto out; - } - pfd = (struct posix_fd *)(long)tmp_pfd; - if (!pfd->path) { - op_errno = EBADFD; - gf_log (this->name, GF_LOG_DEBUG, - "pfd does not have path set (possibly file " - "fd, fd=%p)", fd); - goto out; - } - - real_path = pfd->path; - real_path_len = strlen (real_path); - - entry_path_len = real_path_len + NAME_MAX; - entry_path = CALLOC (1, entry_path_len); - - if (!entry_path) { - op_errno = errno; - gf_log (this->name, GF_LOG_ERROR, - "Out of memory."); - goto out; - } - - strncpy (entry_path, real_path, entry_path_len); - entry_path[real_path_len] = '/'; - - dir = pfd->dir; - - if (!dir) { - op_errno = EBADFD; - gf_log (this->name, GF_LOG_DEBUG, - "pfd does not have dir set (possibly file fd, " - "fd=%p, path=`%s'", - fd, real_path); - goto out; - } - - /* TODO: check for all the type of flag, and behave appropriately */ - - while ((dirent = readdir (dir))) { - if (!dirent) - break; - - /* This helps in self-heal, when only directories - needs to be replicated */ - - /* This is to reduce the network traffic, in case only - directory is needed from posix */ - - strncpy (tmp_real_path, real_path, ZR_PATH_MAX); - strncat (tmp_real_path, "/", - ZR_PATH_MAX - strlen (tmp_real_path)); - - strncat (tmp_real_path, dirent->d_name, - ZR_PATH_MAX - (strlen (tmp_real_path) + 1)); - - ret = posix_lstat_with_gen (this, tmp_real_path, &buf); - - if ((flag == GF_GET_DIR_ONLY) - && (ret != -1 && !S_ISDIR(buf.st_mode))) { - continue; - } - - tmp = CALLOC (1, sizeof (*tmp)); - - if (!tmp) { - op_errno = errno; - gf_log (this->name, GF_LOG_ERROR, - "Out of memory."); - goto out; - } - - tmp->name = strdup (dirent->d_name); - if (!tmp->name) { - op_errno = errno; - gf_log (this->name, GF_LOG_ERROR, - "Out of memory."); - goto out; - } - - if (entry_path_len < - (real_path_len + 1 + strlen (tmp->name) + 1)) { - entry_path_len = (real_path_len + - strlen (tmp->name) + 1024); - - entry_path = realloc (entry_path, entry_path_len); - } - - strcpy (&entry_path[real_path_len+1], tmp->name); - - tmp->buf = buf; - - if (S_ISLNK(tmp->buf.st_mode)) { - - ret = readlink (entry_path, linkpath, ZR_PATH_MAX); - if (ret != -1) { - linkpath[ret] = '\0'; - tmp->link = strdup (linkpath); - } - } else { - tmp->link = ""; - } - - count++; - - tmp->next = entries.next; - entries.next = tmp; - - /* if size is 0, count can never be = size, so entire - dir is read */ - if (count == size) - break; - } - - FREE (entry_path); - - op_ret = 0; - - out: - SET_TO_OLD_FS_ID (); - - if (op_ret == -1) { - if (entry_path) - FREE (entry_path); - } - - STACK_UNWIND_STRICT (getdents, frame, op_ret, op_errno, - &entries, count); - - if (op_ret == 0) { - while (entries.next) { - tmp = entries.next; - entries.next = entries.next->next; - FREE (tmp->name); - FREE (tmp); - } - } - + STACK_UNWIND_STRICT (getdents, frame, -1, ENOSYS, NULL, 0); return 0; } @@ -1188,7 +1027,7 @@ posix_readlink (call_frame_t *frame, xlator_t *this, int32_t lstat_ret = -1; int32_t op_errno = 0; char * real_path = NULL; - struct stat stbuf = {0,}; + struct iatt stbuf = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -1237,13 +1076,13 @@ posix_mknod (call_frame_t *frame, xlator_t *this, int32_t op_ret = -1; int32_t op_errno = 0; char *real_path = 0; - struct stat stbuf = { 0, }; + struct iatt stbuf = { 0, }; char was_present = 1; struct posix_private *priv = NULL; gid_t gid = 0; char *pathdup = NULL; - struct stat preparent = {0,}; - struct stat postparent = {0,}; + struct iatt preparent = {0,}; + struct iatt postparent = {0,}; char *parentpath = NULL; DECLARE_OLD_FS_ID_VAR; @@ -1503,14 +1342,14 @@ posix_mkdir (call_frame_t *frame, xlator_t *this, int32_t op_ret = -1; int32_t op_errno = 0; char *real_path = NULL; - struct stat stbuf = {0, }; + struct iatt stbuf = {0, }; char was_present = 1; struct posix_private *priv = NULL; gid_t gid = 0; char *pathdup = NULL; char *parentpath = NULL; - struct stat preparent = {0,}; - struct stat postparent = {0,}; + struct iatt preparent = {0,}; + struct iatt postparent = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -1617,8 +1456,8 @@ posix_unlink (call_frame_t *frame, xlator_t *this, char *parentpath = NULL; int32_t fd = -1; struct posix_private *priv = NULL; - struct stat preparent = {0,}; - struct stat postparent = {0,}; + struct iatt preparent = {0,}; + struct iatt postparent = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -1645,7 +1484,7 @@ posix_unlink (call_frame_t *frame, xlator_t *this, priv = this->private; if (priv->background_unlink) { - if (S_ISREG (loc->inode->st_mode)) { + if (IA_ISREG (loc->inode->ia_type)) { fd = open (real_path, O_RDONLY); if (fd == -1) { op_ret = -1; @@ -1703,8 +1542,8 @@ posix_rmdir (call_frame_t *frame, xlator_t *this, char * real_path = NULL; char * pathdup = NULL; char * parentpath = NULL; - struct stat preparent = {0,}; - struct stat postparent = {0,}; + struct iatt preparent = {0,}; + struct iatt postparent = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -1774,14 +1613,14 @@ posix_symlink (call_frame_t *frame, xlator_t *this, int32_t op_ret = -1; int32_t op_errno = 0; char * real_path = 0; - struct stat stbuf = { 0, }; + struct iatt stbuf = { 0, }; struct posix_private *priv = NULL; gid_t gid = 0; char was_present = 1; char *pathdup = NULL; char *parentpath = NULL; - struct stat preparent = {0,}; - struct stat postparent = {0,}; + struct iatt preparent = {0,}; + struct iatt postparent = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -1886,17 +1725,17 @@ posix_rename (call_frame_t *frame, xlator_t *this, int32_t op_errno = 0; char *real_oldpath = NULL; char *real_newpath = NULL; - struct stat stbuf = {0, }; + struct iatt stbuf = {0, }; struct posix_private *priv = NULL; char was_present = 1; char *oldpathdup = NULL; char *oldparentpath = NULL; char *newpathdup = NULL; char *newparentpath = NULL; - struct stat preoldparent = {0, }; - struct stat postoldparent = {0, }; - struct stat prenewparent = {0, }; - struct stat postnewparent = {0, }; + struct iatt preoldparent = {0, }; + struct iatt postoldparent = {0, }; + struct iatt prenewparent = {0, }; + struct iatt postnewparent = {0, }; DECLARE_OLD_FS_ID_VAR; @@ -2014,13 +1853,13 @@ posix_link (call_frame_t *frame, xlator_t *this, int32_t op_errno = 0; char *real_oldpath = 0; char *real_newpath = 0; - struct stat stbuf = {0, }; + struct iatt stbuf = {0, }; struct posix_private *priv = NULL; char was_present = 1; char *newpathdup = NULL; char *newparentpath = NULL; - struct stat preparent = {0,}; - struct stat postparent = {0,}; + struct iatt preparent = {0,}; + struct iatt postparent = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -2111,8 +1950,8 @@ posix_truncate (call_frame_t *frame, int32_t op_errno = 0; char *real_path = 0; struct posix_private *priv = NULL; - struct stat prebuf = {0,}; - struct stat postbuf = {0,}; + struct iatt prebuf = {0,}; + struct iatt postbuf = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -2174,7 +2013,7 @@ posix_create (call_frame_t *frame, xlator_t *this, int32_t _fd = -1; int _flags = 0; char * real_path = NULL; - struct stat stbuf = {0, }; + struct iatt stbuf = {0, }; struct posix_fd * pfd = NULL; struct posix_private * priv = NULL; char was_present = 1; @@ -2182,8 +2021,8 @@ posix_create (call_frame_t *frame, xlator_t *this, gid_t gid = 0; char *pathdup = NULL; char *parentpath = NULL; - struct stat preparent = {0,}; - struct stat postparent = {0,}; + struct iatt preparent = {0,}; + struct iatt postparent = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -2327,7 +2166,7 @@ posix_open (call_frame_t *frame, xlator_t *this, struct posix_private *priv = NULL; char was_present = 1; gid_t gid = 0; - struct stat stbuf = {0, }; + struct iatt stbuf = {0, }; DECLARE_OLD_FS_ID_VAR; @@ -2443,7 +2282,7 @@ posix_readv (call_frame_t *frame, xlator_t *this, struct iobref * iobref = NULL; struct iovec vec = {0,}; struct posix_fd * pfd = NULL; - struct stat stbuf = {0,}; + struct iatt stbuf = {0,}; int align = 1; int ret = -1; @@ -2531,9 +2370,9 @@ posix_readv (call_frame_t *frame, xlator_t *this, } /* Hack to notify higher layers of EOF. */ - if (stbuf.st_size == 0) + if (stbuf.ia_size == 0) op_errno = ENOENT; - else if ((offset + vec.iov_len) == stbuf.st_size) + else if ((offset + vec.iov_len) == stbuf.ia_size) op_errno = ENOENT; op_ret = vec.iov_len; @@ -2561,8 +2400,8 @@ posix_writev (call_frame_t *frame, xlator_t *this, int _fd = -1; struct posix_private * priv = NULL; struct posix_fd * pfd = NULL; - struct stat preop = {0,}; - struct stat postop = {0,}; + struct iatt preop = {0,}; + struct iatt postop = {0,}; int ret = -1; int idx = 0; @@ -2859,8 +2698,8 @@ posix_fsync (call_frame_t *frame, xlator_t *this, struct posix_fd * pfd = NULL; int ret = -1; uint64_t tmp_pfd = 0; - struct stat preop = {0,}; - struct stat postop = {0,}; + struct iatt preop = {0,}; + struct iatt postop = {0,}; DECLARE_OLD_FS_ID_VAR; @@ -3111,7 +2950,7 @@ get_file_contents (xlator_t *this, char *real_path, char real_filepath[ZR_PATH_MAX] = {0,}; char * key = NULL; int32_t file_fd = -1; - struct stat stbuf = {0,}; + struct iatt stbuf = {0,}; int op_ret = 0; int ret = -1; @@ -3135,7 +2974,7 @@ get_file_contents (xlator_t *this, char *real_path, goto out; } - *contents = CALLOC (stbuf.st_size + 1, sizeof(char)); + *contents = CALLOC (stbuf.ia_size + 1, sizeof(char)); if (! *contents) { op_ret = -errno; @@ -3143,7 +2982,7 @@ get_file_contents (xlator_t *this, char *real_path, goto out; } - ret = read (file_fd, *contents, stbuf.st_size); + ret = read (file_fd, *contents, stbuf.ia_size); if (ret <= 0) { op_ret = -1; gf_log (this->name, GF_LOG_ERROR, "read on %s failed: %s", @@ -3151,7 +2990,7 @@ get_file_contents (xlator_t *this, char *real_path, goto out; } - *contents[stbuf.st_size] = '\0'; + *contents[stbuf.ia_size] = '\0'; op_ret = close (file_fd); file_fd = -1; @@ -3208,7 +3047,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this, priv = this->private; - if (loc->inode && S_ISDIR(loc->inode->st_mode) && name && + if (loc->inode && IA_ISDIR(loc->inode->ia_type) && name && ZR_FILE_CONTENT_REQUEST(name)) { ret = get_file_contents (this, real_path, name, &file_contents); @@ -3228,7 +3067,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this, goto out; } - if (loc->inode && S_ISREG (loc->inode->st_mode) && name && + if (loc->inode && IA_ISREG (loc->inode->ia_type) && name && (strcmp (name, "trusted.glusterfs.location") == 0)) { ret = dict_set_static_ptr (dict, "trusted.glusterfs.location", @@ -3884,8 +3723,8 @@ posix_ftruncate (call_frame_t *frame, xlator_t *this, int32_t op_ret = -1; int32_t op_errno = 0; int _fd = -1; - struct stat preop = {0,}; - struct stat postop = {0,}; + struct iatt preop = {0,}; + struct iatt postop = {0,}; struct posix_fd *pfd = NULL; int ret = -1; uint64_t tmp_pfd = 0; @@ -3951,300 +3790,17 @@ posix_ftruncate (call_frame_t *frame, xlator_t *this, } -static int -same_file_type (mode_t m1, mode_t m2) -{ - return ((S_IFMT & (m1 ^ m2)) == 0); -} - - -static int -ensure_file_type (xlator_t *this, char *pathname, mode_t mode) -{ - struct stat stbuf = {0,}; - int op_ret = 0; - int ret = -1; - - ret = posix_lstat_with_gen (this, pathname, &stbuf); - if (ret == -1) { - op_ret = -errno; - gf_log (this->name, GF_LOG_ERROR, - "stat failed while trying to make sure entry %s " - "is a directory: %s", pathname, strerror (errno)); - goto out; - } - - if (!same_file_type (mode, stbuf.st_mode)) { - op_ret = -EEXIST; - gf_log (this->name, GF_LOG_ERROR, - "entry %s is a different type of file " - "than expected", pathname); - goto out; - } - out: - return op_ret; -} - -static int -create_entry (xlator_t *this, int32_t flags, - dir_entry_t *entry, char *pathname) -{ - int op_ret = 0; - int ret = -1; - struct timeval tv[2] = {{0,0},{0,0}}; - - if (S_ISDIR (entry->buf.st_mode)) { - /* - * If the entry is directory, create it by - * calling 'mkdir'. If the entry is already - * present, check if it is a directory, - * and issue a warning if otherwise. - */ - - ret = mkdir (pathname, entry->buf.st_mode); - if (ret == -1) { - if (errno == EEXIST) { - op_ret = ensure_file_type (this, pathname, - entry->buf.st_mode); - } - else { - op_ret = -errno; - gf_log (this->name, GF_LOG_ERROR, - "mkdir %s with mode (0%o) failed: %s", - pathname, entry->buf.st_mode, - strerror (errno)); - goto out; - } - } - - } else if ((flags & GF_SET_IF_NOT_PRESENT) - || !(flags & GF_SET_DIR_ONLY)) { - - /* create a 0-byte file here */ - - if (S_ISREG (entry->buf.st_mode)) { - ret = open (pathname, O_CREAT|O_EXCL, - entry->buf.st_mode); - - if (ret == -1) { - if (errno == EEXIST) { - op_ret = ensure_file_type (this, - pathname, - entry->buf.st_mode); - } - else { - op_ret = -errno; - gf_log (this->name, GF_LOG_ERROR, - "Error creating file %s with " - "mode (0%o): %s", - pathname, entry->buf.st_mode, - strerror (errno)); - goto out; - } - } - - close (ret); - - } else if (S_ISLNK (entry->buf.st_mode)) { - ret = symlink (entry->link, pathname); - - if (ret == -1) { - if (errno == EEXIST) { - op_ret = ensure_file_type (this, - pathname, - entry->buf.st_mode); - } - else { - op_ret = -errno; - gf_log (this->name, GF_LOG_ERROR, - "error creating symlink %s: %s" - , pathname, strerror (errno)); - goto out; - } - } - - } else if (S_ISBLK (entry->buf.st_mode) || - S_ISCHR (entry->buf.st_mode) || - S_ISFIFO (entry->buf.st_mode) || - S_ISSOCK (entry->buf.st_mode)) { - - ret = mknod (pathname, entry->buf.st_mode, - entry->buf.st_dev); - - if (ret == -1) { - if (errno == EEXIST) { - op_ret = ensure_file_type (this, - pathname, - entry->buf.st_mode); - } else { - op_ret = -errno; - gf_log (this->name, GF_LOG_ERROR, - "error creating device file " - "%s: %s", - pathname, strerror (errno)); - goto out; - } - } - } else { - gf_log (this->name, GF_LOG_ERROR, - "invalid mode 0%o for %s", entry->buf.st_mode, - pathname); - op_ret = -EINVAL; - goto out; - } - } - - /* - * Preserve atime and mtime - */ - - if (!S_ISLNK (entry->buf.st_mode)) { - tv[0].tv_sec = entry->buf.st_atime; - tv[1].tv_sec = entry->buf.st_mtime; - ret = utimes (pathname, tv); - if (ret == -1) { - op_ret = -errno; - gf_log (this->name, GF_LOG_ERROR, - "utimes %s failed: %s", - pathname, strerror (errno)); - goto out; - } - } - -out: - return op_ret; - -} - - int posix_setdents (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags, dir_entry_t *entries, int32_t count) { - char * real_path = NULL; - char * entry_path = NULL; - int32_t real_path_len = -1; - int32_t entry_path_len = -1; - int32_t ret = 0; - int32_t op_ret = -1; - int32_t op_errno = 0; - struct posix_fd * pfd = {0, }; - struct timeval tv[2] = {{0, }, {0, }}; - uint64_t tmp_pfd = 0; - char pathname[ZR_PATH_MAX] = {0,}; - dir_entry_t * trav = NULL; - - VALIDATE_OR_GOTO (frame, out); - VALIDATE_OR_GOTO (this, out); - VALIDATE_OR_GOTO (fd, out); - VALIDATE_OR_GOTO (entries, out); - - tv[0].tv_sec = tv[0].tv_usec = 0; - tv[1].tv_sec = tv[1].tv_usec = 0; - - ret = fd_ctx_get (fd, this, &tmp_pfd); - if (ret < 0) { - op_errno = -ret; - gf_log (this->name, GF_LOG_DEBUG, - "fd's ctx not found on fd=%p for %s", - fd, this->name); - goto out; - } - pfd = (struct posix_fd *)(long)tmp_pfd; - - real_path = pfd->path; - - if (!real_path) { - op_errno = EINVAL; - gf_log (this->name, GF_LOG_DEBUG, - "path is NULL on pfd=%p fd=%p", pfd, fd); - goto out; - } - - real_path_len = strlen (real_path); - entry_path_len = real_path_len + 256; - entry_path = CALLOC (1, entry_path_len); - - if (!entry_path) { - op_errno = errno; - gf_log (this->name, GF_LOG_ERROR, "Out of memory."); - goto out; - } - - strcpy (entry_path, real_path); - entry_path[real_path_len] = '/'; - - /* fd exists, and everything looks fine */ - /** - * create an entry for each one present in '@entries' - * - if flag is set (ie, if its namespace), create both directories - * and files - * - if not set, create only directories. - * - * after the entry is created, change the mode and ownership of the - * entry according to the stat present in entries->buf. - */ - - trav = entries->next; - while (trav) { - strcpy (pathname, entry_path); - strcat (pathname, trav->name); - - ret = create_entry (this, flags, trav, pathname); - if (ret < 0) { - op_errno = -ret; - goto out; - } - - /* TODO: handle another flag, GF_SET_OVERWRITE */ - - /* Change the mode */ - if (!S_ISLNK (trav->buf.st_mode)) { - ret = chmod (pathname, trav->buf.st_mode); - if (ret == -1) { - op_errno = errno; - gf_log (this->name, GF_LOG_ERROR, - "chmod on %s failed: %s", pathname, - strerror (op_errno)); - goto out; - } - } - - /* change the ownership */ - ret = lchown (pathname, trav->buf.st_uid, trav->buf.st_gid); - if (ret == -1) { - op_errno = errno; - gf_log (this->name, GF_LOG_ERROR, - "chmod on %s failed: %s", pathname, - strerror (op_errno)); - goto out; - } - - if (flags & GF_SET_EPOCH_TIME) { - ret = utimes (pathname, tv); - if (ret == -1) { - op_errno = errno; - gf_log (this->name, GF_LOG_ERROR, - "utimes on %s failed: %s", pathname, - strerror (op_errno)); - goto out; - } - } - - /* consider the next entry */ - trav = trav->next; - } - - op_ret = 0; - out: - STACK_UNWIND_STRICT (setdents, frame, op_ret, op_errno); - if (entry_path) - FREE (entry_path); + STACK_UNWIND_STRICT (setdents, frame, -1, ENOSYS); return 0; } + int32_t posix_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd) @@ -4252,7 +3808,7 @@ posix_fstat (call_frame_t *frame, xlator_t *this, int _fd = -1; int32_t op_ret = -1; int32_t op_errno = 0; - struct stat buf = {0,}; + struct iatt buf = {0,}; struct posix_fd *pfd = NULL; uint64_t tmp_pfd = 0; int ret = -1; @@ -4389,7 +3945,7 @@ posix_do_readdir (call_frame_t *frame, xlator_t *this, char *entry_path = NULL; int entry_path_len = -1; struct posix_private *priv = NULL; - struct stat stbuf = {0, }; + struct iatt stbuf = {0, }; VALIDATE_OR_GOTO (frame, out); VALIDATE_OR_GOTO (this, out); @@ -4489,7 +4045,7 @@ posix_do_readdir (call_frame_t *frame, xlator_t *this, if (-1 == op_ret) continue; } else - stbuf.st_ino = entry->d_ino; + stbuf.ia_ino = entry->d_ino; /* So at this point stbuf ino is either: * a. the original inode number got from entry, in case this @@ -4498,7 +4054,7 @@ posix_do_readdir (call_frame_t *frame, xlator_t *this, * b. the scaled inode number, if device spanning was enabled * or this was a readdirp fop. */ - entry->d_ino = stbuf.st_ino; + entry->d_ino = stbuf.ia_ino; this_entry = gf_dirent_for_name (entry->d_name); @@ -4665,7 +4221,7 @@ posix_checksum (call_frame_t *frame, xlator_t *this, int i = 0; int length = 0; - struct stat buf = {0,}; + struct iatt buf = {0,}; char tmp_real_path[ZR_PATH_MAX] = {0,}; int ret = -1; @@ -4704,7 +4260,7 @@ posix_checksum (call_frame_t *frame, xlator_t *this, if (ret == -1) continue; - if (S_ISDIR (buf.st_mode)) { + if (IA_ISDIR (buf.ia_type)) { for (i = 0; i < length; i++) dir_checksum[i] ^= dirent->d_name[i]; } else { |