Index: lucene/src/java/org/apache/lucene/index/SegmentReader.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/SegmentReader.java	(revision 1145298)
+++ lucene/src/java/org/apache/lucene/index/SegmentReader.java	(working copy)
@@ -90,6 +90,11 @@
    */
   public static SegmentReader get(boolean readOnly, SegmentInfo si, int termInfosIndexDivisor, IOContext context) throws CorruptIndexException, IOException {
     // TODO should we check if readOnly and context combination makes sense like asserting that if read only we don't get a default?
+    if (readOnly) {
+      assert context != IOContext.DEFAULT;
+      //assert context.context == IOContext.Context.READ;
+      // Using the second assert checks for both READ and READONCE
+    }
     return get(readOnly, si.dir, si, true, termInfosIndexDivisor, context);
   }
 
@@ -115,7 +120,7 @@
       if (doOpenStores) {
         instance.core.openDocStores(si);
       }
-      instance.loadLiveDocs();
+      instance.loadLiveDocs(context);
       instance.openNorms(instance.core.cfsDir, context);
       success = true;
     } finally {
@@ -157,10 +162,11 @@
     return true;
   }
 
-  private void loadLiveDocs() throws IOException {
+  private void loadLiveDocs(IOContext context) throws IOException {
     // NOTE: the bitvector is stored using the regular directory, not cfs
     if (hasDeletions(si)) {
-      liveDocs = new BitVector(directory(), si.getDelFileName(), IOContext.DEFAULT);
+      IOContext ctxt = new IOContext(context, true);
+      liveDocs = new BitVector(directory(), si.getDelFileName(), ctxt);
       if (liveDocs.getVersion() < BitVector.VERSION_DGAPS_CLEARED) {
         liveDocs.invertAll();
       }
@@ -273,7 +279,7 @@
         if (!deletionsUpToDate) {
           // load deleted docs
           assert clone.liveDocs == null;
-          clone.loadLiveDocs();
+          clone.loadLiveDocs(IOContext.READ);
         } else if (liveDocs != null) {
           liveDocsRef.incrementAndGet();
           clone.liveDocs = liveDocs;
Index: lucene/src/java/org/apache/lucene/index/codecs/VariableGapTermsIndexReader.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/VariableGapTermsIndexReader.java	(revision 1145298)
+++ lucene/src/java/org/apache/lucene/index/codecs/VariableGapTermsIndexReader.java	(working copy)
@@ -62,7 +62,8 @@
   public VariableGapTermsIndexReader(Directory dir, FieldInfos fieldInfos, String segment, int indexDivisor, int codecId, IOContext context)
     throws IOException {
 
-    in = dir.openInput(IndexFileNames.segmentFileName(segment, codecId, VariableGapTermsIndexWriter.TERMS_INDEX_EXTENSION), context);
+    IOContext ctxt = new IOContext(context,true);
+    in = dir.openInput(IndexFileNames.segmentFileName(segment, codecId, VariableGapTermsIndexWriter.TERMS_INDEX_EXTENSION), ctxt);
     this.segment = segment;
     boolean success = false;
 
Index: lucene/src/java/org/apache/lucene/store/IOContext.java
===================================================================
--- lucene/src/java/org/apache/lucene/store/IOContext.java	(revision 1145298)
+++ lucene/src/java/org/apache/lucene/store/IOContext.java	(working copy)
@@ -85,6 +85,13 @@
     this.mergeInfo = mergeInfo;
     this.flushInfo = null;
   }
+  
+  public IOContext(IOContext ctxt, boolean readOnce) {
+    this.context = ctxt.context;
+    this.mergeInfo = ctxt.mergeInfo;
+    this.flushInfo = ctxt.flushInfo;
+    this.readOnce = readOnce;
+  }
 
   @Override
   public int hashCode() {
