<feed xmlns='http://www.w3.org/2005/Atom'>
<title>glusterfs.git/api/src/glfs-fops.c, branch v3.6.3</title>
<subtitle></subtitle>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/'/>
<entry>
<title>api: versioned symbols in libgfapi.so for compatibility</title>
<updated>2015-03-04T07:32:16+00:00</updated>
<author>
<name>Kaleb S. KEITHLEY</name>
<email>kkeithle@redhat.com</email>
</author>
<published>2014-11-18T19:44:59+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=b887c4ee9338215ce11aa350c97fcc6f133fcce7'/>
<id>b887c4ee9338215ce11aa350c97fcc6f133fcce7</id>
<content type='text'>
Use versioned symbols to keep libgfapi at libgfapi.so.0.0.0

Revisited to address broken build on Mac OS X

See http://review.gluster.org/9055

Change-Id: I0f26668898749f57b61490b18f1f04c42996225d
BUG: 1165129
Signed-off-by: Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;
Reviewed-on: http://review.gluster.org/9145
Reviewed-by: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Ravishankar N &lt;ravishankar@redhat.com&gt;
Reviewed-by: Raghavendra Bhat &lt;raghavendra@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Use versioned symbols to keep libgfapi at libgfapi.so.0.0.0

Revisited to address broken build on Mac OS X

See http://review.gluster.org/9055

Change-Id: I0f26668898749f57b61490b18f1f04c42996225d
BUG: 1165129
Signed-off-by: Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;
Reviewed-on: http://review.gluster.org/9145
Reviewed-by: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Ravishankar N &lt;ravishankar@redhat.com&gt;
Reviewed-by: Raghavendra Bhat &lt;raghavendra@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>api: versioned symbols in libgfapi.so for compatibility</title>
<updated>2014-11-07T10:17:56+00:00</updated>
<author>
<name>Kaleb S. KEITHLEY</name>
<email>kkeithle@redhat.com</email>
</author>
<published>2014-11-05T15:26:46+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=1ffdf112f707a13c9fd74bbf17f99d28f84f0f0c'/>
<id>1ffdf112f707a13c9fd74bbf17f99d28f84f0f0c</id>
<content type='text'>
Use versioned symbols to keep libgfapi at libgfapi.so.0.0.0

Some nits uncovered:

+ there are a couple functions declared that do not have an
  associated definition, e.g. glfs_truncate(), glfs_caller_specific_init()

+ there are seven private/internal functions used by heal/src/glfsheal
  and the gfapi master xlator (glfs-master.c): glfs_loc_touchup(),
  glfs_active_subvol(), and glfs_subvol_done(), glfs_init_done(),
  glfs_resolve_at(), glfs_free_from_ctx(), and glfs_new_from_ctx();
  which are not declared in glfs.h;

+ for this initial pass at versioned symbols, we use the earliest version
  of all public symbols, i.e. those for which there are declarations in
  glfs.h or glfs-handles.h.
  Further investigation as we do backports to 3.6, 3.4, and 3.4
  will be required to determine if older implementations need to
  be preserved (forward ported) and their associated alias(es) and
  symbol version(s) defined.

FWIW, we should consider linking all of our libraries with a map, it'll
result in a cleaner ABI. Perhaps something for an intern to do or a
Google Summer of Code project.

Change-Id: Ie3323e62bb125a3b26214153278b4e998804de0e
BUG: 1160710
Signed-off-by: Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;
Reviewed-on: http://review.gluster.org/9055
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Niels de Vos &lt;ndevos@redhat.com&gt;
Tested-by: Niels de Vos &lt;ndevos@redhat.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Use versioned symbols to keep libgfapi at libgfapi.so.0.0.0

Some nits uncovered:

+ there are a couple functions declared that do not have an
  associated definition, e.g. glfs_truncate(), glfs_caller_specific_init()

+ there are seven private/internal functions used by heal/src/glfsheal
  and the gfapi master xlator (glfs-master.c): glfs_loc_touchup(),
  glfs_active_subvol(), and glfs_subvol_done(), glfs_init_done(),
  glfs_resolve_at(), glfs_free_from_ctx(), and glfs_new_from_ctx();
  which are not declared in glfs.h;

+ for this initial pass at versioned symbols, we use the earliest version
  of all public symbols, i.e. those for which there are declarations in
  glfs.h or glfs-handles.h.
  Further investigation as we do backports to 3.6, 3.4, and 3.4
  will be required to determine if older implementations need to
  be preserved (forward ported) and their associated alias(es) and
  symbol version(s) defined.

FWIW, we should consider linking all of our libraries with a map, it'll
result in a cleaner ABI. Perhaps something for an intern to do or a
Google Summer of Code project.

Change-Id: Ie3323e62bb125a3b26214153278b4e998804de0e
BUG: 1160710
Signed-off-by: Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;
Reviewed-on: http://review.gluster.org/9055
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Niels de Vos &lt;ndevos@redhat.com&gt;
Tested-by: Niels de Vos &lt;ndevos@redhat.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>make snapview-server more compatible with NFS server</title>
<updated>2014-07-16T09:27:50+00:00</updated>
<author>
<name>Raghavendra Bhat</name>
<email>raghavendra@redhat.com</email>
</author>
<published>2014-07-03T11:43:38+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=1dea949cb60c3814c9206df6ba8dddec8d471a94'/>
<id>1dea949cb60c3814c9206df6ba8dddec8d471a94</id>
<content type='text'>
* There was no handle based API for listxattr. With this change, glfs_h_getxattrs
  also handles the listxattr functionality by checking whether the name is NULL
  or not (like posix). But all the gfapi functions for listxattr
  (glfs_h_getxattrs AND glfs_listxattr AND glfs_flistxattr) returns the names of
  the xattrs in a buffer provided by the caller. But snapview-server has to
  return the list of xattrs in a dict itself (similar to posix xlator). But
  the buffer just contains the names of the xattrs. So for each xattr, a zero
  byte value is set (i.e. "") into the dict and sent back. Translators which
  do xattr caching (as of now md-cache which caches selinux and acl related
  xattrs) should not cache those xattrs whose value is a zero byte data ("").
  So made changes in md-cache to ignore zero byte values.

* NFS server was not linking the inodes to inode table in readdirp. This was
  leading to applications getting errors. The below set of operations would
  lead to applications getting error
  1) ls -l in one of the snaopshots (snapview-server would generate gfids for
     each entry on the fly and link the inodes associated with those entries)
  2) NFS server upon getting readdirp reply would not link the inodes of the
     entries. But it used to generate filehandles for each entry and associate
     the gfid of that entry with the filehandle and send it as part of the
     reply to nfs client.
  3) NFS client would send the filehandle of one of those entries when some
     activity is done on it.
  4) NFS server would not be able to find the inode for the gfid present in the
     filehandle (as the inode was not linked) and would go for hard resolution
     by sending a lookup on the gfid by creating a new inode.
  5) snapview-client will not able to identify whether the inode is a real inode
     existing in the main volume or a virtual inode existing in the snapshots
     as there would not be any inode context.
  6) Since the gfid upon which lookup is sent is a virtual gfid which is not
     present in the disk, lookup would fail and the application would get an
     error.

  To handle above situation, now nfs server also does inode linking in readdirp.

Change-Id: Ibb191408347b6b5f21cff72319ccee619ea77bcd
BUG: 1115949
Signed-off-by: Raghavendra Bhat &lt;raghavendra@redhat.com&gt;
Reviewed-on: http://review.gluster.org/8230
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Niels de Vos &lt;ndevos@redhat.com&gt;
Reviewed-by: Raghavendra G &lt;rgowdapp@redhat.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* There was no handle based API for listxattr. With this change, glfs_h_getxattrs
  also handles the listxattr functionality by checking whether the name is NULL
  or not (like posix). But all the gfapi functions for listxattr
  (glfs_h_getxattrs AND glfs_listxattr AND glfs_flistxattr) returns the names of
  the xattrs in a buffer provided by the caller. But snapview-server has to
  return the list of xattrs in a dict itself (similar to posix xlator). But
  the buffer just contains the names of the xattrs. So for each xattr, a zero
  byte value is set (i.e. "") into the dict and sent back. Translators which
  do xattr caching (as of now md-cache which caches selinux and acl related
  xattrs) should not cache those xattrs whose value is a zero byte data ("").
  So made changes in md-cache to ignore zero byte values.

* NFS server was not linking the inodes to inode table in readdirp. This was
  leading to applications getting errors. The below set of operations would
  lead to applications getting error
  1) ls -l in one of the snaopshots (snapview-server would generate gfids for
     each entry on the fly and link the inodes associated with those entries)
  2) NFS server upon getting readdirp reply would not link the inodes of the
     entries. But it used to generate filehandles for each entry and associate
     the gfid of that entry with the filehandle and send it as part of the
     reply to nfs client.
  3) NFS client would send the filehandle of one of those entries when some
     activity is done on it.
  4) NFS server would not be able to find the inode for the gfid present in the
     filehandle (as the inode was not linked) and would go for hard resolution
     by sending a lookup on the gfid by creating a new inode.
  5) snapview-client will not able to identify whether the inode is a real inode
     existing in the main volume or a virtual inode existing in the snapshots
     as there would not be any inode context.
  6) Since the gfid upon which lookup is sent is a virtual gfid which is not
     present in the disk, lookup would fail and the application would get an
     error.

  To handle above situation, now nfs server also does inode linking in readdirp.

Change-Id: Ibb191408347b6b5f21cff72319ccee619ea77bcd
BUG: 1115949
Signed-off-by: Raghavendra Bhat &lt;raghavendra@redhat.com&gt;
Reviewed-on: http://review.gluster.org/8230
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Niels de Vos &lt;ndevos@redhat.com&gt;
Reviewed-by: Raghavendra G &lt;rgowdapp@redhat.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>porting: Port for FreeBSD rebased from Mike Ma's efforts</title>
<updated>2014-07-03T00:20:34+00:00</updated>
<author>
<name>Harshavardhana</name>
<email>harsha@harshavardhana.net</email>
</author>
<published>2014-06-21T09:00:23+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=1b74cf992986287a510fe3b28a8ee7554e8b0992'/>
<id>1b74cf992986287a510fe3b28a8ee7554e8b0992</id>
<content type='text'>
- Provides a working Gluster Management Daemon, CLI
- Provides a working GlusterFS server, GlusterNFS server
- Provides a working GlusterFS client
- execinfo port from FreeBSD is moved into ./contrib/libexecinfo
  for ease of portability on NetBSD. (FreeBSD 10 and OSX provide
  execinfo natively)
- More portability cleanups for Darwin, FreeBSD and NetBSD
- Provides a new rc script for FreeBSD

Change-Id: I8dff336f97479ca5a7f9b8c6b730051c0f8ac46f
BUG: 1111774
Original-Author: Mike Ma &lt;mikemandarine@gmail.com&gt;
Signed-off-by: Harshavardhana &lt;harsha@harshavardhana.net&gt;
Reviewed-on: http://review.gluster.org/8141
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Kaleb KEITHLEY &lt;kkeithle@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Provides a working Gluster Management Daemon, CLI
- Provides a working GlusterFS server, GlusterNFS server
- Provides a working GlusterFS client
- execinfo port from FreeBSD is moved into ./contrib/libexecinfo
  for ease of portability on NetBSD. (FreeBSD 10 and OSX provide
  execinfo natively)
- More portability cleanups for Darwin, FreeBSD and NetBSD
- Provides a new rc script for FreeBSD

Change-Id: I8dff336f97479ca5a7f9b8c6b730051c0f8ac46f
BUG: 1111774
Original-Author: Mike Ma &lt;mikemandarine@gmail.com&gt;
Signed-off-by: Harshavardhana &lt;harsha@harshavardhana.net&gt;
Reviewed-on: http://review.gluster.org/8141
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Kaleb KEITHLEY &lt;kkeithle@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>libgfapi: In glfs_*chown, if uid or gid is -1, do not set the corresponding flag.</title>
<updated>2014-06-23T15:44:00+00:00</updated>
<author>
<name>Poornima Gurusiddaiah</name>
<email>pgurusid@redhat.com</email>
</author>
<published>2014-06-19T10:49:23+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=b14a525554f1fce280874f0385fef6771ca93c89'/>
<id>b14a525554f1fce280874f0385fef6771ca93c89</id>
<content type='text'>
Change-Id: I23d0caa36c37dd5372f6e1d6a27c7904f4df547b
BUG: 1111563
Signed-off-by: Poornima Gurusiddaiah &lt;pgurusid@redhat.com&gt;
Reviewed-on: http://review.gluster.org/8115
Reviewed-by: Raghavendra Talur &lt;rtalur@redhat.com&gt;
Reviewed-by: Prashanth Pai &lt;ppai@redhat.com&gt;
Reviewed-by: Niels de Vos &lt;ndevos@redhat.com&gt;
Tested-by: Justin Clift &lt;justin@gluster.org&gt;
Reviewed-by: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Anand Avati &lt;avati@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Change-Id: I23d0caa36c37dd5372f6e1d6a27c7904f4df547b
BUG: 1111563
Signed-off-by: Poornima Gurusiddaiah &lt;pgurusid@redhat.com&gt;
Reviewed-on: http://review.gluster.org/8115
Reviewed-by: Raghavendra Talur &lt;rtalur@redhat.com&gt;
Reviewed-by: Prashanth Pai &lt;ppai@redhat.com&gt;
Reviewed-by: Niels de Vos &lt;ndevos@redhat.com&gt;
Tested-by: Justin Clift &lt;justin@gluster.org&gt;
Reviewed-by: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Anand Avati &lt;avati@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>core: add @xdata parameter to syncop_[f]removexattr()</title>
<updated>2014-02-13T19:17:05+00:00</updated>
<author>
<name>Anand Avati</name>
<email>avati@redhat.com</email>
</author>
<published>2014-02-07T22:29:34+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=0cab34b3a5e94267bf6b39669b6e85af1fab8f3d'/>
<id>0cab34b3a5e94267bf6b39669b6e85af1fab8f3d</id>
<content type='text'>
To be used in afr metadata self-heal

Change-Id: I8dac4b19d61e331702427eeb5b606aab3d20b328
BUG: 1021686
Signed-off-by: Anand Avati &lt;avati@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6941
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Raghavendra Bhat &lt;raghavendra@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
To be used in afr metadata self-heal

Change-Id: I8dac4b19d61e331702427eeb5b606aab3d20b328
BUG: 1021686
Signed-off-by: Anand Avati &lt;avati@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6941
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Raghavendra Bhat &lt;raghavendra@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>libgfapi: Fix pointer dereference before NULL check</title>
<updated>2014-01-24T09:41:59+00:00</updated>
<author>
<name>Jose A. Rivera</name>
<email>jarrpa@redhat.com</email>
</author>
<published>2014-01-23T03:51:42+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=bb63256b7ea1f186bbe3fae9040a6c191c9d6544'/>
<id>bb63256b7ea1f186bbe3fae9040a6c191c9d6544</id>
<content type='text'>
Call to dict_keys_join dereferences xattr before it is checked
for NULL. Restructured the function to check for NULL earlier and
call dict_unref only when needed.

BUG: 789278
CID: 1124826

Change-Id: I732fa304ad6f3b921c589832d13f73bbd36f589c
Signed-off-by: Jose A. Rivera &lt;jarrpa@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6763
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Call to dict_keys_join dereferences xattr before it is checked
for NULL. Restructured the function to check for NULL earlier and
call dict_unref only when needed.

BUG: 789278
CID: 1124826

Change-Id: I732fa304ad6f3b921c589832d13f73bbd36f589c
Signed-off-by: Jose A. Rivera &lt;jarrpa@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6763
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>syncop: Change return value of syncop</title>
<updated>2014-01-20T07:05:15+00:00</updated>
<author>
<name>Pranith Kumar K</name>
<email>pkarampu@redhat.com</email>
</author>
<published>2013-12-11T04:03:53+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=8d55c25f158921b508bff0e7f25158991913f922'/>
<id>8d55c25f158921b508bff0e7f25158991913f922</id>
<content type='text'>
Problem:
We found a day-1 bug when syncop_xxx() infra is used inside a synctask with
compilation optimization (CFLAGS -O2).

Detailed explanation of the Root cause:
We found the bug in 'gf_defrag_migrate_data' in rebalance operation:

Lets look at interesting parts of the function:

int
gf_defrag_migrate_data (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,
                        dict_t *migrate_data)
{
.....
code section - [ Loop ]
        while ((ret = syncop_readdirp (this, fd, 131072, offset, NULL,
                                       &amp;entries)) != 0) {
.....
code section - [ ERRNO-1 ] (errno of readdirp is stored in readdir_operrno by a
thread)
                /* Need to keep track of ENOENT errno, that means, there is no
                   need to send more readdirp() */
                readdir_operrno = errno;
.....
code section - [ SYNCOP-1 ] (syncop_getxattr is called by a thread)
                        ret = syncop_getxattr (this, &amp;entry_loc, &amp;dict,
                                               GF_XATTR_LINKINFO_KEY);
code section - [ ERRNO-2]   (checking for failures of syncop_getxattr(). This
may not always be executed in same thread which executed [SYNCOP-1])
                        if (ret &lt; 0) {
                                if (errno != ENODATA) {
                                        loglevel = GF_LOG_ERROR;
                                        defrag-&gt;total_failures += 1;
.....
}

the function above could be executed by thread(t1) till [SYNCOP-1] and code
from [ERRNO-2] can be executed by a different thread(t2) because of the way
syncop-infra schedules the tasks.

when the code is compiled with -O2 optimization this is the assembly code that
is generated:
 [ERRNO-1]
1165                        readdir_operrno = errno; &lt;&lt;---- errno gets expanded
as *(__errno_location())
   0x00007fd149d48b60 &lt;+496&gt;:        callq  0x7fd149d410c0 &lt;address@hidden&gt;
   0x00007fd149d48b72 &lt;+514&gt;:        mov    %rax,0x50(%rsp) &lt;&lt;------ Address
returned by __errno_location() is stored in a special location in stack for
later use.
   0x00007fd149d48b77 &lt;+519&gt;:        mov    (%rax),%eax
   0x00007fd149d48b79 &lt;+521&gt;:        mov    %eax,0x78(%rsp)
....
 [ERRNO-2]
1281                                        if (errno != ENODATA) {
   0x00007fd149d492ae &lt;+2366&gt;:        mov    0x50(%rsp),%rax &lt;&lt;-----  Because
it already stored the address returned by __errno_location(), it just
dereferences the address to get the errno value. BUT THIS CODE NEED NOT BE
EXECUTED BY SAME THREAD!!!
   0x00007fd149d492b3 &lt;+2371&gt;:        mov    $0x9,%ebp
   0x00007fd149d492b8 &lt;+2376&gt;:        mov    (%rax),%edi
   0x00007fd149d492ba &lt;+2378&gt;:        cmp    $0x3d,%edi

The problem is that __errno_location() value of t1 and t2 are different. So
[ERRNO-2] ends up reading errno of t1 instead of errno of t2 even though t2 is
executing [ERRNO-2] code section.

When code is compiled without any optimization for [ERRNO-2]:
1281                                        if (errno != ENODATA) {
   0x00007fd58e7a326f &lt;+2237&gt;:        callq  0x7fd58e797300
&lt;address@hidden&gt;&lt;&lt;--- As it is calling __errno_location() again it gets the
location from t2 so it works as intended.
   0x00007fd58e7a3274 &lt;+2242&gt;:        mov    (%rax),%eax
   0x00007fd58e7a3276 &lt;+2244&gt;:        cmp    $0x3d,%eax
   0x00007fd58e7a3279 &lt;+2247&gt;:        je     0x7fd58e7a32a1
&lt;gf_defrag_migrate_data+2287&gt;

Fix:
Make syncop_xxx() return (-errno) value as the return value in
case of errors and all the functions which make syncop_xxx() will need to use
(-ret) to figure out the reason for failure in case of syncop_xxx() failures.

Change-Id: I314d20dabe55d3e62ff66f3b4adb1cac2eaebb57
BUG: 1040356
Signed-off-by: Pranith Kumar K &lt;pkarampu@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6475
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Anand Avati &lt;avati@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Problem:
We found a day-1 bug when syncop_xxx() infra is used inside a synctask with
compilation optimization (CFLAGS -O2).

Detailed explanation of the Root cause:
We found the bug in 'gf_defrag_migrate_data' in rebalance operation:

Lets look at interesting parts of the function:

int
gf_defrag_migrate_data (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,
                        dict_t *migrate_data)
{
.....
code section - [ Loop ]
        while ((ret = syncop_readdirp (this, fd, 131072, offset, NULL,
                                       &amp;entries)) != 0) {
.....
code section - [ ERRNO-1 ] (errno of readdirp is stored in readdir_operrno by a
thread)
                /* Need to keep track of ENOENT errno, that means, there is no
                   need to send more readdirp() */
                readdir_operrno = errno;
.....
code section - [ SYNCOP-1 ] (syncop_getxattr is called by a thread)
                        ret = syncop_getxattr (this, &amp;entry_loc, &amp;dict,
                                               GF_XATTR_LINKINFO_KEY);
code section - [ ERRNO-2]   (checking for failures of syncop_getxattr(). This
may not always be executed in same thread which executed [SYNCOP-1])
                        if (ret &lt; 0) {
                                if (errno != ENODATA) {
                                        loglevel = GF_LOG_ERROR;
                                        defrag-&gt;total_failures += 1;
.....
}

the function above could be executed by thread(t1) till [SYNCOP-1] and code
from [ERRNO-2] can be executed by a different thread(t2) because of the way
syncop-infra schedules the tasks.

when the code is compiled with -O2 optimization this is the assembly code that
is generated:
 [ERRNO-1]
1165                        readdir_operrno = errno; &lt;&lt;---- errno gets expanded
as *(__errno_location())
   0x00007fd149d48b60 &lt;+496&gt;:        callq  0x7fd149d410c0 &lt;address@hidden&gt;
   0x00007fd149d48b72 &lt;+514&gt;:        mov    %rax,0x50(%rsp) &lt;&lt;------ Address
returned by __errno_location() is stored in a special location in stack for
later use.
   0x00007fd149d48b77 &lt;+519&gt;:        mov    (%rax),%eax
   0x00007fd149d48b79 &lt;+521&gt;:        mov    %eax,0x78(%rsp)
....
 [ERRNO-2]
1281                                        if (errno != ENODATA) {
   0x00007fd149d492ae &lt;+2366&gt;:        mov    0x50(%rsp),%rax &lt;&lt;-----  Because
it already stored the address returned by __errno_location(), it just
dereferences the address to get the errno value. BUT THIS CODE NEED NOT BE
EXECUTED BY SAME THREAD!!!
   0x00007fd149d492b3 &lt;+2371&gt;:        mov    $0x9,%ebp
   0x00007fd149d492b8 &lt;+2376&gt;:        mov    (%rax),%edi
   0x00007fd149d492ba &lt;+2378&gt;:        cmp    $0x3d,%edi

The problem is that __errno_location() value of t1 and t2 are different. So
[ERRNO-2] ends up reading errno of t1 instead of errno of t2 even though t2 is
executing [ERRNO-2] code section.

When code is compiled without any optimization for [ERRNO-2]:
1281                                        if (errno != ENODATA) {
   0x00007fd58e7a326f &lt;+2237&gt;:        callq  0x7fd58e797300
&lt;address@hidden&gt;&lt;&lt;--- As it is calling __errno_location() again it gets the
location from t2 so it works as intended.
   0x00007fd58e7a3274 &lt;+2242&gt;:        mov    (%rax),%eax
   0x00007fd58e7a3276 &lt;+2244&gt;:        cmp    $0x3d,%eax
   0x00007fd58e7a3279 &lt;+2247&gt;:        je     0x7fd58e7a32a1
&lt;gf_defrag_migrate_data+2287&gt;

Fix:
Make syncop_xxx() return (-errno) value as the return value in
case of errors and all the functions which make syncop_xxx() will need to use
(-ret) to figure out the reason for failure in case of syncop_xxx() failures.

Change-Id: I314d20dabe55d3e62ff66f3b4adb1cac2eaebb57
BUG: 1040356
Signed-off-by: Pranith Kumar K &lt;pkarampu@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6475
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Anand Avati &lt;avati@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>libgfapi: Fixing possible dereferencing of null pointer "glfd"</title>
<updated>2014-01-16T08:58:49+00:00</updated>
<author>
<name>Lalatendu Mohanty</name>
<email>lmohanty@redhat.com</email>
</author>
<published>2014-01-14T07:05:54+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=c9008fe6a1a4d9c25c4b11804bcc9e5b6edf9bec'/>
<id>c9008fe6a1a4d9c25c4b11804bcc9e5b6edf9bec</id>
<content type='text'>
Fix: Putting a check so that pointer derefrence does not happen
when "gfld" is null

Change-Id: I281b10be445bbeec3a2728fc139d5ac94372e5b6
BUG: 789278
Signed-off-by: Lalatendu Mohanty &lt;lmohanty@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6697
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Fix: Putting a check so that pointer derefrence does not happen
when "gfld" is null

Change-Id: I281b10be445bbeec3a2728fc139d5ac94372e5b6
BUG: 789278
Signed-off-by: Lalatendu Mohanty &lt;lmohanty@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6697
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>libgfapi : Fixing some NULL pointer dereferencing issues.</title>
<updated>2014-01-10T06:45:05+00:00</updated>
<author>
<name>Lalatendu Mohanty</name>
<email>lmohanty@redhat.com</email>
</author>
<published>2014-01-06T08:07:24+00:00</published>
<link rel='alternate' type='text/html' href='http://dev.gluster.org/cgit/glusterfs.git/commit/?id=f9162911e85f95fa2a10d4b70d3f09876bd15adb'/>
<id>f9162911e85f95fa2a10d4b70d3f09876bd15adb</id>
<content type='text'>
1. Fixing dereferencing null pointer "gio"
2. Checking "frame" before calling STACK_DESTROY (frame-&gt;root)

Change-Id: If2ce8804a8e9f3f99f71a8c0d13900afb5635072
Signed-off-by: Lalatendu Mohanty &lt;lmohanty@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6313
Reviewed-by: Santosh Pradhan &lt;spradhan@redhat.com&gt;
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;
Reviewed-by: Raghavendra Talur &lt;rtalur@redhat.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
1. Fixing dereferencing null pointer "gio"
2. Checking "frame" before calling STACK_DESTROY (frame-&gt;root)

Change-Id: If2ce8804a8e9f3f99f71a8c0d13900afb5635072
Signed-off-by: Lalatendu Mohanty &lt;lmohanty@redhat.com&gt;
Reviewed-on: http://review.gluster.org/6313
Reviewed-by: Santosh Pradhan &lt;spradhan@redhat.com&gt;
Tested-by: Gluster Build System &lt;jenkins@build.gluster.com&gt;
Reviewed-by: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;
Reviewed-by: Raghavendra Talur &lt;rtalur@redhat.com&gt;
Reviewed-by: Vijay Bellur &lt;vbellur@redhat.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
