Skip to content

Commit 15d38f2

Browse files
authored
Reduce number of callbacks when checking access flags. (#89)
* Reduce number of callbacks when checking access flags. Signed-off-by: David Kocher <[email protected]> * Fix test. Signed-off-by: David Kocher <[email protected]>
1 parent 7d14d29 commit 15d38f2

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

core/src/main/java/org/dcache/nfs/vfs/PseudoFs.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ protected VirtualFileSystem delegate() {
8585
return _inner;
8686
}
8787

88-
private boolean canAccess(Inode inode, int mode) {
88+
private boolean canAccess(Inode inode, Stat stat, int mode) {
8989
try {
90-
checkAccess(inode, mode, false);
90+
checkAccess(inode, stat, mode, false);
9191
return true;
9292
} catch (IOException e) {
9393
}
@@ -102,38 +102,39 @@ public int access(Inode inode, int mode) throws IOException {
102102
throw new InvalException("invalid access mask");
103103
}
104104

105+
Stat stat = _inner.getattr(inode);
105106
if ((mode & ACCESS4_READ) != 0) {
106-
if (canAccess(inode, ACE4_READ_DATA)) {
107+
if (canAccess(inode, stat, ACE4_READ_DATA)) {
107108
accessmask |= ACCESS4_READ;
108109
}
109110
}
110111

111112
if ((mode & ACCESS4_LOOKUP) != 0) {
112-
if (canAccess(inode, ACE4_EXECUTE)) {
113+
if (canAccess(inode, stat, ACE4_EXECUTE)) {
113114
accessmask |= ACCESS4_LOOKUP;
114115
}
115116
}
116117

117118
if ((mode & ACCESS4_MODIFY) != 0) {
118-
if (canAccess(inode, ACE4_WRITE_DATA)) {
119+
if (canAccess(inode, stat, ACE4_WRITE_DATA)) {
119120
accessmask |= ACCESS4_MODIFY;
120121
}
121122
}
122123

123124
if ((mode & ACCESS4_EXECUTE) != 0) {
124-
if (canAccess(inode, ACE4_EXECUTE)) {
125+
if (canAccess(inode, stat, ACE4_EXECUTE)) {
125126
accessmask |= ACCESS4_EXECUTE;
126127
}
127128
}
128129

129130
if ((mode & ACCESS4_EXTEND) != 0) {
130-
if (canAccess(inode, ACE4_APPEND_DATA)) {
131+
if (canAccess(inode, stat, ACE4_APPEND_DATA)) {
131132
accessmask |= ACCESS4_EXTEND;
132133
}
133134
}
134135

135136
if ((mode & ACCESS4_DELETE) != 0) {
136-
if (canAccess(inode, ACE4_DELETE_CHILD)) {
137+
if (canAccess(inode, stat, ACE4_DELETE_CHILD)) {
137138
accessmask |= ACCESS4_DELETE;
138139
}
139140
}
@@ -146,19 +147,19 @@ public int access(Inode inode, int mode) throws IOException {
146147
*/
147148

148149
if ((mode & ACCESS4_XAREAD) != 0) {
149-
if (canAccess(inode, ACE4_READ_DATA)) {
150+
if (canAccess(inode, stat, ACE4_READ_DATA)) {
150151
accessmask |= ACCESS4_XAREAD;
151152
}
152153
}
153154

154155
if ((mode & ACCESS4_XALIST) != 0) {
155-
if (canAccess(inode, ACE4_READ_DATA)) {
156+
if (canAccess(inode, stat, ACE4_READ_DATA)) {
156157
accessmask |= ACCESS4_XALIST;
157158
}
158159
}
159160

160161
if ((mode & ACCESS4_XAWRITE) != 0) {
161-
if (canAccess(inode, ACE4_WRITE_DATA)) {
162+
if (canAccess(inode, stat, ACE4_WRITE_DATA)) {
162163
accessmask |= ACCESS4_XAWRITE;
163164
}
164165
}
@@ -393,6 +394,10 @@ private Subject checkAccess(Inode inode, int requestedMask) throws IOException {
393394
}
394395

395396
private Subject checkAccess(Inode inode, int requestedMask, boolean shouldLog) throws IOException {
397+
return checkAccess(inode, _inner.getattr(inode), requestedMask, shouldLog);
398+
}
399+
400+
private Subject checkAccess(Inode inode, Stat stat, int requestedMask, boolean shouldLog) throws IOException {
396401

397402
Subject effectiveSubject = _subject;
398403
Access aclMatched = Access.UNDEFINED;
@@ -453,7 +458,6 @@ private Subject checkAccess(Inode inode, int requestedMask, boolean shouldLog) t
453458
* always allows it.
454459
*/
455460
if ((aclMatched == Access.UNDEFINED) && (requestedMask != ACE4_READ_ATTRIBUTES)) {
456-
Stat stat = _inner.getattr(inode);
457461
int unixAccessmask = unixToAccessmask(effectiveSubject, stat);
458462
if ((unixAccessmask & requestedMask) != requestedMask) {
459463
if (shouldLog) {

core/src/test/java/org/dcache/nfs/vfs/PseudoFsTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import java.nio.charset.StandardCharsets;
2525
import java.util.stream.Stream;
2626
import javax.security.auth.Subject;
27+
28+
import com.google.common.primitives.Longs;
2729
import org.dcache.auth.Subjects;
2830
import org.dcache.nfs.ExportFile;
2931
import org.dcache.nfs.FsExport;
@@ -383,7 +385,7 @@ public void testAccessDenyOnHighjackedInode() throws IOException {
383385
Inode inode = new Inode(
384386
new FileHandle.FileHandleBuilder()
385387
.setExportIdx(1)
386-
.build(new byte[] {0x1})
388+
.build(Longs.toByteArray(1L))
387389
);
388390

389391
given(mockedExportFile.getExport(1, localAddress.getAddress())).willReturn(null);

0 commit comments

Comments
 (0)