Details
-
Technical task
-
Resolution: Fixed
-
Critical
-
Lustre 2.5.0
-
None
-
9904
Description
I find two issues with osc_io_read_start(). It updates the i_atime without checking O_NOATIME in f_flags. It calls cl_object_attr_get() for no reason that I can discern.
static int osc_io_read_start(const struct lu_env *env,
const struct cl_io_slice *slice)
{
struct osc_io *oio = cl2osc_io(env, slice);
struct cl_object *obj = slice->cis_obj;
struct cl_attr *attr = &osc_env_info(env)->oti_attr;
int result = 0;
ENTRY;
if (oio->oi_lockless == 0) {
cl_object_attr_lock(obj);
result = cl_object_attr_get(env, obj, attr);
if (result == 0) {
attr->cat_atime = LTIME_S(CFS_CURRENT_TIME);
result = cl_object_attr_set(env, obj, attr,
CAT_ATIME);
}
cl_object_attr_unlock(obj);
}
RETURN(result);
}
The upper layer will also update i_atime if this is appropriate, so I propose adding a noatime bit to struct cl_io and only updating the LVB atime for the current OSC object if that bit is set.
osc_io_write_start() similarly calls cl_object_attr_get() before doing
attr->cat_mtime = attr->cat_ctime =
LTIME_S(CFS_CURRENT_TIME);
result = cl_object_attr_set(env, obj, attr,
CAT_MTIME | CAT_CTIME);
I cannot find any reason for first calling cl_object_attr_get() here. Am I missing something?
Attachments
Issue Links
- is related to
-
LU-3868 lockless IO does not update inode timestamps
-
- Resolved
-