From: Sage Weil Date: Wed, 8 Sep 2010 21:10:31 +0000 (-0700) Subject: client: reimplement getdir() with readdir_r_cb() X-Git-Tag: v0.21.3~41^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c8be0a5a86d599de0bb77b73636f32b21c65aa26;p=ceph.git client: reimplement getdir() with readdir_r_cb() More efficient. --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 9f94c82e3603..c1652c407d39 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3743,6 +3743,20 @@ int Client::utime(const char *relpath, struct utimbuf *buf) return _setattr(in, &attr, CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME); } +/* getdir */ +struct getdir_result { + list *contents; + int num; +}; + +static int _getdir_cb(void *p, struct dirent *de, struct stat *st, int stmask, off_t off) +{ + getdir_result *r = (getdir_result *)p; + + r->contents->push_back(de->d_name); + r->num++; + return 0; +} int Client::getdir(const char *relpath, list& contents) { @@ -3755,17 +3769,19 @@ int Client::getdir(const char *relpath, list& contents) DIR *d; int r = opendir(relpath, &d); - if (r < 0) return r; + if (r < 0) + return r; + + getdir_result gr; + gr.contents = &contents; + gr.num = 0; + r = readdir_r_cb(d, _getdir_cb, (void *)&gr); - struct dirent de; - int n = 0; - while (readdir_r(d, &de) > 0) { - contents.push_back(de.d_name); - n++; - } closedir(d); - return n; + if (r < 0) + return r; + return gr.num; } int Client::opendir(const char *relpath, DIR **dirpp)