gfapi: preserve glfd state during glfs_dup

Following patch introduced a new state variable in glfd
to track the current status of the fd.
http://review.gluster.org/13340/

But this state was not copied in glfd_dup function.

BUG: 1311146
Change-Id: I283f8944035f6defe491f81e13d7ef28fc440572
Signed-off-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-on: http://review.gluster.org/13666
Smoke: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Prashanth Pai <ppai@redhat.com>
Tested-by: Prashanth Pai <ppai@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra Talur <rtalur@redhat.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
This commit is contained in:
Rajesh Joseph 2016-03-09 22:05:18 +05:30 committed by Niels de Vos
parent 4d37476f26
commit 5bdfaf9890
3 changed files with 110 additions and 0 deletions

View File

@ -4055,6 +4055,7 @@ pub_glfs_dup (struct glfs_fd *glfd)
}
dupfd->fd = fd_ref (fd);
dupfd->state = glfd->state;
out:
if (fd)
fd_unref (fd);

View File

@ -0,0 +1,82 @@
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <glusterfs/api/glfs.h>
#include <glusterfs/api/glfs-handles.h>
#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label) do { \
if (ret < 0) { \
fprintf (stderr, "%s : returned error %d (%s)\n", \
func, ret, strerror (errno)); \
goto label; \
} \
} while (0)
int
main (int argc, char *argv[])
{
int ret = -1;
int flags = O_RDWR|O_SYNC;
glfs_t *fs = NULL;
glfs_fd_t *fd1 = NULL;
glfs_fd_t *fd2 = NULL;
char *volname = NULL;
char *logfile = NULL;
const char *filename = "file_tmp";
const char *buff = "An opinion should be the result of thought, "
"not a substitute for it.";
if (argc != 3) {
fprintf (stderr, "Invalid argument\n");
return 1;
}
volname = argv[1];
logfile = argv[2];
fs = glfs_new (volname);
if (!fs)
VALIDATE_AND_GOTO_LABEL_ON_ERROR ("glfs_new", ret, out);
ret = glfs_set_volfile_server (fs, "tcp", "localhost", 24007);
VALIDATE_AND_GOTO_LABEL_ON_ERROR ("glfs_set_volfile_server", ret, out);
ret = glfs_set_logging (fs, logfile, 7);
VALIDATE_AND_GOTO_LABEL_ON_ERROR ("glfs_set_logging", ret, out);
ret = glfs_init (fs);
VALIDATE_AND_GOTO_LABEL_ON_ERROR ("glfs_init", ret, out);
fd1 = glfs_creat(fs, filename, flags, 0644);
if (fd1 == NULL) {
ret = -1;
VALIDATE_AND_GOTO_LABEL_ON_ERROR ("glfs_creat", ret, out);
}
ret = glfs_write (fd1, buff, strlen (buff), flags);
VALIDATE_AND_GOTO_LABEL_ON_ERROR ("glfs_write", ret, out);
fd2 = glfs_dup(fd1);
if (fd2 == NULL) {
ret = -1;
VALIDATE_AND_GOTO_LABEL_ON_ERROR ("glfs_dup", ret, out);
}
ret = glfs_lseek (fd2, 0, SEEK_SET);
VALIDATE_AND_GOTO_LABEL_ON_ERROR ("glfs_lseek", ret, out);
out:
if (fd1 != NULL)
glfs_close(fd1);
if (fd2 != NULL)
glfs_close(fd2);
if (fs) {
ret = glfs_fini(fs);
if (ret)
fprintf (stderr, "glfs_fini(fs) returned %d\n", ret);
}
return ret;
}

27
tests/basic/gfapi/gfapi-dup.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/bash
. $(dirname $0)/../../include.rc
. $(dirname $0)/../../volume.rc
cleanup;
TEST glusterd
TEST $CLI volume create $V0 localhost:$B0/brick1;
EXPECT 'Created' volinfo_field $V0 'Status';
TEST $CLI volume start $V0;
EXPECT 'Started' volinfo_field $V0 'Status';
logdir=`gluster --print-logdir`
build_tester $(dirname $0)/gfapi-dup.c -lgfapi -o $(dirname $0)/gfapi-dup
TEST ./$(dirname $0)/gfapi-dup $V0 $logdir/gfapi-dup.log
cleanup_tester $(dirname $0)/gfapi-dup
TEST $CLI volume stop $V0
TEST $CLI volume delete $V0
cleanup;