Commit 2b47c361 authored by Mathieu Desnoyers's avatar Mathieu Desnoyers Committed by Linus Torvalds

Fix f_version type: should be u64 instead of unsigned long

Fix f_version type: should be u64 instead of long

There is a type inconsistency between struct inode i_version and struct file
f_version.

fs.h:

struct inode
  u64                     i_version;

and

struct file
  unsigned long           f_version;

Users do:

fs/ext3/dir.c:

if (filp->f_version != inode->i_version) {

So why isn't f_version a u64 ? It becomes a problem if versions gets
higher than 2^32 and we are on an architecture where longs are 32 bits.

This patch changes the f_version type to u64, and updates the users accordingly.

It applies to 2.6.23-rc2-mm2.
Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Martin Bligh <mbligh@google.com>
Cc: "Randy.Dunlap" <rdunlap@xenotime.net>
Cc: Al Viro <viro@ftp.linux.org.uk>
Cc: <linux-ext4@vger.kernel.org>
Cc: Mark Fasheh <mark.fasheh@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: "J. Bruce Fields" <bfields@fieldses.org>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 41d10da3
...@@ -210,7 +210,7 @@ static int ext3_readdir(struct file * filp, ...@@ -210,7 +210,7 @@ static int ext3_readdir(struct file * filp,
* not the directory has been modified * not the directory has been modified
* during the copy operation. * during the copy operation.
*/ */
unsigned long version = filp->f_version; u64 version = filp->f_version;
error = filldir(dirent, de->name, error = filldir(dirent, de->name,
de->name_len, de->name_len,
......
...@@ -210,7 +210,7 @@ static int ext4_readdir(struct file * filp, ...@@ -210,7 +210,7 @@ static int ext4_readdir(struct file * filp,
* not the directory has been modified * not the directory has been modified
* during the copy operation. * during the copy operation.
*/ */
unsigned long version = filp->f_version; u64 version = filp->f_version;
error = filldir(dirent, de->name, error = filldir(dirent, de->name,
de->name_len, de->name_len,
......
...@@ -586,7 +586,7 @@ int __ocfs2_add_entry(handle_t *handle, ...@@ -586,7 +586,7 @@ int __ocfs2_add_entry(handle_t *handle,
} }
static int ocfs2_dir_foreach_blk_id(struct inode *inode, static int ocfs2_dir_foreach_blk_id(struct inode *inode,
unsigned long *f_version, u64 *f_version,
loff_t *f_pos, void *priv, loff_t *f_pos, void *priv,
filldir_t filldir, int *filldir_err) filldir_t filldir, int *filldir_err)
{ {
...@@ -648,7 +648,7 @@ static int ocfs2_dir_foreach_blk_id(struct inode *inode, ...@@ -648,7 +648,7 @@ static int ocfs2_dir_foreach_blk_id(struct inode *inode,
* not the directory has been modified * not the directory has been modified
* during the copy operation. * during the copy operation.
*/ */
unsigned long version = *f_version; u64 version = *f_version;
unsigned char d_type = DT_UNKNOWN; unsigned char d_type = DT_UNKNOWN;
if (de->file_type < OCFS2_FT_MAX) if (de->file_type < OCFS2_FT_MAX)
...@@ -677,7 +677,7 @@ static int ocfs2_dir_foreach_blk_id(struct inode *inode, ...@@ -677,7 +677,7 @@ static int ocfs2_dir_foreach_blk_id(struct inode *inode,
} }
static int ocfs2_dir_foreach_blk_el(struct inode *inode, static int ocfs2_dir_foreach_blk_el(struct inode *inode,
unsigned long *f_version, u64 *f_version,
loff_t *f_pos, void *priv, loff_t *f_pos, void *priv,
filldir_t filldir, int *filldir_err) filldir_t filldir, int *filldir_err)
{ {
...@@ -798,7 +798,7 @@ static int ocfs2_dir_foreach_blk_el(struct inode *inode, ...@@ -798,7 +798,7 @@ static int ocfs2_dir_foreach_blk_el(struct inode *inode,
return stored; return stored;
} }
static int ocfs2_dir_foreach_blk(struct inode *inode, unsigned long *f_version, static int ocfs2_dir_foreach_blk(struct inode *inode, u64 *f_version,
loff_t *f_pos, void *priv, filldir_t filldir, loff_t *f_pos, void *priv, filldir_t filldir,
int *filldir_err) int *filldir_err)
{ {
...@@ -818,7 +818,7 @@ int ocfs2_dir_foreach(struct inode *inode, loff_t *f_pos, void *priv, ...@@ -818,7 +818,7 @@ int ocfs2_dir_foreach(struct inode *inode, loff_t *f_pos, void *priv,
filldir_t filldir) filldir_t filldir)
{ {
int ret = 0, filldir_err = 0; int ret = 0, filldir_err = 0;
unsigned long version = inode->i_version; u64 version = inode->i_version;
while (*f_pos < i_size_read(inode)) { while (*f_pos < i_size_read(inode)) {
ret = ocfs2_dir_foreach_blk(inode, &version, f_pos, priv, ret = ocfs2_dir_foreach_blk(inode, &version, f_pos, priv,
......
...@@ -2586,7 +2586,7 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi ...@@ -2586,7 +2586,7 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi
/* f_version caches the tgid value that the last readdir call couldn't /* f_version caches the tgid value that the last readdir call couldn't
* return. lseek aka telldir automagically resets f_version to 0. * return. lseek aka telldir automagically resets f_version to 0.
*/ */
tid = filp->f_version; tid = (int)filp->f_version;
filp->f_version = 0; filp->f_version = 0;
for (task = first_tid(leader, tid, pos - 2); for (task = first_tid(leader, tid, pos - 2);
task; task;
...@@ -2595,7 +2595,7 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi ...@@ -2595,7 +2595,7 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi
if (proc_task_fill_cache(filp, dirent, filldir, task, tid) < 0) { if (proc_task_fill_cache(filp, dirent, filldir, task, tid) < 0) {
/* returning this tgid failed, save it as the first /* returning this tgid failed, save it as the first
* pid for the next readir call */ * pid for the next readir call */
filp->f_version = tid; filp->f_version = (u64)tid;
put_task_struct(task); put_task_struct(task);
break; break;
} }
......
...@@ -792,7 +792,7 @@ struct file { ...@@ -792,7 +792,7 @@ struct file {
unsigned int f_uid, f_gid; unsigned int f_uid, f_gid;
struct file_ra_state f_ra; struct file_ra_state f_ra;
unsigned long f_version; u64 f_version;
#ifdef CONFIG_SECURITY #ifdef CONFIG_SECURITY
void *f_security; void *f_security;
#endif #endif
......
...@@ -18,7 +18,7 @@ struct seq_file { ...@@ -18,7 +18,7 @@ struct seq_file {
size_t from; size_t from;
size_t count; size_t count;
loff_t index; loff_t index;
loff_t version; u64 version;
struct mutex lock; struct mutex lock;
const struct seq_operations *op; const struct seq_operations *op;
void *private; void *private;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment