summaryrefslogtreecommitdiffstats
path: root/api
diff options
context:
space:
mode:
Diffstat (limited to 'api')
-rw-r--r--api/src/gfapi.aliases4
-rw-r--r--api/src/gfapi.map2
-rw-r--r--api/src/glfs-fops.c118
-rw-r--r--api/src/glfs-handleops.c2
-rw-r--r--api/src/glfs-handles.h10
-rw-r--r--api/src/glfs-internal.h3
-rw-r--r--api/src/glfs.h60
7 files changed, 135 insertions, 64 deletions
diff --git a/api/src/gfapi.aliases b/api/src/gfapi.aliases
index 4cafd1f0174..f4f0a2ceaa9 100644
--- a/api/src/gfapi.aliases
+++ b/api/src/gfapi.aliases
@@ -191,4 +191,6 @@ _pub_glfs_ftruncate _glfs_ftruncate$GFAPI_future
_pub_glfs_ftruncate_async _glfs_ftruncate_async$GFAPI_future
_pub_glfs_discard_async _glfs_discard_async$GFAPI_future
_pub_glfs_zerofill_async _glfs_zerofill_async$GFAPI_future
-_pub_glfs_copy_file_range _glfs_copy_file_range$GFAPI_future \ No newline at end of file
+_pub_glfs_copy_file_range _glfs_copy_file_range$GFAPI_future
+_pub_glfs_fsetattr _glfs_fsetattr$GFAPI_future
+_pub_glfs_setattr _glfs_setattr$GFAPI_future
diff --git a/api/src/gfapi.map b/api/src/gfapi.map
index 332af129d99..676cd9f6d60 100644
--- a/api/src/gfapi.map
+++ b/api/src/gfapi.map
@@ -262,5 +262,7 @@ GFAPI_future {
glfs_discard_async;
glfs_zerofill_async;
glfs_copy_file_range;
+ glfs_setattr;
+ glfs_fsetattr;
} GFAPI_PRIVATE_future;
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c
index 6d81bd85498..c052bae4f90 100644
--- a/api/src/glfs-fops.c
+++ b/api/src/glfs-fops.c
@@ -3914,8 +3914,8 @@ invalid_fs:
GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_statvfs, 3.4.0);
int
-glfs_setattr(struct glfs *fs, const char *path, struct iatt *iatt, int valid,
- int follow)
+pub_glfs_setattr(struct glfs *fs, const char *path, struct stat *stat,
+ int valid, int follow)
{
int ret = -1;
xlator_t *subvol = NULL;
@@ -3925,11 +3925,17 @@ glfs_setattr(struct glfs *fs, const char *path, struct iatt *iatt, int valid,
struct iatt riatt = {
0,
};
+ struct iatt iatt = {
+ 0,
+ };
int reval = 0;
+ int glvalid = 0;
DECLARE_OLD_THIS;
__GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);
+ GF_VALIDATE_OR_GOTO("glfs_setattr", stat, out);
+
subvol = glfs_active_subvol(fs);
if (!subvol) {
ret = -1;
@@ -3947,8 +3953,10 @@ retry:
if (ret)
goto out;
+ glfs_iatt_from_stat(stat, valid, &iatt, &glvalid);
+
/* TODO : Add leaseid */
- ret = syncop_setattr(subvol, &loc, iatt, valid, 0, 0, NULL, NULL);
+ ret = syncop_setattr(subvol, &loc, &iatt, glvalid, 0, 0, NULL, NULL);
DECODE_SYNCOP_ERR(ret);
ESTALE_RETRY(ret, errno, reval, &loc, retry);
@@ -3963,10 +3971,16 @@ invalid_fs:
return ret;
}
+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setattr, future);
+
int
-glfs_fsetattr(struct glfs_fd *glfd, struct iatt *iatt, int valid)
+pub_glfs_fsetattr(struct glfs_fd *glfd, struct stat *stat, int valid)
{
int ret = -1;
+ int glvalid = 0;
+ struct iatt iatt = {
+ 0,
+ };
xlator_t *subvol = NULL;
fd_t *fd = NULL;
@@ -3975,6 +3989,8 @@ glfs_fsetattr(struct glfs_fd *glfd, struct iatt *iatt, int valid)
GF_REF_GET(glfd);
+ GF_VALIDATE_OR_GOTO("glfs_fsetattr", stat, out);
+
subvol = glfs_active_subvol(glfd->fs);
if (!subvol) {
ret = -1;
@@ -3989,8 +4005,10 @@ glfs_fsetattr(struct glfs_fd *glfd, struct iatt *iatt, int valid)
goto out;
}
+ glfs_iatt_from_stat(stat, valid, &iatt, &glvalid);
+
/* TODO : Add leaseid */
- ret = syncop_fsetattr(subvol, fd, iatt, valid, 0, 0, NULL, NULL);
+ ret = syncop_fsetattr(subvol, fd, &iatt, glvalid, 0, 0, NULL, NULL);
DECODE_SYNCOP_ERR(ret);
out:
if (fd)
@@ -4006,19 +4024,21 @@ invalid_fs:
return ret;
}
+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fsetattr, future);
+
int
pub_glfs_chmod(struct glfs *fs, const char *path, mode_t mode)
{
int ret = -1;
- struct iatt iatt = {
+ struct stat stat = {
0,
};
int valid = 0;
- iatt.ia_prot = ia_prot_from_st_mode(mode);
- valid = GF_SET_ATTR_MODE;
+ stat.st_mode = mode;
+ valid = GFAPI_SET_ATTR_MODE;
- ret = glfs_setattr(fs, path, &iatt, valid, 1);
+ ret = glfs_setattr(fs, path, &stat, valid, 1);
return ret;
}
@@ -4029,15 +4049,15 @@ int
pub_glfs_fchmod(struct glfs_fd *glfd, mode_t mode)
{
int ret = -1;
- struct iatt iatt = {
+ struct stat stat = {
0,
};
int valid = 0;
- iatt.ia_prot = ia_prot_from_st_mode(mode);
- valid = GF_SET_ATTR_MODE;
+ stat.st_mode = mode;
+ valid = GFAPI_SET_ATTR_MODE;
- ret = glfs_fsetattr(glfd, &iatt, valid);
+ ret = glfs_fsetattr(glfd, &stat, valid);
return ret;
}
@@ -4049,22 +4069,22 @@ pub_glfs_chown(struct glfs *fs, const char *path, uid_t uid, gid_t gid)
{
int ret = 0;
int valid = 0;
- struct iatt iatt = {
+ struct stat stat = {
0,
};
if (uid != (uid_t)-1) {
- iatt.ia_uid = uid;
- valid = GF_SET_ATTR_UID;
+ stat.st_uid = uid;
+ valid = GFAPI_SET_ATTR_UID;
}
if (gid != (uid_t)-1) {
- iatt.ia_gid = gid;
- valid = valid | GF_SET_ATTR_GID;
+ stat.st_gid = gid;
+ valid = valid | GFAPI_SET_ATTR_GID;
}
if (valid)
- ret = glfs_setattr(fs, path, &iatt, valid, 1);
+ ret = glfs_setattr(fs, path, &stat, valid, 1);
return ret;
}
@@ -4076,22 +4096,22 @@ pub_glfs_lchown(struct glfs *fs, const char *path, uid_t uid, gid_t gid)
{
int ret = 0;
int valid = 0;
- struct iatt iatt = {
+ struct stat stat = {
0,
};
if (uid != (uid_t)-1) {
- iatt.ia_uid = uid;
- valid = GF_SET_ATTR_UID;
+ stat.st_uid = uid;
+ valid = GFAPI_SET_ATTR_UID;
}
if (gid != (uid_t)-1) {
- iatt.ia_gid = gid;
- valid = valid | GF_SET_ATTR_GID;
+ stat.st_gid = gid;
+ valid = valid | GFAPI_SET_ATTR_GID;
}
if (valid)
- ret = glfs_setattr(fs, path, &iatt, valid, 0);
+ ret = glfs_setattr(fs, path, &stat, valid, 0);
return ret;
}
@@ -4103,22 +4123,22 @@ pub_glfs_fchown(struct glfs_fd *glfd, uid_t uid, gid_t gid)
{
int ret = 0;
int valid = 0;
- struct iatt iatt = {
+ struct stat stat = {
0,
};
if (uid != (uid_t)-1) {
- iatt.ia_uid = uid;
- valid = GF_SET_ATTR_UID;
+ stat.st_uid = uid;
+ valid = GFAPI_SET_ATTR_UID;
}
if (gid != (uid_t)-1) {
- iatt.ia_gid = gid;
- valid = valid | GF_SET_ATTR_GID;
+ stat.st_gid = gid;
+ valid = valid | GFAPI_SET_ATTR_GID;
}
if (valid)
- ret = glfs_fsetattr(glfd, &iatt, valid);
+ ret = glfs_fsetattr(glfd, &stat, valid);
return ret;
}
@@ -4131,18 +4151,16 @@ pub_glfs_utimens(struct glfs *fs, const char *path,
{
int ret = -1;
int valid = 0;
- struct iatt iatt = {
+ struct stat stat = {
0,
};
- iatt.ia_atime = times[0].tv_sec;
- iatt.ia_atime_nsec = times[0].tv_nsec;
- iatt.ia_mtime = times[1].tv_sec;
- iatt.ia_mtime_nsec = times[1].tv_nsec;
+ stat.st_atim = times[0];
+ stat.st_mtim = times[1];
- valid = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;
+ valid = GFAPI_SET_ATTR_ATIME | GFAPI_SET_ATTR_MTIME;
- ret = glfs_setattr(fs, path, &iatt, valid, 1);
+ ret = glfs_setattr(fs, path, &stat, valid, 1);
return ret;
}
@@ -4155,18 +4173,16 @@ pub_glfs_lutimens(struct glfs *fs, const char *path,
{
int ret = -1;
int valid = 0;
- struct iatt iatt = {
+ struct stat stat = {
0,
};
- iatt.ia_atime = times[0].tv_sec;
- iatt.ia_atime_nsec = times[0].tv_nsec;
- iatt.ia_mtime = times[1].tv_sec;
- iatt.ia_mtime_nsec = times[1].tv_nsec;
+ stat.st_atim = times[0];
+ stat.st_mtim = times[1];
- valid = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;
+ valid = GFAPI_SET_ATTR_ATIME | GFAPI_SET_ATTR_MTIME;
- ret = glfs_setattr(fs, path, &iatt, valid, 0);
+ ret = glfs_setattr(fs, path, &stat, valid, 0);
return ret;
}
@@ -4178,18 +4194,16 @@ pub_glfs_futimens(struct glfs_fd *glfd, const struct timespec times[2])
{
int ret = -1;
int valid = 0;
- struct iatt iatt = {
+ struct stat stat = {
0,
};
- iatt.ia_atime = times[0].tv_sec;
- iatt.ia_atime_nsec = times[0].tv_nsec;
- iatt.ia_mtime = times[1].tv_sec;
- iatt.ia_mtime_nsec = times[1].tv_nsec;
+ stat.st_atim = times[0];
+ stat.st_mtim = times[1];
- valid = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;
+ valid = GFAPI_SET_ATTR_ATIME | GFAPI_SET_ATTR_MTIME;
- ret = glfs_fsetattr(glfd, &iatt, valid);
+ ret = glfs_fsetattr(glfd, &stat, valid);
return ret;
}
diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c
index 3e4e2fb4c52..d4e154526ab 100644
--- a/api/src/glfs-handleops.c
+++ b/api/src/glfs-handleops.c
@@ -18,7 +18,7 @@
int
glfs_listxattr_process(void *value, size_t size, dict_t *xattr);
-static void
+void
glfs_iatt_from_stat(struct stat *stat, int valid, struct iatt *iatt,
int *glvalid)
{
diff --git a/api/src/glfs-handles.h b/api/src/glfs-handles.h
index 89b1ed0f2e6..f7e6a06453f 100644
--- a/api/src/glfs-handles.h
+++ b/api/src/glfs-handles.h
@@ -46,16 +46,6 @@
*
*/
-/* Values for valid flags to be used when using XXXsetattr, to set multiple
- attribute values passed via the related stat structure.
- */
-#define GFAPI_SET_ATTR_MODE 0x1
-#define GFAPI_SET_ATTR_UID 0x2
-#define GFAPI_SET_ATTR_GID 0x4
-#define GFAPI_SET_ATTR_SIZE 0x8
-#define GFAPI_SET_ATTR_ATIME 0x10
-#define GFAPI_SET_ATTR_MTIME 0x20
-
/* Handle length for object handles returned from glfs_h_extract_handle or
* glfs_h_create_from_handle */
#define GFAPI_HANDLE_LENGTH 16
diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h
index c7fbdeb6560..6ab28fffe55 100644
--- a/api/src/glfs-internal.h
+++ b/api/src/glfs-internal.h
@@ -522,6 +522,9 @@ int
glfs_loc_touchup(loc_t *loc) GFAPI_PRIVATE(glfs_loc_touchup, 3.4.0);
void
glfs_iatt_to_stat(struct glfs *fs, struct iatt *iatt, struct stat *stat);
+void
+glfs_iatt_from_stat(struct stat *stat, int valid, struct iatt *iatt,
+ int *gvalid);
int
glfs_loc_link(loc_t *loc, struct iatt *iatt);
int
diff --git a/api/src/glfs.h b/api/src/glfs.h
index fe305e8e167..9f6075669c0 100644
--- a/api/src/glfs.h
+++ b/api/src/glfs.h
@@ -20,6 +20,17 @@
both the library and the application.
*/
+/* Values for valid flags to be used when using XXXsetattr, to set multiple
+ attribute values passed via the related stat structure.
+ */
+
+#define GFAPI_SET_ATTR_MODE 0x1
+#define GFAPI_SET_ATTR_UID 0x2
+#define GFAPI_SET_ATTR_GID 0x4
+#define GFAPI_SET_ATTR_SIZE 0x8
+#define GFAPI_SET_ATTR_ATIME 0x10
+#define GFAPI_SET_ATTR_MTIME 0x20
+
#ifndef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 64
#endif
@@ -1395,5 +1406,54 @@ int
glfs_lease(glfs_fd_t *glfd, glfs_lease_t *lease, glfs_recall_cbk fn,
void *data) __THROW GFAPI_PUBLIC(glfs_lease, 4.0.0);
+/*
+ SYNOPSIS
+
+ glfs_fsetattr: Function to set attributes.
+ glfs_setattr: Function to set attributes
+
+ DESCRIPTION
+
+ The functions are used to set attributes on the file.
+
+ PARAMETERS
+
+ @glfs_fsetattr
+
+ @glfd: The fd of the file for which the attributes are to be set,
+ this fd is returned by glfs_open/glfs_create.
+
+ @glfs_setattr
+
+ @fs: File object.
+
+ @path: The path of the file that is being operated on.
+
+ @follow: Flag used to resolve symlink.
+
+
+ @stat: Struct that has information about the file.
+
+ @valid: This is the mask bit, that accepts GFAPI_SET_ATTR* masks.
+ Refer glfs.h to see the mask definitions.
+
+ Both functions are similar in functionality, just that the
+ func setattr() uses file path whereas the func fsetattr()
+ uses the fd.
+
+ RETURN VALUES
+ 0: Successful completion
+ <0: Failure. @errno will be set with the type of failure
+
+ */
+
+int
+glfs_fsetattr(struct glfs_fd *glfd, struct stat *stat, int valid) __THROW
+ GFAPI_PUBLIC(glfs_fsetattr, future);
+
+int
+glfs_setattr(struct glfs *fs, const char *path, struct stat *stat, int valid,
+ int follow) __THROW GFAPI_PUBLIC(glfs_setattr, future);
+
__END_DECLS
#endif /* !_GLFS_H */