ubik: remove unnecessary lseeks in uphys_open 71/12271/5
authorMichael Meffie <mmeffie@sinenomine.net>
Wed, 20 Apr 2016 22:17:16 +0000 (18:17 -0400)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 21 Sep 2018 02:50:03 +0000 (22:50 -0400)
The ubik database file access layer has a file descriptor cache to avoid
reopening the database file on each file access.  However, the file
offset is reset with lseek on each and every use of the cached file
descriptor, and the file offset is set twice when reading or writing
data records.

This change removes unnecessary and duplicate lseek system calls to
reduce the system call load.

Change-Id: I460b226d81e4eb64dc87918175acab495aa698cd
Reviewed-on: https://gerrit.openafs.org/12271
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Marcio Brito Barbosa <mbarbosa@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/ubik/phys.c

index bea42cf..62063bb 100644 (file)
@@ -72,7 +72,6 @@ uphys_open(struct ubik_dbase *adbase, afs_int32 afid)
     /* scan file descr cache */
     for (tfd = fdcache, i = 0; i < MAXFDCACHE; i++, tfd++) {
        if (afid == tfd->fileID && tfd->refCount == 0) {        /* don't use open fd */
-           lseek(tfd->fd, 0, 0);       /* reset ptr just like open would have */
            tfd->refCount++;
            return tfd->fd;
        }
@@ -266,6 +265,10 @@ uphys_getlabel(struct ubik_dbase *adbase, afs_int32 afile,
     fd = uphys_open(adbase, afile);
     if (fd < 0)
        return UNOENT;
+    if (lseek(fd, 0, 0) < 0) {
+       uphys_close(fd);
+       return EIO;
+    }
     code = read(fd, &thdr, sizeof(thdr));
     if (code != sizeof(thdr)) {
        uphys_close(fd);
@@ -297,6 +300,10 @@ uphys_setlabel(struct ubik_dbase *adbase, afs_int32 afile,
     thdr.version.counter = htonl(aversion->counter);
     thdr.magic = htonl(UBIK_MAGIC);
     thdr.size = htons(HDRSIZE);
+    if (lseek(fd, 0, 0) < 0) {
+       uphys_close(fd);
+       return EIO;
+    }
     code = write(fd, &thdr, sizeof(thdr));
     fsync(fd);                 /* preserve over crash */
     uphys_close(fd);