diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2001-01-10 05:27:25 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2001-01-10 05:27:25 +0000 |
commit | c9c06167e7933d93a6e396174c68abf242294abb (patch) | |
tree | d9a8bb30663e9a3405a1ef37ffb62bc14b9f019f /fs/smbfs | |
parent | f79e8cc3c34e4192a3e5ef4cc9c6542fdef703c0 (diff) |
Merge with Linux 2.4.0-test12.
Diffstat (limited to 'fs/smbfs')
-rw-r--r-- | fs/smbfs/dir.c | 6 | ||||
-rw-r--r-- | fs/smbfs/file.c | 54 | ||||
-rw-r--r-- | fs/smbfs/inode.c | 18 | ||||
-rw-r--r-- | fs/smbfs/proc.c | 21 | ||||
-rw-r--r-- | fs/smbfs/sock.c | 4 |
5 files changed, 53 insertions, 50 deletions
diff --git a/fs/smbfs/dir.c b/fs/smbfs/dir.c index b2d5c4099..7b62899c1 100644 --- a/fs/smbfs/dir.c +++ b/fs/smbfs/dir.c @@ -124,7 +124,7 @@ smb_readdir(struct file *filp, void *dirent, filldir_t filldir) qname.len = entry->len; entry->ino = find_inode_number(dentry, &qname); if (!entry->ino) - entry->ino = smb_invent_inos(1); + entry->ino = iunique(dentry->d_sb, 2); } if (filldir(dirent, entry->name, entry->len, @@ -325,7 +325,7 @@ smb_lookup(struct inode *dir, struct dentry *dentry) goto add_entry; if (!error) { error = -EACCES; - finfo.f_ino = smb_invent_inos(1); + finfo.f_ino = iunique(dentry->d_sb, 2); inode = smb_iget(dir->i_sb, &finfo); if (inode) { add_entry: @@ -362,7 +362,7 @@ smb_instantiate(struct dentry *dentry, __u16 fileid, int have_id) goto out_close; smb_renew_times(dentry); - fattr.f_ino = smb_invent_inos(1); + fattr.f_ino = iunique(dentry->d_sb, 2); inode = smb_iget(dentry->d_sb, &fattr); if (!inode) goto out_no_inode; diff --git a/fs/smbfs/file.c b/fs/smbfs/file.c index 135e8707c..79627f880 100644 --- a/fs/smbfs/file.c +++ b/fs/smbfs/file.c @@ -48,8 +48,7 @@ smb_readpage_sync(struct dentry *dentry, struct page *page) DENTRY_PATH(dentry), count, offset, rsize); result = smb_open(dentry, SMB_O_RDONLY); - if (result < 0) - { + if (result < 0) { PARANOIA("%s/%s open failed, error=%d\n", DENTRY_PATH(dentry), result); goto io_error; @@ -59,7 +58,7 @@ smb_readpage_sync(struct dentry *dentry, struct page *page) if (count < rsize) rsize = count; - result = smb_proc_read(dentry, offset, rsize, buffer); + result = smb_proc_read(dentry->d_inode, offset, rsize, buffer); if (result < 0) goto io_error; @@ -82,7 +81,7 @@ io_error: } /* - * We are called with the page locked and the caller unlocks. + * We are called with the page locked and we unlock it when done. */ static int smb_readpage(struct file *file, struct page *page) @@ -103,25 +102,27 @@ smb_readpage(struct file *file, struct page *page) * Offset is the data offset within the page. */ static int -smb_writepage_sync(struct dentry *dentry, struct page *page, +smb_writepage_sync(struct inode *inode, struct page *page, unsigned long offset, unsigned int count) { - struct inode *inode = dentry->d_inode; u8 *buffer = page_address(page) + offset; - int wsize = smb_get_wsize(server_from_dentry(dentry)); + int wsize = smb_get_wsize(server_from_inode(inode)); int result, written = 0; offset += page->index << PAGE_CACHE_SHIFT; - VERBOSE("file %s/%s, count=%d@%ld, wsize=%d\n", - DENTRY_PATH(dentry), count, offset, wsize); + VERBOSE("file ino=%ld, fileid=%d, count=%d@%ld, wsize=%d\n", + inode->i_ino, inode->u.smbfs_i.fileid, count, offset, wsize); do { if (count < wsize) wsize = count; - result = smb_proc_write(dentry, offset, wsize, buffer); - if (result < 0) + result = smb_proc_write(inode, offset, wsize, buffer); + if (result < 0) { + PARANOIA("failed write, wsize=%d, result=%d\n", + wsize, result); break; + } /* N.B. what if result < wsize?? */ #ifdef SMBFS_PARANOIA if (result < wsize) @@ -147,17 +148,25 @@ smb_writepage_sync(struct dentry *dentry, struct page *page, * Write a page to the server. This will be used for NFS swapping only * (for now), and we currently do this synchronously only. * - * We are called with the page locked and the caller unlocks. + * We are called with the page locked and we unlock it when done. */ static int -smb_writepage(struct file *file, struct page *page) +smb_writepage(struct page *page) { - struct dentry *dentry = file->f_dentry; - struct inode *inode = dentry->d_inode; - unsigned long end_index = inode->i_size >> PAGE_CACHE_SHIFT; + struct address_space *mapping = page->mapping; + struct inode *inode; + unsigned long end_index; unsigned offset = PAGE_CACHE_SIZE; int err; + if (!mapping) + BUG(); + inode = (struct inode *)mapping->host; + if (!inode) + BUG(); + + end_index = inode->i_size >> PAGE_CACHE_SHIFT; + /* easy case */ if (page->index < end_index) goto do_it; @@ -168,8 +177,9 @@ smb_writepage(struct file *file, struct page *page) return -EIO; do_it: get_page(page); - err = smb_writepage_sync(dentry, page, 0, offset); + err = smb_writepage_sync(inode, page, 0, offset); SetPageUptodate(page); + UnlockPage(page); put_page(page); return err; } @@ -183,7 +193,7 @@ smb_updatepage(struct file *file, struct page *page, unsigned long offset, DEBUG1("(%s/%s %d@%ld)\n", DENTRY_PATH(dentry), count, (page->index << PAGE_CACHE_SHIFT)+offset); - return smb_writepage_sync(dentry, page, offset, count); + return smb_writepage_sync(dentry->d_inode, page, offset, count); } static ssize_t @@ -308,8 +318,16 @@ out: static int smb_file_open(struct inode *inode, struct file * file) { + int result; + struct dentry *dentry = file->f_dentry; + int smb_mode = (file->f_mode & O_ACCMODE) - 1; + lock_kernel(); + result = smb_open(dentry, smb_mode); + if (result) + goto out; inode->u.smbfs_i.openers++; +out: unlock_kernel(); return 0; } diff --git a/fs/smbfs/inode.c b/fs/smbfs/inode.c index bcc900626..e502fb60b 100644 --- a/fs/smbfs/inode.c +++ b/fs/smbfs/inode.c @@ -53,22 +53,6 @@ static struct super_operations smb_sops = statfs: smb_statfs, }; -/* FIXME: Look at all inodes whether so that we do not get duplicate - * inode numbers. */ - -unsigned long -smb_invent_inos(unsigned long n) -{ - static unsigned long ino = 2; - - if (ino + 2*n < ino) - { - /* wrap around */ - ino = 2; - } - ino += n; - return ino; -} /* We are always generating a new inode here */ struct inode * @@ -282,7 +266,7 @@ out: static void smb_delete_inode(struct inode *ino) { - DEBUG1("\n"); + DEBUG1("ino=%ld\n", ino->i_ino); lock_kernel(); if (smb_close(ino)) PARANOIA("could not close inode %ld\n", ino->i_ino); diff --git a/fs/smbfs/proc.c b/fs/smbfs/proc.c index 7863cd2da..f0444f97d 100644 --- a/fs/smbfs/proc.c +++ b/fs/smbfs/proc.c @@ -1072,9 +1072,9 @@ smb_close_fileid(struct dentry *dentry, __u16 fileid) file-id would not be valid after a reconnection. */ int -smb_proc_read(struct dentry *dentry, off_t offset, int count, char *data) +smb_proc_read(struct inode *inode, off_t offset, int count, char *data) { - struct smb_sb_info *server = server_from_dentry(dentry); + struct smb_sb_info *server = server_from_inode(inode); __u16 returned_count, data_len; unsigned char *buf; int result; @@ -1082,7 +1082,7 @@ smb_proc_read(struct dentry *dentry, off_t offset, int count, char *data) smb_lock_server(server); smb_setup_header(server, SMBread, 5, 0); buf = server->packet; - WSET(buf, smb_vwv0, dentry->d_inode->u.smbfs_i.fileid); + WSET(buf, smb_vwv0, inode->u.smbfs_i.fileid); WSET(buf, smb_vwv1, count); DSET(buf, smb_vwv2, offset); WSET(buf, smb_vwv4, 0); @@ -1114,25 +1114,26 @@ smb_proc_read(struct dentry *dentry, off_t offset, int count, char *data) result = data_len; out: - VERBOSE("file %s/%s, count=%d, result=%d\n", - DENTRY_PATH(dentry), count, result); + VERBOSE("ino=%ld, fileid=%d, count=%d, result=%d\n", + inode->ino, inode->u.smbfs_i.fileid, count, result); smb_unlock_server(server); return result; } int -smb_proc_write(struct dentry *dentry, off_t offset, int count, const char *data) +smb_proc_write(struct inode *inode, off_t offset, int count, const char *data) { - struct smb_sb_info *server = server_from_dentry(dentry); + struct smb_sb_info *server = server_from_inode(inode); int result; __u8 *p; - VERBOSE("file %s/%s, count=%d@%ld, packet_size=%d\n", - DENTRY_PATH(dentry), count, offset, server->packet_size); + VERBOSE("ino=%ld, fileid=%d, count=%d@%ld, packet_size=%d\n", + inode->ino, inode->u.smbfs_i.fileid, count, offset, + server->packet_size); smb_lock_server(server); p = smb_setup_header(server, SMBwrite, 5, count + 3); - WSET(server->packet, smb_vwv0, dentry->d_inode->u.smbfs_i.fileid); + WSET(server->packet, smb_vwv0, inode->u.smbfs_i.fileid); WSET(server->packet, smb_vwv1, count); DSET(server->packet, smb_vwv2, offset); WSET(server->packet, smb_vwv4, 0); diff --git a/fs/smbfs/sock.c b/fs/smbfs/sock.c index 66dbd9efb..cb1e697fc 100644 --- a/fs/smbfs/sock.c +++ b/fs/smbfs/sock.c @@ -163,12 +163,12 @@ smb_data_ready(struct sock *sk, int len) found_data(sk); return; } - job->cb.next = NULL; + INIT_LIST_HEAD(&job->cb.list); job->cb.sync = 0; job->cb.routine = smb_data_callback; job->cb.data = job; job->sk = sk; - queue_task(&job->cb, &tq_scheduler); + schedule_task(&job->cb); } int |