Commit 5d8ecbbc authored by Steven J. Magnani's avatar Steven J. Magnani Committed by Linus Torvalds

fat: fix non-atomic NFS i_pos read

fat_encode_fh() can fetch an invalid i_pos value on systems where 64-bit
accesses are not atomic.  Make it use the same accessor as the rest of the
FAT code.
Signed-off-by: default avatarSteven J. Magnani <steve@digidescorp.com>
Acked-by: default avatarOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c46938d4
...@@ -738,22 +738,21 @@ static int ...@@ -738,22 +738,21 @@ static int
fat_encode_fh(struct inode *inode, __u32 *fh, int *lenp, struct inode *parent) fat_encode_fh(struct inode *inode, __u32 *fh, int *lenp, struct inode *parent)
{ {
int len = *lenp; int len = *lenp;
u32 ipos_h, ipos_m, ipos_l; struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
loff_t i_pos;
if (len < 5) { if (len < 5) {
*lenp = 5; *lenp = 5;
return 255; /* no room */ return 255; /* no room */
} }
ipos_h = MSDOS_I(inode)->i_pos >> 8; i_pos = fat_i_pos_read(sbi, inode);
ipos_m = (MSDOS_I(inode)->i_pos & 0xf0) << 24;
ipos_l = (MSDOS_I(inode)->i_pos & 0x0f) << 28;
*lenp = 5; *lenp = 5;
fh[0] = inode->i_ino; fh[0] = inode->i_ino;
fh[1] = inode->i_generation; fh[1] = inode->i_generation;
fh[2] = ipos_h; fh[2] = i_pos >> 8;
fh[3] = ipos_m | MSDOS_I(inode)->i_logstart; fh[3] = ((i_pos & 0xf0) << 24) | MSDOS_I(inode)->i_logstart;
fh[4] = ipos_l; fh[4] = (i_pos & 0x0f) << 28;
if (parent) if (parent)
fh[4] |= MSDOS_I(parent)->i_logstart; fh[4] |= MSDOS_I(parent)->i_logstart;
return 3; return 3;
......
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