#include "quota.h"
#include "trans.h"
#include "rgrp.h"
+#include "ops_file.h"
/**
* gfs2_get_block - Fills in a buffer head with details about a block
atomic_inc(&sdp->sd_ops_address);
- gfs2_holder_init(ip->i_gl, LM_ST_SHARED, GL_ATIME, &gh);
- error = gfs2_glock_nq_m_atime(1, &gh);
- if (error)
- goto out_unlock;
+ if (file != &gfs2_internal_file_sentinal) {
+ gfs2_holder_init(ip->i_gl, LM_ST_SHARED, GL_ATIME, &gh);
+ error = gfs2_glock_nq_m_atime(1, &gh);
+ if (error)
+ goto out_unlock;
+ }
if (gfs2_is_stuffed(ip)) {
if (!page->index) {
if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags)))
error = -EIO;
- gfs2_glock_dq_m(1, &gh);
- gfs2_holder_uninit(&gh);
+ if (file != &gfs2_internal_file_sentinal) {
+ gfs2_glock_dq_m(1, &gh);
+ gfs2_holder_uninit(&gh);
+ }
out:
return error;
out_unlock:
void *fdr_opaque;
};
+/*
+ * Most fields left uninitialised to catch anybody who tries to
+ * use them. f_flags set to prevent file_accessed() from touching
+ * any other part of this. Its use is purely as a flag so that we
+ * know (in readpage()) whether or not do to locking.
+ */
+struct file gfs2_internal_file_sentinal = {
+ .f_flags = O_NOATIME|O_RDONLY,
+};
+
static int gfs2_read_actor(read_descriptor_t *desc, struct page *page,
unsigned long offset, unsigned long size)
{
desc.arg.buf = buf;
desc.count = size;
desc.error = 0;
- do_generic_mapping_read(inode->i_mapping, ra_state, NULL, pos, &desc, gfs2_read_actor);
+ do_generic_mapping_read(inode->i_mapping, ra_state,
+ &gfs2_internal_file_sentinal, pos, &desc,
+ gfs2_read_actor);
return desc.written ? desc.written : desc.error;
}
#ifndef __OPS_FILE_DOT_H__
#define __OPS_FILE_DOT_H__
-
+extern struct file gfs2_internal_file_sentinal;
extern int gfs2_internal_read(struct gfs2_inode *ip,
struct file_ra_state *ra_state,
char *buf, loff_t *pos, unsigned size);