struct semaphore lli_size_sem; /* protect open and change size */
void *lli_size_sem_owner;
struct semaphore lli_write_sem;
+ struct semaphore lli_trunc_sem;
char *lli_symlink_name;
__u64 lli_maxbytes;
__u64 lli_ioepoch;
lli->lli_inode_magic = LLI_INODE_MAGIC;
sema_init(&lli->lli_size_sem, 1);
sema_init(&lli->lli_write_sem, 1);
+ sema_init(&lli->lli_trunc_sem, 1);
lli->lli_flags = 0;
lli->lli_maxbytes = PAGE_CACHE_MAXBYTES;
spin_lock_init(&lli->lli_lock);
if (op_data == NULL)
RETURN(-ENOMEM);
+ UNLOCK_INODE_MUTEX(inode);
+ if (ia_valid & ATTR_SIZE)
+ UP_WRITE_I_ALLOC_SEM(inode);
+ down(&lli->lli_trunc_sem);
+ LOCK_INODE_MUTEX(inode);
+ if (ia_valid & ATTR_SIZE)
+ DOWN_WRITE_I_ALLOC_SEM(inode);
+
memcpy(&op_data->op_attr, attr, sizeof(*attr));
/* Open epoch for truncate. */
rc1 = ll_setattr_done_writing(inode, op_data, mod);
ll_finish_md_op_data(op_data);
}
+ up(&lli->lli_trunc_sem);
return rc ? rc : rc1;
}