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: Steven J. Magnani <steve@digidescorp.com> Acked-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>wifi-calibration
parent
c46938d4f3
commit
5d8ecbbc28
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue