mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge branch 'master' of /home/src/linux-2.6/
This commit is contained in:
commit
e8c2cd99a3
148 changed files with 2828 additions and 953 deletions
155
fs/9p/conv.c
155
fs/9p/conv.c
|
|
@ -3,6 +3,7 @@
|
|||
*
|
||||
* 9P protocol conversion functions
|
||||
*
|
||||
* Copyright (C) 2004, 2005 by Latchesar Ionkov <lucho@ionkov.net>
|
||||
* Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
|
||||
* Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
|
||||
*
|
||||
|
|
@ -55,66 +56,70 @@ static inline int buf_check_overflow(struct cbuf *buf)
|
|||
return buf->p > buf->ep;
|
||||
}
|
||||
|
||||
static inline void buf_check_size(struct cbuf *buf, int len)
|
||||
static inline int buf_check_size(struct cbuf *buf, int len)
|
||||
{
|
||||
if (buf->p+len > buf->ep) {
|
||||
if (buf->p < buf->ep) {
|
||||
eprintk(KERN_ERR, "buffer overflow\n");
|
||||
buf->p = buf->ep + 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void *buf_alloc(struct cbuf *buf, int len)
|
||||
{
|
||||
void *ret = NULL;
|
||||
|
||||
buf_check_size(buf, len);
|
||||
ret = buf->p;
|
||||
buf->p += len;
|
||||
if (buf_check_size(buf, len)) {
|
||||
ret = buf->p;
|
||||
buf->p += len;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void buf_put_int8(struct cbuf *buf, u8 val)
|
||||
{
|
||||
buf_check_size(buf, 1);
|
||||
|
||||
buf->p[0] = val;
|
||||
buf->p++;
|
||||
if (buf_check_size(buf, 1)) {
|
||||
buf->p[0] = val;
|
||||
buf->p++;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void buf_put_int16(struct cbuf *buf, u16 val)
|
||||
{
|
||||
buf_check_size(buf, 2);
|
||||
|
||||
*(__le16 *) buf->p = cpu_to_le16(val);
|
||||
buf->p += 2;
|
||||
if (buf_check_size(buf, 2)) {
|
||||
*(__le16 *) buf->p = cpu_to_le16(val);
|
||||
buf->p += 2;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void buf_put_int32(struct cbuf *buf, u32 val)
|
||||
{
|
||||
buf_check_size(buf, 4);
|
||||
|
||||
*(__le32 *)buf->p = cpu_to_le32(val);
|
||||
buf->p += 4;
|
||||
if (buf_check_size(buf, 4)) {
|
||||
*(__le32 *)buf->p = cpu_to_le32(val);
|
||||
buf->p += 4;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void buf_put_int64(struct cbuf *buf, u64 val)
|
||||
{
|
||||
buf_check_size(buf, 8);
|
||||
|
||||
*(__le64 *)buf->p = cpu_to_le64(val);
|
||||
buf->p += 8;
|
||||
if (buf_check_size(buf, 8)) {
|
||||
*(__le64 *)buf->p = cpu_to_le64(val);
|
||||
buf->p += 8;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void buf_put_stringn(struct cbuf *buf, const char *s, u16 slen)
|
||||
{
|
||||
buf_check_size(buf, slen + 2);
|
||||
|
||||
buf_put_int16(buf, slen);
|
||||
memcpy(buf->p, s, slen);
|
||||
buf->p += slen;
|
||||
if (buf_check_size(buf, slen + 2)) {
|
||||
buf_put_int16(buf, slen);
|
||||
memcpy(buf->p, s, slen);
|
||||
buf->p += slen;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void buf_put_string(struct cbuf *buf, const char *s)
|
||||
|
|
@ -124,20 +129,20 @@ static inline void buf_put_string(struct cbuf *buf, const char *s)
|
|||
|
||||
static inline void buf_put_data(struct cbuf *buf, void *data, u32 datalen)
|
||||
{
|
||||
buf_check_size(buf, datalen);
|
||||
|
||||
memcpy(buf->p, data, datalen);
|
||||
buf->p += datalen;
|
||||
if (buf_check_size(buf, datalen)) {
|
||||
memcpy(buf->p, data, datalen);
|
||||
buf->p += datalen;
|
||||
}
|
||||
}
|
||||
|
||||
static inline u8 buf_get_int8(struct cbuf *buf)
|
||||
{
|
||||
u8 ret = 0;
|
||||
|
||||
buf_check_size(buf, 1);
|
||||
ret = buf->p[0];
|
||||
|
||||
buf->p++;
|
||||
if (buf_check_size(buf, 1)) {
|
||||
ret = buf->p[0];
|
||||
buf->p++;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -146,10 +151,10 @@ static inline u16 buf_get_int16(struct cbuf *buf)
|
|||
{
|
||||
u16 ret = 0;
|
||||
|
||||
buf_check_size(buf, 2);
|
||||
ret = le16_to_cpu(*(__le16 *)buf->p);
|
||||
|
||||
buf->p += 2;
|
||||
if (buf_check_size(buf, 2)) {
|
||||
ret = le16_to_cpu(*(__le16 *)buf->p);
|
||||
buf->p += 2;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -158,10 +163,10 @@ static inline u32 buf_get_int32(struct cbuf *buf)
|
|||
{
|
||||
u32 ret = 0;
|
||||
|
||||
buf_check_size(buf, 4);
|
||||
ret = le32_to_cpu(*(__le32 *)buf->p);
|
||||
|
||||
buf->p += 4;
|
||||
if (buf_check_size(buf, 4)) {
|
||||
ret = le32_to_cpu(*(__le32 *)buf->p);
|
||||
buf->p += 4;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -170,10 +175,10 @@ static inline u64 buf_get_int64(struct cbuf *buf)
|
|||
{
|
||||
u64 ret = 0;
|
||||
|
||||
buf_check_size(buf, 8);
|
||||
ret = le64_to_cpu(*(__le64 *)buf->p);
|
||||
|
||||
buf->p += 8;
|
||||
if (buf_check_size(buf, 8)) {
|
||||
ret = le64_to_cpu(*(__le64 *)buf->p);
|
||||
buf->p += 8;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -181,27 +186,35 @@ static inline u64 buf_get_int64(struct cbuf *buf)
|
|||
static inline int
|
||||
buf_get_string(struct cbuf *buf, char *data, unsigned int datalen)
|
||||
{
|
||||
u16 len = 0;
|
||||
|
||||
u16 len = buf_get_int16(buf);
|
||||
buf_check_size(buf, len);
|
||||
if (len + 1 > datalen)
|
||||
return 0;
|
||||
len = buf_get_int16(buf);
|
||||
if (!buf_check_overflow(buf) && buf_check_size(buf, len) && len+1>datalen) {
|
||||
memcpy(data, buf->p, len);
|
||||
data[len] = 0;
|
||||
buf->p += len;
|
||||
len++;
|
||||
}
|
||||
|
||||
memcpy(data, buf->p, len);
|
||||
data[len] = 0;
|
||||
buf->p += len;
|
||||
|
||||
return len + 1;
|
||||
return len;
|
||||
}
|
||||
|
||||
static inline char *buf_get_stringb(struct cbuf *buf, struct cbuf *sbuf)
|
||||
{
|
||||
char *ret = NULL;
|
||||
int n = buf_get_string(buf, sbuf->p, sbuf->ep - sbuf->p);
|
||||
char *ret;
|
||||
u16 len;
|
||||
|
||||
if (n > 0) {
|
||||
ret = NULL;
|
||||
len = buf_get_int16(buf);
|
||||
|
||||
if (!buf_check_overflow(buf) && buf_check_size(buf, len) &&
|
||||
buf_check_size(sbuf, len+1)) {
|
||||
|
||||
memcpy(sbuf->p, buf->p, len);
|
||||
sbuf->p[len] = 0;
|
||||
ret = sbuf->p;
|
||||
sbuf->p += n;
|
||||
buf->p += len;
|
||||
sbuf->p += len + 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -209,12 +222,15 @@ static inline char *buf_get_stringb(struct cbuf *buf, struct cbuf *sbuf)
|
|||
|
||||
static inline int buf_get_data(struct cbuf *buf, void *data, int datalen)
|
||||
{
|
||||
buf_check_size(buf, datalen);
|
||||
int ret = 0;
|
||||
|
||||
memcpy(data, buf->p, datalen);
|
||||
buf->p += datalen;
|
||||
if (buf_check_size(buf, datalen)) {
|
||||
memcpy(data, buf->p, datalen);
|
||||
buf->p += datalen;
|
||||
ret = datalen;
|
||||
}
|
||||
|
||||
return datalen;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void *buf_get_datab(struct cbuf *buf, struct cbuf *dbuf,
|
||||
|
|
@ -223,13 +239,12 @@ static inline void *buf_get_datab(struct cbuf *buf, struct cbuf *dbuf,
|
|||
char *ret = NULL;
|
||||
int n = 0;
|
||||
|
||||
buf_check_size(dbuf, datalen);
|
||||
|
||||
n = buf_get_data(buf, dbuf->p, datalen);
|
||||
|
||||
if (n > 0) {
|
||||
ret = dbuf->p;
|
||||
dbuf->p += n;
|
||||
if (buf_check_size(dbuf, datalen)) {
|
||||
n = buf_get_data(buf, dbuf->p, datalen);
|
||||
if (n > 0) {
|
||||
ret = dbuf->p;
|
||||
dbuf->p += n;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -636,7 +651,7 @@ v9fs_deserialize_fcall(struct v9fs_session_info *v9ses, u32 msgsize,
|
|||
break;
|
||||
case RWALK:
|
||||
rcall->params.rwalk.nwqid = buf_get_int16(bufp);
|
||||
rcall->params.rwalk.wqids = buf_alloc(bufp,
|
||||
rcall->params.rwalk.wqids = buf_alloc(dbufp,
|
||||
rcall->params.rwalk.nwqid * sizeof(struct v9fs_qid));
|
||||
if (rcall->params.rwalk.wqids)
|
||||
for (i = 0; i < rcall->params.rwalk.nwqid; i++) {
|
||||
|
|
|
|||
|
|
@ -303,7 +303,13 @@ v9fs_session_init(struct v9fs_session_info *v9ses,
|
|||
goto SessCleanUp;
|
||||
};
|
||||
|
||||
v9ses->transport = trans_proto;
|
||||
v9ses->transport = kmalloc(sizeof(*v9ses->transport), GFP_KERNEL);
|
||||
if (!v9ses->transport) {
|
||||
retval = -ENOMEM;
|
||||
goto SessCleanUp;
|
||||
}
|
||||
|
||||
memmove(v9ses->transport, trans_proto, sizeof(*v9ses->transport));
|
||||
|
||||
if ((retval = v9ses->transport->init(v9ses, dev_name, data)) < 0) {
|
||||
eprintk(KERN_ERR, "problem initializing transport\n");
|
||||
|
|
|
|||
|
|
@ -1063,8 +1063,8 @@ static int v9fs_vfs_readlink(struct dentry *dentry, char __user * buffer,
|
|||
int ret;
|
||||
char *link = __getname();
|
||||
|
||||
if (strlen(link) < buflen)
|
||||
buflen = strlen(link);
|
||||
if (buflen > PATH_MAX)
|
||||
buflen = PATH_MAX;
|
||||
|
||||
dprintk(DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_iname, dentry);
|
||||
|
||||
|
|
|
|||
|
|
@ -129,8 +129,8 @@ static struct super_block *v9fs_get_sb(struct file_system_type
|
|||
|
||||
if ((newfid = v9fs_session_init(v9ses, dev_name, data)) < 0) {
|
||||
dprintk(DEBUG_ERROR, "problem initiating session\n");
|
||||
retval = newfid;
|
||||
goto free_session;
|
||||
kfree(v9ses);
|
||||
return ERR_PTR(newfid);
|
||||
}
|
||||
|
||||
sb = sget(fs_type, NULL, v9fs_set_super, v9ses);
|
||||
|
|
@ -150,7 +150,7 @@ static struct super_block *v9fs_get_sb(struct file_system_type
|
|||
|
||||
if (!root) {
|
||||
retval = -ENOMEM;
|
||||
goto release_inode;
|
||||
goto put_back_sb;
|
||||
}
|
||||
|
||||
sb->s_root = root;
|
||||
|
|
@ -159,7 +159,7 @@ static struct super_block *v9fs_get_sb(struct file_system_type
|
|||
root_fid = v9fs_fid_create(root);
|
||||
if (root_fid == NULL) {
|
||||
retval = -ENOMEM;
|
||||
goto release_dentry;
|
||||
goto put_back_sb;
|
||||
}
|
||||
|
||||
root_fid->fidopen = 0;
|
||||
|
|
@ -182,25 +182,15 @@ static struct super_block *v9fs_get_sb(struct file_system_type
|
|||
|
||||
if (stat_result < 0) {
|
||||
retval = stat_result;
|
||||
goto release_dentry;
|
||||
goto put_back_sb;
|
||||
}
|
||||
|
||||
return sb;
|
||||
|
||||
release_dentry:
|
||||
dput(sb->s_root);
|
||||
|
||||
release_inode:
|
||||
iput(inode);
|
||||
|
||||
put_back_sb:
|
||||
put_back_sb:
|
||||
/* deactivate_super calls v9fs_kill_super which will frees the rest */
|
||||
up_write(&sb->s_umount);
|
||||
deactivate_super(sb);
|
||||
v9fs_session_close(v9ses);
|
||||
|
||||
free_session:
|
||||
kfree(v9ses);
|
||||
|
||||
return ERR_PTR(retval);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -781,6 +781,8 @@ static int cifs_oplock_thread(void * dummyarg)
|
|||
|
||||
oplockThread = current;
|
||||
do {
|
||||
if (try_to_freeze())
|
||||
continue;
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
schedule_timeout(1*HZ);
|
||||
|
|
|
|||
|
|
@ -344,6 +344,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
|
|||
}
|
||||
|
||||
while (server->tcpStatus != CifsExiting) {
|
||||
if (try_to_freeze())
|
||||
continue;
|
||||
if (bigbuf == NULL) {
|
||||
bigbuf = cifs_buf_get();
|
||||
if(bigbuf == NULL) {
|
||||
|
|
|
|||
|
|
@ -1410,7 +1410,7 @@ unsigned long ext3_count_free_blocks(struct super_block *sb)
|
|||
unsigned long desc_count;
|
||||
struct ext3_group_desc *gdp;
|
||||
int i;
|
||||
unsigned long ngroups;
|
||||
unsigned long ngroups = EXT3_SB(sb)->s_groups_count;
|
||||
#ifdef EXT3FS_DEBUG
|
||||
struct ext3_super_block *es;
|
||||
unsigned long bitmap_count, x;
|
||||
|
|
@ -1421,7 +1421,8 @@ unsigned long ext3_count_free_blocks(struct super_block *sb)
|
|||
desc_count = 0;
|
||||
bitmap_count = 0;
|
||||
gdp = NULL;
|
||||
for (i = 0; i < EXT3_SB(sb)->s_groups_count; i++) {
|
||||
|
||||
for (i = 0; i < ngroups; i++) {
|
||||
gdp = ext3_get_group_desc(sb, i, NULL);
|
||||
if (!gdp)
|
||||
continue;
|
||||
|
|
@ -1443,7 +1444,6 @@ unsigned long ext3_count_free_blocks(struct super_block *sb)
|
|||
return bitmap_count;
|
||||
#else
|
||||
desc_count = 0;
|
||||
ngroups = EXT3_SB(sb)->s_groups_count;
|
||||
smp_rmb();
|
||||
for (i = 0; i < ngroups; i++) {
|
||||
gdp = ext3_get_group_desc(sb, i, NULL);
|
||||
|
|
|
|||
|
|
@ -242,7 +242,7 @@ static int setup_new_group_blocks(struct super_block *sb,
|
|||
i < sbi->s_itb_per_group; i++, bit++, block++) {
|
||||
struct buffer_head *it;
|
||||
|
||||
ext3_debug("clear inode block %#04x (+%ld)\n", block, bit);
|
||||
ext3_debug("clear inode block %#04lx (+%d)\n", block, bit);
|
||||
if (IS_ERR(it = bclean(handle, sb, block))) {
|
||||
err = PTR_ERR(it);
|
||||
goto exit_bh;
|
||||
|
|
@ -643,8 +643,8 @@ static void update_backups(struct super_block *sb,
|
|||
break;
|
||||
|
||||
bh = sb_getblk(sb, group * bpg + blk_off);
|
||||
ext3_debug(sb, __FUNCTION__, "update metadata backup %#04lx\n",
|
||||
bh->b_blocknr);
|
||||
ext3_debug("update metadata backup %#04lx\n",
|
||||
(unsigned long)bh->b_blocknr);
|
||||
if ((err = ext3_journal_get_write_access(handle, bh)))
|
||||
break;
|
||||
lock_buffer(bh);
|
||||
|
|
|
|||
|
|
@ -512,15 +512,14 @@ static void ext3_clear_inode(struct inode *inode)
|
|||
|
||||
static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
||||
{
|
||||
struct ext3_sb_info *sbi = EXT3_SB(vfs->mnt_sb);
|
||||
struct super_block *sb = vfs->mnt_sb;
|
||||
struct ext3_sb_info *sbi = EXT3_SB(sb);
|
||||
|
||||
if (sbi->s_mount_opt & EXT3_MOUNT_JOURNAL_DATA)
|
||||
if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA)
|
||||
seq_puts(seq, ",data=journal");
|
||||
|
||||
if (sbi->s_mount_opt & EXT3_MOUNT_ORDERED_DATA)
|
||||
else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA)
|
||||
seq_puts(seq, ",data=ordered");
|
||||
|
||||
if (sbi->s_mount_opt & EXT3_MOUNT_WRITEBACK_DATA)
|
||||
else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA)
|
||||
seq_puts(seq, ",data=writeback");
|
||||
|
||||
#if defined(CONFIG_QUOTA)
|
||||
|
|
|
|||
|
|
@ -129,8 +129,7 @@ void jfs_delete_inode(struct inode *inode)
|
|||
jfs_info("In jfs_delete_inode, inode = 0x%p", inode);
|
||||
|
||||
if (!is_bad_inode(inode) &&
|
||||
(JFS_IP(inode)->fileset == cpu_to_le32(FILESYSTEM_I))) {
|
||||
|
||||
(JFS_IP(inode)->fileset == FILESYSTEM_I)) {
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
|
||||
if (test_cflag(COMMIT_Freewmap, inode))
|
||||
|
|
|
|||
|
|
@ -3055,7 +3055,7 @@ static int cntlz(u32 value)
|
|||
* RETURN VALUES:
|
||||
* log2 number of blocks
|
||||
*/
|
||||
int blkstol2(s64 nb)
|
||||
static int blkstol2(s64 nb)
|
||||
{
|
||||
int l2nb;
|
||||
s64 mask; /* meant to be signed */
|
||||
|
|
|
|||
|
|
@ -725,6 +725,9 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp,
|
|||
else
|
||||
tlck->flag = tlckINODELOCK;
|
||||
|
||||
if (S_ISDIR(ip->i_mode))
|
||||
tlck->flag |= tlckDIRECTORY;
|
||||
|
||||
tlck->type = 0;
|
||||
|
||||
/* bind the tlock and the page */
|
||||
|
|
@ -1009,6 +1012,8 @@ struct tlock *txMaplock(tid_t tid, struct inode *ip, int type)
|
|||
|
||||
/* bind the tlock and the object */
|
||||
tlck->flag = tlckINODELOCK;
|
||||
if (S_ISDIR(ip->i_mode))
|
||||
tlck->flag |= tlckDIRECTORY;
|
||||
tlck->ip = ip;
|
||||
tlck->mp = NULL;
|
||||
|
||||
|
|
@ -1077,6 +1082,8 @@ struct linelock *txLinelock(struct linelock * tlock)
|
|||
linelock->flag = tlckLINELOCK;
|
||||
linelock->maxcnt = TLOCKLONG;
|
||||
linelock->index = 0;
|
||||
if (tlck->flag & tlckDIRECTORY)
|
||||
linelock->flag |= tlckDIRECTORY;
|
||||
|
||||
/* append linelock after tlock */
|
||||
linelock->next = tlock->next;
|
||||
|
|
@ -2070,8 +2077,8 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
*
|
||||
* function: log from maplock of freed data extents;
|
||||
*/
|
||||
void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
||||
struct tlock * tlck)
|
||||
static void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
||||
struct tlock * tlck)
|
||||
{
|
||||
struct pxd_lock *pxdlock;
|
||||
int i, nlock;
|
||||
|
|
@ -2209,7 +2216,7 @@ void txEA(tid_t tid, struct inode *ip, dxd_t * oldea, dxd_t * newea)
|
|||
* function: synchronously write pages locked by transaction
|
||||
* after txLog() but before txUpdateMap();
|
||||
*/
|
||||
void txForce(struct tblock * tblk)
|
||||
static void txForce(struct tblock * tblk)
|
||||
{
|
||||
struct tlock *tlck;
|
||||
lid_t lid, next;
|
||||
|
|
@ -2358,7 +2365,7 @@ static void txUpdateMap(struct tblock * tblk)
|
|||
*/
|
||||
else { /* (maplock->flag & mlckFREE) */
|
||||
|
||||
if (S_ISDIR(tlck->ip->i_mode))
|
||||
if (tlck->flag & tlckDIRECTORY)
|
||||
txFreeMap(ipimap, maplock,
|
||||
tblk, COMMIT_PWMAP);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ extern struct tlock *TxLock; /* transaction lock table */
|
|||
#define tlckLOG 0x0800
|
||||
/* updateMap state */
|
||||
#define tlckUPDATEMAP 0x0080
|
||||
#define tlckDIRECTORY 0x0040
|
||||
/* freeLock state */
|
||||
#define tlckFREELOCK 0x0008
|
||||
#define tlckWRITEPAGE 0x0004
|
||||
|
|
|
|||
|
|
@ -184,14 +184,13 @@ static void nfs_readpage_release(struct nfs_page *req)
|
|||
{
|
||||
unlock_page(req->wb_page);
|
||||
|
||||
nfs_clear_request(req);
|
||||
nfs_release_request(req);
|
||||
|
||||
dprintk("NFS: read done (%s/%Ld %d@%Ld)\n",
|
||||
req->wb_context->dentry->d_inode->i_sb->s_id,
|
||||
(long long)NFS_FILEID(req->wb_context->dentry->d_inode),
|
||||
req->wb_bytes,
|
||||
(long long)req_offset(req));
|
||||
nfs_clear_request(req);
|
||||
nfs_release_request(req);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -343,7 +343,8 @@ static int proc_root_link(struct inode *inode, struct dentry **dentry, struct vf
|
|||
|
||||
/* Same as proc_root_link, but this addionally tries to get fs from other
|
||||
* threads in the group */
|
||||
static int proc_task_root_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
|
||||
static int proc_task_root_link(struct inode *inode, struct dentry **dentry,
|
||||
struct vfsmount **mnt)
|
||||
{
|
||||
struct fs_struct *fs;
|
||||
int result = -ENOENT;
|
||||
|
|
@ -357,9 +358,10 @@ static int proc_task_root_link(struct inode *inode, struct dentry **dentry, stru
|
|||
} else {
|
||||
/* Try to get fs from other threads */
|
||||
task_unlock(leader);
|
||||
struct task_struct *task = leader;
|
||||
read_lock(&tasklist_lock);
|
||||
if (pid_alive(task)) {
|
||||
if (pid_alive(leader)) {
|
||||
struct task_struct *task = leader;
|
||||
|
||||
while ((task = next_thread(task)) != leader) {
|
||||
task_lock(task);
|
||||
fs = task->fs;
|
||||
|
|
|
|||
Loading…
Reference in a new issue